138 lines
3.7 KiB
Go
138 lines
3.7 KiB
Go
package github
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
)
|
|
|
|
// RegisterUIResources registers MCP App UI resources with the server.
|
|
// These are static resources (not templates) that serve HTML content for
|
|
// MCP App-enabled tools. The HTML is built from React/Primer components
|
|
// in the ui/ directory using `script/build-ui`.
|
|
//
|
|
// Resource metadata follows the stable 2026-01-26 MCP Apps spec:
|
|
// https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/2026-01-26/apps.mdx
|
|
func RegisterUIResources(s *mcp.Server, readOnly bool) {
|
|
// Register the get_me UI resource
|
|
s.AddResource(
|
|
&mcp.Resource{
|
|
URI: GetMeUIResourceURI,
|
|
Name: "get_me_ui",
|
|
Description: "MCP App UI for the get_me tool",
|
|
MIMEType: MCPAppMIMEType,
|
|
},
|
|
func(_ context.Context, _ *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
|
|
html := MustGetUIAsset("get-me.html")
|
|
return &mcp.ReadResourceResult{
|
|
Contents: []*mcp.ResourceContents{
|
|
{
|
|
URI: GetMeUIResourceURI,
|
|
MIMEType: MCPAppMIMEType,
|
|
Text: html,
|
|
Meta: mcp.Meta{
|
|
"ui": map[string]any{
|
|
// Allow loading images from GitHub's avatar CDN.
|
|
"csp": map[string]any{
|
|
"resourceDomains": []string{"https://avatars.githubusercontent.com"},
|
|
},
|
|
// Profile card renders inline within chat without a host border.
|
|
"prefersBorder": false,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, nil
|
|
},
|
|
)
|
|
|
|
if readOnly {
|
|
return
|
|
}
|
|
|
|
// Register the issue_write UI resource
|
|
s.AddResource(
|
|
&mcp.Resource{
|
|
URI: IssueWriteUIResourceURI,
|
|
Name: "issue_write_ui",
|
|
Description: "MCP App UI for creating and updating GitHub issues",
|
|
MIMEType: MCPAppMIMEType,
|
|
},
|
|
func(_ context.Context, _ *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
|
|
html := MustGetUIAsset("issue-write.html")
|
|
return &mcp.ReadResourceResult{
|
|
Contents: []*mcp.ResourceContents{
|
|
{
|
|
URI: IssueWriteUIResourceURI,
|
|
MIMEType: MCPAppMIMEType,
|
|
Text: html,
|
|
Meta: mcp.Meta{
|
|
"ui": map[string]any{
|
|
// No external origins required; documents the secure default.
|
|
"csp": map[string]any{},
|
|
// Form surface benefits from a host-provided border.
|
|
"prefersBorder": true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, nil
|
|
},
|
|
)
|
|
|
|
// Register the create_pull_request UI resource
|
|
s.AddResource(
|
|
&mcp.Resource{
|
|
URI: PullRequestWriteUIResourceURI,
|
|
Name: "pr_write_ui",
|
|
Description: "MCP App UI for creating GitHub pull requests",
|
|
MIMEType: MCPAppMIMEType,
|
|
},
|
|
func(_ context.Context, _ *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
|
|
html := MustGetUIAsset("pr-write.html")
|
|
return &mcp.ReadResourceResult{
|
|
Contents: []*mcp.ResourceContents{
|
|
{
|
|
URI: PullRequestWriteUIResourceURI,
|
|
MIMEType: MCPAppMIMEType,
|
|
Text: html,
|
|
Meta: mcp.Meta{
|
|
"ui": map[string]any{
|
|
"csp": map[string]any{},
|
|
"prefersBorder": true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, nil
|
|
},
|
|
)
|
|
|
|
s.AddResource(
|
|
&mcp.Resource{
|
|
URI: PullRequestEditUIResourceURI,
|
|
Name: "pr_edit_ui",
|
|
Description: "MCP App UI for editing GitHub pull requests",
|
|
MIMEType: MCPAppMIMEType,
|
|
},
|
|
func(_ context.Context, _ *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
|
|
html := MustGetUIAsset("pr-edit.html")
|
|
return &mcp.ReadResourceResult{
|
|
Contents: []*mcp.ResourceContents{
|
|
{
|
|
URI: PullRequestEditUIResourceURI,
|
|
MIMEType: MCPAppMIMEType,
|
|
Text: html,
|
|
Meta: mcp.Meta{
|
|
"ui": map[string]any{
|
|
"csp": map[string]any{},
|
|
"prefersBorder": true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}, nil
|
|
},
|
|
)
|
|
}
|