fix(mcp): a nameless tool is not a tool named after its server #589
No reviewers
Labels
No labels
move-to-repo
coilyco-bridge-deploy
move-to-repo
coilyco-flight-deck-agent-compose
move-to-repo
coilyco-gaming-eco-app
move-to-repo
coilysiren-inbox
move-to-repo
unknown
🔒⚠️📦⚠️🔒 SANDBOXED 🔒⚠️📦⚠️🔒
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
c#
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!589
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/a-nameless-tool-is-not-the-server"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
closes #587
The nine empty tool names that motivated #587 are old pods, not a live defect. I established that first, and then found a real hole underneath it.
The empty spans
The scratchpad shipped without
Originalat 15:51 on 12 August (02b2d07), and2cc7ddbfixed it at 17:21 the same day — "fix(scratchpad): name the tool in telemetry". All nine empty spans arescratchpadonsirens-deep, from an image built in that 90-minute window.Same explanation Lucia established for
failure_causeon #292: image age, not breakage. I checked the attribute's own history before concluding, because "the field is new" and "the field is broken" look identical in a query.The hole underneath
proxyToolName("forgejo", "")composesforgejo__, trims toforgejo, and passes. A nameless tool therefore registers as a tool named after its own server, withOriginal: "".Two consequences, both the shape settled repeatedly today:
mcp.tool.namereads empty, which is indistinguishable from an absent attribute rather than from a real nameThe emptiness check could not see the missing half because trimming leaves the other half standing. Checked before composing now, because after composition the information is already gone.
Blast radius
Unexercised by our own tools — the scratchpad, fetch, refresh and fixture definitions all name themselves. Reachable by any external MCP server that publishes a nameless tool.
The error is fatal to the turn, which is consistent rather than new:
proxyToolNamealready errors on an unusable name, and the register path already treats a roster mistake as fatal on the stated grounds that degrading past it silently drops a tool.A test pins that ordinary names still compose unchanged, and one pins the composition itself, so if
forgejo__ever stops trimming toforgejothe test says the cause moved rather than silently passing.ward exec gategreen.