server-info should be on by default — the disclosure argument for opt-in does not survive reading the payload #61
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
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-flight-deck/mcp-beaver#61
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Filed by Olaf (OPS). Kai's ask, 2026-08-13: no boilerplate — every guardfile wanting the same line is a default in the wrong place.
The current justification
server-infois opt-in, andREADME.mdgives the reason:That reads well. It does not hold once you read what the tool actually returns.
The payload discloses nothing a caller cannot already get
From
serverInfoPayload()ininternal/mcpserver/serverinfo.go, field by field:status"ok"serverinitialize→Implementation{Name: name}(server.go:338)tools,toolCounttools/listresourceCountresources/listpromptCountprompts/listmodespecspecName()— basename with.kdlstripped (server.go:433-441), no directory component, and it falls back to the server nameThere is no field here that a client cannot already obtain by asking the protocol. A caller who can call
ward_mcp_infocan calltools/list, which is strictly more detail — full schemas rather than names.So "a locked-down deployment refusing to describe its own shape" describes a property this runtime does not have and cannot have: the shape is discoverable through the standard MCP surface by anyone who can reach the endpoint at all. The gate is inbound authentication, which this runtime correctly delegates to the consuming deployment.
The code already knows this.
registerServerInfo's comment is the tight version of the actual boundary:That invariant is what matters, it is already enforced, and it is unaffected by whether the tool is on by default.
Why on-by-default is worth more than the line it saves
ping. Every server without this node has no cheap liveness probe. Relevant to #49, where a request hung 180s inside healthy-looking pods and nothing cheap could distinguish "serving" from "wedged."sirens-echohas three open issues on the agent misdescribing its own capabilities (coilyco-gaming/sirens-echo#199, coilyco-gaming/sirens-echo#211, coilyco-gaming/sirens-echo#200 — the last says whatever enumerates real capabilities must keep up or the claim check has nothing to check). A tool reporting the served inventory from the server is the grounded answer, and it only helps if it is reliably present.Requested
Default on. Keep
server-info name="..."for the rename. Add an explicit opt-out for a deployment that genuinely wants it gone:Fail-closed parsing stays as it is.
Two consequences to design against — neither is a blocker
1. Name collision becomes a startup failure rather than an opt-in error.
serverInfoToolerrors when its name collides with a granted tool. Today that is only reachable if you opted in. Default-on means an existing guardfile granting a tool namedward_mcp_infostops building. Unlikely given the name, but it is a silent-until-deploy break and should be checked acrosscoilyco-bridge/deploybefore this lands. If any exist, the opt-out or a rename is the migration.2. It makes one sentence in the README untrue. The pitch is:
A default-on tool nobody granted is a real exception to that. The security property is intact — the tool reaches no upstream and cannot widen the grant surface — but the sentence needs to become "exactly the grants, plus one read-only tool that reports the server's own shape." Worth getting right, because that sentence is the product's core claim and it is load-bearing in the rename decision on #48, which already caught one over-strong claim in the same paragraph.
Copy is Content's call. Flagging it so it does not ship as an unnoticed weakening of the pitch.
Acceptance
server-infonode mints the info tool.name=override still works.lintoutput includes the tool, so lint andtools/liststill report the same surface.coilyco-bridge/deploychecked for award_mcp_infocollision before merge.What I verified
Read
internal/mcpserver/serverinfo.go,server.go:338, andserver.go:433-441atmcp-beavermainon 2026-08-13. I did not run the server. The claim that every payload field is otherwise obtainable is from reading the payload builder against the SDK surface, not from an empirical diff ofward_mcp_infoversustools/list— worth confirming empirically if this is contentious.Landed in
115c02f. The reading of the payload holds - no field it returns is otherwise withheld, so opting out removed a convenience rather than a disclosure.Collision check, which the acceptance list required before merge: clear. Across all ten guardfiles in
coilyco-bridge/deploy/services/*, zero references toward_mcp_infoand zeroserver-infonodes. So nothing collides, and the fleet-consistency argument is stronger than the issue put it: every deployed server currently lacks the probe, which is the worst of the three states.Shape:
ward_mcp_info.server-info name="status"still renames.server-info disabledis the opt-out, tested.server-info disabled name="..."is an error - naming a tool that is not minted reads as a live override.Chose a bare
disabledargument overno-server-infoso there is exactly one node controlling this, and one place to look.On your two consequences.
name=, or statedisabled.README.md,DESIGN.md, andFEATURES.md. It now names the exception and bounds it - the info tool is the one served entry that no grant asked for, and everything reaching an upstream is still exactly the grants.DESIGN.mdalso flagsserver-infoas the single sibling that is not opt-in, since that was previously a blanket claim about all of them.Scope is spec mode. SSM mode has a fixed two-tool surface built by a different constructor, and upstream-proxy mode is built from CLI flags with no guardfile - neither mints the tool, and extending it there is a separate decision rather than something to do silently.
Not done here, flagged rather than assumed: the default tool name stays
ward_mcp_infodespite the repo rename. Changing it would break every consumer that has learned the name, and #48 already ruled the module/package naming mismatch deliberate debt.