trpc-to-mcp 1.1.4 → 1.2.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 +182 -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-TI4KDF42.mjs → chunk-6LCISFRE.mjs} +2 -2
- package/dist/{chunk-TI4KDF42.mjs.map → chunk-6LCISFRE.mjs.map} +1 -1
- package/dist/{chunk-5YYUHHJX.mjs → chunk-DYYZPKTV.mjs} +6 -6
- package/dist/chunk-DYYZPKTV.mjs.map +1 -0
- package/dist/{chunk-H365IMJI.js → chunk-NYCGEMYB.js} +7 -7
- package/dist/chunk-NYCGEMYB.js.map +1 -0
- package/dist/{chunk-NEBQ5VDQ.js → chunk-TGP3GIZI.js} +2 -2
- package/dist/{chunk-NEBQ5VDQ.js.map → chunk-TGP3GIZI.js.map} +1 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +6 -6
- package/dist/index.mjs +2 -2
- package/dist/server.d.mts +3 -23
- package/dist/server.d.ts +3 -23
- package/dist/server.js +4 -4
- package/dist/server.mjs +2 -2
- package/dist/tools.d.mts +1 -0
- package/dist/tools.d.ts +1 -0
- package/dist/tools.js +3 -3
- package/dist/tools.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-5YYUHHJX.mjs.map +0 -1
- package/dist/chunk-H365IMJI.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
## tRPC to MCP
|
|
2
|
+
|
|
3
|
+
- Support for tRPC v11
|
|
4
|
+
- [Turn your tRPC router into MCP tools](#to-mcp-tools)
|
|
5
|
+
- [Turn your tRPC router into MCP server](#to-mcp-server)
|
|
6
|
+
- [Turn your tRPC router into @vercel/mcp-adapter handler](#to-vercel-mcp-adapter)
|
|
7
|
+
|
|
8
|
+
## Usage
|
|
9
|
+
|
|
10
|
+
1. Install trpc-to-mcp
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install trpc-to-mcp
|
|
14
|
+
|
|
15
|
+
pnpm add trpc-to-mcp
|
|
16
|
+
|
|
17
|
+
bun add trpc-to-mcp
|
|
18
|
+
|
|
19
|
+
yarn add trpc-to-mcp
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
2. Add `McpMeta` to your tRPC instance
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { initTRPC } from "@trpc/server";
|
|
26
|
+
import { type McpMeta } from "trpc-to-mcp";
|
|
27
|
+
|
|
28
|
+
const t = initTRPC.meta<McpMeta>().create();
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
3. Enable `mcp` support for a procedure
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
export const appRouter = t.router({
|
|
35
|
+
hello: t.procedure
|
|
36
|
+
.meta({
|
|
37
|
+
mcp: {
|
|
38
|
+
enabled: true,
|
|
39
|
+
description: "Say hello to a name",
|
|
40
|
+
// You can leave it empty, it'll be converted to "hello"
|
|
41
|
+
// If you have subrouters, then subrouter_procedure_name
|
|
42
|
+
name: "say_hello",
|
|
43
|
+
},
|
|
44
|
+
})
|
|
45
|
+
.input(
|
|
46
|
+
z.object({
|
|
47
|
+
name: z.string(),
|
|
48
|
+
}),
|
|
49
|
+
)
|
|
50
|
+
.query(({ input }) => {
|
|
51
|
+
return { greeting: `Hello ${input.name}` };
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## To MCP tools
|
|
57
|
+
|
|
58
|
+
4. You can turn a router into tools
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import { appRouter } from "@/server/trpc/root.ts";
|
|
62
|
+
import { extractToolsFromProcedures } from "trpc-to-mcp";
|
|
63
|
+
|
|
64
|
+
const tools = extractToolsFromProcedures(appRouter);
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
|
|
68
|
+
[
|
|
69
|
+
{
|
|
70
|
+
name: "Tool name",
|
|
71
|
+
description: "Description of the tool",
|
|
72
|
+
pathInRouter: [...],
|
|
73
|
+
inputSchema: JSONSchema // this if full JSON schema from your zod schema
|
|
74
|
+
},
|
|
75
|
+
...
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
*/
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## To MCP server
|
|
82
|
+
|
|
83
|
+
5. You can turn a router into an MCP server
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import { appRouter } from "@/server/trpc/root.ts";
|
|
87
|
+
import { createMcpServer } from "trpc-to-mcp";
|
|
88
|
+
|
|
89
|
+
const ctx = {
|
|
90
|
+
session: {
|
|
91
|
+
// ...
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Returns high-level McpServer instance
|
|
96
|
+
const mcpServer = createMcpServer(
|
|
97
|
+
implementation, // Pass your Implementation instance
|
|
98
|
+
appRouter,
|
|
99
|
+
ctx, // Pass your tRPC context
|
|
100
|
+
);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## To Vercel MCP adapter
|
|
104
|
+
|
|
105
|
+
6. You can turn a router into `@vercel/mcp-adapter` handler
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// app/api/[transport]/route.ts
|
|
109
|
+
import { trpcToMcpHandler } from "trpc-to-mcp/adapters/vercel-mcp-adapter";
|
|
110
|
+
|
|
111
|
+
const handler = trpcToHandler(appRouter, ctx, {
|
|
112
|
+
// @vercel/mcp-adapter config options
|
|
113
|
+
config: {
|
|
114
|
+
basePath: "/api",
|
|
115
|
+
// Disable in production
|
|
116
|
+
verboseLogs: true,
|
|
117
|
+
maxDuration: 60,
|
|
118
|
+
},
|
|
119
|
+
// @vercel/mcp-adapter server options
|
|
120
|
+
serverOptions: { ... },
|
|
121
|
+
callback: (server) => {
|
|
122
|
+
// You can modify the McpServer instance
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
export { handler as DELETE, handler as GET, handler as POST };
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Use with better-auth
|
|
130
|
+
|
|
131
|
+
7. You can use it with better-auth
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// app/api/[transport]/route.ts
|
|
135
|
+
|
|
136
|
+
import { withMcpAuth } from "better-auth/plugins";
|
|
137
|
+
import { trpcToMcpHandler } from "trpc-to-mcp/adapters/vercel-mcp-adapter";
|
|
138
|
+
|
|
139
|
+
// Define a function to retrieve user session from database
|
|
140
|
+
async function getSession(mcpSession: McpSession): Promise<Session | null> {
|
|
141
|
+
// You can use mcpSession.userId to fetch session
|
|
142
|
+
// await db.query.session.findFirst({
|
|
143
|
+
// where: (table, { eq }) => eq(table.userId, mcpSession.userId)
|
|
144
|
+
// })
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const handler = withMcpAuth(auth, async (request, mcpSession) => {
|
|
148
|
+
// Retrieve the session from database via userId inside mcpSession
|
|
149
|
+
const session = await getSession(mcpSession);
|
|
150
|
+
|
|
151
|
+
const handler = trpcToMcpHandler(
|
|
152
|
+
appRouter,
|
|
153
|
+
// Pass your tRPC context here
|
|
154
|
+
{
|
|
155
|
+
db,
|
|
156
|
+
headers: request.headers,
|
|
157
|
+
session: session?.session,
|
|
158
|
+
user: session?.user,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
config: {
|
|
162
|
+
basePath: "/api",
|
|
163
|
+
// Disable in production
|
|
164
|
+
verboseLogs: true,
|
|
165
|
+
maxDuration: 60,
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
return await handler(request);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
export { handler as DELETE, handler as GET, handler as POST };
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Result
|
|
177
|
+
|
|
178
|
+
Now you can chill and add MCP to your VC-backed startup so your investors won't worry, and profit
|
|
179
|
+
|
|
180
|
+
## Twitter / X
|
|
181
|
+
|
|
182
|
+
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 chunkNYCGEMYB_js = require('../chunk-NYCGEMYB.js');
|
|
4
|
+
var chunkTGP3GIZI_js = require('../chunk-TGP3GIZI.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 = chunkTGP3GIZI_js.extractToolsFromProcedures(appRouter);
|
|
10
10
|
const trpcCaller = appRouter.createCaller(ctx);
|
|
11
11
|
const handler = mcpHandler.createMcpHandler(
|
|
12
12
|
(server) => {
|
|
13
|
-
|
|
13
|
+
chunkNYCGEMYB_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":";;;;;;
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/vercel-mcp-adapter.ts"],"names":["extractToolsFromProcedures","createMcpHandler","setRequestHandler"],"mappings":";;;;;;AAiBO,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 { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport 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-DYYZPKTV.mjs';
|
|
2
|
+
import { extractToolsFromProcedures } from '../chunk-6LCISFRE.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":";;;;
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/vercel-mcp-adapter.ts"],"names":[],"mappings":";;;;AAiBO,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 { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport 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"]}
|
|
@@ -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-6LCISFRE.mjs.map
|
|
51
|
+
//# sourceMappingURL=chunk-6LCISFRE.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-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,5 +1,5 @@
|
|
|
1
|
-
import { extractToolsFromProcedures } from './chunk-
|
|
2
|
-
import {
|
|
1
|
+
import { extractToolsFromProcedures } from './chunk-6LCISFRE.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) {
|
|
@@ -24,16 +24,16 @@ function setRequestHandler(server, tools, trpcCaller) {
|
|
|
24
24
|
function createMcpServer(implementation, appRouter, ctx) {
|
|
25
25
|
const tools = extractToolsFromProcedures(appRouter);
|
|
26
26
|
const trpcCaller = appRouter.createCaller(ctx);
|
|
27
|
-
const server = new
|
|
27
|
+
const server = new McpServer(implementation, {
|
|
28
28
|
capabilities: {
|
|
29
29
|
// Leave it empty because we list tools manually
|
|
30
30
|
tools: {}
|
|
31
31
|
}
|
|
32
32
|
});
|
|
33
|
-
setRequestHandler(server, tools, trpcCaller);
|
|
33
|
+
setRequestHandler(server.server, tools, trpcCaller);
|
|
34
34
|
return server;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export { createMcpServer, setRequestHandler };
|
|
38
|
-
//# sourceMappingURL=chunk-
|
|
39
|
-
//# sourceMappingURL=chunk-
|
|
38
|
+
//# sourceMappingURL=chunk-DYYZPKTV.mjs.map
|
|
39
|
+
//# sourceMappingURL=chunk-DYYZPKTV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts"],"names":[],"mappings":";;;;AAkBO,SAAS,iBAAA,CACd,MAAA,EACA,KAAA,EACA,UAAA,EACA;AAEA,EAAA,MAAA,CAAO,iBAAA,CAAkB,sBAAA,EAAwB,OAAO,EAAE,OAAM,CAAE,CAAA;AAGlE,EAAA,MAAA,CAAO,iBAAA,CAAkB,qBAAA,EAAuB,OAAO,OAAA,KAAY;AACjE,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,KAAS,OAAA,CAAQ,MAAA;AAE1C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAE9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,qBAAA,EAAuB,CAAA,EAAE;AAAA,IACpE;AAGA,IAAA,MAAM,SAAA,GAA0B,KAAK,YAAA,CAAa,MAAA;AAAA;AAAA,MAEhD,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAI,CAAA;AAAA,MACzB;AAAA,KACF;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,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-DYYZPKTV.mjs","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Implementation,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n AnyProcedure,\n AnyRootTypes,\n DecorateRouterRecord,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nimport { extractToolsFromProcedures, type McpTool } from \"./tools\";\n\nexport function setRequestHandler<TRecord extends RouterRecord>(\n server: Server,\n tools: McpTool[],\n trpcCaller: DecorateRouterRecord<TRecord>,\n) {\n // List all of the available tools\n server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const tool = tools.find((t) => t.name === name);\n\n if (!tool) {\n return { content: [{ type: \"text\", text: \"Could not find tool\" }] };\n }\n\n // @ts-expect-error path in router\n const procedure: AnyProcedure = tool.pathInRouter.reduce(\n // @ts-expect-error path in router\n (acc, part) => acc?.[part],\n trpcCaller,\n );\n\n // @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 McpServer(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server.server, tools, trpcCaller);\n\n return server;\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkTGP3GIZI_js = require('./chunk-TGP3GIZI.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) {
|
|
@@ -24,19 +24,19 @@ function setRequestHandler(server, tools, trpcCaller) {
|
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
function createMcpServer(implementation, appRouter, ctx) {
|
|
27
|
-
const tools =
|
|
27
|
+
const tools = chunkTGP3GIZI_js.extractToolsFromProcedures(appRouter);
|
|
28
28
|
const trpcCaller = appRouter.createCaller(ctx);
|
|
29
|
-
const server = new
|
|
29
|
+
const server = new mcp_js.McpServer(implementation, {
|
|
30
30
|
capabilities: {
|
|
31
31
|
// Leave it empty because we list tools manually
|
|
32
32
|
tools: {}
|
|
33
33
|
}
|
|
34
34
|
});
|
|
35
|
-
setRequestHandler(server, tools, trpcCaller);
|
|
35
|
+
setRequestHandler(server.server, tools, trpcCaller);
|
|
36
36
|
return server;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
exports.createMcpServer = createMcpServer;
|
|
40
40
|
exports.setRequestHandler = setRequestHandler;
|
|
41
|
-
//# sourceMappingURL=chunk-
|
|
42
|
-
//# sourceMappingURL=chunk-
|
|
41
|
+
//# sourceMappingURL=chunk-NYCGEMYB.js.map
|
|
42
|
+
//# sourceMappingURL=chunk-NYCGEMYB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts"],"names":["ListToolsRequestSchema","CallToolRequestSchema","extractToolsFromProcedures","McpServer"],"mappings":";;;;;;AAkBO,SAAS,iBAAA,CACd,MAAA,EACA,KAAA,EACA,UAAA,EACA;AAEA,EAAA,MAAA,CAAO,iBAAA,CAAkBA,+BAAA,EAAwB,OAAO,EAAE,OAAM,CAAE,CAAA;AAGlE,EAAA,MAAA,CAAO,iBAAA,CAAkBC,8BAAA,EAAuB,OAAO,OAAA,KAAY;AACjE,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,KAAS,OAAA,CAAQ,MAAA;AAE1C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAE9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,qBAAA,EAAuB,CAAA,EAAE;AAAA,IACpE;AAGA,IAAA,MAAM,SAAA,GAA0B,KAAK,YAAA,CAAa,MAAA;AAAA;AAAA,MAEhD,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAI,CAAA;AAAA,MACzB;AAAA,KACF;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,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-NYCGEMYB.js","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Implementation,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n AnyProcedure,\n AnyRootTypes,\n DecorateRouterRecord,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nimport { extractToolsFromProcedures, type McpTool } from \"./tools\";\n\nexport function setRequestHandler<TRecord extends RouterRecord>(\n server: Server,\n tools: McpTool[],\n trpcCaller: DecorateRouterRecord<TRecord>,\n) {\n // List all of the available tools\n server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const tool = tools.find((t) => t.name === name);\n\n if (!tool) {\n return { content: [{ type: \"text\", text: \"Could not find tool\" }] };\n }\n\n // @ts-expect-error path in router\n const procedure: AnyProcedure = tool.pathInRouter.reduce(\n // @ts-expect-error path in router\n (acc, part) => acc?.[part],\n trpcCaller,\n );\n\n // @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 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"]}
|
|
@@ -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-TGP3GIZI.js.map
|
|
54
|
+
//# sourceMappingURL=chunk-TGP3GIZI.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-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"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { createMcpServer, setRequestHandler } from './server.mjs';
|
|
2
2
|
export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.mjs';
|
|
3
|
+
export { McpMeta } from './types.mjs';
|
|
3
4
|
import '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
6
|
import '@modelcontextprotocol/sdk/types.js';
|
|
5
7
|
import '@trpc/server/unstable-core-do-not-import';
|
|
6
8
|
import 'zod/v4';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { createMcpServer, setRequestHandler } from './server.js';
|
|
2
2
|
export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.js';
|
|
3
|
+
export { McpMeta } from './types.js';
|
|
3
4
|
import '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
6
|
import '@modelcontextprotocol/sdk/types.js';
|
|
5
7
|
import '@trpc/server/unstable-core-do-not-import';
|
|
6
8
|
import 'zod/v4';
|
package/dist/index.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var chunkNYCGEMYB_js = require('./chunk-NYCGEMYB.js');
|
|
4
|
+
var chunkTGP3GIZI_js = require('./chunk-TGP3GIZI.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 chunkNYCGEMYB_js.createMcpServer; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "setRequestHandler", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkNYCGEMYB_js.setRequestHandler; }
|
|
15
15
|
});
|
|
16
16
|
Object.defineProperty(exports, "extractToolsFromProcedures", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkTGP3GIZI_js.extractToolsFromProcedures; }
|
|
19
19
|
});
|
|
20
20
|
Object.defineProperty(exports, "mergeInputs", {
|
|
21
21
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkTGP3GIZI_js.mergeInputs; }
|
|
23
23
|
});
|
|
24
24
|
//# sourceMappingURL=index.js.map
|
|
25
25
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createMcpServer, setRequestHandler } from './chunk-
|
|
2
|
-
export { extractToolsFromProcedures, mergeInputs } from './chunk-
|
|
1
|
+
export { createMcpServer, setRequestHandler } from './chunk-DYYZPKTV.mjs';
|
|
2
|
+
export { extractToolsFromProcedures, mergeInputs } from './chunk-6LCISFRE.mjs';
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|
|
4
4
|
//# sourceMappingURL=index.mjs.map
|
package/dist/server.d.mts
CHANGED
|
@@ -1,32 +1,12 @@
|
|
|
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';
|
|
6
|
+
import './types.mjs';
|
|
5
7
|
import 'zod/v4';
|
|
6
8
|
|
|
7
9
|
declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
|
|
8
|
-
declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)):
|
|
9
|
-
method: string;
|
|
10
|
-
params?: {
|
|
11
|
-
[x: string]: unknown;
|
|
12
|
-
_meta?: {
|
|
13
|
-
[x: string]: unknown;
|
|
14
|
-
progressToken?: string | number | undefined;
|
|
15
|
-
} | undefined;
|
|
16
|
-
} | undefined;
|
|
17
|
-
}, {
|
|
18
|
-
method: string;
|
|
19
|
-
params?: {
|
|
20
|
-
[x: string]: unknown;
|
|
21
|
-
_meta?: {
|
|
22
|
-
[x: string]: unknown;
|
|
23
|
-
} | undefined;
|
|
24
|
-
} | undefined;
|
|
25
|
-
}, {
|
|
26
|
-
[x: string]: unknown;
|
|
27
|
-
_meta?: {
|
|
28
|
-
[x: string]: unknown;
|
|
29
|
-
} | undefined;
|
|
30
|
-
}>;
|
|
10
|
+
declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): McpServer;
|
|
31
11
|
|
|
32
12
|
export { createMcpServer, setRequestHandler };
|
package/dist/server.d.ts
CHANGED
|
@@ -1,32 +1,12 @@
|
|
|
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';
|
|
6
|
+
import './types.js';
|
|
5
7
|
import 'zod/v4';
|
|
6
8
|
|
|
7
9
|
declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
|
|
8
|
-
declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)):
|
|
9
|
-
method: string;
|
|
10
|
-
params?: {
|
|
11
|
-
[x: string]: unknown;
|
|
12
|
-
_meta?: {
|
|
13
|
-
[x: string]: unknown;
|
|
14
|
-
progressToken?: string | number | undefined;
|
|
15
|
-
} | undefined;
|
|
16
|
-
} | undefined;
|
|
17
|
-
}, {
|
|
18
|
-
method: string;
|
|
19
|
-
params?: {
|
|
20
|
-
[x: string]: unknown;
|
|
21
|
-
_meta?: {
|
|
22
|
-
[x: string]: unknown;
|
|
23
|
-
} | undefined;
|
|
24
|
-
} | undefined;
|
|
25
|
-
}, {
|
|
26
|
-
[x: string]: unknown;
|
|
27
|
-
_meta?: {
|
|
28
|
-
[x: string]: unknown;
|
|
29
|
-
} | undefined;
|
|
30
|
-
}>;
|
|
10
|
+
declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): McpServer;
|
|
31
11
|
|
|
32
12
|
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 chunkNYCGEMYB_js = require('./chunk-NYCGEMYB.js');
|
|
4
|
+
require('./chunk-TGP3GIZI.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 chunkNYCGEMYB_js.createMcpServer; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "setRequestHandler", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkNYCGEMYB_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-DYYZPKTV.mjs';
|
|
2
|
+
import './chunk-6LCISFRE.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 chunkTGP3GIZI_js = require('./chunk-TGP3GIZI.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 chunkTGP3GIZI_js.extractToolsFromProcedures; }
|
|
10
10
|
});
|
|
11
11
|
Object.defineProperty(exports, "mergeInputs", {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
13
|
+
get: function () { return chunkTGP3GIZI_js.mergeInputs; }
|
|
14
14
|
});
|
|
15
15
|
//# sourceMappingURL=tools.js.map
|
|
16
16
|
//# sourceMappingURL=tools.js.map
|
package/dist/tools.mjs
CHANGED
package/package.json
CHANGED
|
@@ -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-5YYUHHJX.mjs","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Implementation,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n AnyProcedure,\n AnyRootTypes,\n DecorateRouterRecord,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nimport { extractToolsFromProcedures, type McpTool } from \"./tools\";\n\nexport function setRequestHandler<TRecord extends RouterRecord>(\n server: Server,\n tools: McpTool[],\n trpcCaller: DecorateRouterRecord<TRecord>,\n) {\n // List all of the available tools\n server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const tool = tools.find((t) => t.name === name);\n\n if (!tool) {\n return { content: [{ type: \"text\", text: \"Could not find tool\" }] };\n }\n\n // @ts-expect-error path in router\n const procedure: AnyProcedure = tool.pathInRouter.reduce(\n // @ts-expect-error path in router\n (acc, part) => acc?.[part],\n trpcCaller,\n );\n\n // @ts-expect-error path in router\n const result = await procedure(args);\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(result) }],\n };\n });\n}\n\nexport function createMcpServer<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n implementation: Implementation,\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n) {\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const server = new Server(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server, tools, trpcCaller);\n\n return server;\n}\n"]}
|
|
@@ -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-H365IMJI.js","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Implementation,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n AnyProcedure,\n AnyRootTypes,\n DecorateRouterRecord,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nimport { extractToolsFromProcedures, type McpTool } from \"./tools\";\n\nexport function setRequestHandler<TRecord extends RouterRecord>(\n server: Server,\n tools: McpTool[],\n trpcCaller: DecorateRouterRecord<TRecord>,\n) {\n // List all of the available tools\n server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const tool = tools.find((t) => t.name === name);\n\n if (!tool) {\n return { content: [{ type: \"text\", text: \"Could not find tool\" }] };\n }\n\n // @ts-expect-error path in router\n const procedure: AnyProcedure = tool.pathInRouter.reduce(\n // @ts-expect-error path in router\n (acc, part) => acc?.[part],\n trpcCaller,\n );\n\n // @ts-expect-error path in router\n const result = await procedure(args);\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(result) }],\n };\n });\n}\n\nexport function createMcpServer<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n implementation: Implementation,\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n) {\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const server = new Server(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server, tools, trpcCaller);\n\n return server;\n}\n"]}
|