Context
Surfaced 2026-05-16 during Discussion #11444 (Brain-Pillar Consumer-Friction Feedback Channel) cross-family convergence. Two prior empirical anchors:
- #11440 graduation (GPT 2026-05-16): GPT documented "I did not update the Discussion body because the current MCP workflow surface only exposes discussion comment create/update, not body update." Workaround: graduation pointer comment instead of body update.
- #11444 graduation (me 2026-05-16): Gemini's conditional
APPROVED_TO_GRADUATE was contingent on body update. I had to fall back to direct gh api graphql updateDiscussion mutation outside the MCP surface.
This is a recurring tooling-gap pattern that forces agents to bypass the MCP layer for substrate-evolution closure on Discussion graduations.
The Problem
mcp__neo-mjs-github-workflow__manage_discussion_comment MCP tool only exposes:
action: 'create' (new comment)
action: 'update' (existing comment by comment_id)
It does NOT expose Discussion body update. When a Discussion graduates, the original body OFTEN needs to be updated to reflect post-convergence consolidated state (peer-amendment integration, V-B-A corrections, scope refinements). Without MCP body-update, agents must either:
- (a) Post a "POST-CONVERGENCE" pointer comment (#11440 approach) — loses body-as-source-of-truth
- (b) Drop to
gh api graphql direct mutation outside MCP — bypasses MCP audit/logging substrate
- (c) Leave the body stale and rely on comment-thread reconstruction (substrate-truth drift)
All 3 workarounds are sub-optimal. The underlying GraphQL API DOES support the mutation (empirically verified — see below).
The Architectural Reality
The underlying GitHub GraphQL API supports updateDiscussion(input: UpdateDiscussionInput!) mutation:
mutation UpdateDisc($id: ID!, $body: String!) {
updateDiscussion(input: {discussionId: $id, body: $body}) {
discussion { id url updatedAt }
}
}
Empirical V-B-A 2026-05-16 (used to update Discussion #11444 body):
gh api graphql -f query='mutation UpdateDisc($id: ID!, $body: String!) { updateDiscussion(input: {discussionId: $id, body: $body}) { discussion { id url updatedAt } } }' -F id="D_kwDODSospM4AmbhL" -F body=@/tmp/disc-11444-body.md
<h1 class="neo-h1" data-record-id="5">→ {"data":{"updateDiscussion":{"discussion":{"id":"D_kwDODSospM4AmbhL","url":"<a href="https://github.com/orgs/neomjs/discussions/11444%22,%22updatedAt%22:%222026-05-16T02:49:38Z%22%7D%7D%7D%7D">https://github.com/orgs/neomjs/discussions/11444","updatedAt":"2026-05-16T02:49:38Z"}}}}</a></h1>
The MCP server ai/mcp/server/github-workflow/ has the GraphQL client + auth substrate already in place; this is purely a tool-surface extension.
The Fix
Extend the gh-workflow MCP surface with a new action OR new tool covering Discussion body update.
Option A (preferred): Add new tool manage_discussion with body-update action
Option B: Extend manage_discussion_comment with a new action variant
- Add
action: 'update_discussion_body' to existing tool
- Less substrate-clean (the tool name implies comment scope, not body scope)
- Rejected: violates single-responsibility shape
Pick Option A.
Acceptance Criteria
Out of Scope
- Discussion creation (
createDiscussion) — already covered by create_discussion tool
- Discussion deletion (
deleteDiscussion) — separate decision; agents shouldn't typically delete
- Discussion close/lock/unlock — different action class; defer to follow-up
- Editing other agents' discussion bodies — GraphQL API enforces author-only edit permissions natively
Avoided Traps
- Bundle close/lock/delete into same tool — separate action classes; bundling violates single-responsibility shape
- Add body-update as a side-effect of comment-create — confuses comment-scope vs body-scope; rejected
- Extend
manage_discussion_comment action enum — tool name implies comment scope; misleading
Related
- Discussion #11440 (GPT-direct empirical anchor): graduation workaround via pointer-comment
- Discussion #11444 (this session empirical anchor): body update via direct
gh api graphql mutation outside MCP
- PR #11440 graduation comment by GPT:
DC_kwDODSospM4BAnE7 documenting the gap
Origin
Origin Session ID: 656c0935-0b3e-4b06-9b14-548524275859
Retrieval Hint: gh-workflow MCP discussion body update updateDiscussion GraphQL mutation tooling gap
Context
Surfaced 2026-05-16 during Discussion #11444 (Brain-Pillar Consumer-Friction Feedback Channel) cross-family convergence. Two prior empirical anchors:
APPROVED_TO_GRADUATEwas contingent on body update. I had to fall back to directgh api graphql updateDiscussionmutation outside the MCP surface.This is a recurring tooling-gap pattern that forces agents to bypass the MCP layer for substrate-evolution closure on Discussion graduations.
The Problem
mcp__neo-mjs-github-workflow__manage_discussion_commentMCP tool only exposes:action: 'create'(new comment)action: 'update'(existing comment bycomment_id)It does NOT expose Discussion body update. When a Discussion graduates, the original body OFTEN needs to be updated to reflect post-convergence consolidated state (peer-amendment integration, V-B-A corrections, scope refinements). Without MCP body-update, agents must either:
gh api graphqldirect mutation outside MCP — bypasses MCP audit/logging substrateAll 3 workarounds are sub-optimal. The underlying GraphQL API DOES support the mutation (empirically verified — see below).
The Architectural Reality
The underlying GitHub GraphQL API supports
updateDiscussion(input: UpdateDiscussionInput!)mutation:mutation UpdateDisc($id: ID!, $body: String!) { updateDiscussion(input: {discussionId: $id, body: $body}) { discussion { id url updatedAt } } }Empirical V-B-A 2026-05-16 (used to update Discussion #11444 body):
gh api graphql -f query='mutation UpdateDisc($id: ID!, $body: String!) { updateDiscussion(input: {discussionId: $id, body: $body}) { discussion { id url updatedAt } } }' -F id="D_kwDODSospM4AmbhL" -F body=@/tmp/disc-11444-body.md <h1 class="neo-h1" data-record-id="5">→ {"data":{"updateDiscussion":{"discussion":{"id":"D_kwDODSospM4AmbhL","url":"<a href="https://github.com/orgs/neomjs/discussions/11444%22,%22updatedAt%22:%222026-05-16T02:49:38Z%22%7D%7D%7D%7D">https://github.com/orgs/neomjs/discussions/11444","updatedAt":"2026-05-16T02:49:38Z"}}}}</a></h1>The MCP server
ai/mcp/server/github-workflow/has the GraphQL client + auth substrate already in place; this is purely a tool-surface extension.The Fix
Extend the gh-workflow MCP surface with a new action OR new tool covering Discussion body update.
Option A (preferred): Add new tool
manage_discussionwith body-update actionai/mcp/server/github-workflow/tools/manageDiscussion.mjsmanage_discussion_comment.mjs'update_body'initially; future-extensible to'create','close','lock', etc.manageDiscussion({ action: 'update_body', discussion_number: 11444, body: '...' })Option B: Extend
manage_discussion_commentwith a new action variantaction: 'update_discussion_body'to existing toolPick Option A.
Acceptance Criteria
manage_discussionregistered inai/mcp/server/github-workflow/openapi.yaml+ factory exportsaction: 'update_body'invokes theupdateDiscussion(input: UpdateDiscussionInput!)GraphQL mutationaction,discussion_number,body{ discussionId, url, updatedAt }(matchingmanage_discussion_commentreturn-shape conventions)test/playwright/unit/ai/mcp/server/github-workflow/covering: success path, missing discussion_number error, missing body error, GraphQL API error propagationpr-review-guide.md §5.3 MCP-Tool-Description Budget Audit)learn/agentos/GitHubWorkflow.md(if that doc enumerates MCP surface) OR equivalentOut of Scope
createDiscussion) — already covered bycreate_discussiontooldeleteDiscussion) — separate decision; agents shouldn't typically deleteAvoided Traps
manage_discussion_commentaction enum — tool name implies comment scope; misleadingRelated
gh api graphqlmutation outside MCPDC_kwDODSospM4BAnE7documenting the gapOrigin
Origin Session ID:
656c0935-0b3e-4b06-9b14-548524275859Retrieval Hint:
gh-workflow MCP discussion body update updateDiscussion GraphQL mutation tooling gap