Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test_core.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jobs:

- name: Run official MCP 2025 client conformance
run: >
npx -y @modelcontextprotocol/conformance@0.2.0-alpha.7 client
npx -y @modelcontextprotocol/conformance@0.2.0-alpha.8 client
--command "dart run test/conformance/mcp_2026_07_28_rc_client.dart"
--suite all
--spec-version 2025-11-25
Expand Down
22 changes: 11 additions & 11 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,22 @@

### Conformance and interoperability

- Documented that published TypeScript SDK `2.0.0-alpha.3` packages are not yet
valid replacements for the `pkg.pr.new` 2026-07-28 RC interop fixture because
the alpha.3 client is missing the preview negotiation API used by the fixture.
- Re-pinned the TypeScript SDK 2026-07-28 RC interop fixture from `pkg.pr.new`
previews to published `@modelcontextprotocol/client@2.0.0-beta.1` and
`@modelcontextprotocol/server@2.0.0-beta.1` packages after verifying both
Dart -> TypeScript and TypeScript -> Dart 2026 draft/RC paths.
- Updated official conformance gates to
`@modelcontextprotocol/conformance@0.2.0-alpha.7`. The 2026-07-28 RC server suite
now has no expected failures; the 2026 client suite keeps only the upstream
`@modelcontextprotocol/conformance@0.2.0-alpha.8`, adding the new stateless
diagnostic probes for missing client capabilities, response-stream shape, and
request-scoped logging. The 2026-07-28 RC server suite now has no expected
failures; the 2026 client suite keeps only the upstream
`json-schema-ref-no-deref` fixture gap expected.
- Added a dedicated CI workflow for the TypeScript SDK 2026-07-28 RC preview
- Added a dedicated CI workflow for the TypeScript SDK 2026-07-28 RC beta
interop fixture on relevant PRs, `dev/2026-07-28-rc` pushes, daily schedule,
and manual dispatch.
- Added an MCP 2026-07-28 draft/RC spec coverage matrix that maps the opt-in
profile to official conformance, local tests, and TypeScript preview interop.
- Re-pinned the TypeScript SDK 2026-07-28 RC interop fixture to
`pkg.pr.new` previews from the merged `v2-2026-07-28` branch head for both
client and server packages.
- Switched the reverse Dart preview client -> TypeScript preview server fixture
profile to official conformance, local tests, and TypeScript SDK beta interop.
- Switched the reverse Dart 2026 client -> TypeScript SDK beta server fixture
to the TypeScript SDK's 2026 HTTP handler entry, making `server/discover`,
`tools/list`, and `tools/call` strict interop checks instead of diagnostic
skips.
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ for opt-in behavior, fallback rules, and draft-only APIs.

- 🧪 **[SDK Interoperability Matrix](https://github.com/leehack/mcp_dart/blob/dev/2026-07-28-rc/doc/interoperability.md)** - Verified Dart/TypeScript and documented cross-SDK scenarios
- ✅ **[MCP 2025-11-25 Spec Coverage Matrix](https://github.com/leehack/mcp_dart/blob/dev/2026-07-28-rc/doc/spec-coverage-2025-11-25.md)** - Auditable coverage map with CLI conformance cases and known gaps
- 🧪 **[MCP 2026-07-28 Draft/RC Spec Coverage Matrix](https://github.com/leehack/mcp_dart/blob/dev/2026-07-28-rc/doc/spec-coverage-2026-07-28-rc.md)** - Opt-in draft/RC coverage map across official conformance and TypeScript preview interop
- 🧪 **[MCP 2026-07-28 Draft/RC Spec Coverage Matrix](https://github.com/leehack/mcp_dart/blob/dev/2026-07-28-rc/doc/spec-coverage-2026-07-28-rc.md)** - Opt-in draft/RC coverage map across official conformance and TypeScript SDK beta interop
- 🧭 **[MCP 2026-07-28 Draft/RC Transition Guide](https://github.com/leehack/mcp_dart/blob/dev/2026-07-28-rc/doc/mcp-2026-07-28-rc.md)** - Opt-in profile, fallback behavior, and draft-only APIs
- 🔒 **[Transport Security Recipes](https://github.com/leehack/mcp_dart/blob/dev/2026-07-28-rc/doc/transports.md#dns-rebinding-protection)** - Host/Origin allowlists, OAuth layering, and compatibility-toggle trade-offs
- 📱 **[Flutter Recipes](https://github.com/leehack/mcp_dart/blob/dev/2026-07-28-rc/doc/flutter-recipes.md)** - Flutter Web, mobile, and desktop host/client guidance
Expand Down
33 changes: 13 additions & 20 deletions doc/interoperability.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ For MCP 2026-07-28 draft/RC coverage, see the
| Dart client -> TypeScript SDK server | Streamable HTTP | `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. |
| TypeScript SDK client -> Dart server | stdio | `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. |
| TypeScript SDK client -> Dart server | Streamable HTTP | `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. |
| TypeScript SDK preview client -> Dart server | Streamable HTTP | `2026-07-28` draft/RC | [`test/interop/ts_2026_07_28_rc/`](../test/interop/ts_2026_07_28_rc/), [`tool/testing/run_ts_2026_07_28_rc_interop.dart`](../tool/testing/run_ts_2026_07_28_rc_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml) | Automated preview check | Uses pinned `pkg.pr.new` previews from the TypeScript SDK `v2-2026-07-28` branch head. Covers modern negotiation, cache metadata, `tools/list`, `tools/call`, `x-mcp-header` mirroring, raw header and unsupported-version rejection, removed core RPC rejection, progress notifications, `subscriptions/listen`, and HTTP SSE cancellation against the Dart 2026-07-28 RC conformance server. |
| Dart preview client -> TypeScript SDK preview server | Streamable HTTP | `2026-07-28` draft/RC | [`test/interop/ts_2026_07_28_rc/src/server.mjs`](../test/interop/ts_2026_07_28_rc/src/server.mjs), [`tool/testing/run_ts_2026_07_28_rc_interop.dart`](../tool/testing/run_ts_2026_07_28_rc_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml) | Automated preview check | Uses the pinned TypeScript SDK server preview through its `createMcpHandler` entry and covers `server/discover` negotiation, `tools/list`, and `tools/call`. |
| TypeScript SDK beta client -> Dart server | Streamable HTTP | `2026-07-28` draft/RC | [`test/interop/ts_2026_07_28_rc/`](../test/interop/ts_2026_07_28_rc/), [`tool/testing/run_ts_2026_07_28_rc_interop.dart`](../tool/testing/run_ts_2026_07_28_rc_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml) | Automated 2026 check | Uses published `@modelcontextprotocol/client@2.0.0-beta.1` and `@modelcontextprotocol/server@2.0.0-beta.1` packages. Covers modern negotiation, cache metadata, `tools/list`, `tools/call`, `x-mcp-header` mirroring, raw header and unsupported-version rejection, removed core RPC rejection, progress notifications, `subscriptions/listen`, and HTTP SSE cancellation against the Dart 2026-07-28 RC conformance server. |
| Dart 2026 client -> TypeScript SDK beta server | Streamable HTTP | `2026-07-28` draft/RC | [`test/interop/ts_2026_07_28_rc/src/server.mjs`](../test/interop/ts_2026_07_28_rc/src/server.mjs), [`tool/testing/run_ts_2026_07_28_rc_interop.dart`](../tool/testing/run_ts_2026_07_28_rc_interop.dart), [`interop_2026_07_28.yml`](../.github/workflows/interop_2026_07_28.yml) | Automated 2026 check | Uses the published TypeScript SDK beta server through its `createMcpHandler` entry and covers `server/discover` negotiation, `tools/list`, and `tools/call`. |
| 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, but this repo does not yet include an automated Python SDK fixture. |
| Flutter/Web client -> Dart server | Streamable HTTP | `2026-07-28` draft/RC preview with stable fallback | [`example/flutter_http_client/`](../example/flutter_http_client/), [`doc/flutter-recipes.md`](flutter-recipes.md) | Documented recipe | Flutter Web cannot spawn stdio servers; use Streamable HTTP or another browser-safe transport. The example opts into preview negotiation while retaining stable fallback. |
| MCP Apps host/client metadata | stdio or Streamable HTTP | `2026-07-28` draft/RC preview 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. |
Expand All @@ -46,8 +46,8 @@ dart test --tags interop

If the compiled fixtures are missing, local test runs skip the interop groups; CI should fail when required fixtures are unavailable.

The TypeScript 2026-07-28 RC fixture uses unreleased `pkg.pr.new` previews from
the TypeScript SDK `v2-2026-07-28` branch:
The TypeScript 2026-07-28 RC fixture uses the published TypeScript SDK beta
packages:

```bash
# From repository root
Expand All @@ -57,17 +57,15 @@ cd ../../..
dart run tool/testing/run_ts_2026_07_28_rc_interop.dart
```

This starts the Dart 2026-07-28 RC conformance server, runs the pinned TypeScript SDK
preview client against it, then runs the reverse Dart preview client smoke check
against the TypeScript preview server.
This starts the Dart 2026-07-28 RC conformance server, runs the pinned TypeScript
SDK beta client against it, then runs the reverse Dart 2026 client smoke check
against the TypeScript SDK beta server.

Published `@modelcontextprotocol/client@2.0.0-alpha.3` and
`@modelcontextprotocol/server@2.0.0-alpha.3` packages are not yet suitable
replacements for this fixture: the published alpha.3 client does not expose the
preview `versionNegotiation` / `getProtocolEra` APIs used here, and a direct
`supportedProtocolVersions: ["2026-07-28"]` repin fails the handshake. Keep the
`pkg.pr.new` pin until a published TypeScript SDK package exposes the 2026 draft
path and this interop runner passes against it.
The fixture previously depended on `pkg.pr.new` artifacts because published
`2.0.0-alpha.3` packages did not expose the preview negotiation API used here.
`@modelcontextprotocol/client@2.0.0-beta.1` and
`@modelcontextprotocol/server@2.0.0-beta.1` expose the required modern path and
the interop runner passes against them.

CI also runs this fixture in the dedicated
`Run MCP 2026-07-28 TypeScript Interop` workflow for relevant PRs,
Expand Down Expand Up @@ -96,12 +94,7 @@ When adding a new interoperability claim:
## Known gaps worth tracking

- Automated Python SDK fixture coverage.
- Re-pin the TypeScript 2026-07-28 RC interop fixture to a published upstream
alpha package once that package exposes the 2026 draft path. The published
`@modelcontextprotocol/client/server@2.0.0-alpha.3` packages are not enough
because the client is missing the preview negotiation API used by this
fixture.
- Broader reverse-path TypeScript preview server coverage beyond discovery,
- Broader reverse-path TypeScript SDK beta server coverage beyond discovery,
`tools/list`, and `tools/call`.
- Host-specific MCP Apps rendering compatibility notes.
- More OAuth-protected remote server scenarios beyond the checked-in examples.
Expand Down
15 changes: 7 additions & 8 deletions doc/mcp-2026-07-28-rc.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ Before creating follow-up dev tags from `dev/2026-07-28-rc`, run:
```sh
dart analyze
dart run test/conformance/run_2025_server_conformance.dart
npx -y @modelcontextprotocol/conformance@0.2.0-alpha.7 client \
npx -y @modelcontextprotocol/conformance@0.2.0-alpha.8 client \
--command "dart run test/conformance/mcp_2026_07_28_rc_client.dart" \
--suite all \
--spec-version 2025-11-25
Expand All @@ -147,21 +147,20 @@ dart run tool/validate_cli_publish.dart
```

The `run_2026_07_28_rc_server_conformance.dart` gate runs the full
`@modelcontextprotocol/conformance@0.2.0-alpha.7` server scenario list for
`@modelcontextprotocol/conformance@0.2.0-alpha.8` server scenario list for
`--spec-version 2026-07-28`, including the stable-style tool, resource, prompt,
completion, and JSON Schema scenarios that the alpha package tags for the RC.

For cross-SDK smoke coverage against the TypeScript SDK 2026 preview packages,
For cross-SDK smoke coverage against the TypeScript SDK 2026 beta packages,
run the fixture documented in
[`doc/interoperability.md`](interoperability.md#running-interop-checks-locally).
CI also runs it in the dedicated `Run MCP 2026-07-28 TypeScript Interop`
workflow on relevant PRs, `dev/2026-07-28-rc` pushes, a daily schedule, and
manual dispatch. Keep it pinned to the draft behavior rather than TypeScript
preview behavior alone; re-pin from `pkg.pr.new` to a published TypeScript SDK
alpha only when the published package advertises `2026-07-28` support. The
published `@modelcontextprotocol/client/server@2.0.0-alpha.3` packages are
missing the preview negotiation API used by this fixture, so they are not a
replacement for the current preview pin.
preview behavior alone. The fixture is currently pinned to published
`@modelcontextprotocol/client@2.0.0-beta.1` and
`@modelcontextprotocol/server@2.0.0-beta.1`, which expose the 2026 negotiation
path and pass the checked-in interop runner.

For dev packages, keep package documentation links pointed at
`dev/2026-07-28-rc` until the draft work is ready to merge back to `main`.
Expand Down
Loading