Skip to content

feat(codemod): close v1-to-v2 mechanical gaps — outputSchema wrap, importMap entries; drop dead expressMiddleware transform#2361

Merged
felixweinberger merged 1 commit into
v2-2026-07-28from
fweinberger/codemod-gaps
Jun 24, 2026
Merged

feat(codemod): close v1-to-v2 mechanical gaps — outputSchema wrap, importMap entries; drop dead expressMiddleware transform#2361
felixweinberger merged 1 commit into
v2-2026-07-28from
fweinberger/codemod-gaps

Conversation

@felixweinberger

Copy link
Copy Markdown
Contributor

Close 4 mechanical gaps in the v1→v2 codemod and delete a dead transform.

Motivation and Context

The migration-doc audit (#2360) found the codemod handles inputSchema/argsSchema/uriSchema z.object() wrap but not outputSchema; drops the schema arg from client.request()/callTool() but not ctx.mcpReq.send(); and importMap is missing sdk/server/express.js + client/auth-extensions.js. The expressMiddlewareTransform allowedHosts rewrite is dead (every released v1.x already had string[]).

How Has This Been Tested?

codemod suite 348/348 (+7 new fixtures, 3 negative tests correctly inverted), typecheck, lint, docs:check.

Breaking Changes

None — codemod only.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

Additional context

Transform count 10→9. docs/migration/upgrade-to-v2.md HANDLED/NOT-HANDLED lists updated to match.

@felixweinberger felixweinberger requested a review from a team as a code owner June 24, 2026 15:51
@changeset-bot

changeset-bot Bot commented Jun 24, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 693d091

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@modelcontextprotocol/codemod Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@pkg-pr-new

pkg-pr-new Bot commented Jun 24, 2026

Copy link
Copy Markdown

Open in StackBlitz

@modelcontextprotocol/client

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/client@2361

@modelcontextprotocol/codemod

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/codemod@2361

@modelcontextprotocol/server

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/server@2361

@modelcontextprotocol/server-legacy

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/server-legacy@2361

@modelcontextprotocol/express

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/express@2361

@modelcontextprotocol/fastify

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/fastify@2361

@modelcontextprotocol/hono

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/hono@2361

@modelcontextprotocol/node

npm i https://pkg.pr.new/modelcontextprotocol/typescript-sdk/@modelcontextprotocol/node@2361

commit: 3c0d716

@felixweinberger felixweinberger force-pushed the fweinberger/codemod-gaps branch 2 times, most recently from c46d707 to 7cfe90e Compare June 24, 2026 16:02
Comment thread packages/codemod/src/migrations/v1-to-v2/transforms/mcpServerApi.ts
Comment thread packages/codemod/src/migrations/v1-to-v2/transforms/index.ts
@felixweinberger felixweinberger force-pushed the fweinberger/codemod-gaps branch from 7cfe90e to 0d9215f Compare June 24, 2026 16:52
Comment thread packages/codemod/src/migrations/v1-to-v2/transforms/schemaParamRemoval.ts Outdated
@felixweinberger felixweinberger force-pushed the fweinberger/codemod-gaps branch 2 times, most recently from 404e24c to 3c0d716 Compare June 24, 2026 22:17
Comment thread packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts
…leware transform

- registerTool: also wrap raw outputSchema with z.object() (already did inputSchema/argsSchema/uriSchema)
- importMap: + sdk/server/express.js, + sdk/server/middleware/hostHeaderValidation.js, + sdk/client/auth-extensions.js
- delete expressMiddlewareTransform: it rewrote hostHeaderValidation({allowedHosts:[...]}) -> hostHeaderValidation([...]),
  but hostHeaderValidation was (string[]) in every released v1.x. The allowedHosts *option* on createMcpExpressApp /
  SSEServerTransport is unchanged v1->v2 (only the import path moved); the transform targeted the wrong API.
- docs/migration/upgrade-to-v2.md: HANDLED/NOT-HANDLED lists updated to match
@felixweinberger felixweinberger changed the title fix(codemod): wrap outputSchema; drop ctx.send schema arg; importMap express/auth-extensions; delete dead expressMiddlewareTransform feat(codemod): close v1-to-v2 mechanical gaps — outputSchema wrap, importMap entries; drop dead expressMiddleware transform Jun 24, 2026
@felixweinberger felixweinberger force-pushed the fweinberger/codemod-gaps branch from 3c0d716 to 693d091 Compare June 24, 2026 22:55
@felixweinberger felixweinberger merged commit 8fa82f3 into v2-2026-07-28 Jun 24, 2026
15 checks passed
@felixweinberger felixweinberger deleted the fweinberger/codemod-gaps branch June 24, 2026 22:55

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — codemod-only mechanical gap-closing; prior review feedback (changeset, README coverage prose, extra importMap entries) is addressed in this revision and the docs now match the shipped transforms.

Extended reasoning...

Overview

This PR is confined to the @modelcontextprotocol/codemod package plus migration/README docs: it adds an outputSchema z.object() wrap to mcpServerApiTransform, adds importMap entries (client/auth-extensions.js, server/express.js, server/middleware/hostHeaderValidation.js, client/middleware.js, shared/auth-utils.js), deletes the dead expressMiddlewareTransform, updates the migration guide/README coverage lists, and adds a patch changeset. No SDK runtime code is touched.

Security risks

None — the change affects a developer-run codemod tool and prose documentation only; no auth, transport, or protocol code paths are modified.

Level of scrutiny

Moderate-low. The codemod is a userland migration aid published as alpha; the worst failure mode is an import left unrewritten (surfaced by the documented tsc --noEmit step), not a runtime defect for SDK consumers. I verified the riskier earlier finding is not present in this revision: schemaParamRemoval.ts is unchanged (TARGET_METHODS is still request/callTool), so the previously flagged custom-method schema-stripping regression does not exist; the new sendRequest test is a negative guard consistent with that. The expressMiddleware deletion is backed by the existing migration-guide statement (from #2360) that every released v1.x already used the string[] signature, and the integration tests were updated to assert the call is left untouched while the import is still rewritten.

Other factors

All prior review threads are addressed: the changeset (codemod-v1-to-v2-gaps.md) now exists, the README no longer lists outputSchema wrapping as manual while correctly keeping the ctx.mcpReq.send() schema-arg drop manual (matching the unchanged transform), and the suggested client/middleware.js / shared/auth-utils.js importMap entries were added. New behavior has direct vitest fixtures (outputSchema wrap, no double-wrap, new import-path rewrites), the doc cross-link anchors (#probe-policy, #per-era-wire-codecs) resolve in support-2026-07-28.md, and the bug-hunting system found no bugs in this revision.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant