Carved out of #96 so the first slice of MCP transport work has a clean, reviewable home.
The MCP host currently supports stdio only (mcp_host.py / mcp_runtime.py, exposed through --mcp-host-target + --mcp-runtime-config since #145). This issue adds Streamable HTTP transport alongside it.
Scope
- Config (
mcp_runtime.py): accept transport: streamable_http on a server entry, with url and optional headers. Validate it the same way stdio entries are validated today.
- Host (
mcp_host.py): dispatch on server_config.transport to a _connect_streamable_http_server(...) alongside the existing _connect_stdio_server(...). Raise a clear AdapterError for unsupported transports and when the optional MCP SDK doesn't expose the client.
- Behavior parity:
stdio stays the default and its behavior is unchanged. HTTP runs must produce the same canonical trace shape (mcp_servers, mcp_tool_calls, mcp_events — mcp_connection_initialized → mcp_tools_discovered → mcp_tool_result → mcp_connection_closed).
- Tests: focused transport-level coverage that doesn't require a live network service (fake/loopback in the spirit of
tests/fixtures/mcp_servers/).
- Docs: extend the "MCP host adapter" section of
docs/adapters.md with a runtime-config example.
- CHANGELOG:
[Unreleased] entry (new user-visible config surface).
Out of scope (stays in #96)
OAuth / authenticated transports, SSE, MCP resources, prompts, sampling, default-deny roots.
Notes
An unauthenticated MVP is the right first step — auth lands in a follow-up so the transport plumbing can be reviewed on its own.
Assigned to @Flames4fun, who built the stdio host runtime (#107) and the CLI wiring (#145).
Carved out of #96 so the first slice of MCP transport work has a clean, reviewable home.
The MCP host currently supports stdio only (
mcp_host.py/mcp_runtime.py, exposed through--mcp-host-target+--mcp-runtime-configsince #145). This issue adds Streamable HTTP transport alongside it.Scope
mcp_runtime.py): accepttransport: streamable_httpon a server entry, withurland optionalheaders. Validate it the same waystdioentries are validated today.mcp_host.py): dispatch onserver_config.transportto a_connect_streamable_http_server(...)alongside the existing_connect_stdio_server(...). Raise a clearAdapterErrorfor unsupported transports and when the optional MCP SDK doesn't expose the client.stdiostays the default and its behavior is unchanged. HTTP runs must produce the same canonical trace shape (mcp_servers,mcp_tool_calls,mcp_events—mcp_connection_initialized→mcp_tools_discovered→mcp_tool_result→mcp_connection_closed).tests/fixtures/mcp_servers/).docs/adapters.mdwith a runtime-config example.[Unreleased]entry (new user-visible config surface).Out of scope (stays in #96)
OAuth / authenticated transports, SSE, MCP resources, prompts, sampling, default-deny roots.
Notes
An unauthenticated MVP is the right first step — auth lands in a follow-up so the transport plumbing can be reviewed on its own.
Assigned to @Flames4fun, who built the stdio host runtime (#107) and the CLI wiring (#145).