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
Copy file name to clipboardExpand all lines: doc/interoperability.md
+36-19Lines changed: 36 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -26,11 +26,11 @@ For MCP 2026-07-28 coverage, see the
26
26
| Dart client -> TypeScript SDK server | Streamable HTTP | MCP 2025-11-25 |[`test/interop/dart_client_with_ts_server_test.dart`](../test/interop/dart_client_with_ts_server_test.dart), [`test/interop/ts/`](../test/interop/ts/)| Verified | Covers tool calls and stale preconfigured session-id recovery. |
27
27
| TypeScript SDK client -> Dart server | stdio | MCP 2025-11-25 |[`test/interop/ts_client_with_dart_server_test.dart`](../test/interop/ts_client_with_dart_server_test.dart), [`test/interop/test_dart_server.dart`](../test/interop/test_dart_server.dart)| Verified | Runs the compiled TypeScript client fixture against a Dart server process and checks that an official TS client can list tools immediately after the lifecycle handshake. |
28
28
| TypeScript SDK client -> Dart server | Streamable HTTP | MCP 2025-11-25 |[`test/interop/ts_client_with_dart_server_test.dart`](../test/interop/ts_client_with_dart_server_test.dart), [`test/interop/test_dart_server.dart`](../test/interop/test_dart_server.dart)| Verified | Includes official TS Streamable HTTP client lifecycle coverage, pre-`initialized` operation rejection, GET SSE streams, and `Last-Event-ID` replay behavior. |
29
-
| TypeScript SDK beta client -> Dart server | Streamable HTTP | MCP 2026-07-28 |[`test/interop/ts_2026_07_28/`](../test/interop/ts_2026_07_28/), [`tool/testing/run_ts_2026_07_28_interop.dart`](../tool/testing/run_ts_2026_07_28_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml)|Verified | Uses published `@modelcontextprotocol/client@2.0.0-beta.4`and `@modelcontextprotocol/server@2.0.0-beta.4` packages. Covers modern negotiation, cache metadata, `tools/list`, `tools/call`, routing-header validation and retry, removed core RPC rejection, progress, `subscriptions/listen`, `AbortController` response-stream cancellation observed by the Dart server, and follow-up recovery. |
30
-
| Dart MCP 2026-07-28 client -> TypeScript SDK beta server | Streamable HTTP | MCP 2026-07-28 |[`test/interop/ts_2026_07_28/src/server.mjs`](../test/interop/ts_2026_07_28/src/server.mjs), [`tool/testing/run_ts_2026_07_28_interop.dart`](../tool/testing/run_ts_2026_07_28_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml)| Verified | Uses the published TypeScript SDK beta server through its `createMcpHandler` entry and covers `server/discover` negotiation, `tools/list`, `tools/call`, one-time `HeaderMismatch` metadata refresh and retry, an MCP 2026-07-28 `input_required` elicitation retry, request-stream cancellation observed through the server's Web Request `AbortSignal`, and post-cancellation recovery. |
29
+
| TypeScript SDK beta client -> Dart server | Streamable HTTP | MCP 2026-07-28 |[`test/interop/ts_2026_07_28/`](../test/interop/ts_2026_07_28/), [`tool/testing/run_ts_2026_07_28_interop.dart`](../tool/testing/run_ts_2026_07_28_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml)|Known published-beta gap | Published `@modelcontextprotocol/client@2.0.0-beta.4`predates spec PR #3002 and rejects discovery without obsolete body `serverInfo`. CI asserts the exact negotiation failure as temporary expected drift; a TypeScript SDK PR #2513 preview validates the final result metadata identity shape. |
30
+
| Dart MCP 2026-07-28 client -> TypeScript SDK beta server | Streamable HTTP | MCP 2026-07-28 |[`test/interop/ts_2026_07_28/src/server.mjs`](../test/interop/ts_2026_07_28/src/server.mjs), [`tool/testing/run_ts_2026_07_28_interop.dart`](../tool/testing/run_ts_2026_07_28_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml)| Verified | Uses the published TypeScript SDK beta server through its `createMcpHandler` entry and a temporary read-only fallback for legacy body `serverInfo`; covers `server/discover`, `tools/list`, `tools/call`, one-time `HeaderMismatch` metadata refresh and retry, MCP 2026-07-28 `input_required`, request-stream cancellation, and post-cancellation recovery. |
31
31
| Dart client -> Python MCP server | stdio | Server-dependent |[`doc/transports.md`](transports.md#connect-to-python-server)| Documented recipe | The transport can spawn Python servers over stdio; the stable recipe remains separate from the MCP 2026-07-28 beta fixture. |
32
-
| Python SDK beta client -> Dart server | Streamable HTTP | MCP 2026-07-28 |[`test/interop/python_2026_07_28/`](../test/interop/python_2026_07_28/), [`tool/testing/run_python_2026_07_28_interop.dart`](../tool/testing/run_python_2026_07_28_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml)|Verified | Uses official Python SDK `mcp==2.0.0b1`and covers automatic `server/discover` negotiation, `tools/list`, and `tools/call` against the Dart conformance server. |
33
-
| Dart MCP 2026-07-28 client -> Python SDK beta server | Streamable HTTP | MCP 2026-07-28 |[`test/interop/python_2026_07_28/server.py`](../test/interop/python_2026_07_28/server.py), [`tool/testing/run_python_2026_07_28_interop.dart`](../tool/testing/run_python_2026_07_28_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml)| Verified | Uses the official Python SDK beta MCP server and covers discovery, protocol selection, `tools/list`, and `tools/call`. |
32
+
| Python SDK beta client -> Dart server | Streamable HTTP | MCP 2026-07-28 |[`test/interop/python_2026_07_28/`](../test/interop/python_2026_07_28/), [`tool/testing/run_python_2026_07_28_interop.dart`](../tool/testing/run_python_2026_07_28_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml)|Known published-beta gap | Published `mcp==2.0.0b2` predates spec PR #3002and falls back to MCP 2025-11-25 when canonical discovery omits obsolete body `serverInfo`. CI asserts that exact fallback as temporary expected drift. |
33
+
| Dart MCP 2026-07-28 client -> Python SDK beta server | Streamable HTTP | MCP 2026-07-28 |[`test/interop/python_2026_07_28/server.py`](../test/interop/python_2026_07_28/server.py), [`tool/testing/run_python_2026_07_28_interop.dart`](../tool/testing/run_python_2026_07_28_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml)| Verified | Uses the official Python SDK beta server through the temporary read-only fallback for legacy body `serverInfo`; covers discovery, protocol selection, `tools/list`, and `tools/call`. |
34
34
| Dart browser client -> Dart server | Streamable HTTP | MCP 2025-11-25 and MCP 2026-07-28 |[`test/browser/mcp_2026_07_28_streamable_http_test.dart`](../test/browser/mcp_2026_07_28_streamable_http_test.dart), [`tool/testing/run_browser_2026_07_28_interop.dart`](../tool/testing/run_browser_2026_07_28_interop.dart)| Verified | A real Chrome client completes 12 tool-list requests and 12 tool calls in each profile over cross-origin Streamable HTTP. It also proves MCP 2026-07-28 request-stream cancellation and recovery. The MCP 2025-11-25 case waits for response-stream reconnect timers and guards against browser connection-slot exhaustion. |
35
35
| Flutter Web example -> Dart server | Streamable HTTP | MCP 2026-07-28 |[`example/flutter_http_client/test/browser_e2e_test.dart`](../example/flutter_http_client/test/browser_e2e_test.dart), [`tool/testing/run_flutter_web_example_e2e.dart`](../tool/testing/run_flutter_web_example_e2e.dart), [`test_core.yml`](../.github/workflows/test_core.yml)| Verified | The example's real service layer runs in Chrome and completes connection, 12 tool-list requests, 12 tool calls, expected RPC-error recovery, reconnect, a post-reconnect request, and disconnect. Deterministic widget tests cover the UI separately. Flutter Web cannot spawn stdio servers. |
36
36
| MCP Apps host/client metadata | stdio or Streamable HTTP | MCP 2026-07-28 plus `io.modelcontextprotocol/ui` extension |[`doc/mcp-apps.md`](mcp-apps.md), [`example/mcp_apps_helpers_server.dart`](../example/mcp_apps_helpers_server.dart), [`test/types/mcp_ui_test.dart`](../test/types/mcp_ui_test.dart), [`test/server/mcp_ui_test.dart`](../test/server/mcp_ui_test.dart)| Verified | Verified coverage is limited to SDK metadata helpers, serialization, and checked-in examples; host rendering behavior varies by host, so verify UI metadata against your target host. |
@@ -60,35 +60,50 @@ packages:
60
60
cd test/interop/ts_2026_07_28
61
61
npm ci
62
62
cd ../../..
63
-
dart run tool/testing/run_ts_2026_07_28_interop.dart
63
+
dart run tool/testing/run_ts_2026_07_28_interop.dart \
64
+
--direction=dart-to-ts
64
65
```
65
66
66
-
This starts the Dart MCP 2026-07-28 conformance server, runs the pinned TypeScript
67
-
SDK beta client against it, then runs the reverse Dart MCP 2026-07-28 client smoke check
68
-
against the TypeScript SDK beta server.
67
+
That direction verifies the compatible Dart client -> published TypeScript beta
68
+
server path. The published beta.4 client still expects obsolete body
69
+
`serverInfo`; CI keeps that reverse direction visible without weakening Dart's
70
+
wire output by asserting the specific pre-#3002 negotiation failure:
69
71
70
-
`@modelcontextprotocol/client@2.0.0-beta.4` and
71
-
`@modelcontextprotocol/server@2.0.0-beta.4` expose the required modern path and
72
-
pass in both directions. The reverse path includes an `input_required`
73
-
elicitation retry, bidirectional request-stream cancellation observed by each
74
-
server, and successful post-cancellation tool calls in addition to discovery
75
-
and normal tool calls.
72
+
```bash
73
+
dart run tool/testing/run_ts_2026_07_28_interop.dart \
74
+
--direction=ts-to-dart \
75
+
--expect-published-ts-client-gap
76
+
```
77
+
78
+
An unexpected pass or a different failure is an error, so the workaround cannot
79
+
silently become stale. To validate a TypeScript SDK #2513 preview installation,
80
+
run the same `ts-to-dart` direction without the expected-gap flag.
81
+
82
+
The Dart-client path includes an `input_required` elicitation retry,
83
+
request-stream cancellation observed by the TypeScript server, and successful
84
+
post-cancellation tool calls in addition to discovery and normal tool calls.
0 commit comments