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
Next Next commit
refactor issue creation UI
  • Loading branch information
mattdholloway committed Feb 3, 2026
commit c92739053d4254d5b04f751af23ddab8acb3a9e6
15 changes: 14 additions & 1 deletion pkg/github/__toolsnaps__/issue_write.snap
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
{
"_meta": {
"ui": {
"resourceUri": "ui://github-mcp-server/issue-write",
"visibility": [
"model",
"app"
]
}
},
"annotations": {
"title": "Create or update issue."
},
"description": "Create a new or update an existing issue in a GitHub repository.",
"description": "Create a new or update an existing issue in a GitHub repository.\n\nWhen show_ui is true, an interactive form is displayed for the user to fill in issue details. Use show_ui when:\n- Creating a new issue and you want user input on the details\n- The user hasn't specified all required fields (title, body, etc.)\n- Interactive feedback would be valuable\n\nWhen show_ui is false or omitted, the issue is created/updated directly with the provided parameters.",
"inputSchema": {
"properties": {
"assignees": {
Expand Down Expand Up @@ -51,6 +60,10 @@
"description": "Repository name",
"type": "string"
},
"show_ui": {
"description": "If true, show an interactive form for the user to fill in issue details. If false or omitted, create/update the issue directly with the provided parameters. Use show_ui when you want user input or when not all fields are specified.",
"type": "boolean"
},
"state": {
"description": "New state",
"enum": [
Expand Down
45 changes: 43 additions & 2 deletions pkg/github/issues.go
Original file line number Diff line number Diff line change
Expand Up @@ -1152,19 +1152,40 @@ func SearchIssues(t translations.TranslationHelperFunc) inventory.ServerTool {
}

// IssueWrite creates a tool to create a new or update an existing issue in a GitHub repository.
// IssueWriteUIResourceURI is the URI for the issue_write tool's MCP App UI resource.
const IssueWriteUIResourceURI = "ui://github-mcp-server/issue-write"

func IssueWrite(t translations.TranslationHelperFunc) inventory.ServerTool {
return NewTool(
ToolsetMetadataIssues,
mcp.Tool{
Name: "issue_write",
Description: t("TOOL_ISSUE_WRITE_DESCRIPTION", "Create a new or update an existing issue in a GitHub repository."),
Name: "issue_write",
Description: t("TOOL_ISSUE_WRITE_DESCRIPTION", `Create a new or update an existing issue in a GitHub repository.

When show_ui is true, an interactive form is displayed for the user to fill in issue details. Use show_ui when:
- Creating a new issue and you want user input on the details
- The user hasn't specified all required fields (title, body, etc.)
- Interactive feedback would be valuable

When show_ui is false or omitted, the issue is created/updated directly with the provided parameters.`),
Annotations: &mcp.ToolAnnotations{
Title: t("TOOL_ISSUE_WRITE_USER_TITLE", "Create or update issue."),
ReadOnlyHint: false,
},
// MCP Apps UI metadata - links this tool to its UI resource
Meta: mcp.Meta{
"ui": map[string]any{
"resourceUri": IssueWriteUIResourceURI,
"visibility": []string{"model", "app"},
},
},
InputSchema: &jsonschema.Schema{
Type: "object",
Properties: map[string]*jsonschema.Schema{
"show_ui": {
Type: "boolean",
Description: "If true, show an interactive form for the user to fill in issue details. If false or omitted, create/update the issue directly with the provided parameters. Use show_ui when you want user input or when not all fields are specified.",
},
"method": {
Type: "string",
Description: `Write operation to perform on a single issue.
Expand Down Expand Up @@ -1249,6 +1270,26 @@ Options are:
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}

// Check if UI mode is requested
showUI, err := OptionalParam[bool](args, "show_ui")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
}

// If show_ui is true, return a message indicating the UI should be shown
// The host will detect the UI metadata and display the form
if showUI {
if method == "update" {
issueNumber, numErr := RequiredInt(args, "issue_number")
if numErr != nil {
return utils.NewToolResultError("issue_number is required for update method"), nil, nil
}
return utils.NewToolResultText(fmt.Sprintf("Ready to update issue #%d in %s/%s. The interactive form will be displayed.", issueNumber, owner, repo)), nil, nil
}
return utils.NewToolResultText(fmt.Sprintf("Ready to create an issue in %s/%s. The interactive form will be displayed.", owner, repo)), nil, nil
}

title, err := OptionalParam[string](args, "title")
if err != nil {
return utils.NewToolResultError(err.Error()), nil, nil
Expand Down
103 changes: 0 additions & 103 deletions pkg/github/issues_ui.go

This file was deleted.

1 change: 0 additions & 1 deletion pkg/github/tools.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,6 @@ func AllTools(t translations.TranslationHelperFunc) []inventory.ServerTool {
ListAssignees(t),
ListMilestones(t),
IssueWrite(t),
CreateIssueUI(t),
AddIssueComment(t),
AssignCopilotToIssue(t),
SubIssueWrite(t),
Expand Down
4 changes: 2 additions & 2 deletions pkg/github/ui_resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ func RegisterUIResources(s *mcp.Server) {
&mcp.Resource{
URI: IssueWriteUIResourceURI,
Name: "issue_write_ui",
Description: "MCP App UI for creating GitHub issues",
Description: "MCP App UI for creating and updating GitHub issues",
MIMEType: "text/html",
},
func(_ context.Context, _ *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
html := MustGetUIAsset("create-issue.html")
html := MustGetUIAsset("issue-write.html")
return &mcp.ReadResourceResult{
Contents: []*mcp.ResourceContents{
{
Expand Down
2 changes: 1 addition & 1 deletion script/build-ui
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ npm run build
echo "Organizing output..."
mkdir -p dist
mv dist/src/apps/get-me/index.html dist/get-me.html 2>/dev/null || true
mv dist/src/apps/create-issue/index.html dist/create-issue.html 2>/dev/null || true
mv dist/src/apps/issue-write/index.html dist/issue-write.html 2>/dev/null || true
rm -rf dist/src 2>/dev/null || true

# Copy to Go embed location
Expand Down
4 changes: 2 additions & 2 deletions ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
"type": "module",
"description": "MCP App UIs for github-mcp-server using Primer React",
"scripts": {
"build": "npm run build:get-me && npm run build:create-issue",
"build": "npm run build:get-me && npm run build:issue-write",
"build:get-me": "APP=get-me vite build",
"build:create-issue": "APP=create-issue vite build",
"build:issue-write": "APP=issue-write vite build",
"dev": "npm run build",
"typecheck": "tsc --noEmit",
"clean": "rm -rf dist"
Expand Down
Loading