Expand description
MuxAPI handlers for the v1 standalone MCP Server primitive. mcp.list / mcp.get / mcp.upsert / mcp.delete / mcp.bind / mcp.unbind
Plus the Connectors-level catalog (mcp.catalog.): global servers only,
window-scoped — no agent_id, no check_s1 (mirrors bundle. auth
shape, since Connectors has no agent connection context to gate on).
db_mcp_servers is authoritatively identity_store as of Phase 2 of
SPEC_DURABLE_BINDINGS_2026_09_10.md (§5.1/§5.4) — see skill.rs’s
module doc comment for the full catalog/mstore split; this file
mirrors it exactly for MCP servers.
Functions§
- observed_
agents 🔒 - observed_
source 🔒 - Where an observed server comes from: AgentMux’s own sources by name
(its
agentmuxserver, a catalog server), else what the CLI said. - register
- register_
mcp_ 🔒bind - register_
mcp_ 🔒catalog_ bind - register_
mcp_ 🔒catalog_ delete - register_
mcp_ 🔒catalog_ list - register_
mcp_ 🔒catalog_ list_ for_ agent - Catalog-tier sibling of
mcp.list(above) — GLOBAL SERVERS ONLY, each annotated withbound_to_agentfor the caller-suppliedagent_id, nocheck_s1. AgentStashModal’s MCP Servers tab (the per-agent Stash view) runs over the dashboard’s connection, which is never agent-authenticated, somcp.list’s gate can never be satisfied from that caller — the exact same reasoning asmcp.catalog.bindabove. Deliberately does NOT reusemcp.list’s full computation (global + this agent’s own private servers): with nocheck_s1,agent_idis unverified, and a private server’sconfigcan carry secrets — returning it for an arbitrary caller-chosenagent_idwould be an IDOR into every agent’s private MCP config. SeeStore::mcp_server_list_global_for_agent’s doc comment and docs/reports/REPORT_ARMORY_ARCHITECTURE_AND_NAMING_REVIEW_2026_07_23.md §2.2. - register_
mcp_ 🔒catalog_ probe - Health/prerequisite probe for a global catalog server, callable without
an agent context (mirrors mcp.catalog.*’s window-scoped, no-
check_s1shape) — this is what lets Connectors → MCP servers show a connected/error status per row before any agent has bound the server. See SPEC_MCP_INTEGRATION_PARITY_ABLETON_PILOT_2026_07_08.md §4.4. - register_
mcp_ 🔒catalog_ set_ reach - Who a global catalog server reaches beyond its binds (every agent,
container agents too). Global rows only, like the rest of
mcp.catalog.*. The switches live in the identity store beside the catalog, so they survive an upgrade (SPEC_CONNECTORS_MCP_WHAT_AGENTS_RUN_2026_10_10.md §2.1). - register_
mcp_ 🔒catalog_ unbind - Catalog-tier sibling of
mcp.unbind(above) — same DB write, nocheck_s1. Restricted to global rows only, matching the guardregister_mcp_catalog_bind/register_mcp_catalog_deletealready apply in this file: any window connection can sever any agent’s binding to a global server (an intentional, pre-existing trust boundary — bind and delete already have the same or larger blast radius), but a private row’s own binding must not be touchable via this no-check_s1surface, even thoughmcp_idis never exposed by any no-check_s1command today — defense in depth over relying solely on UUID secrecy. reagentx P1 on PR #2329 (round 2). - register_
mcp_ 🔒catalog_ upsert - register_
mcp_ 🔒delete - register_
mcp_ 🔒get - register_
mcp_ 🔒list - register_
mcp_ 🔒observed_ list - The MCP servers each running agent’s CLI reports having
(
backend::mcp_observed), with AgentMux’s own sources named:builtinfor theagentmuxserver,catalogfor a catalog server of that name. Names and statuses only; a pane that no longer exists is dropped. - register_
mcp_ 🔒probe - Health/prerequisite probe for one of this agent’s own or bound-global
servers (SPEC_MCP_INTEGRATION_PARITY_ABLETON_PILOT_2026_07_08.md §4.4).
Opens a short-lived MCP connection and reports whether the server
actually speaks the protocol — distinct from
mcp.upsert’s “is this valid JSON” check, which tells you nothing about reachability. - register_
mcp_ 🔒unbind - register_
mcp_ 🔒upsert