Developer tooling
Protocol support, conformance, and troubleshooting
The MCP surfaces target the 2026-07-28 protocol revision through an exactly pinned scoped SDK. They keep a bounded set of compatibility aliases. Continuous integration runs conformance checks.
Verified against s-m-r-t 0.42.4
One protocol revision, one pinned SDK
Both MCP packages depend on @modelcontextprotocol/server at exactly 2.0.0, with no range. That SDK owns and enforces the 2026-07-28 revision. The framework does not declare the revision as a constant. The exact pin provides one known source for the protocol envelope, header validation, and error codes.
- The application HTTP mount serves the 2026-07-28 envelope, always reports tools, and advertises the optional tasks extension only when configured.
- Client-side pins in the framework test suites request the same revision explicitly.
- The scoped client and node packages are pinned to 2.0.0 as well.
What conformance covers
Continuous integration runs a generated server against the pinned conformance suite. Every pull request also runs a protocol hygiene check. The suite tests version negotiation against the pinned revision and rejects unsupported client revisions.
- Conformance tooling is pinned exactly, like the SDK itself.
- Header validation and the mismatch error are covered by transport tests.
- Deterministic tool ordering is part of the expected discovery output.
Compatibility that is deliberate and bounded
A small number of older shapes remain available so applications can migrate without a coordinated cutover. Each is documented as deprecated, and none of them is a second supported transport.
- mountMcpToolsRoute and mountMcpCallRoute are REST-shaped aliases retained for one release.
- They are not an MCP transport; new work should mount the single modern route.
- resolveUser and resolveAuthenticated remain as legacy identity hooks.
- The modern mount rejects legacy protocol handling rather than negotiating down.
- Development tools return structured content beside the original text payload, so text-only clients keep working.
Optional capabilities stay explicit
Durable MCP tasks are available as an experimental, opt-in extension. Their capability is absent unless an allowed object declares at least one task action, so an ordinary tools-only client sees the same surface as before.
- Task lifecycle state lives in the jobs runtime rather than an MCP transport session.
- Application deployments must run the mcp-tasks worker and provide a stable principal identity for lifecycle operations.
- The development plugin declares no streamable HTTP transport in this release.
Local troubleshooting starts with the transport
A stdio MCP server speaks JSON-RPC on stdout, so anything else written there corrupts the channel. Do not call framework code that writes SDK logger progress from a tool path. Suppressing console output does not fix the problem. Write diagnostic logs to stderr.
- Set DEBUG to true in the server environment to enable diagnostic logging.
- A client that fails immediately after launch is usually launching the wrong path or the wrong Node runtime.
- A package-manager launcher can emit its own output before the server starts; prefer an absolute launcher.
Cache and tenancy safety
Catalogs are private by default on both Development MCP and application MCP. A shared catalog requires explicit opt-in. The server re-verifies the declared shape and downgrades invalid catalogs. This check prevents tenant-scoped or principal-gated tools from entering a shared cache. Workspace knowledge resources use a zero cache lifetime because the server rebuilds them per request. They carry no reliable invalidation signal.
- Tenant interceptors and field policy stay in the path for every generated operation.
- Never expose the generated stdio server remotely; it has no per-request principal.
- Keep issuer metadata, client documents, and gateway policy in deployment source control.