Skip to content

Commit 17d75b1

Browse files
Merge branch 'main' into fweinberger/spec-type-predicates
2 parents c603005 + 9fc9070 commit 17d75b1

36 files changed

Lines changed: 208 additions & 44 deletions

.changeset/stdio-subpath-export.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@modelcontextprotocol/client': minor
3+
'@modelcontextprotocol/server': minor
4+
---
5+
6+
Move stdio transports to a `./stdio` subpath export. Import `StdioClientTransport`, `getDefaultEnvironment`, `DEFAULT_INHERITED_ENV_VARS`, and `StdioServerParameters` from `@modelcontextprotocol/client/stdio`, and `StdioServerTransport` from `@modelcontextprotocol/server/stdio`. The `@modelcontextprotocol/client` root entry no longer pulls in `node:child_process`, `node:stream`, or `cross-spawn`, fixing bundling for browser and Cloudflare Workers targets; the `@modelcontextprotocol/server` root entry drops its `node:stream` reference. Node.js, Bun, and Deno consumers update the import path; runtime behavior is unchanged.

CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ When modifying exports:
7474
- Use explicit named exports, not `export *`, in package `index.ts` files and `core/public`.
7575
- Adding a symbol to a package `index.ts` makes it public API — do so intentionally.
7676
- Internal helpers should stay in the core internal barrel and not be added to `core/public` or package index files.
77+
- The package root entry must stay runtime-neutral so browser and Cloudflare Workers bundlers can consume it. Exports whose module graph transitively touches unpolyfillable Node builtins (`node:child_process`, `node:net`, `cross-spawn`, etc.) must live at a named subpath export (e.g. `./stdio`) and be covered by a `barrelClean` test in that package.
7778

7879
### Transport System
7980

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ npm install @modelcontextprotocol/hono hono
9595
Here is what an MCP server looks like. This minimal example exposes a single `greet` tool over stdio:
9696

9797
```typescript
98-
import { McpServer, StdioServerTransport } from '@modelcontextprotocol/server';
98+
import { McpServer } from '@modelcontextprotocol/server';
99+
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
99100
import * as z from 'zod/v4';
100101

101102
const server = new McpServer({ name: 'greeting-server', version: '1.0.0' });

docs/client-quickstart.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ First, let's set up our imports and create the basic client class in `src/index.
112112

113113
```ts source="../examples/client-quickstart/src/index.ts#prelude"
114114
import Anthropic from '@anthropic-ai/sdk';
115-
import { Client, StdioClientTransport } from '@modelcontextprotocol/client';
115+
import { Client } from '@modelcontextprotocol/client';
116+
import { StdioClientTransport } from '@modelcontextprotocol/client/stdio';
116117
import readline from 'readline/promises';
117118

118119
const ANTHROPIC_MODEL = 'claude-sonnet-4-5';

docs/client.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ import {
2626
SdkError,
2727
SdkErrorCode,
2828
SSEClientTransport,
29-
StdioClientTransport,
3029
StreamableHTTPClientTransport
3130
} from '@modelcontextprotocol/client';
31+
import { StdioClientTransport } from '@modelcontextprotocol/client/stdio';
3232
```
3333

3434
## Connecting to a server

docs/migration-SKILL.md

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Replace all `@modelcontextprotocol/sdk/...` imports using this table.
4242
| `@modelcontextprotocol/sdk/client/auth.js` | `@modelcontextprotocol/client` |
4343
| `@modelcontextprotocol/sdk/client/streamableHttp.js` | `@modelcontextprotocol/client` |
4444
| `@modelcontextprotocol/sdk/client/sse.js` | `@modelcontextprotocol/client` |
45-
| `@modelcontextprotocol/sdk/client/stdio.js` | `@modelcontextprotocol/client` |
45+
| `@modelcontextprotocol/sdk/client/stdio.js` | `@modelcontextprotocol/client/stdio` |
4646
| `@modelcontextprotocol/sdk/client/websocket.js` | REMOVED (use Streamable HTTP or stdio; implement `Transport` for custom needs) |
4747

4848
### Server imports
@@ -51,22 +51,22 @@ Replace all `@modelcontextprotocol/sdk/...` imports using this table.
5151
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
5252
| `@modelcontextprotocol/sdk/server/mcp.js` | `@modelcontextprotocol/server` |
5353
| `@modelcontextprotocol/sdk/server/index.js` | `@modelcontextprotocol/server` |
54-
| `@modelcontextprotocol/sdk/server/stdio.js` | `@modelcontextprotocol/server` |
54+
| `@modelcontextprotocol/sdk/server/stdio.js` | `@modelcontextprotocol/server/stdio` |
5555
| `@modelcontextprotocol/sdk/server/streamableHttp.js` | `@modelcontextprotocol/node` (class renamed to `NodeStreamableHTTPServerTransport`) OR `@modelcontextprotocol/server` (web-standard `WebStandardStreamableHTTPServerTransport` for Cloudflare Workers, Deno, etc.) |
5656
| `@modelcontextprotocol/sdk/server/sse.js` | REMOVED (migrate to Streamable HTTP) |
5757
| `@modelcontextprotocol/sdk/server/auth/*` | RS helpers (`requireBearerAuth`, `mcpAuthMetadataRouter`, `OAuthTokenVerifier`) → `@modelcontextprotocol/express`; AS helpers removed (use external IdP/OAuth library) |
5858
| `@modelcontextprotocol/sdk/server/middleware.js` | `@modelcontextprotocol/express` (signature changed, see section 8) |
5959

6060
### Types / shared imports
6161

62-
| v1 import path | v2 package |
63-
| ------------------------------------------------- | ---------------------------------------------------------------- |
64-
| `@modelcontextprotocol/sdk/types.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
65-
| `@modelcontextprotocol/sdk/shared/protocol.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
66-
| `@modelcontextprotocol/sdk/shared/transport.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
67-
| `@modelcontextprotocol/sdk/shared/uriTemplate.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
68-
| `@modelcontextprotocol/sdk/shared/auth.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
69-
| `@modelcontextprotocol/sdk/shared/stdio.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
62+
| v1 import path | v2 package |
63+
| ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
64+
| `@modelcontextprotocol/sdk/types.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
65+
| `@modelcontextprotocol/sdk/shared/protocol.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
66+
| `@modelcontextprotocol/sdk/shared/transport.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
67+
| `@modelcontextprotocol/sdk/shared/uriTemplate.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
68+
| `@modelcontextprotocol/sdk/shared/auth.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
69+
| `@modelcontextprotocol/sdk/shared/stdio.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` (`ReadBuffer`, `serializeMessage`, `deserializeMessage` are in the root barrel; the `./stdio` subpath only has the transport class) |
7070

7171
Notes:
7272

@@ -321,7 +321,8 @@ new URL(ctx.http?.req?.url).searchParams.get('debug')
321321

322322
### Server-side auth
323323

324-
Resource Server helpers (`requireBearerAuth`, `mcpAuthMetadataRouter`, `getOAuthProtectedResourceMetadataUrl`, `OAuthTokenVerifier`) are first-class in `@modelcontextprotocol/express`. Authorization Server helpers (`mcpAuthRouter`, `OAuthServerProvider`, `ProxyOAuthServerProvider`, `authenticateClient`, `allowedMethods`, etc.) are removed from the core SDK; use an external IdP/OAuth library. See `examples/server/src/` for demos.
324+
Resource Server helpers (`requireBearerAuth`, `mcpAuthMetadataRouter`, `getOAuthProtectedResourceMetadataUrl`, `OAuthTokenVerifier`) are first-class in `@modelcontextprotocol/express`. Authorization Server helpers (`mcpAuthRouter`, `OAuthServerProvider`,
325+
`ProxyOAuthServerProvider`, `authenticateClient`, `allowedMethods`, etc.) are removed from the core SDK; use an external IdP/OAuth library. See `examples/server/src/` for demos.
325326

326327
### Host header validation (Express)
327328

@@ -438,12 +439,12 @@ Remove unused schema imports: `CallToolResultSchema`, `CompatibilityCallToolResu
438439

439440
If a `*Schema` constant was used for **runtime validation** (not just as a `request()` argument), replace with `isSpecType` / `specTypeSchemas`:
440441

441-
| v1 pattern | v2 replacement |
442-
| -------------------------------------------------- | -------------------------------------------------------------------------------------- |
443-
| `CallToolResultSchema.safeParse(value).success` | `isSpecType.CallToolResult(value)` |
444-
| `<TypeName>Schema.safeParse(value).success` | `isSpecType.<TypeName>(value)` |
442+
| v1 pattern | v2 replacement |
443+
| -------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
444+
| `CallToolResultSchema.safeParse(value).success` | `isSpecType.CallToolResult(value)` |
445+
| `<TypeName>Schema.safeParse(value).success` | `isSpecType.<TypeName>(value)` |
445446
| `<TypeName>Schema.parse(value)` | `await specTypeSchemas.<TypeName>['~standard'].validate(value)` (returns a `Result`, not the value) |
446-
| Passing `<TypeName>Schema` as a validator argument | `specTypeSchemas.<TypeName>` (a `StandardSchemaV1<In, Out>`) |
447+
| Passing `<TypeName>Schema` as a validator argument | `specTypeSchemas.<TypeName>` (a `StandardSchemaV1<In, Out>`) |
447448

448449
`isCallToolResult(value)` still works, but `isSpecType` covers every spec type by name.
449450

docs/migration.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
5050
**After (v2):**
5151

5252
```typescript
53-
import { Client, StreamableHTTPClientTransport, StdioClientTransport } from '@modelcontextprotocol/client';
54-
import { McpServer, StdioServerTransport, WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server';
53+
import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client';
54+
import { StdioClientTransport } from '@modelcontextprotocol/client/stdio';
55+
import { McpServer, WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server';
56+
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
5557

5658
// Node.js HTTP server transport is in the @modelcontextprotocol/node package
5759
import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';

docs/server-quickstart.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ Now let's dive into building your server.
127127
Add these to the top of your `src/index.ts`:
128128

129129
```ts source="../examples/server-quickstart/src/index.ts#prelude"
130-
import { McpServer, StdioServerTransport } from '@modelcontextprotocol/server';
130+
import { McpServer } from '@modelcontextprotocol/server';
131+
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
131132
import * as z from 'zod/v4';
132133

133134
const NWS_API_BASE = 'https://api.weather.gov';

docs/server.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ import { randomUUID } from 'node:crypto';
2222
import { createMcpExpressApp } from '@modelcontextprotocol/express';
2323
import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';
2424
import type { CallToolResult, ResourceLink } from '@modelcontextprotocol/server';
25-
import { completable, McpServer, ResourceTemplate, StdioServerTransport } from '@modelcontextprotocol/server';
25+
import { completable, McpServer, ResourceTemplate } from '@modelcontextprotocol/server';
26+
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
2627
import * as z from 'zod/v4';
2728
```
2829

examples/client-quickstart/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//#region prelude
22
import Anthropic from '@anthropic-ai/sdk';
3-
import { Client, StdioClientTransport } from '@modelcontextprotocol/client';
3+
import { Client } from '@modelcontextprotocol/client';
4+
import { StdioClientTransport } from '@modelcontextprotocol/client/stdio';
45
import readline from 'readline/promises';
56

67
const ANTHROPIC_MODEL = 'claude-sonnet-4-5';

0 commit comments

Comments
 (0)