Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
67a4793
PoC full flow (hello world example)
tommaso-moro Jan 7, 2026
7d2b463
add avatar resource domain
tommaso-moro Jan 7, 2026
7606aec
add postmessage logic and richer UI
tommaso-moro Jan 7, 2026
02ce9bf
add create issue ui
tommaso-moro Jan 15, 2026
d53ff41
update ui for issue creatioon
tommaso-moro Jan 15, 2026
e3d5db7
fix
tommaso-moro Jan 15, 2026
b149642
ignore banner
tommaso-moro Jan 15, 2026
92aabf2
update docs after rebase
mattdholloway Feb 2, 2026
8b55d08
update toolsnap for get_me
mattdholloway Feb 2, 2026
06270c7
new UI changes
mattdholloway Feb 2, 2026
a770719
update docs
mattdholloway Feb 2, 2026
23de0bc
update workflows that need ui build
mattdholloway Feb 2, 2026
e2a8582
add UI diff
mattdholloway Feb 2, 2026
5bb6228
fix build ui step for windows runners to use git bash
mattdholloway Feb 2, 2026
157ba4d
fix UI diff
mattdholloway Feb 2, 2026
c927390
refactor issue creation UI
mattdholloway Feb 3, 2026
6d0eda6
add AvatarWithFallback component and update UserCard to use it; enhan…
mattdholloway Feb 3, 2026
2b0d8cc
fix formatting of button labels
mattdholloway Feb 3, 2026
b8dc0d5
add create pull request functionality with UI support and insiders
mattdholloway Feb 3, 2026
2d186da
update docs
mattdholloway Feb 3, 2026
072f5c4
add test for insiders mode handling in ServerTool schema
mattdholloway Feb 3, 2026
adc1053
remove `show_ui` param for now
mattdholloway Feb 4, 2026
ee0a440
make insiders mode metadata stripping generic
mattdholloway Feb 4, 2026
2b8f062
remove ui diff
mattdholloway Feb 4, 2026
6070471
Merge branch 'main' into mcp-ui-apps-3
mattdholloway Feb 4, 2026
d0f0334
Merge branch 'mcp-ui-apps-3' of https://github.com/github/github-mcp-…
mattdholloway Feb 4, 2026
37da563
fix CI
mattdholloway Feb 4, 2026
8b23e49
remove redundant mention of old app name
mattdholloway Feb 4, 2026
12af958
add node types to fix ide issues for ts code
mattdholloway Feb 4, 2026
e61c2d2
remove unused TriangleDownIcon import
mattdholloway Feb 4, 2026
54ce61d
update @primer/behaviors and electron-to-chromium versions in package…
mattdholloway Feb 4, 2026
03aad7f
add check to ensure base and head are not the same when creating a ne…
mattdholloway Feb 4, 2026
ad09947
remove old show_ui
mattdholloway Feb 4, 2026
d5e263e
fix gitignore for dist so builds dont break
mattdholloway Feb 4, 2026
dca4d52
add tests for insiders mode handling and metadata stripping in Server…
mattdholloway Feb 4, 2026
932750c
remove unused state and components from CreatePRApp
mattdholloway Feb 4, 2026
16469f8
fix ui build
mattdholloway Feb 4, 2026
d0085a7
update docker build to fix npm issue
mattdholloway Feb 4, 2026
7ce5e08
remove reference to show_ui
mattdholloway Feb 4, 2026
3413b71
Merge branch 'main' into mcp-ui-apps-3
mattdholloway Feb 5, 2026
e20cef3
allow insiders to work for non-ui features
mattdholloway Feb 5, 2026
8a0edfb
formalise insiders inventory support
mattdholloway Feb 5, 2026
d564d98
update docs
mattdholloway Feb 5, 2026
f034e19
fix overflow issues and replace pull request dropdown with matching U…
mattdholloway Feb 5, 2026
934e83d
fix createpullrequest test
mattdholloway Feb 5, 2026
a1922b2
consolidate fetching tools under `ui_get` tool to remove toolset deps
mattdholloway Feb 5, 2026
a47064d
fix issue data prefill in issue_write form
mattdholloway Feb 5, 2026
be4c4c7
fix link component when updating issue
mattdholloway Feb 5, 2026
69579b2
fix avatar URL
mattdholloway Feb 5, 2026
b2164a1
fix broken issue update logic
mattdholloway Feb 5, 2026
fcefcaa
remove dbg
mattdholloway Feb 5, 2026
826b518
Merge remote-tracking branch 'origin/main' into mcp-ui-apps-3
mattdholloway Feb 6, 2026
8fa72ad
fix for new GetFlags
mattdholloway Feb 6, 2026
00b9213
revert to original required fields for create_pull_request
mattdholloway Feb 6, 2026
922fa9f
fix for UI form submission
mattdholloway Feb 6, 2026
a2dcb30
Merge branch 'main' into mcp-ui-apps-3
mattdholloway Feb 9, 2026
24174b9
Simplify MCP App UIs for basic branch
mattdholloway Feb 9, 2026
4dc0d47
Fix header spacing in issue-write and pr-write UIs
mattdholloway Feb 9, 2026
4994f84
fix UI spacing
mattdholloway Feb 9, 2026
fce0c3d
Revert "Simplify MCP App UIs for basic branch"
mattdholloway Feb 9, 2026
c8cf1e9
Merge remote-tracking branch 'origin/main' into mcp-ui-apps-advanced
mattdholloway Feb 13, 2026
5cc9623
Undo dependency downgrades in ui/package-lock.json
mattdholloway Feb 13, 2026
a9bcd2b
Update ui/src/apps/pr-write/App.tsx
mattdholloway Feb 13, 2026
8432a54
Update ui/src/apps/issue-write/App.tsx
mattdholloway Feb 13, 2026
c8848f5
Implement pagination for uiGetBranches (#2012)
Copilot Feb 13, 2026
e021022
Merge branch 'main' into mcp-ui-apps-advanced
mattdholloway Feb 17, 2026
5de74d8
Merge branch 'main' into mcp-ui-apps-advanced
mattdholloway Feb 17, 2026
d0e6c0b
Merge branch 'main' into mcp-ui-apps-advanced
mattdholloway Feb 20, 2026
6c529d0
Merge branch 'main' into mcp-ui-apps-advanced
mattdholloway Mar 2, 2026
096ecbb
Merge branch 'main' into mcp-ui-apps-advanced
mattdholloway Apr 1, 2026
3ea342a
Merge branch 'main' into mcp-ui-apps-advanced
mattdholloway Apr 28, 2026
46c7267
update to new insiders feature flag func
mattdholloway Apr 28, 2026
0a0b7da
ensure transient state is reset on successive tool calls
mattdholloway Apr 29, 2026
2a65fd3
Merge remote-tracking branch 'origin/main' into mcp-ui-apps-advanced
Copilot Jun 1, 2026
489e188
Mark ui_get as app-only visibility
mattdholloway Jun 1, 2026
5698568
Update ui_get toolsnap for app-only visibility
mattdholloway Jun 1, 2026
b5b87d5
Assert ui_get declares app-only visibility
mattdholloway Jun 1, 2026
f310291
Add ui_get to insiders feature docs
mattdholloway Jun 1, 2026
d9292e9
Address ui_get review feedback
mattdholloway Jun 1, 2026
13bb1b0
Fix repo reset and stale base-branch in MCP App views
mattdholloway Jun 1, 2026
6f6e826
Potential fix for pull request finding
mattdholloway Jun 1, 2026
19f5c11
Fix issue-write repo owner mapping and clear stale UI state on reset
mattdholloway Jun 1, 2026
3e11e38
Merge remote-tracking branch 'origin/main' into mcp-ui-apps-advanced
Copilot Jun 1, 2026
064c9cc
Merge remote-tracking branch 'origin/main' into mcp-ui-apps-advanced
Copilot Jun 1, 2026
064250e
Merge branch 'main' into mcp-ui-apps-advanced
mattdholloway Jun 2, 2026
3f9e68f
Merge remote-tracking branch 'origin/main' into mcp-ui-apps-advanced
Copilot Jun 3, 2026
0eccc22
feat: add pull request editing functionality with reviewers support
mattdholloway Jun 9, 2026
d9be621
feat: implement interactive form handling for issue and pull request …
mattdholloway Jun 9, 2026
66e23ed
Merge branch 'main' into mcp-ui-apps-advanced
mattdholloway Jun 15, 2026
2462eee
Close response body per page in ui_get pagination loops
mattdholloway Jun 15, 2026
c16401c
Cache pr-edit.html in build-ui action
mattdholloway Jun 15, 2026
1cffb29
Merge remote-tracking branch 'origin/main' into pr/1974/mcp-ui-apps-a…
mattdholloway Jun 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Merge remote-tracking branch 'origin/main' into pr/1974/mcp-ui-apps-a…
…dvanced

# Conflicts:
#	docs/feature-flags.md
#	docs/insiders-features.md
#	pkg/github/__toolsnaps__/create_pull_request.snap
#	pkg/github/issues.go
#	pkg/github/pullrequests.go
#	pkg/github/pullrequests_test.go
  • Loading branch information
mattdholloway committed Jun 16, 2026
commit 1cffb29bd10fced61aedd40b2935e4d9943df2b0
3 changes: 2 additions & 1 deletion docs/feature-flags.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ runtime behavior (such as output formatting) won't appear here.
- `owner`: Repository owner (string, required)
- `repo`: Repository name (string, required)
- `reviewers`: GitHub usernames or ORG/team-slug team reviewers to request reviews from (string[], optional)
- `show_ui`: Whether to render the MCP App form instead of executing the request immediately. Defaults to true. Set to false to skip the form and execute directly — useful when you have all required values (especially ones the form does not collect, like reviewers) and the user has already confirmed the action. (boolean, optional, conditional — visible when remote_mcp_ui_apps is enabled unless the client explicitly indicates it does not support io.modelcontextprotocol/ui)
- `title`: PR title (string, required)

- **get_me** - Get my user profile
Expand All @@ -67,7 +68,7 @@ runtime behavior (such as output formatting) won't appear here.
- `milestone`: Milestone number (number, optional)
- `owner`: Repository owner (string, required)
- `repo`: Repository name (string, required)
- `show_ui`: Whether to render the MCP App form instead of executing the request immediately. Defaults to true. Set to false to skip the form and execute directly — useful when you have all required values (especially ones the form does not collect, like labels, assignees, milestone, type, or state changes) and the user has already confirmed the action. (boolean, optional, conditional — only visible to clients that advertise MCP App UI support)
- `show_ui`: Whether to render the MCP App form instead of executing the request immediately. Defaults to true. Set to false to skip the form and execute directly — useful when you have all required values (especially ones the form does not collect, like labels, assignees, milestone, type, or state changes) and the user has already confirmed the action. (boolean, optional, conditional — visible when remote_mcp_ui_apps is enabled unless the client explicitly indicates it does not support io.modelcontextprotocol/ui)
- `state`: New state (string, optional)
- `state_reason`: Reason for the state change. Ignored unless state is changed. (string, optional)
- `title`: Issue title (string, optional)
Expand Down
3 changes: 2 additions & 1 deletion docs/insiders-features.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ The list below is generated from the Go source. It covers tool **inventory and s
- `owner`: Repository owner (string, required)
- `repo`: Repository name (string, required)
- `reviewers`: GitHub usernames or ORG/team-slug team reviewers to request reviews from (string[], optional)
- `show_ui`: Whether to render the MCP App form instead of executing the request immediately. Defaults to true. Set to false to skip the form and execute directly — useful when you have all required values (especially ones the form does not collect, like reviewers) and the user has already confirmed the action. (boolean, optional, conditional — visible when remote_mcp_ui_apps is enabled unless the client explicitly indicates it does not support io.modelcontextprotocol/ui)
- `title`: PR title (string, required)

- **get_me** - Get my user profile
Expand All @@ -61,7 +62,7 @@ The list below is generated from the Go source. It covers tool **inventory and s
- `milestone`: Milestone number (number, optional)
- `owner`: Repository owner (string, required)
- `repo`: Repository name (string, required)
- `show_ui`: Whether to render the MCP App form instead of executing the request immediately. Defaults to true. Set to false to skip the form and execute directly — useful when you have all required values (especially ones the form does not collect, like labels, assignees, milestone, type, or state changes) and the user has already confirmed the action. (boolean, optional, conditional — only visible to clients that advertise MCP App UI support)
- `show_ui`: Whether to render the MCP App form instead of executing the request immediately. Defaults to true. Set to false to skip the form and execute directly — useful when you have all required values (especially ones the form does not collect, like labels, assignees, milestone, type, or state changes) and the user has already confirmed the action. (boolean, optional, conditional — visible when remote_mcp_ui_apps is enabled unless the client explicitly indicates it does not support io.modelcontextprotocol/ui)
- `state`: New state (string, optional)
- `state_reason`: Reason for the state change. Ignored unless state is changed. (string, optional)
- `title`: Issue title (string, optional)
Expand Down
4 changes: 4 additions & 0 deletions pkg/github/__toolsnaps__/create_pull_request.snap
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@
},
"type": "array"
},
"show_ui": {
"description": "Whether to render the MCP App form instead of executing the request immediately. Defaults to true. Set to false to skip the form and execute directly — useful when you have all required values (especially ones the form does not collect, like reviewers) and the user has already confirmed the action.",
"type": "boolean"
},
"title": {
"description": "PR title",
"type": "string"
Expand Down
5 changes: 3 additions & 2 deletions pkg/github/issues.go
Original file line number Diff line number Diff line change
Expand Up @@ -1766,6 +1766,7 @@ var issueWriteFormParams = map[string]struct{}{
"state": {},
"state_reason": {},
"duplicate_of": {},
"show_ui": {},
"_ui_submitted": {},
}

Expand Down Expand Up @@ -1984,7 +1985,7 @@ Options are:
return utils.NewToolResultError(err.Error()), nil, nil
}

if deps.IsFeatureEnabled(ctx, MCPAppsFeatureFlag) && clientSupportsUI(ctx, req) && !uiSubmitted && !issueWriteHasNonFormParams(args) {
if deps.IsFeatureEnabled(ctx, MCPAppsFeatureFlag) && clientSupportsUI(ctx, req) && !uiSubmitted && showUI && !issueWriteHasNonFormParams(args) {
issueNumber := 0
if method == "update" {
n, numErr := RequiredInt(args, "issue_number")
Expand Down Expand Up @@ -2241,7 +2242,7 @@ Options are:
return utils.NewToolResultError(err.Error()), nil, nil
}

if deps.IsFeatureEnabled(ctx, MCPAppsFeatureFlag) && clientSupportsUI(ctx, req) && !uiSubmitted && !issueWriteHasNonFormParams(args) {
if deps.IsFeatureEnabled(ctx, MCPAppsFeatureFlag) && clientSupportsUI(ctx, req) && !uiSubmitted && showUI && !issueWriteHasNonFormParams(args) {
issueNumber := 0
if method == "update" {
n, numErr := RequiredInt(args, "issue_number")
Expand Down
16 changes: 6 additions & 10 deletions pkg/github/issues_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1693,7 +1693,7 @@ func Test_IssueWrite_MCPAppsFeature_UIGate(t *testing.T) {
require.NoError(t, err)

textContent := getTextResult(t, result)
assert.NotContains(t, textContent.Text, "Ready to create an issue",
assert.NotContains(t, textContent.Text, "interactive form has been shown",
"show_ui=false should skip UI form")
assert.Contains(t, textContent.Text, "https://github.com/owner/repo/issues/1",
"show_ui=false call should execute directly and return issue URL")
Expand All @@ -1715,7 +1715,7 @@ func Test_IssueWrite_MCPAppsFeature_UIGate(t *testing.T) {
require.NoError(t, err)

textContent := getTextResult(t, result)
assert.Contains(t, textContent.Text, "Ready to create an issue",
assert.Contains(t, textContent.Text, "interactive form has been shown",
"show_ui=true should still route through the form")
})

Expand Down Expand Up @@ -1800,14 +1800,10 @@ func Test_issueWriteSchemaClassification(t *testing.T) {
// Schema properties the MCP App form cannot represent — their presence
// must trigger the safety-net bypass via issueWriteHasNonFormParams.
knownNonForm := map[string]struct{}{
"assignees": {},
"labels": {},
"milestone": {},
"type": {},
"state": {},
"state_reason": {},
"duplicate_of": {},
"issue_fields": {}, // only on the FF-enabled IssueWrite variant
"assignees": {},
"labels": {},
"milestone": {},
"type": {},
}

cases := []struct {
Expand Down
14 changes: 13 additions & 1 deletion pkg/github/pullrequests.go
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,7 @@ var pullRequestWriteFormParams = map[string]struct{}{
"draft": {},
"maintainer_can_modify": {},
"reviewers": {},
"show_ui": {},
"_ui_submitted": {},
}

Expand Down Expand Up @@ -707,6 +708,17 @@ func CreatePullRequest(t translations.TranslationHelperFunc) inventory.ServerToo
Type: "string",
},
},
// show_ui is hidden from clients that do not advertise MCP App
// UI support. The strip happens per-request in
// inventory.ToolsForRegistration; it is present in the static
// schema (and therefore in toolsnaps and the feature-flag /
// insiders docs) so the UI-capable surface is fully
// documented. It is intentionally not in the main README,
// which renders the stripped (non-UI) schema.
"show_ui": {
Type: "boolean",
Description: "Whether to render the MCP App form instead of executing the request immediately. Defaults to true. Set to false to skip the form and execute directly — useful when you have all required values (especially ones the form does not collect, like reviewers) and the user has already confirmed the action.",
},
},
Required: []string{"owner", "repo", "title", "head", "base"},
},
Expand Down Expand Up @@ -734,7 +746,7 @@ func CreatePullRequest(t translations.TranslationHelperFunc) inventory.ServerToo
return utils.NewToolResultError(err.Error()), nil, nil
}

if deps.IsFeatureEnabled(ctx, MCPAppsFeatureFlag) && clientSupportsUI(ctx, req) && !uiSubmitted && !pullRequestWriteHasNonFormParams(args) {
if deps.IsFeatureEnabled(ctx, MCPAppsFeatureFlag) && clientSupportsUI(ctx, req) && !uiSubmitted && showUI && !pullRequestWriteHasNonFormParams(args) {
return utils.NewToolResultAwaitingFormSubmission(fmt.Sprintf(
"An interactive form has been shown to the user for creating a new pull request in %s/%s. "+
"STOP — do not call any other tools, do not respond as if the pull request was created, "+
Expand Down
8 changes: 5 additions & 3 deletions pkg/github/pullrequests_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2704,7 +2704,7 @@ func Test_CreatePullRequest_MCPAppsFeature_UIGate(t *testing.T) {
require.NoError(t, err)

textContent := getTextResult(t, result)
assert.NotContains(t, textContent.Text, "Ready to create a pull request",
assert.NotContains(t, textContent.Text, "interactive form has been shown",
"show_ui=false should skip UI form")
assert.Contains(t, textContent.Text, "https://github.com/owner/repo/pull/42",
"show_ui=false call should execute directly and return PR URL")
Expand All @@ -2726,7 +2726,7 @@ func Test_CreatePullRequest_MCPAppsFeature_UIGate(t *testing.T) {
require.NoError(t, err)

textContent := getTextResult(t, result)
assert.Contains(t, textContent.Text, "Ready to create a pull request",
assert.Contains(t, textContent.Text, "interactive form has been shown",
"show_ui=true should still route through the form")
})

Expand Down Expand Up @@ -2876,7 +2876,9 @@ func Test_pullRequestWriteHasNonFormParams(t *testing.T) {
want bool
}{
{name: "no params", args: map[string]any{}, want: false},
{name: "only form params", args: map[string]any{"owner": "o", "repo": "r", "title": "t", "body": "b", "head": "h", "base": "b", "draft": true, "maintainer_can_modify": false, "reviewers": []any{"octocat"}, "_ui_submitted": true}, want: false},
{name: "only form params", args: map[string]any{"owner": "o", "repo": "r", "title": "t", "body": "b", "head": "h", "base": "b", "draft": true, "maintainer_can_modify": false, "reviewers": []any{"octocat"}, "show_ui": true, "_ui_submitted": true}, want: false},
{name: "show_ui true is a form param", args: map[string]any{"title": "t", "show_ui": true}, want: false},
{name: "show_ui false is a form param", args: map[string]any{"title": "t", "show_ui": false}, want: false},
{name: "unknown param present", args: map[string]any{"title": "t", "unknown_param": "value"}, want: true},
{name: "nil value is ignored", args: map[string]any{"reviewers": nil}, want: false},
}
Expand Down
Loading
You are viewing a condensed version of this merge commit. You can view the full changes here.