Add /mcps, which reports the reachable tool surface #777
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!777
Loading…
Reference in a new issue
No description provided.
Delete branch "eng/list-the-mcps"
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?
Adds
/mcps, which lists the MCP servers this deployment reaches and the tools each advertises.closes #776
It reads what the process reached, not what the file declares
The roster file names servers; whether one answered is a different fact, and they come apart exactly when someone needs this. So the reply is built from the discovered tool set with the configured roster supplying names, keeping three states distinct: answered with tools, answered with none, and configured but silent.
No new network calls. The supervisor already discovers and caches tools per server, and
ToolDefinitionalready carriesServerattribution alongsideUnavailable(). This reads what a turn would have read.Three constraints, each enforced rather than noted
No addresses. A roster entry holds a URL, transport, and environment map. None is rendered — the reasoning that keeps them out of the boot capability log ("a path or a channel id here would grow into an identifier") applies.
TestRenderMCPRosterNeverRendersAnAddressasserts it.Ephemeral, declared on the command. The flag lives in
CommandDefinition, so the refusal paths — not permitted, rate limited, bad arguments — inherit it. A denied/mcpswould otherwise become the public event the flag was avoiding. Echo's channel carries members who did not ask.No job dependency.
runCommandreturnedjobs are not enabledbefore its switch, so every command assumed the job system./mcpsis answered above that guard.Gates are unchanged
Per
docs/sirens-echo-commands.md, a command is a summon path: access policy, then admission, in that order./mcpspasses both like every other command and reaches nothing a message from the same caller could not.Registration still requires
SIRENS_ECHO_DISCORD_COMMANDS, so no deployment gains this without opting in.Verification
go test ./...,go vet,policy-check, and the full pre-commit suite pass. Six new tests cover per-server grouping, the unavailable-vs-empty distinction, address absence, truncation, the empty roster, and the declaration itself.I have not exercised it against live Discord — that needs a deployment with commands registered, which is an operator step.
One judgement worth a reviewer
sirens-echo-community/SKILL.mdforbids the model from describing its toolset. This does not contradict that: the reply is deterministic runtime output, not the model describing itself. But it is a deliberate decision that members may now see the tool surface, and ephemeral is what keeps it from becoming a channel artifact. If that read is wrong, the command should be gated harder rather than reworded.🤖 Generated with Claude Code