Skip to content

Commit 24025fd

Browse files
feat(plugin-mcp): migrate from @vercel/mcp-adapter to mcp-handler (#15661)
- Replace deprecated @vercel/mcp-adapter with mcp-handler - Bump @modelcontextprotocol/sdk from ~1.24.0 to 1.25.2 to address a security vulnerability. - Migrate all server.tool() calls to the new server.registerTool() API - Expose disableSse, onEvent, and redisUrl handler options. - Add integration tests for the onEvent callback.
1 parent 8953b37 commit 24025fd

File tree

27 files changed

+267
-103
lines changed

27 files changed

+267
-103
lines changed

packages/plugin-mcp/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@
4848
"pack:plugin": "pnpm build && pnpm pack"
4949
},
5050
"dependencies": {
51-
"@modelcontextprotocol/sdk": "~1.24.0",
51+
"@modelcontextprotocol/sdk": "1.25.2",
5252
"@types/json-schema": "7.0.15",
53-
"@vercel/mcp-adapter": "^1.0.0",
5453
"json-schema-to-zod": "2.6.1",
54+
"mcp-handler": "^1.0.7",
5555
"zod": "^3.25.50"
5656
},
5757
"devDependencies": {

packages/plugin-mcp/src/mcp/getMcpHandler.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { JSONSchema4 } from 'json-schema'
22

3-
import { createMcpHandler } from '@vercel/mcp-adapter'
3+
import { createMcpHandler } from 'mcp-handler'
44
import { join } from 'path'
55
import { APIError, configToJSONSchema, type PayloadRequest, type TypedUser } from 'payload'
66

@@ -260,10 +260,12 @@ export const getMCPHandler = (
260260
isToolEnabled,
261261
tool.name,
262262
() =>
263-
server.tool(
263+
server.registerTool(
264264
tool.name,
265-
tool.description,
266-
tool.parameters,
265+
{
266+
description: tool.description,
267+
inputSchema: tool.parameters,
268+
},
267269
payloadToolHandler(tool.handler),
268270
),
269271
payload,
@@ -507,9 +509,10 @@ export const getMCPHandler = (
507509
},
508510
{
509511
basePath: MCPHandlerOptions.basePath || payload.config.routes?.api || '/api',
512+
disableSse: MCPHandlerOptions.disableSse ?? true,
510513
maxDuration: MCPHandlerOptions.maxDuration || 60,
511-
// INFO: Disabled until developer clarity is reached for server side streaming and we have an auth pattern for all SSE patterns
512-
// redisUrl: MCPHandlerOptions.redisUrl || process.env.REDIS_URL,
514+
onEvent: MCPHandlerOptions.onEvent,
515+
redisUrl: MCPHandlerOptions.redisUrl,
513516
verboseLogs: useVerboseLogs,
514517
},
515518
)

packages/plugin-mcp/src/mcp/tools/auth/auth.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,12 @@ export const authTool = (server: McpServer, req: PayloadRequest, verboseLogs: bo
5858
}
5959
}
6060

61-
server.tool(
61+
server.registerTool(
6262
'auth',
63-
toolSchemas.auth.description,
64-
toolSchemas.auth.parameters.shape,
63+
{
64+
description: toolSchemas.auth.description,
65+
inputSchema: toolSchemas.auth.parameters.shape,
66+
},
6567
async ({ headers }) => {
6668
return await tool(headers)
6769
},

packages/plugin-mcp/src/mcp/tools/auth/forgotPassword.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,12 @@ export const forgotPasswordTool = (
5757
}
5858
}
5959

60-
server.tool(
60+
server.registerTool(
6161
'forgotPassword',
62-
toolSchemas.forgotPassword.description,
63-
toolSchemas.forgotPassword.parameters.shape,
62+
{
63+
description: toolSchemas.forgotPassword.description,
64+
inputSchema: toolSchemas.forgotPassword.parameters.shape,
65+
},
6466
async ({ collection, disableEmail, email }) => {
6567
return await tool(collection, email, disableEmail)
6668
},

packages/plugin-mcp/src/mcp/tools/auth/login.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ export const loginTool = (server: McpServer, req: PayloadRequest, verboseLogs: b
5959
}
6060
}
6161

62-
server.tool(
62+
server.registerTool(
6363
'login',
64-
toolSchemas.login.description,
65-
toolSchemas.login.parameters.shape,
64+
{
65+
description: toolSchemas.login.description,
66+
inputSchema: toolSchemas.login.parameters.shape,
67+
},
6668
async ({ collection, depth, email, overrideAccess, password, showHiddenFields }) => {
6769
return await tool(collection, email, password, depth, overrideAccess, showHiddenFields)
6870
},

packages/plugin-mcp/src/mcp/tools/auth/resetPassword.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,12 @@ export const resetPasswordTool = (server: McpServer, req: PayloadRequest, verbos
4848
}
4949
}
5050

51-
server.tool(
51+
server.registerTool(
5252
'resetPassword',
53-
toolSchemas.resetPassword.description,
54-
toolSchemas.resetPassword.parameters.shape,
53+
{
54+
description: toolSchemas.resetPassword.description,
55+
inputSchema: toolSchemas.resetPassword.parameters.shape,
56+
},
5557
async ({ collection, password, token }) => {
5658
return await tool(collection, token, password)
5759
},

packages/plugin-mcp/src/mcp/tools/auth/unlock.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,12 @@ export const unlockTool = (server: McpServer, req: PayloadRequest, verboseLogs:
5151
}
5252
}
5353

54-
server.tool(
54+
server.registerTool(
5555
'unlock',
56-
toolSchemas.unlock.description,
57-
toolSchemas.unlock.parameters.shape,
56+
{
57+
description: toolSchemas.unlock.description,
58+
inputSchema: toolSchemas.unlock.parameters.shape,
59+
},
5860
async ({ collection, email }) => {
5961
return await tool(collection, email)
6062
},

packages/plugin-mcp/src/mcp/tools/auth/verify.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,12 @@ export const verifyTool = (server: McpServer, req: PayloadRequest, verboseLogs:
4444
}
4545
}
4646

47-
server.tool(
47+
server.registerTool(
4848
'verify',
49-
toolSchemas.verify.description,
50-
toolSchemas.verify.parameters.shape,
49+
{
50+
description: toolSchemas.verify.description,
51+
inputSchema: toolSchemas.verify.parameters.shape,
52+
},
5153
async ({ collection, token }) => {
5254
return await tool(collection, token)
5355
},

packages/plugin-mcp/src/mcp/tools/collection/create.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,12 @@ export const createCollectionTool = (
225225
}
226226
}
227227

228-
server.tool(
228+
server.registerTool(
229229
'createCollection',
230-
toolSchemas.createCollection.description,
231-
toolSchemas.createCollection.parameters.shape,
230+
{
231+
description: toolSchemas.createCollection.description,
232+
inputSchema: toolSchemas.createCollection.parameters.shape,
233+
},
232234
async ({ collectionDescription, collectionName, fields, hasUpload }) => {
233235
return await tool(collectionName, collectionDescription, fields, hasUpload)
234236
},

packages/plugin-mcp/src/mcp/tools/collection/delete.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,12 @@ export const deleteCollectionTool = (
216216
}
217217
}
218218

219-
server.tool(
219+
server.registerTool(
220220
'deleteCollection',
221-
toolSchemas.deleteCollection.description,
222-
toolSchemas.deleteCollection.parameters.shape,
221+
{
222+
description: toolSchemas.deleteCollection.description,
223+
inputSchema: toolSchemas.deleteCollection.parameters.shape,
224+
},
223225
({ collectionName, confirmDeletion, updateConfig }) => {
224226
return tool(collectionName, confirmDeletion, updateConfig)
225227
},

0 commit comments

Comments
 (0)