typescript-sdk/packages/codemod
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-06-29 13:58:32 +01:00
..
batch-test v2: codemod iterations, canonical zod schema exports from sdk-shared (#2354) 2026-06-25 19:42:44 +01:00
scripts v2: codemod iterations, canonical zod schema exports from sdk-shared (#2354) 2026-06-25 19:42:44 +01:00
src feat(examples): add a reference host/server pair — cli-client + todos-server (#2380) 2026-06-29 13:58:32 +01:00
test Implement MCP 2026-07-28 (#2286) 2026-06-26 14:01:10 +01:00
CHANGELOG.md Version Packages (alpha) (#1845) 2026-06-25 20:44:33 +01:00
eslint.config.mjs feat: add v2 codemod draft (#1950) 2026-05-21 14:13:33 +01:00
package.json Version Packages (alpha) (#1845) 2026-06-25 20:44:33 +01:00
README.md Implement MCP 2026-07-28 (#2286) 2026-06-26 14:01:10 +01:00
tsconfig.json feat: add v2 codemod draft (#1950) 2026-05-21 14:13:33 +01:00
tsdown.config.ts feat: add v2 codemod draft (#1950) 2026-05-21 14:13:33 +01:00
typedoc.json feat: add v2 codemod draft (#1950) 2026-05-21 14:13:33 +01:00
vitest.config.js feat: add v2 codemod draft (#1950) 2026-05-21 14:13:33 +01:00

@modelcontextprotocol/codemod

Codemods for migrating MCP TypeScript SDK code between major versions.

Usage

npx @modelcontextprotocol/codemod@alpha v1-to-v2 ./src

The codemod rewrites TypeScript and JavaScript source files (.ts/.tsx/.mts/.cts/.js/.jsx/.mjs/.cjs) in place. Run it on a clean working tree so you can review the diff.

What v1-to-v2 covers

The mechanical rename mappings are the source of truth — see src/migrations/v1-to-v2/mappings/:

Transforms in src/migrations/v1-to-v2/transforms/ also rewrite .tool() → registerTool (wrapping inputSchema / outputSchema / argsSchema / uriSchema raw shapes with z.object()), drop the result-schema argument from client.request() / client.callTool() for spec methods, route spec *Schema imports to @modelcontextprotocol/core, rename StreamableHTTPError → SdkHttpError / IsomorphicHeaders → Headers, rewrite SchemaInput<T> → StandardSchemaWithJSON.InferInput<T>, route ErrorCode.{RequestTimeout,ConnectionClosed} to SdkErrorCode, and rewrite vi.mock / jest.mock / dynamic import() paths.

@mcp-codemod-error markers

When the codemod recognizes a v1 pattern but cannot safely rewrite it (ambiguous context, removed API with no mechanical replacement, signature change requiring judgment), it leaves the code unchanged and inserts a comment:

/* @mcp-codemod-error WebSocketClientTransport removed in v2. Use StreamableHTTPClientTransport or StdioClientTransport. */

After running the codemod, find every site that needs attention:

grep -rn '@mcp-codemod-error' .

What it does NOT cover

CJS→ESM / Node 20 pre-flight, new Headers() / .get() access rewrites, OAuth error-class consolidation (instanceof InvalidGrantError → OAuthError + OAuthErrorCode), per-scenario SdkErrorCode branch selection, ctx.mcpReq.send() schema-arg drop, and behavioral adaptation are manual — see the migration guide for what to do after the codemod runs.

The codemod handles the v1→v2 SDK surface upgrade only. Adopting the 2026-07-28 protocol revision (createMcpHandler, multi-round-trip requests, versionNegotiation) is architectural and not codemod-automatable — see docs/migration/support-2026-07-28.md.