Skip to content

Commit 4fdd286

Browse files
committed
post-merge transforms
1 parent b0e7bad commit 4fdd286

12 files changed

Lines changed: 737 additions & 14 deletions

File tree

packages/codemod/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@
3535
"scripts": {
3636
"typecheck": "tsgo -p tsconfig.json --noEmit",
3737
"generate:versions": "tsx scripts/generateVersions.ts",
38-
"prebuild": "pnpm run generate:versions",
38+
"generate:spec-schemas": "tsx scripts/generateSpecSchemaMap.ts",
39+
"prebuild": "pnpm run generate:versions && pnpm run generate:spec-schemas",
3940
"build": "tsdown",
4041
"build:watch": "tsdown --watch",
4142
"prepack": "pnpm run build",
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { readFileSync, writeFileSync } from 'node:fs';
2+
import path from 'node:path';
3+
import { fileURLToPath } from 'node:url';
4+
5+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
6+
const specTypeSchemaPath = path.resolve(__dirname, '../../core/src/types/specTypeSchema.ts');
7+
8+
const source = readFileSync(specTypeSchemaPath, 'utf8');
9+
10+
// Extract SPEC_SCHEMA_KEYS array entries
11+
const keysMatch = source.match(/const SPEC_SCHEMA_KEYS = \[([\s\S]*?)\] as const/);
12+
if (!keysMatch) throw new Error('Could not find SPEC_SCHEMA_KEYS in specTypeSchema.ts');
13+
14+
const protocolSchemas = [...keysMatch[1]!.matchAll(/'([^']+)'/g)].map(m => m[1]!);
15+
16+
// Extract auth schema keys
17+
const authMatch = source.match(/const authSchemas = \{([\s\S]*?)\} as const/);
18+
if (!authMatch) throw new Error('Could not find authSchemas in specTypeSchema.ts');
19+
20+
const authSchemas = [...authMatch[1]!.matchAll(/(\w+Schema)/g)].map(m => m[1]!);
21+
22+
const allSchemas = [...protocolSchemas, ...authSchemas].sort();
23+
24+
const entries = allSchemas.map((s, i) => ` '${s}'${i < allSchemas.length - 1 ? ',' : ''}`).join('\n');
25+
26+
const output = `// AUTO-GENERATED — do not edit. Run \`pnpm run generate:spec-schemas\` to regenerate.
27+
export const SPEC_SCHEMA_NAMES: ReadonlySet<string> = new Set([
28+
${entries}
29+
]);
30+
31+
export function specSchemaToTypeName(schemaName: string): string | undefined {
32+
if (!SPEC_SCHEMA_NAMES.has(schemaName)) return undefined;
33+
return schemaName.slice(0, -'Schema'.length);
34+
}
35+
`;
36+
37+
const outPath = path.resolve(__dirname, '../src/generated/specSchemaMap.ts');
38+
writeFileSync(outPath, output);
39+
console.log(`Wrote ${outPath} (${allSchemas.length} schemas)`);
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
// AUTO-GENERATED — do not edit. Run `pnpm run generate:spec-schemas` to regenerate.
2+
export const SPEC_SCHEMA_NAMES: ReadonlySet<string> = new Set([
3+
'AnnotationsSchema',
4+
'AudioContentSchema',
5+
'BaseMetadataSchema',
6+
'BlobResourceContentsSchema',
7+
'BooleanSchemaSchema',
8+
'CallToolRequestParamsSchema',
9+
'CallToolRequestSchema',
10+
'CallToolResultSchema',
11+
'CancelTaskRequestSchema',
12+
'CancelTaskResultSchema',
13+
'CancelledNotificationParamsSchema',
14+
'CancelledNotificationSchema',
15+
'ClientCapabilitiesSchema',
16+
'ClientNotificationSchema',
17+
'ClientRequestSchema',
18+
'ClientResultSchema',
19+
'CompatibilityCallToolResultSchema',
20+
'CompleteRequestParamsSchema',
21+
'CompleteRequestSchema',
22+
'CompleteResultSchema',
23+
'ContentBlockSchema',
24+
'CreateMessageRequestParamsSchema',
25+
'CreateMessageRequestSchema',
26+
'CreateMessageResultSchema',
27+
'CreateMessageResultWithToolsSchema',
28+
'CreateTaskResultSchema',
29+
'CursorSchema',
30+
'ElicitRequestFormParamsSchema',
31+
'ElicitRequestParamsSchema',
32+
'ElicitRequestSchema',
33+
'ElicitRequestURLParamsSchema',
34+
'ElicitResultSchema',
35+
'ElicitationCompleteNotificationParamsSchema',
36+
'ElicitationCompleteNotificationSchema',
37+
'EmbeddedResourceSchema',
38+
'EmptyResultSchema',
39+
'EnumSchemaSchema',
40+
'GetPromptRequestParamsSchema',
41+
'GetPromptRequestSchema',
42+
'GetPromptResultSchema',
43+
'GetTaskPayloadRequestSchema',
44+
'GetTaskPayloadResultSchema',
45+
'GetTaskRequestSchema',
46+
'GetTaskResultSchema',
47+
'IconSchema',
48+
'IconsSchema',
49+
'ImageContentSchema',
50+
'ImplementationSchema',
51+
'InitializeRequestParamsSchema',
52+
'InitializeRequestSchema',
53+
'InitializeResultSchema',
54+
'InitializedNotificationSchema',
55+
'JSONArraySchema',
56+
'JSONObjectSchema',
57+
'JSONRPCErrorResponseSchema',
58+
'JSONRPCMessageSchema',
59+
'JSONRPCNotificationSchema',
60+
'JSONRPCRequestSchema',
61+
'JSONRPCResponseSchema',
62+
'JSONRPCResultResponseSchema',
63+
'JSONValueSchema',
64+
'LegacyTitledEnumSchemaSchema',
65+
'ListPromptsRequestSchema',
66+
'ListPromptsResultSchema',
67+
'ListResourceTemplatesRequestSchema',
68+
'ListResourceTemplatesResultSchema',
69+
'ListResourcesRequestSchema',
70+
'ListResourcesResultSchema',
71+
'ListRootsRequestSchema',
72+
'ListRootsResultSchema',
73+
'ListTasksRequestSchema',
74+
'ListTasksResultSchema',
75+
'ListToolsRequestSchema',
76+
'ListToolsResultSchema',
77+
'LoggingLevelSchema',
78+
'LoggingMessageNotificationParamsSchema',
79+
'LoggingMessageNotificationSchema',
80+
'ModelHintSchema',
81+
'ModelPreferencesSchema',
82+
'MultiSelectEnumSchemaSchema',
83+
'NotificationSchema',
84+
'NumberSchemaSchema',
85+
'OAuthClientInformationFullSchema',
86+
'OAuthClientInformationSchema',
87+
'OAuthClientMetadataSchema',
88+
'OAuthClientRegistrationErrorSchema',
89+
'OAuthErrorResponseSchema',
90+
'OAuthMetadataSchema',
91+
'OAuthProtectedResourceMetadataSchema',
92+
'OAuthTokenRevocationRequestSchema',
93+
'OAuthTokensSchema',
94+
'OpenIdProviderDiscoveryMetadataSchema',
95+
'OpenIdProviderMetadataSchema',
96+
'PaginatedRequestParamsSchema',
97+
'PaginatedRequestSchema',
98+
'PaginatedResultSchema',
99+
'PingRequestSchema',
100+
'PrimitiveSchemaDefinitionSchema',
101+
'ProgressNotificationParamsSchema',
102+
'ProgressNotificationSchema',
103+
'ProgressSchema',
104+
'ProgressTokenSchema',
105+
'PromptArgumentSchema',
106+
'PromptListChangedNotificationSchema',
107+
'PromptMessageSchema',
108+
'PromptReferenceSchema',
109+
'PromptSchema',
110+
'ReadResourceRequestParamsSchema',
111+
'ReadResourceRequestSchema',
112+
'ReadResourceResultSchema',
113+
'RelatedTaskMetadataSchema',
114+
'RequestIdSchema',
115+
'RequestMetaSchema',
116+
'RequestSchema',
117+
'ResourceContentsSchema',
118+
'ResourceLinkSchema',
119+
'ResourceListChangedNotificationSchema',
120+
'ResourceRequestParamsSchema',
121+
'ResourceSchema',
122+
'ResourceTemplateReferenceSchema',
123+
'ResourceTemplateSchema',
124+
'ResourceUpdatedNotificationParamsSchema',
125+
'ResourceUpdatedNotificationSchema',
126+
'ResultSchema',
127+
'RoleSchema',
128+
'RootSchema',
129+
'RootsListChangedNotificationSchema',
130+
'SamplingContentSchema',
131+
'SamplingMessageContentBlockSchema',
132+
'SamplingMessageSchema',
133+
'ServerCapabilitiesSchema',
134+
'ServerNotificationSchema',
135+
'ServerRequestSchema',
136+
'ServerResultSchema',
137+
'SetLevelRequestParamsSchema',
138+
'SetLevelRequestSchema',
139+
'SingleSelectEnumSchemaSchema',
140+
'StringSchemaSchema',
141+
'SubscribeRequestParamsSchema',
142+
'SubscribeRequestSchema',
143+
'TaskAugmentedRequestParamsSchema',
144+
'TaskCreationParamsSchema',
145+
'TaskMetadataSchema',
146+
'TaskSchema',
147+
'TaskStatusNotificationParamsSchema',
148+
'TaskStatusNotificationSchema',
149+
'TaskStatusSchema',
150+
'TextContentSchema',
151+
'TextResourceContentsSchema',
152+
'TitledMultiSelectEnumSchemaSchema',
153+
'TitledSingleSelectEnumSchemaSchema',
154+
'ToolAnnotationsSchema',
155+
'ToolChoiceSchema',
156+
'ToolExecutionSchema',
157+
'ToolListChangedNotificationSchema',
158+
'ToolResultContentSchema',
159+
'ToolSchema',
160+
'ToolUseContentSchema',
161+
'UnsubscribeRequestParamsSchema',
162+
'UnsubscribeRequestSchema',
163+
'UntitledMultiSelectEnumSchemaSchema',
164+
'UntitledSingleSelectEnumSchemaSchema'
165+
]);
166+
167+
export function specSchemaToTypeName(schemaName: string): string | undefined {
168+
if (!SPEC_SCHEMA_NAMES.has(schemaName)) return undefined;
169+
return schemaName.slice(0, -'Schema'.length);
170+
}

packages/codemod/src/migrations/v1-to-v2/mappings/importMap.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,13 @@ export const IMPORT_MAP: Record<string, ImportMapping> = {
2727
},
2828
'@modelcontextprotocol/sdk/client/stdio.js': {
2929
target: '@modelcontextprotocol/client',
30-
status: 'moved'
30+
status: 'moved',
31+
symbolTargetOverrides: {
32+
StdioClientTransport: '@modelcontextprotocol/client/stdio',
33+
DEFAULT_INHERITED_ENV_VARS: '@modelcontextprotocol/client/stdio',
34+
getDefaultEnvironment: '@modelcontextprotocol/client/stdio',
35+
StdioServerParameters: '@modelcontextprotocol/client/stdio'
36+
}
3137
},
3238
'@modelcontextprotocol/sdk/client/websocket.js': {
3339
target: '',
@@ -44,7 +50,7 @@ export const IMPORT_MAP: Record<string, ImportMapping> = {
4450
status: 'moved'
4551
},
4652
'@modelcontextprotocol/sdk/server/stdio.js': {
47-
target: '@modelcontextprotocol/server',
53+
target: '@modelcontextprotocol/server/stdio',
4854
status: 'moved'
4955
},
5056
'@modelcontextprotocol/sdk/server/streamableHttp.js': {
@@ -80,22 +86,26 @@ export const IMPORT_MAP: Record<string, ImportMapping> = {
8086
'@modelcontextprotocol/sdk/server/auth/provider.js': {
8187
target: '',
8288
status: 'removed',
83-
removalMessage: 'Server auth removed in v2. Use an external auth library (e.g., better-auth).'
89+
removalMessage:
90+
'Server auth provider removed in v2. For Resource-Server auth (token verification), see @modelcontextprotocol/express. For full OAuth AS, see @modelcontextprotocol/server-auth-legacy (PR #1908).'
8491
},
8592
'@modelcontextprotocol/sdk/server/auth/router.js': {
8693
target: '',
8794
status: 'removed',
88-
removalMessage: 'Server auth removed in v2. Use an external auth library (e.g., better-auth).'
95+
removalMessage:
96+
'Server auth router removed in v2. For metadata endpoints, see mcpAuthMetadataRouter from @modelcontextprotocol/express. For full OAuth AS router, see @modelcontextprotocol/server-auth-legacy (PR #1908).'
8997
},
9098
'@modelcontextprotocol/sdk/server/auth/middleware.js': {
9199
target: '',
92100
status: 'removed',
93-
removalMessage: 'Server auth removed in v2. Use an external auth library (e.g., better-auth).'
101+
removalMessage:
102+
'Server auth middleware removed in v2. For bearer token validation, see requireBearerAuth from @modelcontextprotocol/express. For full OAuth AS, see @modelcontextprotocol/server-auth-legacy (PR #1908).'
94103
},
95104
'@modelcontextprotocol/sdk/server/auth/errors.js': {
96105
target: '',
97106
status: 'removed',
98-
removalMessage: 'Server auth removed in v2. Use an external auth library (e.g., better-auth).'
107+
removalMessage:
108+
'Auth error subclasses consolidated in v2. Use OAuthError + OAuthErrorCode from @modelcontextprotocol/server. See also @modelcontextprotocol/server-auth-legacy (PR #1908).'
99109
},
100110

101111
'@modelcontextprotocol/sdk/types.js': {

packages/codemod/src/migrations/v1-to-v2/transforms/handlerRegistration.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { SourceFile } from 'ts-morph';
22
import { Node, SyntaxKind } from 'ts-morph';
33

4-
import type { Transform, TransformContext, TransformResult } from '../../../types.js';
4+
import type { Diagnostic, Transform, TransformContext, TransformResult } from '../../../types.js';
5+
import { warning } from '../../../utils/diagnostics.js';
56
import { isImportedFromMcp, removeUnusedImport, resolveOriginalImportName } from '../../../utils/importUtils.js';
67
import { NOTIFICATION_SCHEMA_TO_METHOD, SCHEMA_TO_METHOD } from '../mappings/schemaToMethodMap.js';
78

@@ -15,6 +16,7 @@ export const handlerRegistrationTransform: Transform = {
1516
id: 'handlers',
1617
apply(sourceFile: SourceFile, _context: TransformContext): TransformResult {
1718
let changesCount = 0;
19+
const diagnostics: Diagnostic[] = [];
1820

1921
const calls = sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression);
2022

@@ -36,7 +38,18 @@ export const handlerRegistrationTransform: Transform = {
3638
const schemaName = firstArg.getText();
3739
const originalName = resolveOriginalImportName(sourceFile, schemaName) ?? schemaName;
3840
const methodString = ALL_SCHEMA_TO_METHOD[originalName];
39-
if (!methodString) continue;
41+
if (!methodString) {
42+
diagnostics.push(
43+
warning(
44+
sourceFile.getFilePath(),
45+
call.getStartLineNumber(),
46+
`Custom method handler: ${methodName}(${schemaName}, ...). ` +
47+
`In v2, use the 3-arg form: ${methodName}('method/name', { params, result? }, handler). ` +
48+
`See migration.md for details.`
49+
)
50+
);
51+
continue;
52+
}
4053

4154
if (!isImportedFromMcp(sourceFile, schemaName)) continue;
4255

@@ -46,6 +59,6 @@ export const handlerRegistrationTransform: Transform = {
4659
removeUnusedImport(sourceFile, schemaName, true);
4760
}
4861

49-
return { changesCount, diagnostics: [] };
62+
return { changesCount, diagnostics };
5063
}
5164
};

packages/codemod/src/migrations/v1-to-v2/transforms/importPaths.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ export const importPathsTransform: Transform = {
7777
mapping = {
7878
target: '',
7979
status: 'removed',
80-
removalMessage: 'Server auth removed in v2. Use an external auth library (e.g., better-auth).'
80+
removalMessage:
81+
'Server auth removed in v2. For RS auth, see @modelcontextprotocol/express. For full OAuth AS, see @modelcontextprotocol/server-auth-legacy (PR #1908).'
8182
};
8283
}
8384

@@ -220,7 +221,8 @@ function rewriteExportDeclarations(
220221
mapping = {
221222
target: '',
222223
status: 'removed',
223-
removalMessage: 'Server auth removed in v2. Use an external auth library (e.g., better-auth).'
224+
removalMessage:
225+
'Server auth removed in v2. For RS auth, see @modelcontextprotocol/express. For full OAuth AS, see @modelcontextprotocol/server-auth-legacy (PR #1908).'
224226
};
225227
}
226228

packages/codemod/src/migrations/v1-to-v2/transforms/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { mcpServerApiTransform } from './mcpServerApi.js';
77
import { mockPathsTransform } from './mockPaths.js';
88
import { removedApisTransform } from './removedApis.js';
99
import { schemaParamRemovalTransform } from './schemaParamRemoval.js';
10+
import { specSchemaAccessTransform } from './specSchemaAccess.js';
1011
import { symbolRenamesTransform } from './symbolRenames.js';
1112

1213
// Ordering matters — do not reorder without understanding dependencies:
@@ -30,7 +31,11 @@ import { symbolRenamesTransform } from './symbolRenames.js';
3031
// 5. handlerRegistration, schemaParamRemoval, and expressMiddleware are
3132
// independent of each other but all depend on importPaths having run.
3233
//
33-
// 6. mockPaths runs last: handles test mocks and dynamic imports,
34+
// 6. specSchemaAccess runs after handlerRegistration and schemaParamRemoval:
35+
// those transforms remove spec schema references they handle. specSchemaAccess
36+
// then processes remaining standalone usages (safeParse, parse, z.infer, etc.).
37+
//
38+
// 7. mockPaths runs last: handles test mocks and dynamic imports,
3439
// independent of the other transforms.
3540
export const v1ToV2Transforms: Transform[] = [
3641
importPathsTransform,
@@ -39,6 +44,7 @@ export const v1ToV2Transforms: Transform[] = [
3944
mcpServerApiTransform,
4045
handlerRegistrationTransform,
4146
schemaParamRemovalTransform,
47+
specSchemaAccessTransform,
4248
expressMiddlewareTransform,
4349
contextTypesTransform,
4450
mockPathsTransform

0 commit comments

Comments
 (0)