trpc-to-mcp 1.1.5 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +261 -0
  2. package/dist/adapters/vercel-mcp-adapter.d.mts +2 -2
  3. package/dist/adapters/vercel-mcp-adapter.d.ts +2 -2
  4. package/dist/adapters/vercel-mcp-adapter.js +5 -5
  5. package/dist/adapters/vercel-mcp-adapter.js.map +1 -1
  6. package/dist/adapters/vercel-mcp-adapter.mjs +3 -3
  7. package/dist/adapters/vercel-mcp-adapter.mjs.map +1 -1
  8. package/dist/chunk-55J6XMHW.js +4 -0
  9. package/dist/chunk-55J6XMHW.js.map +1 -0
  10. package/dist/{chunk-B2THZXSV.mjs → chunk-JRSHHSAI.mjs} +19 -10
  11. package/dist/chunk-JRSHHSAI.mjs.map +1 -0
  12. package/dist/chunk-KIQOUUEZ.mjs +3 -0
  13. package/dist/chunk-KIQOUUEZ.mjs.map +1 -0
  14. package/dist/{chunk-TGP3GIZI.js → chunk-NEBQ5VDQ.js} +2 -2
  15. package/dist/{chunk-TGP3GIZI.js.map → chunk-NEBQ5VDQ.js.map} +1 -1
  16. package/dist/chunk-OGMEVEU5.mjs +11 -0
  17. package/dist/chunk-OGMEVEU5.mjs.map +1 -0
  18. package/dist/{chunk-YFN3GSJ4.js → chunk-Q2ADARFX.js} +20 -11
  19. package/dist/chunk-Q2ADARFX.js.map +1 -0
  20. package/dist/chunk-TERO2JCQ.js +13 -0
  21. package/dist/chunk-TERO2JCQ.js.map +1 -0
  22. package/dist/{chunk-6LCISFRE.mjs → chunk-TI4KDF42.mjs} +2 -2
  23. package/dist/{chunk-6LCISFRE.mjs.map → chunk-TI4KDF42.mjs.map} +1 -1
  24. package/dist/helpers.d.mts +6 -0
  25. package/dist/helpers.d.ts +6 -0
  26. package/dist/helpers.js +12 -0
  27. package/dist/helpers.js.map +1 -0
  28. package/dist/helpers.mjs +3 -0
  29. package/dist/helpers.mjs.map +1 -0
  30. package/dist/index.d.mts +3 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.js +12 -6
  33. package/dist/index.mjs +4 -2
  34. package/dist/server.d.mts +2 -24
  35. package/dist/server.d.ts +2 -24
  36. package/dist/server.js +4 -4
  37. package/dist/server.mjs +2 -2
  38. package/dist/tools.d.mts +0 -1
  39. package/dist/tools.d.ts +0 -1
  40. package/dist/tools.js +3 -3
  41. package/dist/tools.mjs +1 -1
  42. package/dist/types.d.mts +4 -0
  43. package/dist/types.d.ts +4 -0
  44. package/dist/types.js +2 -0
  45. package/dist/types.mjs +1 -1
  46. package/package.json +21 -1
  47. package/dist/chunk-B2THZXSV.mjs.map +0 -1
  48. package/dist/chunk-YFN3GSJ4.js.map +0 -1
package/README.md ADDED
@@ -0,0 +1,261 @@
1
+ ## Introduction
2
+
3
+ You can skip this part if you know exactly why you're turning your tRPC endpoints into MCP tools.
4
+
5
+ <details>
6
+ <summary>How to think of MCPs</summary>
7
+
8
+ At its core, the Model Context Protocol (MCP) gives language models a context to interact with external systems by exposing well-defined tools. This isn't about wrapping API endpoints- it's about enabling AI to perform tasks with clarity and purpose.
9
+
10
+ This library was created to convert only the tRPC procedures you explicitly choose into MCP tools. By doing so, it ensures that only the functionalities intended for controlled AI interaction are exposed, rather than indiscriminately converting all endpoints.
11
+
12
+ Remember, for an endpoint to be effectively transformed into an MCP tool, it should be meticulously documented with clear descriptions, meaningful names, and well-defined inputs/outputs. This careful design is crucial because MCP tools are more than mere API endpoints - they form the operational contexts that enable language models to function reliably.
13
+
14
+ </details>
15
+
16
+ ## tRPC to MCP
17
+
18
+ - Support for tRPC v11
19
+ - [Transform your JSON outputs into human-language with custom helpers](#transform-output)
20
+ - [Turn your tRPC router into MCP tools](#to-mcp-tools)
21
+ - [Turn your tRPC router into MCP server](#to-mcp-server)
22
+ - [Turn your tRPC router into @vercel/mcp-adapter handler](#to-vercel-mcp-adapter)
23
+
24
+ ## Usage
25
+
26
+ 1. Install trpc-to-mcp
27
+
28
+ ```bash
29
+ npm install trpc-to-mcp
30
+
31
+ pnpm add trpc-to-mcp
32
+
33
+ bun add trpc-to-mcp
34
+
35
+ yarn add trpc-to-mcp
36
+ ```
37
+
38
+ 2. Add `McpMeta` to your tRPC instance
39
+
40
+ ```typescript
41
+ import { initTRPC } from "@trpc/server";
42
+ import { type McpMeta } from "trpc-to-mcp";
43
+
44
+ const t = initTRPC.meta<McpMeta>().create();
45
+ ```
46
+
47
+ 3. Enable `mcp` support for a procedure
48
+
49
+ ```typescript
50
+ export const appRouter = t.router({
51
+ hello: t.procedure
52
+ .meta({
53
+ mcp: {
54
+ enabled: true,
55
+ description: "Say hello to a name",
56
+ // You can leave it empty, it'll be converted to "hello"
57
+ // If you have subrouters, then subrouter_procedure_name
58
+ name: "say_hello",
59
+ },
60
+ })
61
+ .input(
62
+ z.object({
63
+ name: z.string(),
64
+ }),
65
+ )
66
+ .query(({ input }) => {
67
+ return { greeting: `Hello ${input.name}` };
68
+ }),
69
+ });
70
+ ```
71
+
72
+ ## Transform Outputs
73
+
74
+ If you need a human-language outputs for LLMs to have a better context, you can use `transformMcpProcedure`
75
+
76
+ You simply wrap your procedure with the helper function, and provide a transformer callback function that turns your procedure output into `ContentBlock[]` array compatible with MCP content output.
77
+
78
+ ```typescript
79
+ import { initTRPC } from "@trpc/server";
80
+ import { z } from "zod";
81
+
82
+ import { transformMcpProcedure, type McpMeta } from "../src";
83
+
84
+ const t = initTRPC.meta<McpMeta>().create();
85
+
86
+ export const appRouter = t.router({
87
+ procedure: transformMcpProcedure(
88
+ t.procedure
89
+ .meta({
90
+ mcp: {
91
+ enabled: true,
92
+ description: "Send a message",
93
+ name: "send_message",
94
+ },
95
+ })
96
+ .input(
97
+ z.object({
98
+ message: z.string(),
99
+ }),
100
+ )
101
+ .query(({ input }) => {
102
+ return {
103
+ payload: {
104
+ from: "trpc",
105
+ message: input.message,
106
+ array: [{ a: 1 }, { b: 2 }],
107
+ },
108
+ };
109
+ }),
110
+ (output) => {
111
+ return [
112
+ ...output.payload.array.map((item) => {
113
+ const [name, value] = Object.entries(item);
114
+ return {
115
+ type: "text" as const,
116
+ text: `${name} is ${value} letter of alphabet`,
117
+ };
118
+ }),
119
+ {
120
+ type: "image",
121
+ data: "...",
122
+ mimeType: "",
123
+ },
124
+ {
125
+ type: "audio", // or even "resource" | "resource_link"
126
+ data: "...",
127
+ mimeType: "",
128
+ },
129
+ ];
130
+ },
131
+ ),
132
+ });
133
+ ```
134
+
135
+ ## To MCP tools
136
+
137
+ 4. You can turn a router into tools
138
+
139
+ ```typescript
140
+ import { appRouter } from "@/server/trpc/root.ts";
141
+ import { extractToolsFromProcedures } from "trpc-to-mcp";
142
+
143
+ const tools = extractToolsFromProcedures(appRouter);
144
+
145
+ /*
146
+
147
+ [
148
+ {
149
+ name: "Tool name",
150
+ description: "Description of the tool",
151
+ pathInRouter: [...],
152
+ inputSchema: JSONSchema // this if full JSON schema from your zod schema
153
+ },
154
+ ...
155
+ ]
156
+
157
+ */
158
+ ```
159
+
160
+ ## To MCP server
161
+
162
+ 5. You can turn a router into an MCP server
163
+
164
+ ```typescript
165
+ import { appRouter } from "@/server/trpc/root.ts";
166
+ import { createMcpServer } from "trpc-to-mcp";
167
+
168
+ const ctx = {
169
+ session: {
170
+ // ...
171
+ },
172
+ };
173
+
174
+ // Returns high-level McpServer instance
175
+ const mcpServer = createMcpServer(
176
+ implementation, // Pass your Implementation instance
177
+ appRouter,
178
+ ctx, // Pass your tRPC context
179
+ );
180
+ ```
181
+
182
+ ## To Vercel MCP adapter
183
+
184
+ 6. You can turn a router into `@vercel/mcp-adapter` handler
185
+
186
+ ```typescript
187
+ // app/api/[transport]/route.ts
188
+ import { trpcToMcpHandler } from "trpc-to-mcp/adapters/vercel-mcp-adapter";
189
+
190
+ const handler = trpcToHandler(appRouter, ctx, {
191
+ // @vercel/mcp-adapter config options
192
+ config: {
193
+ basePath: "/api",
194
+ // Disable in production
195
+ verboseLogs: true,
196
+ maxDuration: 60,
197
+ },
198
+ // @vercel/mcp-adapter server options
199
+ serverOptions: { ... },
200
+ callback: (server) => {
201
+ // You can modify the McpServer instance
202
+ }
203
+ });
204
+
205
+ export { handler as DELETE, handler as GET, handler as POST };
206
+ ```
207
+
208
+ ## Use with better-auth
209
+
210
+ 7. You can use it with better-auth
211
+
212
+ ```typescript
213
+ // app/api/[transport]/route.ts
214
+
215
+ import { withMcpAuth } from "better-auth/plugins";
216
+ import { trpcToMcpHandler } from "trpc-to-mcp/adapters/vercel-mcp-adapter";
217
+
218
+ // Define a function to retrieve user session from database
219
+ async function getSession(mcpSession: McpSession): Promise<Session | null> {
220
+ // You can use mcpSession.userId to fetch session
221
+ // await db.query.session.findFirst({
222
+ // where: (table, { eq }) => eq(table.userId, mcpSession.userId)
223
+ // })
224
+ }
225
+
226
+ const handler = withMcpAuth(auth, async (request, mcpSession) => {
227
+ // Retrieve the session from database via userId inside mcpSession
228
+ const session = await getSession(mcpSession);
229
+
230
+ const handler = trpcToMcpHandler(
231
+ appRouter,
232
+ // Pass your tRPC context here
233
+ {
234
+ db,
235
+ headers: request.headers,
236
+ session: session?.session,
237
+ user: session?.user,
238
+ },
239
+ {
240
+ config: {
241
+ basePath: "/api",
242
+ // Disable in production
243
+ verboseLogs: true,
244
+ maxDuration: 60,
245
+ },
246
+ },
247
+ );
248
+
249
+ return await handler(request);
250
+ });
251
+
252
+ export { handler as DELETE, handler as GET, handler as POST };
253
+ ```
254
+
255
+ ## Result
256
+
257
+ Now you can chill and add MCP to your VC-backed startup so your investors won't worry, and profit
258
+
259
+ ## Twitter / X
260
+
261
+ https://x.com/iboughtbed - cracked 17 year old engineer from Kazakhstan :)
@@ -1,4 +1,4 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp';
2
2
  import { AnyRootTypes, RouterRecord, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
3
3
  import { createMcpHandler } from 'mcp-handler';
4
4
 
@@ -8,7 +8,7 @@ type McpHandlerConfig = Parameters<typeof createMcpHandler>[2];
8
8
  declare function trpcToMcpHandler<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>), handlerOptions: {
9
9
  config: McpHandlerConfig;
10
10
  serverOptions?: McpServerOptions;
11
- callback?: (server: Server) => unknown;
11
+ callback?: (server: McpServer) => unknown;
12
12
  }): (request: Request) => Promise<Response>;
13
13
 
14
14
  export { type McpHandlerConfig, type McpServerOptions, type VercelMcpHandler, trpcToMcpHandler };
@@ -1,4 +1,4 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp';
2
2
  import { AnyRootTypes, RouterRecord, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
3
3
  import { createMcpHandler } from 'mcp-handler';
4
4
 
@@ -8,7 +8,7 @@ type McpHandlerConfig = Parameters<typeof createMcpHandler>[2];
8
8
  declare function trpcToMcpHandler<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>), handlerOptions: {
9
9
  config: McpHandlerConfig;
10
10
  serverOptions?: McpServerOptions;
11
- callback?: (server: Server) => unknown;
11
+ callback?: (server: McpServer) => unknown;
12
12
  }): (request: Request) => Promise<Response>;
13
13
 
14
14
  export { type McpHandlerConfig, type McpServerOptions, type VercelMcpHandler, trpcToMcpHandler };
@@ -1,18 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var chunkYFN3GSJ4_js = require('../chunk-YFN3GSJ4.js');
4
- var chunkTGP3GIZI_js = require('../chunk-TGP3GIZI.js');
3
+ var chunkQ2ADARFX_js = require('../chunk-Q2ADARFX.js');
4
+ var chunkNEBQ5VDQ_js = require('../chunk-NEBQ5VDQ.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 = chunkTGP3GIZI_js.extractToolsFromProcedures(appRouter);
9
+ const tools = chunkNEBQ5VDQ_js.extractToolsFromProcedures(appRouter);
10
10
  const trpcCaller = appRouter.createCaller(ctx);
11
11
  const handler = mcpHandler.createMcpHandler(
12
12
  (server) => {
13
- chunkYFN3GSJ4_js.setRequestHandler(server.server, tools, trpcCaller);
13
+ chunkQ2ADARFX_js.setRequestHandler(server.server, tools, trpcCaller);
14
14
  if (typeof callback === "function") {
15
- callback(server.server);
15
+ callback(server);
16
16
  }
17
17
  },
18
18
  {
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/adapters/vercel-mcp-adapter.ts"],"names":["extractToolsFromProcedures","createMcpHandler","setRequestHandler"],"mappings":";;;;;;AAgBO,SAAS,gBAAA,CAId,SAAA,EACA,GAAA,EACA,cAAA,EAKA;AACA,EAAA,MAAM,EAAE,aAAA,EAAe,MAAA,EAAQ,QAAA,EAAS,GAAI,cAAA;AAE5C,EAAA,MAAM,KAAA,GAAQA,4CAA2B,SAAS,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,YAAA,CAAa,GAAG,CAAA;AAE7C,EAAA,MAAM,OAAA,GAAUC,2BAAA;AAAA,IACd,CAAC,MAAA,KAAW;AACV,MAAAC,kCAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAElD,MAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AAClC,QAAA,QAAA,CAAS,MAAM,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA;AAAA;AAAA,MAEE,YAAA,EAAc;AAAA,QACZ,OAAO;AAAC,OACV;AAAA,MACA,GAAG;AAAA,KACL;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT","file":"vercel-mcp-adapter.js","sourcesContent":["import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp\";\nimport type {\n AnyRootTypes,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\nimport { createMcpHandler } from \"mcp-handler\";\n\nimport { setRequestHandler } from \"../server\";\nimport { extractToolsFromProcedures } from \"../tools\";\n\nexport type VercelMcpHandler = ReturnType<typeof createMcpHandler>;\nexport type McpServerOptions = Parameters<typeof createMcpHandler>[1];\nexport type McpHandlerConfig = Parameters<typeof createMcpHandler>[2];\n\nexport function trpcToMcpHandler<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n handlerOptions: {\n config: McpHandlerConfig;\n serverOptions?: McpServerOptions;\n callback?: (server: McpServer) => unknown;\n },\n) {\n const { serverOptions, config, callback } = handlerOptions;\n\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const handler = createMcpHandler(\n (server) => {\n setRequestHandler(server.server, tools, trpcCaller);\n\n if (typeof callback === \"function\") {\n callback(server);\n }\n },\n {\n // Leave it empty because we list tools manually\n capabilities: {\n tools: {},\n },\n ...serverOptions,\n },\n config,\n );\n\n return handler;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { setRequestHandler } from '../chunk-B2THZXSV.mjs';
2
- import { extractToolsFromProcedures } from '../chunk-6LCISFRE.mjs';
1
+ import { setRequestHandler } from '../chunk-JRSHHSAI.mjs';
2
+ import { extractToolsFromProcedures } from '../chunk-TI4KDF42.mjs';
3
3
  import { createMcpHandler } from 'mcp-handler';
4
4
 
5
5
  function trpcToMcpHandler(appRouter, ctx, handlerOptions) {
@@ -10,7 +10,7 @@ function trpcToMcpHandler(appRouter, ctx, handlerOptions) {
10
10
  (server) => {
11
11
  setRequestHandler(server.server, tools, trpcCaller);
12
12
  if (typeof callback === "function") {
13
- callback(server.server);
13
+ callback(server);
14
14
  }
15
15
  },
16
16
  {
@@ -1 +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"]}
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,MAAM,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAAA,IACA;AAAA;AAAA,MAEE,YAAA,EAAc;AAAA,QACZ,OAAO;AAAC,OACV;AAAA,MACA,GAAG;AAAA,KACL;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT","file":"vercel-mcp-adapter.mjs","sourcesContent":["import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp\";\nimport type {\n AnyRootTypes,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\nimport { createMcpHandler } from \"mcp-handler\";\n\nimport { setRequestHandler } from \"../server\";\nimport { extractToolsFromProcedures } from \"../tools\";\n\nexport type VercelMcpHandler = ReturnType<typeof createMcpHandler>;\nexport type McpServerOptions = Parameters<typeof createMcpHandler>[1];\nexport type McpHandlerConfig = Parameters<typeof createMcpHandler>[2];\n\nexport function trpcToMcpHandler<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n handlerOptions: {\n config: McpHandlerConfig;\n serverOptions?: McpServerOptions;\n callback?: (server: McpServer) => unknown;\n },\n) {\n const { serverOptions, config, callback } = handlerOptions;\n\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const handler = createMcpHandler(\n (server) => {\n setRequestHandler(server.server, tools, trpcCaller);\n\n if (typeof callback === \"function\") {\n callback(server);\n }\n },\n {\n // Leave it empty because we list tools manually\n capabilities: {\n tools: {},\n },\n ...serverOptions,\n },\n config,\n );\n\n return handler;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=chunk-55J6XMHW.js.map
4
+ //# sourceMappingURL=chunk-55J6XMHW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-55J6XMHW.js"}
@@ -1,5 +1,5 @@
1
- import { extractToolsFromProcedures } from './chunk-6LCISFRE.mjs';
2
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
1
+ import { extractToolsFromProcedures } from './chunk-TI4KDF42.mjs';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
4
 
5
5
  function setRequestHandler(server, tools, trpcCaller) {
@@ -15,25 +15,34 @@ function setRequestHandler(server, tools, trpcCaller) {
15
15
  (acc, part) => acc?.[part],
16
16
  trpcCaller
17
17
  );
18
- const result = await procedure(args);
19
- return {
20
- content: [{ type: "text", text: JSON.stringify(result) }]
21
- };
18
+ const meta = procedure.meta;
19
+ const transformMcpProcedure = meta?.mcp?.transformMcpProcedure;
20
+ if (typeof transformMcpProcedure === "function") {
21
+ const result = await transformMcpProcedure(procedure(args));
22
+ return {
23
+ content: result
24
+ };
25
+ } else {
26
+ const result = await procedure(args);
27
+ return {
28
+ content: [{ type: "text", text: JSON.stringify(result) }]
29
+ };
30
+ }
22
31
  });
23
32
  }
24
33
  function createMcpServer(implementation, appRouter, ctx) {
25
34
  const tools = extractToolsFromProcedures(appRouter);
26
35
  const trpcCaller = appRouter.createCaller(ctx);
27
- const server = new Server(implementation, {
36
+ const server = new McpServer(implementation, {
28
37
  capabilities: {
29
38
  // Leave it empty because we list tools manually
30
39
  tools: {}
31
40
  }
32
41
  });
33
- setRequestHandler(server, tools, trpcCaller);
42
+ setRequestHandler(server.server, tools, trpcCaller);
34
43
  return server;
35
44
  }
36
45
 
37
46
  export { createMcpServer, setRequestHandler };
38
- //# sourceMappingURL=chunk-B2THZXSV.mjs.map
39
- //# sourceMappingURL=chunk-B2THZXSV.mjs.map
47
+ //# sourceMappingURL=chunk-JRSHHSAI.mjs.map
48
+ //# sourceMappingURL=chunk-JRSHHSAI.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=chunk-KIQOUUEZ.mjs.map
3
+ //# sourceMappingURL=chunk-KIQOUUEZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-KIQOUUEZ.mjs"}
@@ -50,5 +50,5 @@ function extractToolsFromProcedures(appRouter, currentPath = []) {
50
50
 
51
51
  exports.extractToolsFromProcedures = extractToolsFromProcedures;
52
52
  exports.mergeInputs = mergeInputs;
53
- //# sourceMappingURL=chunk-TGP3GIZI.js.map
54
- //# sourceMappingURL=chunk-TGP3GIZI.js.map
53
+ //# sourceMappingURL=chunk-NEBQ5VDQ.js.map
54
+ //# sourceMappingURL=chunk-NEBQ5VDQ.js.map
@@ -1 +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-TGP3GIZI.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\nexport type { McpMeta } from \"./types\";\n"]}
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"]}
@@ -0,0 +1,11 @@
1
+ // src/helpers.ts
2
+ function transformMcpProcedure(procedure, callback) {
3
+ if (procedure.meta?.mcp?.enabled) {
4
+ procedure.meta.transformMcpProcedure = callback;
5
+ }
6
+ return procedure;
7
+ }
8
+
9
+ export { transformMcpProcedure };
10
+ //# sourceMappingURL=chunk-OGMEVEU5.mjs.map
11
+ //# sourceMappingURL=chunk-OGMEVEU5.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,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,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkTGP3GIZI_js = require('./chunk-TGP3GIZI.js');
4
- var index_js = require('@modelcontextprotocol/sdk/server/index.js');
3
+ var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
4
+ var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
5
5
  var types_js = require('@modelcontextprotocol/sdk/types.js');
6
6
 
7
7
  function setRequestHandler(server, tools, trpcCaller) {
@@ -17,26 +17,35 @@ function setRequestHandler(server, tools, trpcCaller) {
17
17
  (acc, part) => acc?.[part],
18
18
  trpcCaller
19
19
  );
20
- const result = await procedure(args);
21
- return {
22
- content: [{ type: "text", text: JSON.stringify(result) }]
23
- };
20
+ const meta = procedure.meta;
21
+ const transformMcpProcedure = meta?.mcp?.transformMcpProcedure;
22
+ if (typeof transformMcpProcedure === "function") {
23
+ const result = await transformMcpProcedure(procedure(args));
24
+ return {
25
+ content: result
26
+ };
27
+ } else {
28
+ const result = await procedure(args);
29
+ return {
30
+ content: [{ type: "text", text: JSON.stringify(result) }]
31
+ };
32
+ }
24
33
  });
25
34
  }
26
35
  function createMcpServer(implementation, appRouter, ctx) {
27
- const tools = chunkTGP3GIZI_js.extractToolsFromProcedures(appRouter);
36
+ const tools = chunkNEBQ5VDQ_js.extractToolsFromProcedures(appRouter);
28
37
  const trpcCaller = appRouter.createCaller(ctx);
29
- const server = new index_js.Server(implementation, {
38
+ const server = new mcp_js.McpServer(implementation, {
30
39
  capabilities: {
31
40
  // Leave it empty because we list tools manually
32
41
  tools: {}
33
42
  }
34
43
  });
35
- setRequestHandler(server, tools, trpcCaller);
44
+ setRequestHandler(server.server, tools, trpcCaller);
36
45
  return server;
37
46
  }
38
47
 
39
48
  exports.createMcpServer = createMcpServer;
40
49
  exports.setRequestHandler = setRequestHandler;
41
- //# sourceMappingURL=chunk-YFN3GSJ4.js.map
42
- //# sourceMappingURL=chunk-YFN3GSJ4.js.map
50
+ //# sourceMappingURL=chunk-Q2ADARFX.js.map
51
+ //# sourceMappingURL=chunk-Q2ADARFX.js.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ // src/helpers.ts
4
+ function transformMcpProcedure(procedure, callback) {
5
+ if (procedure.meta?.mcp?.enabled) {
6
+ procedure.meta.transformMcpProcedure = callback;
7
+ }
8
+ return procedure;
9
+ }
10
+
11
+ exports.transformMcpProcedure = transformMcpProcedure;
12
+ //# sourceMappingURL=chunk-TERO2JCQ.js.map
13
+ //# sourceMappingURL=chunk-TERO2JCQ.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,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"]}
@@ -47,5 +47,5 @@ function extractToolsFromProcedures(appRouter, currentPath = []) {
47
47
  }
48
48
 
49
49
  export { extractToolsFromProcedures, mergeInputs };
50
- //# sourceMappingURL=chunk-6LCISFRE.mjs.map
51
- //# sourceMappingURL=chunk-6LCISFRE.mjs.map
50
+ //# sourceMappingURL=chunk-TI4KDF42.mjs.map
51
+ //# sourceMappingURL=chunk-TI4KDF42.mjs.map
@@ -1 +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-6LCISFRE.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\nexport type { McpMeta } from \"./types\";\n"]}
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
+ import { ContentBlock } from '@modelcontextprotocol/sdk/types';
2
+ import { AnyProcedure, inferProcedureOutput, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
3
+
4
+ declare function transformMcpProcedure<TProcedure extends AnyProcedure>(procedure: TProcedure, callback: (output: inferProcedureOutput<TProcedure>) => MaybePromise<ContentBlock[]>): TProcedure;
5
+
6
+ export { transformMcpProcedure };
@@ -0,0 +1,6 @@
1
+ import { ContentBlock } from '@modelcontextprotocol/sdk/types';
2
+ import { AnyProcedure, inferProcedureOutput, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
3
+
4
+ declare function transformMcpProcedure<TProcedure extends AnyProcedure>(procedure: TProcedure, callback: (output: inferProcedureOutput<TProcedure>) => MaybePromise<ContentBlock[]>): TProcedure;
5
+
6
+ export { transformMcpProcedure };
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var chunkTERO2JCQ_js = require('./chunk-TERO2JCQ.js');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "transformMcpProcedure", {
8
+ enumerable: true,
9
+ get: function () { return chunkTERO2JCQ_js.transformMcpProcedure; }
10
+ });
11
+ //# sourceMappingURL=helpers.js.map
12
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"helpers.js"}
@@ -0,0 +1,3 @@
1
+ export { transformMcpProcedure } from './chunk-OGMEVEU5.mjs';
2
+ //# sourceMappingURL=helpers.mjs.map
3
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"helpers.mjs"}
package/dist/index.d.mts CHANGED
@@ -1,7 +1,10 @@
1
1
  export { createMcpServer, setRequestHandler } from './server.mjs';
2
2
  export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.mjs';
3
+ export { transformMcpProcedure } from './helpers.mjs';
3
4
  export { McpMeta } from './types.mjs';
4
5
  import '@modelcontextprotocol/sdk/server/index.js';
6
+ import '@modelcontextprotocol/sdk/server/mcp.js';
5
7
  import '@modelcontextprotocol/sdk/types.js';
6
8
  import '@trpc/server/unstable-core-do-not-import';
7
9
  import 'zod/v4';
10
+ import '@modelcontextprotocol/sdk/types';
package/dist/index.d.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  export { createMcpServer, setRequestHandler } from './server.js';
2
2
  export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.js';
3
+ export { transformMcpProcedure } from './helpers.js';
3
4
  export { McpMeta } from './types.js';
4
5
  import '@modelcontextprotocol/sdk/server/index.js';
6
+ import '@modelcontextprotocol/sdk/server/mcp.js';
5
7
  import '@modelcontextprotocol/sdk/types.js';
6
8
  import '@trpc/server/unstable-core-do-not-import';
7
9
  import 'zod/v4';
10
+ import '@modelcontextprotocol/sdk/types';
package/dist/index.js CHANGED
@@ -1,25 +1,31 @@
1
1
  'use strict';
2
2
 
3
- var chunkYFN3GSJ4_js = require('./chunk-YFN3GSJ4.js');
4
- var chunkTGP3GIZI_js = require('./chunk-TGP3GIZI.js');
3
+ var chunkTERO2JCQ_js = require('./chunk-TERO2JCQ.js');
4
+ require('./chunk-55J6XMHW.js');
5
+ var chunkQ2ADARFX_js = require('./chunk-Q2ADARFX.js');
6
+ var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
5
7
 
6
8
 
7
9
 
10
+ Object.defineProperty(exports, "transformMcpProcedure", {
11
+ enumerable: true,
12
+ get: function () { return chunkTERO2JCQ_js.transformMcpProcedure; }
13
+ });
8
14
  Object.defineProperty(exports, "createMcpServer", {
9
15
  enumerable: true,
10
- get: function () { return chunkYFN3GSJ4_js.createMcpServer; }
16
+ get: function () { return chunkQ2ADARFX_js.createMcpServer; }
11
17
  });
12
18
  Object.defineProperty(exports, "setRequestHandler", {
13
19
  enumerable: true,
14
- get: function () { return chunkYFN3GSJ4_js.setRequestHandler; }
20
+ get: function () { return chunkQ2ADARFX_js.setRequestHandler; }
15
21
  });
16
22
  Object.defineProperty(exports, "extractToolsFromProcedures", {
17
23
  enumerable: true,
18
- get: function () { return chunkTGP3GIZI_js.extractToolsFromProcedures; }
24
+ get: function () { return chunkNEBQ5VDQ_js.extractToolsFromProcedures; }
19
25
  });
20
26
  Object.defineProperty(exports, "mergeInputs", {
21
27
  enumerable: true,
22
- get: function () { return chunkTGP3GIZI_js.mergeInputs; }
28
+ get: function () { return chunkNEBQ5VDQ_js.mergeInputs; }
23
29
  });
24
30
  //# sourceMappingURL=index.js.map
25
31
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,4 +1,6 @@
1
- export { createMcpServer, setRequestHandler } from './chunk-B2THZXSV.mjs';
2
- export { extractToolsFromProcedures, mergeInputs } from './chunk-6LCISFRE.mjs';
1
+ export { transformMcpProcedure } from './chunk-OGMEVEU5.mjs';
2
+ import './chunk-KIQOUUEZ.mjs';
3
+ export { createMcpServer, setRequestHandler } from './chunk-JRSHHSAI.mjs';
4
+ export { extractToolsFromProcedures, mergeInputs } from './chunk-TI4KDF42.mjs';
3
5
  //# sourceMappingURL=index.mjs.map
4
6
  //# sourceMappingURL=index.mjs.map
package/dist/server.d.mts CHANGED
@@ -1,33 +1,11 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
3
  import { Implementation } from '@modelcontextprotocol/sdk/types.js';
3
4
  import { RouterRecord, DecorateRouterRecord, AnyRootTypes, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
4
5
  import { McpTool } from './tools.mjs';
5
- import './types.mjs';
6
6
  import 'zod/v4';
7
7
 
8
8
  declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
9
- declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): Server<{
10
- method: string;
11
- params?: {
12
- [x: string]: unknown;
13
- _meta?: {
14
- [x: string]: unknown;
15
- progressToken?: string | number | undefined;
16
- } | undefined;
17
- } | undefined;
18
- }, {
19
- method: string;
20
- params?: {
21
- [x: string]: unknown;
22
- _meta?: {
23
- [x: string]: unknown;
24
- } | undefined;
25
- } | undefined;
26
- }, {
27
- [x: string]: unknown;
28
- _meta?: {
29
- [x: string]: unknown;
30
- } | undefined;
31
- }>;
9
+ declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): McpServer;
32
10
 
33
11
  export { createMcpServer, setRequestHandler };
package/dist/server.d.ts CHANGED
@@ -1,33 +1,11 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
3
  import { Implementation } from '@modelcontextprotocol/sdk/types.js';
3
4
  import { RouterRecord, DecorateRouterRecord, AnyRootTypes, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
4
5
  import { McpTool } from './tools.js';
5
- import './types.js';
6
6
  import 'zod/v4';
7
7
 
8
8
  declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
9
- declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): Server<{
10
- method: string;
11
- params?: {
12
- [x: string]: unknown;
13
- _meta?: {
14
- [x: string]: unknown;
15
- progressToken?: string | number | undefined;
16
- } | undefined;
17
- } | undefined;
18
- }, {
19
- method: string;
20
- params?: {
21
- [x: string]: unknown;
22
- _meta?: {
23
- [x: string]: unknown;
24
- } | undefined;
25
- } | undefined;
26
- }, {
27
- [x: string]: unknown;
28
- _meta?: {
29
- [x: string]: unknown;
30
- } | undefined;
31
- }>;
9
+ declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): McpServer;
32
10
 
33
11
  export { createMcpServer, setRequestHandler };
package/dist/server.js CHANGED
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkYFN3GSJ4_js = require('./chunk-YFN3GSJ4.js');
4
- require('./chunk-TGP3GIZI.js');
3
+ var chunkQ2ADARFX_js = require('./chunk-Q2ADARFX.js');
4
+ require('./chunk-NEBQ5VDQ.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "createMcpServer", {
9
9
  enumerable: true,
10
- get: function () { return chunkYFN3GSJ4_js.createMcpServer; }
10
+ get: function () { return chunkQ2ADARFX_js.createMcpServer; }
11
11
  });
12
12
  Object.defineProperty(exports, "setRequestHandler", {
13
13
  enumerable: true,
14
- get: function () { return chunkYFN3GSJ4_js.setRequestHandler; }
14
+ get: function () { return chunkQ2ADARFX_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-B2THZXSV.mjs';
2
- import './chunk-6LCISFRE.mjs';
1
+ export { createMcpServer, setRequestHandler } from './chunk-JRSHHSAI.mjs';
2
+ import './chunk-TI4KDF42.mjs';
3
3
  //# sourceMappingURL=server.mjs.map
4
4
  //# sourceMappingURL=server.mjs.map
package/dist/tools.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { AnyRootTypes, RouterRecord, Router } from '@trpc/server/unstable-core-do-not-import';
2
2
  import { z } from 'zod/v4';
3
- export { McpMeta } from './types.mjs';
4
3
 
5
4
  type McpTool = {
6
5
  name: string;
package/dist/tools.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { AnyRootTypes, RouterRecord, Router } from '@trpc/server/unstable-core-do-not-import';
2
2
  import { z } from 'zod/v4';
3
- export { McpMeta } from './types.js';
4
3
 
5
4
  type McpTool = {
6
5
  name: string;
package/dist/tools.js CHANGED
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var chunkTGP3GIZI_js = require('./chunk-TGP3GIZI.js');
3
+ var chunkNEBQ5VDQ_js = require('./chunk-NEBQ5VDQ.js');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "extractToolsFromProcedures", {
8
8
  enumerable: true,
9
- get: function () { return chunkTGP3GIZI_js.extractToolsFromProcedures; }
9
+ get: function () { return chunkNEBQ5VDQ_js.extractToolsFromProcedures; }
10
10
  });
11
11
  Object.defineProperty(exports, "mergeInputs", {
12
12
  enumerable: true,
13
- get: function () { return chunkTGP3GIZI_js.mergeInputs; }
13
+ get: function () { return chunkNEBQ5VDQ_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-6LCISFRE.mjs';
1
+ export { extractToolsFromProcedures, mergeInputs } from './chunk-TI4KDF42.mjs';
2
2
  //# sourceMappingURL=tools.mjs.map
3
3
  //# sourceMappingURL=tools.mjs.map
package/dist/types.d.mts CHANGED
@@ -1,8 +1,12 @@
1
+ import { ContentBlock } from '@modelcontextprotocol/sdk/types.js';
2
+ import { inferProcedureOutput, AnyProcedure, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
3
+
1
4
  type McpMeta = {
2
5
  mcp?: {
3
6
  enabled?: boolean;
4
7
  description?: string;
5
8
  name?: string;
9
+ transformMcpProcedure?: (output: inferProcedureOutput<AnyProcedure>) => MaybePromise<ContentBlock[]>;
6
10
  };
7
11
  };
8
12
 
package/dist/types.d.ts CHANGED
@@ -1,8 +1,12 @@
1
+ import { ContentBlock } from '@modelcontextprotocol/sdk/types.js';
2
+ import { inferProcedureOutput, AnyProcedure, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
3
+
1
4
  type McpMeta = {
2
5
  mcp?: {
3
6
  enabled?: boolean;
4
7
  description?: string;
5
8
  name?: string;
9
+ transformMcpProcedure?: (output: inferProcedureOutput<AnyProcedure>) => MaybePromise<ContentBlock[]>;
6
10
  };
7
11
  };
8
12
 
package/dist/types.js CHANGED
@@ -1,4 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ require('./chunk-55J6XMHW.js');
4
+
3
5
  //# sourceMappingURL=types.js.map
4
6
  //# sourceMappingURL=types.js.map
package/dist/types.mjs CHANGED
@@ -1,3 +1,3 @@
1
-
1
+ import './chunk-KIQOUUEZ.mjs';
2
2
  //# sourceMappingURL=types.mjs.map
3
3
  //# sourceMappingURL=types.mjs.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "trpc-to-mcp",
3
3
  "license": "MIT",
4
- "version": "1.1.5",
4
+ "version": "1.3.0",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
@@ -50,6 +50,26 @@
50
50
  "default": "./dist/tools.js"
51
51
  }
52
52
  },
53
+ "./helpers": {
54
+ "import": {
55
+ "types": "./dist/helpers.d.ts",
56
+ "default": "./dist/helpers.mjs"
57
+ },
58
+ "require": {
59
+ "types": "./dist/helpers.d.ts",
60
+ "default": "./dist/helpers.js"
61
+ }
62
+ },
63
+ "./types": {
64
+ "import": {
65
+ "types": "./dist/types.d.ts",
66
+ "default": "./dist/types.mjs"
67
+ },
68
+ "require": {
69
+ "types": "./dist/types.d.ts",
70
+ "default": "./dist/types.js"
71
+ }
72
+ },
53
73
  "./adapters/vercel-mcp-adapter": {
54
74
  "import": {
55
75
  "types": "./dist/adapters/vercel-mcp-adapter.d.ts",
@@ -1 +0,0 @@
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-B2THZXSV.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"]}
@@ -1 +0,0 @@
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-YFN3GSJ4.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"]}