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