Skip to content

Commit 9fc9070

Browse files
refactor(client,server): move stdio transports to ./stdio subpath export (#1871)
Co-authored-by: Konstantin Konstantinov <KKonstantinov@users.noreply.github.com>
1 parent 55b1f06 commit 9fc9070

36 files changed

Lines changed: 194 additions & 31 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: 3 additions & 3 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,7 +51,7 @@ 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) |
@@ -66,7 +66,7 @@ Replace all `@modelcontextprotocol/sdk/...` imports using this table.
6666
| `@modelcontextprotocol/sdk/shared/transport.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
6767
| `@modelcontextprotocol/sdk/shared/uriTemplate.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
6868
| `@modelcontextprotocol/sdk/shared/auth.js` | `@modelcontextprotocol/client` or `@modelcontextprotocol/server` |
69-
| `@modelcontextprotocol/sdk/shared/stdio.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

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)