skybridge 1.3.1 → 2.0.0-alpha.2bb06a3

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 (65) hide show
  1. package/dist/cli/use-execute-steps.d.ts +1 -1
  2. package/dist/server/auth/discovery.d.ts +1 -0
  3. package/dist/server/auth/discovery.js +1 -1
  4. package/dist/server/auth/discovery.js.map +1 -1
  5. package/dist/server/auth/index.d.ts +1 -1
  6. package/dist/server/auth/index.js.map +1 -1
  7. package/dist/server/auth/providers/custom.d.ts +6 -4
  8. package/dist/server/auth/providers/custom.js +15 -6
  9. package/dist/server/auth/providers/custom.js.map +1 -1
  10. package/dist/server/auth/providers/custom.test.js +37 -9
  11. package/dist/server/auth/providers/custom.test.js.map +1 -1
  12. package/dist/server/auth/providers/descope.js +12 -3
  13. package/dist/server/auth/providers/descope.js.map +1 -1
  14. package/dist/server/auth/providers/descope.test.js +38 -17
  15. package/dist/server/auth/providers/descope.test.js.map +1 -1
  16. package/dist/server/auth/setup.js +1 -1
  17. package/dist/server/auth/setup.js.map +1 -1
  18. package/dist/server/auth/setup.test.js +14 -7
  19. package/dist/server/auth/setup.test.js.map +1 -1
  20. package/dist/server/auth/verify.d.ts +1 -1
  21. package/dist/server/auth/verify.js +2 -2
  22. package/dist/server/auth/verify.js.map +1 -1
  23. package/dist/server/auth.d.ts +4 -5
  24. package/dist/server/auth.js +3 -4
  25. package/dist/server/auth.js.map +1 -1
  26. package/dist/server/content-helpers.d.ts +1 -1
  27. package/dist/server/content-helpers.js.map +1 -1
  28. package/dist/server/express.js +4 -30
  29. package/dist/server/express.js.map +1 -1
  30. package/dist/server/express.test.js +14 -7
  31. package/dist/server/express.test.js.map +1 -1
  32. package/dist/server/index.d.ts +1 -1
  33. package/dist/server/index.js +1 -1
  34. package/dist/server/index.js.map +1 -1
  35. package/dist/server/middleware.d.ts +3 -5
  36. package/dist/server/middleware.js.map +1 -1
  37. package/dist/server/middleware.test-d.js +1 -1
  38. package/dist/server/middleware.test-d.js.map +1 -1
  39. package/dist/server/middleware.test.js +1 -2
  40. package/dist/server/middleware.test.js.map +1 -1
  41. package/dist/server/server.d.ts +23 -25
  42. package/dist/server/server.js +17 -25
  43. package/dist/server/server.js.map +1 -1
  44. package/dist/server/skills-integration.test.js +4 -4
  45. package/dist/server/skills-integration.test.js.map +1 -1
  46. package/dist/server/skills.d.ts +1 -2
  47. package/dist/server/skills.js +9 -10
  48. package/dist/server/skills.js.map +1 -1
  49. package/dist/server/skills.test.js +4 -4
  50. package/dist/server/skills.test.js.map +1 -1
  51. package/dist/server/view-resource-resolution.test.js +1 -3
  52. package/dist/server/view-resource-resolution.test.js.map +1 -1
  53. package/dist/standard-schema.d.ts +3 -0
  54. package/dist/standard-schema.js +2 -0
  55. package/dist/standard-schema.js.map +1 -0
  56. package/dist/test/utils.d.ts +2 -5
  57. package/dist/test/utils.js +8 -4
  58. package/dist/test/utils.js.map +1 -1
  59. package/dist/test/view.test.js +1 -2
  60. package/dist/test/view.test.js.map +1 -1
  61. package/dist/web/bridges/types.d.ts +6 -6
  62. package/dist/web/bridges/types.js.map +1 -1
  63. package/dist/web/hooks/use-register-view-tool.d.ts +2 -2
  64. package/dist/web/hooks/use-register-view-tool.js.map +1 -1
  65. package/package.json +6 -2
@@ -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, InMemoryTransport } from \"@modelcontextprotocol/client\";\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,10 +1,7 @@
1
1
  import type { McpUiToolMeta } from "@modelcontextprotocol/ext-apps";
2
- import { type ServerOptions } from "@modelcontextprotocol/sdk/server/index.js";
3
- import { McpServer as McpServerBase } from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import type { AnySchema, SchemaOutput, ZodRawShapeCompat } from "@modelcontextprotocol/sdk/server/zod-compat.js";
5
- import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
6
- import type { ContentBlock, Implementation, RequestMeta, ServerNotification, ServerRequest, ServerResult, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
2
+ import { type ContentBlock, type Implementation, McpServer as McpServerBase, type RequestMeta, Server as SdkServer, type ServerOptions, type ServerResult, type StandardSchemaV1, type ToolAnnotations } from "@modelcontextprotocol/server";
7
3
  import express, { type ErrorRequestHandler, type Express, type RequestHandler } from "express";
4
+ import type { InferSchemaOutput, RawInputShape } from "../standard-schema.js";
8
5
  import type { OAuthConfig } from "./auth/index.js";
9
6
  import type { McpExtra, McpExtraFor, McpMethodString, McpMiddlewareFilter, McpMiddlewareFn, McpResultFor, McpTypedMiddlewareFn, McpWildcard } from "./middleware.js";
10
7
  import { type SkillsManifest } from "./skills.js";
@@ -163,10 +160,10 @@ export interface McpServerTypes<TTools extends Record<string, ToolDef>> {
163
160
  type Simplify<T> = {
164
161
  [K in keyof T]: T[K];
165
162
  };
166
- type ShapeOutput<Shape extends ZodRawShapeCompat> = Simplify<{
167
- [K in keyof Shape as undefined extends SchemaOutput<Shape[K]> ? never : K]: SchemaOutput<Shape[K]>;
163
+ type ShapeOutput<Shape extends RawInputShape> = Simplify<{
164
+ [K in keyof Shape as undefined extends InferSchemaOutput<Shape[K]> ? never : K]: InferSchemaOutput<Shape[K]>;
168
165
  } & {
169
- [K in keyof Shape as undefined extends SchemaOutput<Shape[K]> ? K : never]?: SchemaOutput<Shape[K]>;
166
+ [K in keyof Shape as undefined extends InferSchemaOutput<Shape[K]> ? K : never]?: InferSchemaOutput<Shape[K]>;
170
167
  }>;
171
168
  type ExtractStructuredContent<T> = T extends {
172
169
  structuredContent: infer SC;
@@ -178,15 +175,15 @@ type ExtractMeta<T> = [Extract<T, {
178
175
  }> extends {
179
176
  _meta: infer M;
180
177
  } ? Simplify<M> : unknown;
181
- type AddTool<TTools, TName extends string, TInput extends ZodRawShapeCompat, TOutput, TResponseMetadata = unknown> = McpServer<TTools & {
178
+ type AddTool<TTools, TName extends string, TInput extends RawInputShape, TOutput, TResponseMetadata = unknown> = McpServer<TTools & {
182
179
  [K in TName]: ToolDef<ShapeOutput<TInput>, TOutput, TResponseMetadata>;
183
180
  }>;
184
- interface ToolConfigBase<TInput extends ZodRawShapeCompat | AnySchema> {
181
+ interface ToolConfigBase<TInput extends RawInputShape | StandardSchemaV1> {
185
182
  name: string;
186
183
  title?: string;
187
184
  description?: string;
188
185
  inputSchema?: TInput;
189
- outputSchema?: ZodRawShapeCompat | AnySchema;
186
+ outputSchema?: RawInputShape | StandardSchemaV1;
190
187
  annotations?: ToolAnnotations;
191
188
  view?: ViewConfig;
192
189
  _meta?: ToolMeta;
@@ -209,7 +206,7 @@ type ToolAuthConfig = {
209
206
  */
210
207
  securitySchemes?: SecurityScheme[];
211
208
  };
212
- type ToolConfig<TInput extends ZodRawShapeCompat | AnySchema> = ToolConfigBase<TInput> & ToolAuthConfig;
209
+ type ToolConfig<TInput extends RawInputShape | StandardSchemaV1> = ToolConfigBase<TInput> & ToolAuthConfig;
213
210
  /**
214
211
  * Optional client-supplied hints attached to `params._meta` on every tool call
215
212
  * by the Apps SDK host. Hints only: never use for authorization, and tolerate
@@ -239,10 +236,10 @@ export interface ClientHintsMeta {
239
236
  /** Stable id for the currently mounted widget instance. */
240
237
  "openai/widgetSessionId"?: string;
241
238
  }
242
- type ToolHandlerExtra = Omit<RequestHandlerExtra<ServerRequest, ServerNotification>, "_meta"> & {
239
+ type ToolHandlerExtra = Omit<McpExtra, "_meta"> & {
243
240
  _meta?: RequestMeta & ClientHintsMeta;
244
241
  };
245
- type ToolHandler<TInput extends ZodRawShapeCompat, TReturn extends {
242
+ type ToolHandler<TInput extends RawInputShape, TReturn extends {
246
243
  content?: HandlerContent;
247
244
  } = {
248
245
  content?: HandlerContent;
@@ -372,16 +369,17 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
372
369
  */
373
370
  connect(transport: Parameters<typeof McpServerBase.prototype.connect>[0]): Promise<void>;
374
371
  /**
375
- * Per-request stateless connect. The SDK's `Protocol` only allows one
376
- * transport per instance, so we can't reuse this `McpServer` across
377
- * concurrent requests. The SDK's idiomatic fix is a `() => McpServer`
378
- * factory, but that would break Skybridge's singleton API so instead
379
- * we build a fresh underlying `Server` per request and share the main
380
- * server's handler maps by reference. The cast is unavoidable: there's
381
- * no public API to inject handler maps. `getHandlerMaps` validates the
382
- * read side and fails fast on SDK field renames.
372
+ * Build a fresh underlying `Server` for one stateless HTTP request. The
373
+ * SDK's `Protocol` only allows one transport per instance, so we can't
374
+ * reuse this `McpServer` across concurrent requests. The SDK's idiomatic
375
+ * fix is a `() => Server` factory (passed to `createMcpHandler`), but a
376
+ * singleton API is Skybridge's contract so the factory returns a fresh
377
+ * `Server` that shares the main server's handler maps by reference. The
378
+ * cast is unavoidable: there's no public API to inject handler maps.
379
+ * `getHandlerMaps` validates the read side and fails fast on SDK field
380
+ * renames.
383
381
  */
384
- connectStatelessTransport(transport: Parameters<typeof McpServerBase.prototype.connect>[0]): Promise<void>;
382
+ createStatelessServerInstance(): SdkServer;
385
383
  /**
386
384
  * Start the HTTP server. Listens on `process.env.__PORT` (default `3000`),
387
385
  * mounts the `/mcp` route, applies any custom Express middleware registered
@@ -445,11 +443,11 @@ export declare class McpServer<TTools extends Record<string, ToolDef> = Record<n
445
443
  *
446
444
  * @see https://docs.skybridge.tech/api-reference/register-tool
447
445
  */
448
- registerTool<TName extends string, InputArgs extends ZodRawShapeCompat, TReturn extends {
446
+ registerTool<TName extends string, InputArgs extends RawInputShape, TReturn extends {
449
447
  content?: HandlerContent;
450
448
  }>(config: ToolConfig<InputArgs> & {
451
449
  name: TName;
452
450
  }, cb: ToolHandler<InputArgs, TReturn>): AddTool<TTools, TName, InputArgs, ExtractStructuredContent<TReturn>, ExtractMeta<TReturn>>;
453
- registerTool<InputArgs extends ZodRawShapeCompat>(config: ToolConfig<InputArgs>, cb: ToolHandler<InputArgs>): this;
451
+ registerTool<InputArgs extends RawInputShape>(config: ToolConfig<InputArgs>, cb: ToolHandler<InputArgs>): this;
454
452
  }
455
453
  export {};
@@ -2,8 +2,7 @@ import crypto from "node:crypto";
2
2
  import { readFileSync } from "node:fs";
3
3
  import http from "node:http";
4
4
  import path from "node:path";
5
- import { Server as SdkServer, } from "@modelcontextprotocol/sdk/server/index.js";
6
- import { McpServer as McpServerBase } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import { McpServer as McpServerBase, Server as SdkServer, } from "@modelcontextprotocol/server";
7
6
  import { mergeWith, union } from "es-toolkit";
8
7
  import express, {} from "express";
9
8
  import { authToSecuritySchemes, evaluateSecuritySchemes, inBandChallengeResult, } from "./auth/security-schemes.js";
@@ -376,23 +375,24 @@ export class McpServer extends McpServerBaseOmitted {
376
375
  return McpServerBase.prototype.connect.call(this, transport);
377
376
  }
378
377
  /**
379
- * Per-request stateless connect. The SDK's `Protocol` only allows one
380
- * transport per instance, so we can't reuse this `McpServer` across
381
- * concurrent requests. The SDK's idiomatic fix is a `() => McpServer`
382
- * factory, but that would break Skybridge's singleton API so instead
383
- * we build a fresh underlying `Server` per request and share the main
384
- * server's handler maps by reference. The cast is unavoidable: there's
385
- * no public API to inject handler maps. `getHandlerMaps` validates the
386
- * read side and fails fast on SDK field renames.
378
+ * Build a fresh underlying `Server` for one stateless HTTP request. The
379
+ * SDK's `Protocol` only allows one transport per instance, so we can't
380
+ * reuse this `McpServer` across concurrent requests. The SDK's idiomatic
381
+ * fix is a `() => Server` factory (passed to `createMcpHandler`), but a
382
+ * singleton API is Skybridge's contract so the factory returns a fresh
383
+ * `Server` that shares the main server's handler maps by reference. The
384
+ * cast is unavoidable: there's no public API to inject handler maps.
385
+ * `getHandlerMaps` validates the read side and fails fast on SDK field
386
+ * renames.
387
387
  */
388
- async connectStatelessTransport(transport) {
388
+ createStatelessServerInstance() {
389
389
  this.applyMcpMiddleware();
390
390
  const { requestHandlers, notificationHandlers } = getHandlerMaps(this.server);
391
391
  const fresh = new SdkServer(this.serverInfo, this.serverOptions);
392
392
  const target = fresh;
393
393
  target._requestHandlers = requestHandlers;
394
394
  target._notificationHandlers = notificationHandlers;
395
- await fresh.connect(transport);
395
+ return fresh;
396
396
  }
397
397
  /**
398
398
  * Start the HTTP server. Listens on `process.env.__PORT` (default `3000`),
@@ -467,13 +467,9 @@ export class McpServer extends McpServerBaseOmitted {
467
467
  }
468
468
  this.claimedViews.set(component, toolName);
469
469
  }
470
- resolveViewRequestContext(extra) {
470
+ resolveViewRequestContext(ctx) {
471
471
  const isProduction = process.env.NODE_ENV === "production";
472
- const headers = extra?.requestInfo?.headers || {};
473
- const header = (key) => {
474
- const val = headers[key];
475
- return Array.isArray(val) ? val[0] : val;
476
- };
472
+ const header = (key) => ctx?.http?.req?.headers.get(key) ?? undefined;
477
473
  const isClaude = hostFromUserAgent(header("user-agent")) === "claude";
478
474
  const serverUrl = resolveServerOrigin(header);
479
475
  // Path prefix the proxy routed this request under (e.g. `foo.com/v1`). Read
@@ -489,7 +485,7 @@ export class McpServer extends McpServerBaseOmitted {
489
485
  }
490
486
  let contentMetaOverrides = {};
491
487
  if (isClaude) {
492
- const pathname = extra?.requestInfo?.url?.pathname ?? "";
488
+ const pathname = ctx?.http?.req ? new URL(ctx.http.req.url).pathname : "";
493
489
  const rawUrl = header("x-alpic-forwarded-url") ?? `${serverUrl}${pathname}`;
494
490
  // Strip a lone trailing slash so the hash matches the connector URL
495
491
  // as registered with Claude (which has no trailing slash on bare origins).
@@ -621,13 +617,9 @@ export class McpServer extends McpServerBaseOmitted {
621
617
  decorateToolHandler(cb, { attachViewUUID, securitySchemes, }) {
622
618
  return async (args, extra) => {
623
619
  if (this.oauthEnabled) {
624
- const failure = evaluateSecuritySchemes(securitySchemes, extra.authInfo);
620
+ const failure = evaluateSecuritySchemes(securitySchemes, extra.http?.authInfo);
625
621
  if (failure) {
626
- const headers = extra?.requestInfo?.headers ?? {};
627
- const header = (key) => {
628
- const value = headers[key];
629
- return Array.isArray(value) ? value[0] : value;
630
- };
622
+ const header = (key) => extra.http?.req?.headers.get(key) ?? undefined;
631
623
  return inBandChallengeResult(failure, this.resolveResourceMetadataUrl?.(header));
632
624
  }
633
625
  }