@mcp-ts/sdk 1.3.5 → 1.3.7
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/agui-adapter.d.mts +1 -1
- package/dist/adapters/agui-adapter.d.ts +1 -1
- package/dist/adapters/agui-adapter.js +2 -2
- package/dist/adapters/agui-adapter.js.map +1 -1
- package/dist/adapters/agui-adapter.mjs +2 -2
- package/dist/adapters/agui-adapter.mjs.map +1 -1
- package/dist/adapters/agui-middleware.d.mts +1 -1
- package/dist/adapters/agui-middleware.d.ts +1 -1
- package/dist/adapters/agui-middleware.js.map +1 -1
- package/dist/adapters/agui-middleware.mjs.map +1 -1
- package/dist/adapters/ai-adapter.d.mts +1 -1
- package/dist/adapters/ai-adapter.d.ts +1 -1
- package/dist/adapters/ai-adapter.js +1 -1
- package/dist/adapters/ai-adapter.js.map +1 -1
- package/dist/adapters/ai-adapter.mjs +1 -1
- package/dist/adapters/ai-adapter.mjs.map +1 -1
- package/dist/adapters/langchain-adapter.d.mts +1 -1
- package/dist/adapters/langchain-adapter.d.ts +1 -1
- package/dist/adapters/langchain-adapter.js +1 -1
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langchain-adapter.mjs +1 -1
- package/dist/adapters/langchain-adapter.mjs.map +1 -1
- package/dist/adapters/mastra-adapter.d.mts +1 -1
- package/dist/adapters/mastra-adapter.d.ts +1 -1
- package/dist/adapters/mastra-adapter.js +1 -1
- package/dist/adapters/mastra-adapter.js.map +1 -1
- package/dist/adapters/mastra-adapter.mjs +1 -1
- package/dist/adapters/mastra-adapter.mjs.map +1 -1
- package/dist/bin/mcp-ts.d.mts +1 -0
- package/dist/bin/mcp-ts.d.ts +1 -0
- package/dist/bin/mcp-ts.js +105 -0
- package/dist/bin/mcp-ts.js.map +1 -0
- package/dist/bin/mcp-ts.mjs +82 -0
- package/dist/bin/mcp-ts.mjs.map +1 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +411 -90
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +350 -91
- package/dist/index.mjs.map +1 -1
- package/dist/{multi-session-client-BYLarghq.d.ts → multi-session-client-CHE8QpVE.d.ts} +75 -5
- package/dist/{multi-session-client-CzhMkE0k.d.mts → multi-session-client-CQsRbxYI.d.mts} +75 -5
- package/dist/server/index.d.mts +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +394 -90
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +350 -91
- package/dist/server/index.mjs.map +1 -1
- package/dist/shared/index.js +10 -2
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs +10 -2
- package/dist/shared/index.mjs.map +1 -1
- package/package.json +19 -6
- package/src/adapters/agui-adapter.ts +222 -222
- package/src/adapters/ai-adapter.ts +115 -115
- package/src/adapters/langchain-adapter.ts +127 -127
- package/src/adapters/mastra-adapter.ts +126 -126
- package/src/bin/mcp-ts.ts +102 -0
- package/src/server/handlers/nextjs-handler.ts +12 -12
- package/src/server/handlers/sse-handler.ts +61 -61
- package/src/server/mcp/multi-session-client.ts +135 -39
- package/src/server/storage/file-backend.ts +4 -16
- package/src/server/storage/index.ts +68 -25
- package/src/server/storage/memory-backend.ts +7 -16
- package/src/server/storage/redis-backend.ts +12 -16
- package/src/server/storage/sqlite-backend.ts +3 -6
- package/src/server/storage/supabase-backend.ts +228 -0
- package/src/shared/event-routing.ts +28 -28
- package/src/shared/utils.ts +22 -0
- package/supabase/migrations/20260330195700_install_mcp_sessions.sql +84 -0
|
@@ -29,7 +29,7 @@ var AIAdapter = class _AIAdapter {
|
|
|
29
29
|
return Object.fromEntries(
|
|
30
30
|
result.tools.map((tool) => {
|
|
31
31
|
const serverId = typeof client.getServerId === "function" ? client.getServerId() : void 0;
|
|
32
|
-
const prefix = this.options.prefix ?? serverId?.replace(/-/g, "") ?? "mcp";
|
|
32
|
+
const prefix = this.options.prefix ?? serverId?.replace(/-/g, "").substring(0, 8) ?? "mcp";
|
|
33
33
|
return [
|
|
34
34
|
`tool_${prefix}_${tool.name}`,
|
|
35
35
|
{
|
|
@@ -1 +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,
|
|
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';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { JSONSchema7 } from 'json-schema';\nimport type { ToolSet } from 'ai';\n\nexport interface AIAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n}\n\n/**\n * Adapter to use MCP tools with the Vercel AI SDK.\n */\nexport class AIAdapter {\n private jsonSchema: typeof import('ai').jsonSchema | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: AIAdapterOptions = {}\n ) { }\n\n\n\n /**\n * Lazy-loads the jsonSchema function from the AI SDK.\n */\n private async ensureJsonSchema() {\n if (!this.jsonSchema) {\n const { jsonSchema } = await import('ai');\n this.jsonSchema = jsonSchema;\n }\n }\n\n private async transformTools(client: MCPClient): Promise<ToolSet> {\n // Safe check for isConnected method (duck typing for bundler compatibility)\n const isConnected = typeof client.isConnected === 'function'\n ? client.isConnected()\n : false;\n\n if (!isConnected) {\n return {};\n }\n\n const result = await client.listTools();\n\n // @ts-ignore: ToolSet type inference can be tricky with dynamic imports\n return Object.fromEntries(\n result.tools.map((tool) => {\n // Safe access to getServerId\n const serverId = typeof client.getServerId === 'function'\n ? client.getServerId()\n : undefined;\n const prefix = this.options.prefix ?? serverId?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n return [\n `tool_${prefix}_${tool.name}`,\n {\n description: tool.description,\n inputSchema: this.jsonSchema!(tool.inputSchema as JSONSchema7),\n execute: async (args: any) => {\n try {\n const response = await client.callTool(tool.name, args);\n return response;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Tool execution failed: ${errorMessage}`);\n }\n }\n }\n ];\n })\n );\n }\n\n /**\n * Fetches tools from the client(s) and converts them to AI SDK tools.\n */\n async getTools(): Promise<ToolSet> {\n await this.ensureJsonSchema();\n\n // Use duck typing instead of instanceof to handle module bundling issues\n // MultiSessionClient has getClients(), MCPClient does not\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n // For multi-client, we log and continue.\n // This is safer than throwing.\n const serverId = typeof client.getServerId === 'function'\n ? client.getServerId() ?? 'unknown'\n : 'unknown';\n console.error(`[AIAdapter] Failed to fetch tools from ${serverId}:`, error);\n return {};\n }\n })\n );\n\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: AIAdapterOptions = {}): Promise<ToolSet> {\n return new AIAdapter(client, options).getTools();\n }\n}\n"]}
|
|
@@ -27,7 +27,7 @@ var AIAdapter = class _AIAdapter {
|
|
|
27
27
|
return Object.fromEntries(
|
|
28
28
|
result.tools.map((tool) => {
|
|
29
29
|
const serverId = typeof client.getServerId === "function" ? client.getServerId() : void 0;
|
|
30
|
-
const prefix = this.options.prefix ?? serverId?.replace(/-/g, "") ?? "mcp";
|
|
30
|
+
const prefix = this.options.prefix ?? serverId?.replace(/-/g, "").substring(0, 8) ?? "mcp";
|
|
31
31
|
return [
|
|
32
32
|
`tool_${prefix}_${tool.name}`,
|
|
33
33
|
{
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/ai-adapter.ts"],"names":[],"mappings":"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","file":"ai-adapter.mjs","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { JSONSchema7 } from 'json-schema';\nimport type { ToolSet } from 'ai';\n\nexport interface AIAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n}\n\n/**\n * Adapter to use MCP tools with the Vercel AI SDK.\n */\nexport class AIAdapter {\n private jsonSchema: typeof import('ai').jsonSchema | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: AIAdapterOptions = {}\n ) { }\n\n\n\n /**\n * Lazy-loads the jsonSchema function from the AI SDK.\n */\n private async ensureJsonSchema() {\n if (!this.jsonSchema) {\n const { jsonSchema } = await import('ai');\n this.jsonSchema = jsonSchema;\n }\n }\n\n private async transformTools(client: MCPClient): Promise<ToolSet> {\n // Safe check for isConnected method (duck typing for bundler compatibility)\n const isConnected = typeof client.isConnected === 'function'\n ? client.isConnected()\n : false;\n\n if (!isConnected) {\n return {};\n }\n\n const result = await client.listTools();\n\n // @ts-ignore: ToolSet type inference can be tricky with dynamic imports\n return Object.fromEntries(\n result.tools.map((tool) => {\n // Safe access to getServerId\n const serverId = typeof client.getServerId === 'function'\n ? client.getServerId()\n : undefined;\n const prefix = this.options.prefix ?? serverId?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n return [\n `tool_${prefix}_${tool.name}`,\n {\n description: tool.description,\n inputSchema: this.jsonSchema!(tool.inputSchema as JSONSchema7),\n execute: async (args: any) => {\n try {\n const response = await client.callTool(tool.name, args);\n return response;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Tool execution failed: ${errorMessage}`);\n }\n }\n }\n ];\n })\n );\n }\n\n /**\n * Fetches tools from the client(s) and converts them to AI SDK tools.\n */\n async getTools(): Promise<ToolSet> {\n await this.ensureJsonSchema();\n\n // Use duck typing instead of instanceof to handle module bundling issues\n // MultiSessionClient has getClients(), MCPClient does not\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n // For multi-client, we log and continue.\n // This is safer than throwing.\n const serverId = typeof client.getServerId === 'function'\n ? client.getServerId() ?? 'unknown'\n : 'unknown';\n console.error(`[AIAdapter] Failed to fetch tools from ${serverId}:`, error);\n return {};\n }\n })\n );\n\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: AIAdapterOptions = {}): Promise<ToolSet> {\n return new AIAdapter(client, options).getTools();\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-
|
|
1
|
+
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CQsRbxYI.mjs';
|
|
2
2
|
import { StructuredTool } from '@langchain/core/tools';
|
|
3
3
|
import '../events-CK3N--3g.mjs';
|
|
4
4
|
import '@modelcontextprotocol/sdk/types.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-
|
|
1
|
+
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CHE8QpVE.js';
|
|
2
2
|
import { StructuredTool } from '@langchain/core/tools';
|
|
3
3
|
import '../events-CK3N--3g.js';
|
|
4
4
|
import '@modelcontextprotocol/sdk/types.js';
|
|
@@ -41,7 +41,7 @@ var LangChainAdapter = class _LangChainAdapter {
|
|
|
41
41
|
}
|
|
42
42
|
await this.ensureDependencies();
|
|
43
43
|
const result = await client.listTools();
|
|
44
|
-
const prefix = this.options.prefix ?? client.getServerId() ?? "mcp";
|
|
44
|
+
const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, "").substring(0, 8) ?? "mcp";
|
|
45
45
|
return result.tools.map((tool) => {
|
|
46
46
|
const schema = this.jsonSchemaToZod(tool.inputSchema);
|
|
47
47
|
return new this.DynamicStructuredTool({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/langchain-adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAuBO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAI1B,WAAA,CACY,MAAA,EACA,OAAA,GAAmC,EAAC,EAC9C;AAFU,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AALZ,IAAA,aAAA,CAAA,IAAA,EAAQ,uBAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,GAAA,CAAA;AAAA,EAKJ;AAAA;AAAA;AAAA;AAAA,EAKJ,MAAc,kBAAA,GAAqB;AAC/B,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC7B,MAAA,IAAI;AACA,QAAA,MAAM,SAAA,GAAY,MAAM,OAAO,uBAAuB,CAAA;AACtD,QAAA,IAAA,CAAK,wBAAwB,SAAA,CAAU,qBAAA;AAEvC,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA;AAAA,MACjB,SAAS,KAAA,EAAO;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACN;AAAA,SAEJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,eAAe,MAAA,EAA8C;AACvE,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AACtC,IAAA,MAAM,
|
|
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';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { DynamicStructuredTool, StructuredTool } from '@langchain/core/tools';\nimport type { z } from 'zod';\n\nexport interface LangChainAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n\n /**\n * Whether to simplify error messages returned to the LLM.\n * If true, returns \"Error: <message>\" string instead of throwing.\n * @default false\n */\n simplifyErrors?: boolean;\n}\n\n/**\n * Adapter to use MCP tools within LangChain/LangGraph agents.\n */\nexport class LangChainAdapter {\n private DynamicStructuredTool: typeof DynamicStructuredTool | undefined;\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: LangChainAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads LangChain and Zod dependencies\n */\n private async ensureDependencies() {\n if (!this.DynamicStructuredTool) {\n try {\n const langchain = await import('@langchain/core/tools');\n this.DynamicStructuredTool = langchain.DynamicStructuredTool;\n\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'LangChain dependencies not installed. Install with:\\n' +\n ' npm install @langchain/core zod'\n );\n }\n }\n }\n\n private async transformTools(client: MCPClient): Promise<StructuredTool[]> {\n if (!client.isConnected()) {\n return [];\n }\n\n await this.ensureDependencies();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n\n return result.tools.map((tool) => {\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n return new this.DynamicStructuredTool!({\n name: `${prefix}_${tool.name}`,\n description: tool.description || `Tool ${tool.name}`,\n schema: schema,\n func: async (args: any) => {\n try {\n return await client.callTool(tool.name, args);\n } catch (error: any) {\n if (this.options.simplifyErrors) {\n return `Error: ${error.message}`;\n }\n throw error;\n }\n },\n });\n });\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error) {\n // Fallback: Accept any object if conversion fails\n console.warn('[LangChainAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to LangChain StructuredTools.\n */\n async getTools(): Promise<StructuredTool[]> {\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[LangChainAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return [];\n }\n })\n );\n return results.flat();\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: LangChainAdapterOptions = {}): Promise<StructuredTool[]> {\n return new LangChainAdapter(client, options).getTools();\n }\n}\n"]}
|
|
@@ -39,7 +39,7 @@ var LangChainAdapter = class _LangChainAdapter {
|
|
|
39
39
|
}
|
|
40
40
|
await this.ensureDependencies();
|
|
41
41
|
const result = await client.listTools();
|
|
42
|
-
const prefix = this.options.prefix ?? client.getServerId() ?? "mcp";
|
|
42
|
+
const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, "").substring(0, 8) ?? "mcp";
|
|
43
43
|
return result.tools.map((tool) => {
|
|
44
44
|
const schema = this.jsonSchemaToZod(tool.inputSchema);
|
|
45
45
|
return new this.DynamicStructuredTool({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/langchain-adapter.ts"],"names":[],"mappings":";;;;;;;;;;;AAuBO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAI1B,WAAA,CACY,MAAA,EACA,OAAA,GAAmC,EAAC,EAC9C;AAFU,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AALZ,IAAA,aAAA,CAAA,IAAA,EAAQ,uBAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,GAAA,CAAA;AAAA,EAKJ;AAAA;AAAA;AAAA;AAAA,EAKJ,MAAc,kBAAA,GAAqB;AAC/B,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC7B,MAAA,IAAI;AACA,QAAA,MAAM,SAAA,GAAY,MAAM,OAAO,uBAAuB,CAAA;AACtD,QAAA,IAAA,CAAK,wBAAwB,SAAA,CAAU,qBAAA;AAEvC,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA;AAAA,MACjB,SAAS,KAAA,EAAO;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACN;AAAA,SAEJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAc,eAAe,MAAA,EAA8C;AACvE,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,KAAK,kBAAA,EAAmB;AAE9B,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AACtC,IAAA,MAAM,
|
|
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';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { DynamicStructuredTool, StructuredTool } from '@langchain/core/tools';\nimport type { z } from 'zod';\n\nexport interface LangChainAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n\n /**\n * Whether to simplify error messages returned to the LLM.\n * If true, returns \"Error: <message>\" string instead of throwing.\n * @default false\n */\n simplifyErrors?: boolean;\n}\n\n/**\n * Adapter to use MCP tools within LangChain/LangGraph agents.\n */\nexport class LangChainAdapter {\n private DynamicStructuredTool: typeof DynamicStructuredTool | undefined;\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: LangChainAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads LangChain and Zod dependencies\n */\n private async ensureDependencies() {\n if (!this.DynamicStructuredTool) {\n try {\n const langchain = await import('@langchain/core/tools');\n this.DynamicStructuredTool = langchain.DynamicStructuredTool;\n\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'LangChain dependencies not installed. Install with:\\n' +\n ' npm install @langchain/core zod'\n );\n }\n }\n }\n\n private async transformTools(client: MCPClient): Promise<StructuredTool[]> {\n if (!client.isConnected()) {\n return [];\n }\n\n await this.ensureDependencies();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n\n return result.tools.map((tool) => {\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n return new this.DynamicStructuredTool!({\n name: `${prefix}_${tool.name}`,\n description: tool.description || `Tool ${tool.name}`,\n schema: schema,\n func: async (args: any) => {\n try {\n return await client.callTool(tool.name, args);\n } catch (error: any) {\n if (this.options.simplifyErrors) {\n return `Error: ${error.message}`;\n }\n throw error;\n }\n },\n });\n });\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error) {\n // Fallback: Accept any object if conversion fails\n console.warn('[LangChainAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to LangChain StructuredTools.\n */\n async getTools(): Promise<StructuredTool[]> {\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[LangChainAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return [];\n }\n })\n );\n return results.flat();\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: LangChainAdapterOptions = {}): Promise<StructuredTool[]> {\n return new LangChainAdapter(client, options).getTools();\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-
|
|
1
|
+
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CQsRbxYI.mjs';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import '../events-CK3N--3g.mjs';
|
|
4
4
|
import '@modelcontextprotocol/sdk/types.js';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-
|
|
1
|
+
import { M as MCPClient, a as MultiSessionClient } from '../multi-session-client-CHE8QpVE.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import '../events-CK3N--3g.js';
|
|
4
4
|
import '@modelcontextprotocol/sdk/types.js';
|
|
@@ -38,7 +38,7 @@ var MastraAdapter = class _MastraAdapter {
|
|
|
38
38
|
}
|
|
39
39
|
await this.ensureZod();
|
|
40
40
|
const result = await client.listTools();
|
|
41
|
-
const prefix = this.options.prefix ?? client.getServerId() ?? "mcp";
|
|
41
|
+
const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, "").substring(0, 8) ?? "mcp";
|
|
42
42
|
const tools = {};
|
|
43
43
|
for (const tool of result.tools) {
|
|
44
44
|
const toolName = `${prefix}_${tool.name}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AA0BO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EAGvB,WAAA,CACY,MAAA,EACA,OAAA,GAAgC,EAAC,EAC3C;AAFU,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAJZ,IAAA,aAAA,CAAA,IAAA,EAAQ,GAAA,CAAA;AAAA,EAKJ;AAAA;AAAA;AAAA;AAAA,EAKJ,MAAc,SAAA,GAAY;AACtB,IAAA,IAAI,CAAC,KAAK,CAAA,EAAG;AACT,MAAA,IAAI;AACA,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA;AAAA,MACjB,SAAS,KAAA,EAAO;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACN;AAAA,SAEJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAIA,MAAc,eAAe,MAAA,EAAwD;AACjF,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,KAAK,SAAA,EAAU;AAErB,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AACtC,IAAA,MAAM,
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":"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","file":"mastra-adapter.js","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { z } from 'zod';\n\nexport interface MastraAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n}\n\n/**\n * Interface definition for a Mastra tool since we might not have the SDK installed.\n * Based on Mastra documentation.\n */\nexport interface MastraTool {\n id: string;\n description: string;\n inputSchema: z.ZodType<any>;\n execute: (args: any) => Promise<any>;\n}\n\n/**\n * Adapter to use MCP tools within Mastra agents.\n */\nexport class MastraAdapter {\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: MastraAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads Zod dependency\n */\n private async ensureZod() {\n if (!this.z) {\n try {\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'zod is not installed. Install with:\\n' +\n ' npm install zod'\n );\n }\n }\n }\n\n\n\n private async transformTools(client: MCPClient): Promise<Record<string, MastraTool>> {\n if (!client.isConnected()) {\n return {};\n }\n\n await this.ensureZod();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const tools: Record<string, MastraTool> = {};\n\n for (const tool of result.tools) {\n const toolName = `${prefix}_${tool.name}`;\n\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n tools[toolName] = {\n id: toolName,\n description: tool.description || `Tool ${tool.name}`,\n inputSchema: schema,\n execute: async (args: any) => {\n return await client.callTool(tool.name, args);\n },\n };\n }\n\n return tools;\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error) {\n // Fallback: Accept any object if conversion fails\n console.warn('[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to Mastra tools.\n */\n async getTools(): Promise<Record<string, MastraTool>> {\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return {};\n }\n })\n );\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: MastraAdapterOptions = {}): Promise<Record<string, MastraTool>> {\n return new MastraAdapter(client, options).getTools();\n }\n}\n"]}
|
|
@@ -36,7 +36,7 @@ var MastraAdapter = class _MastraAdapter {
|
|
|
36
36
|
}
|
|
37
37
|
await this.ensureZod();
|
|
38
38
|
const result = await client.listTools();
|
|
39
|
-
const prefix = this.options.prefix ?? client.getServerId() ?? "mcp";
|
|
39
|
+
const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, "").substring(0, 8) ?? "mcp";
|
|
40
40
|
const tools = {};
|
|
41
41
|
for (const tool of result.tools) {
|
|
42
42
|
const toolName = `${prefix}_${tool.name}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":";;;;;;;;;;;AA0BO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EAGvB,WAAA,CACY,MAAA,EACA,OAAA,GAAgC,EAAC,EAC3C;AAFU,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAJZ,IAAA,aAAA,CAAA,IAAA,EAAQ,GAAA,CAAA;AAAA,EAKJ;AAAA;AAAA;AAAA;AAAA,EAKJ,MAAc,SAAA,GAAY;AACtB,IAAA,IAAI,CAAC,KAAK,CAAA,EAAG;AACT,MAAA,IAAI;AACA,QAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAK,CAAA;AAC9B,QAAA,IAAA,CAAK,IAAI,GAAA,CAAI,CAAA;AAAA,MACjB,SAAS,KAAA,EAAO;AACZ,QAAA,MAAM,IAAI,KAAA;AAAA,UACN;AAAA,SAEJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAIA,MAAc,eAAe,MAAA,EAAwD;AACjF,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAY,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,KAAK,SAAA,EAAU;AAErB,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,EAAU;AACtC,IAAA,MAAM,
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":"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","file":"mastra-adapter.mjs","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\nimport type { z } from 'zod';\n\nexport interface MastraAdapterOptions {\n /** \n * Prefix for tool names to avoid collision with other tools.\n * Defaults to the client's serverId.\n */\n prefix?: string;\n}\n\n/**\n * Interface definition for a Mastra tool since we might not have the SDK installed.\n * Based on Mastra documentation.\n */\nexport interface MastraTool {\n id: string;\n description: string;\n inputSchema: z.ZodType<any>;\n execute: (args: any) => Promise<any>;\n}\n\n/**\n * Adapter to use MCP tools within Mastra agents.\n */\nexport class MastraAdapter {\n private z: typeof z | undefined;\n\n constructor(\n private client: MCPClient | MultiSessionClient,\n private options: MastraAdapterOptions = {}\n ) { }\n\n /**\n * Lazy-loads Zod dependency\n */\n private async ensureZod() {\n if (!this.z) {\n try {\n const zod = await import('zod');\n this.z = zod.z;\n } catch (error) {\n throw new Error(\n 'zod is not installed. Install with:\\n' +\n ' npm install zod'\n );\n }\n }\n }\n\n\n\n private async transformTools(client: MCPClient): Promise<Record<string, MastraTool>> {\n if (!client.isConnected()) {\n return {};\n }\n\n await this.ensureZod();\n\n const result = await client.listTools();\n const prefix = this.options.prefix ?? client.getServerId()?.replace(/-/g, '').substring(0, 8) ?? 'mcp';\n const tools: Record<string, MastraTool> = {};\n\n for (const tool of result.tools) {\n const toolName = `${prefix}_${tool.name}`;\n\n // In a real implementation, you would use a library like 'json-schema-to-zod'\n const schema = this.jsonSchemaToZod(tool.inputSchema);\n\n tools[toolName] = {\n id: toolName,\n description: tool.description || `Tool ${tool.name}`,\n inputSchema: schema,\n execute: async (args: any) => {\n return await client.callTool(tool.name, args);\n },\n };\n }\n\n return tools;\n }\n\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\n try {\n const { parseSchema } = require('json-schema-to-zod');\n const zodSchemaString = parseSchema(schema);\n // eslint-disable-next-line\n return new Function('z', 'return ' + zodSchemaString)(this.z);\n } catch (error) {\n // Fallback: Accept any object if conversion fails\n console.warn('[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\n }\n }\n\n /**\n * Fetches tools from the MCP server and converts them to Mastra tools.\n */\n async getTools(): Promise<Record<string, MastraTool>> {\n // Use duck typing instead of instanceof to handle module bundling issues\n const isMultiSession = typeof (this.client as any).getClients === 'function';\n const clients = isMultiSession\n ? (this.client as MultiSessionClient).getClients()\n : [this.client as MCPClient];\n\n const results = await Promise.all(\n clients.map(async (client) => {\n try {\n return await this.transformTools(client);\n } catch (error) {\n console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\n return {};\n }\n })\n );\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\n }\n\n /**\n * Convenience static method to fetch tools in a single line.\n */\n static async getTools(client: MCPClient | MultiSessionClient, options: MastraAdapterOptions = {}): Promise<Record<string, MastraTool>> {\n return new MastraAdapter(client, options).getTools();\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var fs = require('fs');
|
|
5
|
+
var path = require('path');
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
|
|
26
|
+
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
27
|
+
|
|
28
|
+
async function run() {
|
|
29
|
+
const args = process.argv.slice(2);
|
|
30
|
+
const command = args[0];
|
|
31
|
+
if (command === "supabase-init") {
|
|
32
|
+
await initSupabase();
|
|
33
|
+
} else {
|
|
34
|
+
showHelp();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function showHelp() {
|
|
38
|
+
console.log(`
|
|
39
|
+
\u{1F680} MCP-TS CLI Utility
|
|
40
|
+
Usage: npx mcp-ts <command>
|
|
41
|
+
|
|
42
|
+
Commands:
|
|
43
|
+
supabase-init Initialize Supabase migrations in your project
|
|
44
|
+
`);
|
|
45
|
+
}
|
|
46
|
+
async function initSupabase() {
|
|
47
|
+
console.log("\u{1F680} Initializing Supabase storage for MCP-TS...");
|
|
48
|
+
const pkgRoot = path__namespace.resolve(__dirname, "../..");
|
|
49
|
+
const sourceDir = path__namespace.join(pkgRoot, "supabase", "migrations");
|
|
50
|
+
if (!fs__namespace.existsSync(sourceDir)) {
|
|
51
|
+
console.error(`\u274C Error: Could not find migration files in package at: ${sourceDir}`);
|
|
52
|
+
console.log("Please ensure you are running this from a project where @mcp-ts/sdk is installed.");
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
const targetDir = path__namespace.join(process.cwd(), "supabase", "migrations");
|
|
56
|
+
try {
|
|
57
|
+
if (!fs__namespace.existsSync(targetDir)) {
|
|
58
|
+
fs__namespace.mkdirSync(targetDir, { recursive: true });
|
|
59
|
+
console.log(`\u{1F4C1} Created directory: ${targetDir}`);
|
|
60
|
+
}
|
|
61
|
+
const files = fs__namespace.readdirSync(sourceDir);
|
|
62
|
+
let copiedCount = 0;
|
|
63
|
+
for (const file of files) {
|
|
64
|
+
if (file.endsWith(".sql")) {
|
|
65
|
+
const srcPath = path__namespace.join(sourceDir, file);
|
|
66
|
+
const destPath = path__namespace.join(targetDir, file);
|
|
67
|
+
if (fs__namespace.existsSync(destPath)) {
|
|
68
|
+
console.log(`\u23ED\uFE0F Skipping existing migration: ${file}`);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
fs__namespace.copyFileSync(srcPath, destPath);
|
|
72
|
+
console.log(`\u2705 Copied: ${file}`);
|
|
73
|
+
copiedCount++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (copiedCount > 0) {
|
|
77
|
+
console.log("\n\u2728 Database migrations successfully initialized!");
|
|
78
|
+
console.log("\nNext steps:");
|
|
79
|
+
console.log("1. Link your Supabase project:");
|
|
80
|
+
console.log(" npx supabase link --project-ref <your-project-id>");
|
|
81
|
+
console.log("\n2. Push the migrations to your remote database:");
|
|
82
|
+
console.log(" npx supabase db push");
|
|
83
|
+
console.log("\n3. Add your Supabase credentials to .env:");
|
|
84
|
+
console.log(" SUPABASE_URL=https://<your-project-id>.supabase.co");
|
|
85
|
+
console.log(" SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>");
|
|
86
|
+
console.log("\n\u26A0\uFE0F Important: Use the service_role key (not the anon key) for server-side storage.");
|
|
87
|
+
console.log(" The service_role key bypasses RLS policies and is required for mcp-ts to work correctly.");
|
|
88
|
+
console.log(" Find it in: Supabase Dashboard -> Project Settings -> API -> service_role");
|
|
89
|
+
} else if (files.length > 0) {
|
|
90
|
+
console.log("\n\u{1F44D} All migration files are already present in your project.");
|
|
91
|
+
console.log(" Ensure SUPABASE_SERVICE_ROLE_KEY (not SUPABASE_ANON_KEY) is set in your .env");
|
|
92
|
+
} else {
|
|
93
|
+
console.log("\u26A0\uFE0F No migration files found to copy.");
|
|
94
|
+
}
|
|
95
|
+
} catch (error) {
|
|
96
|
+
console.error(`\u274C Error initializing Supabase: ${error.message}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
run().catch((err) => {
|
|
101
|
+
console.error(err);
|
|
102
|
+
process.exit(1);
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=mcp-ts.js.map
|
|
105
|
+
//# sourceMappingURL=mcp-ts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bin/mcp-ts.ts"],"names":["path","fs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,eAAe,GAAA,GAAM;AACjB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AAEtB,EAAA,IAAI,YAAY,eAAA,EAAiB;AAC7B,IAAA,MAAM,YAAA,EAAa;AAAA,EACvB,CAAA,MAAO;AACH,IAAA,QAAA,EAAS;AAAA,EACb;AACJ;AAEA,SAAS,QAAA,GAAW;AAChB,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;;AAAA;AAAA;AAAA,IAAA,CAMX,CAAA;AACL;AAEA,eAAe,YAAA,GAAe;AAC1B,EAAA,OAAA,CAAQ,IAAI,uDAAgD,CAAA;AAK5D,EAAA,MAAM,OAAA,GAAeA,eAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAiBA,eAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,YAAY,CAAA;AAE7D,EAAA,IAAI,CAAIC,aAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4DAAA,EAA0D,SAAS,CAAA,CAAE,CAAA;AACnF,IAAA,OAAA,CAAQ,IAAI,mFAAmF,CAAA;AAC/F,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAClB;AAEA,EAAA,MAAM,YAAiBD,eAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAY,YAAY,CAAA;AAEnE,EAAA,IAAI;AACA,IAAA,IAAI,CAAIC,aAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3B,MAAGA,aAAA,CAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAAWA,0BAAY,SAAS,CAAA;AACtC,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACvB,QAAA,MAAM,OAAA,GAAeD,eAAA,CAAA,IAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AACzC,QAAA,MAAM,QAAA,GAAgBA,eAAA,CAAA,IAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AAE1C,QAAA,IAAOC,aAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAAoC,IAAI,CAAA,CAAE,CAAA;AACtD,UAAA;AAAA,QACJ;AAEA,QAAGA,aAAA,CAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAa,IAAI,CAAA,CAAE,CAAA;AAC/B,QAAA,WAAA,EAAA;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,IAAI,cAAc,CAAA,EAAG;AACjB,MAAA,OAAA,CAAQ,IAAI,wDAAmD,CAAA;AAC/D,MAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAC3B,MAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,MAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,MAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AACrC,MAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AACzD,MAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AACnE,MAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,MAAA,OAAA,CAAQ,IAAI,iGAAuF,CAAA;AACnG,MAAA,OAAA,CAAQ,IAAI,6FAA6F,CAAA;AACzG,MAAA,OAAA,CAAQ,IAAI,8EAA8E,CAAA;AAAA,IAC9F,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAI,sEAA+D,CAAA;AAC3E,MAAA,OAAA,CAAQ,IAAI,iFAAiF,CAAA;AAAA,IACjG,CAAA,MAAO;AACH,MAAA,OAAA,CAAQ,IAAI,iDAAuC,CAAA;AAAA,IACvD;AAAA,EAEJ,SAAS,KAAA,EAAY;AACjB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAkC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC/D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAClB;AACJ;AAEA,GAAA,EAAI,CAAE,MAAM,CAAA,GAAA,KAAO;AACf,EAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAClB,CAAC,CAAA","file":"mcp-ts.js","sourcesContent":["#!/usr/bin/env node\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * MCP-TS CLI Utility\r\n * \r\n * Provides helper commands for users of the @mcp-ts/sdk library.\r\n */\r\nasync function run() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n if (command === 'supabase-init') {\r\n await initSupabase();\r\n } else {\r\n showHelp();\r\n }\r\n}\r\n\r\nfunction showHelp() {\r\n console.log(`\r\n🚀 MCP-TS CLI Utility\r\nUsage: npx mcp-ts <command>\r\n\r\nCommands:\r\n supabase-init Initialize Supabase migrations in your project\r\n `);\r\n}\r\n\r\nasync function initSupabase() {\r\n console.log('🚀 Initializing Supabase storage for MCP-TS...');\r\n\r\n // When running from dist/bin/mcp-ts.js (compiled), __dirname is dist/bin.\r\n // The supabase/ migrations are at the root of the package.\r\n // We need to look up two levels to find 'supabase' folder in the package.\r\n const pkgRoot = path.resolve(__dirname, '../..');\r\n const sourceDir = path.join(pkgRoot, 'supabase', 'migrations');\r\n \r\n if (!fs.existsSync(sourceDir)) {\r\n console.error(`❌ Error: Could not find migration files in package at: ${sourceDir}`);\r\n console.log('Please ensure you are running this from a project where @mcp-ts/sdk is installed.');\r\n process.exit(1);\r\n }\r\n\r\n const targetDir = path.join(process.cwd(), 'supabase', 'migrations');\r\n\r\n try {\r\n if (!fs.existsSync(targetDir)) {\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n console.log(`📁 Created directory: ${targetDir}`);\r\n }\r\n\r\n const files = fs.readdirSync(sourceDir);\r\n let copiedCount = 0;\r\n\r\n for (const file of files) {\r\n if (file.endsWith('.sql')) {\r\n const srcPath = path.join(sourceDir, file);\r\n const destPath = path.join(targetDir, file);\r\n \r\n if (fs.existsSync(destPath)) {\r\n console.log(`⏭️ Skipping existing migration: ${file}`);\r\n continue;\r\n }\r\n\r\n fs.copyFileSync(srcPath, destPath);\r\n console.log(`✅ Copied: ${file}`);\r\n copiedCount++;\r\n }\r\n }\r\n\r\n if (copiedCount > 0) {\r\n console.log('\\n✨ Database migrations successfully initialized!');\r\n console.log('\\nNext steps:');\r\n console.log('1. Link your Supabase project:');\r\n console.log(' npx supabase link --project-ref <your-project-id>');\r\n console.log('\\n2. Push the migrations to your remote database:');\r\n console.log(' npx supabase db push');\r\n console.log('\\n3. Add your Supabase credentials to .env:');\r\n console.log(' SUPABASE_URL=https://<your-project-id>.supabase.co');\r\n console.log(' SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>');\r\n console.log('\\n⚠️ Important: Use the service_role key (not the anon key) for server-side storage.');\r\n console.log(' The service_role key bypasses RLS policies and is required for mcp-ts to work correctly.');\r\n console.log(' Find it in: Supabase Dashboard -> Project Settings -> API -> service_role');\r\n } else if (files.length > 0) {\r\n console.log('\\n👍 All migration files are already present in your project.');\r\n console.log(' Ensure SUPABASE_SERVICE_ROLE_KEY (not SUPABASE_ANON_KEY) is set in your .env');\r\n } else {\r\n console.log('⚠️ No migration files found to copy.');\r\n }\r\n\r\n } catch (error: any) {\r\n console.error(`❌ Error initializing Supabase: ${error.message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nrun().catch(err => {\r\n console.error(err);\r\n process.exit(1);\r\n});\r\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
|
|
5
|
+
async function run() {
|
|
6
|
+
const args = process.argv.slice(2);
|
|
7
|
+
const command = args[0];
|
|
8
|
+
if (command === "supabase-init") {
|
|
9
|
+
await initSupabase();
|
|
10
|
+
} else {
|
|
11
|
+
showHelp();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function showHelp() {
|
|
15
|
+
console.log(`
|
|
16
|
+
\u{1F680} MCP-TS CLI Utility
|
|
17
|
+
Usage: npx mcp-ts <command>
|
|
18
|
+
|
|
19
|
+
Commands:
|
|
20
|
+
supabase-init Initialize Supabase migrations in your project
|
|
21
|
+
`);
|
|
22
|
+
}
|
|
23
|
+
async function initSupabase() {
|
|
24
|
+
console.log("\u{1F680} Initializing Supabase storage for MCP-TS...");
|
|
25
|
+
const pkgRoot = path.resolve(__dirname, "../..");
|
|
26
|
+
const sourceDir = path.join(pkgRoot, "supabase", "migrations");
|
|
27
|
+
if (!fs.existsSync(sourceDir)) {
|
|
28
|
+
console.error(`\u274C Error: Could not find migration files in package at: ${sourceDir}`);
|
|
29
|
+
console.log("Please ensure you are running this from a project where @mcp-ts/sdk is installed.");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const targetDir = path.join(process.cwd(), "supabase", "migrations");
|
|
33
|
+
try {
|
|
34
|
+
if (!fs.existsSync(targetDir)) {
|
|
35
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
36
|
+
console.log(`\u{1F4C1} Created directory: ${targetDir}`);
|
|
37
|
+
}
|
|
38
|
+
const files = fs.readdirSync(sourceDir);
|
|
39
|
+
let copiedCount = 0;
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
if (file.endsWith(".sql")) {
|
|
42
|
+
const srcPath = path.join(sourceDir, file);
|
|
43
|
+
const destPath = path.join(targetDir, file);
|
|
44
|
+
if (fs.existsSync(destPath)) {
|
|
45
|
+
console.log(`\u23ED\uFE0F Skipping existing migration: ${file}`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
fs.copyFileSync(srcPath, destPath);
|
|
49
|
+
console.log(`\u2705 Copied: ${file}`);
|
|
50
|
+
copiedCount++;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (copiedCount > 0) {
|
|
54
|
+
console.log("\n\u2728 Database migrations successfully initialized!");
|
|
55
|
+
console.log("\nNext steps:");
|
|
56
|
+
console.log("1. Link your Supabase project:");
|
|
57
|
+
console.log(" npx supabase link --project-ref <your-project-id>");
|
|
58
|
+
console.log("\n2. Push the migrations to your remote database:");
|
|
59
|
+
console.log(" npx supabase db push");
|
|
60
|
+
console.log("\n3. Add your Supabase credentials to .env:");
|
|
61
|
+
console.log(" SUPABASE_URL=https://<your-project-id>.supabase.co");
|
|
62
|
+
console.log(" SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>");
|
|
63
|
+
console.log("\n\u26A0\uFE0F Important: Use the service_role key (not the anon key) for server-side storage.");
|
|
64
|
+
console.log(" The service_role key bypasses RLS policies and is required for mcp-ts to work correctly.");
|
|
65
|
+
console.log(" Find it in: Supabase Dashboard -> Project Settings -> API -> service_role");
|
|
66
|
+
} else if (files.length > 0) {
|
|
67
|
+
console.log("\n\u{1F44D} All migration files are already present in your project.");
|
|
68
|
+
console.log(" Ensure SUPABASE_SERVICE_ROLE_KEY (not SUPABASE_ANON_KEY) is set in your .env");
|
|
69
|
+
} else {
|
|
70
|
+
console.log("\u26A0\uFE0F No migration files found to copy.");
|
|
71
|
+
}
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.error(`\u274C Error initializing Supabase: ${error.message}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
run().catch((err) => {
|
|
78
|
+
console.error(err);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=mcp-ts.mjs.map
|
|
82
|
+
//# sourceMappingURL=mcp-ts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/bin/mcp-ts.ts"],"names":[],"mappings":";;;;AASA,eAAe,GAAA,GAAM;AACjB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AAEtB,EAAA,IAAI,YAAY,eAAA,EAAiB;AAC7B,IAAA,MAAM,YAAA,EAAa;AAAA,EACvB,CAAA,MAAO;AACH,IAAA,QAAA,EAAS;AAAA,EACb;AACJ;AAEA,SAAS,QAAA,GAAW;AAChB,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA;AAAA;;AAAA;AAAA;AAAA,IAAA,CAMX,CAAA;AACL;AAEA,eAAe,YAAA,GAAe;AAC1B,EAAA,OAAA,CAAQ,IAAI,uDAAgD,CAAA;AAK5D,EAAA,MAAM,OAAA,GAAe,IAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAiB,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,YAAY,CAAA;AAE7D,EAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4DAAA,EAA0D,SAAS,CAAA,CAAE,CAAA;AACnF,IAAA,OAAA,CAAQ,IAAI,mFAAmF,CAAA;AAC/F,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAClB;AAEA,EAAA,MAAM,YAAiB,IAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAY,YAAY,CAAA;AAEnE,EAAA,IAAI;AACA,IAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3B,MAAG,EAAA,CAAA,SAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAAW,eAAY,SAAS,CAAA;AACtC,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACvB,QAAA,MAAM,OAAA,GAAe,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AACzC,QAAA,MAAM,QAAA,GAAgB,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AAE1C,QAAA,IAAO,EAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAAoC,IAAI,CAAA,CAAE,CAAA;AACtD,UAAA;AAAA,QACJ;AAEA,QAAG,EAAA,CAAA,YAAA,CAAa,SAAS,QAAQ,CAAA;AACjC,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAa,IAAI,CAAA,CAAE,CAAA;AAC/B,QAAA,WAAA,EAAA;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,IAAI,cAAc,CAAA,EAAG;AACjB,MAAA,OAAA,CAAQ,IAAI,wDAAmD,CAAA;AAC/D,MAAA,OAAA,CAAQ,IAAI,eAAe,CAAA;AAC3B,MAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,MAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,MAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AACrC,MAAA,OAAA,CAAQ,IAAI,6CAA6C,CAAA;AACzD,MAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AACnE,MAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,MAAA,OAAA,CAAQ,IAAI,iGAAuF,CAAA;AACnG,MAAA,OAAA,CAAQ,IAAI,6FAA6F,CAAA;AACzG,MAAA,OAAA,CAAQ,IAAI,8EAA8E,CAAA;AAAA,IAC9F,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAI,sEAA+D,CAAA;AAC3E,MAAA,OAAA,CAAQ,IAAI,iFAAiF,CAAA;AAAA,IACjG,CAAA,MAAO;AACH,MAAA,OAAA,CAAQ,IAAI,iDAAuC,CAAA;AAAA,IACvD;AAAA,EAEJ,SAAS,KAAA,EAAY;AACjB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAkC,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC/D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAClB;AACJ;AAEA,GAAA,EAAI,CAAE,MAAM,CAAA,GAAA,KAAO;AACf,EAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAClB,CAAC,CAAA","file":"mcp-ts.mjs","sourcesContent":["#!/usr/bin/env node\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * MCP-TS CLI Utility\r\n * \r\n * Provides helper commands for users of the @mcp-ts/sdk library.\r\n */\r\nasync function run() {\r\n const args = process.argv.slice(2);\r\n const command = args[0];\r\n\r\n if (command === 'supabase-init') {\r\n await initSupabase();\r\n } else {\r\n showHelp();\r\n }\r\n}\r\n\r\nfunction showHelp() {\r\n console.log(`\r\n🚀 MCP-TS CLI Utility\r\nUsage: npx mcp-ts <command>\r\n\r\nCommands:\r\n supabase-init Initialize Supabase migrations in your project\r\n `);\r\n}\r\n\r\nasync function initSupabase() {\r\n console.log('🚀 Initializing Supabase storage for MCP-TS...');\r\n\r\n // When running from dist/bin/mcp-ts.js (compiled), __dirname is dist/bin.\r\n // The supabase/ migrations are at the root of the package.\r\n // We need to look up two levels to find 'supabase' folder in the package.\r\n const pkgRoot = path.resolve(__dirname, '../..');\r\n const sourceDir = path.join(pkgRoot, 'supabase', 'migrations');\r\n \r\n if (!fs.existsSync(sourceDir)) {\r\n console.error(`❌ Error: Could not find migration files in package at: ${sourceDir}`);\r\n console.log('Please ensure you are running this from a project where @mcp-ts/sdk is installed.');\r\n process.exit(1);\r\n }\r\n\r\n const targetDir = path.join(process.cwd(), 'supabase', 'migrations');\r\n\r\n try {\r\n if (!fs.existsSync(targetDir)) {\r\n fs.mkdirSync(targetDir, { recursive: true });\r\n console.log(`📁 Created directory: ${targetDir}`);\r\n }\r\n\r\n const files = fs.readdirSync(sourceDir);\r\n let copiedCount = 0;\r\n\r\n for (const file of files) {\r\n if (file.endsWith('.sql')) {\r\n const srcPath = path.join(sourceDir, file);\r\n const destPath = path.join(targetDir, file);\r\n \r\n if (fs.existsSync(destPath)) {\r\n console.log(`⏭️ Skipping existing migration: ${file}`);\r\n continue;\r\n }\r\n\r\n fs.copyFileSync(srcPath, destPath);\r\n console.log(`✅ Copied: ${file}`);\r\n copiedCount++;\r\n }\r\n }\r\n\r\n if (copiedCount > 0) {\r\n console.log('\\n✨ Database migrations successfully initialized!');\r\n console.log('\\nNext steps:');\r\n console.log('1. Link your Supabase project:');\r\n console.log(' npx supabase link --project-ref <your-project-id>');\r\n console.log('\\n2. Push the migrations to your remote database:');\r\n console.log(' npx supabase db push');\r\n console.log('\\n3. Add your Supabase credentials to .env:');\r\n console.log(' SUPABASE_URL=https://<your-project-id>.supabase.co');\r\n console.log(' SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>');\r\n console.log('\\n⚠️ Important: Use the service_role key (not the anon key) for server-side storage.');\r\n console.log(' The service_role key bypasses RLS policies and is required for mcp-ts to work correctly.');\r\n console.log(' Find it in: Supabase Dashboard -> Project Settings -> API -> service_role');\r\n } else if (files.length > 0) {\r\n console.log('\\n👍 All migration files are already present in your project.');\r\n console.log(' Ensure SUPABASE_SERVICE_ROLE_KEY (not SUPABASE_ANON_KEY) is set in your .env');\r\n } else {\r\n console.log('⚠️ No migration files found to copy.');\r\n }\r\n\r\n } catch (error: any) {\r\n console.error(`❌ Error initializing Supabase: ${error.message}`);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nrun().catch(err => {\r\n console.error(err);\r\n process.exit(1);\r\n});\r\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { M as MCPClient, a as MultiSessionClient, S as StorageOAuthClientProvider } from './multi-session-client-
|
|
1
|
+
export { M as MCPClient, a as MultiSessionClient, S as StorageOAuthClientProvider } from './multi-session-client-CQsRbxYI.mjs';
|
|
2
2
|
export { A as AuthenticationError, C as ConfigurationError, a as ConnectionError, I as InvalidStateError, M as McpError, N as NotConnectedError, R as RpcErrorCode, b as RpcErrorCodes, S as SessionNotFoundError, c as SessionValidationError, T as ToolExecutionError, U as UnauthorizedError, s as sanitizeServerLabel } from './utils-0qmYrqoa.mjs';
|
|
3
3
|
export { ClientMetadata, NextMcpHandlerOptions, SSEConnectionManager, SSEHandlerOptions, StorageBackend, createNextMcpHandler, createSSEHandler, storage } from './server/index.mjs';
|
|
4
4
|
export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, M as McpConnectionEvent, c as McpConnectionState, d as McpObservabilityEvent } from './events-CK3N--3g.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { M as MCPClient, a as MultiSessionClient, S as StorageOAuthClientProvider } from './multi-session-client-
|
|
1
|
+
export { M as MCPClient, a as MultiSessionClient, S as StorageOAuthClientProvider } from './multi-session-client-CHE8QpVE.js';
|
|
2
2
|
export { A as AuthenticationError, C as ConfigurationError, a as ConnectionError, I as InvalidStateError, M as McpError, N as NotConnectedError, R as RpcErrorCode, b as RpcErrorCodes, S as SessionNotFoundError, c as SessionValidationError, T as ToolExecutionError, U as UnauthorizedError, s as sanitizeServerLabel } from './utils-0qmYrqoa.js';
|
|
3
3
|
export { ClientMetadata, NextMcpHandlerOptions, SSEConnectionManager, SSEHandlerOptions, StorageBackend, createNextMcpHandler, createSSEHandler, storage } from './server/index.js';
|
|
4
4
|
export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, M as McpConnectionEvent, c as McpConnectionState, d as McpObservabilityEvent } from './events-CK3N--3g.js';
|