Migrate existing integrations to MCP 2026-07-28
Audience: teams upgrading an existing /mcp or /mcp/proxy integration. These are breaking changes on Talon main; check the latest release before assuming a tagged binary includes them.
What changed
| Old assumption | Supported contract now |
|---|---|
initialize / initialized negotiation and older MCP versions | Only 2026-07-28; server/discover replaces initialization and every request carries protocol metadata |
| Former MCP transport-session header, GET/DELETE lifecycle or stream resumption | Removed and not supported. Optional X-Talon-Session-ID is application correlation only, never MCP protocol state |
Header-free tools/call | MCP-Protocol-Version, Mcp-Method, Mcp-Name (for calls) and matching request-body _meta are required |
Historical non-enforcing gateway/MCP/native runtime postures (removed in #442): shadow, log_only, passthrough, audit.observation_only | Active rules always enforce. Use talon doctor, talon validate and native talon run --dry-run before live rollout |
Parse error.data.talon_code as a durable policy contract | Use versioned io.dativo.talon/governance extension; the flat alias is deprecated for one release |
| Treat all JSON-RPC errors as policy denials | Protocol failures have MCP-native codes and no governance extension or signed policy evidence |
Upgrade checklist
- Upgrade the MCP client SDK. Require a client that implements the
2026-07-28wire. An oldinitializerequest cannot be rescued with configuration. Confirmserver/discoverandtools/listwork first. - Remove obsolete configuration (migration from #442). Delete
gateway.mode, MCPproxy.mode, agentaudit.observation_only,tool_policies.*.schema_validationand oldtalon serve --gateway-modeortalon enforceautomation. Removed keys are rejected at load; there is no silent compatibility path. - Start with safe, deliberately permissive active policy, then tighten one rule at a time in staging. A real denial causes zero upstream dispatch. Use
talon doctorandtalon validatebefore sending requests. - Send the new protocol headers and metadata on every request.
Mcp-Methodmust match the JSON-RPC method;Mcp-Namemust matchparams.namefortools/call. Header-annotated parameters (Mcp-Param-*) must agree with arguments where the tool schema declares them. - Consume structured outcomes. An allowed governed call has
result._meta["io.dativo.talon/governance"]; a governance denial or Talon-shaped failure haserror.data["io.dativo.talon/governance"]. Checkdecision, stablecode,retryable,provenanceandevidence.committed; do not treat a bare evidence ID as proof. - Handle unknown effects conservatively.
upstream_outcome_unknownmeans a request may have reached the upstream: do not blindly replay it. Vendor JSON-RPC error messages/data are sanitized in the public envelope; do not depend on the former vendor body. - Keep boundary expectations explicit. MCP tool calls still run through the pre-convergence MCP governance path. The HTTP Action Gateway's bound approval and at-most-once
talon_forwardedexecution are not provided by/mcpor/mcp/proxy; Tasks approval continuation is not advertised.
Example: one current-protocol tool call
curl -X POST http://localhost:8080/mcp/proxy \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'MCP-Protocol-Version: 2026-07-28' \
-H 'Mcp-Method: tools/call' \
-H 'Mcp-Name: zendesk_ticket_search' \
-H 'Authorization: Bearer <agent-key>' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"upgrade-check","version":"1.0"},"io.modelcontextprotocol/clientCapabilities":{}},"name":"zendesk_ticket_search","arguments":{"query":"test"}}}'
The example requires a configured agent key and an upstream tool definition with that name. An unknown tool is a protocol invalid-params error, not a policy-denial receipt. The proxy does not synthesize missing identities.
Verify the contract without provider keys
From a checkout of Talon main:
make test-mcp-smoke
make test-mcp-governance-smoke
The first checks discovery, calls, wire integrity and old-client rejection. The second checks allowed and denied outcomes, signed committed evidence and an ambiguous upstream effect against a built binary and mock. See the MCP governance extension reference, MCP architecture, and limitations.