feat(mcp): tell the model what each surface is for, in the server's own words #862
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!862
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/bk79-server-instructions"
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?
Refs #647. This is the selection work your decision named, built on a source I said did not exist and Kai remembered did.
Correcting my own claim
I told Kai that MCP exposes no server-level "when to reach for me," so trigger text would have to be authored by hand. That was wrong.
InitializeResult.Instructionsis exactly that, in the SDK this repo already pins, and its doc comment reads like a spec for this issue:The harness already calls
session.InitializeResult()twice -mcp.go:567and:828- for capability checks, and discarded this field. No new call, no round trip, no build step.Why this satisfies the decision that killed the port
The rejected port would have added 34.6% to Echo and 87.2% to Deep for a build-time copy of data the model already had. This adds only what the servers themselves say, and nothing when they say nothing.
Shape
Guidance()onToolSession, mirroringGrounding()exactly - same capture point, same per-turn read, same message shape. Six implementers, one composite that merges.It describes, it does not authorise
A server writes this string, so it is framed and bounded. The message says so in the same breath:
That matters more here than for grounding. Grounding is reference material a turn answers from; guidance is closer to instructions, and a bound supplied by the thing being bounded is not a bound.
SIRENS_ECHO_SERVER_GUIDANCE_BYTEScaps one entry at 2 KiB.One bug my own test caught
The first version appended
" [truncated]"on top oftruncateRunes' ellipsis and overshot the cap by two bytes. The bound is now enforced on the final string, and the ellipsis alone marks the cut - the convention this repo already uses.I also had to restructure two tests that asserted almost nothing: they exercised
strings.TrimSpacerather than the shaping rule. ExtractedboundGuidanceTextso blank-handling and truncation are genuinely testable rather than reachable only through a*mcp.ClientSessionnobody can fake.Evidence the field is populated
Not theoretical. The ward-mcp servers on Echo's roster publish this today - I am reading their text in my own harness context, e.g. forgejo's "This server exposes only policy-approved tools. Use read-only tools to inspect state before mutation tools."
Not in this PR
sirens-echo's own MCP server publishes no
Instructions. It tells nothing that connects to it what it is for. Same idea from the producing side, and a separate small change.just gatePASS on all six steps.