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.
- package/README.md +261 -0
- package/dist/adapters/vercel-mcp-adapter.d.mts +2 -2
- package/dist/adapters/vercel-mcp-adapter.d.ts +2 -2
- package/dist/adapters/vercel-mcp-adapter.js +5 -5
- package/dist/adapters/vercel-mcp-adapter.js.map +1 -1
- package/dist/adapters/vercel-mcp-adapter.mjs +3 -3
- package/dist/adapters/vercel-mcp-adapter.mjs.map +1 -1
- package/dist/chunk-55J6XMHW.js +4 -0
- package/dist/chunk-55J6XMHW.js.map +1 -0
- package/dist/{chunk-B2THZXSV.mjs → chunk-JRSHHSAI.mjs} +19 -10
- package/dist/chunk-JRSHHSAI.mjs.map +1 -0
- package/dist/chunk-KIQOUUEZ.mjs +3 -0
- package/dist/chunk-KIQOUUEZ.mjs.map +1 -0
- package/dist/{chunk-TGP3GIZI.js → chunk-NEBQ5VDQ.js} +2 -2
- package/dist/{chunk-TGP3GIZI.js.map → chunk-NEBQ5VDQ.js.map} +1 -1
- package/dist/chunk-OGMEVEU5.mjs +11 -0
- package/dist/chunk-OGMEVEU5.mjs.map +1 -0
- package/dist/{chunk-YFN3GSJ4.js → chunk-Q2ADARFX.js} +20 -11
- package/dist/chunk-Q2ADARFX.js.map +1 -0
- package/dist/chunk-TERO2JCQ.js +13 -0
- package/dist/chunk-TERO2JCQ.js.map +1 -0
- package/dist/{chunk-6LCISFRE.mjs → chunk-TI4KDF42.mjs} +2 -2
- package/dist/{chunk-6LCISFRE.mjs.map → chunk-TI4KDF42.mjs.map} +1 -1
- package/dist/helpers.d.mts +6 -0
- package/dist/helpers.d.ts +6 -0
- package/dist/helpers.js +12 -0
- package/dist/helpers.js.map +1 -0
- package/dist/helpers.mjs +3 -0
- package/dist/helpers.mjs.map +1 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +12 -6
- package/dist/index.mjs +4 -2
- package/dist/server.d.mts +2 -24
- package/dist/server.d.ts +2 -24
- package/dist/server.js +4 -4
- package/dist/server.mjs +2 -2
- package/dist/tools.d.mts +0 -1
- package/dist/tools.d.ts +0 -1
- package/dist/tools.js +3 -3
- package/dist/tools.mjs +1 -1
- package/dist/types.d.mts +4 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.js +2 -0
- package/dist/types.mjs +1 -1
- package/package.json +21 -1
- package/dist/chunk-B2THZXSV.mjs.map +0 -1
- 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 {
|
|
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:
|
|
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 {
|
|
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:
|
|
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
|
|
4
|
-
var
|
|
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 =
|
|
9
|
+
const tools = chunkNEBQ5VDQ_js.extractToolsFromProcedures(appRouter);
|
|
10
10
|
const trpcCaller = appRouter.createCaller(ctx);
|
|
11
11
|
const handler = mcpHandler.createMcpHandler(
|
|
12
12
|
(server) => {
|
|
13
|
-
|
|
13
|
+
chunkQ2ADARFX_js.setRequestHandler(server.server, tools, trpcCaller);
|
|
14
14
|
if (typeof callback === "function") {
|
|
15
|
-
callback(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,
|
|
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-
|
|
2
|
-
import { extractToolsFromProcedures } from '../chunk-
|
|
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
|
|
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,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-55J6XMHW.js"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { extractToolsFromProcedures } from './chunk-
|
|
2
|
-
import {
|
|
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
|
|
19
|
-
|
|
20
|
-
|
|
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
|
|
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-
|
|
39
|
-
//# sourceMappingURL=chunk-
|
|
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 @@
|
|
|
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-
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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
|
|
4
|
-
var
|
|
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
|
|
21
|
-
|
|
22
|
-
|
|
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 =
|
|
36
|
+
const tools = chunkNEBQ5VDQ_js.extractToolsFromProcedures(appRouter);
|
|
28
37
|
const trpcCaller = appRouter.createCaller(ctx);
|
|
29
|
-
const server = new
|
|
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-
|
|
42
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
51
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
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 };
|
package/dist/helpers.js
ADDED
|
@@ -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"}
|
package/dist/helpers.mjs
ADDED
|
@@ -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
|
|
4
|
-
|
|
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
|
|
16
|
+
get: function () { return chunkQ2ADARFX_js.createMcpServer; }
|
|
11
17
|
});
|
|
12
18
|
Object.defineProperty(exports, "setRequestHandler", {
|
|
13
19
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
20
|
+
get: function () { return chunkQ2ADARFX_js.setRequestHandler; }
|
|
15
21
|
});
|
|
16
22
|
Object.defineProperty(exports, "extractToolsFromProcedures", {
|
|
17
23
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
24
|
+
get: function () { return chunkNEBQ5VDQ_js.extractToolsFromProcedures; }
|
|
19
25
|
});
|
|
20
26
|
Object.defineProperty(exports, "mergeInputs", {
|
|
21
27
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
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 {
|
|
2
|
-
|
|
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"]>)):
|
|
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"]>)):
|
|
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
|
|
4
|
-
require('./chunk-
|
|
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
|
|
10
|
+
get: function () { return chunkQ2ADARFX_js.createMcpServer; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "setRequestHandler", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
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-
|
|
2
|
-
import './chunk-
|
|
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
package/dist/tools.d.ts
CHANGED
package/dist/tools.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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
|
|
9
|
+
get: function () { return chunkNEBQ5VDQ_js.extractToolsFromProcedures; }
|
|
10
10
|
});
|
|
11
11
|
Object.defineProperty(exports, "mergeInputs", {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
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
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
package/dist/types.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trpc-to-mcp",
|
|
3
3
|
"license": "MIT",
|
|
4
|
-
"version": "1.
|
|
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"]}
|