skybridge 0.0.0-dev.b6c9d23 → 0.0.0-dev.b6f5d60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +2 -0
  2. package/dist/cli/build-helpers.d.ts +3 -2
  3. package/dist/cli/build-helpers.js +22 -8
  4. package/dist/cli/build-helpers.js.map +1 -1
  5. package/dist/cli/build-helpers.test.js +46 -3
  6. package/dist/cli/build-helpers.test.js.map +1 -1
  7. package/dist/cli/build-steps.js +10 -5
  8. package/dist/cli/build-steps.js.map +1 -1
  9. package/dist/cli/build-steps.test.js +3 -3
  10. package/dist/cli/build-steps.test.js.map +1 -1
  11. package/dist/cli/resolve-skybridge-config.d.ts +5 -0
  12. package/dist/cli/{resolve-views-dir.js → resolve-skybridge-config.js} +4 -3
  13. package/dist/cli/resolve-skybridge-config.js.map +1 -0
  14. package/dist/cli/use-execute-steps.d.ts +1 -1
  15. package/dist/cli/use-nodemon.js +1 -1
  16. package/dist/cli/use-nodemon.js.map +1 -1
  17. package/dist/commands/dev.js +3 -3
  18. package/dist/commands/dev.js.map +1 -1
  19. package/dist/context-warnings.d.ts +5 -0
  20. package/dist/context-warnings.js +31 -0
  21. package/dist/context-warnings.js.map +1 -0
  22. package/dist/context-warnings.test.js +28 -0
  23. package/dist/context-warnings.test.js.map +1 -0
  24. package/dist/server/auth/index.d.ts +30 -4
  25. package/dist/server/auth/index.js.map +1 -1
  26. package/dist/server/auth/providers/auth0.d.ts +24 -2
  27. package/dist/server/auth/providers/auth0.js.map +1 -1
  28. package/dist/server/auth/providers/auth0.test.js +4 -2
  29. package/dist/server/auth/providers/auth0.test.js.map +1 -1
  30. package/dist/server/auth/providers/authplane.d.ts +49 -0
  31. package/dist/server/auth/providers/authplane.js +57 -0
  32. package/dist/server/auth/providers/authplane.js.map +1 -0
  33. package/dist/server/auth/providers/authplane.test.js +140 -0
  34. package/dist/server/auth/providers/authplane.test.js.map +1 -0
  35. package/dist/server/auth/providers/clerk.d.ts +39 -2
  36. package/dist/server/auth/providers/clerk.js +4 -1
  37. package/dist/server/auth/providers/clerk.js.map +1 -1
  38. package/dist/server/auth/providers/clerk.test.js +5 -3
  39. package/dist/server/auth/providers/clerk.test.js.map +1 -1
  40. package/dist/server/auth/providers/custom.d.ts +15 -5
  41. package/dist/server/auth/providers/custom.js +25 -9
  42. package/dist/server/auth/providers/custom.js.map +1 -1
  43. package/dist/server/auth/providers/custom.test.js +46 -16
  44. package/dist/server/auth/providers/custom.test.js.map +1 -1
  45. package/dist/server/auth/providers/descope.d.ts +31 -2
  46. package/dist/server/auth/providers/descope.js +12 -3
  47. package/dist/server/auth/providers/descope.js.map +1 -1
  48. package/dist/server/auth/providers/descope.test.js +42 -19
  49. package/dist/server/auth/providers/descope.test.js.map +1 -1
  50. package/dist/server/auth/providers/stytch.d.ts +15 -2
  51. package/dist/server/auth/providers/stytch.js +4 -1
  52. package/dist/server/auth/providers/stytch.js.map +1 -1
  53. package/dist/server/auth/providers/verify-spy.d.ts +12 -0
  54. package/dist/server/auth/providers/verify-spy.js +21 -0
  55. package/dist/server/auth/providers/verify-spy.js.map +1 -0
  56. package/dist/server/auth/providers/workos.d.ts +24 -2
  57. package/dist/server/auth/providers/workos.js +4 -1
  58. package/dist/server/auth/providers/workos.js.map +1 -1
  59. package/dist/server/auth/security-schemes.d.ts +23 -0
  60. package/dist/server/auth/security-schemes.js +64 -0
  61. package/dist/server/auth/security-schemes.js.map +1 -0
  62. package/dist/server/auth/security-schemes.test.js +99 -0
  63. package/dist/server/auth/security-schemes.test.js.map +1 -0
  64. package/dist/server/auth/setup.d.ts +3 -1
  65. package/dist/server/auth/setup.js +65 -24
  66. package/dist/server/auth/setup.js.map +1 -1
  67. package/dist/server/auth/setup.test.js +328 -5
  68. package/dist/server/auth/setup.test.js.map +1 -1
  69. package/dist/server/auth/verify.d.ts +37 -3
  70. package/dist/server/auth/verify.js +26 -2
  71. package/dist/server/auth/verify.js.map +1 -1
  72. package/dist/server/auth/verify.test.js +49 -0
  73. package/dist/server/auth/verify.test.js.map +1 -1
  74. package/dist/server/auth-extra.test-d.js +82 -0
  75. package/dist/server/auth-extra.test-d.js.map +1 -0
  76. package/dist/server/auth.d.ts +39 -1
  77. package/dist/server/auth.js.map +1 -1
  78. package/dist/server/host.d.ts +2 -0
  79. package/dist/server/host.js +11 -0
  80. package/dist/server/host.js.map +1 -0
  81. package/dist/server/host.test.d.ts +1 -0
  82. package/dist/server/host.test.js +13 -0
  83. package/dist/server/host.test.js.map +1 -0
  84. package/dist/server/index.d.ts +11 -7
  85. package/dist/server/index.js +6 -2
  86. package/dist/server/index.js.map +1 -1
  87. package/dist/server/middleware.d.ts +31 -6
  88. package/dist/server/middleware.js +33 -0
  89. package/dist/server/middleware.js.map +1 -1
  90. package/dist/server/middleware.test.js +37 -1
  91. package/dist/server/middleware.test.js.map +1 -1
  92. package/dist/server/register-tool.test.d.ts +1 -0
  93. package/dist/server/register-tool.test.js +26 -0
  94. package/dist/server/register-tool.test.js.map +1 -0
  95. package/dist/server/server.d.ts +70 -21
  96. package/dist/server/server.js +137 -21
  97. package/dist/server/server.js.map +1 -1
  98. package/dist/server/skills-integration.test.d.ts +1 -0
  99. package/dist/server/skills-integration.test.js +79 -0
  100. package/dist/server/skills-integration.test.js.map +1 -0
  101. package/dist/server/skills.d.ts +29 -0
  102. package/dist/server/skills.js +195 -0
  103. package/dist/server/skills.js.map +1 -0
  104. package/dist/server/skills.test.d.ts +1 -0
  105. package/dist/server/skills.test.js +247 -0
  106. package/dist/server/skills.test.js.map +1 -0
  107. package/dist/server/viewsDevServer.js +4 -1
  108. package/dist/server/viewsDevServer.js.map +1 -1
  109. package/dist/test/utils.d.ts +3 -3
  110. package/dist/test/view.test.js +19 -3
  111. package/dist/test/view.test.js.map +1 -1
  112. package/dist/views/index.d.ts +3 -0
  113. package/dist/views/index.js +3 -0
  114. package/dist/views/index.js.map +1 -0
  115. package/dist/{web/plugin → views}/scan-views.js +1 -1
  116. package/dist/views/scan-views.js.map +1 -0
  117. package/dist/views/scan-views.test.d.ts +1 -0
  118. package/dist/views/scan-views.test.js.map +1 -0
  119. package/dist/views/validate-view.d.ts +1 -0
  120. package/dist/{web/plugin → views}/validate-view.js +2 -2
  121. package/dist/views/validate-view.js.map +1 -0
  122. package/dist/views/validate-view.test.d.ts +1 -0
  123. package/dist/views/validate-view.test.js.map +1 -0
  124. package/dist/web/bridges/adaptor.js +14 -17
  125. package/dist/web/bridges/adaptor.js.map +1 -1
  126. package/dist/web/bridges/adaptor.test.js +23 -6
  127. package/dist/web/bridges/adaptor.test.js.map +1 -1
  128. package/dist/web/bridges/mcp-app/bridge.js +5 -3
  129. package/dist/web/bridges/mcp-app/bridge.js.map +1 -1
  130. package/dist/web/bridges/mcp-app/types.d.ts +2 -0
  131. package/dist/web/bridges/mcp-app/types.js.map +1 -1
  132. package/dist/web/data-llm.test.js +3 -2
  133. package/dist/web/data-llm.test.js.map +1 -1
  134. package/dist/web/hooks/index.d.ts +1 -0
  135. package/dist/web/hooks/index.js +1 -0
  136. package/dist/web/hooks/index.js.map +1 -1
  137. package/dist/web/hooks/test/utils.d.ts +2 -1
  138. package/dist/web/hooks/test/utils.js +1 -1
  139. package/dist/web/hooks/test/utils.js.map +1 -1
  140. package/dist/web/hooks/use-host-info.d.ts +22 -0
  141. package/dist/web/hooks/use-host-info.js +30 -0
  142. package/dist/web/hooks/use-host-info.js.map +1 -0
  143. package/dist/web/hooks/use-host-info.test.d.ts +1 -0
  144. package/dist/web/hooks/use-host-info.test.js +59 -0
  145. package/dist/web/hooks/use-host-info.test.js.map +1 -0
  146. package/dist/web/hooks/use-view-state.js +19 -9
  147. package/dist/web/hooks/use-view-state.js.map +1 -1
  148. package/dist/web/hooks/use-view-state.test.js +31 -0
  149. package/dist/web/hooks/use-view-state.test.js.map +1 -1
  150. package/package.json +9 -10
  151. package/dist/cli/resolve-views-dir.d.ts +0 -1
  152. package/dist/cli/resolve-views-dir.js.map +0 -1
  153. package/dist/web/plugin/data-llm.test.js +0 -81
  154. package/dist/web/plugin/data-llm.test.js.map +0 -1
  155. package/dist/web/plugin/plugin.d.ts +0 -33
  156. package/dist/web/plugin/plugin.js +0 -188
  157. package/dist/web/plugin/plugin.js.map +0 -1
  158. package/dist/web/plugin/scan-views.js.map +0 -1
  159. package/dist/web/plugin/scan-views.test.js.map +0 -1
  160. package/dist/web/plugin/transform-data-llm.d.ts +0 -12
  161. package/dist/web/plugin/transform-data-llm.js +0 -96
  162. package/dist/web/plugin/transform-data-llm.js.map +0 -1
  163. package/dist/web/plugin/transform-data-llm.test.js +0 -81
  164. package/dist/web/plugin/transform-data-llm.test.js.map +0 -1
  165. package/dist/web/plugin/validate-view.d.ts +0 -1
  166. package/dist/web/plugin/validate-view.js.map +0 -1
  167. package/dist/web/plugin/validate-view.test.js.map +0 -1
  168. /package/dist/{web/plugin/data-llm.test.d.ts → context-warnings.test.d.ts} +0 -0
  169. /package/dist/{web/plugin/transform-data-llm.test.d.ts → server/auth/providers/authplane.test.d.ts} +0 -0
  170. /package/dist/{web/plugin/validate-view.test.d.ts → server/auth/security-schemes.test.d.ts} +0 -0
  171. /package/dist/{web/plugin/scan-views.test.d.ts → server/auth-extra.test-d.d.ts} +0 -0
  172. /package/dist/{web/plugin → views}/scan-views.d.ts +0 -0
  173. /package/dist/{web/plugin → views}/scan-views.test.js +0 -0
  174. /package/dist/{web/plugin → views}/validate-view.test.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n CallToolResult,\n CancelTaskResult,\n ClientNotification,\n ClientRequest,\n CompleteResult,\n EmptyResult,\n GetPromptResult,\n GetTaskPayloadResult,\n GetTaskResult,\n InitializeResult,\n ListPromptsResult,\n ListResourcesResult,\n ListResourceTemplatesResult,\n ListTasksResult,\n ListToolsResult,\n ReadResourceResult,\n ServerNotification,\n ServerRequest,\n ServerResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\n/**\n * The `extra` context object provided by the MCP SDK to request handlers.\n */\nexport type McpExtra = RequestHandlerExtra<ServerRequest, ServerNotification>;\n\n/**\n * A single MCP middleware function following the onion model.\n * Call `next()` to invoke the next middleware or the final handler.\n * For notifications, `extra` is `undefined` (SDK does not provide extra context)\n * and `next()` resolves to `undefined`.\n */\nexport type McpMiddlewareFn = (\n request: { method: string; params: Record<string, unknown> },\n extra: McpExtra | undefined,\n next: () => Promise<unknown>,\n) => Promise<unknown> | unknown;\n\n/**\n * MCP methods the server handles (incoming from client).\n */\nexport type McpMethodString =\n | ClientRequest[\"method\"]\n | ClientNotification[\"method\"];\n\n/**\n * Resolve the `params` type for a specific MCP method (request or notification)\n * from the SDK's typed unions. Falls back to `Record<string, unknown>` for\n * unknown methods. Used by {@link McpTypedMiddlewareFn} to narrow the request\n * shape in typed middleware.\n */\nexport type McpRequestParams<M extends string> =\n Extract<ClientRequest, { method: M }> extends { params: infer P }\n ? P\n : Extract<ClientNotification, { method: M }> extends { params: infer P }\n ? P\n : Record<string, unknown>;\n\n/**\n * Resolve the `extra` arg type for a specific MCP method: {@link McpExtra} for\n * request methods, `undefined` for notification methods (the SDK does not\n * pass extra context for notifications).\n */\nexport type McpExtraFor<M extends string> = M extends ClientRequest[\"method\"]\n ? McpExtra\n : M extends ClientNotification[\"method\"]\n ? undefined\n : McpExtra | undefined;\n\n/** Maps each MCP request method to its SDK result type. */\ninterface McpResultMap {\n ping: EmptyResult;\n initialize: InitializeResult;\n \"tools/list\": ListToolsResult;\n \"tools/call\": CallToolResult;\n \"resources/list\": ListResourcesResult;\n \"resources/templates/list\": ListResourceTemplatesResult;\n \"resources/read\": ReadResourceResult;\n \"resources/subscribe\": EmptyResult;\n \"resources/unsubscribe\": EmptyResult;\n \"prompts/list\": ListPromptsResult;\n \"prompts/get\": GetPromptResult;\n \"completion/complete\": CompleteResult;\n \"logging/setLevel\": EmptyResult;\n \"tasks/get\": GetTaskResult;\n \"tasks/result\": GetTaskPayloadResult;\n \"tasks/list\": ListTasksResult;\n \"tasks/cancel\": CancelTaskResult;\n}\n\n/**\n * Map an MCP method string to its corresponding result type.\n * For request methods, resolves to the specific SDK result type.\n * For wildcard patterns (e.g. `\"tools/*\"`), resolves to the union of matching result types.\n * For notification methods, resolves to `undefined`.\n * For unknown/unmatched methods, falls back to `ServerResult`.\n */\nexport type McpResultFor<M extends string> = M extends keyof McpResultMap\n ? McpResultMap[M]\n : M extends `${infer Prefix}/*`\n ? [McpResultMap[keyof McpResultMap & `${Prefix}/${string}`]] extends [never]\n ? M extends ToWildcard<ClientNotification[\"method\"]>\n ? undefined\n : ServerResult\n : McpResultMap[keyof McpResultMap & `${Prefix}/${string}`]\n : M extends ClientNotification[\"method\"]\n ? undefined\n : ServerResult;\n\n/**\n * Typed middleware function for a specific method. Narrows `request.params`\n * via {@link McpRequestParams}, `extra` via {@link McpExtraFor}, and the\n * resolved value of `next()` via {@link McpResultFor}.\n */\nexport type McpTypedMiddlewareFn<M extends string> = (\n request: { method: M; params: McpRequestParams<M> },\n extra: McpExtraFor<M>,\n next: () => Promise<McpResultFor<M>>,\n) => Promise<unknown> | unknown;\n\n/** Extracts `\"prefix/*\"` from `\"prefix/anything\"` — distributive over unions. */\ntype ToWildcard<T extends string> = T extends `${infer Prefix}/${string}`\n ? `${Prefix}/*`\n : never;\n\n/** Wildcard prefixes derived from method strings (e.g. `\"tools/*\"` from `\"tools/call\"`). */\nexport type McpWildcard = ToWildcard<McpMethodString>;\n\n/** Category keywords matching all requests or all notifications. */\ntype McpCategory = \"request\" | \"notification\";\n\n/**\n * A single filter pattern for MCP middleware:\n * - Exact method: `\"tools/call\"`\n * - Wildcard: `\"tools/*\"`\n * - Category: `\"request\"` | `\"notification\"`\n * - Escape hatch: arbitrary string via `string & {}`\n */\ntype McpMiddlewareFilterPattern =\n | McpMethodString\n | McpWildcard\n | McpCategory\n | (string & {});\n\n/**\n * Filter determining which MCP methods a middleware applies to.\n * A single pattern or an array of patterns (OR logic).\n */\nexport type McpMiddlewareFilter =\n | McpMiddlewareFilterPattern\n | McpMiddlewareFilterPattern[];\n\n/**\n * Internal entry stored for each registered middleware.\n * `filter: null` means catch-all (matches everything).\n */\nexport type McpMiddlewareEntry = {\n filter: McpMiddlewareFilter | null;\n handler: McpMiddlewareFn;\n};\n\ntype HandlerMap = Map<string, (...args: unknown[]) => Promise<unknown>>;\n\n/**\n * Extract the TS-private `_requestHandlers` and `_notificationHandlers` maps\n * from the SDK's `Server` (extends `Protocol`). These are runtime-accessible\n * but declared `private` in TypeScript.\n *\n * Validates with `instanceof Map` so an incompatible SDK version fails fast\n * instead of silently breaking.\n */\nexport function getHandlerMaps(server: Server) {\n const obj: object = server;\n\n if (\n !(\"_requestHandlers\" in obj && obj._requestHandlers instanceof Map) ||\n !(\n \"_notificationHandlers\" in obj && obj._notificationHandlers instanceof Map\n )\n ) {\n throw new Error(\n \"Incompatible MCP SDK version: expected _requestHandlers and _notificationHandlers on Server\",\n );\n }\n\n return {\n requestHandlers: obj._requestHandlers as HandlerMap,\n notificationHandlers: obj._notificationHandlers as HandlerMap,\n };\n}\n\n/**\n * Check if a single filter pattern matches a given method.\n *\n * - Exact: `\"tools/call\"` matches only `\"tools/call\"`\n * - Wildcard: `\"tools/*\"` matches any method starting with `\"tools/\"`\n * - Category `\"request\"`: matches when `isNotification` is false\n * - Category `\"notification\"`: matches when `isNotification` is true\n */\nexport function matchesFilter(\n method: string,\n filter: string,\n isNotification: boolean,\n): boolean {\n if (filter === \"request\") {\n return !isNotification;\n }\n if (filter === \"notification\") {\n return isNotification;\n }\n if (filter.endsWith(\"/*\")) {\n const prefix = filter.slice(0, -1); // \"tools/*\" → \"tools/\"\n return method.startsWith(prefix);\n }\n return method === filter;\n}\n\nfunction matchesAnyFilter(\n method: string,\n filter: McpMiddlewareFilter | null,\n isNotification: boolean,\n): boolean {\n if (filter === null) {\n return true;\n }\n if (typeof filter === \"string\") {\n return matchesFilter(method, filter, isNotification);\n }\n return filter.some((pattern) =>\n matchesFilter(method, pattern, isNotification),\n );\n}\n\n/**\n * Build an onion-model middleware chain for a specific method.\n *\n * Filters `entries` to those matching `method`, then composes them\n * so the first registered middleware is the outermost layer.\n * `next()` is guarded against multiple calls within a single middleware.\n */\nexport function buildMiddlewareChain(\n method: string,\n isNotification: boolean,\n originalHandler: (...args: unknown[]) => Promise<unknown>,\n entries: McpMiddlewareEntry[],\n) {\n const applicable = entries.filter((entry) =>\n matchesAnyFilter(method, entry.filter, isNotification),\n );\n\n if (applicable.length === 0) {\n return originalHandler;\n }\n\n return (...args: unknown[]) => {\n const rawRequest = args[0] as Record<string, unknown> | undefined;\n // SDK calls request handlers as handler(request, extra) but\n // notification handlers as handler(notification) — no extra arg.\n const extra = isNotification ? undefined : (args[1] as McpExtra);\n const mcpRequest = {\n method,\n params: (rawRequest?.params as Record<string, unknown>) ?? {},\n };\n\n let index = 0;\n\n const executeLayer = (): Promise<unknown> => {\n const entry = applicable[index++];\n if (!entry) {\n if (rawRequest) {\n rawRequest.params = mcpRequest.params;\n }\n return originalHandler(...args);\n }\n\n let nextCalled = false;\n\n const next = (): Promise<unknown> => {\n if (nextCalled) {\n throw new Error(\n `next() called multiple times in middleware for \"${method}\"`,\n );\n }\n nextCalled = true;\n return executeLayer();\n };\n\n return Promise.resolve(entry.handler(mcpRequest, extra, next));\n };\n\n return executeLayer();\n };\n}\n"]}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport type { RequestHandlerExtra } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport type {\n CallToolResult,\n CancelTaskResult,\n ClientNotification,\n ClientRequest,\n CompleteResult,\n EmptyResult,\n GetPromptResult,\n GetTaskPayloadResult,\n GetTaskResult,\n InitializeResult,\n ListPromptsResult,\n ListResourcesResult,\n ListResourceTemplatesResult,\n ListTasksResult,\n ListToolsResult,\n ReadResourceResult,\n ServerNotification,\n ServerRequest,\n ServerResult,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type { AuthInfo, ExtraClaims } from \"./auth.js\";\n\n/**\n * The `extra` context object provided by the MCP SDK to request handlers.\n */\nexport type McpExtra<TAuthExtra extends ExtraClaims = ExtraClaims> = Omit<\n RequestHandlerExtra<ServerRequest, ServerNotification>,\n \"authInfo\"\n> & {\n authInfo?: AuthInfo<TAuthExtra>;\n};\n\n/**\n * A single MCP middleware function following the onion model.\n * Call `next()` to invoke the next middleware or the final handler.\n * For notifications, `extra` is `undefined` (SDK does not provide extra context)\n * and `next()` resolves to `undefined`.\n */\nexport type McpMiddlewareFn<TAuthExtra extends ExtraClaims = ExtraClaims> = (\n request: { method: string; params: Record<string, unknown> },\n extra: McpExtra<TAuthExtra> | undefined,\n next: () => Promise<unknown>,\n) => Promise<unknown> | unknown;\n\nconst TOOL_ERROR = Symbol.for(\"skybridge.toolError\");\n\nfunction toolErrorSlot(\n extra: McpExtra | undefined,\n): Record<symbol, unknown> | undefined {\n return extra as unknown as Record<symbol, unknown> | undefined;\n}\n\nexport function captureToolError(\n extra: McpExtra | undefined,\n error: unknown,\n): void {\n const slot = toolErrorSlot(extra);\n if (slot) {\n slot[TOOL_ERROR] = error;\n }\n}\n\n/**\n * Retrieve the error a tool handler threw during this request, if any.\n *\n * The MCP SDK catches anything a tool handler throws and turns it into an\n * `isError` tool result, so `await next()` in middleware resolves normally and\n * the original `Error` — stack, `cause` — is lost. Skybridge stores it on\n * `extra` (never serialized to the client) so observability middleware can\n * report it:\n *\n * ```ts\n * server.mcpMiddleware(\"tools/call\", async (request, extra, next) => {\n * const result = await next();\n * const error = getToolError(extra);\n * if (error) {\n * Sentry.captureException(error);\n * }\n * return result;\n * });\n * ```\n */\nexport function getToolError(extra: McpExtra | undefined): unknown {\n return toolErrorSlot(extra)?.[TOOL_ERROR];\n}\n\n/**\n * MCP methods the server handles (incoming from client).\n */\nexport type McpMethodString =\n | ClientRequest[\"method\"]\n | ClientNotification[\"method\"];\n\n/**\n * Resolve the `params` type for a specific MCP method (request or notification)\n * from the SDK's typed unions. Falls back to `Record<string, unknown>` for\n * unknown methods. Used by {@link McpTypedMiddlewareFn} to narrow the request\n * shape in typed middleware.\n */\nexport type McpRequestParams<M extends string> =\n Extract<ClientRequest, { method: M }> extends { params: infer P }\n ? P\n : Extract<ClientNotification, { method: M }> extends { params: infer P }\n ? P\n : Record<string, unknown>;\n\n/**\n * Resolve the `extra` arg type for a specific MCP method: {@link McpExtra} for\n * request methods, `undefined` for notification methods (the SDK does not\n * pass extra context for notifications).\n */\nexport type McpExtraFor<\n M extends string,\n TAuthExtra extends ExtraClaims = ExtraClaims,\n> = M extends ClientRequest[\"method\"]\n ? McpExtra<TAuthExtra>\n : M extends ClientNotification[\"method\"]\n ? undefined\n : McpExtra<TAuthExtra> | undefined;\n\n/** Maps each MCP request method to its SDK result type. */\ninterface McpResultMap {\n ping: EmptyResult;\n initialize: InitializeResult;\n \"tools/list\": ListToolsResult;\n \"tools/call\": CallToolResult;\n \"resources/list\": ListResourcesResult;\n \"resources/templates/list\": ListResourceTemplatesResult;\n \"resources/read\": ReadResourceResult;\n \"resources/subscribe\": EmptyResult;\n \"resources/unsubscribe\": EmptyResult;\n \"prompts/list\": ListPromptsResult;\n \"prompts/get\": GetPromptResult;\n \"completion/complete\": CompleteResult;\n \"logging/setLevel\": EmptyResult;\n \"tasks/get\": GetTaskResult;\n \"tasks/result\": GetTaskPayloadResult;\n \"tasks/list\": ListTasksResult;\n \"tasks/cancel\": CancelTaskResult;\n}\n\n/**\n * Map an MCP method string to its corresponding result type.\n * For request methods, resolves to the specific SDK result type.\n * For wildcard patterns (e.g. `\"tools/*\"`), resolves to the union of matching result types.\n * For notification methods, resolves to `undefined`.\n * For unknown/unmatched methods, falls back to `ServerResult`.\n */\nexport type McpResultFor<M extends string> = M extends keyof McpResultMap\n ? McpResultMap[M]\n : M extends `${infer Prefix}/*`\n ? [McpResultMap[keyof McpResultMap & `${Prefix}/${string}`]] extends [never]\n ? M extends ToWildcard<ClientNotification[\"method\"]>\n ? undefined\n : ServerResult\n : McpResultMap[keyof McpResultMap & `${Prefix}/${string}`]\n : M extends ClientNotification[\"method\"]\n ? undefined\n : ServerResult;\n\n/**\n * Typed middleware function for a specific method. Narrows `request.params`\n * via {@link McpRequestParams}, `extra` via {@link McpExtraFor}, and the\n * resolved value of `next()` via {@link McpResultFor}.\n */\nexport type McpTypedMiddlewareFn<\n M extends string,\n TAuthExtra extends ExtraClaims = ExtraClaims,\n> = (\n request: { method: M; params: McpRequestParams<M> },\n extra: McpExtraFor<M, TAuthExtra>,\n next: () => Promise<McpResultFor<M>>,\n) => Promise<unknown> | unknown;\n\n/** Extracts `\"prefix/*\"` from `\"prefix/anything\"` — distributive over unions. */\ntype ToWildcard<T extends string> = T extends `${infer Prefix}/${string}`\n ? `${Prefix}/*`\n : never;\n\n/** Wildcard prefixes derived from method strings (e.g. `\"tools/*\"` from `\"tools/call\"`). */\nexport type McpWildcard = ToWildcard<McpMethodString>;\n\n/** Category keywords matching all requests or all notifications. */\ntype McpCategory = \"request\" | \"notification\";\n\n/**\n * A single filter pattern for MCP middleware:\n * - Exact method: `\"tools/call\"`\n * - Wildcard: `\"tools/*\"`\n * - Category: `\"request\"` | `\"notification\"`\n * - Escape hatch: arbitrary string via `string & {}`\n */\ntype McpMiddlewareFilterPattern =\n | McpMethodString\n | McpWildcard\n | McpCategory\n | (string & {});\n\n/**\n * Filter determining which MCP methods a middleware applies to.\n * A single pattern or an array of patterns (OR logic).\n */\nexport type McpMiddlewareFilter =\n | McpMiddlewareFilterPattern\n | McpMiddlewareFilterPattern[];\n\n/**\n * Internal entry stored for each registered middleware.\n * `filter: null` means catch-all (matches everything).\n */\nexport type McpMiddlewareEntry = {\n filter: McpMiddlewareFilter | null;\n handler: McpMiddlewareFn;\n};\n\ntype HandlerMap = Map<string, (...args: unknown[]) => Promise<unknown>>;\n\n/**\n * Extract the TS-private `_requestHandlers` and `_notificationHandlers` maps\n * from the SDK's `Server` (extends `Protocol`). These are runtime-accessible\n * but declared `private` in TypeScript.\n *\n * Validates with `instanceof Map` so an incompatible SDK version fails fast\n * instead of silently breaking.\n */\nexport function getHandlerMaps(server: Server) {\n const obj: object = server;\n\n if (\n !(\"_requestHandlers\" in obj && obj._requestHandlers instanceof Map) ||\n !(\n \"_notificationHandlers\" in obj && obj._notificationHandlers instanceof Map\n )\n ) {\n throw new Error(\n \"Incompatible MCP SDK version: expected _requestHandlers and _notificationHandlers on Server\",\n );\n }\n\n return {\n requestHandlers: obj._requestHandlers as HandlerMap,\n notificationHandlers: obj._notificationHandlers as HandlerMap,\n };\n}\n\n/**\n * Check if a single filter pattern matches a given method.\n *\n * - Exact: `\"tools/call\"` matches only `\"tools/call\"`\n * - Wildcard: `\"tools/*\"` matches any method starting with `\"tools/\"`\n * - Category `\"request\"`: matches when `isNotification` is false\n * - Category `\"notification\"`: matches when `isNotification` is true\n */\nexport function matchesFilter(\n method: string,\n filter: string,\n isNotification: boolean,\n): boolean {\n if (filter === \"request\") {\n return !isNotification;\n }\n if (filter === \"notification\") {\n return isNotification;\n }\n if (filter.endsWith(\"/*\")) {\n const prefix = filter.slice(0, -1); // \"tools/*\" → \"tools/\"\n return method.startsWith(prefix);\n }\n return method === filter;\n}\n\nfunction matchesAnyFilter(\n method: string,\n filter: McpMiddlewareFilter | null,\n isNotification: boolean,\n): boolean {\n if (filter === null) {\n return true;\n }\n if (typeof filter === \"string\") {\n return matchesFilter(method, filter, isNotification);\n }\n return filter.some((pattern) =>\n matchesFilter(method, pattern, isNotification),\n );\n}\n\n/**\n * Build an onion-model middleware chain for a specific method.\n *\n * Filters `entries` to those matching `method`, then composes them\n * so the first registered middleware is the outermost layer.\n * `next()` is guarded against multiple calls within a single middleware.\n */\nexport function buildMiddlewareChain(\n method: string,\n isNotification: boolean,\n originalHandler: (...args: unknown[]) => Promise<unknown>,\n entries: McpMiddlewareEntry[],\n) {\n const applicable = entries.filter((entry) =>\n matchesAnyFilter(method, entry.filter, isNotification),\n );\n\n if (applicable.length === 0) {\n return originalHandler;\n }\n\n return (...args: unknown[]) => {\n const rawRequest = args[0] as Record<string, unknown> | undefined;\n // SDK calls request handlers as handler(request, extra) but\n // notification handlers as handler(notification) — no extra arg.\n const extra = isNotification ? undefined : (args[1] as McpExtra);\n const mcpRequest = {\n method,\n params: (rawRequest?.params as Record<string, unknown>) ?? {},\n };\n\n let index = 0;\n\n const executeLayer = (): Promise<unknown> => {\n const entry = applicable[index++];\n if (!entry) {\n if (rawRequest) {\n rawRequest.params = mcpRequest.params;\n }\n return originalHandler(...args);\n }\n\n let nextCalled = false;\n\n const next = (): Promise<unknown> => {\n if (nextCalled) {\n throw new Error(\n `next() called multiple times in middleware for \"${method}\"`,\n );\n }\n nextCalled = true;\n return executeLayer();\n };\n\n return Promise.resolve(entry.handler(mcpRequest, extra, next));\n };\n\n return executeLayer();\n };\n}\n"]}
@@ -2,7 +2,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
2
  import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
3
3
  import { describe, expect, it, vi } from "vitest";
4
4
  import { z } from "zod";
5
- import { buildMiddlewareChain, getHandlerMaps, matchesFilter, } from "./middleware.js";
5
+ import { buildMiddlewareChain, getHandlerMaps, getToolError, matchesFilter, } from "./middleware.js";
6
6
  import { McpServer } from "./server.js";
7
7
  // ---------------------------------------------------------------------------
8
8
  // matchesFilter
@@ -411,6 +411,42 @@ describe("McpServer.mcpMiddleware()", () => {
411
411
  await client.close();
412
412
  await server.close();
413
413
  });
414
+ it("exposes a thrown tool error to middleware via getToolError", async () => {
415
+ const schemaError = new Error("boom with schema");
416
+ const schemalessError = new Error("boom without schema");
417
+ let captured;
418
+ const server = new McpServer({ name: "test", version: "1.0.0" });
419
+ server.registerTool({
420
+ name: "withSchema",
421
+ description: "withSchema",
422
+ inputSchema: { name: z.string() },
423
+ }, () => {
424
+ throw schemaError;
425
+ });
426
+ server.registerTool({ name: "withoutSchema", description: "withoutSchema" }, () => {
427
+ throw schemalessError;
428
+ });
429
+ server.mcpMiddleware("tools/call", async (_request, extra, next) => {
430
+ const result = await next();
431
+ captured = getToolError(extra);
432
+ return result;
433
+ });
434
+ const client = createClient();
435
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
436
+ await server.connect(serverTransport);
437
+ await client.connect(clientTransport);
438
+ const withSchema = await client.callTool({
439
+ name: "withSchema",
440
+ arguments: { name: "World" },
441
+ });
442
+ expect(withSchema.isError).toBe(true);
443
+ expect(captured).toBe(schemaError);
444
+ const withoutSchema = await client.callTool({ name: "withoutSchema" });
445
+ expect(withoutSchema.isError).toBe(true);
446
+ expect(captured).toBe(schemalessError);
447
+ await client.close();
448
+ await server.close();
449
+ });
414
450
  it("middleware can mutate tool call params via McpServer integration", async () => {
415
451
  let receivedName = "";
416
452
  const server = new McpServer({ name: "test", version: "1.0.0" });
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/server/middleware.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { z } from \"zod\";\nimport {\n buildMiddlewareChain,\n getHandlerMaps,\n type McpExtra,\n type McpMiddlewareEntry,\n type McpMiddlewareFn,\n matchesFilter,\n} from \"./middleware.js\";\nimport { McpServer } from \"./server.js\";\n\n// ---------------------------------------------------------------------------\n// matchesFilter\n// ---------------------------------------------------------------------------\ndescribe(\"matchesFilter\", () => {\n it(\"matches exact method\", () => {\n expect(matchesFilter(\"tools/call\", \"tools/call\", false)).toBe(true);\n });\n\n it(\"rejects non-matching exact method\", () => {\n expect(matchesFilter(\"tools/list\", \"tools/call\", false)).toBe(false);\n });\n\n it(\"matches wildcard\", () => {\n expect(matchesFilter(\"tools/call\", \"tools/*\", false)).toBe(true);\n expect(matchesFilter(\"tools/list\", \"tools/*\", false)).toBe(true);\n });\n\n it(\"rejects non-matching wildcard\", () => {\n expect(matchesFilter(\"resources/read\", \"tools/*\", false)).toBe(false);\n });\n\n it('category \"request\" matches when isNotification=false', () => {\n expect(matchesFilter(\"tools/call\", \"request\", false)).toBe(true);\n });\n\n it('category \"request\" rejects when isNotification=true', () => {\n expect(matchesFilter(\"notifications/initialized\", \"request\", true)).toBe(\n false,\n );\n });\n\n it('category \"notification\" matches when isNotification=true', () => {\n expect(\n matchesFilter(\"notifications/initialized\", \"notification\", true),\n ).toBe(true);\n });\n\n it('category \"notification\" rejects when isNotification=false', () => {\n expect(matchesFilter(\"tools/call\", \"notification\", false)).toBe(false);\n });\n});\n\n// ---------------------------------------------------------------------------\n// buildMiddlewareChain\n// ---------------------------------------------------------------------------\ndescribe(\"buildMiddlewareChain\", () => {\n const fakeExtra = {} as McpExtra;\n\n const makeHandler = (returnValue: unknown) => vi.fn(async () => returnValue);\n\n const makeEntry = (\n filter: McpMiddlewareEntry[\"filter\"],\n handler: McpMiddlewareFn,\n ): McpMiddlewareEntry => ({ filter, handler });\n\n it(\"returns original handler when no middleware applies\", () => {\n const original = makeHandler(\"result\");\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(\"resources/*\", async (_req, _extra, next) => next()),\n ]);\n expect(chain).toBe(original);\n });\n\n it(\"catch-all middleware runs for any method\", async () => {\n const original = makeHandler(\"ok\");\n const spy = vi.fn();\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (request, _extra, next) => {\n spy(request.method);\n return next();\n }),\n ]);\n const result = await chain({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(spy).toHaveBeenCalledWith(\"tools/call\");\n expect(result).toBe(\"ok\");\n });\n\n it(\"method-scoped middleware only runs for matching methods\", async () => {\n const original = makeHandler(\"ok\");\n const spy = vi.fn();\n const entries = [\n makeEntry(\"tools/call\", async (_req, _extra, next) => {\n spy(\"tools/call\");\n return next();\n }),\n ];\n\n // Matching\n const chain1 = buildMiddlewareChain(\"tools/call\", false, original, entries);\n await chain1({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(spy).toHaveBeenCalledTimes(1);\n\n // Non-matching — returns original handler directly\n const chain2 = buildMiddlewareChain(\"tools/list\", false, original, entries);\n expect(chain2).toBe(original);\n });\n\n it(\"executes middleware in registration order (onion model)\", async () => {\n const calls: string[] = [];\n const original = makeHandler(\"result\");\n\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (_req, _extra, next) => {\n calls.push(\"A:before\");\n const result = await next();\n calls.push(\"A:after\");\n return result;\n }),\n makeEntry(null, async (_req, _extra, next) => {\n calls.push(\"B:before\");\n const result = await next();\n calls.push(\"B:after\");\n return result;\n }),\n ]);\n\n await chain({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(calls).toEqual([\"A:before\", \"B:before\", \"B:after\", \"A:after\"]);\n });\n\n it(\"short-circuit (no next() call) skips handler\", async () => {\n const original = makeHandler(\"original\");\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async () => \"short-circuited\"),\n ]);\n const result = await chain({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(result).toBe(\"short-circuited\");\n expect(original).not.toHaveBeenCalled();\n });\n\n it(\"middleware can modify result post-next()\", async () => {\n const original = makeHandler({ value: 1 });\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (_req, _extra, next) => {\n const result = (await next()) as { value: number };\n return { value: result.value + 10 };\n }),\n ]);\n const result = await chain({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(result).toEqual({ value: 11 });\n });\n\n it(\"throws on double next() call\", async () => {\n const original = makeHandler(\"ok\");\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (_req, _extra, next) => {\n await next();\n return next(); // double call\n }),\n ]);\n await expect(\n chain({ method: \"tools/call\", params: {} }, fakeExtra),\n ).rejects.toThrow(\"next() called multiple times\");\n });\n\n it(\"propagates errors from handler and middleware\", async () => {\n // Error from original handler bubbles through middleware\n const failingHandler = vi.fn(async () => {\n throw new Error(\"handler boom\");\n });\n const chain1 = buildMiddlewareChain(\"tools/call\", false, failingHandler, [\n makeEntry(null, async (_req, _extra, next) => next()),\n ]);\n await expect(\n chain1({ method: \"tools/call\", params: {} }, fakeExtra),\n ).rejects.toThrow(\"handler boom\");\n\n // Error thrown inside middleware propagates\n const chain2 = buildMiddlewareChain(\n \"tools/call\",\n false,\n makeHandler(\"ok\"),\n [\n makeEntry(null, async () => {\n throw new Error(\"middleware boom\");\n }),\n ],\n );\n await expect(\n chain2({ method: \"tools/call\", params: {} }, fakeExtra),\n ).rejects.toThrow(\"middleware boom\");\n });\n\n it(\"passes extra as undefined for notifications (isNotification=true)\", async () => {\n const original = makeHandler(undefined);\n let capturedExtra: McpExtra | undefined = {} as McpExtra;\n const chain = buildMiddlewareChain(\n \"notifications/initialized\",\n true,\n original,\n [\n makeEntry(null, async (_req, extra, next) => {\n capturedExtra = extra;\n return next();\n }),\n ],\n );\n await chain({ method: \"notifications/initialized\" });\n expect(capturedExtra).toBeUndefined();\n });\n\n it(\"defaults params to empty object when rawRequest has no params\", async () => {\n const original = makeHandler(\"ok\");\n let capturedParams: Record<string, unknown> | undefined;\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (request, _extra, next) => {\n capturedParams = request.params;\n return next();\n }),\n ]);\n await chain({ method: \"tools/call\" }, fakeExtra);\n expect(capturedParams).toEqual({});\n });\n\n it(\"propagates in-place param mutation to original handler\", async () => {\n let handlerReceivedName = \"\";\n const original = vi.fn(async (rawReq: { params: { name: string } }) => {\n handlerReceivedName = rawReq.params.name;\n return \"ok\";\n });\n\n const chain = buildMiddlewareChain(\n \"tools/call\",\n false,\n original as unknown as (...args: unknown[]) => Promise<unknown>,\n [\n makeEntry(null, async (request, _extra, next) => {\n request.params.name = \"mutated\";\n return next();\n }),\n ],\n );\n\n await chain({ params: { name: \"original\" } }, fakeExtra);\n expect(handlerReceivedName).toBe(\"mutated\");\n });\n\n it(\"propagates full param replacement to original handler\", async () => {\n let handlerReceivedParams: Record<string, unknown> = {};\n const original = vi.fn(\n async (rawReq: { params: Record<string, unknown> }) => {\n handlerReceivedParams = rawReq.params;\n return \"ok\";\n },\n );\n\n const chain = buildMiddlewareChain(\n \"tools/call\",\n false,\n original as unknown as (...args: unknown[]) => Promise<unknown>,\n [\n makeEntry(null, async (request, _extra, next) => {\n request.params = { replaced: true };\n return next();\n }),\n ],\n );\n\n await chain({ params: { original: true } }, fakeExtra);\n expect(handlerReceivedParams).toEqual({ replaced: true });\n });\n});\n\n// ---------------------------------------------------------------------------\n// McpServer.mcpMiddleware() integration tests\n// ---------------------------------------------------------------------------\ndescribe(\"McpServer.mcpMiddleware()\", () => {\n function createClient() {\n return new Client({ name: \"test-client\", version: \"1.0.0\" });\n }\n\n it(\"returns this for chaining\", () => {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n const result = server.mcpMiddleware(async (_req, _extra, next) => next());\n expect(result).toBe(server);\n });\n\n it(\"intercepts tools/call and exposes request params\", async () => {\n let capturedMethod = \"\";\n let capturedParams: Record<string, unknown> = {};\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool(\n {\n name: \"greet\",\n description: \"greet\",\n inputSchema: { name: z.string() },\n },\n (args) => ({\n content: [{ type: \"text\" as const, text: `hi ${args.name}` }],\n }),\n );\n\n server.mcpMiddleware(\"tools/call\", async (request, _extra, next) => {\n capturedMethod = request.method;\n capturedParams = request.params;\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n const result = await client.callTool({\n name: \"greet\",\n arguments: { name: \"World\" },\n });\n expect(capturedMethod).toBe(\"tools/call\");\n expect(capturedParams).toMatchObject({\n name: \"greet\",\n arguments: { name: \"World\" },\n });\n expect(result.content).toEqual([{ type: \"text\", text: \"hi World\" }]);\n\n await client.close();\n await server.close();\n });\n\n it(\"array filter works\", async () => {\n const matchedMethods: string[] = [];\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server.mcpMiddleware(\n [\"tools/call\", \"tools/list\"],\n async (request, _extra, next) => {\n matchedMethods.push(request.method);\n return next();\n },\n );\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.listTools();\n await client.callTool({ name: \"t1\" });\n\n expect(matchedMethods).toEqual([\"tools/list\", \"tools/call\"]);\n\n await client.close();\n await server.close();\n });\n\n it(\"throws if registered after connect()\", async () => {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n const [_clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n\n expect(() =>\n server.mcpMiddleware(async (_req, _extra, next) => next()),\n ).toThrow(\"Cannot register MCP middleware after run() or connect()\");\n\n await server.close();\n });\n\n it(\"throws when filter provided without handler\", () => {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n expect(() =>\n // @ts-expect-error intentionally passing filter without handler\n server.mcpMiddleware(\"tools/call\"),\n ).toThrow(\"mcpMiddleware requires a handler function\");\n });\n\n it(\"catch-all middleware + filtered middleware stack correctly\", async () => {\n const calls: string[] = [];\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server\n .mcpMiddleware(async (request, _extra, next) => {\n calls.push(`global:${request.method}`);\n return next();\n })\n .mcpMiddleware(\"tools/call\", async (_req, _extra, next) => {\n calls.push(\"tools-only\");\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.listTools();\n await client.callTool({ name: \"t1\" });\n\n // Catch-all also intercepts initialize + notifications/initialized from handshake.\n // tools/list: only global middleware runs\n // tools/call: global + tools-only both run\n expect(calls).toContain(\"global:tools/list\");\n expect(calls).toContain(\"global:tools/call\");\n expect(calls).toContain(\"tools-only\");\n // \"tools-only\" must come right after \"global:tools/call\"\n const toolsCallIdx = calls.indexOf(\"global:tools/call\");\n expect(calls[toolsCallIdx + 1]).toBe(\"tools-only\");\n\n await client.close();\n await server.close();\n });\n\n it(\"notification middleware receives extra as undefined\", async () => {\n let capturedExtra: unknown = \"sentinel\";\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server.mcpMiddleware(\"notification\", async (_request, extra, next) => {\n capturedExtra = extra;\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n // The client sends notifications/initialized automatically on connect.\n await client.listTools();\n expect(capturedExtra).toBeUndefined();\n\n await client.close();\n await server.close();\n });\n\n it(\"wildcard filter intercepts matching methods only\", async () => {\n const matchedMethods: string[] = [];\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server.mcpMiddleware(\"tools/*\", async (request, _extra, next) => {\n matchedMethods.push(request.method);\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.listTools();\n await client.callTool({ name: \"t1\" });\n\n expect(matchedMethods).toContain(\"tools/list\");\n expect(matchedMethods).toContain(\"tools/call\");\n // Should not match initialize or notifications\n expect(matchedMethods).not.toContain(\"initialize\");\n expect(matchedMethods).not.toContain(\"notifications/initialized\");\n\n await client.close();\n await server.close();\n });\n\n it(\"middleware can modify tool result via McpServer integration\", async () => {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool(\n {\n name: \"greet\",\n description: \"greet\",\n inputSchema: { name: z.string() },\n },\n (args) => ({\n content: [{ type: \"text\" as const, text: `hi ${args.name}` }],\n }),\n );\n\n server.mcpMiddleware(\"tools/call\", async (_req, _extra, next) => {\n const result = (await next()) as {\n content: { type: string; text: string }[];\n };\n return {\n ...result,\n content: [\n ...result.content,\n { type: \"text\" as const, text: \" (modified)\" },\n ],\n };\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n const result = await client.callTool({\n name: \"greet\",\n arguments: { name: \"World\" },\n });\n expect(result.content).toEqual([\n { type: \"text\", text: \"hi World\" },\n { type: \"text\", text: \" (modified)\" },\n ]);\n\n await client.close();\n await server.close();\n });\n\n it(\"middleware can short-circuit via McpServer integration\", async () => {\n const handlerCalled = vi.fn();\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => {\n handlerCalled();\n return {\n content: [{ type: \"text\" as const, text: \"original\" }],\n };\n });\n\n server.mcpMiddleware(\"tools/call\", async () => ({\n content: [{ type: \"text\" as const, text: \"short-circuited\" }],\n }));\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n const result = await client.callTool({ name: \"t1\" });\n expect(result.content).toEqual([{ type: \"text\", text: \"short-circuited\" }]);\n expect(handlerCalled).not.toHaveBeenCalled();\n\n await client.close();\n await server.close();\n });\n\n it(\"middleware can mutate tool call params via McpServer integration\", async () => {\n let receivedName = \"\";\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool(\n {\n name: \"greet\",\n description: \"greet\",\n inputSchema: { name: z.string() },\n },\n (args) => {\n receivedName = args.name;\n return {\n content: [{ type: \"text\" as const, text: `hi ${args.name}` }],\n };\n },\n );\n\n server.mcpMiddleware(\"tools/call\", async (request, _extra, next) => {\n request.params.arguments = { name: \"Overridden\" };\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.callTool({\n name: \"greet\",\n arguments: { name: \"Original\" },\n });\n expect(receivedName).toBe(\"Overridden\");\n\n await client.close();\n await server.close();\n });\n\n it(\"category 'request' filter matches requests but not notifications\", async () => {\n const matchedMethods: string[] = [];\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server.mcpMiddleware(\"request\", async (request, _extra, next) => {\n matchedMethods.push(request.method);\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.listTools();\n await client.callTool({ name: \"t1\" });\n\n expect(matchedMethods).toContain(\"tools/list\");\n expect(matchedMethods).toContain(\"tools/call\");\n expect(matchedMethods).not.toContain(\"notifications/initialized\");\n\n await client.close();\n await server.close();\n });\n});\n\n// ---------------------------------------------------------------------------\n// getHandlerMaps\n// ---------------------------------------------------------------------------\ndescribe(\"getHandlerMaps\", () => {\n it(\"throws for incompatible server objects\", () => {\n // Empty object\n expect(() => getHandlerMaps({} as never)).toThrow(\n \"Incompatible MCP SDK version\",\n );\n // Only _requestHandlers (missing _notificationHandlers)\n expect(() =>\n getHandlerMaps({ _requestHandlers: new Map() } as never),\n ).toThrow(\"Incompatible MCP SDK version\");\n // Non-Map values\n expect(() =>\n getHandlerMaps({\n _requestHandlers: {},\n _notificationHandlers: {},\n } as never),\n ).toThrow(\"Incompatible MCP SDK version\");\n });\n\n it(\"returns handler maps from valid server\", () => {\n const reqMap = new Map();\n const notifMap = new Map();\n const fake = {\n _requestHandlers: reqMap,\n _notificationHandlers: notifMap,\n };\n const result = getHandlerMaps(fake as never);\n expect(result.requestHandlers).toBe(reqMap);\n expect(result.notificationHandlers).toBe(notifMap);\n });\n});\n"]}
1
+ {"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/server/middleware.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { z } from \"zod\";\nimport {\n buildMiddlewareChain,\n getHandlerMaps,\n getToolError,\n type McpExtra,\n type McpMiddlewareEntry,\n type McpMiddlewareFn,\n matchesFilter,\n} from \"./middleware.js\";\nimport { McpServer } from \"./server.js\";\n\n// ---------------------------------------------------------------------------\n// matchesFilter\n// ---------------------------------------------------------------------------\ndescribe(\"matchesFilter\", () => {\n it(\"matches exact method\", () => {\n expect(matchesFilter(\"tools/call\", \"tools/call\", false)).toBe(true);\n });\n\n it(\"rejects non-matching exact method\", () => {\n expect(matchesFilter(\"tools/list\", \"tools/call\", false)).toBe(false);\n });\n\n it(\"matches wildcard\", () => {\n expect(matchesFilter(\"tools/call\", \"tools/*\", false)).toBe(true);\n expect(matchesFilter(\"tools/list\", \"tools/*\", false)).toBe(true);\n });\n\n it(\"rejects non-matching wildcard\", () => {\n expect(matchesFilter(\"resources/read\", \"tools/*\", false)).toBe(false);\n });\n\n it('category \"request\" matches when isNotification=false', () => {\n expect(matchesFilter(\"tools/call\", \"request\", false)).toBe(true);\n });\n\n it('category \"request\" rejects when isNotification=true', () => {\n expect(matchesFilter(\"notifications/initialized\", \"request\", true)).toBe(\n false,\n );\n });\n\n it('category \"notification\" matches when isNotification=true', () => {\n expect(\n matchesFilter(\"notifications/initialized\", \"notification\", true),\n ).toBe(true);\n });\n\n it('category \"notification\" rejects when isNotification=false', () => {\n expect(matchesFilter(\"tools/call\", \"notification\", false)).toBe(false);\n });\n});\n\n// ---------------------------------------------------------------------------\n// buildMiddlewareChain\n// ---------------------------------------------------------------------------\ndescribe(\"buildMiddlewareChain\", () => {\n const fakeExtra = {} as McpExtra;\n\n const makeHandler = (returnValue: unknown) => vi.fn(async () => returnValue);\n\n const makeEntry = (\n filter: McpMiddlewareEntry[\"filter\"],\n handler: McpMiddlewareFn,\n ): McpMiddlewareEntry => ({ filter, handler });\n\n it(\"returns original handler when no middleware applies\", () => {\n const original = makeHandler(\"result\");\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(\"resources/*\", async (_req, _extra, next) => next()),\n ]);\n expect(chain).toBe(original);\n });\n\n it(\"catch-all middleware runs for any method\", async () => {\n const original = makeHandler(\"ok\");\n const spy = vi.fn();\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (request, _extra, next) => {\n spy(request.method);\n return next();\n }),\n ]);\n const result = await chain({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(spy).toHaveBeenCalledWith(\"tools/call\");\n expect(result).toBe(\"ok\");\n });\n\n it(\"method-scoped middleware only runs for matching methods\", async () => {\n const original = makeHandler(\"ok\");\n const spy = vi.fn();\n const entries = [\n makeEntry(\"tools/call\", async (_req, _extra, next) => {\n spy(\"tools/call\");\n return next();\n }),\n ];\n\n // Matching\n const chain1 = buildMiddlewareChain(\"tools/call\", false, original, entries);\n await chain1({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(spy).toHaveBeenCalledTimes(1);\n\n // Non-matching — returns original handler directly\n const chain2 = buildMiddlewareChain(\"tools/list\", false, original, entries);\n expect(chain2).toBe(original);\n });\n\n it(\"executes middleware in registration order (onion model)\", async () => {\n const calls: string[] = [];\n const original = makeHandler(\"result\");\n\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (_req, _extra, next) => {\n calls.push(\"A:before\");\n const result = await next();\n calls.push(\"A:after\");\n return result;\n }),\n makeEntry(null, async (_req, _extra, next) => {\n calls.push(\"B:before\");\n const result = await next();\n calls.push(\"B:after\");\n return result;\n }),\n ]);\n\n await chain({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(calls).toEqual([\"A:before\", \"B:before\", \"B:after\", \"A:after\"]);\n });\n\n it(\"short-circuit (no next() call) skips handler\", async () => {\n const original = makeHandler(\"original\");\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async () => \"short-circuited\"),\n ]);\n const result = await chain({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(result).toBe(\"short-circuited\");\n expect(original).not.toHaveBeenCalled();\n });\n\n it(\"middleware can modify result post-next()\", async () => {\n const original = makeHandler({ value: 1 });\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (_req, _extra, next) => {\n const result = (await next()) as { value: number };\n return { value: result.value + 10 };\n }),\n ]);\n const result = await chain({ method: \"tools/call\", params: {} }, fakeExtra);\n expect(result).toEqual({ value: 11 });\n });\n\n it(\"throws on double next() call\", async () => {\n const original = makeHandler(\"ok\");\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (_req, _extra, next) => {\n await next();\n return next(); // double call\n }),\n ]);\n await expect(\n chain({ method: \"tools/call\", params: {} }, fakeExtra),\n ).rejects.toThrow(\"next() called multiple times\");\n });\n\n it(\"propagates errors from handler and middleware\", async () => {\n // Error from original handler bubbles through middleware\n const failingHandler = vi.fn(async () => {\n throw new Error(\"handler boom\");\n });\n const chain1 = buildMiddlewareChain(\"tools/call\", false, failingHandler, [\n makeEntry(null, async (_req, _extra, next) => next()),\n ]);\n await expect(\n chain1({ method: \"tools/call\", params: {} }, fakeExtra),\n ).rejects.toThrow(\"handler boom\");\n\n // Error thrown inside middleware propagates\n const chain2 = buildMiddlewareChain(\n \"tools/call\",\n false,\n makeHandler(\"ok\"),\n [\n makeEntry(null, async () => {\n throw new Error(\"middleware boom\");\n }),\n ],\n );\n await expect(\n chain2({ method: \"tools/call\", params: {} }, fakeExtra),\n ).rejects.toThrow(\"middleware boom\");\n });\n\n it(\"passes extra as undefined for notifications (isNotification=true)\", async () => {\n const original = makeHandler(undefined);\n let capturedExtra: McpExtra | undefined = {} as McpExtra;\n const chain = buildMiddlewareChain(\n \"notifications/initialized\",\n true,\n original,\n [\n makeEntry(null, async (_req, extra, next) => {\n capturedExtra = extra;\n return next();\n }),\n ],\n );\n await chain({ method: \"notifications/initialized\" });\n expect(capturedExtra).toBeUndefined();\n });\n\n it(\"defaults params to empty object when rawRequest has no params\", async () => {\n const original = makeHandler(\"ok\");\n let capturedParams: Record<string, unknown> | undefined;\n const chain = buildMiddlewareChain(\"tools/call\", false, original, [\n makeEntry(null, async (request, _extra, next) => {\n capturedParams = request.params;\n return next();\n }),\n ]);\n await chain({ method: \"tools/call\" }, fakeExtra);\n expect(capturedParams).toEqual({});\n });\n\n it(\"propagates in-place param mutation to original handler\", async () => {\n let handlerReceivedName = \"\";\n const original = vi.fn(async (rawReq: { params: { name: string } }) => {\n handlerReceivedName = rawReq.params.name;\n return \"ok\";\n });\n\n const chain = buildMiddlewareChain(\n \"tools/call\",\n false,\n original as unknown as (...args: unknown[]) => Promise<unknown>,\n [\n makeEntry(null, async (request, _extra, next) => {\n request.params.name = \"mutated\";\n return next();\n }),\n ],\n );\n\n await chain({ params: { name: \"original\" } }, fakeExtra);\n expect(handlerReceivedName).toBe(\"mutated\");\n });\n\n it(\"propagates full param replacement to original handler\", async () => {\n let handlerReceivedParams: Record<string, unknown> = {};\n const original = vi.fn(\n async (rawReq: { params: Record<string, unknown> }) => {\n handlerReceivedParams = rawReq.params;\n return \"ok\";\n },\n );\n\n const chain = buildMiddlewareChain(\n \"tools/call\",\n false,\n original as unknown as (...args: unknown[]) => Promise<unknown>,\n [\n makeEntry(null, async (request, _extra, next) => {\n request.params = { replaced: true };\n return next();\n }),\n ],\n );\n\n await chain({ params: { original: true } }, fakeExtra);\n expect(handlerReceivedParams).toEqual({ replaced: true });\n });\n});\n\n// ---------------------------------------------------------------------------\n// McpServer.mcpMiddleware() integration tests\n// ---------------------------------------------------------------------------\ndescribe(\"McpServer.mcpMiddleware()\", () => {\n function createClient() {\n return new Client({ name: \"test-client\", version: \"1.0.0\" });\n }\n\n it(\"returns this for chaining\", () => {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n const result = server.mcpMiddleware(async (_req, _extra, next) => next());\n expect(result).toBe(server);\n });\n\n it(\"intercepts tools/call and exposes request params\", async () => {\n let capturedMethod = \"\";\n let capturedParams: Record<string, unknown> = {};\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool(\n {\n name: \"greet\",\n description: \"greet\",\n inputSchema: { name: z.string() },\n },\n (args) => ({\n content: [{ type: \"text\" as const, text: `hi ${args.name}` }],\n }),\n );\n\n server.mcpMiddleware(\"tools/call\", async (request, _extra, next) => {\n capturedMethod = request.method;\n capturedParams = request.params;\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n const result = await client.callTool({\n name: \"greet\",\n arguments: { name: \"World\" },\n });\n expect(capturedMethod).toBe(\"tools/call\");\n expect(capturedParams).toMatchObject({\n name: \"greet\",\n arguments: { name: \"World\" },\n });\n expect(result.content).toEqual([{ type: \"text\", text: \"hi World\" }]);\n\n await client.close();\n await server.close();\n });\n\n it(\"array filter works\", async () => {\n const matchedMethods: string[] = [];\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server.mcpMiddleware(\n [\"tools/call\", \"tools/list\"],\n async (request, _extra, next) => {\n matchedMethods.push(request.method);\n return next();\n },\n );\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.listTools();\n await client.callTool({ name: \"t1\" });\n\n expect(matchedMethods).toEqual([\"tools/list\", \"tools/call\"]);\n\n await client.close();\n await server.close();\n });\n\n it(\"throws if registered after connect()\", async () => {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n const [_clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n\n expect(() =>\n server.mcpMiddleware(async (_req, _extra, next) => next()),\n ).toThrow(\"Cannot register MCP middleware after run() or connect()\");\n\n await server.close();\n });\n\n it(\"throws when filter provided without handler\", () => {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n expect(() =>\n // @ts-expect-error intentionally passing filter without handler\n server.mcpMiddleware(\"tools/call\"),\n ).toThrow(\"mcpMiddleware requires a handler function\");\n });\n\n it(\"catch-all middleware + filtered middleware stack correctly\", async () => {\n const calls: string[] = [];\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server\n .mcpMiddleware(async (request, _extra, next) => {\n calls.push(`global:${request.method}`);\n return next();\n })\n .mcpMiddleware(\"tools/call\", async (_req, _extra, next) => {\n calls.push(\"tools-only\");\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.listTools();\n await client.callTool({ name: \"t1\" });\n\n // Catch-all also intercepts initialize + notifications/initialized from handshake.\n // tools/list: only global middleware runs\n // tools/call: global + tools-only both run\n expect(calls).toContain(\"global:tools/list\");\n expect(calls).toContain(\"global:tools/call\");\n expect(calls).toContain(\"tools-only\");\n // \"tools-only\" must come right after \"global:tools/call\"\n const toolsCallIdx = calls.indexOf(\"global:tools/call\");\n expect(calls[toolsCallIdx + 1]).toBe(\"tools-only\");\n\n await client.close();\n await server.close();\n });\n\n it(\"notification middleware receives extra as undefined\", async () => {\n let capturedExtra: unknown = \"sentinel\";\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server.mcpMiddleware(\"notification\", async (_request, extra, next) => {\n capturedExtra = extra;\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n // The client sends notifications/initialized automatically on connect.\n await client.listTools();\n expect(capturedExtra).toBeUndefined();\n\n await client.close();\n await server.close();\n });\n\n it(\"wildcard filter intercepts matching methods only\", async () => {\n const matchedMethods: string[] = [];\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server.mcpMiddleware(\"tools/*\", async (request, _extra, next) => {\n matchedMethods.push(request.method);\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.listTools();\n await client.callTool({ name: \"t1\" });\n\n expect(matchedMethods).toContain(\"tools/list\");\n expect(matchedMethods).toContain(\"tools/call\");\n // Should not match initialize or notifications\n expect(matchedMethods).not.toContain(\"initialize\");\n expect(matchedMethods).not.toContain(\"notifications/initialized\");\n\n await client.close();\n await server.close();\n });\n\n it(\"middleware can modify tool result via McpServer integration\", async () => {\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool(\n {\n name: \"greet\",\n description: \"greet\",\n inputSchema: { name: z.string() },\n },\n (args) => ({\n content: [{ type: \"text\" as const, text: `hi ${args.name}` }],\n }),\n );\n\n server.mcpMiddleware(\"tools/call\", async (_req, _extra, next) => {\n const result = (await next()) as {\n content: { type: string; text: string }[];\n };\n return {\n ...result,\n content: [\n ...result.content,\n { type: \"text\" as const, text: \" (modified)\" },\n ],\n };\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n const result = await client.callTool({\n name: \"greet\",\n arguments: { name: \"World\" },\n });\n expect(result.content).toEqual([\n { type: \"text\", text: \"hi World\" },\n { type: \"text\", text: \" (modified)\" },\n ]);\n\n await client.close();\n await server.close();\n });\n\n it(\"middleware can short-circuit via McpServer integration\", async () => {\n const handlerCalled = vi.fn();\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => {\n handlerCalled();\n return {\n content: [{ type: \"text\" as const, text: \"original\" }],\n };\n });\n\n server.mcpMiddleware(\"tools/call\", async () => ({\n content: [{ type: \"text\" as const, text: \"short-circuited\" }],\n }));\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n const result = await client.callTool({ name: \"t1\" });\n expect(result.content).toEqual([{ type: \"text\", text: \"short-circuited\" }]);\n expect(handlerCalled).not.toHaveBeenCalled();\n\n await client.close();\n await server.close();\n });\n\n it(\"exposes a thrown tool error to middleware via getToolError\", async () => {\n const schemaError = new Error(\"boom with schema\");\n const schemalessError = new Error(\"boom without schema\");\n let captured: unknown;\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool(\n {\n name: \"withSchema\",\n description: \"withSchema\",\n inputSchema: { name: z.string() },\n },\n () => {\n throw schemaError;\n },\n );\n server.registerTool(\n { name: \"withoutSchema\", description: \"withoutSchema\" },\n () => {\n throw schemalessError;\n },\n );\n\n server.mcpMiddleware(\"tools/call\", async (_request, extra, next) => {\n const result = await next();\n captured = getToolError(extra);\n return result;\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n const withSchema = await client.callTool({\n name: \"withSchema\",\n arguments: { name: \"World\" },\n });\n expect(withSchema.isError).toBe(true);\n expect(captured).toBe(schemaError);\n\n const withoutSchema = await client.callTool({ name: \"withoutSchema\" });\n expect(withoutSchema.isError).toBe(true);\n expect(captured).toBe(schemalessError);\n\n await client.close();\n await server.close();\n });\n\n it(\"middleware can mutate tool call params via McpServer integration\", async () => {\n let receivedName = \"\";\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool(\n {\n name: \"greet\",\n description: \"greet\",\n inputSchema: { name: z.string() },\n },\n (args) => {\n receivedName = args.name;\n return {\n content: [{ type: \"text\" as const, text: `hi ${args.name}` }],\n };\n },\n );\n\n server.mcpMiddleware(\"tools/call\", async (request, _extra, next) => {\n request.params.arguments = { name: \"Overridden\" };\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.callTool({\n name: \"greet\",\n arguments: { name: \"Original\" },\n });\n expect(receivedName).toBe(\"Overridden\");\n\n await client.close();\n await server.close();\n });\n\n it(\"category 'request' filter matches requests but not notifications\", async () => {\n const matchedMethods: string[] = [];\n\n const server = new McpServer({ name: \"test\", version: \"1.0.0\" });\n\n server.registerTool({ name: \"t1\", description: \"t1\" }, () => ({\n content: [{ type: \"text\" as const, text: \"ok\" }],\n }));\n\n server.mcpMiddleware(\"request\", async (request, _extra, next) => {\n matchedMethods.push(request.method);\n return next();\n });\n\n const client = createClient();\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.listTools();\n await client.callTool({ name: \"t1\" });\n\n expect(matchedMethods).toContain(\"tools/list\");\n expect(matchedMethods).toContain(\"tools/call\");\n expect(matchedMethods).not.toContain(\"notifications/initialized\");\n\n await client.close();\n await server.close();\n });\n});\n\n// ---------------------------------------------------------------------------\n// getHandlerMaps\n// ---------------------------------------------------------------------------\ndescribe(\"getHandlerMaps\", () => {\n it(\"throws for incompatible server objects\", () => {\n // Empty object\n expect(() => getHandlerMaps({} as never)).toThrow(\n \"Incompatible MCP SDK version\",\n );\n // Only _requestHandlers (missing _notificationHandlers)\n expect(() =>\n getHandlerMaps({ _requestHandlers: new Map() } as never),\n ).toThrow(\"Incompatible MCP SDK version\");\n // Non-Map values\n expect(() =>\n getHandlerMaps({\n _requestHandlers: {},\n _notificationHandlers: {},\n } as never),\n ).toThrow(\"Incompatible MCP SDK version\");\n });\n\n it(\"returns handler maps from valid server\", () => {\n const reqMap = new Map();\n const notifMap = new Map();\n const fake = {\n _requestHandlers: reqMap,\n _notificationHandlers: notifMap,\n };\n const result = getHandlerMaps(fake as never);\n expect(result.requestHandlers).toBe(reqMap);\n expect(result.notificationHandlers).toBe(notifMap);\n });\n});\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
3
+ import { describe, expect, it } from "vitest";
4
+ import { McpServer } from "./server.js";
5
+ describe("registerTool handler invocation", () => {
6
+ it("passes empty args and a usable extra to a schema-less tool handler", async () => {
7
+ let received;
8
+ const server = new McpServer({
9
+ name: "test",
10
+ version: "1.0.0",
11
+ }).registerTool({ name: "no-input", description: "no-input" }, async (args, extra) => {
12
+ received = { args, extra };
13
+ return { content: [{ type: "text", text: "ok" }] };
14
+ });
15
+ const client = new Client({ name: "client", version: "1.0.0" });
16
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
17
+ await server.connect(serverTransport);
18
+ await client.connect(clientTransport);
19
+ await client.callTool({ name: "no-input" });
20
+ expect(received?.args).toEqual({});
21
+ expect(received?.extra).toHaveProperty("sendRequest");
22
+ await client.close();
23
+ await server.close();
24
+ });
25
+ });
26
+ //# sourceMappingURL=register-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-tool.test.js","sourceRoot":"","sources":["../../src/server/register-tool.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,IAAI,QAAuD,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;YAC3B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC,YAAY,CACb,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,EAC7C,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,QAAQ,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACrD,CAAC,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAChE,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,GACtC,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;QACvC,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACtC,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAEtC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAE5C,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAEtD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { InMemoryTransport } from \"@modelcontextprotocol/sdk/inMemory.js\";\nimport { describe, expect, it } from \"vitest\";\nimport { McpServer } from \"./server.js\";\n\ndescribe(\"registerTool handler invocation\", () => {\n it(\"passes empty args and a usable extra to a schema-less tool handler\", async () => {\n let received: { args: unknown; extra: unknown } | undefined;\n const server = new McpServer({\n name: \"test\",\n version: \"1.0.0\",\n }).registerTool(\n { name: \"no-input\", description: \"no-input\" },\n async (args, extra) => {\n received = { args, extra };\n return { content: [{ type: \"text\", text: \"ok\" }] };\n },\n );\n\n const client = new Client({ name: \"client\", version: \"1.0.0\" });\n const [clientTransport, serverTransport] =\n InMemoryTransport.createLinkedPair();\n await server.connect(serverTransport);\n await client.connect(clientTransport);\n\n await client.callTool({ name: \"no-input\" });\n\n expect(received?.args).toEqual({});\n expect(received?.extra).toHaveProperty(\"sendRequest\");\n\n await client.close();\n await server.close();\n });\n});\n"]}
@@ -6,7 +6,9 @@ import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/proto
6
6
  import type { ContentBlock, Implementation, RequestMeta, ServerNotification, ServerRequest, ServerResult, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
7
7
  import express, { type ErrorRequestHandler, type Express, type RequestHandler } from "express";
8
8
  import type { OAuthConfig } from "./auth/index.js";
9
+ import type { AuthInfo, ExtraClaims } from "./auth.js";
9
10
  import type { McpExtra, McpExtraFor, McpMethodString, McpMiddlewareFilter, McpMiddlewareFn, McpResultFor, McpTypedMiddlewareFn, McpWildcard } from "./middleware.js";
11
+ import { type SkillsManifest } from "./skills.js";
10
12
  /**
11
13
  * Type marker for a registered tool — carries its input, output, and response
12
14
  * metadata shapes so views can infer types from `typeof server`.
@@ -88,17 +90,42 @@ export type SecurityScheme = {
88
90
  type: "oauth2";
89
91
  scopes?: string[];
90
92
  };
93
+ /**
94
+ * Declarative per-tool auth. Enforced when the server has an `oauth` provider:
95
+ * anonymous or under-scoped calls are rejected before the handler runs. Omit
96
+ * `auth` entirely for the secure default (sign-in required, no specific scope).
97
+ */
98
+ export type ToolAuth = {
99
+ /**
100
+ * When `true`, the tool is callable signed out; the token is still used when
101
+ * one is present. Omit (or `false`) to require sign-in.
102
+ */
103
+ allowsAnonymous?: boolean;
104
+ /** OAuth scopes the caller's token must carry to invoke the tool. */
105
+ scopes?: string[];
106
+ };
91
107
  /**
92
108
  * Options forwarded to the built-in `express.json()` body parser. Derived
93
109
  * from Express's own types so the public API doesn't depend on `body-parser`.
94
110
  */
95
111
  export type JsonOptions = NonNullable<Parameters<typeof express.json>[0]>;
96
- /** Skybridge-specific server options, passed as the third `McpServer` constructor argument. */
97
- export interface SkybridgeServerOptions {
112
+ /**
113
+ * Skybridge-specific server options, passed as the third `McpServer` constructor
114
+ * argument.
115
+ *
116
+ * @typeParam TAuthExtra - Claims the `oauth` verifier populates. Inferred from
117
+ * the config a provider returns, and carried on to tool handlers.
118
+ */
119
+ export interface SkybridgeServerOptions<TAuthExtra extends ExtraClaims = ExtraClaims> {
98
120
  /** Options for the built-in `express.json()` middleware, e.g. `{ limit: "10mb" }`. */
99
121
  json?: JsonOptions;
100
122
  /** Resource-server OAuth config. When set, mounts well-known metadata and bearer auth on `/mcp`. */
101
- oauth?: OAuthConfig;
123
+ oauth?: OAuthConfig<TAuthExtra>;
124
+ /**
125
+ * @experimental Serve Agent Skills from `src/skills` over MCP (SEP-2640).
126
+ * API may change.
127
+ */
128
+ skills?: boolean;
102
129
  }
103
130
  /**
104
131
  * Well-known keys recognized by host runtimes when set on a tool's `_meta`.
@@ -158,10 +185,10 @@ type ExtractMeta<T> = [Extract<T, {
158
185
  }> extends {
159
186
  _meta: infer M;
160
187
  } ? Simplify<M> : unknown;
161
- type AddTool<TTools, TName extends string, TInput extends ZodRawShapeCompat, TOutput, TResponseMetadata = unknown> = McpServer<TTools & {
188
+ type AddTool<TTools, TName extends string, TInput extends ZodRawShapeCompat, TOutput, TResponseMetadata = unknown, TAuthExtra extends ExtraClaims = ExtraClaims> = McpServer<TTools & {
162
189
  [K in TName]: ToolDef<ShapeOutput<TInput>, TOutput, TResponseMetadata>;
163
- }>;
164
- interface ToolConfig<TInput extends ZodRawShapeCompat | AnySchema> {
190
+ }, TAuthExtra>;
191
+ interface ToolConfigBase<TInput extends ZodRawShapeCompat | AnySchema> {
165
192
  name: string;
166
193
  title?: string;
167
194
  description?: string;
@@ -169,6 +196,17 @@ interface ToolConfig<TInput extends ZodRawShapeCompat | AnySchema> {
169
196
  outputSchema?: ZodRawShapeCompat | AnySchema;
170
197
  annotations?: ToolAnnotations;
171
198
  view?: ViewConfig;
199
+ _meta?: ToolMeta;
200
+ }
201
+ /**
202
+ * The auth face of a tool config: either the high-level `auth` shorthand or the
203
+ * low-level `securitySchemes` escape hatch, never both.
204
+ */
205
+ type ToolAuthConfig = {
206
+ auth?: ToolAuth;
207
+ securitySchemes?: never;
208
+ } | {
209
+ auth?: never;
172
210
  /**
173
211
  * Declares which auth schemes this tool supports (e.g. `noauth`, `oauth2`).
174
212
  * Lets clients label tools that require sign-in before calling, and pass
@@ -177,8 +215,8 @@ interface ToolConfig<TInput extends ZodRawShapeCompat | AnySchema> {
177
215
  * enhanced behavior to authenticated ones.
178
216
  */
179
217
  securitySchemes?: SecurityScheme[];
180
- _meta?: ToolMeta;
181
- }
218
+ };
219
+ type ToolConfig<TInput extends ZodRawShapeCompat | AnySchema> = ToolConfigBase<TInput> & ToolAuthConfig;
182
220
  /**
183
221
  * Optional client-supplied hints attached to `params._meta` on every tool call
184
222
  * by the Apps SDK host. Hints only: never use for authorization, and tolerate
@@ -208,14 +246,15 @@ export interface ClientHintsMeta {
208
246
  /** Stable id for the currently mounted widget instance. */
209
247
  "openai/widgetSessionId"?: string;
210
248
  }
211
- type ToolHandlerExtra = Omit<RequestHandlerExtra<ServerRequest, ServerNotification>, "_meta"> & {
249
+ type ToolHandlerExtra<TAuthExtra extends ExtraClaims = ExtraClaims> = Omit<RequestHandlerExtra<ServerRequest, ServerNotification>, "_meta" | "authInfo"> & {
212
250
  _meta?: RequestMeta & ClientHintsMeta;
251
+ authInfo?: AuthInfo<TAuthExtra>;
213
252
  };
214
253
  type ToolHandler<TInput extends ZodRawShapeCompat, TReturn extends {
215
254
  content?: HandlerContent;
216
255
  } = {
217
256
  content?: HandlerContent;
218
- }> = (args: ShapeOutput<TInput>, extra: ToolHandlerExtra) => TReturn | Promise<TReturn>;
257
+ }, TAuthExtra extends ExtraClaims = ExtraClaims> = (args: ShapeOutput<TInput>, extra: ToolHandlerExtra<TAuthExtra>) => TReturn | Promise<TReturn>;
219
258
  /**
220
259
  * Coerce a tool handler's return value into an MCP `content` array. Strings
221
260
  * become a single `TextContent`; a single block is wrapped in an array;
@@ -236,7 +275,8 @@ declare const McpServerBaseOmitted: new (...args: ConstructorParameters<typeof M
236
275
  export declare function __setBuildManifest(manifest: Record<string, {
237
276
  file: string;
238
277
  }>): void;
239
- export declare class McpServer<TTools extends Record<string, ToolDef> = Record<never, ToolDef>> extends McpServerBaseOmitted {
278
+ export declare function __setSkillsManifest(manifest: SkillsManifest): void;
279
+ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<never, ToolDef>, TAuthExtra extends ExtraClaims = ExtraClaims> extends McpServerBaseOmitted {
240
280
  readonly $types: McpServerTypes<TTools>;
241
281
  /**
242
282
  * The underlying Express app. Use this to extend the HTTP server with
@@ -268,7 +308,11 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
268
308
  private viteManifest;
269
309
  private readonly serverInfo;
270
310
  private readonly serverOptions?;
271
- constructor(serverInfo: Implementation, options?: ServerOptions, skybridgeOptions?: SkybridgeServerOptions);
311
+ private oauthEnabled;
312
+ private resolveResourceMetadataUrl?;
313
+ private securitySchemesByTool;
314
+ constructor(serverInfo: Implementation, options?: ServerOptions, skybridgeOptions?: SkybridgeServerOptions<TAuthExtra>);
315
+ private setupSkills;
272
316
  /**
273
317
  * Register Express middleware on the underlying app. Mirrors `app.use` —
274
318
  * pass handlers directly or a path-prefixed handler list. Register before
@@ -295,12 +339,12 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
295
339
  useOnError(...handlers: ErrorRequestHandler[]): this;
296
340
  useOnError(path: string, ...handlers: ErrorRequestHandler[]): this;
297
341
  /** Register MCP protocol-level middleware (catch-all). */
298
- mcpMiddleware(handler: McpMiddlewareFn): this;
342
+ mcpMiddleware(handler: McpMiddlewareFn<TAuthExtra>): this;
299
343
  /** Register MCP protocol-level middleware for all requests (`extra` is `McpExtra`). */
300
344
  mcpMiddleware(filter: "request", handler: (request: {
301
345
  method: string;
302
346
  params: Record<string, unknown>;
303
- }, extra: McpExtra, next: () => Promise<ServerResult>) => Promise<unknown> | unknown): this;
347
+ }, extra: McpExtra<TAuthExtra>, next: () => Promise<ServerResult>) => Promise<unknown> | unknown): this;
304
348
  /** Register MCP protocol-level middleware for all notifications (`extra` is `undefined`). */
305
349
  mcpMiddleware(filter: "notification", handler: (request: {
306
350
  method: string;
@@ -310,7 +354,7 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
310
354
  * Register MCP protocol-level middleware for an exact method.
311
355
  * Narrows `params`, `extra`, and `next()` result based on the method string.
312
356
  */
313
- mcpMiddleware<M extends McpMethodString>(filter: M, handler: McpTypedMiddlewareFn<M>): this;
357
+ mcpMiddleware<M extends McpMethodString>(filter: M, handler: McpTypedMiddlewareFn<M, TAuthExtra>): this;
314
358
  /**
315
359
  * Register MCP protocol-level middleware for a wildcard pattern (e.g. `"tools/*"`).
316
360
  * `next()` returns the union of result types for matching methods.
@@ -318,13 +362,13 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
318
362
  mcpMiddleware<W extends McpWildcard>(filter: W, handler: (request: {
319
363
  method: string;
320
364
  params: Record<string, unknown>;
321
- }, extra: McpExtraFor<W>, next: () => Promise<McpResultFor<W>>) => Promise<unknown> | unknown): this;
365
+ }, extra: McpExtraFor<W, TAuthExtra>, next: () => Promise<McpResultFor<W>>) => Promise<unknown> | unknown): this;
322
366
  /**
323
367
  * Register MCP protocol-level middleware with a method filter.
324
368
  * Filter can be an exact method (`"tools/call"`), wildcard (`"tools/*"`),
325
369
  * category (`"request"` | `"notification"`), or an array of those.
326
370
  */
327
- mcpMiddleware(filter: McpMiddlewareFilter, handler: McpMiddlewareFn): this;
371
+ mcpMiddleware(filter: McpMiddlewareFilter, handler: McpMiddlewareFn<TAuthExtra>): this;
328
372
  private applyMcpMiddleware;
329
373
  /**
330
374
  * Connect to an MCP transport (override of the SDK's `connect`). Use this
@@ -356,7 +400,10 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
356
400
  * the runtime can bridge incoming requests to the Node HTTP server. On
357
401
  * Vercel (`VERCEL === "1"`), returns the Express app directly so the
358
402
  * serverless function entry can call it as a `(req, res)` handler. On
359
- * Node, returns `undefined` once listening.
403
+ * Node, returns `undefined` once listening. When the process was spawned
404
+ * with an IPC channel, the bound port is reported to the parent as
405
+ * `{ type: "skybridge:listening", port }`, the readiness signal test runners
406
+ * wait on instead of polling.
360
407
  */
361
408
  run(): Promise<{
362
409
  fetch: (...args: unknown[]) => unknown;
@@ -366,7 +413,7 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
366
413
  private registerViewResources;
367
414
  private registerViewResource;
368
415
  private serveLegacyAppsSdkUrl;
369
- private wrapHandler;
416
+ private decorateToolHandler;
370
417
  private computeViewVersionParam;
371
418
  private lookupViewFile;
372
419
  private lookupDistFile;
@@ -413,7 +460,9 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
413
460
  content?: HandlerContent;
414
461
  }>(config: ToolConfig<InputArgs> & {
415
462
  name: TName;
416
- }, cb: ToolHandler<InputArgs, TReturn>): AddTool<TTools, TName, InputArgs, ExtractStructuredContent<TReturn>, ExtractMeta<TReturn>>;
417
- registerTool<InputArgs extends ZodRawShapeCompat>(config: ToolConfig<InputArgs>, cb: ToolHandler<InputArgs>): this;
463
+ }, cb: ToolHandler<InputArgs, TReturn, TAuthExtra>): AddTool<TTools, TName, InputArgs, ExtractStructuredContent<TReturn>, ExtractMeta<TReturn>, TAuthExtra>;
464
+ registerTool<InputArgs extends ZodRawShapeCompat>(config: ToolConfig<InputArgs>, cb: ToolHandler<InputArgs, {
465
+ content?: HandlerContent;
466
+ }, TAuthExtra>): this;
418
467
  }
419
468
  export {};