Part of #5683.
Scope
Implement this in the Rust dataplane repository (contextforge-org/contextforge-data-plane) for MCP 2026-07-28 only.
In a virtual host with multiple upstream MCP backends, an upstream-generated taskId is not sufficient to route later tasks/get, tasks/update, and tasks/cancel requests. The dataplane must expose a stable handle without relying on protocol sessions or an in-memory task-to-backend map.
Work
- Add a versioned, opaque, stateless task-handle codec containing the backend route and original upstream
taskId.
- Keep the encoding reversible by any dataplane replica; do not depend on
Mcp-Session-Id, process memory, or Redis session affinity.
- Reject malformed handles, unsupported handle versions, and backends outside the caller's current virtual-host configuration without leaking backend details.
- Keep the codec usable by both task-creation responses and all
tasks/* lifecycle methods.
- Update the MCP routing semantics documentation.
Acceptance criteria
Out of scope
- Python control-plane task handling.
- Legacy
initialize, MCP sessions, SSE, or MCP 2025-11-25 task compatibility.
- Reintroducing removed
tasks/list or tasks/result methods.
Part of #5683.
Scope
Implement this in the Rust dataplane repository (
contextforge-org/contextforge-data-plane) for MCP2026-07-28only.In a virtual host with multiple upstream MCP backends, an upstream-generated
taskIdis not sufficient to route latertasks/get,tasks/update, andtasks/cancelrequests. The dataplane must expose a stable handle without relying on protocol sessions or an in-memory task-to-backend map.Work
taskId.Mcp-Session-Id, process memory, or Redis session affinity.tasks/*lifecycle methods.Acceptance criteria
Out of scope
initialize, MCP sessions, SSE, or MCP2025-11-25task compatibility.tasks/listortasks/resultmethods.