MCP Capability Discovery And Request Flow
Use this guide when an agent needs to answer a capability question safely:
- what MCPs are available right now
- what MCPs Tandem knows about but has not connected
- what MCPs are uncataloged and therefore need a human decision
- how to ask for a new capability without pretending it already exists
Edition availability: discovery flow stays the same across builds. In OSS builds,
mcp_list_catalogcan still be available, but approval-bound mutation paths such asmcp_request_capabilitymay return explicit premium-feature errors.
This page is intentionally narrow. It is about discovery and request flow, not execution policy.
The Four States
Section titled “The Four States”Treat every MCP as belonging to one of four states:
| State | Meaning | Can execute tools? | What the agent should do |
|---|---|---|---|
| connected + enabled | The server is wired in and usable | Yes, if policy allows | Use the tool path directly |
| connected + disabled | The server exists but is turned off | No | Ask a human to enable it |
| cataloged + not connected | Tandem knows about it but it is not wired in | No | Ask a human to connect it |
| uncataloged | Tandem has no catalog entry for it | No | File a capability request |
Do not merge catalog visibility with execution access. Tandem keeps those separate on purpose.
Discovery Order
Section titled “Discovery Order”Use this order:
- Call
mcp_list. - If you need more context for gap analysis, call
mcp_list_catalog. - If you already know the remote server and need exact tool names, use
GET /mcp/toolsandGET /tool/ids. - If the connector is cataloged but not connected, ask a human to connect it.
- If the connector is uncataloged, call
mcp_request_capability. - Only after the connector is available and authorized should you plan to execute its tools.
If mcp_list does not show the needed server, do not guess. If mcp_list_catalog also does not show it, the request belongs in the approval queue.
What mcp_list_catalog Returns
Section titled “What mcp_list_catalog Returns”The catalog overlay is the agent-facing bridge between “what Tandem knows” and “what Tandem can use right now”.
The response shape includes:
{ "servers": [], "overlay": { "inventory_version": 1, "connected_server_names": [], "enabled_server_names": [], "connected_catalog_server_names": [], "connected_disabled_server_names": [], "cataloged_not_connected_server_names": [], "cataloged_disabled_server_names": [], "uncataloged_connected_servers": [], "status_counts": { "connected_enabled": 0, "connected_disabled": 0, "cataloged_not_connected": 0, "cataloged_disabled": 0, "uncataloged_connected": 0 } }}Use the overlay to separate three questions:
- Can I act on it now?
- Is it known but disconnected?
- Is it unknown and therefore approval-bound?
How To Use mcp_request_capability
Section titled “How To Use mcp_request_capability”mcp_request_capability is the agent-facing way to record a capability gap.
Required fields:
{ "agent_id": "self_operator", "mcp_name": "notion", "rationale": "Need Notion database access to read strategic context for the weekly report"}Optional fields:
catalog_slugrequested_toolscontextexpires_at_ms
The tool does not connect the server and does not execute any remote tool.
It returns an approval object:
{ "ok": true, "approval": { "approval_id": "apr_...", "request_type": "capability_request", "requested_by": { "kind": "agent" }, "target_resource": { "type": "agent", "id": "self_operator" }, "rationale": "...", "context": { "...": "..." }, "status": "pending", "expires_at_ms": 0, "reviewed_by": null, "reviewed_at_ms": null, "review_notes": null }, "requested_by": { "kind": "agent" }}Use that response as the durable proof that the gap was recorded.
How To Reason About A Gap
Section titled “How To Reason About A Gap”When you discover a missing capability, classify it before you act:
{ "state": "connected_enabled | connected_disabled | cataloged_not_connected | uncataloged", "gap": "tool_missing | connector_missing | connector_disabled | unknown", "available_tools": ["..."], "next_action": "use_tool | ask_human_to_connect | ask_human_to_enable | file_capability_request | stop", "approval_needed": true, "reason": "short explanation"}That output should be deterministic enough that the next step is obvious.
What Not To Do
Section titled “What Not To Do”- Do not invent a connector because the task would be easier if it existed.
- Do not call remote MCP tools through
mcp_debugunless you already know the exact URL and tool name. - Do not treat
mcp_listas a catalog search endpoint. - Do not self-connect a new MCP.
- Do not self-grant execution access to an MCP that is visible in the catalog but not enabled.
- Do not continue into automation authoring if the capability you need is still approval-bound.