trpc-to-mcp 1.3.0 → 1.3.2

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 (37) hide show
  1. package/dist/adapters/vercel-mcp-adapter.js +4 -4
  2. package/dist/adapters/vercel-mcp-adapter.mjs +2 -2
  3. package/dist/{chunk-JRSHHSAI.mjs → chunk-7GYUHEUD.mjs} +6 -7
  4. package/dist/chunk-7GYUHEUD.mjs.map +1 -0
  5. package/dist/{chunk-NEBQ5VDQ.js → chunk-BTXMEL6M.js} +4 -3
  6. package/dist/chunk-BTXMEL6M.js.map +1 -0
  7. package/dist/{chunk-OGMEVEU5.mjs → chunk-FIQIIJAT.mjs} +3 -3
  8. package/dist/chunk-FIQIIJAT.mjs.map +1 -0
  9. package/dist/{chunk-TERO2JCQ.js → chunk-FT3KTYAU.js} +3 -3
  10. package/dist/chunk-FT3KTYAU.js.map +1 -0
  11. package/dist/{chunk-Q2ADARFX.js → chunk-RJJMUGXY.js} +7 -8
  12. package/dist/chunk-RJJMUGXY.js.map +1 -0
  13. package/dist/{chunk-TI4KDF42.mjs → chunk-ULLXW6IN.mjs} +4 -3
  14. package/dist/chunk-ULLXW6IN.mjs.map +1 -0
  15. package/dist/helpers.js +2 -2
  16. package/dist/helpers.mjs +1 -1
  17. package/dist/index.d.mts +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js +8 -8
  20. package/dist/index.mjs +3 -3
  21. package/dist/server.d.mts +1 -0
  22. package/dist/server.d.ts +1 -0
  23. package/dist/server.js +4 -4
  24. package/dist/server.mjs +2 -2
  25. package/dist/tools.d.mts +3 -0
  26. package/dist/tools.d.ts +3 -0
  27. package/dist/tools.js +3 -3
  28. package/dist/tools.mjs +1 -1
  29. package/dist/types.d.mts +3 -2
  30. package/dist/types.d.ts +3 -2
  31. package/package.json +1 -1
  32. package/dist/chunk-JRSHHSAI.mjs.map +0 -1
  33. package/dist/chunk-NEBQ5VDQ.js.map +0 -1
  34. package/dist/chunk-OGMEVEU5.mjs.map +0 -1
  35. package/dist/chunk-Q2ADARFX.js.map +0 -1
  36. package/dist/chunk-TERO2JCQ.js.map +0 -1
  37. package/dist/chunk-TI4KDF42.mjs.map +0 -1
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var chunkQ2ADARFX_js = require('../chunk-Q2ADARFX.js');
4
- var chunkNEBQ5VDQ_js = require('../chunk-NEBQ5VDQ.js');
3
+ var chunkRJJMUGXY_js = require('../chunk-RJJMUGXY.js');
4
+ var chunkBTXMEL6M_js = require('../chunk-BTXMEL6M.js');
5
5
  var mcpHandler = require('mcp-handler');
6
6
 
7
7
  function trpcToMcpHandler(appRouter, ctx, handlerOptions) {
8
8
  const { serverOptions, config, callback } = handlerOptions;
9
- const tools = chunkNEBQ5VDQ_js.extractToolsFromProcedures(appRouter);
9
+ const tools = chunkBTXMEL6M_js.extractToolsFromProcedures(appRouter);
10
10
  const trpcCaller = appRouter.createCaller(ctx);
11
11
  const handler = mcpHandler.createMcpHandler(
12
12
  (server) => {
13
- chunkQ2ADARFX_js.setRequestHandler(server.server, tools, trpcCaller);
13
+ chunkRJJMUGXY_js.setRequestHandler(server.server, tools, trpcCaller);
14
14
  if (typeof callback === "function") {
15
15
  callback(server);
16
16
  }
@@ -1,5 +1,5 @@
1
- import { setRequestHandler } from '../chunk-JRSHHSAI.mjs';
2
- import { extractToolsFromProcedures } from '../chunk-TI4KDF42.mjs';
1
+ import { setRequestHandler } from '../chunk-7GYUHEUD.mjs';
2
+ import { extractToolsFromProcedures } from '../chunk-ULLXW6IN.mjs';
3
3
  import { createMcpHandler } from 'mcp-handler';
4
4
 
5
5
  function trpcToMcpHandler(appRouter, ctx, handlerOptions) {
@@ -1,4 +1,4 @@
1
- import { extractToolsFromProcedures } from './chunk-TI4KDF42.mjs';
1
+ import { extractToolsFromProcedures } from './chunk-ULLXW6IN.mjs';
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
4
 
@@ -15,10 +15,9 @@ function setRequestHandler(server, tools, trpcCaller) {
15
15
  (acc, part) => acc?.[part],
16
16
  trpcCaller
17
17
  );
18
- const meta = procedure.meta;
19
- const transformMcpProcedure = meta?.mcp?.transformMcpProcedure;
20
- if (typeof transformMcpProcedure === "function") {
21
- const result = await transformMcpProcedure(procedure(args));
18
+ if (typeof tool.transformMcpProcedure === "function") {
19
+ const output = await procedure(args);
20
+ const result = await tool.transformMcpProcedure(output);
22
21
  return {
23
22
  content: result
24
23
  };
@@ -44,5 +43,5 @@ function createMcpServer(implementation, appRouter, ctx) {
44
43
  }
45
44
 
46
45
  export { createMcpServer, setRequestHandler };
47
- //# sourceMappingURL=chunk-JRSHHSAI.mjs.map
48
- //# sourceMappingURL=chunk-JRSHHSAI.mjs.map
46
+ //# sourceMappingURL=chunk-7GYUHEUD.mjs.map
47
+ //# sourceMappingURL=chunk-7GYUHEUD.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -23,7 +23,8 @@ function extractToolsFromProcedures(appRouter, currentPath = []) {
23
23
  const tool = {
24
24
  name: meta?.mcp?.name ?? name.replace(/\./g, "_"),
25
25
  description: meta?.mcp?.description ?? "",
26
- pathInRouter
26
+ pathInRouter,
27
+ transformMcpProcedure: meta?.mcp?.transformMcpProcedure
27
28
  };
28
29
  if (schema) {
29
30
  const jsonSchema = v4.z.toJSONSchema(schema, {
@@ -50,5 +51,5 @@ function extractToolsFromProcedures(appRouter, currentPath = []) {
50
51
 
51
52
  exports.extractToolsFromProcedures = extractToolsFromProcedures;
52
53
  exports.mergeInputs = mergeInputs;
53
- //# sourceMappingURL=chunk-NEBQ5VDQ.js.map
54
- //# sourceMappingURL=chunk-NEBQ5VDQ.js.map
54
+ //# sourceMappingURL=chunk-BTXMEL6M.js.map
55
+ //# sourceMappingURL=chunk-BTXMEL6M.js.map
@@ -0,0 +1 @@
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 +1,11 @@
1
1
  // src/helpers.ts
2
2
  function transformMcpProcedure(procedure, callback) {
3
3
  if (procedure.meta?.mcp?.enabled) {
4
- procedure.meta.transformMcpProcedure = callback;
4
+ procedure.meta.mcp.transformMcpProcedure = callback;
5
5
  }
6
6
  return procedure;
7
7
  }
8
8
 
9
9
  export { transformMcpProcedure };
10
- //# sourceMappingURL=chunk-OGMEVEU5.mjs.map
11
- //# sourceMappingURL=chunk-OGMEVEU5.mjs.map
10
+ //# sourceMappingURL=chunk-FIQIIJAT.mjs.map
11
+ //# sourceMappingURL=chunk-FIQIIJAT.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -3,11 +3,11 @@
3
3
  // src/helpers.ts
4
4
  function transformMcpProcedure(procedure, callback) {
5
5
  if (procedure.meta?.mcp?.enabled) {
6
- procedure.meta.transformMcpProcedure = callback;
6
+ procedure.meta.mcp.transformMcpProcedure = callback;
7
7
  }
8
8
  return procedure;
9
9
  }
10
10
 
11
11
  exports.transformMcpProcedure = transformMcpProcedure;
12
- //# sourceMappingURL=chunk-TERO2JCQ.js.map
13
- //# sourceMappingURL=chunk-TERO2JCQ.js.map
12
+ //# sourceMappingURL=chunk-FT3KTYAU.js.map
13
+ //# sourceMappingURL=chunk-FT3KTYAU.js.map
@@ -0,0 +1 @@
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,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
3
+ var chunkBTXMEL6M_js = require('./chunk-BTXMEL6M.js');
4
4
  var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
5
5
  var types_js = require('@modelcontextprotocol/sdk/types.js');
6
6
 
@@ -17,10 +17,9 @@ function setRequestHandler(server, tools, trpcCaller) {
17
17
  (acc, part) => acc?.[part],
18
18
  trpcCaller
19
19
  );
20
- const meta = procedure.meta;
21
- const transformMcpProcedure = meta?.mcp?.transformMcpProcedure;
22
- if (typeof transformMcpProcedure === "function") {
23
- const result = await transformMcpProcedure(procedure(args));
20
+ if (typeof tool.transformMcpProcedure === "function") {
21
+ const output = await procedure(args);
22
+ const result = await tool.transformMcpProcedure(output);
24
23
  return {
25
24
  content: result
26
25
  };
@@ -33,7 +32,7 @@ function setRequestHandler(server, tools, trpcCaller) {
33
32
  });
34
33
  }
35
34
  function createMcpServer(implementation, appRouter, ctx) {
36
- const tools = chunkNEBQ5VDQ_js.extractToolsFromProcedures(appRouter);
35
+ const tools = chunkBTXMEL6M_js.extractToolsFromProcedures(appRouter);
37
36
  const trpcCaller = appRouter.createCaller(ctx);
38
37
  const server = new mcp_js.McpServer(implementation, {
39
38
  capabilities: {
@@ -47,5 +46,5 @@ function createMcpServer(implementation, appRouter, ctx) {
47
46
 
48
47
  exports.createMcpServer = createMcpServer;
49
48
  exports.setRequestHandler = setRequestHandler;
50
- //# sourceMappingURL=chunk-Q2ADARFX.js.map
51
- //# sourceMappingURL=chunk-Q2ADARFX.js.map
49
+ //# sourceMappingURL=chunk-RJJMUGXY.js.map
50
+ //# sourceMappingURL=chunk-RJJMUGXY.js.map
@@ -0,0 +1 @@
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"]}
@@ -21,7 +21,8 @@ function extractToolsFromProcedures(appRouter, currentPath = []) {
21
21
  const tool = {
22
22
  name: meta?.mcp?.name ?? name.replace(/\./g, "_"),
23
23
  description: meta?.mcp?.description ?? "",
24
- pathInRouter
24
+ pathInRouter,
25
+ transformMcpProcedure: meta?.mcp?.transformMcpProcedure
25
26
  };
26
27
  if (schema) {
27
28
  const jsonSchema = z.toJSONSchema(schema, {
@@ -47,5 +48,5 @@ function extractToolsFromProcedures(appRouter, currentPath = []) {
47
48
  }
48
49
 
49
50
  export { extractToolsFromProcedures, mergeInputs };
50
- //# sourceMappingURL=chunk-TI4KDF42.mjs.map
51
- //# sourceMappingURL=chunk-TI4KDF42.mjs.map
51
+ //# sourceMappingURL=chunk-ULLXW6IN.mjs.map
52
+ //# sourceMappingURL=chunk-ULLXW6IN.mjs.map
@@ -0,0 +1 @@
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.js CHANGED
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunkTERO2JCQ_js = require('./chunk-TERO2JCQ.js');
3
+ var chunkFT3KTYAU_js = require('./chunk-FT3KTYAU.js');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "transformMcpProcedure", {
8
8
  enumerable: true,
9
- get: function () { return chunkTERO2JCQ_js.transformMcpProcedure; }
9
+ get: function () { return chunkFT3KTYAU_js.transformMcpProcedure; }
10
10
  });
11
11
  //# sourceMappingURL=helpers.js.map
12
12
  //# sourceMappingURL=helpers.js.map
package/dist/helpers.mjs CHANGED
@@ -1,3 +1,3 @@
1
- export { transformMcpProcedure } from './chunk-OGMEVEU5.mjs';
1
+ export { transformMcpProcedure } from './chunk-FIQIIJAT.mjs';
2
2
  //# sourceMappingURL=helpers.mjs.map
3
3
  //# sourceMappingURL=helpers.mjs.map
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { createMcpServer, setRequestHandler } from './server.mjs';
2
2
  export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.mjs';
3
3
  export { transformMcpProcedure } from './helpers.mjs';
4
- export { McpMeta } from './types.mjs';
4
+ export { McpMeta, TransformMcpProcedureFunction } from './types.mjs';
5
5
  import '@modelcontextprotocol/sdk/server/index.js';
6
6
  import '@modelcontextprotocol/sdk/server/mcp.js';
7
7
  import '@modelcontextprotocol/sdk/types.js';
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { createMcpServer, setRequestHandler } from './server.js';
2
2
  export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.js';
3
3
  export { transformMcpProcedure } from './helpers.js';
4
- export { McpMeta } from './types.js';
4
+ export { McpMeta, TransformMcpProcedureFunction } from './types.js';
5
5
  import '@modelcontextprotocol/sdk/server/index.js';
6
6
  import '@modelcontextprotocol/sdk/server/mcp.js';
7
7
  import '@modelcontextprotocol/sdk/types.js';
package/dist/index.js CHANGED
@@ -1,31 +1,31 @@
1
1
  'use strict';
2
2
 
3
- var chunkTERO2JCQ_js = require('./chunk-TERO2JCQ.js');
3
+ var chunkFT3KTYAU_js = require('./chunk-FT3KTYAU.js');
4
4
  require('./chunk-55J6XMHW.js');
5
- var chunkQ2ADARFX_js = require('./chunk-Q2ADARFX.js');
6
- var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
5
+ var chunkRJJMUGXY_js = require('./chunk-RJJMUGXY.js');
6
+ var chunkBTXMEL6M_js = require('./chunk-BTXMEL6M.js');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, "transformMcpProcedure", {
11
11
  enumerable: true,
12
- get: function () { return chunkTERO2JCQ_js.transformMcpProcedure; }
12
+ get: function () { return chunkFT3KTYAU_js.transformMcpProcedure; }
13
13
  });
14
14
  Object.defineProperty(exports, "createMcpServer", {
15
15
  enumerable: true,
16
- get: function () { return chunkQ2ADARFX_js.createMcpServer; }
16
+ get: function () { return chunkRJJMUGXY_js.createMcpServer; }
17
17
  });
18
18
  Object.defineProperty(exports, "setRequestHandler", {
19
19
  enumerable: true,
20
- get: function () { return chunkQ2ADARFX_js.setRequestHandler; }
20
+ get: function () { return chunkRJJMUGXY_js.setRequestHandler; }
21
21
  });
22
22
  Object.defineProperty(exports, "extractToolsFromProcedures", {
23
23
  enumerable: true,
24
- get: function () { return chunkNEBQ5VDQ_js.extractToolsFromProcedures; }
24
+ get: function () { return chunkBTXMEL6M_js.extractToolsFromProcedures; }
25
25
  });
26
26
  Object.defineProperty(exports, "mergeInputs", {
27
27
  enumerable: true,
28
- get: function () { return chunkNEBQ5VDQ_js.mergeInputs; }
28
+ get: function () { return chunkBTXMEL6M_js.mergeInputs; }
29
29
  });
30
30
  //# sourceMappingURL=index.js.map
31
31
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- export { transformMcpProcedure } from './chunk-OGMEVEU5.mjs';
1
+ export { transformMcpProcedure } from './chunk-FIQIIJAT.mjs';
2
2
  import './chunk-KIQOUUEZ.mjs';
3
- export { createMcpServer, setRequestHandler } from './chunk-JRSHHSAI.mjs';
4
- export { extractToolsFromProcedures, mergeInputs } from './chunk-TI4KDF42.mjs';
3
+ export { createMcpServer, setRequestHandler } from './chunk-7GYUHEUD.mjs';
4
+ export { extractToolsFromProcedures, mergeInputs } from './chunk-ULLXW6IN.mjs';
5
5
  //# sourceMappingURL=index.mjs.map
6
6
  //# sourceMappingURL=index.mjs.map
package/dist/server.d.mts CHANGED
@@ -4,6 +4,7 @@ import { Implementation } from '@modelcontextprotocol/sdk/types.js';
4
4
  import { RouterRecord, DecorateRouterRecord, AnyRootTypes, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
5
5
  import { McpTool } from './tools.mjs';
6
6
  import 'zod/v4';
7
+ import './types.mjs';
7
8
 
8
9
  declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
9
10
  declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): McpServer;
package/dist/server.d.ts CHANGED
@@ -4,6 +4,7 @@ import { Implementation } from '@modelcontextprotocol/sdk/types.js';
4
4
  import { RouterRecord, DecorateRouterRecord, AnyRootTypes, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
5
5
  import { McpTool } from './tools.js';
6
6
  import 'zod/v4';
7
+ import './types.js';
7
8
 
8
9
  declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
9
10
  declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): McpServer;
package/dist/server.js CHANGED
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkQ2ADARFX_js = require('./chunk-Q2ADARFX.js');
4
- require('./chunk-NEBQ5VDQ.js');
3
+ var chunkRJJMUGXY_js = require('./chunk-RJJMUGXY.js');
4
+ require('./chunk-BTXMEL6M.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "createMcpServer", {
9
9
  enumerable: true,
10
- get: function () { return chunkQ2ADARFX_js.createMcpServer; }
10
+ get: function () { return chunkRJJMUGXY_js.createMcpServer; }
11
11
  });
12
12
  Object.defineProperty(exports, "setRequestHandler", {
13
13
  enumerable: true,
14
- get: function () { return chunkQ2ADARFX_js.setRequestHandler; }
14
+ get: function () { return chunkRJJMUGXY_js.setRequestHandler; }
15
15
  });
16
16
  //# sourceMappingURL=server.js.map
17
17
  //# sourceMappingURL=server.js.map
package/dist/server.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { createMcpServer, setRequestHandler } from './chunk-JRSHHSAI.mjs';
2
- import './chunk-TI4KDF42.mjs';
1
+ export { createMcpServer, setRequestHandler } from './chunk-7GYUHEUD.mjs';
2
+ import './chunk-ULLXW6IN.mjs';
3
3
  //# sourceMappingURL=server.mjs.map
4
4
  //# sourceMappingURL=server.mjs.map
package/dist/tools.d.mts CHANGED
@@ -1,11 +1,14 @@
1
1
  import { AnyRootTypes, RouterRecord, Router } from '@trpc/server/unstable-core-do-not-import';
2
2
  import { z } from 'zod/v4';
3
+ import { TransformMcpProcedureFunction } from './types.mjs';
4
+ import '@modelcontextprotocol/sdk/types.js';
3
5
 
4
6
  type McpTool = {
5
7
  name: string;
6
8
  description: string;
7
9
  pathInRouter: string[];
8
10
  inputSchema?: z.core.JSONSchema.JSONSchema;
11
+ transformMcpProcedure?: TransformMcpProcedureFunction;
9
12
  };
10
13
  declare function mergeInputs(inputs: z.ZodObject[]): z.ZodObject<z.core.$ZodLooseShape, z.core.$strip>;
11
14
  declare function extractToolsFromProcedures<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(appRouter: Router<TRoot, TRecord>, currentPath?: string[]): McpTool[];
package/dist/tools.d.ts CHANGED
@@ -1,11 +1,14 @@
1
1
  import { AnyRootTypes, RouterRecord, Router } from '@trpc/server/unstable-core-do-not-import';
2
2
  import { z } from 'zod/v4';
3
+ import { TransformMcpProcedureFunction } from './types.js';
4
+ import '@modelcontextprotocol/sdk/types.js';
3
5
 
4
6
  type McpTool = {
5
7
  name: string;
6
8
  description: string;
7
9
  pathInRouter: string[];
8
10
  inputSchema?: z.core.JSONSchema.JSONSchema;
11
+ transformMcpProcedure?: TransformMcpProcedureFunction;
9
12
  };
10
13
  declare function mergeInputs(inputs: z.ZodObject[]): z.ZodObject<z.core.$ZodLooseShape, z.core.$strip>;
11
14
  declare function extractToolsFromProcedures<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(appRouter: Router<TRoot, TRecord>, currentPath?: string[]): McpTool[];
package/dist/tools.js CHANGED
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
3
+ var chunkBTXMEL6M_js = require('./chunk-BTXMEL6M.js');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "extractToolsFromProcedures", {
8
8
  enumerable: true,
9
- get: function () { return chunkNEBQ5VDQ_js.extractToolsFromProcedures; }
9
+ get: function () { return chunkBTXMEL6M_js.extractToolsFromProcedures; }
10
10
  });
11
11
  Object.defineProperty(exports, "mergeInputs", {
12
12
  enumerable: true,
13
- get: function () { return chunkNEBQ5VDQ_js.mergeInputs; }
13
+ get: function () { return chunkBTXMEL6M_js.mergeInputs; }
14
14
  });
15
15
  //# sourceMappingURL=tools.js.map
16
16
  //# sourceMappingURL=tools.js.map
package/dist/tools.mjs CHANGED
@@ -1,3 +1,3 @@
1
- export { extractToolsFromProcedures, mergeInputs } from './chunk-TI4KDF42.mjs';
1
+ export { extractToolsFromProcedures, mergeInputs } from './chunk-ULLXW6IN.mjs';
2
2
  //# sourceMappingURL=tools.mjs.map
3
3
  //# sourceMappingURL=tools.mjs.map
package/dist/types.d.mts CHANGED
@@ -6,8 +6,9 @@ type McpMeta = {
6
6
  enabled?: boolean;
7
7
  description?: string;
8
8
  name?: string;
9
- transformMcpProcedure?: (output: inferProcedureOutput<AnyProcedure>) => MaybePromise<ContentBlock[]>;
9
+ transformMcpProcedure?: TransformMcpProcedureFunction;
10
10
  };
11
11
  };
12
+ type TransformMcpProcedureFunction = (output: inferProcedureOutput<AnyProcedure>) => MaybePromise<ContentBlock[]>;
12
13
 
13
- export type { McpMeta };
14
+ export type { McpMeta, TransformMcpProcedureFunction };
package/dist/types.d.ts CHANGED
@@ -6,8 +6,9 @@ type McpMeta = {
6
6
  enabled?: boolean;
7
7
  description?: string;
8
8
  name?: string;
9
- transformMcpProcedure?: (output: inferProcedureOutput<AnyProcedure>) => MaybePromise<ContentBlock[]>;
9
+ transformMcpProcedure?: TransformMcpProcedureFunction;
10
10
  };
11
11
  };
12
+ type TransformMcpProcedureFunction = (output: inferProcedureOutput<AnyProcedure>) => MaybePromise<ContentBlock[]>;
12
13
 
13
- export type { McpMeta };
14
+ export type { McpMeta, TransformMcpProcedureFunction };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "trpc-to-mcp",
3
3
  "license": "MIT",
4
- "version": "1.3.0",
4
+ "version": "1.3.2",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":[],"mappings":";;;;AAmBO,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,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,IAAA,MAAM,qBAAA,GAAwB,MAAM,GAAA,EAAK,qBAAA;AAEzC,IAAA,IAAI,OAAO,0BAA0B,UAAA,EAAY;AAE/C,MAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,SAAA,CAAU,IAAI,CAAC,CAAA;AAE1D,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-JRSHHSAI.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\";\nimport type { McpMeta } from \"./types\";\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 const meta = procedure.meta as McpMeta | undefined;\n const transformMcpProcedure = meta?.mcp?.transformMcpProcedure;\n\n if (typeof transformMcpProcedure === \"function\") {\n // @ts-expect-error path in router\n const result = await transformMcpProcedure(procedure(args));\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 +0,0 @@
1
- {"version":3,"sources":["../src/tools.ts"],"names":["z"],"mappings":";;;;;AAkBO,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;AAAA,OACF;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-NEBQ5VDQ.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 } from \"./types\";\n\nexport type McpTool = {\n name: string;\n description: string;\n pathInRouter: string[];\n inputSchema?: z.core.JSONSchema.JSONSchema;\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 };\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 +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,KAAK,qBAAA,GAAwB,QAAA;AAAA,EACzC;AAEA,EAAA,OAAO,SAAA;AACT","file":"chunk-OGMEVEU5.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.transformMcpProcedure = callback;\n }\n\n return procedure;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":["ListToolsRequestSchema","CallToolRequestSchema","extractToolsFromProcedures","McpServer"],"mappings":";;;;;;AAmBO,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,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,IAAA,MAAM,qBAAA,GAAwB,MAAM,GAAA,EAAK,qBAAA;AAEzC,IAAA,IAAI,OAAO,0BAA0B,UAAA,EAAY;AAE/C,MAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,SAAA,CAAU,IAAI,CAAC,CAAA;AAE1D,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-Q2ADARFX.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\";\nimport type { McpMeta } from \"./types\";\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 const meta = procedure.meta as McpMeta | undefined;\n const transformMcpProcedure = meta?.mcp?.transformMcpProcedure;\n\n if (typeof transformMcpProcedure === \"function\") {\n // @ts-expect-error path in router\n const result = await transformMcpProcedure(procedure(args));\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 +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,KAAK,qBAAA,GAAwB,QAAA;AAAA,EACzC;AAEA,EAAA,OAAO,SAAA;AACT","file":"chunk-TERO2JCQ.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.transformMcpProcedure = callback;\n }\n\n return procedure;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools.ts"],"names":[],"mappings":";;;AAkBO,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;AAAA,OACF;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-TI4KDF42.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 } from \"./types\";\n\nexport type McpTool = {\n name: string;\n description: string;\n pathInRouter: string[];\n inputSchema?: z.core.JSONSchema.JSONSchema;\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 };\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"]}