trpc-to-mcp 1.3.2 → 2.0.0

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 (70) hide show
  1. package/README.md +138 -178
  2. package/dist/adapters/vercel-mcp-adapter.cjs +19 -0
  3. package/dist/adapters/vercel-mcp-adapter.cjs.map +1 -0
  4. package/dist/adapters/vercel-mcp-adapter.d.cts +17 -0
  5. package/dist/adapters/vercel-mcp-adapter.d.mts +16 -13
  6. package/dist/adapters/vercel-mcp-adapter.mjs +15 -27
  7. package/dist/adapters/vercel-mcp-adapter.mjs.map +1 -1
  8. package/dist/helpers.cjs +20 -0
  9. package/dist/helpers.cjs.map +1 -0
  10. package/dist/helpers.d.cts +13 -0
  11. package/dist/helpers.d.mts +13 -6
  12. package/dist/helpers.mjs +17 -2
  13. package/dist/helpers.mjs.map +1 -1
  14. package/dist/index.cjs +9 -0
  15. package/dist/index.d.cts +5 -0
  16. package/dist/index.d.mts +5 -10
  17. package/dist/index.mjs +5 -6
  18. package/dist/server.cjs +18 -0
  19. package/dist/server.cjs.map +1 -0
  20. package/dist/server.d.cts +12 -0
  21. package/dist/server.d.mts +12 -12
  22. package/dist/server.mjs +16 -3
  23. package/dist/server.mjs.map +1 -1
  24. package/dist/tools.cjs +121 -0
  25. package/dist/tools.cjs.map +1 -0
  26. package/dist/tools.d.cts +23 -0
  27. package/dist/tools.d.mts +22 -15
  28. package/dist/tools.mjs +118 -2
  29. package/dist/tools.mjs.map +1 -1
  30. package/dist/types.cjs +0 -0
  31. package/dist/types.d.cts +31 -0
  32. package/dist/types.d.mts +30 -13
  33. package/dist/types.mjs +1 -3
  34. package/package.json +55 -73
  35. package/dist/adapters/vercel-mcp-adapter.d.ts +0 -14
  36. package/dist/adapters/vercel-mcp-adapter.js +0 -32
  37. package/dist/adapters/vercel-mcp-adapter.js.map +0 -1
  38. package/dist/chunk-55J6XMHW.js +0 -4
  39. package/dist/chunk-55J6XMHW.js.map +0 -1
  40. package/dist/chunk-7GYUHEUD.mjs +0 -47
  41. package/dist/chunk-7GYUHEUD.mjs.map +0 -1
  42. package/dist/chunk-BTXMEL6M.js +0 -55
  43. package/dist/chunk-BTXMEL6M.js.map +0 -1
  44. package/dist/chunk-FIQIIJAT.mjs +0 -11
  45. package/dist/chunk-FIQIIJAT.mjs.map +0 -1
  46. package/dist/chunk-FT3KTYAU.js +0 -13
  47. package/dist/chunk-FT3KTYAU.js.map +0 -1
  48. package/dist/chunk-KIQOUUEZ.mjs +0 -3
  49. package/dist/chunk-KIQOUUEZ.mjs.map +0 -1
  50. package/dist/chunk-RJJMUGXY.js +0 -50
  51. package/dist/chunk-RJJMUGXY.js.map +0 -1
  52. package/dist/chunk-ULLXW6IN.mjs +0 -52
  53. package/dist/chunk-ULLXW6IN.mjs.map +0 -1
  54. package/dist/helpers.d.ts +0 -6
  55. package/dist/helpers.js +0 -12
  56. package/dist/helpers.js.map +0 -1
  57. package/dist/index.d.ts +0 -10
  58. package/dist/index.js +0 -31
  59. package/dist/index.js.map +0 -1
  60. package/dist/index.mjs.map +0 -1
  61. package/dist/server.d.ts +0 -12
  62. package/dist/server.js +0 -17
  63. package/dist/server.js.map +0 -1
  64. package/dist/tools.d.ts +0 -16
  65. package/dist/tools.js +0 -16
  66. package/dist/tools.js.map +0 -1
  67. package/dist/types.d.ts +0 -14
  68. package/dist/types.js +0 -6
  69. package/dist/types.js.map +0 -1
  70. package/dist/types.mjs.map +0 -1
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "trpc-to-mcp",
3
3
  "license": "MIT",
4
- "version": "1.3.2",
5
- "main": "./dist/index.js",
4
+ "version": "2.0.0",
5
+ "description": "Turn tRPC procedures into MCP tools",
6
+ "main": "./dist/index.cjs",
6
7
  "module": "./dist/index.mjs",
7
- "types": "./dist/index.d.ts",
8
- "description": "tRPC to MCP adapter",
8
+ "types": "./dist/index.d.cts",
9
+ "sideEffects": false,
9
10
  "keywords": [
10
11
  "trpc",
11
12
  "mcp",
12
13
  "modelcontextprotocol",
13
- "vercel"
14
+ "mcp-handler"
14
15
  ],
15
16
  "files": [
16
17
  "dist"
@@ -21,87 +22,68 @@
21
22
  },
22
23
  "exports": {
23
24
  ".": {
24
- "import": {
25
- "types": "./dist/index.d.ts",
26
- "default": "./dist/index.mjs"
27
- },
28
- "require": {
29
- "types": "./dist/index.d.ts",
30
- "default": "./dist/index.js"
31
- }
25
+ "import": "./dist/index.mjs",
26
+ "require": "./dist/index.cjs"
27
+ },
28
+ "./adapters/vercel-mcp-adapter": {
29
+ "import": "./dist/adapters/vercel-mcp-adapter.mjs",
30
+ "require": "./dist/adapters/vercel-mcp-adapter.cjs"
31
+ },
32
+ "./helpers": {
33
+ "import": "./dist/helpers.mjs",
34
+ "require": "./dist/helpers.cjs"
32
35
  },
33
36
  "./server": {
34
- "import": {
35
- "types": "./dist/server.d.ts",
36
- "default": "./dist/server.mjs"
37
- },
38
- "require": {
39
- "types": "./dist/server.d.ts",
40
- "default": "./dist/server.js"
41
- }
37
+ "import": "./dist/server.mjs",
38
+ "require": "./dist/server.cjs"
42
39
  },
43
40
  "./tools": {
44
- "import": {
45
- "types": "./dist/tools.d.ts",
46
- "default": "./dist/tools.mjs"
47
- },
48
- "require": {
49
- "types": "./dist/tools.d.ts",
50
- "default": "./dist/tools.js"
51
- }
52
- },
53
- "./helpers": {
54
- "import": {
55
- "types": "./dist/helpers.d.ts",
56
- "default": "./dist/helpers.mjs"
57
- },
58
- "require": {
59
- "types": "./dist/helpers.d.ts",
60
- "default": "./dist/helpers.js"
61
- }
41
+ "import": "./dist/tools.mjs",
42
+ "require": "./dist/tools.cjs"
62
43
  },
63
44
  "./types": {
64
- "import": {
65
- "types": "./dist/types.d.ts",
66
- "default": "./dist/types.mjs"
67
- },
68
- "require": {
69
- "types": "./dist/types.d.ts",
70
- "default": "./dist/types.js"
71
- }
45
+ "import": "./dist/types.mjs",
46
+ "require": "./dist/types.cjs"
72
47
  },
73
- "./adapters/vercel-mcp-adapter": {
74
- "import": {
75
- "types": "./dist/adapters/vercel-mcp-adapter.d.ts",
76
- "default": "./dist/adapters/vercel-mcp-adapter.mjs"
77
- },
78
- "require": {
79
- "types": "./dist/adapters/vercel-mcp-adapter.d.ts",
80
- "default": "./dist/adapters/vercel-mcp-adapter.js"
81
- }
82
- }
48
+ "./package.json": "./package.json"
83
49
  },
84
50
  "devDependencies": {
85
- "@changesets/cli": "^2.29.5",
86
- "@ianvs/prettier-plugin-sort-imports": "^4.6.0",
87
- "prettier": "^3.6.2",
88
- "tsup": "^8.5.0",
89
- "typescript": "^5.9.2"
51
+ "@changesets/cli": "^3.0.3",
52
+ "@modelcontextprotocol/client": "^2.1.0",
53
+ "@modelcontextprotocol/server": "^2.1.0",
54
+ "@trpc/server": "^11.19.0",
55
+ "@types/node": "^24.13.6",
56
+ "mcp-handler": "^2.2.0",
57
+ "oxfmt": "^0.70.0",
58
+ "oxlint": "^1.85.0",
59
+ "oxlint-tsgolint": "^7.0.2002",
60
+ "tsdown": "^0.23.0",
61
+ "typescript": "^6.0.3",
62
+ "vitest": "^5.0.1",
63
+ "zod": "^4.6.5"
90
64
  },
91
65
  "peerDependencies": {
92
- "@trpc/server": "^11.4.4",
93
- "better-auth": "^1.3.4",
94
- "mcp-handler": "^1.0.1",
95
- "zod": "^4.0.15"
66
+ "@modelcontextprotocol/server": "^2.0.0",
67
+ "@trpc/server": "^11.0.0",
68
+ "mcp-handler": "^2.0.0"
69
+ },
70
+ "peerDependenciesMeta": {
71
+ "mcp-handler": {
72
+ "optional": true
73
+ }
96
74
  },
97
- "dependencies": {
98
- "@modelcontextprotocol/sdk": "^1.17.2"
75
+ "engines": {
76
+ "node": ">=20"
99
77
  },
100
78
  "scripts": {
101
- "build": "tsup ./src",
102
- "dev": "tsup --watch",
103
- "release": "pnpm run build && changeset publish",
104
- "format": "prettier --write \"**/*.{ts,tsx,css,md}\"",
105
- "lint": "tsc"
79
+ "build": "tsdown",
80
+ "dev": "tsdown --watch",
81
+ "test": "vitest run",
82
+ "lint": "oxlint",
83
+ "lint:fix": "oxlint --fix",
84
+ "typecheck": "tsc",
85
+ "format": "oxfmt",
86
+ "format:check": "oxfmt --check",
87
+ "release": "pnpm run build && changeset publish"
106
88
  }
107
89
  }
@@ -1,14 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp';
2
- import { AnyRootTypes, RouterRecord, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
3
- import { createMcpHandler } from 'mcp-handler';
4
-
5
- type VercelMcpHandler = ReturnType<typeof createMcpHandler>;
6
- type McpServerOptions = Parameters<typeof createMcpHandler>[1];
7
- type McpHandlerConfig = Parameters<typeof createMcpHandler>[2];
8
- declare function trpcToMcpHandler<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>), handlerOptions: {
9
- config: McpHandlerConfig;
10
- serverOptions?: McpServerOptions;
11
- callback?: (server: McpServer) => unknown;
12
- }): (request: Request) => Promise<Response>;
13
-
14
- export { type McpHandlerConfig, type McpServerOptions, type VercelMcpHandler, trpcToMcpHandler };
@@ -1,32 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkRJJMUGXY_js = require('../chunk-RJJMUGXY.js');
4
- var chunkBTXMEL6M_js = require('../chunk-BTXMEL6M.js');
5
- var mcpHandler = require('mcp-handler');
6
-
7
- function trpcToMcpHandler(appRouter, ctx, handlerOptions) {
8
- const { serverOptions, config, callback } = handlerOptions;
9
- const tools = chunkBTXMEL6M_js.extractToolsFromProcedures(appRouter);
10
- const trpcCaller = appRouter.createCaller(ctx);
11
- const handler = mcpHandler.createMcpHandler(
12
- (server) => {
13
- chunkRJJMUGXY_js.setRequestHandler(server.server, tools, trpcCaller);
14
- if (typeof callback === "function") {
15
- callback(server);
16
- }
17
- },
18
- {
19
- // Leave it empty because we list tools manually
20
- capabilities: {
21
- tools: {}
22
- },
23
- ...serverOptions
24
- },
25
- config
26
- );
27
- return handler;
28
- }
29
-
30
- exports.trpcToMcpHandler = trpcToMcpHandler;
31
- //# sourceMappingURL=vercel-mcp-adapter.js.map
32
- //# sourceMappingURL=vercel-mcp-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/adapters/vercel-mcp-adapter.ts"],"names":["extractToolsFromProcedures","createMcpHandler","setRequestHandler"],"mappings":";;;;;;AAgBO,SAAS,gBAAA,CAId,SAAA,EACA,GAAA,EACA,cAAA,EAKA;AACA,EAAA,MAAM,EAAE,aAAA,EAAe,MAAA,EAAQ,QAAA,EAAS,GAAI,cAAA;AAE5C,EAAA,MAAM,KAAA,GAAQA,4CAA2B,SAAS,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,YAAA,CAAa,GAAG,CAAA;AAE7C,EAAA,MAAM,OAAA,GAAUC,2BAAA;AAAA,IACd,CAAC,MAAA,KAAW;AACV,MAAAC,kCAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAElD,MAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,QAAA,QAAA,CAAS,MAAM,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA;AAAA;AAAA,MAEE,YAAA,EAAc;AAAA,QACZ,OAAO;AAAC,OACV;AAAA,MACA,GAAG;AAAA,KACL;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT","file":"vercel-mcp-adapter.js","sourcesContent":["import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp\";\nimport type {\n AnyRootTypes,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\nimport { createMcpHandler } from \"mcp-handler\";\n\nimport { setRequestHandler } from \"../server\";\nimport { extractToolsFromProcedures } from \"../tools\";\n\nexport type VercelMcpHandler = ReturnType<typeof createMcpHandler>;\nexport type McpServerOptions = Parameters<typeof createMcpHandler>[1];\nexport type McpHandlerConfig = Parameters<typeof createMcpHandler>[2];\n\nexport function trpcToMcpHandler<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n handlerOptions: {\n config: McpHandlerConfig;\n serverOptions?: McpServerOptions;\n callback?: (server: McpServer) => unknown;\n },\n) {\n const { serverOptions, config, callback } = handlerOptions;\n\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const handler = createMcpHandler(\n (server) => {\n setRequestHandler(server.server, tools, trpcCaller);\n\n if (typeof callback === \"function\") {\n callback(server);\n }\n },\n {\n // Leave it empty because we list tools manually\n capabilities: {\n tools: {},\n },\n ...serverOptions,\n },\n config,\n );\n\n return handler;\n}\n"]}
@@ -1,4 +0,0 @@
1
- 'use strict';
2
-
3
- //# sourceMappingURL=chunk-55J6XMHW.js.map
4
- //# sourceMappingURL=chunk-55J6XMHW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-55J6XMHW.js"}
@@ -1,47 +0,0 @@
1
- import { extractToolsFromProcedures } from './chunk-ULLXW6IN.mjs';
2
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
-
5
- function setRequestHandler(server, tools, trpcCaller) {
6
- server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));
7
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
8
- const { name, arguments: args } = request.params;
9
- const tool = tools.find((t) => t.name === name);
10
- if (!tool) {
11
- return { content: [{ type: "text", text: "Could not find tool" }] };
12
- }
13
- const procedure = tool.pathInRouter.reduce(
14
- // @ts-expect-error path in router
15
- (acc, part) => acc?.[part],
16
- trpcCaller
17
- );
18
- if (typeof tool.transformMcpProcedure === "function") {
19
- const output = await procedure(args);
20
- const result = await tool.transformMcpProcedure(output);
21
- return {
22
- content: result
23
- };
24
- } else {
25
- const result = await procedure(args);
26
- return {
27
- content: [{ type: "text", text: JSON.stringify(result) }]
28
- };
29
- }
30
- });
31
- }
32
- function createMcpServer(implementation, appRouter, ctx) {
33
- const tools = extractToolsFromProcedures(appRouter);
34
- const trpcCaller = appRouter.createCaller(ctx);
35
- const server = new McpServer(implementation, {
36
- capabilities: {
37
- // Leave it empty because we list tools manually
38
- tools: {}
39
- }
40
- });
41
- setRequestHandler(server.server, tools, trpcCaller);
42
- return server;
43
- }
44
-
45
- export { createMcpServer, setRequestHandler };
46
- //# sourceMappingURL=chunk-7GYUHEUD.mjs.map
47
- //# sourceMappingURL=chunk-7GYUHEUD.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":[],"mappings":";;;;AAkBO,SAAS,iBAAA,CACd,MAAA,EACA,KAAA,EACA,UAAA,EACA;AAEA,EAAA,MAAA,CAAO,iBAAA,CAAkB,sBAAA,EAAwB,OAAO,EAAE,OAAM,CAAE,CAAA;AAGlE,EAAA,MAAA,CAAO,iBAAA,CAAkB,qBAAA,EAAuB,OAAO,OAAA,KAAY;AACjE,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,KAAS,OAAA,CAAQ,MAAA;AAE1C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAE9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,qBAAA,EAAuB,CAAA,EAAE;AAAA,IACpE;AAGA,IAAA,MAAM,SAAA,GAA0B,KAAK,YAAA,CAAa,MAAA;AAAA;AAAA,MAEhD,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAI,CAAA;AAAA,MACzB;AAAA,KACF;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,UAAA,EAAY;AAEpD,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA;AAEtD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAEnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAAA,OAC1D;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,eAAA,CAId,cAAA,EACA,SAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQ,2BAA2B,SAAS,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,YAAA,CAAa,GAAG,CAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,cAAA,EAAgB;AAAA,IAC3C,YAAA,EAAc;AAAA;AAAA,MAEZ,OAAO;AAAC;AACV,GACD,CAAA;AAED,EAAA,iBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAElD,EAAA,OAAO,MAAA;AACT","file":"chunk-7GYUHEUD.mjs","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Implementation,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n AnyProcedure,\n AnyRootTypes,\n DecorateRouterRecord,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nimport { extractToolsFromProcedures, type McpTool } from \"./tools\";\n\nexport function setRequestHandler<TRecord extends RouterRecord>(\n server: Server,\n tools: McpTool[],\n trpcCaller: DecorateRouterRecord<TRecord>,\n) {\n // List all of the available tools\n server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const tool = tools.find((t) => t.name === name);\n\n if (!tool) {\n return { content: [{ type: \"text\", text: \"Could not find tool\" }] };\n }\n\n // @ts-expect-error path in router\n const procedure: AnyProcedure = tool.pathInRouter.reduce(\n // @ts-expect-error path in router\n (acc, part) => acc?.[part],\n trpcCaller,\n );\n\n if (typeof tool.transformMcpProcedure === \"function\") {\n // @ts-expect-error path in router\n const output = await procedure(args);\n const result = await tool.transformMcpProcedure(output);\n\n return {\n content: result,\n };\n } else {\n // @ts-expect-error path in router\n const result = await procedure(args);\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(result) }],\n };\n }\n });\n}\n\nexport function createMcpServer<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n implementation: Implementation,\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n) {\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const server = new McpServer(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server.server, tools, trpcCaller);\n\n return server;\n}\n"]}
@@ -1,55 +0,0 @@
1
- 'use strict';
2
-
3
- var v4 = require('zod/v4');
4
-
5
- // src/tools.ts
6
- function mergeInputs(inputs) {
7
- return inputs.reduce((acc, input) => {
8
- return acc.extend(input.shape);
9
- }, v4.z.object());
10
- }
11
- function extractToolsFromProcedures(appRouter, currentPath = []) {
12
- const tools = [];
13
- const procedures = Object.entries(appRouter._def.procedures);
14
- for (const [name, procedure] of procedures) {
15
- if (procedure._def && "inputs" in procedure._def) {
16
- const inputs = procedure._def.inputs;
17
- const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];
18
- const meta = procedure._def.meta;
19
- if (!meta || !meta?.mcp?.enabled) {
20
- continue;
21
- }
22
- const pathInRouter = [...currentPath, ...name.split(".")];
23
- const tool = {
24
- name: meta?.mcp?.name ?? name.replace(/\./g, "_"),
25
- description: meta?.mcp?.description ?? "",
26
- pathInRouter,
27
- transformMcpProcedure: meta?.mcp?.transformMcpProcedure
28
- };
29
- if (schema) {
30
- const jsonSchema = v4.z.toJSONSchema(schema, {
31
- unrepresentable: "any"
32
- });
33
- if (jsonSchema.type === "object") {
34
- const { type, properties = {}, required = [] } = jsonSchema;
35
- tool.inputSchema = { type, properties, required };
36
- } else {
37
- console.error(
38
- "[TRPC-TO-MCP] Procedure has no object schema",
39
- pathInRouter
40
- );
41
- }
42
- } else {
43
- const jsonSchema = v4.z.toJSONSchema(v4.z.object());
44
- tool.inputSchema = jsonSchema;
45
- }
46
- tools.push(tool);
47
- }
48
- }
49
- return tools;
50
- }
51
-
52
- exports.extractToolsFromProcedures = extractToolsFromProcedures;
53
- exports.mergeInputs = mergeInputs;
54
- //# sourceMappingURL=chunk-BTXMEL6M.js.map
55
- //# sourceMappingURL=chunk-BTXMEL6M.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools.ts"],"names":["z"],"mappings":";;;;;AAmBO,SAAS,YAAY,MAAA,EAAuB;AACjD,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU;AACnC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,EAC/B,CAAA,EAAGA,IAAA,CAAE,MAAA,EAAQ,CAAA;AACf;AAEO,SAAS,0BAAA,CAGd,SAAA,EAAmC,WAAA,GAAwB,EAAC,EAAG;AAC/D,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,UAAU,CAAA;AAE3D,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,UAAA,EAAY;AAC1C,IAAA,IAAI,SAAA,CAAU,IAAA,IAAQ,QAAA,IAAY,SAAA,CAAU,IAAA,EAAM;AAChD,MAAA,MAAM,MAAA,GAAS,UAAU,IAAA,CAAK,MAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,CAAA,GAAI,YAAY,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAEjE,MAAA,MAAM,IAAA,GAAO,UAAU,IAAA,CAAK,IAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,KAAK,OAAA,EAAS;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,CAAC,GAAG,WAAA,EAAa,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AACxD,MAAA,MAAM,IAAA,GAAgB;AAAA,QACpB,MAAM,IAAA,EAAM,GAAA,EAAK,QAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,QAChD,WAAA,EAAa,IAAA,EAAM,GAAA,EAAK,WAAA,IAAe,EAAA;AAAA,QACvC,YAAA;AAAA,QACA,qBAAA,EAAuB,MAAM,GAAA,EAAK;AAAA,OACpC;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,UAAA,GAAaA,IAAA,CAAE,YAAA,CAAa,MAAA,EAAQ;AAAA,UACxC,eAAA,EAAiB;AAAA,SAClB,CAAA;AAED,QAAA,IAAI,UAAA,CAAW,SAAS,QAAA,EAAU;AAChC,UAAA,MAAM,EAAE,MAAM,UAAA,GAAa,IAAI,QAAA,GAAW,IAAG,GAAI,UAAA;AACjD,UAAA,IAAA,CAAK,WAAA,GAAc,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAS;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,8CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,UAAA,GAAaA,IAAA,CAAE,YAAA,CAAaA,IAAA,CAAE,QAAQ,CAAA;AAC5C,QAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AAAA,MACrB;AAEA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT","file":"chunk-BTXMEL6M.js","sourcesContent":["// Credits to https://github.com/Jacse/trpc-mcp for the helpful code\n\nimport type {\n AnyRootTypes,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\nimport { z } from \"zod/v4\";\n\nimport type { McpMeta, TransformMcpProcedureFunction } from \"./types\";\n\nexport type McpTool = {\n name: string;\n description: string;\n pathInRouter: string[];\n inputSchema?: z.core.JSONSchema.JSONSchema;\n transformMcpProcedure?: TransformMcpProcedureFunction;\n};\n\nexport function mergeInputs(inputs: z.ZodObject[]) {\n return inputs.reduce((acc, input) => {\n return acc.extend(input.shape);\n }, z.object());\n}\n\nexport function extractToolsFromProcedures<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(appRouter: Router<TRoot, TRecord>, currentPath: string[] = []) {\n const tools: McpTool[] = [];\n const procedures = Object.entries(appRouter._def.procedures);\n\n for (const [name, procedure] of procedures) {\n if (procedure._def && \"inputs\" in procedure._def) {\n const inputs = procedure._def.inputs as z.ZodObject[];\n const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];\n\n const meta = procedure._def.meta as McpMeta;\n if (!meta || !meta?.mcp?.enabled) {\n continue;\n }\n\n const pathInRouter = [...currentPath, ...name.split(\".\")];\n const tool: McpTool = {\n name: meta?.mcp?.name ?? name.replace(/\\./g, \"_\"),\n description: meta?.mcp?.description ?? \"\",\n pathInRouter,\n transformMcpProcedure: meta?.mcp?.transformMcpProcedure,\n };\n\n if (schema) {\n const jsonSchema = z.toJSONSchema(schema, {\n unrepresentable: \"any\",\n });\n\n if (jsonSchema.type === \"object\") {\n const { type, properties = {}, required = [] } = jsonSchema;\n tool.inputSchema = { type, properties, required };\n } else {\n console.error(\n \"[TRPC-TO-MCP] Procedure has no object schema\",\n pathInRouter,\n );\n }\n } else {\n // If there is not schema, we have to pass an empty object for JSON schema compatibility\n const jsonSchema = z.toJSONSchema(z.object());\n tool.inputSchema = jsonSchema;\n }\n\n tools.push(tool);\n }\n }\n\n return tools;\n}\n"]}
@@ -1,11 +0,0 @@
1
- // src/helpers.ts
2
- function transformMcpProcedure(procedure, callback) {
3
- if (procedure.meta?.mcp?.enabled) {
4
- procedure.meta.mcp.transformMcpProcedure = callback;
5
- }
6
- return procedure;
7
- }
8
-
9
- export { transformMcpProcedure };
10
- //# sourceMappingURL=chunk-FIQIIJAT.mjs.map
11
- //# sourceMappingURL=chunk-FIQIIJAT.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/helpers.ts"],"names":[],"mappings":";AAOO,SAAS,qBAAA,CACd,WACA,QAAA,EAGA;AACA,EAAA,IAAI,SAAA,CAAU,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS;AAChC,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,qBAAA,GAAwB,QAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,SAAA;AACT","file":"chunk-FIQIIJAT.mjs","sourcesContent":["import { ContentBlock } from \"@modelcontextprotocol/sdk/types\";\nimport type {\n AnyProcedure,\n MaybePromise,\n inferProcedureOutput,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nexport function transformMcpProcedure<TProcedure extends AnyProcedure>(\n procedure: TProcedure,\n callback: (\n output: inferProcedureOutput<TProcedure>,\n ) => MaybePromise<ContentBlock[]>,\n) {\n if (procedure.meta?.mcp?.enabled) {\n procedure.meta.mcp.transformMcpProcedure = callback;\n }\n\n return procedure;\n}\n"]}
@@ -1,13 +0,0 @@
1
- 'use strict';
2
-
3
- // src/helpers.ts
4
- function transformMcpProcedure(procedure, callback) {
5
- if (procedure.meta?.mcp?.enabled) {
6
- procedure.meta.mcp.transformMcpProcedure = callback;
7
- }
8
- return procedure;
9
- }
10
-
11
- exports.transformMcpProcedure = transformMcpProcedure;
12
- //# sourceMappingURL=chunk-FT3KTYAU.js.map
13
- //# sourceMappingURL=chunk-FT3KTYAU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/helpers.ts"],"names":[],"mappings":";;;AAOO,SAAS,qBAAA,CACd,WACA,QAAA,EAGA;AACA,EAAA,IAAI,SAAA,CAAU,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS;AAChC,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,qBAAA,GAAwB,QAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,SAAA;AACT","file":"chunk-FT3KTYAU.js","sourcesContent":["import { ContentBlock } from \"@modelcontextprotocol/sdk/types\";\nimport type {\n AnyProcedure,\n MaybePromise,\n inferProcedureOutput,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nexport function transformMcpProcedure<TProcedure extends AnyProcedure>(\n procedure: TProcedure,\n callback: (\n output: inferProcedureOutput<TProcedure>,\n ) => MaybePromise<ContentBlock[]>,\n) {\n if (procedure.meta?.mcp?.enabled) {\n procedure.meta.mcp.transformMcpProcedure = callback;\n }\n\n return procedure;\n}\n"]}
@@ -1,3 +0,0 @@
1
-
2
- //# sourceMappingURL=chunk-KIQOUUEZ.mjs.map
3
- //# sourceMappingURL=chunk-KIQOUUEZ.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-KIQOUUEZ.mjs"}
@@ -1,50 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkBTXMEL6M_js = require('./chunk-BTXMEL6M.js');
4
- var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
5
- var types_js = require('@modelcontextprotocol/sdk/types.js');
6
-
7
- function setRequestHandler(server, tools, trpcCaller) {
8
- server.setRequestHandler(types_js.ListToolsRequestSchema, () => ({ tools }));
9
- server.setRequestHandler(types_js.CallToolRequestSchema, async (request) => {
10
- const { name, arguments: args } = request.params;
11
- const tool = tools.find((t) => t.name === name);
12
- if (!tool) {
13
- return { content: [{ type: "text", text: "Could not find tool" }] };
14
- }
15
- const procedure = tool.pathInRouter.reduce(
16
- // @ts-expect-error path in router
17
- (acc, part) => acc?.[part],
18
- trpcCaller
19
- );
20
- if (typeof tool.transformMcpProcedure === "function") {
21
- const output = await procedure(args);
22
- const result = await tool.transformMcpProcedure(output);
23
- return {
24
- content: result
25
- };
26
- } else {
27
- const result = await procedure(args);
28
- return {
29
- content: [{ type: "text", text: JSON.stringify(result) }]
30
- };
31
- }
32
- });
33
- }
34
- function createMcpServer(implementation, appRouter, ctx) {
35
- const tools = chunkBTXMEL6M_js.extractToolsFromProcedures(appRouter);
36
- const trpcCaller = appRouter.createCaller(ctx);
37
- const server = new mcp_js.McpServer(implementation, {
38
- capabilities: {
39
- // Leave it empty because we list tools manually
40
- tools: {}
41
- }
42
- });
43
- setRequestHandler(server.server, tools, trpcCaller);
44
- return server;
45
- }
46
-
47
- exports.createMcpServer = createMcpServer;
48
- exports.setRequestHandler = setRequestHandler;
49
- //# sourceMappingURL=chunk-RJJMUGXY.js.map
50
- //# sourceMappingURL=chunk-RJJMUGXY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":["ListToolsRequestSchema","CallToolRequestSchema","extractToolsFromProcedures","McpServer"],"mappings":";;;;;;AAkBO,SAAS,iBAAA,CACd,MAAA,EACA,KAAA,EACA,UAAA,EACA;AAEA,EAAA,MAAA,CAAO,iBAAA,CAAkBA,+BAAA,EAAwB,OAAO,EAAE,OAAM,CAAE,CAAA;AAGlE,EAAA,MAAA,CAAO,iBAAA,CAAkBC,8BAAA,EAAuB,OAAO,OAAA,KAAY;AACjE,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,KAAS,OAAA,CAAQ,MAAA;AAE1C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAE9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,qBAAA,EAAuB,CAAA,EAAE;AAAA,IACpE;AAGA,IAAA,MAAM,SAAA,GAA0B,KAAK,YAAA,CAAa,MAAA;AAAA;AAAA,MAEhD,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAI,CAAA;AAAA,MACzB;AAAA,KACF;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,UAAA,EAAY;AAEpD,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA;AAEtD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAEnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAAA,OAC1D;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,eAAA,CAId,cAAA,EACA,SAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQC,4CAA2B,SAAS,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,YAAA,CAAa,GAAG,CAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,IAAIC,gBAAA,CAAU,cAAA,EAAgB;AAAA,IAC3C,YAAA,EAAc;AAAA;AAAA,MAEZ,OAAO;AAAC;AACV,GACD,CAAA;AAED,EAAA,iBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAElD,EAAA,OAAO,MAAA;AACT","file":"chunk-RJJMUGXY.js","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Implementation,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n AnyProcedure,\n AnyRootTypes,\n DecorateRouterRecord,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nimport { extractToolsFromProcedures, type McpTool } from \"./tools\";\n\nexport function setRequestHandler<TRecord extends RouterRecord>(\n server: Server,\n tools: McpTool[],\n trpcCaller: DecorateRouterRecord<TRecord>,\n) {\n // List all of the available tools\n server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const tool = tools.find((t) => t.name === name);\n\n if (!tool) {\n return { content: [{ type: \"text\", text: \"Could not find tool\" }] };\n }\n\n // @ts-expect-error path in router\n const procedure: AnyProcedure = tool.pathInRouter.reduce(\n // @ts-expect-error path in router\n (acc, part) => acc?.[part],\n trpcCaller,\n );\n\n if (typeof tool.transformMcpProcedure === \"function\") {\n // @ts-expect-error path in router\n const output = await procedure(args);\n const result = await tool.transformMcpProcedure(output);\n\n return {\n content: result,\n };\n } else {\n // @ts-expect-error path in router\n const result = await procedure(args);\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(result) }],\n };\n }\n });\n}\n\nexport function createMcpServer<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n implementation: Implementation,\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n) {\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const server = new McpServer(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server.server, tools, trpcCaller);\n\n return server;\n}\n"]}
@@ -1,52 +0,0 @@
1
- import { z } from 'zod/v4';
2
-
3
- // src/tools.ts
4
- function mergeInputs(inputs) {
5
- return inputs.reduce((acc, input) => {
6
- return acc.extend(input.shape);
7
- }, z.object());
8
- }
9
- function extractToolsFromProcedures(appRouter, currentPath = []) {
10
- const tools = [];
11
- const procedures = Object.entries(appRouter._def.procedures);
12
- for (const [name, procedure] of procedures) {
13
- if (procedure._def && "inputs" in procedure._def) {
14
- const inputs = procedure._def.inputs;
15
- const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];
16
- const meta = procedure._def.meta;
17
- if (!meta || !meta?.mcp?.enabled) {
18
- continue;
19
- }
20
- const pathInRouter = [...currentPath, ...name.split(".")];
21
- const tool = {
22
- name: meta?.mcp?.name ?? name.replace(/\./g, "_"),
23
- description: meta?.mcp?.description ?? "",
24
- pathInRouter,
25
- transformMcpProcedure: meta?.mcp?.transformMcpProcedure
26
- };
27
- if (schema) {
28
- const jsonSchema = z.toJSONSchema(schema, {
29
- unrepresentable: "any"
30
- });
31
- if (jsonSchema.type === "object") {
32
- const { type, properties = {}, required = [] } = jsonSchema;
33
- tool.inputSchema = { type, properties, required };
34
- } else {
35
- console.error(
36
- "[TRPC-TO-MCP] Procedure has no object schema",
37
- pathInRouter
38
- );
39
- }
40
- } else {
41
- const jsonSchema = z.toJSONSchema(z.object());
42
- tool.inputSchema = jsonSchema;
43
- }
44
- tools.push(tool);
45
- }
46
- }
47
- return tools;
48
- }
49
-
50
- export { extractToolsFromProcedures, mergeInputs };
51
- //# sourceMappingURL=chunk-ULLXW6IN.mjs.map
52
- //# sourceMappingURL=chunk-ULLXW6IN.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools.ts"],"names":[],"mappings":";;;AAmBO,SAAS,YAAY,MAAA,EAAuB;AACjD,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU;AACnC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAA,CAAE,MAAA,EAAQ,CAAA;AACf;AAEO,SAAS,0BAAA,CAGd,SAAA,EAAmC,WAAA,GAAwB,EAAC,EAAG;AAC/D,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,UAAU,CAAA;AAE3D,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,UAAA,EAAY;AAC1C,IAAA,IAAI,SAAA,CAAU,IAAA,IAAQ,QAAA,IAAY,SAAA,CAAU,IAAA,EAAM;AAChD,MAAA,MAAM,MAAA,GAAS,UAAU,IAAA,CAAK,MAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,CAAA,GAAI,YAAY,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAEjE,MAAA,MAAM,IAAA,GAAO,UAAU,IAAA,CAAK,IAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,KAAK,OAAA,EAAS;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,CAAC,GAAG,WAAA,EAAa,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AACxD,MAAA,MAAM,IAAA,GAAgB;AAAA,QACpB,MAAM,IAAA,EAAM,GAAA,EAAK,QAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,QAChD,WAAA,EAAa,IAAA,EAAM,GAAA,EAAK,WAAA,IAAe,EAAA;AAAA,QACvC,YAAA;AAAA,QACA,qBAAA,EAAuB,MAAM,GAAA,EAAK;AAAA,OACpC;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,YAAA,CAAa,MAAA,EAAQ;AAAA,UACxC,eAAA,EAAiB;AAAA,SAClB,CAAA;AAED,QAAA,IAAI,UAAA,CAAW,SAAS,QAAA,EAAU;AAChC,UAAA,MAAM,EAAE,MAAM,UAAA,GAAa,IAAI,QAAA,GAAW,IAAG,GAAI,UAAA;AACjD,UAAA,IAAA,CAAK,WAAA,GAAc,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAS;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,8CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,YAAA,CAAa,CAAA,CAAE,QAAQ,CAAA;AAC5C,QAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AAAA,MACrB;AAEA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT","file":"chunk-ULLXW6IN.mjs","sourcesContent":["// Credits to https://github.com/Jacse/trpc-mcp for the helpful code\n\nimport type {\n AnyRootTypes,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\nimport { z } from \"zod/v4\";\n\nimport type { McpMeta, TransformMcpProcedureFunction } from \"./types\";\n\nexport type McpTool = {\n name: string;\n description: string;\n pathInRouter: string[];\n inputSchema?: z.core.JSONSchema.JSONSchema;\n transformMcpProcedure?: TransformMcpProcedureFunction;\n};\n\nexport function mergeInputs(inputs: z.ZodObject[]) {\n return inputs.reduce((acc, input) => {\n return acc.extend(input.shape);\n }, z.object());\n}\n\nexport function extractToolsFromProcedures<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(appRouter: Router<TRoot, TRecord>, currentPath: string[] = []) {\n const tools: McpTool[] = [];\n const procedures = Object.entries(appRouter._def.procedures);\n\n for (const [name, procedure] of procedures) {\n if (procedure._def && \"inputs\" in procedure._def) {\n const inputs = procedure._def.inputs as z.ZodObject[];\n const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];\n\n const meta = procedure._def.meta as McpMeta;\n if (!meta || !meta?.mcp?.enabled) {\n continue;\n }\n\n const pathInRouter = [...currentPath, ...name.split(\".\")];\n const tool: McpTool = {\n name: meta?.mcp?.name ?? name.replace(/\\./g, \"_\"),\n description: meta?.mcp?.description ?? \"\",\n pathInRouter,\n transformMcpProcedure: meta?.mcp?.transformMcpProcedure,\n };\n\n if (schema) {\n const jsonSchema = z.toJSONSchema(schema, {\n unrepresentable: \"any\",\n });\n\n if (jsonSchema.type === \"object\") {\n const { type, properties = {}, required = [] } = jsonSchema;\n tool.inputSchema = { type, properties, required };\n } else {\n console.error(\n \"[TRPC-TO-MCP] Procedure has no object schema\",\n pathInRouter,\n );\n }\n } else {\n // If there is not schema, we have to pass an empty object for JSON schema compatibility\n const jsonSchema = z.toJSONSchema(z.object());\n tool.inputSchema = jsonSchema;\n }\n\n tools.push(tool);\n }\n }\n\n return tools;\n}\n"]}
package/dist/helpers.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import { ContentBlock } from '@modelcontextprotocol/sdk/types';
2
- import { AnyProcedure, inferProcedureOutput, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
3
-
4
- declare function transformMcpProcedure<TProcedure extends AnyProcedure>(procedure: TProcedure, callback: (output: inferProcedureOutput<TProcedure>) => MaybePromise<ContentBlock[]>): TProcedure;
5
-
6
- export { transformMcpProcedure };
package/dist/helpers.js DELETED
@@ -1,12 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkFT3KTYAU_js = require('./chunk-FT3KTYAU.js');
4
-
5
-
6
-
7
- Object.defineProperty(exports, "transformMcpProcedure", {
8
- enumerable: true,
9
- get: function () { return chunkFT3KTYAU_js.transformMcpProcedure; }
10
- });
11
- //# sourceMappingURL=helpers.js.map
12
- //# sourceMappingURL=helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"helpers.js"}
package/dist/index.d.ts DELETED
@@ -1,10 +0,0 @@
1
- export { createMcpServer, setRequestHandler } from './server.js';
2
- export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.js';
3
- export { transformMcpProcedure } from './helpers.js';
4
- export { McpMeta, TransformMcpProcedureFunction } from './types.js';
5
- import '@modelcontextprotocol/sdk/server/index.js';
6
- import '@modelcontextprotocol/sdk/server/mcp.js';
7
- import '@modelcontextprotocol/sdk/types.js';
8
- import '@trpc/server/unstable-core-do-not-import';
9
- import 'zod/v4';
10
- import '@modelcontextprotocol/sdk/types';
package/dist/index.js DELETED
@@ -1,31 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkFT3KTYAU_js = require('./chunk-FT3KTYAU.js');
4
- require('./chunk-55J6XMHW.js');
5
- var chunkRJJMUGXY_js = require('./chunk-RJJMUGXY.js');
6
- var chunkBTXMEL6M_js = require('./chunk-BTXMEL6M.js');
7
-
8
-
9
-
10
- Object.defineProperty(exports, "transformMcpProcedure", {
11
- enumerable: true,
12
- get: function () { return chunkFT3KTYAU_js.transformMcpProcedure; }
13
- });
14
- Object.defineProperty(exports, "createMcpServer", {
15
- enumerable: true,
16
- get: function () { return chunkRJJMUGXY_js.createMcpServer; }
17
- });
18
- Object.defineProperty(exports, "setRequestHandler", {
19
- enumerable: true,
20
- get: function () { return chunkRJJMUGXY_js.setRequestHandler; }
21
- });
22
- Object.defineProperty(exports, "extractToolsFromProcedures", {
23
- enumerable: true,
24
- get: function () { return chunkBTXMEL6M_js.extractToolsFromProcedures; }
25
- });
26
- Object.defineProperty(exports, "mergeInputs", {
27
- enumerable: true,
28
- get: function () { return chunkBTXMEL6M_js.mergeInputs; }
29
- });
30
- //# sourceMappingURL=index.js.map
31
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
package/dist/server.d.ts DELETED
@@ -1,12 +0,0 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { Implementation } from '@modelcontextprotocol/sdk/types.js';
4
- import { RouterRecord, DecorateRouterRecord, AnyRootTypes, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
5
- import { McpTool } from './tools.js';
6
- import 'zod/v4';
7
- import './types.js';
8
-
9
- declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
10
- declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): McpServer;
11
-
12
- export { createMcpServer, setRequestHandler };
package/dist/server.js DELETED
@@ -1,17 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkRJJMUGXY_js = require('./chunk-RJJMUGXY.js');
4
- require('./chunk-BTXMEL6M.js');
5
-
6
-
7
-
8
- Object.defineProperty(exports, "createMcpServer", {
9
- enumerable: true,
10
- get: function () { return chunkRJJMUGXY_js.createMcpServer; }
11
- });
12
- Object.defineProperty(exports, "setRequestHandler", {
13
- enumerable: true,
14
- get: function () { return chunkRJJMUGXY_js.setRequestHandler; }
15
- });
16
- //# sourceMappingURL=server.js.map
17
- //# sourceMappingURL=server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"server.js"}