Review: Forgejo MCP: add update_issue tool
Verdict: NEEDS_REFINEMENT
Template Completeness
- [x] Type — Feature
- [x] Lineage — standalone, discovered during dogfooding
- [x] Repo —
forgejo_admin/claude-custom(BUT WRONG — see Repo Placement) - [x] User Story — As Betty Sue, I want to update issue body via MCP
- [x] Context — explains consolidated spec convention gap
- [x] File Targets — two files listed (BUT WRONG paths — see File Targets)
- [x] Acceptance Criteria — 3 criteria
- [x] Test Expectations — unit + integration + run command
- [x] Constraints — API endpoint, patterns, optional fields
- [x] Checklist — standard PR/tests/no-unrelated
- [x] Related — references #161 and dotfiles#1
Traceability
- [x] story:pm-scope label — Betty Sue PM workflow, appropriate for MCP tooling
- [x] arch:forgejo-mcp label — correct architecture component
- [x] Forgejo issue —
forgejo_admin/claude-custom#162, open — BUT filed on wrong repo (see Repo Placement)
File Targets
- [ ]
~/pal-e-docs-mcp/src/pal_e_docs_mcp/forgejo/tools.py— ISSUE: directory does not exist.~/pal-e-docs-mcpis not present on the filesystem at all. The Forgejo MCP lives at~/forgejo-mcp/src/forgejo_mcp/tools/workflows.py - [ ]
~/pal-e-docs-mcp/src/pal_e_docs_mcp/forgejo/client.py— ISSUE: does not exist. The forgejo-mcp has no client.py — it usesforgejo_sdk.ForgejoClientvia~/forgejo-mcp/src/forgejo_mcp/server.py. No new client code is needed because the SDK already exposesissue_edit_issue(owner, repo, index, *, title=None, body=None, ...)
Correct file targets should be:
~/forgejo-mcp/src/forgejo_mcp/tools/workflows.py— addupdate_issuetool function following existing patterns (e.g.,comment_on_issue)~/forgejo-mcp/tests/test_label_comment_repo.py(or new test file) — add integration tests
Repo Placement
MISMATCH. The issue body says
### Repo: forgejo_admin/claude-custom, but the actual code change lives in forgejo_admin/forgejo-mcp. The issue should be filed on forgejo_admin/forgejo-mcp.DUPLICATE FOUND:
forgejo_admin/forgejo-mcp#15 already exists with the same scope ("Add update_issue tool — expose SDK's issue_edit_issue"), filed on the correct repo. Board item #360 tracks it with labels type:feature,arch:mcp-tools,story:pm-scope,scope:discovered.Dependencies
- forgejo-sdk
issue_edit_issue— VERIFIED. The SDK method exists with signature:(owner, repo, index, *, title=None, body=None, assignee=None, assignees=None, due_date=None, milestone=None, ref=None, state=None, ...). Both title and body are optional kwargs. No SDK changes needed. - Board item #364 (issue #161, "Scope review pipeline") — upstream motivation. Not a hard blocker.
- Board item #360 (forgejo-mcp#15) — DUPLICATE. Same scope, correct repo.
Acceptance Criteria
- [x]
mcp__forgejo__update_issue(owner, repo, issue_number, body=..., title=...)— testable, clear - [x] Can update body without title and vice versa — testable, SDK supports optional kwargs
- [x] Updated body appears on Forgejo web UI — integration test can verify via API round-trip
Criteria are reasonable and verifiable. The test run command (
pytest tests/ -k test_update_issue) is plausible.Blast Radius
- Low blast radius. This adds a new tool following established patterns. No existing tools are modified.
- The existing codebase already uses
issue_edit_issuein test cleanup (closing issues), confirming the SDK method is stable. - No downstream consumers need changes — MCP tool registration is automatic via the
@mcp.tool()decorator pattern.
Decomposition (5-minute rule)
- 1 file target for implementation + 1 for tests, single repo — no decomposition needed
- 3 acceptance criteria — within threshold
- Estimated agent work: under 5 minutes — fits single agent pass
Recommendation
This board item (#365) is a duplicate of board item #360 (forgejo-mcp#15). Recommended actions:
- Close claude-custom#162 as duplicate, linking to forgejo-mcp#15
- Remove board item #365 from the board (duplicate of #360)
- Update forgejo-mcp#15 with corrected file targets:
- Confirm forgejo-mcp#15 has the SDK signature detail:
client.issue_edit_issue(owner, repo, index, title=..., body=...)— no client.py changes needed
If this item is kept instead of #360, it must be moved to forgejo_admin/forgejo-mcp and have all file paths corrected.