-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Add initial PoC for MCP Apps for select tools under Insiders #1957
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
…ce CreateIssueApp to manage existing issue data
…server into mcp-ui-apps-3
bddf923 to
7ce5e08
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Copilot reviewed 40 out of 43 changed files in this pull request and generated 4 comments.
tommaso-moro
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great work on this, and it's really cool to see the Primer design system in action here! 🚀
A few comments:
I see you added two tools (list_milestones and list_assignees) that are meant to be used only by the Apps in the iframes. My concerns are:
- I am worried about how this will this play out if users are configuring specific tools in their server config. From my understanding, we'd be introducing a dependency of some tools on other tools (suddenly,
issue_writerelies onlist_assigneesfor example). This is a problem because users are not aware of these dependencies (and shouldn't be) when configuring their server. So if they don't enable bothissue_writeandlist_assigneesat the same time, things would break I assume. I wonder if there is another way of doing this. Wdyt? - (Less important for these 2 tools but relevant if we build more) These tools appear in
tools/listand consume context. Now it's only 2 additional tools, but if we follow this pattern when building more UIs we can easily end up having a lot of tools which can be expensive context-wise
Does the input schema change from Required: []string{"owner", "repo", "title", "head", "base"} to Required: []string{"owner", "repo"} affect non-insiders users ?
I noticed some issues with the UI/UX when trying this out locally. Some related to general spacing and layout (probs easy to fix) but other seem like core markdown functionality that is broken, this is a blocker even for an Insiders ship. Here are some of the main ones:
1- The 'Add a quote' functionality in the markdown editor is broken
2- The repository selection dropdown is too wide and overflows outside the app's window.
Demo:
Screen.Recording.2026-02-05.at.16.23.56.mov
3- Missing spacing between the bottom dropdowns. Also, can't scroll horizontally to reveal the ones past "Milestone"
4- The top part of the PR creation UI overflows
5- Lists (both numbered and bullet points) don't fully work, as pressing "enter" doesn't create a new list item, it just creates a new line. This is not super high priority but should ideally be fixed.
Demo:
Screen.Recording.2026-02-05.at.16.22.56.mov
6- Missing spacing here between "create as draft" and "allow maintainer edits"
At first glance, it seems that a lot of the markdown issues are due to the fact that MarkdownEditor.tsx is using a simple textarea instead of a markdown editor. There may be an official markdown editor from the Primer lib or similar that could be used?
(nit: I think the React code can be improved but haven't reviewed it because I assume the priority in this PR is just to make it work for experimental testing)
|
A few issues I noticed while testing: get_me: Avatar is not being downloaded/displayed. I think this we want to fix. create_issue: Fields like Type, Assignee, Labels, and Milestones are not populated with suggestions. The Title field looks like a link, but it doesn’t open or navigate anywhere If suggesting predefined fields (like labels, milestones, etc.) is complex to implement at this stage, we can consider moving that out of scope for the Insiders launch. |
3096894 to
fcefcaa
Compare



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 statsissue_write- Create/update issues with pickers for labels, assignees, milestones, and issue typescreate_pull_request- Create PRs with branch selection, reviewers, labels, and milestonesImplementation
ui/): React + Primer design system, built to single HTML files viascript/build-uiui_getfor fetching picker data (labels, assignees, milestones, issue types, branches)Insiders Mode
All MCP Apps functionality gated behind Insiders
insidersOnlyMetaKeysmechanism for future experimental featuresThese new UIs require a new React app that exists under the
uifolder 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
ui/directory with React + Primer design system apps forget_me,issue_write, andcreate_pull_requestscript/build-uito compile React apps into single HTML filespkg/github/ui_embed.goto embed built HTML assets into binarypkg/github/ui_resources.goto register UI resources with the MCP serverui_gettool for fetching UI picker data (labels, assignees, milestones, issue types, branches)Meta.ui.resourceUri) toget_me,issue_write, andcreate_pull_requesttoolsget_meresourceissue_writeandcreate_pull_requestto proceed with operations when form data is submittedWithInsidersMode()to inventory builder to gate experimental featuresinsidersOnlyMetaKeysmechanism to strip insiders-only metadata when disabledMCP impact
Prompts tested (tool changes only)
Security / limits
Tool renaming
deprecated_tool_aliases.goNote: 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
./script/lint./script/testDocs