trpc-to-mcp 1.3.2 → 2.0.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 +138 -178
- package/dist/adapters/vercel-mcp-adapter.cjs +19 -0
- package/dist/adapters/vercel-mcp-adapter.cjs.map +1 -0
- package/dist/adapters/vercel-mcp-adapter.d.cts +17 -0
- package/dist/adapters/vercel-mcp-adapter.d.mts +16 -13
- package/dist/adapters/vercel-mcp-adapter.mjs +15 -27
- package/dist/adapters/vercel-mcp-adapter.mjs.map +1 -1
- package/dist/helpers.cjs +20 -0
- package/dist/helpers.cjs.map +1 -0
- package/dist/helpers.d.cts +13 -0
- package/dist/helpers.d.mts +13 -6
- package/dist/helpers.mjs +17 -2
- package/dist/helpers.mjs.map +1 -1
- package/dist/index.cjs +9 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.mts +5 -10
- package/dist/index.mjs +5 -6
- package/dist/server.cjs +18 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +12 -0
- package/dist/server.d.mts +12 -12
- package/dist/server.mjs +16 -3
- package/dist/server.mjs.map +1 -1
- package/dist/tools.cjs +121 -0
- package/dist/tools.cjs.map +1 -0
- package/dist/tools.d.cts +23 -0
- package/dist/tools.d.mts +22 -15
- package/dist/tools.mjs +118 -2
- package/dist/tools.mjs.map +1 -1
- package/dist/types.cjs +0 -0
- package/dist/types.d.cts +31 -0
- package/dist/types.d.mts +30 -13
- package/dist/types.mjs +1 -3
- package/package.json +55 -73
- package/dist/adapters/vercel-mcp-adapter.d.ts +0 -14
- package/dist/adapters/vercel-mcp-adapter.js +0 -32
- package/dist/adapters/vercel-mcp-adapter.js.map +0 -1
- package/dist/chunk-55J6XMHW.js +0 -4
- package/dist/chunk-55J6XMHW.js.map +0 -1
- package/dist/chunk-7GYUHEUD.mjs +0 -47
- package/dist/chunk-7GYUHEUD.mjs.map +0 -1
- package/dist/chunk-BTXMEL6M.js +0 -55
- package/dist/chunk-BTXMEL6M.js.map +0 -1
- package/dist/chunk-FIQIIJAT.mjs +0 -11
- package/dist/chunk-FIQIIJAT.mjs.map +0 -1
- package/dist/chunk-FT3KTYAU.js +0 -13
- package/dist/chunk-FT3KTYAU.js.map +0 -1
- package/dist/chunk-KIQOUUEZ.mjs +0 -3
- package/dist/chunk-KIQOUUEZ.mjs.map +0 -1
- package/dist/chunk-RJJMUGXY.js +0 -50
- package/dist/chunk-RJJMUGXY.js.map +0 -1
- package/dist/chunk-ULLXW6IN.mjs +0 -52
- package/dist/chunk-ULLXW6IN.mjs.map +0 -1
- package/dist/helpers.d.ts +0 -6
- package/dist/helpers.js +0 -12
- package/dist/helpers.js.map +0 -1
- package/dist/index.d.ts +0 -10
- package/dist/index.js +0 -31
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/server.d.ts +0 -12
- package/dist/server.js +0 -17
- package/dist/server.js.map +0 -1
- package/dist/tools.d.ts +0 -16
- package/dist/tools.js +0 -16
- package/dist/tools.js.map +0 -1
- package/dist/types.d.ts +0 -14
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/types.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trpc-to-mcp",
|
|
3
3
|
"license": "MIT",
|
|
4
|
-
"version": "
|
|
5
|
-
"
|
|
4
|
+
"version": "2.0.0",
|
|
5
|
+
"description": "Turn tRPC procedures into MCP tools",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
6
7
|
"module": "./dist/index.mjs",
|
|
7
|
-
"types": "./dist/index.d.
|
|
8
|
-
"
|
|
8
|
+
"types": "./dist/index.d.cts",
|
|
9
|
+
"sideEffects": false,
|
|
9
10
|
"keywords": [
|
|
10
11
|
"trpc",
|
|
11
12
|
"mcp",
|
|
12
13
|
"modelcontextprotocol",
|
|
13
|
-
"
|
|
14
|
+
"mcp-handler"
|
|
14
15
|
],
|
|
15
16
|
"files": [
|
|
16
17
|
"dist"
|
|
@@ -21,87 +22,68 @@
|
|
|
21
22
|
},
|
|
22
23
|
"exports": {
|
|
23
24
|
".": {
|
|
24
|
-
"import":
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
"import": "./dist/index.mjs",
|
|
26
|
+
"require": "./dist/index.cjs"
|
|
27
|
+
},
|
|
28
|
+
"./adapters/vercel-mcp-adapter": {
|
|
29
|
+
"import": "./dist/adapters/vercel-mcp-adapter.mjs",
|
|
30
|
+
"require": "./dist/adapters/vercel-mcp-adapter.cjs"
|
|
31
|
+
},
|
|
32
|
+
"./helpers": {
|
|
33
|
+
"import": "./dist/helpers.mjs",
|
|
34
|
+
"require": "./dist/helpers.cjs"
|
|
32
35
|
},
|
|
33
36
|
"./server": {
|
|
34
|
-
"import":
|
|
35
|
-
|
|
36
|
-
"default": "./dist/server.mjs"
|
|
37
|
-
},
|
|
38
|
-
"require": {
|
|
39
|
-
"types": "./dist/server.d.ts",
|
|
40
|
-
"default": "./dist/server.js"
|
|
41
|
-
}
|
|
37
|
+
"import": "./dist/server.mjs",
|
|
38
|
+
"require": "./dist/server.cjs"
|
|
42
39
|
},
|
|
43
40
|
"./tools": {
|
|
44
|
-
"import":
|
|
45
|
-
|
|
46
|
-
"default": "./dist/tools.mjs"
|
|
47
|
-
},
|
|
48
|
-
"require": {
|
|
49
|
-
"types": "./dist/tools.d.ts",
|
|
50
|
-
"default": "./dist/tools.js"
|
|
51
|
-
}
|
|
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
|
-
}
|
|
41
|
+
"import": "./dist/tools.mjs",
|
|
42
|
+
"require": "./dist/tools.cjs"
|
|
62
43
|
},
|
|
63
44
|
"./types": {
|
|
64
|
-
"import":
|
|
65
|
-
|
|
66
|
-
"default": "./dist/types.mjs"
|
|
67
|
-
},
|
|
68
|
-
"require": {
|
|
69
|
-
"types": "./dist/types.d.ts",
|
|
70
|
-
"default": "./dist/types.js"
|
|
71
|
-
}
|
|
45
|
+
"import": "./dist/types.mjs",
|
|
46
|
+
"require": "./dist/types.cjs"
|
|
72
47
|
},
|
|
73
|
-
"./
|
|
74
|
-
"import": {
|
|
75
|
-
"types": "./dist/adapters/vercel-mcp-adapter.d.ts",
|
|
76
|
-
"default": "./dist/adapters/vercel-mcp-adapter.mjs"
|
|
77
|
-
},
|
|
78
|
-
"require": {
|
|
79
|
-
"types": "./dist/adapters/vercel-mcp-adapter.d.ts",
|
|
80
|
-
"default": "./dist/adapters/vercel-mcp-adapter.js"
|
|
81
|
-
}
|
|
82
|
-
}
|
|
48
|
+
"./package.json": "./package.json"
|
|
83
49
|
},
|
|
84
50
|
"devDependencies": {
|
|
85
|
-
"@changesets/cli": "^
|
|
86
|
-
"@
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
51
|
+
"@changesets/cli": "^3.0.3",
|
|
52
|
+
"@modelcontextprotocol/client": "^2.1.0",
|
|
53
|
+
"@modelcontextprotocol/server": "^2.1.0",
|
|
54
|
+
"@trpc/server": "^11.19.0",
|
|
55
|
+
"@types/node": "^24.13.6",
|
|
56
|
+
"mcp-handler": "^2.2.0",
|
|
57
|
+
"oxfmt": "^0.70.0",
|
|
58
|
+
"oxlint": "^1.85.0",
|
|
59
|
+
"oxlint-tsgolint": "^7.0.2002",
|
|
60
|
+
"tsdown": "^0.23.0",
|
|
61
|
+
"typescript": "^6.0.3",
|
|
62
|
+
"vitest": "^5.0.1",
|
|
63
|
+
"zod": "^4.6.5"
|
|
90
64
|
},
|
|
91
65
|
"peerDependencies": {
|
|
92
|
-
"@
|
|
93
|
-
"
|
|
94
|
-
"mcp-handler": "^
|
|
95
|
-
|
|
66
|
+
"@modelcontextprotocol/server": "^2.0.0",
|
|
67
|
+
"@trpc/server": "^11.0.0",
|
|
68
|
+
"mcp-handler": "^2.0.0"
|
|
69
|
+
},
|
|
70
|
+
"peerDependenciesMeta": {
|
|
71
|
+
"mcp-handler": {
|
|
72
|
+
"optional": true
|
|
73
|
+
}
|
|
96
74
|
},
|
|
97
|
-
"
|
|
98
|
-
"
|
|
75
|
+
"engines": {
|
|
76
|
+
"node": ">=20"
|
|
99
77
|
},
|
|
100
78
|
"scripts": {
|
|
101
|
-
"build": "
|
|
102
|
-
"dev": "
|
|
103
|
-
"
|
|
104
|
-
"
|
|
105
|
-
"lint": "
|
|
79
|
+
"build": "tsdown",
|
|
80
|
+
"dev": "tsdown --watch",
|
|
81
|
+
"test": "vitest run",
|
|
82
|
+
"lint": "oxlint",
|
|
83
|
+
"lint:fix": "oxlint --fix",
|
|
84
|
+
"typecheck": "tsc",
|
|
85
|
+
"format": "oxfmt",
|
|
86
|
+
"format:check": "oxfmt --check",
|
|
87
|
+
"release": "pnpm run build && changeset publish"
|
|
106
88
|
}
|
|
107
89
|
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp';
|
|
2
|
-
import { AnyRootTypes, RouterRecord, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
|
|
3
|
-
import { createMcpHandler } from 'mcp-handler';
|
|
4
|
-
|
|
5
|
-
type VercelMcpHandler = ReturnType<typeof createMcpHandler>;
|
|
6
|
-
type McpServerOptions = Parameters<typeof createMcpHandler>[1];
|
|
7
|
-
type McpHandlerConfig = Parameters<typeof createMcpHandler>[2];
|
|
8
|
-
declare function trpcToMcpHandler<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>), handlerOptions: {
|
|
9
|
-
config: McpHandlerConfig;
|
|
10
|
-
serverOptions?: McpServerOptions;
|
|
11
|
-
callback?: (server: McpServer) => unknown;
|
|
12
|
-
}): (request: Request) => Promise<Response>;
|
|
13
|
-
|
|
14
|
-
export { type McpHandlerConfig, type McpServerOptions, type VercelMcpHandler, trpcToMcpHandler };
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkRJJMUGXY_js = require('../chunk-RJJMUGXY.js');
|
|
4
|
-
var chunkBTXMEL6M_js = require('../chunk-BTXMEL6M.js');
|
|
5
|
-
var mcpHandler = require('mcp-handler');
|
|
6
|
-
|
|
7
|
-
function trpcToMcpHandler(appRouter, ctx, handlerOptions) {
|
|
8
|
-
const { serverOptions, config, callback } = handlerOptions;
|
|
9
|
-
const tools = chunkBTXMEL6M_js.extractToolsFromProcedures(appRouter);
|
|
10
|
-
const trpcCaller = appRouter.createCaller(ctx);
|
|
11
|
-
const handler = mcpHandler.createMcpHandler(
|
|
12
|
-
(server) => {
|
|
13
|
-
chunkRJJMUGXY_js.setRequestHandler(server.server, tools, trpcCaller);
|
|
14
|
-
if (typeof callback === "function") {
|
|
15
|
-
callback(server);
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
// Leave it empty because we list tools manually
|
|
20
|
-
capabilities: {
|
|
21
|
-
tools: {}
|
|
22
|
-
},
|
|
23
|
-
...serverOptions
|
|
24
|
-
},
|
|
25
|
-
config
|
|
26
|
-
);
|
|
27
|
-
return handler;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
exports.trpcToMcpHandler = trpcToMcpHandler;
|
|
31
|
-
//# sourceMappingURL=vercel-mcp-adapter.js.map
|
|
32
|
-
//# sourceMappingURL=vercel-mcp-adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/dist/chunk-55J6XMHW.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-55J6XMHW.js"}
|
package/dist/chunk-7GYUHEUD.mjs
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { extractToolsFromProcedures } from './chunk-ULLXW6IN.mjs';
|
|
2
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
-
import { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
-
|
|
5
|
-
function setRequestHandler(server, tools, trpcCaller) {
|
|
6
|
-
server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));
|
|
7
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
8
|
-
const { name, arguments: args } = request.params;
|
|
9
|
-
const tool = tools.find((t) => t.name === name);
|
|
10
|
-
if (!tool) {
|
|
11
|
-
return { content: [{ type: "text", text: "Could not find tool" }] };
|
|
12
|
-
}
|
|
13
|
-
const procedure = tool.pathInRouter.reduce(
|
|
14
|
-
// @ts-expect-error path in router
|
|
15
|
-
(acc, part) => acc?.[part],
|
|
16
|
-
trpcCaller
|
|
17
|
-
);
|
|
18
|
-
if (typeof tool.transformMcpProcedure === "function") {
|
|
19
|
-
const output = await procedure(args);
|
|
20
|
-
const result = await tool.transformMcpProcedure(output);
|
|
21
|
-
return {
|
|
22
|
-
content: result
|
|
23
|
-
};
|
|
24
|
-
} else {
|
|
25
|
-
const result = await procedure(args);
|
|
26
|
-
return {
|
|
27
|
-
content: [{ type: "text", text: JSON.stringify(result) }]
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
function createMcpServer(implementation, appRouter, ctx) {
|
|
33
|
-
const tools = extractToolsFromProcedures(appRouter);
|
|
34
|
-
const trpcCaller = appRouter.createCaller(ctx);
|
|
35
|
-
const server = new McpServer(implementation, {
|
|
36
|
-
capabilities: {
|
|
37
|
-
// Leave it empty because we list tools manually
|
|
38
|
-
tools: {}
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
setRequestHandler(server.server, tools, trpcCaller);
|
|
42
|
-
return server;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export { createMcpServer, setRequestHandler };
|
|
46
|
-
//# sourceMappingURL=chunk-7GYUHEUD.mjs.map
|
|
47
|
-
//# sourceMappingURL=chunk-7GYUHEUD.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts"],"names":[],"mappings":";;;;AAkBO,SAAS,iBAAA,CACd,MAAA,EACA,KAAA,EACA,UAAA,EACA;AAEA,EAAA,MAAA,CAAO,iBAAA,CAAkB,sBAAA,EAAwB,OAAO,EAAE,OAAM,CAAE,CAAA;AAGlE,EAAA,MAAA,CAAO,iBAAA,CAAkB,qBAAA,EAAuB,OAAO,OAAA,KAAY;AACjE,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,KAAS,OAAA,CAAQ,MAAA;AAE1C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAE9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,qBAAA,EAAuB,CAAA,EAAE;AAAA,IACpE;AAGA,IAAA,MAAM,SAAA,GAA0B,KAAK,YAAA,CAAa,MAAA;AAAA;AAAA,MAEhD,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAI,CAAA;AAAA,MACzB;AAAA,KACF;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,UAAA,EAAY;AAEpD,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA;AAEtD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAEnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAAA,OAC1D;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,eAAA,CAId,cAAA,EACA,SAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQ,2BAA2B,SAAS,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,YAAA,CAAa,GAAG,CAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,cAAA,EAAgB;AAAA,IAC3C,YAAA,EAAc;AAAA;AAAA,MAEZ,OAAO;AAAC;AACV,GACD,CAAA;AAED,EAAA,iBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAElD,EAAA,OAAO,MAAA;AACT","file":"chunk-7GYUHEUD.mjs","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Implementation,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n AnyProcedure,\n AnyRootTypes,\n DecorateRouterRecord,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nimport { extractToolsFromProcedures, type McpTool } from \"./tools\";\n\nexport function setRequestHandler<TRecord extends RouterRecord>(\n server: Server,\n tools: McpTool[],\n trpcCaller: DecorateRouterRecord<TRecord>,\n) {\n // List all of the available tools\n server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const tool = tools.find((t) => t.name === name);\n\n if (!tool) {\n return { content: [{ type: \"text\", text: \"Could not find tool\" }] };\n }\n\n // @ts-expect-error path in router\n const procedure: AnyProcedure = tool.pathInRouter.reduce(\n // @ts-expect-error path in router\n (acc, part) => acc?.[part],\n trpcCaller,\n );\n\n if (typeof tool.transformMcpProcedure === \"function\") {\n // @ts-expect-error path in router\n const output = await procedure(args);\n const result = await tool.transformMcpProcedure(output);\n\n return {\n content: result,\n };\n } else {\n // @ts-expect-error path in router\n const result = await procedure(args);\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(result) }],\n };\n }\n });\n}\n\nexport function createMcpServer<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n implementation: Implementation,\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n) {\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const server = new McpServer(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server.server, tools, trpcCaller);\n\n return server;\n}\n"]}
|
package/dist/chunk-BTXMEL6M.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var v4 = require('zod/v4');
|
|
4
|
-
|
|
5
|
-
// src/tools.ts
|
|
6
|
-
function mergeInputs(inputs) {
|
|
7
|
-
return inputs.reduce((acc, input) => {
|
|
8
|
-
return acc.extend(input.shape);
|
|
9
|
-
}, v4.z.object());
|
|
10
|
-
}
|
|
11
|
-
function extractToolsFromProcedures(appRouter, currentPath = []) {
|
|
12
|
-
const tools = [];
|
|
13
|
-
const procedures = Object.entries(appRouter._def.procedures);
|
|
14
|
-
for (const [name, procedure] of procedures) {
|
|
15
|
-
if (procedure._def && "inputs" in procedure._def) {
|
|
16
|
-
const inputs = procedure._def.inputs;
|
|
17
|
-
const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];
|
|
18
|
-
const meta = procedure._def.meta;
|
|
19
|
-
if (!meta || !meta?.mcp?.enabled) {
|
|
20
|
-
continue;
|
|
21
|
-
}
|
|
22
|
-
const pathInRouter = [...currentPath, ...name.split(".")];
|
|
23
|
-
const tool = {
|
|
24
|
-
name: meta?.mcp?.name ?? name.replace(/\./g, "_"),
|
|
25
|
-
description: meta?.mcp?.description ?? "",
|
|
26
|
-
pathInRouter,
|
|
27
|
-
transformMcpProcedure: meta?.mcp?.transformMcpProcedure
|
|
28
|
-
};
|
|
29
|
-
if (schema) {
|
|
30
|
-
const jsonSchema = v4.z.toJSONSchema(schema, {
|
|
31
|
-
unrepresentable: "any"
|
|
32
|
-
});
|
|
33
|
-
if (jsonSchema.type === "object") {
|
|
34
|
-
const { type, properties = {}, required = [] } = jsonSchema;
|
|
35
|
-
tool.inputSchema = { type, properties, required };
|
|
36
|
-
} else {
|
|
37
|
-
console.error(
|
|
38
|
-
"[TRPC-TO-MCP] Procedure has no object schema",
|
|
39
|
-
pathInRouter
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
} else {
|
|
43
|
-
const jsonSchema = v4.z.toJSONSchema(v4.z.object());
|
|
44
|
-
tool.inputSchema = jsonSchema;
|
|
45
|
-
}
|
|
46
|
-
tools.push(tool);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return tools;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
exports.extractToolsFromProcedures = extractToolsFromProcedures;
|
|
53
|
-
exports.mergeInputs = mergeInputs;
|
|
54
|
-
//# sourceMappingURL=chunk-BTXMEL6M.js.map
|
|
55
|
-
//# sourceMappingURL=chunk-BTXMEL6M.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools.ts"],"names":["z"],"mappings":";;;;;AAmBO,SAAS,YAAY,MAAA,EAAuB;AACjD,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU;AACnC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,EAC/B,CAAA,EAAGA,IAAA,CAAE,MAAA,EAAQ,CAAA;AACf;AAEO,SAAS,0BAAA,CAGd,SAAA,EAAmC,WAAA,GAAwB,EAAC,EAAG;AAC/D,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,UAAU,CAAA;AAE3D,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,UAAA,EAAY;AAC1C,IAAA,IAAI,SAAA,CAAU,IAAA,IAAQ,QAAA,IAAY,SAAA,CAAU,IAAA,EAAM;AAChD,MAAA,MAAM,MAAA,GAAS,UAAU,IAAA,CAAK,MAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,CAAA,GAAI,YAAY,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAEjE,MAAA,MAAM,IAAA,GAAO,UAAU,IAAA,CAAK,IAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,KAAK,OAAA,EAAS;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,CAAC,GAAG,WAAA,EAAa,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AACxD,MAAA,MAAM,IAAA,GAAgB;AAAA,QACpB,MAAM,IAAA,EAAM,GAAA,EAAK,QAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,QAChD,WAAA,EAAa,IAAA,EAAM,GAAA,EAAK,WAAA,IAAe,EAAA;AAAA,QACvC,YAAA;AAAA,QACA,qBAAA,EAAuB,MAAM,GAAA,EAAK;AAAA,OACpC;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,UAAA,GAAaA,IAAA,CAAE,YAAA,CAAa,MAAA,EAAQ;AAAA,UACxC,eAAA,EAAiB;AAAA,SAClB,CAAA;AAED,QAAA,IAAI,UAAA,CAAW,SAAS,QAAA,EAAU;AAChC,UAAA,MAAM,EAAE,MAAM,UAAA,GAAa,IAAI,QAAA,GAAW,IAAG,GAAI,UAAA;AACjD,UAAA,IAAA,CAAK,WAAA,GAAc,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAS;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,8CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,UAAA,GAAaA,IAAA,CAAE,YAAA,CAAaA,IAAA,CAAE,QAAQ,CAAA;AAC5C,QAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AAAA,MACrB;AAEA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT","file":"chunk-BTXMEL6M.js","sourcesContent":["// Credits to https://github.com/Jacse/trpc-mcp for the helpful code\n\nimport type {\n AnyRootTypes,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\nimport { z } from \"zod/v4\";\n\nimport type { McpMeta, TransformMcpProcedureFunction } from \"./types\";\n\nexport type McpTool = {\n name: string;\n description: string;\n pathInRouter: string[];\n inputSchema?: z.core.JSONSchema.JSONSchema;\n transformMcpProcedure?: TransformMcpProcedureFunction;\n};\n\nexport function mergeInputs(inputs: z.ZodObject[]) {\n return inputs.reduce((acc, input) => {\n return acc.extend(input.shape);\n }, z.object());\n}\n\nexport function extractToolsFromProcedures<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(appRouter: Router<TRoot, TRecord>, currentPath: string[] = []) {\n const tools: McpTool[] = [];\n const procedures = Object.entries(appRouter._def.procedures);\n\n for (const [name, procedure] of procedures) {\n if (procedure._def && \"inputs\" in procedure._def) {\n const inputs = procedure._def.inputs as z.ZodObject[];\n const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];\n\n const meta = procedure._def.meta as McpMeta;\n if (!meta || !meta?.mcp?.enabled) {\n continue;\n }\n\n const pathInRouter = [...currentPath, ...name.split(\".\")];\n const tool: McpTool = {\n name: meta?.mcp?.name ?? name.replace(/\\./g, \"_\"),\n description: meta?.mcp?.description ?? \"\",\n pathInRouter,\n transformMcpProcedure: meta?.mcp?.transformMcpProcedure,\n };\n\n if (schema) {\n const jsonSchema = z.toJSONSchema(schema, {\n unrepresentable: \"any\",\n });\n\n if (jsonSchema.type === \"object\") {\n const { type, properties = {}, required = [] } = jsonSchema;\n tool.inputSchema = { type, properties, required };\n } else {\n console.error(\n \"[TRPC-TO-MCP] Procedure has no object schema\",\n pathInRouter,\n );\n }\n } else {\n // If there is not schema, we have to pass an empty object for JSON schema compatibility\n const jsonSchema = z.toJSONSchema(z.object());\n tool.inputSchema = jsonSchema;\n }\n\n tools.push(tool);\n }\n }\n\n return tools;\n}\n"]}
|
package/dist/chunk-FIQIIJAT.mjs
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// src/helpers.ts
|
|
2
|
-
function transformMcpProcedure(procedure, callback) {
|
|
3
|
-
if (procedure.meta?.mcp?.enabled) {
|
|
4
|
-
procedure.meta.mcp.transformMcpProcedure = callback;
|
|
5
|
-
}
|
|
6
|
-
return procedure;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export { transformMcpProcedure };
|
|
10
|
-
//# sourceMappingURL=chunk-FIQIIJAT.mjs.map
|
|
11
|
-
//# sourceMappingURL=chunk-FIQIIJAT.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers.ts"],"names":[],"mappings":";AAOO,SAAS,qBAAA,CACd,WACA,QAAA,EAGA;AACA,EAAA,IAAI,SAAA,CAAU,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS;AAChC,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,qBAAA,GAAwB,QAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,SAAA;AACT","file":"chunk-FIQIIJAT.mjs","sourcesContent":["import { ContentBlock } from \"@modelcontextprotocol/sdk/types\";\nimport type {\n AnyProcedure,\n MaybePromise,\n inferProcedureOutput,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nexport function transformMcpProcedure<TProcedure extends AnyProcedure>(\n procedure: TProcedure,\n callback: (\n output: inferProcedureOutput<TProcedure>,\n ) => MaybePromise<ContentBlock[]>,\n) {\n if (procedure.meta?.mcp?.enabled) {\n procedure.meta.mcp.transformMcpProcedure = callback;\n }\n\n return procedure;\n}\n"]}
|
package/dist/chunk-FT3KTYAU.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// src/helpers.ts
|
|
4
|
-
function transformMcpProcedure(procedure, callback) {
|
|
5
|
-
if (procedure.meta?.mcp?.enabled) {
|
|
6
|
-
procedure.meta.mcp.transformMcpProcedure = callback;
|
|
7
|
-
}
|
|
8
|
-
return procedure;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
exports.transformMcpProcedure = transformMcpProcedure;
|
|
12
|
-
//# sourceMappingURL=chunk-FT3KTYAU.js.map
|
|
13
|
-
//# sourceMappingURL=chunk-FT3KTYAU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers.ts"],"names":[],"mappings":";;;AAOO,SAAS,qBAAA,CACd,WACA,QAAA,EAGA;AACA,EAAA,IAAI,SAAA,CAAU,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS;AAChC,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,qBAAA,GAAwB,QAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,SAAA;AACT","file":"chunk-FT3KTYAU.js","sourcesContent":["import { ContentBlock } from \"@modelcontextprotocol/sdk/types\";\nimport type {\n AnyProcedure,\n MaybePromise,\n inferProcedureOutput,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nexport function transformMcpProcedure<TProcedure extends AnyProcedure>(\n procedure: TProcedure,\n callback: (\n output: inferProcedureOutput<TProcedure>,\n ) => MaybePromise<ContentBlock[]>,\n) {\n if (procedure.meta?.mcp?.enabled) {\n procedure.meta.mcp.transformMcpProcedure = callback;\n }\n\n return procedure;\n}\n"]}
|
package/dist/chunk-KIQOUUEZ.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-KIQOUUEZ.mjs"}
|
package/dist/chunk-RJJMUGXY.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkBTXMEL6M_js = require('./chunk-BTXMEL6M.js');
|
|
4
|
-
var mcp_js = require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
5
|
-
var types_js = require('@modelcontextprotocol/sdk/types.js');
|
|
6
|
-
|
|
7
|
-
function setRequestHandler(server, tools, trpcCaller) {
|
|
8
|
-
server.setRequestHandler(types_js.ListToolsRequestSchema, () => ({ tools }));
|
|
9
|
-
server.setRequestHandler(types_js.CallToolRequestSchema, async (request) => {
|
|
10
|
-
const { name, arguments: args } = request.params;
|
|
11
|
-
const tool = tools.find((t) => t.name === name);
|
|
12
|
-
if (!tool) {
|
|
13
|
-
return { content: [{ type: "text", text: "Could not find tool" }] };
|
|
14
|
-
}
|
|
15
|
-
const procedure = tool.pathInRouter.reduce(
|
|
16
|
-
// @ts-expect-error path in router
|
|
17
|
-
(acc, part) => acc?.[part],
|
|
18
|
-
trpcCaller
|
|
19
|
-
);
|
|
20
|
-
if (typeof tool.transformMcpProcedure === "function") {
|
|
21
|
-
const output = await procedure(args);
|
|
22
|
-
const result = await tool.transformMcpProcedure(output);
|
|
23
|
-
return {
|
|
24
|
-
content: result
|
|
25
|
-
};
|
|
26
|
-
} else {
|
|
27
|
-
const result = await procedure(args);
|
|
28
|
-
return {
|
|
29
|
-
content: [{ type: "text", text: JSON.stringify(result) }]
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
function createMcpServer(implementation, appRouter, ctx) {
|
|
35
|
-
const tools = chunkBTXMEL6M_js.extractToolsFromProcedures(appRouter);
|
|
36
|
-
const trpcCaller = appRouter.createCaller(ctx);
|
|
37
|
-
const server = new mcp_js.McpServer(implementation, {
|
|
38
|
-
capabilities: {
|
|
39
|
-
// Leave it empty because we list tools manually
|
|
40
|
-
tools: {}
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
setRequestHandler(server.server, tools, trpcCaller);
|
|
44
|
-
return server;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
exports.createMcpServer = createMcpServer;
|
|
48
|
-
exports.setRequestHandler = setRequestHandler;
|
|
49
|
-
//# sourceMappingURL=chunk-RJJMUGXY.js.map
|
|
50
|
-
//# sourceMappingURL=chunk-RJJMUGXY.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts"],"names":["ListToolsRequestSchema","CallToolRequestSchema","extractToolsFromProcedures","McpServer"],"mappings":";;;;;;AAkBO,SAAS,iBAAA,CACd,MAAA,EACA,KAAA,EACA,UAAA,EACA;AAEA,EAAA,MAAA,CAAO,iBAAA,CAAkBA,+BAAA,EAAwB,OAAO,EAAE,OAAM,CAAE,CAAA;AAGlE,EAAA,MAAA,CAAO,iBAAA,CAAkBC,8BAAA,EAAuB,OAAO,OAAA,KAAY;AACjE,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,KAAS,OAAA,CAAQ,MAAA;AAE1C,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAE9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,qBAAA,EAAuB,CAAA,EAAE;AAAA,IACpE;AAGA,IAAA,MAAM,SAAA,GAA0B,KAAK,YAAA,CAAa,MAAA;AAAA;AAAA,MAEhD,CAAC,GAAA,EAAK,IAAA,KAAS,GAAA,GAAM,IAAI,CAAA;AAAA,MACzB;AAAA,KACF;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,qBAAA,KAA0B,UAAA,EAAY;AAEpD,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA;AAEtD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAEnC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG;AAAA,OAC1D;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,eAAA,CAId,cAAA,EACA,SAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,KAAA,GAAQC,4CAA2B,SAAS,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,YAAA,CAAa,GAAG,CAAA;AAE7C,EAAA,MAAM,MAAA,GAAS,IAAIC,gBAAA,CAAU,cAAA,EAAgB;AAAA,IAC3C,YAAA,EAAc;AAAA;AAAA,MAEZ,OAAO;AAAC;AACV,GACD,CAAA;AAED,EAAA,iBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAElD,EAAA,OAAO,MAAA;AACT","file":"chunk-RJJMUGXY.js","sourcesContent":["import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Implementation,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n AnyProcedure,\n AnyRootTypes,\n DecorateRouterRecord,\n MaybePromise,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\n\nimport { extractToolsFromProcedures, type McpTool } from \"./tools\";\n\nexport function setRequestHandler<TRecord extends RouterRecord>(\n server: Server,\n tools: McpTool[],\n trpcCaller: DecorateRouterRecord<TRecord>,\n) {\n // List all of the available tools\n server.setRequestHandler(ListToolsRequestSchema, () => ({ tools }));\n\n // Handle tool calls\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const tool = tools.find((t) => t.name === name);\n\n if (!tool) {\n return { content: [{ type: \"text\", text: \"Could not find tool\" }] };\n }\n\n // @ts-expect-error path in router\n const procedure: AnyProcedure = tool.pathInRouter.reduce(\n // @ts-expect-error path in router\n (acc, part) => acc?.[part],\n trpcCaller,\n );\n\n if (typeof tool.transformMcpProcedure === \"function\") {\n // @ts-expect-error path in router\n const output = await procedure(args);\n const result = await tool.transformMcpProcedure(output);\n\n return {\n content: result,\n };\n } else {\n // @ts-expect-error path in router\n const result = await procedure(args);\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(result) }],\n };\n }\n });\n}\n\nexport function createMcpServer<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(\n implementation: Implementation,\n appRouter: Router<TRoot, TRecord>,\n ctx: TRoot[\"ctx\"] | (() => MaybePromise<TRoot[\"ctx\"]>),\n) {\n const tools = extractToolsFromProcedures(appRouter);\n const trpcCaller = appRouter.createCaller(ctx);\n\n const server = new McpServer(implementation, {\n capabilities: {\n // Leave it empty because we list tools manually\n tools: {},\n },\n });\n\n setRequestHandler(server.server, tools, trpcCaller);\n\n return server;\n}\n"]}
|
package/dist/chunk-ULLXW6IN.mjs
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod/v4';
|
|
2
|
-
|
|
3
|
-
// src/tools.ts
|
|
4
|
-
function mergeInputs(inputs) {
|
|
5
|
-
return inputs.reduce((acc, input) => {
|
|
6
|
-
return acc.extend(input.shape);
|
|
7
|
-
}, z.object());
|
|
8
|
-
}
|
|
9
|
-
function extractToolsFromProcedures(appRouter, currentPath = []) {
|
|
10
|
-
const tools = [];
|
|
11
|
-
const procedures = Object.entries(appRouter._def.procedures);
|
|
12
|
-
for (const [name, procedure] of procedures) {
|
|
13
|
-
if (procedure._def && "inputs" in procedure._def) {
|
|
14
|
-
const inputs = procedure._def.inputs;
|
|
15
|
-
const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];
|
|
16
|
-
const meta = procedure._def.meta;
|
|
17
|
-
if (!meta || !meta?.mcp?.enabled) {
|
|
18
|
-
continue;
|
|
19
|
-
}
|
|
20
|
-
const pathInRouter = [...currentPath, ...name.split(".")];
|
|
21
|
-
const tool = {
|
|
22
|
-
name: meta?.mcp?.name ?? name.replace(/\./g, "_"),
|
|
23
|
-
description: meta?.mcp?.description ?? "",
|
|
24
|
-
pathInRouter,
|
|
25
|
-
transformMcpProcedure: meta?.mcp?.transformMcpProcedure
|
|
26
|
-
};
|
|
27
|
-
if (schema) {
|
|
28
|
-
const jsonSchema = z.toJSONSchema(schema, {
|
|
29
|
-
unrepresentable: "any"
|
|
30
|
-
});
|
|
31
|
-
if (jsonSchema.type === "object") {
|
|
32
|
-
const { type, properties = {}, required = [] } = jsonSchema;
|
|
33
|
-
tool.inputSchema = { type, properties, required };
|
|
34
|
-
} else {
|
|
35
|
-
console.error(
|
|
36
|
-
"[TRPC-TO-MCP] Procedure has no object schema",
|
|
37
|
-
pathInRouter
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
} else {
|
|
41
|
-
const jsonSchema = z.toJSONSchema(z.object());
|
|
42
|
-
tool.inputSchema = jsonSchema;
|
|
43
|
-
}
|
|
44
|
-
tools.push(tool);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return tools;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export { extractToolsFromProcedures, mergeInputs };
|
|
51
|
-
//# sourceMappingURL=chunk-ULLXW6IN.mjs.map
|
|
52
|
-
//# sourceMappingURL=chunk-ULLXW6IN.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools.ts"],"names":[],"mappings":";;;AAmBO,SAAS,YAAY,MAAA,EAAuB;AACjD,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,KAAU;AACnC,IAAA,OAAO,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAA,CAAE,MAAA,EAAQ,CAAA;AACf;AAEO,SAAS,0BAAA,CAGd,SAAA,EAAmC,WAAA,GAAwB,EAAC,EAAG;AAC/D,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,UAAU,CAAA;AAE3D,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,UAAA,EAAY;AAC1C,IAAA,IAAI,SAAA,CAAU,IAAA,IAAQ,QAAA,IAAY,SAAA,CAAU,IAAA,EAAM;AAChD,MAAA,MAAM,MAAA,GAAS,UAAU,IAAA,CAAK,MAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,CAAA,GAAI,YAAY,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAEjE,MAAA,MAAM,IAAA,GAAO,UAAU,IAAA,CAAK,IAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM,KAAK,OAAA,EAAS;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,CAAC,GAAG,WAAA,EAAa,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AACxD,MAAA,MAAM,IAAA,GAAgB;AAAA,QACpB,MAAM,IAAA,EAAM,GAAA,EAAK,QAAQ,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,QAChD,WAAA,EAAa,IAAA,EAAM,GAAA,EAAK,WAAA,IAAe,EAAA;AAAA,QACvC,YAAA;AAAA,QACA,qBAAA,EAAuB,MAAM,GAAA,EAAK;AAAA,OACpC;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,YAAA,CAAa,MAAA,EAAQ;AAAA,UACxC,eAAA,EAAiB;AAAA,SAClB,CAAA;AAED,QAAA,IAAI,UAAA,CAAW,SAAS,QAAA,EAAU;AAChC,UAAA,MAAM,EAAE,MAAM,UAAA,GAAa,IAAI,QAAA,GAAW,IAAG,GAAI,UAAA;AACjD,UAAA,IAAA,CAAK,WAAA,GAAc,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAS;AAAA,QAClD,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAA;AAAA,YACN,8CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,YAAA,CAAa,CAAA,CAAE,QAAQ,CAAA;AAC5C,QAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AAAA,MACrB;AAEA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT","file":"chunk-ULLXW6IN.mjs","sourcesContent":["// Credits to https://github.com/Jacse/trpc-mcp for the helpful code\n\nimport type {\n AnyRootTypes,\n Router,\n RouterRecord,\n} from \"@trpc/server/unstable-core-do-not-import\";\nimport { z } from \"zod/v4\";\n\nimport type { McpMeta, TransformMcpProcedureFunction } from \"./types\";\n\nexport type McpTool = {\n name: string;\n description: string;\n pathInRouter: string[];\n inputSchema?: z.core.JSONSchema.JSONSchema;\n transformMcpProcedure?: TransformMcpProcedureFunction;\n};\n\nexport function mergeInputs(inputs: z.ZodObject[]) {\n return inputs.reduce((acc, input) => {\n return acc.extend(input.shape);\n }, z.object());\n}\n\nexport function extractToolsFromProcedures<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n>(appRouter: Router<TRoot, TRecord>, currentPath: string[] = []) {\n const tools: McpTool[] = [];\n const procedures = Object.entries(appRouter._def.procedures);\n\n for (const [name, procedure] of procedures) {\n if (procedure._def && \"inputs\" in procedure._def) {\n const inputs = procedure._def.inputs as z.ZodObject[];\n const schema = inputs.length > 1 ? mergeInputs(inputs) : inputs[0];\n\n const meta = procedure._def.meta as McpMeta;\n if (!meta || !meta?.mcp?.enabled) {\n continue;\n }\n\n const pathInRouter = [...currentPath, ...name.split(\".\")];\n const tool: McpTool = {\n name: meta?.mcp?.name ?? name.replace(/\\./g, \"_\"),\n description: meta?.mcp?.description ?? \"\",\n pathInRouter,\n transformMcpProcedure: meta?.mcp?.transformMcpProcedure,\n };\n\n if (schema) {\n const jsonSchema = z.toJSONSchema(schema, {\n unrepresentable: \"any\",\n });\n\n if (jsonSchema.type === \"object\") {\n const { type, properties = {}, required = [] } = jsonSchema;\n tool.inputSchema = { type, properties, required };\n } else {\n console.error(\n \"[TRPC-TO-MCP] Procedure has no object schema\",\n pathInRouter,\n );\n }\n } else {\n // If there is not schema, we have to pass an empty object for JSON schema compatibility\n const jsonSchema = z.toJSONSchema(z.object());\n tool.inputSchema = jsonSchema;\n }\n\n tools.push(tool);\n }\n }\n\n return tools;\n}\n"]}
|
package/dist/helpers.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkFT3KTYAU_js = require('./chunk-FT3KTYAU.js');
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "transformMcpProcedure", {
|
|
8
|
-
enumerable: true,
|
|
9
|
-
get: function () { return chunkFT3KTYAU_js.transformMcpProcedure; }
|
|
10
|
-
});
|
|
11
|
-
//# sourceMappingURL=helpers.js.map
|
|
12
|
-
//# sourceMappingURL=helpers.js.map
|
package/dist/helpers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"helpers.js"}
|
package/dist/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export { createMcpServer, setRequestHandler } from './server.js';
|
|
2
|
-
export { McpTool, extractToolsFromProcedures, mergeInputs } from './tools.js';
|
|
3
|
-
export { transformMcpProcedure } from './helpers.js';
|
|
4
|
-
export { McpMeta, TransformMcpProcedureFunction } from './types.js';
|
|
5
|
-
import '@modelcontextprotocol/sdk/server/index.js';
|
|
6
|
-
import '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
-
import '@modelcontextprotocol/sdk/types.js';
|
|
8
|
-
import '@trpc/server/unstable-core-do-not-import';
|
|
9
|
-
import 'zod/v4';
|
|
10
|
-
import '@modelcontextprotocol/sdk/types';
|
package/dist/index.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkFT3KTYAU_js = require('./chunk-FT3KTYAU.js');
|
|
4
|
-
require('./chunk-55J6XMHW.js');
|
|
5
|
-
var chunkRJJMUGXY_js = require('./chunk-RJJMUGXY.js');
|
|
6
|
-
var chunkBTXMEL6M_js = require('./chunk-BTXMEL6M.js');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Object.defineProperty(exports, "transformMcpProcedure", {
|
|
11
|
-
enumerable: true,
|
|
12
|
-
get: function () { return chunkFT3KTYAU_js.transformMcpProcedure; }
|
|
13
|
-
});
|
|
14
|
-
Object.defineProperty(exports, "createMcpServer", {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function () { return chunkRJJMUGXY_js.createMcpServer; }
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(exports, "setRequestHandler", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () { return chunkRJJMUGXY_js.setRequestHandler; }
|
|
21
|
-
});
|
|
22
|
-
Object.defineProperty(exports, "extractToolsFromProcedures", {
|
|
23
|
-
enumerable: true,
|
|
24
|
-
get: function () { return chunkBTXMEL6M_js.extractToolsFromProcedures; }
|
|
25
|
-
});
|
|
26
|
-
Object.defineProperty(exports, "mergeInputs", {
|
|
27
|
-
enumerable: true,
|
|
28
|
-
get: function () { return chunkBTXMEL6M_js.mergeInputs; }
|
|
29
|
-
});
|
|
30
|
-
//# sourceMappingURL=index.js.map
|
|
31
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|
package/dist/server.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
-
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
-
import { Implementation } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
-
import { RouterRecord, DecorateRouterRecord, AnyRootTypes, Router, MaybePromise } from '@trpc/server/unstable-core-do-not-import';
|
|
5
|
-
import { McpTool } from './tools.js';
|
|
6
|
-
import 'zod/v4';
|
|
7
|
-
import './types.js';
|
|
8
|
-
|
|
9
|
-
declare function setRequestHandler<TRecord extends RouterRecord>(server: Server, tools: McpTool[], trpcCaller: DecorateRouterRecord<TRecord>): void;
|
|
10
|
-
declare function createMcpServer<TRoot extends AnyRootTypes, TRecord extends RouterRecord>(implementation: Implementation, appRouter: Router<TRoot, TRecord>, ctx: TRoot["ctx"] | (() => MaybePromise<TRoot["ctx"]>)): McpServer;
|
|
11
|
-
|
|
12
|
-
export { createMcpServer, setRequestHandler };
|
package/dist/server.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkRJJMUGXY_js = require('./chunk-RJJMUGXY.js');
|
|
4
|
-
require('./chunk-BTXMEL6M.js');
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
Object.defineProperty(exports, "createMcpServer", {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
get: function () { return chunkRJJMUGXY_js.createMcpServer; }
|
|
11
|
-
});
|
|
12
|
-
Object.defineProperty(exports, "setRequestHandler", {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () { return chunkRJJMUGXY_js.setRequestHandler; }
|
|
15
|
-
});
|
|
16
|
-
//# sourceMappingURL=server.js.map
|
|
17
|
-
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"server.js"}
|