Skip to content

Conversation

@mattdholloway
Copy link
Contributor

@mattdholloway mattdholloway commented Feb 4, 2026

Summary

Based on initial work by @tommaso-moro

This PR adds support for MCP Apps, enabling rich interactive UIs for MCP tools.

New MCP App UIs

  • get_me - User profile display with avatar and stats
  • issue_write - Create/update issues with title, body, and Markdown editor
  • create_pull_request - Create PRs with title, body, and draft/regular toggle

Implementation

  • UI Layer (ui/): React + Primer design system, built to single HTML files via script/build-ui
  • Server Integration: HTML assets embedded in binary, exposed as MCP resources linked via tool metadata

Insiders Mode

All MCP Apps functionality gated behind Insiders

  • UI resources and metadata only available when enabled
  • Generic insidersOnlyMetaKeys mechanism for future experimental features

These new UIs require a new React app that exists under the ui folder with components made available in iframes for clients that support the feature. This has been extensively tested under VSCode-Insiders.

This will require additional support in Remote MCP to ensure Insiders and resources support works correctly.

Why

As part of https://github.com/github/copilot-mcp-core/issues/1125

What changed

  • Added ui/ directory with React + Primer design system apps for get_me, issue_write, and create_pull_request
  • Added script/build-ui to compile React apps into single HTML files
  • Added pkg/github/ui_embed.go to embed built HTML assets into binary
  • Added pkg/github/ui_resources.go to register UI resources with the MCP server
  • Added UI metadata (Meta.ui.resourceUri) to get_me, issue_write, and create_pull_request tools
  • Added CSP configuration for avatar image loading in get_me resource
  • Added _ui_submitted mechanism to distinguish UI form submissions from LLM tool calls
  • Added WithInsidersMode() to inventory builder to gate experimental features
  • Added insidersOnlyMetaKeys mechanism to strip insiders-only metadata when disabled
  • Updated CI workflows to include UI build step

MCP impact

  • No tool or API changes
  • Tool schema or behavior changed
  • New tool added

Prompts tested (tool changes only)

Security / limits

  • No security or limits impact
  • Auth / permissions considered
  • Data exposure, filtering, or token/size limits considered

Tool renaming

  • I am renaming tools as part of this PR (e.g. a part of a consolidation effort)
    • I have added the new tool aliases in deprecated_tool_aliases.go
  • I am not renaming tools as part of this PR

Note: if you're renaming tools, you must add the tool aliases. For more information on how to do so, please refer to the official docs.

Lint & tests

  • Linted locally with ./script/lint
  • Tested locally with ./script/test

Docs

  • Not needed
  • Updated (README / docs / examples)

@mattdholloway mattdholloway added the insiders Features for the Insiders mode of the GitHub MCP Server label Feb 4, 2026
@github github deleted a comment from github-actions bot Feb 4, 2026
@mattdholloway mattdholloway marked this pull request as ready for review February 4, 2026 14:36
@mattdholloway mattdholloway force-pushed the mcp-ui-apps-3 branch 2 times, most recently from 3096894 to fcefcaa Compare February 6, 2026 10:37
@mattdholloway mattdholloway changed the title Add initial support for MCP Apps for select tools under Insiders Add initial PoC for MCP Apps for select tools under Insiders Feb 6, 2026
mattdholloway and others added 2 commits February 9, 2026 10:44
Remove advanced features to be kept in mcp-ui-apps-advanced:
- Strip labels, assignees, milestones, issue types, repo picker from issue-write
- Strip repo picker, branch selectors from pr-write
- Delete ui_get tool (ui_tools.go, ui_tools_test.go, ui_get.snap)
- Remove UIGet registration from tools.go

Basic forms retain: title, body, submit with _ui_submitted,
draft/regular split button (PR), MarkdownEditor, and SuccessView.
mattdholloway and others added 7 commits February 9, 2026 17:02
Add proper spacing between icon, title text, and repo name in the
header bar for both issue-write and create-pull-request forms.
When InsidersMode is enabled, append '(insiders)' to the User-Agent
string sent with GitHub API requests, enabling server-side adoption
tracking.
Copy link
Contributor

@tommaso-moro tommaso-moro left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just tested this again, nice improvements! Some things I have noticed

  1. What is the behaviour of these tools on hosts where MCP Apps is not supported? For example, in issue_write and create_pull_request, when Insiders is on and _ui_submitted is false, the tool early-returns a placeholder message like "Ready to create an issue". So it seems like on a host without MCP Apps support, users would get the placeholder text instead of the tool actually executing. I think we should have a way for people opting into insiders but using hosts that won't support Apps (which include 1P ones like Copilot CLI) to still be able to use the tool without the UI

  2. On hover, the "Write" and "Preview" options in the markdown look inconsistent with the rich text options, in that they don't have rounded corners. A quick fix is to round the corners to make them consistent

  3. In the markdown editor, the toolbar isn't responsive: I cannot scroll horizontally to reveal some of the options (like bullet point list, numbered list)

Screenshot 2026-02-11 at 17 21 37
  1. The UI to create a PR doesn't seem to work anymore: when I click "create pull request" it effectively creates the pull request, but it shows the error message instead of the success UI, even though it does create the PR
Screenshot 2026-02-12 at 11 17 36
  1. In the issue creation success screen, we need to add spacing between the issue icon and the title of the issue (same for the PR success UI)
Screenshot 2026-02-11 at 17 22 44
  1. (nit) I have noticed that I cannot just pull up the create issue UI without populating it with title and body to create an issue. It only works by having the model write a test title and body, calling the issue_write tool and then showing the form pre-populated with that mock text for me to edit. Is that intentional? I wonder if we should let folks see an empty UI that they can fill out

  2. (nit) maybe unrelated, but getting 422 error when trying to create a draft PR as it assumes my default branch is main but instead it's master. Don't think this was introduced with these changes but wanted to flag, maybe we can show a more helpful error message here

Screenshot Screenshot 2026-02-11 at 17 27 09

@github github deleted a comment from FuzzysTodd Feb 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

insiders Features for the Insiders mode of the GitHub MCP Server

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants