Skip to content

Document GitHub's MCP Apps form deferral on the Aperture server - #2138

Merged
myoung34 merged 1 commit into
mainfrom
kagent-mcp-apps-gotcha
Oct 6, 2026
Merged

myoung34 merged 1 commit into
mainfrom
kagent-mcp-apps-gotcha

Conversation

@myoung34

@myoung34 myoung34 commented Oct 6, 2026

Copy link
Copy Markdown
Owner

Problem

kagent reported that GitHub_create_pull_request returned an interactive-UI
acknowledgement instead of a PR, with no API call reaching GitHub, while every
other GitHub write through the same connector worked and returned real data.

That is real upstream behaviour, not a permissions fault. GitHub's
create_pull_request, update_pull_request and issue_write are backed by
interactive HTML forms ("MCP Apps"). shouldDeferToForm() in
pkg/github/ui_capability.go
hands the call off to that form — returning an "an interactive form has been
shown to the user ... the pull request has NOT been created"
stub and making
no API call — whenever the client advertises the io.modelcontextprotocol/ui
capability extension. Headless clients are meant to strip _meta.ui and
execute directly (PR #2774).

kagent renders no UI, so a deferred call can never be submitted. The stub also
instructs the model not to claim success or call another tool, so it surfaces
as a well-behaved agent hitting a wall rather than as an error.

The trap is the shape of the failure: create_branch and
create_or_update_file have no form and execute unconditionally, so a deferred
run leaves a pushed branch with commits on it and no PR, under an OAuth
connector whose scopes are entirely fine. That reads as a scope problem and
sends you auditing the wrong thing.

Solution

Comment only — no manifest change. kubectl kustomize output is byte-identical
and the parsed object is unchanged.

Records, next to the server it applies to: what the stub means, why it is not
an auth problem, the branch-with-no-PR symptom, and the lever if it returns —
?features=mcp_apps_disable_form_deferral on Aperture's GitHub connector url,
GitHub's documented kill switch for exactly this. Also notes that the connector
lives in the Aperture admin dashboard outside ArgoCD, and that editing its url
changes the OAuth resource identifier and so forces a reconnect.

Not currently blocking anything, and nothing in this repo holds it shut —
hence a hazard note rather than a fix.

GitHub's create_pull_request, update_pull_request and issue_write are
backed by interactive HTML forms. When the MCP client advertises the
io.modelcontextprotocol/ui capability, github-mcp-server defers the call
to that form and makes no API call, returning a stub that tells the model
the PR was not created. kagent renders no UI, so a deferred call can never
be submitted.

Nothing here holds it shut and it is not currently biting us, but the
failure is shaped like a permissions problem and is not one: create_branch
and create_or_update_file have no form, so a deferred run leaves a pushed
branch with commits and no PR. Record the symptom and the kill switch -
?features=mcp_apps_disable_form_deferral on Aperture's GitHub connector -
next to the server it applies to.
Copilot AI balanced review requested due to automatic review settings October 6, 2026 15:42

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@myoung34
myoung34 merged commit 713a30e into main Oct 6, 2026
2 checks passed
@myoung34
myoung34 deleted the kagent-mcp-apps-gotcha branch October 6, 2026 15:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants