@mcp-ts/sdk 1.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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +297 -0
  3. package/dist/adapters/agui-adapter.d.mts +119 -0
  4. package/dist/adapters/agui-adapter.d.ts +119 -0
  5. package/dist/adapters/agui-adapter.js +109 -0
  6. package/dist/adapters/agui-adapter.js.map +1 -0
  7. package/dist/adapters/agui-adapter.mjs +107 -0
  8. package/dist/adapters/agui-adapter.mjs.map +1 -0
  9. package/dist/adapters/agui-middleware.d.mts +171 -0
  10. package/dist/adapters/agui-middleware.d.ts +171 -0
  11. package/dist/adapters/agui-middleware.js +429 -0
  12. package/dist/adapters/agui-middleware.js.map +1 -0
  13. package/dist/adapters/agui-middleware.mjs +417 -0
  14. package/dist/adapters/agui-middleware.mjs.map +1 -0
  15. package/dist/adapters/ai-adapter.d.mts +38 -0
  16. package/dist/adapters/ai-adapter.d.ts +38 -0
  17. package/dist/adapters/ai-adapter.js +82 -0
  18. package/dist/adapters/ai-adapter.js.map +1 -0
  19. package/dist/adapters/ai-adapter.mjs +80 -0
  20. package/dist/adapters/ai-adapter.mjs.map +1 -0
  21. package/dist/adapters/langchain-adapter.d.mts +46 -0
  22. package/dist/adapters/langchain-adapter.d.ts +46 -0
  23. package/dist/adapters/langchain-adapter.js +102 -0
  24. package/dist/adapters/langchain-adapter.js.map +1 -0
  25. package/dist/adapters/langchain-adapter.mjs +100 -0
  26. package/dist/adapters/langchain-adapter.mjs.map +1 -0
  27. package/dist/adapters/mastra-adapter.d.mts +49 -0
  28. package/dist/adapters/mastra-adapter.d.ts +49 -0
  29. package/dist/adapters/mastra-adapter.js +95 -0
  30. package/dist/adapters/mastra-adapter.js.map +1 -0
  31. package/dist/adapters/mastra-adapter.mjs +93 -0
  32. package/dist/adapters/mastra-adapter.mjs.map +1 -0
  33. package/dist/client/index.d.mts +119 -0
  34. package/dist/client/index.d.ts +119 -0
  35. package/dist/client/index.js +225 -0
  36. package/dist/client/index.js.map +1 -0
  37. package/dist/client/index.mjs +223 -0
  38. package/dist/client/index.mjs.map +1 -0
  39. package/dist/client/react.d.mts +151 -0
  40. package/dist/client/react.d.ts +151 -0
  41. package/dist/client/react.js +492 -0
  42. package/dist/client/react.js.map +1 -0
  43. package/dist/client/react.mjs +489 -0
  44. package/dist/client/react.mjs.map +1 -0
  45. package/dist/client/vue.d.mts +157 -0
  46. package/dist/client/vue.d.ts +157 -0
  47. package/dist/client/vue.js +474 -0
  48. package/dist/client/vue.js.map +1 -0
  49. package/dist/client/vue.mjs +471 -0
  50. package/dist/client/vue.mjs.map +1 -0
  51. package/dist/events-BP6WyRNh.d.mts +110 -0
  52. package/dist/events-BP6WyRNh.d.ts +110 -0
  53. package/dist/index.d.mts +10 -0
  54. package/dist/index.d.ts +10 -0
  55. package/dist/index.js +2784 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/index.mjs +2723 -0
  58. package/dist/index.mjs.map +1 -0
  59. package/dist/multi-session-client-BOFgPypS.d.ts +389 -0
  60. package/dist/multi-session-client-DMF3ED2O.d.mts +389 -0
  61. package/dist/server/index.d.mts +269 -0
  62. package/dist/server/index.d.ts +269 -0
  63. package/dist/server/index.js +2444 -0
  64. package/dist/server/index.js.map +1 -0
  65. package/dist/server/index.mjs +2414 -0
  66. package/dist/server/index.mjs.map +1 -0
  67. package/dist/shared/index.d.mts +24 -0
  68. package/dist/shared/index.d.ts +24 -0
  69. package/dist/shared/index.js +223 -0
  70. package/dist/shared/index.js.map +1 -0
  71. package/dist/shared/index.mjs +190 -0
  72. package/dist/shared/index.mjs.map +1 -0
  73. package/dist/types-SbDlA2VX.d.mts +153 -0
  74. package/dist/types-SbDlA2VX.d.ts +153 -0
  75. package/dist/utils-0qmYrqoa.d.mts +92 -0
  76. package/dist/utils-0qmYrqoa.d.ts +92 -0
  77. package/package.json +165 -0
  78. package/src/adapters/agui-adapter.ts +210 -0
  79. package/src/adapters/agui-middleware.ts +512 -0
  80. package/src/adapters/ai-adapter.ts +115 -0
  81. package/src/adapters/langchain-adapter.ts +127 -0
  82. package/src/adapters/mastra-adapter.ts +126 -0
  83. package/src/client/core/sse-client.ts +340 -0
  84. package/src/client/index.ts +26 -0
  85. package/src/client/react/index.ts +10 -0
  86. package/src/client/react/useMcp.ts +558 -0
  87. package/src/client/vue/index.ts +10 -0
  88. package/src/client/vue/useMcp.ts +542 -0
  89. package/src/index.ts +11 -0
  90. package/src/server/handlers/nextjs-handler.ts +216 -0
  91. package/src/server/handlers/sse-handler.ts +699 -0
  92. package/src/server/index.ts +57 -0
  93. package/src/server/mcp/multi-session-client.ts +132 -0
  94. package/src/server/mcp/oauth-client.ts +1168 -0
  95. package/src/server/mcp/storage-oauth-provider.ts +239 -0
  96. package/src/server/storage/file-backend.ts +169 -0
  97. package/src/server/storage/index.ts +115 -0
  98. package/src/server/storage/memory-backend.ts +132 -0
  99. package/src/server/storage/redis-backend.ts +210 -0
  100. package/src/server/storage/redis.ts +160 -0
  101. package/src/server/storage/types.ts +109 -0
  102. package/src/shared/constants.ts +29 -0
  103. package/src/shared/errors.ts +133 -0
  104. package/src/shared/events.ts +166 -0
  105. package/src/shared/index.ts +70 -0
  106. package/src/shared/types.ts +274 -0
  107. package/src/shared/utils.ts +16 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/ai-adapter.ts"],"names":[],"mappings":"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","file":"ai-adapter.js","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\r\nimport type { JSONSchema7 } from 'json-schema';\r\nimport type { ToolSet } from 'ai';\r\n\r\nexport interface AIAdapterOptions {\r\n /** \r\n * Prefix for tool names to avoid collision with other tools.\r\n * Defaults to the client's serverId.\r\n */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * Adapter to use MCP tools with the Vercel AI SDK.\r\n */\r\nexport class AIAdapter {\r\n private jsonSchema: typeof import('ai').jsonSchema | undefined;\r\n\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: AIAdapterOptions = {}\r\n ) { }\r\n\r\n\r\n\r\n /**\r\n * Lazy-loads the jsonSchema function from the AI SDK.\r\n */\r\n private async ensureJsonSchema() {\r\n if (!this.jsonSchema) {\r\n const { jsonSchema } = await import('ai');\r\n this.jsonSchema = jsonSchema;\r\n }\r\n }\r\n\r\n private async transformTools(client: MCPClient): Promise<ToolSet> {\r\n // Safe check for isConnected method (duck typing for bundler compatibility)\r\n const isConnected = typeof client.isConnected === 'function'\r\n ? client.isConnected()\r\n : false;\r\n\r\n if (!isConnected) {\r\n return {};\r\n }\r\n\r\n const result = await client.listTools();\r\n\r\n // @ts-ignore: ToolSet type inference can be tricky with dynamic imports\r\n return Object.fromEntries(\r\n result.tools.map((tool) => {\r\n // Safe access to getServerId\r\n const serverId = typeof client.getServerId === 'function'\r\n ? client.getServerId()\r\n : undefined;\r\n const prefix = this.options.prefix ?? serverId?.replace(/-/g, '') ?? 'mcp';\r\n return [\r\n `tool_${prefix}_${tool.name}`,\r\n {\r\n description: tool.description,\r\n inputSchema: this.jsonSchema!(tool.inputSchema as JSONSchema7),\r\n execute: async (args: any) => {\r\n try {\r\n const response = await client.callTool(tool.name, args);\r\n return response;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Tool execution failed: ${errorMessage}`);\r\n }\r\n }\r\n }\r\n ];\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches tools from the client(s) and converts them to AI SDK tools.\r\n */\r\n async getTools(): Promise<ToolSet> {\r\n await this.ensureJsonSchema();\r\n\r\n // Use duck typing instead of instanceof to handle module bundling issues\r\n // MultiSessionClient has getClients(), MCPClient does not\r\n const isMultiSession = typeof (this.client as any).getClients === 'function';\r\n const clients = isMultiSession\r\n ? (this.client as MultiSessionClient).getClients()\r\n : [this.client as MCPClient];\r\n\r\n const results = await Promise.all(\r\n clients.map(async (client) => {\r\n try {\r\n return await this.transformTools(client);\r\n } catch (error) {\r\n // For multi-client, we log and continue.\r\n // This is safer than throwing.\r\n const serverId = typeof client.getServerId === 'function'\r\n ? client.getServerId() ?? 'unknown'\r\n : 'unknown';\r\n console.error(`[AIAdapter] Failed to fetch tools from ${serverId}:`, error);\r\n return {};\r\n }\r\n })\r\n );\r\n\r\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\r\n }\r\n\r\n /**\r\n * Convenience static method to fetch tools in a single line.\r\n */\r\n static async getTools(client: MCPClient | MultiSessionClient, options: AIAdapterOptions = {}): Promise<ToolSet> {\r\n return new AIAdapter(client, options).getTools();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,80 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
4
+
5
+ // src/adapters/ai-adapter.ts
6
+ var AIAdapter = class _AIAdapter {
7
+ constructor(client, options = {}) {
8
+ this.client = client;
9
+ this.options = options;
10
+ __publicField(this, "jsonSchema");
11
+ }
12
+ /**
13
+ * Lazy-loads the jsonSchema function from the AI SDK.
14
+ */
15
+ async ensureJsonSchema() {
16
+ if (!this.jsonSchema) {
17
+ const { jsonSchema } = await import('ai');
18
+ this.jsonSchema = jsonSchema;
19
+ }
20
+ }
21
+ async transformTools(client) {
22
+ const isConnected = typeof client.isConnected === "function" ? client.isConnected() : false;
23
+ if (!isConnected) {
24
+ return {};
25
+ }
26
+ const result = await client.listTools();
27
+ return Object.fromEntries(
28
+ result.tools.map((tool) => {
29
+ const serverId = typeof client.getServerId === "function" ? client.getServerId() : void 0;
30
+ const prefix = this.options.prefix ?? serverId?.replace(/-/g, "") ?? "mcp";
31
+ return [
32
+ `tool_${prefix}_${tool.name}`,
33
+ {
34
+ description: tool.description,
35
+ inputSchema: this.jsonSchema(tool.inputSchema),
36
+ execute: async (args) => {
37
+ try {
38
+ const response = await client.callTool(tool.name, args);
39
+ return response;
40
+ } catch (error) {
41
+ const errorMessage = error instanceof Error ? error.message : String(error);
42
+ throw new Error(`Tool execution failed: ${errorMessage}`);
43
+ }
44
+ }
45
+ }
46
+ ];
47
+ })
48
+ );
49
+ }
50
+ /**
51
+ * Fetches tools from the client(s) and converts them to AI SDK tools.
52
+ */
53
+ async getTools() {
54
+ await this.ensureJsonSchema();
55
+ const isMultiSession = typeof this.client.getClients === "function";
56
+ const clients = isMultiSession ? this.client.getClients() : [this.client];
57
+ const results = await Promise.all(
58
+ clients.map(async (client) => {
59
+ try {
60
+ return await this.transformTools(client);
61
+ } catch (error) {
62
+ const serverId = typeof client.getServerId === "function" ? client.getServerId() ?? "unknown" : "unknown";
63
+ console.error(`[AIAdapter] Failed to fetch tools from ${serverId}:`, error);
64
+ return {};
65
+ }
66
+ })
67
+ );
68
+ return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});
69
+ }
70
+ /**
71
+ * Convenience static method to fetch tools in a single line.
72
+ */
73
+ static async getTools(client, options = {}) {
74
+ return new _AIAdapter(client, options).getTools();
75
+ }
76
+ };
77
+
78
+ export { AIAdapter };
79
+ //# sourceMappingURL=ai-adapter.mjs.map
80
+ //# sourceMappingURL=ai-adapter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/ai-adapter.ts"],"names":[],"mappings":";;;;;AAgBO,IAAM,SAAA,GAAN,MAAM,UAAA,CAAU;AAAA,EAGnB,WAAA,CACY,MAAA,EACA,OAAA,GAA4B,EAAC,EACvC;AAFU,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAJZ,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,CAAA;AAAA,EAKJ;AAAA;AAAA;AAAA;AAAA,EAOJ,MAAc,gBAAA,GAAmB;AAC7B,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAM,OAAO,IAAI,CAAA;AACxC,MAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,IACtB;AAAA,EACJ;AAAA,EAEA,MAAc,eAAe,MAAA,EAAqC;AAE9D,IAAA,MAAM,cAAc,OAAO,MAAA,CAAO,gBAAgB,UAAA,GAC5C,MAAA,CAAO,aAAY,GACnB,KAAA;AAEN,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AAGtC,IAAA,OAAO,MAAA,CAAO,WAAA;AAAA,MACV,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAEvB,QAAA,MAAM,WAAW,OAAO,MAAA,CAAO,gBAAgB,UAAA,GACzC,MAAA,CAAO,aAAY,GACnB,MAAA;AACN,QAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,MAAA,IAAU,UAAU,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,IAAK,KAAA;AACrE,QAAA,OAAO;AAAA,UACH,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,UAC3B;AAAA,YACI,aAAa,IAAA,CAAK,WAAA;AAAA,YAClB,WAAA,EAAa,IAAA,CAAK,UAAA,CAAY,IAAA,CAAK,WAA0B,CAAA;AAAA,YAC7D,OAAA,EAAS,OAAO,IAAA,KAAc;AAC1B,cAAA,IAAI;AACA,gBAAA,MAAM,WAAW,MAAM,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AACtD,gBAAA,OAAO,QAAA;AAAA,cACX,SAAS,KAAA,EAAO;AACZ,gBAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,gBAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,YAAY,CAAA,CAAE,CAAA;AAAA,cAC5D;AAAA,YACJ;AAAA;AACJ,SACJ;AAAA,MACJ,CAAC;AAAA,KACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAA6B;AAC/B,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAI5B,IAAA,MAAM,cAAA,GAAiB,OAAQ,IAAA,CAAK,MAAA,CAAe,UAAA,KAAe,UAAA;AAClE,IAAA,MAAM,OAAA,GAAU,iBACT,IAAA,CAAK,MAAA,CAA8B,YAAW,GAC/C,CAAC,KAAK,MAAmB,CAAA;AAE/B,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC1B,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAA,KAAW;AAC1B,QAAA,IAAI;AACA,UAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAAA,QAC3C,SAAS,KAAA,EAAO;AAGZ,UAAA,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO,WAAA,KAAgB,aACzC,MAAA,CAAO,WAAA,MAAiB,SAAA,GACxB,SAAA;AACN,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC1E,UAAA,OAAO,EAAC;AAAA,QACZ;AAAA,MACJ,CAAC;AAAA,KACL;AAEA,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,KAAA,MAAW,EAAE,GAAG,GAAA,EAAK,GAAG,KAAA,EAAM,CAAA,EAAI,EAAE,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,QAAA,CAAS,MAAA,EAAwC,OAAA,GAA4B,EAAC,EAAqB;AAC5G,IAAA,OAAO,IAAI,UAAA,CAAU,MAAA,EAAQ,OAAO,EAAE,QAAA,EAAS;AAAA,EACnD;AACJ","file":"ai-adapter.mjs","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\r\nimport type { JSONSchema7 } from 'json-schema';\r\nimport type { ToolSet } from 'ai';\r\n\r\nexport interface AIAdapterOptions {\r\n /** \r\n * Prefix for tool names to avoid collision with other tools.\r\n * Defaults to the client's serverId.\r\n */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * Adapter to use MCP tools with the Vercel AI SDK.\r\n */\r\nexport class AIAdapter {\r\n private jsonSchema: typeof import('ai').jsonSchema | undefined;\r\n\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: AIAdapterOptions = {}\r\n ) { }\r\n\r\n\r\n\r\n /**\r\n * Lazy-loads the jsonSchema function from the AI SDK.\r\n */\r\n private async ensureJsonSchema() {\r\n if (!this.jsonSchema) {\r\n const { jsonSchema } = await import('ai');\r\n this.jsonSchema = jsonSchema;\r\n }\r\n }\r\n\r\n private async transformTools(client: MCPClient): Promise<ToolSet> {\r\n // Safe check for isConnected method (duck typing for bundler compatibility)\r\n const isConnected = typeof client.isConnected === 'function'\r\n ? client.isConnected()\r\n : false;\r\n\r\n if (!isConnected) {\r\n return {};\r\n }\r\n\r\n const result = await client.listTools();\r\n\r\n // @ts-ignore: ToolSet type inference can be tricky with dynamic imports\r\n return Object.fromEntries(\r\n result.tools.map((tool) => {\r\n // Safe access to getServerId\r\n const serverId = typeof client.getServerId === 'function'\r\n ? client.getServerId()\r\n : undefined;\r\n const prefix = this.options.prefix ?? serverId?.replace(/-/g, '') ?? 'mcp';\r\n return [\r\n `tool_${prefix}_${tool.name}`,\r\n {\r\n description: tool.description,\r\n inputSchema: this.jsonSchema!(tool.inputSchema as JSONSchema7),\r\n execute: async (args: any) => {\r\n try {\r\n const response = await client.callTool(tool.name, args);\r\n return response;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Tool execution failed: ${errorMessage}`);\r\n }\r\n }\r\n }\r\n ];\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fetches tools from the client(s) and converts them to AI SDK tools.\r\n */\r\n async getTools(): Promise<ToolSet> {\r\n await this.ensureJsonSchema();\r\n\r\n // Use duck typing instead of instanceof to handle module bundling issues\r\n // MultiSessionClient has getClients(), MCPClient does not\r\n const isMultiSession = typeof (this.client as any).getClients === 'function';\r\n const clients = isMultiSession\r\n ? (this.client as MultiSessionClient).getClients()\r\n : [this.client as MCPClient];\r\n\r\n const results = await Promise.all(\r\n clients.map(async (client) => {\r\n try {\r\n return await this.transformTools(client);\r\n } catch (error) {\r\n // For multi-client, we log and continue.\r\n // This is safer than throwing.\r\n const serverId = typeof client.getServerId === 'function'\r\n ? client.getServerId() ?? 'unknown'\r\n : 'unknown';\r\n console.error(`[AIAdapter] Failed to fetch tools from ${serverId}:`, error);\r\n return {};\r\n }\r\n })\r\n );\r\n\r\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\r\n }\r\n\r\n /**\r\n * Convenience static method to fetch tools in a single line.\r\n */\r\n static async getTools(client: MCPClient | MultiSessionClient, options: AIAdapterOptions = {}): Promise<ToolSet> {\r\n return new AIAdapter(client, options).getTools();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,46 @@
1
+ import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-DMF3ED2O.mjs';
2
+ import { StructuredTool } from '@langchain/core/tools';
3
+ import '../events-BP6WyRNh.mjs';
4
+ import '@modelcontextprotocol/sdk/types.js';
5
+ import '@modelcontextprotocol/sdk/shared/auth.js';
6
+ import '@modelcontextprotocol/sdk/client/auth.js';
7
+
8
+ interface LangChainAdapterOptions {
9
+ /**
10
+ * Prefix for tool names to avoid collision with other tools.
11
+ * Defaults to the client's serverId.
12
+ */
13
+ prefix?: string;
14
+ /**
15
+ * Whether to simplify error messages returned to the LLM.
16
+ * If true, returns "Error: <message>" string instead of throwing.
17
+ * @default false
18
+ */
19
+ simplifyErrors?: boolean;
20
+ }
21
+ /**
22
+ * Adapter to use MCP tools within LangChain/LangGraph agents.
23
+ */
24
+ declare class LangChainAdapter {
25
+ private client;
26
+ private options;
27
+ private DynamicStructuredTool;
28
+ private z;
29
+ constructor(client: MCPClient | MultiSessionClient, options?: LangChainAdapterOptions);
30
+ /**
31
+ * Lazy-loads LangChain and Zod dependencies
32
+ */
33
+ private ensureDependencies;
34
+ private transformTools;
35
+ private jsonSchemaToZod;
36
+ /**
37
+ * Fetches tools from the MCP server and converts them to LangChain StructuredTools.
38
+ */
39
+ getTools(): Promise<StructuredTool[]>;
40
+ /**
41
+ * Convenience static method to fetch tools in a single line.
42
+ */
43
+ static getTools(client: MCPClient | MultiSessionClient, options?: LangChainAdapterOptions): Promise<StructuredTool[]>;
44
+ }
45
+
46
+ export { LangChainAdapter, type LangChainAdapterOptions };
@@ -0,0 +1,46 @@
1
+ import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-BOFgPypS.js';
2
+ import { StructuredTool } from '@langchain/core/tools';
3
+ import '../events-BP6WyRNh.js';
4
+ import '@modelcontextprotocol/sdk/types.js';
5
+ import '@modelcontextprotocol/sdk/shared/auth.js';
6
+ import '@modelcontextprotocol/sdk/client/auth.js';
7
+
8
+ interface LangChainAdapterOptions {
9
+ /**
10
+ * Prefix for tool names to avoid collision with other tools.
11
+ * Defaults to the client's serverId.
12
+ */
13
+ prefix?: string;
14
+ /**
15
+ * Whether to simplify error messages returned to the LLM.
16
+ * If true, returns "Error: <message>" string instead of throwing.
17
+ * @default false
18
+ */
19
+ simplifyErrors?: boolean;
20
+ }
21
+ /**
22
+ * Adapter to use MCP tools within LangChain/LangGraph agents.
23
+ */
24
+ declare class LangChainAdapter {
25
+ private client;
26
+ private options;
27
+ private DynamicStructuredTool;
28
+ private z;
29
+ constructor(client: MCPClient | MultiSessionClient, options?: LangChainAdapterOptions);
30
+ /**
31
+ * Lazy-loads LangChain and Zod dependencies
32
+ */
33
+ private ensureDependencies;
34
+ private transformTools;
35
+ private jsonSchemaToZod;
36
+ /**
37
+ * Fetches tools from the MCP server and converts them to LangChain StructuredTools.
38
+ */
39
+ getTools(): Promise<StructuredTool[]>;
40
+ /**
41
+ * Convenience static method to fetch tools in a single line.
42
+ */
43
+ static getTools(client: MCPClient | MultiSessionClient, options?: LangChainAdapterOptions): Promise<StructuredTool[]>;
44
+ }
45
+
46
+ export { LangChainAdapter, type LangChainAdapterOptions };
@@ -0,0 +1,102 @@
1
+ 'use strict';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
6
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
7
+ }) : x)(function(x) {
8
+ if (typeof require !== "undefined") return require.apply(this, arguments);
9
+ throw Error('Dynamic require of "' + x + '" is not supported');
10
+ });
11
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
12
+
13
+ // src/adapters/langchain-adapter.ts
14
+ var LangChainAdapter = class _LangChainAdapter {
15
+ constructor(client, options = {}) {
16
+ this.client = client;
17
+ this.options = options;
18
+ __publicField(this, "DynamicStructuredTool");
19
+ __publicField(this, "z");
20
+ }
21
+ /**
22
+ * Lazy-loads LangChain and Zod dependencies
23
+ */
24
+ async ensureDependencies() {
25
+ if (!this.DynamicStructuredTool) {
26
+ try {
27
+ const langchain = await import('@langchain/core/tools');
28
+ this.DynamicStructuredTool = langchain.DynamicStructuredTool;
29
+ const zod = await import('zod');
30
+ this.z = zod.z;
31
+ } catch (error) {
32
+ throw new Error(
33
+ "LangChain dependencies not installed. Install with:\n npm install @langchain/core zod"
34
+ );
35
+ }
36
+ }
37
+ }
38
+ async transformTools(client) {
39
+ if (!client.isConnected()) {
40
+ return [];
41
+ }
42
+ await this.ensureDependencies();
43
+ const result = await client.listTools();
44
+ const prefix = this.options.prefix ?? client.getServerId() ?? "mcp";
45
+ return result.tools.map((tool) => {
46
+ const schema = this.jsonSchemaToZod(tool.inputSchema);
47
+ return new this.DynamicStructuredTool({
48
+ name: `${prefix}_${tool.name}`,
49
+ description: tool.description || `Tool ${tool.name}`,
50
+ schema,
51
+ func: async (args) => {
52
+ try {
53
+ return await client.callTool(tool.name, args);
54
+ } catch (error) {
55
+ if (this.options.simplifyErrors) {
56
+ return `Error: ${error.message}`;
57
+ }
58
+ throw error;
59
+ }
60
+ }
61
+ });
62
+ });
63
+ }
64
+ jsonSchemaToZod(schema) {
65
+ try {
66
+ const { parseSchema } = __require("json-schema-to-zod");
67
+ const zodSchemaString = parseSchema(schema);
68
+ return new Function("z", "return " + zodSchemaString)(this.z);
69
+ } catch (error) {
70
+ console.warn("[LangChainAdapter] Failed to convert JSON Schema to Zod, using fallback:", error);
71
+ return this.z.record(this.z.any()).optional().describe("Dynamic Input");
72
+ }
73
+ }
74
+ /**
75
+ * Fetches tools from the MCP server and converts them to LangChain StructuredTools.
76
+ */
77
+ async getTools() {
78
+ const isMultiSession = typeof this.client.getClients === "function";
79
+ const clients = isMultiSession ? this.client.getClients() : [this.client];
80
+ const results = await Promise.all(
81
+ clients.map(async (client) => {
82
+ try {
83
+ return await this.transformTools(client);
84
+ } catch (error) {
85
+ console.error(`[LangChainAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);
86
+ return [];
87
+ }
88
+ })
89
+ );
90
+ return results.flat();
91
+ }
92
+ /**
93
+ * Convenience static method to fetch tools in a single line.
94
+ */
95
+ static async getTools(client, options = {}) {
96
+ return new _LangChainAdapter(client, options).getTools();
97
+ }
98
+ };
99
+
100
+ exports.LangChainAdapter = LangChainAdapter;
101
+ //# sourceMappingURL=langchain-adapter.js.map
102
+ //# sourceMappingURL=langchain-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/langchain-adapter.ts"],"names":[],"mappings":"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","file":"langchain-adapter.js","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\r\nimport type { DynamicStructuredTool, StructuredTool } from '@langchain/core/tools';\r\nimport type { z } from 'zod';\r\n\r\nexport interface LangChainAdapterOptions {\r\n /** \r\n * Prefix for tool names to avoid collision with other tools.\r\n * Defaults to the client's serverId.\r\n */\r\n prefix?: string;\r\n\r\n /**\r\n * Whether to simplify error messages returned to the LLM.\r\n * If true, returns \"Error: <message>\" string instead of throwing.\r\n * @default false\r\n */\r\n simplifyErrors?: boolean;\r\n}\r\n\r\n/**\r\n * Adapter to use MCP tools within LangChain/LangGraph agents.\r\n */\r\nexport class LangChainAdapter {\r\n private DynamicStructuredTool: typeof DynamicStructuredTool | undefined;\r\n private z: typeof z | undefined;\r\n\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: LangChainAdapterOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Lazy-loads LangChain and Zod dependencies\r\n */\r\n private async ensureDependencies() {\r\n if (!this.DynamicStructuredTool) {\r\n try {\r\n const langchain = await import('@langchain/core/tools');\r\n this.DynamicStructuredTool = langchain.DynamicStructuredTool;\r\n\r\n const zod = await import('zod');\r\n this.z = zod.z;\r\n } catch (error) {\r\n throw new Error(\r\n 'LangChain dependencies not installed. Install with:\\n' +\r\n ' npm install @langchain/core zod'\r\n );\r\n }\r\n }\r\n }\r\n\r\n private async transformTools(client: MCPClient): Promise<StructuredTool[]> {\r\n if (!client.isConnected()) {\r\n return [];\r\n }\r\n\r\n await this.ensureDependencies();\r\n\r\n const result = await client.listTools();\r\n const prefix = this.options.prefix ?? client.getServerId() ?? 'mcp';\r\n\r\n return result.tools.map((tool) => {\r\n // In a real implementation, you would use a library like 'json-schema-to-zod'\r\n const schema = this.jsonSchemaToZod(tool.inputSchema);\r\n\r\n return new this.DynamicStructuredTool!({\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Tool ${tool.name}`,\r\n schema: schema,\r\n func: async (args: any) => {\r\n try {\r\n return await client.callTool(tool.name, args);\r\n } catch (error: any) {\r\n if (this.options.simplifyErrors) {\r\n return `Error: ${error.message}`;\r\n }\r\n throw error;\r\n }\r\n },\r\n });\r\n });\r\n }\r\n\r\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\r\n try {\r\n const { parseSchema } = require('json-schema-to-zod');\r\n const zodSchemaString = parseSchema(schema);\r\n // eslint-disable-next-line\r\n return new Function('z', 'return ' + zodSchemaString)(this.z);\r\n } catch (error) {\r\n // Fallback: Accept any object if conversion fails\r\n console.warn('[LangChainAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\r\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\r\n }\r\n }\r\n\r\n /**\r\n * Fetches tools from the MCP server and converts them to LangChain StructuredTools.\r\n */\r\n async getTools(): Promise<StructuredTool[]> {\r\n // Use duck typing instead of instanceof to handle module bundling issues\r\n const isMultiSession = typeof (this.client as any).getClients === 'function';\r\n const clients = isMultiSession\r\n ? (this.client as MultiSessionClient).getClients()\r\n : [this.client as MCPClient];\r\n\r\n const results = await Promise.all(\r\n clients.map(async (client) => {\r\n try {\r\n return await this.transformTools(client);\r\n } catch (error) {\r\n console.error(`[LangChainAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\r\n return [];\r\n }\r\n })\r\n );\r\n return results.flat();\r\n }\r\n\r\n /**\r\n * Convenience static method to fetch tools in a single line.\r\n */\r\n static async getTools(client: MCPClient | MultiSessionClient, options: LangChainAdapterOptions = {}): Promise<StructuredTool[]> {\r\n return new LangChainAdapter(client, options).getTools();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,100 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
+ }) : x)(function(x) {
6
+ if (typeof require !== "undefined") return require.apply(this, arguments);
7
+ throw Error('Dynamic require of "' + x + '" is not supported');
8
+ });
9
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
10
+
11
+ // src/adapters/langchain-adapter.ts
12
+ var LangChainAdapter = class _LangChainAdapter {
13
+ constructor(client, options = {}) {
14
+ this.client = client;
15
+ this.options = options;
16
+ __publicField(this, "DynamicStructuredTool");
17
+ __publicField(this, "z");
18
+ }
19
+ /**
20
+ * Lazy-loads LangChain and Zod dependencies
21
+ */
22
+ async ensureDependencies() {
23
+ if (!this.DynamicStructuredTool) {
24
+ try {
25
+ const langchain = await import('@langchain/core/tools');
26
+ this.DynamicStructuredTool = langchain.DynamicStructuredTool;
27
+ const zod = await import('zod');
28
+ this.z = zod.z;
29
+ } catch (error) {
30
+ throw new Error(
31
+ "LangChain dependencies not installed. Install with:\n npm install @langchain/core zod"
32
+ );
33
+ }
34
+ }
35
+ }
36
+ async transformTools(client) {
37
+ if (!client.isConnected()) {
38
+ return [];
39
+ }
40
+ await this.ensureDependencies();
41
+ const result = await client.listTools();
42
+ const prefix = this.options.prefix ?? client.getServerId() ?? "mcp";
43
+ return result.tools.map((tool) => {
44
+ const schema = this.jsonSchemaToZod(tool.inputSchema);
45
+ return new this.DynamicStructuredTool({
46
+ name: `${prefix}_${tool.name}`,
47
+ description: tool.description || `Tool ${tool.name}`,
48
+ schema,
49
+ func: async (args) => {
50
+ try {
51
+ return await client.callTool(tool.name, args);
52
+ } catch (error) {
53
+ if (this.options.simplifyErrors) {
54
+ return `Error: ${error.message}`;
55
+ }
56
+ throw error;
57
+ }
58
+ }
59
+ });
60
+ });
61
+ }
62
+ jsonSchemaToZod(schema) {
63
+ try {
64
+ const { parseSchema } = __require("json-schema-to-zod");
65
+ const zodSchemaString = parseSchema(schema);
66
+ return new Function("z", "return " + zodSchemaString)(this.z);
67
+ } catch (error) {
68
+ console.warn("[LangChainAdapter] Failed to convert JSON Schema to Zod, using fallback:", error);
69
+ return this.z.record(this.z.any()).optional().describe("Dynamic Input");
70
+ }
71
+ }
72
+ /**
73
+ * Fetches tools from the MCP server and converts them to LangChain StructuredTools.
74
+ */
75
+ async getTools() {
76
+ const isMultiSession = typeof this.client.getClients === "function";
77
+ const clients = isMultiSession ? this.client.getClients() : [this.client];
78
+ const results = await Promise.all(
79
+ clients.map(async (client) => {
80
+ try {
81
+ return await this.transformTools(client);
82
+ } catch (error) {
83
+ console.error(`[LangChainAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);
84
+ return [];
85
+ }
86
+ })
87
+ );
88
+ return results.flat();
89
+ }
90
+ /**
91
+ * Convenience static method to fetch tools in a single line.
92
+ */
93
+ static async getTools(client, options = {}) {
94
+ return new _LangChainAdapter(client, options).getTools();
95
+ }
96
+ };
97
+
98
+ export { LangChainAdapter };
99
+ //# sourceMappingURL=langchain-adapter.mjs.map
100
+ //# sourceMappingURL=langchain-adapter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/langchain-adapter.ts"],"names":[],"mappings":"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","file":"langchain-adapter.mjs","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\r\nimport type { DynamicStructuredTool, StructuredTool } from '@langchain/core/tools';\r\nimport type { z } from 'zod';\r\n\r\nexport interface LangChainAdapterOptions {\r\n /** \r\n * Prefix for tool names to avoid collision with other tools.\r\n * Defaults to the client's serverId.\r\n */\r\n prefix?: string;\r\n\r\n /**\r\n * Whether to simplify error messages returned to the LLM.\r\n * If true, returns \"Error: <message>\" string instead of throwing.\r\n * @default false\r\n */\r\n simplifyErrors?: boolean;\r\n}\r\n\r\n/**\r\n * Adapter to use MCP tools within LangChain/LangGraph agents.\r\n */\r\nexport class LangChainAdapter {\r\n private DynamicStructuredTool: typeof DynamicStructuredTool | undefined;\r\n private z: typeof z | undefined;\r\n\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: LangChainAdapterOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Lazy-loads LangChain and Zod dependencies\r\n */\r\n private async ensureDependencies() {\r\n if (!this.DynamicStructuredTool) {\r\n try {\r\n const langchain = await import('@langchain/core/tools');\r\n this.DynamicStructuredTool = langchain.DynamicStructuredTool;\r\n\r\n const zod = await import('zod');\r\n this.z = zod.z;\r\n } catch (error) {\r\n throw new Error(\r\n 'LangChain dependencies not installed. Install with:\\n' +\r\n ' npm install @langchain/core zod'\r\n );\r\n }\r\n }\r\n }\r\n\r\n private async transformTools(client: MCPClient): Promise<StructuredTool[]> {\r\n if (!client.isConnected()) {\r\n return [];\r\n }\r\n\r\n await this.ensureDependencies();\r\n\r\n const result = await client.listTools();\r\n const prefix = this.options.prefix ?? client.getServerId() ?? 'mcp';\r\n\r\n return result.tools.map((tool) => {\r\n // In a real implementation, you would use a library like 'json-schema-to-zod'\r\n const schema = this.jsonSchemaToZod(tool.inputSchema);\r\n\r\n return new this.DynamicStructuredTool!({\r\n name: `${prefix}_${tool.name}`,\r\n description: tool.description || `Tool ${tool.name}`,\r\n schema: schema,\r\n func: async (args: any) => {\r\n try {\r\n return await client.callTool(tool.name, args);\r\n } catch (error: any) {\r\n if (this.options.simplifyErrors) {\r\n return `Error: ${error.message}`;\r\n }\r\n throw error;\r\n }\r\n },\r\n });\r\n });\r\n }\r\n\r\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\r\n try {\r\n const { parseSchema } = require('json-schema-to-zod');\r\n const zodSchemaString = parseSchema(schema);\r\n // eslint-disable-next-line\r\n return new Function('z', 'return ' + zodSchemaString)(this.z);\r\n } catch (error) {\r\n // Fallback: Accept any object if conversion fails\r\n console.warn('[LangChainAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\r\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\r\n }\r\n }\r\n\r\n /**\r\n * Fetches tools from the MCP server and converts them to LangChain StructuredTools.\r\n */\r\n async getTools(): Promise<StructuredTool[]> {\r\n // Use duck typing instead of instanceof to handle module bundling issues\r\n const isMultiSession = typeof (this.client as any).getClients === 'function';\r\n const clients = isMultiSession\r\n ? (this.client as MultiSessionClient).getClients()\r\n : [this.client as MCPClient];\r\n\r\n const results = await Promise.all(\r\n clients.map(async (client) => {\r\n try {\r\n return await this.transformTools(client);\r\n } catch (error) {\r\n console.error(`[LangChainAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\r\n return [];\r\n }\r\n })\r\n );\r\n return results.flat();\r\n }\r\n\r\n /**\r\n * Convenience static method to fetch tools in a single line.\r\n */\r\n static async getTools(client: MCPClient | MultiSessionClient, options: LangChainAdapterOptions = {}): Promise<StructuredTool[]> {\r\n return new LangChainAdapter(client, options).getTools();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,49 @@
1
+ import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-DMF3ED2O.mjs';
2
+ import { z } from 'zod';
3
+ import '../events-BP6WyRNh.mjs';
4
+ import '@modelcontextprotocol/sdk/types.js';
5
+ import '@modelcontextprotocol/sdk/shared/auth.js';
6
+ import '@modelcontextprotocol/sdk/client/auth.js';
7
+
8
+ interface MastraAdapterOptions {
9
+ /**
10
+ * Prefix for tool names to avoid collision with other tools.
11
+ * Defaults to the client's serverId.
12
+ */
13
+ prefix?: string;
14
+ }
15
+ /**
16
+ * Interface definition for a Mastra tool since we might not have the SDK installed.
17
+ * Based on Mastra documentation.
18
+ */
19
+ interface MastraTool {
20
+ id: string;
21
+ description: string;
22
+ inputSchema: z.ZodType<any>;
23
+ execute: (args: any) => Promise<any>;
24
+ }
25
+ /**
26
+ * Adapter to use MCP tools within Mastra agents.
27
+ */
28
+ declare class MastraAdapter {
29
+ private client;
30
+ private options;
31
+ private z;
32
+ constructor(client: MCPClient | MultiSessionClient, options?: MastraAdapterOptions);
33
+ /**
34
+ * Lazy-loads Zod dependency
35
+ */
36
+ private ensureZod;
37
+ private transformTools;
38
+ private jsonSchemaToZod;
39
+ /**
40
+ * Fetches tools from the MCP server and converts them to Mastra tools.
41
+ */
42
+ getTools(): Promise<Record<string, MastraTool>>;
43
+ /**
44
+ * Convenience static method to fetch tools in a single line.
45
+ */
46
+ static getTools(client: MCPClient | MultiSessionClient, options?: MastraAdapterOptions): Promise<Record<string, MastraTool>>;
47
+ }
48
+
49
+ export { MastraAdapter, type MastraAdapterOptions, type MastraTool };
@@ -0,0 +1,49 @@
1
+ import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-BOFgPypS.js';
2
+ import { z } from 'zod';
3
+ import '../events-BP6WyRNh.js';
4
+ import '@modelcontextprotocol/sdk/types.js';
5
+ import '@modelcontextprotocol/sdk/shared/auth.js';
6
+ import '@modelcontextprotocol/sdk/client/auth.js';
7
+
8
+ interface MastraAdapterOptions {
9
+ /**
10
+ * Prefix for tool names to avoid collision with other tools.
11
+ * Defaults to the client's serverId.
12
+ */
13
+ prefix?: string;
14
+ }
15
+ /**
16
+ * Interface definition for a Mastra tool since we might not have the SDK installed.
17
+ * Based on Mastra documentation.
18
+ */
19
+ interface MastraTool {
20
+ id: string;
21
+ description: string;
22
+ inputSchema: z.ZodType<any>;
23
+ execute: (args: any) => Promise<any>;
24
+ }
25
+ /**
26
+ * Adapter to use MCP tools within Mastra agents.
27
+ */
28
+ declare class MastraAdapter {
29
+ private client;
30
+ private options;
31
+ private z;
32
+ constructor(client: MCPClient | MultiSessionClient, options?: MastraAdapterOptions);
33
+ /**
34
+ * Lazy-loads Zod dependency
35
+ */
36
+ private ensureZod;
37
+ private transformTools;
38
+ private jsonSchemaToZod;
39
+ /**
40
+ * Fetches tools from the MCP server and converts them to Mastra tools.
41
+ */
42
+ getTools(): Promise<Record<string, MastraTool>>;
43
+ /**
44
+ * Convenience static method to fetch tools in a single line.
45
+ */
46
+ static getTools(client: MCPClient | MultiSessionClient, options?: MastraAdapterOptions): Promise<Record<string, MastraTool>>;
47
+ }
48
+
49
+ export { MastraAdapter, type MastraAdapterOptions, type MastraTool };
@@ -0,0 +1,95 @@
1
+ 'use strict';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
6
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
7
+ }) : x)(function(x) {
8
+ if (typeof require !== "undefined") return require.apply(this, arguments);
9
+ throw Error('Dynamic require of "' + x + '" is not supported');
10
+ });
11
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
12
+
13
+ // src/adapters/mastra-adapter.ts
14
+ var MastraAdapter = class _MastraAdapter {
15
+ constructor(client, options = {}) {
16
+ this.client = client;
17
+ this.options = options;
18
+ __publicField(this, "z");
19
+ }
20
+ /**
21
+ * Lazy-loads Zod dependency
22
+ */
23
+ async ensureZod() {
24
+ if (!this.z) {
25
+ try {
26
+ const zod = await import('zod');
27
+ this.z = zod.z;
28
+ } catch (error) {
29
+ throw new Error(
30
+ "zod is not installed. Install with:\n npm install zod"
31
+ );
32
+ }
33
+ }
34
+ }
35
+ async transformTools(client) {
36
+ if (!client.isConnected()) {
37
+ return {};
38
+ }
39
+ await this.ensureZod();
40
+ const result = await client.listTools();
41
+ const prefix = this.options.prefix ?? client.getServerId() ?? "mcp";
42
+ const tools = {};
43
+ for (const tool of result.tools) {
44
+ const toolName = `${prefix}_${tool.name}`;
45
+ const schema = this.jsonSchemaToZod(tool.inputSchema);
46
+ tools[toolName] = {
47
+ id: toolName,
48
+ description: tool.description || `Tool ${tool.name}`,
49
+ inputSchema: schema,
50
+ execute: async (args) => {
51
+ return await client.callTool(tool.name, args);
52
+ }
53
+ };
54
+ }
55
+ return tools;
56
+ }
57
+ jsonSchemaToZod(schema) {
58
+ try {
59
+ const { parseSchema } = __require("json-schema-to-zod");
60
+ const zodSchemaString = parseSchema(schema);
61
+ return new Function("z", "return " + zodSchemaString)(this.z);
62
+ } catch (error) {
63
+ console.warn("[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:", error);
64
+ return this.z.record(this.z.any()).optional().describe("Dynamic Input");
65
+ }
66
+ }
67
+ /**
68
+ * Fetches tools from the MCP server and converts them to Mastra tools.
69
+ */
70
+ async getTools() {
71
+ const isMultiSession = typeof this.client.getClients === "function";
72
+ const clients = isMultiSession ? this.client.getClients() : [this.client];
73
+ const results = await Promise.all(
74
+ clients.map(async (client) => {
75
+ try {
76
+ return await this.transformTools(client);
77
+ } catch (error) {
78
+ console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);
79
+ return {};
80
+ }
81
+ })
82
+ );
83
+ return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});
84
+ }
85
+ /**
86
+ * Convenience static method to fetch tools in a single line.
87
+ */
88
+ static async getTools(client, options = {}) {
89
+ return new _MastraAdapter(client, options).getTools();
90
+ }
91
+ };
92
+
93
+ exports.MastraAdapter = MastraAdapter;
94
+ //# sourceMappingURL=mastra-adapter.js.map
95
+ //# sourceMappingURL=mastra-adapter.js.map