feat(mcp): re-export the roster over /mcp, off by default and token-gated #1040
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-gaming/sirens-echo!1040
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/gh1025-roster-reexport"
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 the gap #1025 names: a lane could not re-export its rostered tools, so a fleet client paid a full agent turn for work that is one tool call.
SIRENS_ECHO_MCP_REEXPORTnow offers each rostered tool over/mcpbesideturn.The decision #1025 says matters, answered conservatively
I took that seriously rather than around. Three things keep the boundary where it is unless someone deliberately moves it:
SIRENS_ECHO_HTTP_TOKENas anAuthorization: Bearerheader, compared in constant time.turnis untouched and still requires none.So this PR does not, by itself, hand any tailnet peer the Dowel lane's Discord write surface. Setting both the flag and the token does, deliberately.
The other four decisions
transportMCPbudget, so a tool client cannot outspend the guilds it shares a deployment with.proxyToolNamealready yieldsserver__tool, so the collision check that guards the model's tool list guards this surface too.Tests
Ten, and the two that matter if this ever regresses are a call with no token and a call with a wrong token, both refused.
One of them initially passed for the wrong reason. The helper presented a token whenever one was configured, so my "untrusted" case was authenticated.
configuredandpresentedare now separate parameters. Worth knowing that the gate's own test was briefly not testing the gate.The turn-only default is asserted rather than assumed: flag off lists
turnalone, byte for byte what shipped before this existed.Cost, stated rather than hidden
A call opens a roster session, calls, and closes it. That is honest rather than efficient and is the first thing to improve if this carries real traffic.
Docs
docs/sirens-echo-http.mdsaid "Nothing is bypassed there either", which #1025 names as one of three places stating the opposite intent. Corrected. The third is deploy's README and lives in the other repository, so it wants a matching edit there if any lane turns this on.The docs band is full, and this is worth flagging beyond this PR: 40 of 40 pages, with the three relevant pages at 7866, 7998, and 8000 characters against an 8000-character cap. I tried a dedicated page and the hook correctly refused, since splitting trades one violation for another. So a substantial feature got three sentences where house style wants a walkthrough. That is a real constraint rather than a choice I made.
Not done
Nothing is deployed and no lane sets the flag. This is also a feature rather than an operational improvement, so under the August 19 freeze it sits behind August 20 unless Kai decides otherwise.
Refs: #1025, #943, #310
🤖 Generated with Claude Code
turnto MCP clients, so a lane cannot re-export its rostered tools #1025