Feat: Add Model Context Protocol (MCP) server to Next.js dev server (#84100)

This PR integrates an MCP server into the Next.js development server at
`/_next/mcp`, enabling AI agents to programmatically interact with
Next.js projects. We're including an initial `get_project_path.` tool as
an example that returns the project's absolute path - this serves as a
starting point to demonstrate how tools can expose project information
to MCP clients, with plans to expand the available tools for richer
AI-assisted development experiences.
This commit is contained in:
Jude Gao
2025-09-23 10:53:17 -04:00
committed by GitHub
parent 0f14e5333f
commit 58a6047955
16 changed files with 729 additions and 0 deletions
+1
View File
@@ -164,6 +164,7 @@
"@hapi/accept": "5.0.2",
"@jest/transform": "29.5.0",
"@jest/types": "29.5.0",
"@modelcontextprotocol/sdk": "1.18.1",
"@mswjs/interceptors": "0.23.0",
"@napi-rs/triples": "1.2.0",
"@next/font": "15.6.0-canary.23",
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -414,6 +414,7 @@ export const configSchema: zod.ZodType<NextConfig> = z.lazy(() =>
proxyTimeout: z.number().gte(0).optional(),
rootParams: z.boolean().optional(),
isolatedDevBuild: z.boolean().optional(),
mcpServer: z.boolean().optional(),
routerBFCache: z.boolean().optional(),
removeUncaughtErrorAndRejectionListeners: z.boolean().optional(),
validateRSCRequestHeaders: z.boolean().optional(),
@@ -836,6 +836,15 @@ export interface ExperimentalConfig {
* instead of `{distDir}`.
*/
isolatedDevBuild?: boolean
/**
* Enable the Model Context Protocol (MCP) server for AI-assisted development.
* When enabled, Next.js will expose an MCP server at `/_next/mcp` that provides
* code intelligence and project context to AI assistants.
*
* @default false
*/
mcpServer?: boolean
}
export type ExportPathMap = {
@@ -111,6 +111,7 @@ import {
getVersionInfo,
matchNextPageBundleRequest,
} from './hot-reloader-shared-utils'
import { getMcpMiddleware } from '../mcp/get-mcp-middleware'
const wsServer = new ws.Server({ noServer: true })
const isTestMode = !!(
@@ -732,6 +733,9 @@ export async function createHotReloaderTurbopack(
})
},
}),
...(nextConfig.experimental.mcpServer
? [getMcpMiddleware(projectPath)]
: []),
]
let versionInfoCached: ReturnType<typeof getVersionInfo> | undefined
@@ -104,6 +104,7 @@ import {
getVersionInfo,
matchNextPageBundleRequest,
} from './hot-reloader-shared-utils'
import { getMcpMiddleware } from '../mcp/get-mcp-middleware'
const MILLISECONDS_IN_NANOSECOND = BigInt(1_000_000)
@@ -1620,6 +1621,9 @@ export default class HotReloaderWebpack implements NextJsHotReloaderInterface {
})
},
}),
...(this.config.experimental.mcpServer
? [getMcpMiddleware(this.dir)]
: []),
]
}
@@ -0,0 +1,41 @@
import type { ServerResponse, IncomingMessage } from 'http'
import { getOrCreateMcpServer } from './get-or-create-mcp-server'
import { parseBody } from '../api-utils/node/parse-body'
import { StreamableHTTPServerTransport } from 'next/dist/compiled/@modelcontextprotocol/sdk/server/streamableHttp'
export function getMcpMiddleware(projectPath: string) {
return async function (
req: IncomingMessage,
res: ServerResponse,
next: () => void
): Promise<void> {
const { pathname } = new URL(req.url || '', 'http://n')
if (!pathname.startsWith('/_next/mcp')) {
return next()
}
const mcpServer = getOrCreateMcpServer(projectPath)
const transport = new StreamableHTTPServerTransport({
sessionIdGenerator: undefined,
})
try {
res.on('close', () => {
transport.close()
})
await mcpServer.connect(transport)
const parsedBody = await parseBody(req, 1024 * 1024) // 1MB limit
await transport.handleRequest(req, res, parsedBody)
} catch (error) {
if (!res.headersSent) {
res.statusCode = 500
res.setHeader('Content-Type', 'application/json; charset=utf-8')
res.end(
JSON.stringify({
jsonrpc: '2.0',
error: { code: -32000, message: 'Internal server error' },
id: null,
})
)
}
}
}
}
@@ -0,0 +1,57 @@
import { McpServer } from 'next/dist/compiled/@modelcontextprotocol/sdk/server/mcp'
let mcpServer: McpServer | undefined
export const getOrCreateMcpServer = (projectPath: string) => {
if (mcpServer) {
return mcpServer
}
mcpServer = new McpServer({
name: 'Next.js MCP Server',
version: '0.1.0',
})
mcpServer.registerTool(
'get_project_path',
{
description:
'Returns the absolute path of the root directory for this Next.js project.',
inputSchema: {},
},
async (_request) => {
try {
if (!projectPath) {
return {
content: [
{
type: 'text',
text: 'Unable to determine the absolute path of the Next.js project.',
},
],
}
}
return {
content: [
{
type: 'text',
text: projectPath,
},
],
}
} catch (error) {
return {
content: [
{
type: 'text',
text: `Error: ${error instanceof Error ? error.message : String(error)}`,
},
],
}
}
}
)
return mcpServer
}
+27
View File
@@ -2216,6 +2216,32 @@ export async function ncc_ws(task, opts) {
.target('src/compiled/ws')
}
// eslint-disable-next-line camelcase
export async function ncc_modelcontextprotocol_sdk(task, opts) {
await task
.source(
relative(
__dirname,
require.resolve('@modelcontextprotocol/sdk/server/mcp.js')
)
)
.ncc({
externals,
})
.target('src/compiled/@modelcontextprotocol/sdk/server')
await task
.source(
relative(
__dirname,
require.resolve('@modelcontextprotocol/sdk/server/streamableHttp.js')
)
)
.ncc({
externals,
})
.target('src/compiled/@modelcontextprotocol/sdk/server')
}
externals['path-to-regexp'] = 'next/dist/compiled/path-to-regexp'
export async function ncc_path_to_regexp(task, opts) {
await task
@@ -2421,6 +2447,7 @@ export async function ncc(task, opts) {
'ncc_busboy',
'ncc_mswjs_interceptors',
'ncc_rsc_poison_packages',
'ncc_modelcontextprotocol_sdk',
],
opts
)
+8
View File
@@ -746,6 +746,14 @@ declare module 'next/dist/compiled/ws' {
export = m
}
declare module 'next/dist/compiled/@modelcontextprotocol/sdk/server/mcp' {
export * from '@modelcontextprotocol/sdk/server/mcp'
}
declare module 'next/dist/compiled/@modelcontextprotocol/sdk/server/streamableHttp' {
export * from '@modelcontextprotocol/sdk/server/streamableHttp'
}
declare module 'next/dist/compiled/comment-json' {
import m from 'comment-json'
export = m
+419
View File
@@ -1093,6 +1093,9 @@ importers:
'@jest/types':
specifier: 29.5.0
version: 29.5.0
'@modelcontextprotocol/sdk':
specifier: 1.18.1
version: 1.18.1
'@mswjs/interceptors':
specifier: 0.23.0
version: 0.23.0
@@ -4357,6 +4360,10 @@ packages:
'@types/react': 19.1.13
react: 19.2.0-canary-d415fd3e-20250919
'@modelcontextprotocol/[email protected]':
resolution: {integrity: sha512-d//GE8/Yh7aC3e7p+kZG8JqqEAwwDUmAfvH1quogtbk+ksS6E0RR6toKKESPYYZVre0meqkJb27zb+dhqE9Sgw==}
engines: {node: '>=18'}
'@module-federation/[email protected]':
resolution: {integrity: sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==}
@@ -6611,6 +6618,10 @@ packages:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
@@ -7227,6 +7238,10 @@ packages:
resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
[email protected]:
resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
engines: {node: '>=18'}
[email protected]:
resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==}
@@ -7378,6 +7393,10 @@ packages:
resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==}
engines: {node: '>=8'}
[email protected]:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
@@ -7385,6 +7404,10 @@ packages:
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==}
engines: {node: '>=4'}
@@ -7891,6 +7914,10 @@ packages:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==}
engines: {node: '>= 0.6'}
@@ -7943,6 +7970,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
[email protected]:
resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
engines: {node: '>=6.6.0'}
[email protected]:
resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==}
engines: {node: '>= 0.6'}
@@ -8951,6 +8982,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-Olebo5gyh44OAXTd2BKdcbN5VaZOIKFzoeo9JUFwxDlGt6Sd8fUo6SKaLcafy8aP2UrsKmWDpsscsFEghMjeZA==}
[email protected]:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==}
@@ -9099,6 +9134,10 @@ packages:
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
@@ -9117,6 +9156,10 @@ packages:
resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
engines: {node: '>= 0.4'}
@@ -9530,6 +9573,14 @@ packages:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
[email protected]:
resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==}
engines: {node: '>=18.0.0'}
[email protected]:
resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
engines: {node: '>=18.0.0'}
[email protected]:
resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
@@ -9583,6 +9634,12 @@ packages:
resolution: {integrity: sha512-WVi2V4iHKw/vHEyye00Q9CSZz7KHDbJkJyteUI8kTih9jiyMl3bIk7wLYFcY9D1Blnadlyb5w5NBuNjQBow99g==}
engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0}
[email protected]:
resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==}
engines: {node: '>= 16'}
peerDependencies:
express: '>= 4.11'
[email protected]:
resolution: {integrity: sha512-1Z7/t3Z5ZnBG252gKUPyItc4xdeaA0X934ca2ewckAsVsw9EG71i++ZHZPYnus8g/s5Bty8IMpSVEuRkmwwPRQ==}
engines: {node: '>= 0.10.0'}
@@ -9591,6 +9648,10 @@ packages:
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
engines: {node: '>= 0.10.0'}
[email protected]:
resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==}
engines: {node: '>= 18'}
[email protected]:
resolution: {integrity: sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==}
@@ -9735,6 +9796,10 @@ packages:
resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
engines: {node: '>= 0.8'}
[email protected]:
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
engines: {node: '>= 0.8'}
[email protected]:
resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==}
engines: {node: '>=6'}
@@ -9884,6 +9949,10 @@ packages:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
engines: {node: '>= 0.8'}
[email protected]:
resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
@@ -10056,6 +10125,10 @@ packages:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
@@ -10075,6 +10148,10 @@ packages:
resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==}
engines: {node: '>=8'}
[email protected]:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==}
engines: {node: '>=0.10.0'}
@@ -10260,6 +10337,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
[email protected]:
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==}
engines: {node: '>=4'}
@@ -10359,6 +10440,10 @@ packages:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==}
@@ -10658,6 +10743,10 @@ packages:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==}
engines: {node: '>=0.10.0'}
[email protected]:
resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==}
@@ -11151,6 +11240,9 @@ packages:
[email protected]:
resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
[email protected]:
resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
[email protected]:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
@@ -12274,6 +12366,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
[email protected]:
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==}
engines: {node: '>=0.10.0'}
@@ -12403,6 +12499,10 @@ packages:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
engines: {node: '>= 0.8'}
[email protected]:
resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
engines: {node: '>= 4.0.0'}
@@ -12436,6 +12536,10 @@ packages:
[email protected]:
resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
[email protected]:
resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
engines: {node: '>=18'}
[email protected]:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -12692,6 +12796,10 @@ packages:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
engines: {node: '>= 0.6'}
@@ -12700,6 +12808,10 @@ packages:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
engines: {node: '>=4'}
@@ -13252,6 +13364,10 @@ packages:
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==}
engines: {node: '>= 0.4'}
@@ -13696,6 +13812,9 @@ packages:
[email protected]:
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
[email protected]:
resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
[email protected]:
resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==}
engines: {node: '>=0.10.0'}
@@ -13805,6 +13924,10 @@ packages:
resolution: {integrity: sha512-ugJ4Imy92u55zeznaN/5d7iqOBIZjZ7q10/T+dcd0IuFtbLlsGDvAUabFu1cafER+G9f0T1WtTqvzm4KAdcDgQ==}
engines: {node: '>=4.0.0', npm: '>=1.2.10'}
[email protected]:
resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==}
engines: {node: '>=16.20.0'}
[email protected]:
resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==}
engines: {node: '>=6'}
@@ -14736,6 +14859,7 @@ packages:
engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
deprecated: |-
You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.
(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)
[email protected]:
@@ -14750,6 +14874,10 @@ packages:
resolution: {integrity: sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==}
engines: {node: '>=0.6'}
[email protected]:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
[email protected]:
resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==}
engines: {node: '>=0.6'}
@@ -14824,6 +14952,10 @@ packages:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
engines: {node: '>= 0.8'}
[email protected]:
resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==}
engines: {node: '>= 0.10'}
[email protected]:
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
hasBin: true
@@ -15502,6 +15634,10 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
[email protected]:
resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
engines: {node: '>= 18'}
[email protected]:
resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
engines: {node: '>=18'}
@@ -15691,6 +15827,10 @@ packages:
resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'}
[email protected]:
resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==}
engines: {node: '>= 18'}
[email protected]:
resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
@@ -15718,6 +15858,10 @@ packages:
resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'}
[email protected]:
resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==}
engines: {node: '>= 18'}
[email protected]:
resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==}
@@ -15787,10 +15931,26 @@ packages:
[email protected]:
resolution: {integrity: sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA==}
[email protected]:
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@@ -16847,6 +17007,10 @@ packages:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==}
engines: {node: '>= 0.6'}
[email protected]:
resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==}
@@ -16892,6 +17056,7 @@ packages:
[email protected]:
resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==}
deprecated: You are using an outdated version of ua-parser-js. Please update to ua-parser-js v0.7.33 / v1.0.33 / v2.0.0 (or later) to avoid ReDoS vulnerability [CVE-2022-25927](https://github.com/advisories/GHSA-fhg7-m89q-25r3)
[email protected]:
resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==}
@@ -17860,6 +18025,11 @@ packages:
[email protected]:
resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==}
[email protected]:
resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==}
peerDependencies:
zod: ^3.24.1
[email protected]:
resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==}
engines: {node: '>=18.0.0'}
@@ -20990,6 +21160,23 @@ snapshots:
'@types/react': 19.1.13
react: 19.2.0-canary-d415fd3e-20250919
'@modelcontextprotocol/[email protected]':
dependencies:
ajv: 6.12.6
content-type: 1.0.5
cors: 2.8.5
cross-spawn: 7.0.6
eventsource: 3.0.7
eventsource-parser: 3.0.6
express: 5.1.0
express-rate-limit: 7.5.1([email protected])
pkce-challenge: 5.0.0
raw-body: 3.0.1
zod: 3.25.76
zod-to-json-schema: 3.24.6([email protected])
transitivePeerDependencies:
- supports-color
'@module-federation/[email protected]': {}
'@module-federation/[email protected]':
@@ -23671,6 +23858,11 @@ snapshots:
mime-types: 2.1.35
negotiator: 0.6.3
[email protected]:
dependencies:
mime-types: 3.0.1
negotiator: 1.0.0
[email protected]:
dependencies:
acorn: 8.14.0
@@ -24354,6 +24546,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
debug: 4.4.0
http-errors: 2.0.0
iconv-lite: 0.6.3
on-finished: 2.4.1
qs: 6.14.0
raw-body: 3.0.1
type-is: 2.0.1
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
fast-deep-equal: 3.1.3
@@ -24548,6 +24754,11 @@ snapshots:
package-hash: 4.0.0
write-file-atomic: 3.0.3
[email protected]:
dependencies:
es-errors: 1.3.0
function-bind: 1.1.2
[email protected]:
dependencies:
function-bind: 1.1.2
@@ -24561,6 +24772,11 @@ snapshots:
get-intrinsic: 1.2.4
set-function-length: 1.2.2
[email protected]:
dependencies:
call-bind-apply-helpers: 1.0.2
get-intrinsic: 1.3.0
[email protected]:
dependencies:
callsites: 2.0.0
@@ -25111,6 +25327,10 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
[email protected]:
dependencies:
safe-buffer: 5.2.1
[email protected]: {}
[email protected]: {}
@@ -25187,6 +25407,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -26314,6 +26536,12 @@ snapshots:
[email protected]: {}
[email protected]:
dependencies:
call-bind-apply-helpers: 1.0.2
es-errors: 1.3.0
gopd: 1.2.0
[email protected]: {}
[email protected]: {}
@@ -26517,6 +26745,8 @@ snapshots:
dependencies:
get-intrinsic: 1.2.4
[email protected]: {}
[email protected]: {}
[email protected]:
@@ -26554,6 +26784,10 @@ snapshots:
dependencies:
es-errors: 1.3.0
[email protected]:
dependencies:
es-errors: 1.3.0
[email protected]:
dependencies:
get-intrinsic: 1.2.4
@@ -27328,6 +27562,12 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]:
dependencies:
eventsource-parser: 3.0.6
[email protected]:
dependencies:
md5.js: 1.3.5
@@ -27428,6 +27668,10 @@ snapshots:
jest-mock: 30.0.0-alpha.6
jest-util: 30.0.0-alpha.6
[email protected]([email protected]):
dependencies:
express: 5.1.0
[email protected]:
dependencies:
accepts: 1.3.7
@@ -27499,6 +27743,38 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
accepts: 2.0.0
body-parser: 2.2.0
content-disposition: 1.0.0
content-type: 1.0.5
cookie: 0.7.1
cookie-signature: 1.2.2
debug: 4.4.0
encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
finalhandler: 2.1.0
fresh: 2.0.0
http-errors: 2.0.0
merge-descriptors: 2.0.0
mime-types: 3.0.1
on-finished: 2.4.1
once: 1.4.0
parseurl: 1.3.3
proxy-addr: 2.0.7
qs: 6.14.0
range-parser: 1.2.1
router: 2.2.0
send: 1.2.0
serve-static: 2.2.0
statuses: 2.0.1
type-is: 2.0.1
vary: 1.1.2
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
type: 2.5.0
@@ -27670,6 +27946,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
debug: 4.4.0
encodeurl: 2.0.0
escape-html: 1.0.3
on-finished: 2.4.1
parseurl: 1.3.3
statuses: 2.0.1
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
commondir: 1.0.1
@@ -27851,6 +28138,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -28053,6 +28342,19 @@ snapshots:
has-symbols: 1.0.3
hasown: 2.0.2
[email protected]:
dependencies:
call-bind-apply-helpers: 1.0.2
es-define-property: 1.0.1
es-errors: 1.3.0
es-object-atoms: 1.1.1
function-bind: 1.1.2
get-proto: 1.0.1
gopd: 1.2.0
has-symbols: 1.1.0
hasown: 2.0.2
math-intrinsics: 1.1.0
[email protected]: {}
[email protected]: {}
@@ -28069,6 +28371,11 @@ snapshots:
[email protected]: {}
[email protected]:
dependencies:
dunder-proto: 1.0.1
es-object-atoms: 1.1.1
[email protected]: {}
[email protected]: {}
@@ -28323,6 +28630,8 @@ snapshots:
dependencies:
get-intrinsic: 1.2.4
[email protected]: {}
[email protected]:
dependencies:
'@types/keyv': 3.1.1
@@ -28427,6 +28736,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]:
dependencies:
has-symbol-support-x: 1.4.2
@@ -28872,6 +29183,10 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
[email protected]:
dependencies:
safer-buffer: 2.1.2
[email protected]: {}
[email protected]([email protected]):
@@ -29318,6 +29633,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]:
dependencies:
'@types/estree': 1.0.7
@@ -30783,6 +31100,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]:
dependencies:
array-differ: 1.0.0
@@ -31126,6 +31445,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]:
dependencies:
fs-monkey: 1.0.6
@@ -31188,6 +31509,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]: {}
@@ -31817,6 +32140,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]:
dependencies:
mime-db: 1.33.0
@@ -31825,6 +32150,10 @@ snapshots:
dependencies:
mime-db: 1.52.0
[email protected]:
dependencies:
mime-db: 1.54.0
[email protected]: {}
[email protected]: {}
@@ -32413,6 +32742,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]: {}
[email protected]:
@@ -32933,6 +33264,8 @@ snapshots:
[email protected]: {}
[email protected]: {}
[email protected]:
dependencies:
graceful-fs: 4.2.11
@@ -33021,6 +33354,8 @@ snapshots:
postcss: 7.0.32
reduce-css-calc: 2.1.7
[email protected]: {}
[email protected]:
dependencies:
find-up: 3.0.0
@@ -34020,6 +34355,10 @@ snapshots:
dependencies:
side-channel: 1.0.6
[email protected]:
dependencies:
side-channel: 1.1.0
[email protected]: {}
[email protected]: {}
@@ -34084,6 +34423,13 @@ snapshots:
iconv-lite: 0.4.24
unpipe: 1.0.0
[email protected]:
dependencies:
bytes: 3.1.2
http-errors: 2.0.0
iconv-lite: 0.7.0
unpipe: 1.0.0
[email protected]:
dependencies:
deep-extend: 0.6.0
@@ -35041,6 +35387,16 @@ snapshots:
fsevents: 2.3.3
optional: true
[email protected]:
dependencies:
debug: 4.4.0
depd: 2.0.0
is-promise: 4.0.0
parseurl: 1.3.3
path-to-regexp: 8.3.0
transitivePeerDependencies:
- supports-color
[email protected]: {}
[email protected]: {}
@@ -35253,6 +35609,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
debug: 4.4.0
encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
fresh: 2.0.0
http-errors: 2.0.0
mime-types: 3.0.1
ms: 2.1.3
on-finished: 2.4.1
range-parser: 1.2.1
statuses: 2.0.1
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
no-case: 3.0.4
@@ -35311,6 +35683,15 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected]:
dependencies:
encodeurl: 2.0.0
escape-html: 1.0.3
parseurl: 1.3.3
send: 1.2.0
transitivePeerDependencies:
- supports-color
[email protected]: {}
[email protected]: {}
@@ -35411,6 +35792,26 @@ snapshots:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
[email protected]:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.4
[email protected]:
dependencies:
call-bound: 1.0.4
es-errors: 1.3.0
get-intrinsic: 1.3.0
object-inspect: 1.13.4
[email protected]:
dependencies:
call-bound: 1.0.4
es-errors: 1.3.0
get-intrinsic: 1.3.0
object-inspect: 1.13.4
side-channel-map: 1.0.1
[email protected]:
dependencies:
call-bind: 1.0.7
@@ -35418,6 +35819,14 @@ snapshots:
get-intrinsic: 1.2.4
object-inspect: 1.13.2
[email protected]:
dependencies:
es-errors: 1.3.0
object-inspect: 1.13.4
side-channel-list: 1.0.0
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
[email protected]:
optional: true
@@ -36558,6 +36967,12 @@ snapshots:
media-typer: 0.3.0
mime-types: 2.1.35
[email protected]:
dependencies:
content-type: 1.0.5
media-typer: 1.1.0
mime-types: 3.0.1
[email protected]: {}
[email protected]: {}
@@ -37846,6 +38261,10 @@ snapshots:
[email protected]: {}
[email protected]([email protected]):
dependencies:
zod: 3.25.76
[email protected]([email protected]):
dependencies:
zod: 3.25.76
@@ -0,0 +1,11 @@
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
@@ -0,0 +1,3 @@
export default function Page() {
return <h1>Test MCP Server Page</h1>
}
@@ -0,0 +1,5 @@
module.exports = {
experimental: {
mcpServer: true,
},
}
@@ -0,0 +1,135 @@
import { FileRef, nextTestSetup } from 'e2e-utils'
import path from 'path'
describe('mcp-server', () => {
const { next } = nextTestSetup({
files: new FileRef(path.join(__dirname, 'fixtures', 'default-template')),
})
async function initializeMCPSession(
mcpEndpoint: string,
id: string
): Promise<any> {
const initResponse = await fetch(mcpEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json, text/event-stream',
},
body: JSON.stringify({
jsonrpc: '2.0',
id,
method: 'initialize',
params: {
protocolVersion: '1.0.0',
capabilities: {},
clientInfo: {
name: 'test-client',
version: '1.0.0',
},
},
}),
})
const initText = await initResponse.text()
const dataMatch = initText.match(/data: ({.*})/s)
if (!dataMatch) {
throw new Error(`Unexpected response format: ${initText}`)
}
const initResult = JSON.parse(dataMatch[1])
if (initResult.error) {
throw new Error(`MCP error: ${JSON.stringify(initResult.error)}`)
}
return initResult
}
it('should initialize MCP server and list available tools', async () => {
const mcpEndpoint = `${next.url}/_next/mcp`
// Initialize MCP session
const initResult = await initializeMCPSession(mcpEndpoint, 'init-1')
expect(initResult.jsonrpc).toBe('2.0')
expect(initResult.id).toBe('init-1')
expect(initResult.result?.serverInfo?.name).toBe('Next.js MCP Server')
// List available tools
const listToolsResponse = await fetch(mcpEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json, text/event-stream',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'list-tools-1',
method: 'tools/list',
params: {},
}),
})
const listToolsText = await listToolsResponse.text()
const listToolsDataMatch = listToolsText.match(/data: ({.*})/s)
if (!listToolsDataMatch) {
throw new Error(`Unexpected response format: ${listToolsText}`)
}
const listToolsResult = JSON.parse(listToolsDataMatch[1])
expect(listToolsResult.result?.tools).toBeInstanceOf(Array)
const projectDirTool = listToolsResult.result?.tools?.find(
(tool: { name: string }) => tool.name === 'get_project_path'
)
expect(projectDirTool).toBeDefined()
expect(projectDirTool?.description).toBe(
'Returns the absolute path of the root directory for this Next.js project.'
)
})
it('should return exact absolute path for get_project_path tool', async () => {
const mcpEndpoint = `${next.url}/_next/mcp`
// Initialize MCP session (required before calling tools)
await initializeMCPSession(mcpEndpoint, 'init-2')
// Call get_project_path tool and verify response
const callToolResponse = await fetch(mcpEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json, text/event-stream',
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 'call-tool-1',
method: 'tools/call',
params: {
name: 'get_project_path',
arguments: {},
},
}),
})
const callToolText = await callToolResponse.text()
const callToolDataMatch = callToolText.match(/data: ({.*})/s)
if (!callToolDataMatch) {
throw new Error(`Unexpected response format: ${callToolText}`)
}
const callToolResult = JSON.parse(callToolDataMatch[1])
expect(callToolResult.jsonrpc).toBe('2.0')
expect(callToolResult.id).toBe('call-tool-1')
const content = callToolResult.result?.content
expect(content).toBeInstanceOf(Array)
expect(content?.[0]?.type).toBe('text')
// Get the actual project path from the response
const actualProjectPath = content?.[0]?.text
// Project directory should match the test directory from the test harness
expect(actualProjectPath).toBe(next.testDir)
})
})