trpc-to-mcp 1.1.2 → 1.1.3

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 (51) hide show
  1. package/dist/adapters/vercel-mcp-adapter.d.mts +14 -0
  2. package/dist/adapters/vercel-mcp-adapter.d.ts +14 -0
  3. package/dist/adapters/vercel-mcp-adapter.js +32 -0
  4. package/dist/adapters/vercel-mcp-adapter.js.map +1 -0
  5. package/dist/adapters/vercel-mcp-adapter.mjs +30 -0
  6. package/dist/adapters/vercel-mcp-adapter.mjs.map +1 -0
  7. package/dist/chunk-5YYUHHJX.mjs +39 -0
  8. package/dist/chunk-5YYUHHJX.mjs.map +1 -0
  9. package/dist/chunk-H365IMJI.js +42 -0
  10. package/dist/chunk-H365IMJI.js.map +1 -0
  11. package/dist/chunk-NEBQ5VDQ.js +54 -0
  12. package/dist/chunk-NEBQ5VDQ.js.map +1 -0
  13. package/{src/tools.ts → dist/chunk-TI4KDF42.mjs} +15 -38
  14. package/dist/chunk-TI4KDF42.mjs.map +1 -0
  15. package/dist/index.d.mts +6 -0
  16. package/dist/index.d.ts +6 -0
  17. package/dist/index.js +25 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/index.mjs +4 -0
  20. package/dist/index.mjs.map +1 -0
  21. package/dist/server.d.mts +32 -0
  22. package/dist/server.d.ts +32 -0
  23. package/dist/server.js +17 -0
  24. package/dist/server.js.map +1 -0
  25. package/dist/server.mjs +4 -0
  26. package/dist/server.mjs.map +1 -0
  27. package/dist/tools.d.mts +13 -0
  28. package/dist/tools.d.ts +13 -0
  29. package/dist/tools.js +16 -0
  30. package/dist/tools.js.map +1 -0
  31. package/dist/tools.mjs +3 -0
  32. package/dist/tools.mjs.map +1 -0
  33. package/dist/types.d.mts +9 -0
  34. package/dist/types.d.ts +9 -0
  35. package/dist/types.js +4 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/types.mjs +3 -0
  38. package/dist/types.mjs.map +1 -0
  39. package/package.json +9 -2
  40. package/.changeset/README.md +0 -8
  41. package/.changeset/config.json +0 -11
  42. package/.github/workflows/main.yml +0 -21
  43. package/.github/workflows/publish.yml +0 -36
  44. package/.prettierrc +0 -12
  45. package/CHANGELOG.md +0 -25
  46. package/src/adapters/vercel-mcp-adapter.ts +0 -53
  47. package/src/index.ts +0 -2
  48. package/src/server.ts +0 -73
  49. package/src/types.ts +0 -7
  50. package/tsconfig.json +0 -12
  51. package/tsup.config.ts +0 -16
@@ -0,0 +1,14 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
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: Server) => unknown;
12
+ }): (request: Request) => Promise<Response>;
13
+
14
+ export { type McpHandlerConfig, type McpServerOptions, type VercelMcpHandler, trpcToMcpHandler };
@@ -0,0 +1,14 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
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: Server) => unknown;
12
+ }): (request: Request) => Promise<Response>;
13
+
14
+ export { type McpHandlerConfig, type McpServerOptions, type VercelMcpHandler, trpcToMcpHandler };
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ var chunkH365IMJI_js = require('../chunk-H365IMJI.js');
4
+ var chunkNEBQ5VDQ_js = require('../chunk-NEBQ5VDQ.js');
5
+ var mcpHandler = require('mcp-handler');
6
+
7
+ function trpcToMcpHandler(appRouter, ctx, handlerOptions) {
8
+ const { serverOptions, config, callback } = handlerOptions;
9
+ const tools = chunkNEBQ5VDQ_js.extractToolsFromProcedures(appRouter);
10
+ const trpcCaller = appRouter.createCaller(ctx);
11
+ const handler = mcpHandler.createMcpHandler(
12
+ (server) => {
13
+ chunkH365IMJI_js.setRequestHandler(server.server, tools, trpcCaller);
14
+ if (typeof callback === "function") {
15
+ callback(server.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
@@ -0,0 +1 @@
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,OAAO,MAAM,CAAA;AAAA,MACxB;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 { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\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: Server) => 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.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"]}
@@ -0,0 +1,30 @@
1
+ import { setRequestHandler } from '../chunk-5YYUHHJX.mjs';
2
+ import { extractToolsFromProcedures } from '../chunk-TI4KDF42.mjs';
3
+ import { createMcpHandler } from 'mcp-handler';
4
+
5
+ function trpcToMcpHandler(appRouter, ctx, handlerOptions) {
6
+ const { serverOptions, config, callback } = handlerOptions;
7
+ const tools = extractToolsFromProcedures(appRouter);
8
+ const trpcCaller = appRouter.createCaller(ctx);
9
+ const handler = createMcpHandler(
10
+ (server) => {
11
+ setRequestHandler(server.server, tools, trpcCaller);
12
+ if (typeof callback === "function") {
13
+ callback(server.server);
14
+ }
15
+ },
16
+ {
17
+ // Leave it empty because we list tools manually
18
+ capabilities: {
19
+ tools: {}
20
+ },
21
+ ...serverOptions
22
+ },
23
+ config
24
+ );
25
+ return handler;
26
+ }
27
+
28
+ export { trpcToMcpHandler };
29
+ //# sourceMappingURL=vercel-mcp-adapter.mjs.map
30
+ //# sourceMappingURL=vercel-mcp-adapter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/vercel-mcp-adapter.ts"],"names":[],"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,GAAQ,2BAA2B,SAAS,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,YAAA,CAAa,GAAG,CAAA;AAE7C,EAAA,MAAM,OAAA,GAAU,gBAAA;AAAA,IACd,CAAC,MAAA,KAAW;AACV,MAAA,iBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAElD,MAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,QAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,MACxB;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.mjs","sourcesContent":["import type { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\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: Server) => 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.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"]}
@@ -0,0 +1,39 @@
1
+ import { extractToolsFromProcedures } from './chunk-TI4KDF42.mjs';
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.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
+ const result = await procedure(args);
19
+ return {
20
+ content: [{ type: "text", text: JSON.stringify(result) }]
21
+ };
22
+ });
23
+ }
24
+ function createMcpServer(implementation, appRouter, ctx) {
25
+ const tools = extractToolsFromProcedures(appRouter);
26
+ const trpcCaller = appRouter.createCaller(ctx);
27
+ const server = new Server(implementation, {
28
+ capabilities: {
29
+ // Leave it empty because we list tools manually
30
+ tools: {}
31
+ }
32
+ });
33
+ setRequestHandler(server, tools, trpcCaller);
34
+ return server;
35
+ }
36
+
37
+ export { createMcpServer, setRequestHandler };
38
+ //# sourceMappingURL=chunk-5YYUHHJX.mjs.map
39
+ //# sourceMappingURL=chunk-5YYUHHJX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts"],"names":[],"mappings":";;;;AAiBO,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;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAEnC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAAA,KAC1D;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,MAAA,CAAO,cAAA,EAAgB;AAAA,IACxC,YAAA,EAAc;AAAA;AAAA,MAEZ,OAAO;AAAC;AACV,GACD,CAAA;AAED,EAAA,iBAAA,CAAkB,MAAA,EAAQ,OAAO,UAAU,CAAA;AAE3C,EAAA,OAAO,MAAA;AACT","file":"chunk-5YYUHHJX.mjs","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.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 // @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\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 Server(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server, tools, trpcCaller);\n\n return server;\n}\n"]}
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
4
+ var index_js = require('@modelcontextprotocol/sdk/server/index.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
+ const result = await procedure(args);
21
+ return {
22
+ content: [{ type: "text", text: JSON.stringify(result) }]
23
+ };
24
+ });
25
+ }
26
+ function createMcpServer(implementation, appRouter, ctx) {
27
+ const tools = chunkNEBQ5VDQ_js.extractToolsFromProcedures(appRouter);
28
+ const trpcCaller = appRouter.createCaller(ctx);
29
+ const server = new index_js.Server(implementation, {
30
+ capabilities: {
31
+ // Leave it empty because we list tools manually
32
+ tools: {}
33
+ }
34
+ });
35
+ setRequestHandler(server, tools, trpcCaller);
36
+ return server;
37
+ }
38
+
39
+ exports.createMcpServer = createMcpServer;
40
+ exports.setRequestHandler = setRequestHandler;
41
+ //# sourceMappingURL=chunk-H365IMJI.js.map
42
+ //# sourceMappingURL=chunk-H365IMJI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts"],"names":["ListToolsRequestSchema","CallToolRequestSchema","extractToolsFromProcedures","Server"],"mappings":";;;;;;AAiBO,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;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAEnC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAAA,KAC1D;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,eAAA,CAAO,cAAA,EAAgB;AAAA,IACxC,YAAA,EAAc;AAAA;AAAA,MAEZ,OAAO;AAAC;AACV,GACD,CAAA;AAED,EAAA,iBAAA,CAAkB,MAAA,EAAQ,OAAO,UAAU,CAAA;AAE3C,EAAA,OAAO,MAAA;AACT","file":"chunk-H365IMJI.js","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.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 // @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\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 Server(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server, tools, trpcCaller);\n\n return server;\n}\n"]}
@@ -0,0 +1,54 @@
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
+ };
28
+ if (schema) {
29
+ const jsonSchema = v4.z.toJSONSchema(schema, {
30
+ unrepresentable: "any"
31
+ });
32
+ if (jsonSchema.type === "object") {
33
+ const { type, properties = {}, required = [] } = jsonSchema;
34
+ tool.inputSchema = { type, properties, required };
35
+ } else {
36
+ console.error(
37
+ "[TRPC-TO-MCP] Procedure has no object schema",
38
+ pathInRouter
39
+ );
40
+ }
41
+ } else {
42
+ const jsonSchema = v4.z.toJSONSchema(v4.z.object());
43
+ tool.inputSchema = jsonSchema;
44
+ }
45
+ tools.push(tool);
46
+ }
47
+ }
48
+ return tools;
49
+ }
50
+
51
+ exports.extractToolsFromProcedures = extractToolsFromProcedures;
52
+ exports.mergeInputs = mergeInputs;
53
+ //# sourceMappingURL=chunk-NEBQ5VDQ.js.map
54
+ //# sourceMappingURL=chunk-NEBQ5VDQ.js.map
@@ -0,0 +1 @@
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,74 +1,51 @@
1
- // Credits to https://github.com/Jacse/trpc-mcp for the helpful code
1
+ import { z } from 'zod/v4';
2
2
 
3
- import type {
4
- AnyRootTypes,
5
- Router,
6
- RouterRecord,
7
- } from "@trpc/server/unstable-core-do-not-import";
8
- import { z } from "zod/v4";
9
-
10
- import type { McpMeta } from "./types";
11
-
12
- export type McpTool = {
13
- name: string;
14
- description: string;
15
- pathInRouter: string[];
16
- inputSchema?: z.core.JSONSchema.JSONSchema;
17
- };
18
-
19
- export function mergeInputs(inputs: z.ZodObject[]) {
3
+ // src/tools.ts
4
+ function mergeInputs(inputs) {
20
5
  return inputs.reduce((acc, input) => {
21
6
  return acc.extend(input.shape);
22
7
  }, z.object());
23
8
  }
24
-
25
- export function extractToolsFromProcedures<
26
- TRoot extends AnyRootTypes,
27
- TRecord extends RouterRecord,
28
- >(appRouter: Router<TRoot, TRecord>, currentPath: string[] = []) {
29
- const tools: McpTool[] = [];
9
+ function extractToolsFromProcedures(appRouter, currentPath = []) {
10
+ const tools = [];
30
11
  const procedures = Object.entries(appRouter._def.procedures);
31
-
32
12
  for (const [name, procedure] of procedures) {
33
13
  if (procedure._def && "inputs" in procedure._def) {
34
- const inputs = procedure._def.inputs as z.ZodObject[];
14
+ const inputs = procedure._def.inputs;
35
15
  const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];
36
-
37
- const meta = procedure._def.meta as McpMeta;
16
+ const meta = procedure._def.meta;
38
17
  if (!meta || !meta?.mcp?.enabled) {
39
18
  continue;
40
19
  }
41
-
42
20
  const pathInRouter = [...currentPath, ...name.split(".")];
43
- const tool: McpTool = {
21
+ const tool = {
44
22
  name: meta?.mcp?.name ?? name.replace(/\./g, "_"),
45
23
  description: meta?.mcp?.description ?? "",
46
- pathInRouter,
24
+ pathInRouter
47
25
  };
48
-
49
26
  if (schema) {
50
27
  const jsonSchema = z.toJSONSchema(schema, {
51
- unrepresentable: "any",
28
+ unrepresentable: "any"
52
29
  });
53
-
54
30
  if (jsonSchema.type === "object") {
55
31
  const { type, properties = {}, required = [] } = jsonSchema;
56
32
  tool.inputSchema = { type, properties, required };
57
33
  } else {
58
34
  console.error(
59
35
  "[TRPC-TO-MCP] Procedure has no object schema",
60
- pathInRouter,
36
+ pathInRouter
61
37
  );
62
38
  }
63
39
  } else {
64
- // If there is not schema, we have to pass an empty object for JSON schema compatibility
65
40
  const jsonSchema = z.toJSONSchema(z.object());
66
41
  tool.inputSchema = jsonSchema;
67
42
  }
68
-
69
43
  tools.push(tool);
70
44
  }
71
45
  }
72
-
73
46
  return tools;
74
47
  }
48
+
49
+ export { extractToolsFromProcedures, mergeInputs };
50
+ //# sourceMappingURL=chunk-TI4KDF42.mjs.map
51
+ //# sourceMappingURL=chunk-TI4KDF42.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,6 @@
1
+ export { createMcpServer, setRequestHandler } from './server.mjs';
2
+ export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.mjs';
3
+ import '@modelcontextprotocol/sdk/server/index.js';
4
+ import '@modelcontextprotocol/sdk/types.js';
5
+ import '@trpc/server/unstable-core-do-not-import';
6
+ import 'zod/v4';
@@ -0,0 +1,6 @@
1
+ export { createMcpServer, setRequestHandler } from './server.js';
2
+ export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.js';
3
+ import '@modelcontextprotocol/sdk/server/index.js';
4
+ import '@modelcontextprotocol/sdk/types.js';
5
+ import '@trpc/server/unstable-core-do-not-import';
6
+ import 'zod/v4';
package/dist/index.js ADDED
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ var chunkH365IMJI_js = require('./chunk-H365IMJI.js');
4
+ var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "createMcpServer", {
9
+ enumerable: true,
10
+ get: function () { return chunkH365IMJI_js.createMcpServer; }
11
+ });
12
+ Object.defineProperty(exports, "setRequestHandler", {
13
+ enumerable: true,
14
+ get: function () { return chunkH365IMJI_js.setRequestHandler; }
15
+ });
16
+ Object.defineProperty(exports, "extractToolsFromProcedures", {
17
+ enumerable: true,
18
+ get: function () { return chunkNEBQ5VDQ_js.extractToolsFromProcedures; }
19
+ });
20
+ Object.defineProperty(exports, "mergeInputs", {
21
+ enumerable: true,
22
+ get: function () { return chunkNEBQ5VDQ_js.mergeInputs; }
23
+ });
24
+ //# sourceMappingURL=index.js.map
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/dist/index.mjs ADDED
@@ -0,0 +1,4 @@
1
+ export { createMcpServer, setRequestHandler } from './chunk-5YYUHHJX.mjs';
2
+ export { extractToolsFromProcedures, mergeInputs } from './chunk-TI4KDF42.mjs';
3
+ //# sourceMappingURL=index.mjs.map
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -0,0 +1,32 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { Implementation } from '@modelcontextprotocol/sdk/types.js';
3
+ import { RouterRecord, DecorateRouterRecord, AnyRootTypes, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
4
+ import { McpTool } from './tools.mjs';
5
+ import 'zod/v4';
6
+
7
+ declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
8
+ declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): Server<{
9
+ method: string;
10
+ params?: {
11
+ [x: string]: unknown;
12
+ _meta?: {
13
+ [x: string]: unknown;
14
+ progressToken?: string | number | undefined;
15
+ } | undefined;
16
+ } | undefined;
17
+ }, {
18
+ method: string;
19
+ params?: {
20
+ [x: string]: unknown;
21
+ _meta?: {
22
+ [x: string]: unknown;
23
+ } | undefined;
24
+ } | undefined;
25
+ }, {
26
+ [x: string]: unknown;
27
+ _meta?: {
28
+ [x: string]: unknown;
29
+ } | undefined;
30
+ }>;
31
+
32
+ export { createMcpServer, setRequestHandler };
@@ -0,0 +1,32 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { Implementation } from '@modelcontextprotocol/sdk/types.js';
3
+ import { RouterRecord, DecorateRouterRecord, AnyRootTypes, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
4
+ import { McpTool } from './tools.js';
5
+ import 'zod/v4';
6
+
7
+ declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
8
+ declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): Server<{
9
+ method: string;
10
+ params?: {
11
+ [x: string]: unknown;
12
+ _meta?: {
13
+ [x: string]: unknown;
14
+ progressToken?: string | number | undefined;
15
+ } | undefined;
16
+ } | undefined;
17
+ }, {
18
+ method: string;
19
+ params?: {
20
+ [x: string]: unknown;
21
+ _meta?: {
22
+ [x: string]: unknown;
23
+ } | undefined;
24
+ } | undefined;
25
+ }, {
26
+ [x: string]: unknown;
27
+ _meta?: {
28
+ [x: string]: unknown;
29
+ } | undefined;
30
+ }>;
31
+
32
+ export { createMcpServer, setRequestHandler };
package/dist/server.js ADDED
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ var chunkH365IMJI_js = require('./chunk-H365IMJI.js');
4
+ require('./chunk-NEBQ5VDQ.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "createMcpServer", {
9
+ enumerable: true,
10
+ get: function () { return chunkH365IMJI_js.createMcpServer; }
11
+ });
12
+ Object.defineProperty(exports, "setRequestHandler", {
13
+ enumerable: true,
14
+ get: function () { return chunkH365IMJI_js.setRequestHandler; }
15
+ });
16
+ //# sourceMappingURL=server.js.map
17
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"server.js"}
@@ -0,0 +1,4 @@
1
+ export { createMcpServer, setRequestHandler } from './chunk-5YYUHHJX.mjs';
2
+ import './chunk-TI4KDF42.mjs';
3
+ //# sourceMappingURL=server.mjs.map
4
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"server.mjs"}
@@ -0,0 +1,13 @@
1
+ import { AnyRootTypes, RouterRecord, Router } from '@trpc/server/unstable-core-do-not-import';
2
+ import { z } from 'zod/v4';
3
+
4
+ type McpTool = {
5
+ name: string;
6
+ description: string;
7
+ pathInRouter: string[];
8
+ inputSchema?: z.core.JSONSchema.JSONSchema;
9
+ };
10
+ declare function mergeInputs(inputs: z.ZodObject[]): z.ZodObject<z.core.$ZodLooseShape, z.core.$strip>;
11
+ declare function extractToolsFromProcedures<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(appRouter: Router<TRoot, TRecord>, currentPath?: string[]): McpTool[];
12
+
13
+ export { type McpTool, extractToolsFromProcedures, mergeInputs };
@@ -0,0 +1,13 @@
1
+ import { AnyRootTypes, RouterRecord, Router } from '@trpc/server/unstable-core-do-not-import';
2
+ import { z } from 'zod/v4';
3
+
4
+ type McpTool = {
5
+ name: string;
6
+ description: string;
7
+ pathInRouter: string[];
8
+ inputSchema?: z.core.JSONSchema.JSONSchema;
9
+ };
10
+ declare function mergeInputs(inputs: z.ZodObject[]): z.ZodObject<z.core.$ZodLooseShape, z.core.$strip>;
11
+ declare function extractToolsFromProcedures<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(appRouter: Router<TRoot, TRecord>, currentPath?: string[]): McpTool[];
12
+
13
+ export { type McpTool, extractToolsFromProcedures, mergeInputs };
package/dist/tools.js ADDED
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "extractToolsFromProcedures", {
8
+ enumerable: true,
9
+ get: function () { return chunkNEBQ5VDQ_js.extractToolsFromProcedures; }
10
+ });
11
+ Object.defineProperty(exports, "mergeInputs", {
12
+ enumerable: true,
13
+ get: function () { return chunkNEBQ5VDQ_js.mergeInputs; }
14
+ });
15
+ //# sourceMappingURL=tools.js.map
16
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"tools.js"}
package/dist/tools.mjs ADDED
@@ -0,0 +1,3 @@
1
+ export { extractToolsFromProcedures, mergeInputs } from './chunk-TI4KDF42.mjs';
2
+ //# sourceMappingURL=tools.mjs.map
3
+ //# sourceMappingURL=tools.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"tools.mjs"}
@@ -0,0 +1,9 @@
1
+ type McpMeta = {
2
+ mcp?: {
3
+ enabled?: boolean;
4
+ description?: string;
5
+ name?: string;
6
+ };
7
+ };
8
+
9
+ export type { McpMeta };
@@ -0,0 +1,9 @@
1
+ type McpMeta = {
2
+ mcp?: {
3
+ enabled?: boolean;
4
+ description?: string;
5
+ name?: string;
6
+ };
7
+ };
8
+
9
+ export type { McpMeta };
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=types.js.map
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"types.js"}
package/dist/types.mjs ADDED
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=types.mjs.map
3
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"types.mjs"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "trpc-to-mcp",
3
3
  "license": "MIT",
4
- "version": "1.1.2",
4
+ "version": "1.1.3",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
@@ -12,6 +12,13 @@
12
12
  "modelcontextprotocol",
13
13
  "vercel"
14
14
  ],
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/iboughtbed/trpc-to-mcp.git"
21
+ },
15
22
  "exports": {
16
23
  ".": {
17
24
  "import": {
@@ -71,7 +78,7 @@
71
78
  "@modelcontextprotocol/sdk": "^1.17.2"
72
79
  },
73
80
  "scripts": {
74
- "build": "tsup",
81
+ "build": "tsup ./src",
75
82
  "dev": "tsup --watch",
76
83
  "release": "pnpm run build && changeset publish",
77
84
  "format": "prettier --write \"**/*.{ts,tsx,css,md}\"",
@@ -1,8 +0,0 @@
1
- # Changesets
2
-
3
- Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
4
- with multi-package repos, or single-package repos to help you version and publish your code. You can
5
- find the full documentation for it [in our repository](https://github.com/changesets/changesets)
6
-
7
- We have a quick list of common questions to get you started engaging with this project in
8
- [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
@@ -1,11 +0,0 @@
1
- {
2
- "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
3
- "changelog": "@changesets/cli/changelog",
4
- "commit": false,
5
- "fixed": [],
6
- "linked": [],
7
- "access": "public",
8
- "baseBranch": "main",
9
- "updateInternalDependencies": "patch",
10
- "ignore": []
11
- }
@@ -1,21 +0,0 @@
1
- name: CI
2
- on:
3
- push:
4
- branches:
5
- - "**"
6
-
7
- jobs:
8
- build:
9
- runs-on: ubuntu-latest
10
- steps:
11
- - uses: actions/checkout@v3
12
- - uses: pnpm/action-setup@v2
13
- with:
14
- version: 9
15
- - uses: actions/setup-node@v3
16
- with:
17
- node-version: 20.x
18
- cache: "pnpm"
19
-
20
- - run: pnpm install --frozen-lockfile
21
- - run: pnpm run lint && pnpm run build
@@ -1,36 +0,0 @@
1
- name: Publish
2
- on:
3
- workflow_run:
4
- workflows: [CI]
5
- branches: [main]
6
- types: [completed]
7
-
8
- concurrency: ${{ github.workflow }}-${{ github.ref }}
9
-
10
- permissions:
11
- contents: write
12
- pull-requests: write
13
-
14
- jobs:
15
- publish:
16
- if: ${{ github.event.workflow_run.conclusion == 'success' }}
17
- runs-on: ubuntu-latest
18
- steps:
19
- - uses: actions/checkout@v3
20
- - uses: pnpm/action-setup@v2
21
- with:
22
- version: 9
23
- - uses: actions/setup-node@v3
24
- with:
25
- node-version: 20.x
26
- cache: "pnpm"
27
-
28
- - run: pnpm install --frozen-lockfile
29
- - name: Create Release Pull Request or Publish
30
- id: changesets
31
- uses: changesets/action@v1
32
- with:
33
- publish: pnpm run release
34
- env:
35
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
36
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
package/.prettierrc DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "importOrder": [
3
- "<BUILTIN_MODULES>",
4
- "<THIRD_PARTY_MODULES>",
5
- "",
6
- "^[../]",
7
- "^[./]"
8
- ],
9
- "importOrderParserPlugins": ["typescript", "jsx", "decorators-legacy"],
10
- "importOrderCaseSensitive": true,
11
- "plugins": ["@ianvs/prettier-plugin-sort-imports"]
12
- }
package/CHANGELOG.md DELETED
@@ -1,25 +0,0 @@
1
- # trpc-to-mcp
2
-
3
- ## 1.1.2
4
-
5
- ### Patch Changes
6
-
7
- - e8f84b7: fix tsup not building dist
8
-
9
- ## 1.1.1
10
-
11
- ### Patch Changes
12
-
13
- - 7629f0d: Fix tsup.config.ts and dist output
14
-
15
- ## 1.1.0
16
-
17
- ### Minor Changes
18
-
19
- - a9f1c69: Implement @vercel/mcp-handler adapter for trpc-to-mcp
20
-
21
- ## 1.0.0
22
-
23
- ### Major Changes
24
-
25
- - 7341e0f: Release package
@@ -1,53 +0,0 @@
1
- import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
- import type {
3
- AnyRootTypes,
4
- MaybePromise,
5
- Router,
6
- RouterRecord,
7
- } from "@trpc/server/unstable-core-do-not-import";
8
- import { createMcpHandler } from "mcp-handler";
9
-
10
- import { setRequestHandler } from "../server";
11
- import { extractToolsFromProcedures } from "../tools";
12
-
13
- export type VercelMcpHandler = ReturnType<typeof createMcpHandler>;
14
- export type McpServerOptions = Parameters<typeof createMcpHandler>[1];
15
- export type McpHandlerConfig = Parameters<typeof createMcpHandler>[2];
16
-
17
- export function trpcToMcpHandler<
18
- TRoot extends AnyRootTypes,
19
- TRecord extends RouterRecord,
20
- >(
21
- appRouter: Router<TRoot, TRecord>,
22
- ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>),
23
- handlerOptions: {
24
- config: McpHandlerConfig;
25
- serverOptions?: McpServerOptions;
26
- callback?: (server: Server) => unknown;
27
- },
28
- ) {
29
- const { serverOptions, config, callback } = handlerOptions;
30
-
31
- const tools = extractToolsFromProcedures(appRouter);
32
- const trpcCaller = appRouter.createCaller(ctx);
33
-
34
- const handler = createMcpHandler(
35
- (server) => {
36
- setRequestHandler(server.server, tools, trpcCaller);
37
-
38
- if (typeof callback === "function") {
39
- callback(server.server);
40
- }
41
- },
42
- {
43
- // Leave it empty because we list tools manually
44
- capabilities: {
45
- tools: {},
46
- },
47
- ...serverOptions,
48
- },
49
- config,
50
- );
51
-
52
- return handler;
53
- }
package/src/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from "./server";
2
- export * from "./tools";
package/src/server.ts DELETED
@@ -1,73 +0,0 @@
1
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
- import {
3
- CallToolRequestSchema,
4
- ListToolsRequestSchema,
5
- type Implementation,
6
- } from "@modelcontextprotocol/sdk/types.js";
7
- import type {
8
- AnyProcedure,
9
- AnyRootTypes,
10
- DecorateRouterRecord,
11
- MaybePromise,
12
- Router,
13
- RouterRecord,
14
- } from "@trpc/server/unstable-core-do-not-import";
15
-
16
- import { extractToolsFromProcedures, type McpTool } from "./tools";
17
-
18
- export function setRequestHandler<TRecord extends RouterRecord>(
19
- server: Server,
20
- tools: McpTool[],
21
- trpcCaller: DecorateRouterRecord<TRecord>,
22
- ) {
23
- // List all of the available tools
24
- server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));
25
-
26
- // Handle tool calls
27
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
28
- const { name, arguments: args } = request.params;
29
-
30
- const tool = tools.find((t) => t.name === name);
31
-
32
- if (!tool) {
33
- return { content: [{ type: "text", text: "Could not find tool" }] };
34
- }
35
-
36
- // @ts-expect-error path in router
37
- const procedure: AnyProcedure = tool.pathInRouter.reduce(
38
- // @ts-expect-error path in router
39
- (acc, part) => acc?.[part],
40
- trpcCaller,
41
- );
42
-
43
- // @ts-expect-error path in router
44
- const result = await procedure(args);
45
-
46
- return {
47
- content: [{ type: "text", text: JSON.stringify(result) }],
48
- };
49
- });
50
- }
51
-
52
- export function createMcpServer<
53
- TRoot extends AnyRootTypes,
54
- TRecord extends RouterRecord,
55
- >(
56
- implementation: Implementation,
57
- appRouter: Router<TRoot, TRecord>,
58
- ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>),
59
- ) {
60
- const tools = extractToolsFromProcedures(appRouter);
61
- const trpcCaller = appRouter.createCaller(ctx);
62
-
63
- const server = new Server(implementation, {
64
- capabilities: {
65
- // Leave it empty because we list tools manually
66
- tools: {},
67
- },
68
- });
69
-
70
- setRequestHandler(server, tools, trpcCaller);
71
-
72
- return server;
73
- }
package/src/types.ts DELETED
@@ -1,7 +0,0 @@
1
- export type McpMeta = {
2
- mcp?: {
3
- enabled?: boolean;
4
- description?: string;
5
- name?: string;
6
- };
7
- };
package/tsconfig.json DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "module": "commonjs",
5
- "esModuleInterop": true,
6
- "forceConsistentCasingInFileNames": true,
7
- "strict": true,
8
- "skipLibCheck": true,
9
- "noUncheckedIndexedAccess": true,
10
- "noEmit": true
11
- }
12
- }
package/tsup.config.ts DELETED
@@ -1,16 +0,0 @@
1
- import { defineConfig } from "tsup";
2
-
3
- export default defineConfig({
4
- entry: [
5
- "src/index.ts",
6
- "src/server.ts",
7
- "src/tools.ts",
8
- "src/adapters/vercel-mcp-adapter.ts",
9
- ],
10
- format: ["esm", "cjs"],
11
- dts: true,
12
- splitting: true,
13
- sourcemap: true,
14
- clean: true,
15
- treeshake: true,
16
- });