You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Replace the public MCP configuration with the nested HTTP-only contract, remove the deployment gate and public stdio fields, preserve trusted internal MCP delivery, and keep the shipped documentation and interface inventories in sync.
| model / provider | yes, `model: str`| yes, `Optional[str]`| wired to the runner | Loose string. No `ModelRef`, no provider enum. There is no separate provider field. |
219
219
| tools | yes, strict list | yes, lenient coercion | wired, resolved to builtin names + tool specs | Entries strict, list lenient. |
220
-
| mcp_servers | yes, strict list | yes | wired, resolved to runner mcp servers | Strict per entry. Gated by `AGENTA_AGENT_MCPS_ENABLED` at the service. |
220
+
| mcp_servers | yes, strict list | yes | wired, resolved to runner MCP servers | Strict per entry. Claude supports external HTTP servers; Pi refuses them until its bridge exists. |
221
221
| skills | yes, embed/inline list | yes | wired | Author-settable (`SkillConfig` inline or `@ag.embed` references). The playground build-kit overlay embeds one skill, the `build-an-agent` playbook; the `pi_agenta` harness additionally force-unions `getting-started`. See below. |
222
222
| persona | no | no | wired but forced only | Not a config field. The Agenta harness hardcodes an append-system preamble. See below. |
223
223
| agents_md | yes, `agents_md: str`| yes, as `instructions`| wired to `agentsMd`| The schema names it `agents_md`. The neutral config names it `instructions`. |
@@ -259,13 +259,17 @@ This is what the playground saves and the runtime reads:
Copy file name to clipboardExpand all lines: docs/design/agent-workflows/documentation/tools.md
+23-35Lines changed: 23 additions & 35 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -112,7 +112,7 @@ Resolution is the service's job, but most of it now lives in the SDK. The servic
112
112
entrypoints in `services/oss/src/agent/app.py` (`_agent`): `resolve_tools(agent_config.tools)`
113
113
and `resolve_mcp_servers(agent_config.mcp_servers)`. Both are thin re-exports. The service
114
114
files under `services/oss/src/agent/tools/` are shims:
115
-
`resolver.py` re-exports the SDK's `resolve_tools` and adds the MCP gate; `gateway.py` and
115
+
`resolver.py` re-exports the SDK's `resolve_tools`; `gateway.py` and
116
116
`secrets.py` re-export the SDK platform adapters. The real composition is
117
117
`resolve_tools` in `sdks/python/agenta/sdk/agents/platform/resolve.py`, which builds a
118
118
`ToolResolver` (`sdks/python/agenta/sdk/agents/tools/resolver.py`) wired with two
@@ -162,14 +162,11 @@ invoke immediately instead of failing the model mid-loop, and the agent only eve
162
162
name, a schema, and an opaque slug. The Composio key and the connection's auth never leave the
163
163
service.
164
164
165
-
MCP servers resolve on the same path but only when `AGENTA_AGENT_MCPS_ENABLED` is truthy. The
166
-
gate lives in `resolve_mcp_servers` (`services/oss/src/agent/tools/resolver.py`): when the
167
-
flag is off it returns an empty list before the SDK `MCPResolver` ever runs. When on, the
168
-
`MCPResolver` injects each server's named secrets into its `env`, the same way code tools get
169
-
theirs. By default this is off, so `mcp_servers` is dropped at the service and `mcpServers` is
170
-
omitted from the wire. See the [status](#status-and-known-gaps) section: even with the flag on,
171
-
user MCP reaches Claude only, not the default Pi harness, so the field is a no-op in the common
172
-
case.
165
+
External MCP servers resolve on their own path for every run. The `MCPResolver` reads the nested
166
+
HTTP connection, fetches named header-secret references, and creates a secret-bearing per-run
167
+
server. There is no deployment feature flag. The harness catalog exposes user MCP authoring for
168
+
Claude and hides it for Pi until Pi has a delivery bridge. A direct Pi request carrying an
169
+
external MCP server fails loudly.
173
170
174
171
The whole resolved bundle then rides the `/run` wire: built-in names in `tools`, resolved
175
172
specs in `customTools`, the callback in `toolCallback`, and resolved MCP servers in
@@ -398,24 +395,17 @@ separately, at session start. The extension edits Pi's active tool set at
398
395
every non-builtin tool untouched. A builtin outside the grant list is simply absent from the
399
396
model's active tools, so no call for it ever fires, and the permission hook never sees it.
400
397
401
-
### MCP servers: a server process the daemon launches
402
-
403
-
Execution happens in a separate server process. A declared MCP server is resolved server-side
404
-
(secrets injected into its `env`) and, for MCP-capable harnesses, passed to the ACP daemon as a
405
-
stdio server (`toAcpMcpServers` in `services/agent/src/engines/sandbox_agent/mcp.ts`). The
406
-
daemon launches the server's `command` with the resolved `env`, and the harness talks to it
407
-
over the MCP protocol.
408
-
409
-
In practice user MCP is dead on the default path, and for two reasons that stack. First,
410
-
resolution is gated behind `AGENTA_AGENT_MCPS_ENABLED`, which is off by default, so the servers
411
-
never reach the wire. Second, even with the flag on, `buildSessionMcpServers` drops user MCP
412
-
for Pi (Pi's ACP adapter does not forward them), so it would reach Claude only. Pi and Agenta
413
-
are the default harnesses, so the `mcp_servers` field is accepted and then silently ignored in
414
-
the common case. This is the silent-drop that the
415
-
[harness-capabilities project](../../projects/harness-capabilities/proposal.md) is built to fix
416
-
(fail loud, or deliver MCP on Pi through the extension). The
417
-
[removal-and-capability notes](../../scratch/notes-tools-mcp-capabilities.md) lay out the two
418
-
options.
398
+
### External MCP servers: remote HTTP connections
399
+
400
+
A declared user MCP server contains identity, an HTTP connection, credential references, and
401
+
policy. The service resolves credential references into request headers for the current run. The
402
+
runner validates the remote URL and passes an ACP HTTP MCP entry to Claude. Claude then connects
403
+
directly to the external server and discovers its tools through MCP. Public stdio commands and
404
+
process environments are not part of the author or runner interface.
405
+
406
+
The editor shows this section only when the selected harness publishes `mcp.user_servers`. Claude
407
+
publishes it. Pi does not and rejects external MCP servers until its bridge exists. The private
408
+
`agenta-tools` server remains a separate trusted delivery mechanism for Agenta tools.
419
409
420
410
## Approval and rendering
421
411
@@ -612,7 +602,7 @@ never drift from the files that exist. The canonical playbook format lives in th
612
602
| Platform |`callback` spec + direct `call`| the Agenta service | the exposed endpoint, called directly (no `/tools/call` hop) | caller credential reused; self-targeting ids bound server-side |
613
603
| Code |`code` spec + `env`| the runner | a local subprocess | only the tool's own secrets, scoped to the child |
614
604
| Client |`client` spec | the browser | the user's browser, next turn | none |
615
-
| MCP | resolved server + `env`|a server process | a stdio child the daemon launches | secrets injected into the server env|
605
+
| MCP | resolved HTTP server + headers|the external MCP server | remote URL reached by Claude | named secret references become per-run request headers|
616
606
617
607
## Where this lives
618
608
@@ -626,7 +616,7 @@ never drift from the files that exist. The canonical playbook format lives in th
626
616
| Platform-op catalog (the `op` table + schema/context-binding resolution) |`sdks/python/agenta/sdk/agents/platform/op_catalog.py`|
0 commit comments