feat(mcp): HTTP/remote MCP server support (closes #96)#210
Merged
Conversation
Add first-class HTTP/remote MCP server support across the config, runtime
contract, and agent lockdown layers.
## Changes
### Config types
- `protocol::ProjectMcpServerEntry`: add `transport` (Option<String>) and
`url` (Option<String>) fields; `command` now has `#[serde(default)]`
so HTTP-only servers don't need an empty command string.
- `orchestrator_config::McpServerDefinition`: same additions.
### Validation
- `transport` must be "stdio" or "http" when set.
- `transport = "http"` requires a non-empty `url`.
- `transport = "stdio"` (or absent) continues to require a non-empty `command`.
### Runtime contract injection
- All three injection sites (`inject_project_mcp_servers`,
`inject_workflow_mcp_servers`, `inject_named_mcp_servers`) now forward
`transport` and `url` into the `additional_servers` JSON passed to agent
runners.
### Agent lockdown (agent-runner)
- `AdditionalMcpServer` gains a `url: Option<String>` field.
- Parsing in `resolve_mcp_tool_enforcement` reads `url`; filters allow
servers with a URL even if `command` is empty.
- Claude, Codex, Gemini, and OpenCode lockdown functions each emit the
correct vendor-native HTTP config when `url` is set:
- Claude: `{ "type": "http", "url": "..." }`
- Codex: `mcp_servers.<name>.url = "..."`
- Gemini: `{ "type": "http", "url": "..." }`
- OpenCode: `{ "type": "remote", "url": "...", "enabled": true }`
- `apply_oai_runner_native_mcp_lockdown` now emits an HTTP entry
(`[{ "url": "...", "transport": "http" }]`) instead of a no-op return.
### OAI runner
- `McpServerConfig` adds `url` and `transport` fields.
- `connect()` branches on HTTP when `url` is set or `transport = "http"`,
using `rmcp::StreamableHttpClientTransport`.
- Enable `transport-streamable-http-client-reqwest` rmcp feature.
- Upgrade `reqwest` from 0.12 to 0.13 to match rmcp's internal reqwest.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This was referenced Apr 1, 2026
Closed
Merged
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Closed
Shooksie
added a commit
that referenced
this pull request
Apr 8, 2026
feat(mcp): HTTP/remote MCP server support — closes #96 Adds transport+url fields to MCP server config, HTTP validation, runtime contract injection for all agents (Claude, Codex, Gemini, OpenCode), and oai-runner StreamableHttpClientTransport. reqwest 0.12→0.13. Dispatched by ao-product conductor sweep #16, implemented by implement-rust workflow.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
transport+urlfields added toMcpServerDefinition(workflow YAML) andProjectMcpServerEntry(.ao/config.json).commandnow has#[serde(default)]so HTTP-only servers can omit it.transportrestricted to"stdio"|"http";"http"requiresurl;"stdio"(or absent) requirescommand.inject_project_mcp_servers,inject_workflow_mcp_servers,inject_named_mcp_servers) forwardtransport+urlinto theadditional_serversJSON.urlnow emit the correct vendor-native HTTP config instead of being silently dropped.McpServerConfigacceptsurl/transport;connect()usesrmcp::StreamableHttpClientTransportfor HTTP; reqwest upgraded 0.12 → 0.13 to match rmcp.Example workflow YAML (now works)
Test plan
cargo ao-fmt— cleancargo ao-lint— cleancargo test -p agent-runner— 113/113 passcargo test -p oai-runner— passcargo test -p protocol— passorchestrator-configandworkflow-runner-v2confirmed unchanged onmain🤖 Generated with Claude Code