cast-code 1.0.1 → 1.0.3

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.
@@ -28,6 +28,12 @@ let McpRegistryService = class McpRegistryService {
28
28
  registerMcp(name, config) {
29
29
  this.configs.set(name, config);
30
30
  }
31
+ getConfig(name) {
32
+ return this.configs.get(name);
33
+ }
34
+ getAuthUrl(name) {
35
+ return this.mcpClient.getAuthUrl(name);
36
+ }
31
37
  async connectMcp(name) {
32
38
  const config = this.configs.get(name);
33
39
  if (!config) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/mcp/services/mcp-registry.service.ts"],"sourcesContent":["import { Injectable, OnModuleDestroy } from '@nestjs/common';\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { StructuredTool } from '@langchain/core/tools';\nimport { McpClientService } from './mcp-client.service';\nimport { McpConfig, McpServerSummary } from '../types';\n\n@Injectable()\nexport class McpRegistryService implements OnModuleDestroy {\n private configs: Map<string, McpConfig> = new Map();\n\n constructor(private readonly mcpClient: McpClientService) {}\n\n onModuleDestroy() {\n this.mcpClient.disconnectAll();\n }\n\n registerMcp(name: string, config: McpConfig) {\n this.configs.set(name, config);\n }\n\n async connectMcp(name: string): Promise<boolean> {\n const config = this.configs.get(name);\n\n if (!config) {\n return false;\n }\n\n return this.mcpClient.connect(name, config);\n }\n\n async connectAll(): Promise<Map<string, boolean>> {\n const results = new Map<string, boolean>();\n\n for (const name of this.configs.keys()) {\n results.set(name, await this.connectMcp(name));\n }\n\n return results;\n }\n\n getMcpTools(name: string): StructuredTool[] {\n const mcpTools = this.mcpClient.getTools(name);\n\n return mcpTools.map((mcpTool) => {\n const schema = this.convertSchemaToZod(mcpTool.inputSchema);\n\n return tool(\n async (input) => {\n try {\n const result = await this.mcpClient.callTool(name, mcpTool.name, input);\n return JSON.stringify(result, null, 2);\n } catch (error) {\n return `Error calling ${mcpTool.name}: ${(error as Error).message}`;\n }\n },\n {\n name: `${name}_${mcpTool.name}`,\n description: mcpTool.description,\n schema,\n },\n );\n });\n }\n\n getAllMcpTools(): StructuredTool[] {\n const allTools: StructuredTool[] = [];\n\n for (const name of this.configs.keys()) {\n allTools.push(...this.getMcpTools(name));\n }\n\n return allTools;\n }\n\n private convertSchemaToZod(schema: Record<string, unknown>): z.ZodObject<any> {\n const properties = (schema.properties || {}) as Record<string, any>;\n const required = (schema.required || []) as string[];\n const zodShape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, prop] of Object.entries(properties)) {\n let zodType: z.ZodTypeAny;\n\n switch (prop.type) {\n case 'string':\n zodType = z.string();\n break;\n case 'number':\n zodType = z.number();\n break;\n case 'boolean':\n zodType = z.boolean();\n break;\n case 'array':\n zodType = z.array(z.any());\n break;\n case 'object':\n zodType = z.record(z.any());\n break;\n default:\n zodType = z.any();\n }\n\n if (prop.description) {\n zodType = zodType.describe(prop.description);\n }\n\n if (!required.includes(key)) {\n zodType = zodType.optional();\n }\n\n zodShape[key] = zodType;\n }\n\n return z.object(zodShape);\n }\n\n getServerSummaries(): McpServerSummary[] {\n const summaries: McpServerSummary[] = [];\n\n for (const [name, config] of this.configs) {\n const status = this.mcpClient.getStatus(name);\n const tools = this.mcpClient.getTools(name);\n\n summaries.push({\n name,\n transport: config.type,\n status,\n toolCount: tools.length,\n toolNames: tools.map(t => `${name}_${t.name}`),\n toolDescriptions: tools.map(t => ({\n name: `${name}_${t.name}`,\n description: t.description,\n })),\n });\n }\n\n return summaries;\n }\n\n getDiscoveryTools(): StructuredTool[] {\n return [\n tool(\n async () => {\n const summaries = this.getServerSummaries();\n if (summaries.length === 0) {\n return 'No MCP servers configured. Use the /mcp add command in the REPL to connect one.';\n }\n return summaries.map(s =>\n `${s.name} (${s.transport}) — ${s.status} — ${s.toolCount} tools`\n ).join('\\n');\n },\n {\n name: 'mcp_list_servers',\n description: 'List all connected MCP servers with their status, transport type, and tool count',\n schema: z.object({}),\n },\n ),\n tool(\n async (input) => {\n const summaries = this.getServerSummaries();\n\n if (input.server) {\n const server = summaries.find(s => s.name === input.server);\n if (!server) {\n return `Server \"${input.server}\" not found. Available: ${summaries.map(s => s.name).join(', ')}`;\n }\n if (server.toolDescriptions.length === 0) {\n return `Server \"${input.server}\" has no tools available (status: ${server.status})`;\n }\n return server.toolDescriptions.map(t =>\n `${t.name}: ${t.description}`\n ).join('\\n');\n }\n\n if (summaries.length === 0) {\n return 'No MCP servers configured.';\n }\n\n const sections: string[] = [];\n for (const s of summaries) {\n const header = `## ${s.name} (${s.transport}, ${s.status}) — ${s.toolCount} tools`;\n const toolList = s.toolDescriptions.map(t => `- ${t.name}: ${t.description}`).join('\\n');\n sections.push(`${header}\\n${toolList || '(no tools)'}`);\n }\n return sections.join('\\n\\n');\n },\n {\n name: 'mcp_list_tools',\n description: 'List tools from a specific MCP server or all servers. Optionally filter by server name.',\n schema: z.object({\n server: z.string().optional().describe('Server name to filter tools for. If omitted, lists all tools from all servers.'),\n }),\n },\n ),\n ];\n }\n\n loadConfigs(configs: Record<string, McpConfig>) {\n for (const [name, config] of Object.entries(configs)) {\n this.registerMcp(name, config);\n }\n }\n\n async addAndConnect(name: string, config: McpConfig): Promise<boolean> {\n this.registerMcp(name, config);\n return await this.connectMcp(name);\n }\n\n isConnected(name: string): boolean {\n return this.mcpClient.getStatus(name) === 'connected';\n }\n\n getConnectedServers(): string[] {\n const summaries = this.getServerSummaries();\n return summaries\n .filter(s => s.status === 'connected')\n .map(s => s.name);\n }\n}\n"],"names":["McpRegistryService","onModuleDestroy","mcpClient","disconnectAll","registerMcp","name","config","configs","set","connectMcp","get","connect","connectAll","results","Map","keys","getMcpTools","mcpTools","getTools","map","mcpTool","schema","convertSchemaToZod","inputSchema","tool","input","result","callTool","JSON","stringify","error","message","description","getAllMcpTools","allTools","push","properties","required","zodShape","key","prop","Object","entries","zodType","type","z","string","number","boolean","array","any","record","describe","includes","optional","object","getServerSummaries","summaries","status","getStatus","tools","transport","toolCount","length","toolNames","t","toolDescriptions","getDiscoveryTools","s","join","server","find","sections","header","toolList","loadConfigs","addAndConnect","isConnected","getConnectedServers","filter"],"mappings":";;;;+BAQaA;;;eAAAA;;;wBAR+B;uBACvB;qBACH;kCAEe;;;;;;;;;;AAI1B,IAAA,AAAMA,qBAAN,MAAMA;IAKXC,kBAAkB;QAChB,IAAI,CAACC,SAAS,CAACC,aAAa;IAC9B;IAEAC,YAAYC,IAAY,EAAEC,MAAiB,EAAE;QAC3C,IAAI,CAACC,OAAO,CAACC,GAAG,CAACH,MAAMC;IACzB;IAEA,MAAMG,WAAWJ,IAAY,EAAoB;QAC/C,MAAMC,SAAS,IAAI,CAACC,OAAO,CAACG,GAAG,CAACL;QAEhC,IAAI,CAACC,QAAQ;YACX,OAAO;QACT;QAEA,OAAO,IAAI,CAACJ,SAAS,CAACS,OAAO,CAACN,MAAMC;IACtC;IAEA,MAAMM,aAA4C;QAChD,MAAMC,UAAU,IAAIC;QAEpB,KAAK,MAAMT,QAAQ,IAAI,CAACE,OAAO,CAACQ,IAAI,GAAI;YACtCF,QAAQL,GAAG,CAACH,MAAM,MAAM,IAAI,CAACI,UAAU,CAACJ;QAC1C;QAEA,OAAOQ;IACT;IAEAG,YAAYX,IAAY,EAAoB;QAC1C,MAAMY,WAAW,IAAI,CAACf,SAAS,CAACgB,QAAQ,CAACb;QAEzC,OAAOY,SAASE,GAAG,CAAC,CAACC;YACnB,MAAMC,SAAS,IAAI,CAACC,kBAAkB,CAACF,QAAQG,WAAW;YAE1D,OAAOC,IAAAA,WAAI,EACT,OAAOC;gBACL,IAAI;oBACF,MAAMC,SAAS,MAAM,IAAI,CAACxB,SAAS,CAACyB,QAAQ,CAACtB,MAAMe,QAAQf,IAAI,EAAEoB;oBACjE,OAAOG,KAAKC,SAAS,CAACH,QAAQ,MAAM;gBACtC,EAAE,OAAOI,OAAO;oBACd,OAAO,CAAC,cAAc,EAAEV,QAAQf,IAAI,CAAC,EAAE,EAAE,AAACyB,MAAgBC,OAAO,EAAE;gBACrE;YACF,GACA;gBACE1B,MAAM,GAAGA,KAAK,CAAC,EAAEe,QAAQf,IAAI,EAAE;gBAC/B2B,aAAaZ,QAAQY,WAAW;gBAChCX;YACF;QAEJ;IACF;IAEAY,iBAAmC;QACjC,MAAMC,WAA6B,EAAE;QAErC,KAAK,MAAM7B,QAAQ,IAAI,CAACE,OAAO,CAACQ,IAAI,GAAI;YACtCmB,SAASC,IAAI,IAAI,IAAI,CAACnB,WAAW,CAACX;QACpC;QAEA,OAAO6B;IACT;IAEQZ,mBAAmBD,MAA+B,EAAoB;QAC5E,MAAMe,aAAcf,OAAOe,UAAU,IAAI,CAAC;QAC1C,MAAMC,WAAYhB,OAAOgB,QAAQ,IAAI,EAAE;QACvC,MAAMC,WAAyC,CAAC;QAEhD,KAAK,MAAM,CAACC,KAAKC,KAAK,IAAIC,OAAOC,OAAO,CAACN,YAAa;YACpD,IAAIO;YAEJ,OAAQH,KAAKI,IAAI;gBACf,KAAK;oBACHD,UAAUE,MAAC,CAACC,MAAM;oBAClB;gBACF,KAAK;oBACHH,UAAUE,MAAC,CAACE,MAAM;oBAClB;gBACF,KAAK;oBACHJ,UAAUE,MAAC,CAACG,OAAO;oBACnB;gBACF,KAAK;oBACHL,UAAUE,MAAC,CAACI,KAAK,CAACJ,MAAC,CAACK,GAAG;oBACvB;gBACF,KAAK;oBACHP,UAAUE,MAAC,CAACM,MAAM,CAACN,MAAC,CAACK,GAAG;oBACxB;gBACF;oBACEP,UAAUE,MAAC,CAACK,GAAG;YACnB;YAEA,IAAIV,KAAKR,WAAW,EAAE;gBACpBW,UAAUA,QAAQS,QAAQ,CAACZ,KAAKR,WAAW;YAC7C;YAEA,IAAI,CAACK,SAASgB,QAAQ,CAACd,MAAM;gBAC3BI,UAAUA,QAAQW,QAAQ;YAC5B;YAEAhB,QAAQ,CAACC,IAAI,GAAGI;QAClB;QAEA,OAAOE,MAAC,CAACU,MAAM,CAACjB;IAClB;IAEAkB,qBAAyC;QACvC,MAAMC,YAAgC,EAAE;QAExC,KAAK,MAAM,CAACpD,MAAMC,OAAO,IAAI,IAAI,CAACC,OAAO,CAAE;YACzC,MAAMmD,SAAS,IAAI,CAACxD,SAAS,CAACyD,SAAS,CAACtD;YACxC,MAAMuD,QAAQ,IAAI,CAAC1D,SAAS,CAACgB,QAAQ,CAACb;YAEtCoD,UAAUtB,IAAI,CAAC;gBACb9B;gBACAwD,WAAWvD,OAAOsC,IAAI;gBACtBc;gBACAI,WAAWF,MAAMG,MAAM;gBACvBC,WAAWJ,MAAMzC,GAAG,CAAC8C,CAAAA,IAAK,GAAG5D,KAAK,CAAC,EAAE4D,EAAE5D,IAAI,EAAE;gBAC7C6D,kBAAkBN,MAAMzC,GAAG,CAAC8C,CAAAA,IAAM,CAAA;wBAChC5D,MAAM,GAAGA,KAAK,CAAC,EAAE4D,EAAE5D,IAAI,EAAE;wBACzB2B,aAAaiC,EAAEjC,WAAW;oBAC5B,CAAA;YACF;QACF;QAEA,OAAOyB;IACT;IAEAU,oBAAsC;QACpC,OAAO;YACL3C,IAAAA,WAAI,EACF;gBACE,MAAMiC,YAAY,IAAI,CAACD,kBAAkB;gBACzC,IAAIC,UAAUM,MAAM,KAAK,GAAG;oBAC1B,OAAO;gBACT;gBACA,OAAON,UAAUtC,GAAG,CAACiD,CAAAA,IACnB,GAAGA,EAAE/D,IAAI,CAAC,EAAE,EAAE+D,EAAEP,SAAS,CAAC,IAAI,EAAEO,EAAEV,MAAM,CAAC,GAAG,EAAEU,EAAEN,SAAS,CAAC,MAAM,CAAC,EACjEO,IAAI,CAAC;YACT,GACA;gBACEhE,MAAM;gBACN2B,aAAa;gBACbX,QAAQwB,MAAC,CAACU,MAAM,CAAC,CAAC;YACpB;YAEF/B,IAAAA,WAAI,EACF,OAAOC;gBACL,MAAMgC,YAAY,IAAI,CAACD,kBAAkB;gBAEzC,IAAI/B,MAAM6C,MAAM,EAAE;oBAChB,MAAMA,SAASb,UAAUc,IAAI,CAACH,CAAAA,IAAKA,EAAE/D,IAAI,KAAKoB,MAAM6C,MAAM;oBAC1D,IAAI,CAACA,QAAQ;wBACX,OAAO,CAAC,QAAQ,EAAE7C,MAAM6C,MAAM,CAAC,wBAAwB,EAAEb,UAAUtC,GAAG,CAACiD,CAAAA,IAAKA,EAAE/D,IAAI,EAAEgE,IAAI,CAAC,OAAO;oBAClG;oBACA,IAAIC,OAAOJ,gBAAgB,CAACH,MAAM,KAAK,GAAG;wBACxC,OAAO,CAAC,QAAQ,EAAEtC,MAAM6C,MAAM,CAAC,kCAAkC,EAAEA,OAAOZ,MAAM,CAAC,CAAC,CAAC;oBACrF;oBACA,OAAOY,OAAOJ,gBAAgB,CAAC/C,GAAG,CAAC8C,CAAAA,IACjC,GAAGA,EAAE5D,IAAI,CAAC,EAAE,EAAE4D,EAAEjC,WAAW,EAAE,EAC7BqC,IAAI,CAAC;gBACT;gBAEA,IAAIZ,UAAUM,MAAM,KAAK,GAAG;oBAC1B,OAAO;gBACT;gBAEA,MAAMS,WAAqB,EAAE;gBAC7B,KAAK,MAAMJ,KAAKX,UAAW;oBACzB,MAAMgB,SAAS,CAAC,GAAG,EAAEL,EAAE/D,IAAI,CAAC,EAAE,EAAE+D,EAAEP,SAAS,CAAC,EAAE,EAAEO,EAAEV,MAAM,CAAC,IAAI,EAAEU,EAAEN,SAAS,CAAC,MAAM,CAAC;oBAClF,MAAMY,WAAWN,EAAEF,gBAAgB,CAAC/C,GAAG,CAAC8C,CAAAA,IAAK,CAAC,EAAE,EAAEA,EAAE5D,IAAI,CAAC,EAAE,EAAE4D,EAAEjC,WAAW,EAAE,EAAEqC,IAAI,CAAC;oBACnFG,SAASrC,IAAI,CAAC,GAAGsC,OAAO,EAAE,EAAEC,YAAY,cAAc;gBACxD;gBACA,OAAOF,SAASH,IAAI,CAAC;YACvB,GACA;gBACEhE,MAAM;gBACN2B,aAAa;gBACbX,QAAQwB,MAAC,CAACU,MAAM,CAAC;oBACfe,QAAQzB,MAAC,CAACC,MAAM,GAAGQ,QAAQ,GAAGF,QAAQ,CAAC;gBACzC;YACF;SAEH;IACH;IAEAuB,YAAYpE,OAAkC,EAAE;QAC9C,KAAK,MAAM,CAACF,MAAMC,OAAO,IAAImC,OAAOC,OAAO,CAACnC,SAAU;YACpD,IAAI,CAACH,WAAW,CAACC,MAAMC;QACzB;IACF;IAEA,MAAMsE,cAAcvE,IAAY,EAAEC,MAAiB,EAAoB;QACrE,IAAI,CAACF,WAAW,CAACC,MAAMC;QACvB,OAAO,MAAM,IAAI,CAACG,UAAU,CAACJ;IAC/B;IAEAwE,YAAYxE,IAAY,EAAW;QACjC,OAAO,IAAI,CAACH,SAAS,CAACyD,SAAS,CAACtD,UAAU;IAC5C;IAEAyE,sBAAgC;QAC9B,MAAMrB,YAAY,IAAI,CAACD,kBAAkB;QACzC,OAAOC,UACJsB,MAAM,CAACX,CAAAA,IAAKA,EAAEV,MAAM,KAAK,aACzBvC,GAAG,CAACiD,CAAAA,IAAKA,EAAE/D,IAAI;IACpB;IA/MA,YAAY,AAAiBH,SAA2B,CAAE;aAA7BA,YAAAA;aAFrBK,UAAkC,IAAIO;IAEa;AAgN7D"}
1
+ {"version":3,"sources":["../../../../src/modules/mcp/services/mcp-registry.service.ts"],"sourcesContent":["import { Injectable, OnModuleDestroy } from '@nestjs/common';\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { StructuredTool } from '@langchain/core/tools';\nimport { McpClientService } from './mcp-client.service';\nimport { McpConfig, McpServerSummary } from '../types';\n\n@Injectable()\nexport class McpRegistryService implements OnModuleDestroy {\n private configs: Map<string, McpConfig> = new Map();\n\n constructor(private readonly mcpClient: McpClientService) {}\n\n onModuleDestroy() {\n this.mcpClient.disconnectAll();\n }\n\n registerMcp(name: string, config: McpConfig) {\n this.configs.set(name, config);\n }\n\n getConfig(name: string): McpConfig | undefined {\n return this.configs.get(name);\n }\n\n getAuthUrl(name: string): string | undefined {\n return this.mcpClient.getAuthUrl(name);\n }\n\n async connectMcp(name: string): Promise<boolean> {\n const config = this.configs.get(name);\n\n if (!config) {\n return false;\n }\n\n return this.mcpClient.connect(name, config);\n }\n\n async connectAll(): Promise<Map<string, boolean>> {\n const results = new Map<string, boolean>();\n\n for (const name of this.configs.keys()) {\n results.set(name, await this.connectMcp(name));\n }\n\n return results;\n }\n\n getMcpTools(name: string): StructuredTool[] {\n const mcpTools = this.mcpClient.getTools(name);\n\n return mcpTools.map((mcpTool) => {\n const schema = this.convertSchemaToZod(mcpTool.inputSchema);\n\n return tool(\n async (input) => {\n try {\n const result = await this.mcpClient.callTool(name, mcpTool.name, input);\n return JSON.stringify(result, null, 2);\n } catch (error) {\n return `Error calling ${mcpTool.name}: ${(error as Error).message}`;\n }\n },\n {\n name: `${name}_${mcpTool.name}`,\n description: mcpTool.description,\n schema,\n },\n );\n });\n }\n\n getAllMcpTools(): StructuredTool[] {\n const allTools: StructuredTool[] = [];\n\n for (const name of this.configs.keys()) {\n allTools.push(...this.getMcpTools(name));\n }\n\n return allTools;\n }\n\n private convertSchemaToZod(schema: Record<string, unknown>): z.ZodObject<any> {\n const properties = (schema.properties || {}) as Record<string, any>;\n const required = (schema.required || []) as string[];\n const zodShape: Record<string, z.ZodTypeAny> = {};\n\n for (const [key, prop] of Object.entries(properties)) {\n let zodType: z.ZodTypeAny;\n\n switch (prop.type) {\n case 'string':\n zodType = z.string();\n break;\n case 'number':\n zodType = z.number();\n break;\n case 'boolean':\n zodType = z.boolean();\n break;\n case 'array':\n zodType = z.array(z.any());\n break;\n case 'object':\n zodType = z.record(z.any());\n break;\n default:\n zodType = z.any();\n }\n\n if (prop.description) {\n zodType = zodType.describe(prop.description);\n }\n\n if (!required.includes(key)) {\n zodType = zodType.optional();\n }\n\n zodShape[key] = zodType;\n }\n\n return z.object(zodShape);\n }\n\n getServerSummaries(): McpServerSummary[] {\n const summaries: McpServerSummary[] = [];\n\n for (const [name, config] of this.configs) {\n const status = this.mcpClient.getStatus(name);\n const tools = this.mcpClient.getTools(name);\n\n summaries.push({\n name,\n transport: config.type,\n status,\n toolCount: tools.length,\n toolNames: tools.map(t => `${name}_${t.name}`),\n toolDescriptions: tools.map(t => ({\n name: `${name}_${t.name}`,\n description: t.description,\n })),\n });\n }\n\n return summaries;\n }\n\n getDiscoveryTools(): StructuredTool[] {\n return [\n tool(\n async () => {\n const summaries = this.getServerSummaries();\n if (summaries.length === 0) {\n return 'No MCP servers configured. Use the /mcp add command in the REPL to connect one.';\n }\n return summaries.map(s =>\n `${s.name} (${s.transport}) — ${s.status} — ${s.toolCount} tools`\n ).join('\\n');\n },\n {\n name: 'mcp_list_servers',\n description: 'List all connected MCP servers with their status, transport type, and tool count',\n schema: z.object({}),\n },\n ),\n tool(\n async (input) => {\n const summaries = this.getServerSummaries();\n\n if (input.server) {\n const server = summaries.find(s => s.name === input.server);\n if (!server) {\n return `Server \"${input.server}\" not found. Available: ${summaries.map(s => s.name).join(', ')}`;\n }\n if (server.toolDescriptions.length === 0) {\n return `Server \"${input.server}\" has no tools available (status: ${server.status})`;\n }\n return server.toolDescriptions.map(t =>\n `${t.name}: ${t.description}`\n ).join('\\n');\n }\n\n if (summaries.length === 0) {\n return 'No MCP servers configured.';\n }\n\n const sections: string[] = [];\n for (const s of summaries) {\n const header = `## ${s.name} (${s.transport}, ${s.status}) — ${s.toolCount} tools`;\n const toolList = s.toolDescriptions.map(t => `- ${t.name}: ${t.description}`).join('\\n');\n sections.push(`${header}\\n${toolList || '(no tools)'}`);\n }\n return sections.join('\\n\\n');\n },\n {\n name: 'mcp_list_tools',\n description: 'List tools from a specific MCP server or all servers. Optionally filter by server name.',\n schema: z.object({\n server: z.string().optional().describe('Server name to filter tools for. If omitted, lists all tools from all servers.'),\n }),\n },\n ),\n ];\n }\n\n loadConfigs(configs: Record<string, McpConfig>) {\n for (const [name, config] of Object.entries(configs)) {\n this.registerMcp(name, config);\n }\n }\n\n async addAndConnect(name: string, config: McpConfig): Promise<boolean> {\n this.registerMcp(name, config);\n return await this.connectMcp(name);\n }\n\n isConnected(name: string): boolean {\n return this.mcpClient.getStatus(name) === 'connected';\n }\n\n getConnectedServers(): string[] {\n const summaries = this.getServerSummaries();\n return summaries\n .filter(s => s.status === 'connected')\n .map(s => s.name);\n }\n}\n"],"names":["McpRegistryService","onModuleDestroy","mcpClient","disconnectAll","registerMcp","name","config","configs","set","getConfig","get","getAuthUrl","connectMcp","connect","connectAll","results","Map","keys","getMcpTools","mcpTools","getTools","map","mcpTool","schema","convertSchemaToZod","inputSchema","tool","input","result","callTool","JSON","stringify","error","message","description","getAllMcpTools","allTools","push","properties","required","zodShape","key","prop","Object","entries","zodType","type","z","string","number","boolean","array","any","record","describe","includes","optional","object","getServerSummaries","summaries","status","getStatus","tools","transport","toolCount","length","toolNames","t","toolDescriptions","getDiscoveryTools","s","join","server","find","sections","header","toolList","loadConfigs","addAndConnect","isConnected","getConnectedServers","filter"],"mappings":"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"}
@@ -9,11 +9,54 @@ Object.defineProperty(exports, "McpCommandsService", {
9
9
  }
10
10
  });
11
11
  const _common = require("@nestjs/common");
12
+ const _fs = /*#__PURE__*/ _interop_require_wildcard(require("fs"));
13
+ const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
12
14
  const _theme = require("../../utils/theme");
13
15
  const _mcpregistryservice = require("../../../mcp/services/mcp-registry.service");
14
16
  const _mcpclientservice = require("../../../mcp/services/mcp-client.service");
15
17
  const _promptswithesc = require("../../utils/prompts-with-esc");
16
18
  const _mcptemplates = require("../../../mcp/catalog/mcp-templates");
19
+ function _getRequireWildcardCache(nodeInterop) {
20
+ if (typeof WeakMap !== "function") return null;
21
+ var cacheBabelInterop = new WeakMap();
22
+ var cacheNodeInterop = new WeakMap();
23
+ return (_getRequireWildcardCache = function(nodeInterop) {
24
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
25
+ })(nodeInterop);
26
+ }
27
+ function _interop_require_wildcard(obj, nodeInterop) {
28
+ if (!nodeInterop && obj && obj.__esModule) {
29
+ return obj;
30
+ }
31
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
32
+ return {
33
+ default: obj
34
+ };
35
+ }
36
+ var cache = _getRequireWildcardCache(nodeInterop);
37
+ if (cache && cache.has(obj)) {
38
+ return cache.get(obj);
39
+ }
40
+ var newObj = {
41
+ __proto__: null
42
+ };
43
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
44
+ for(var key in obj){
45
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
46
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
47
+ if (desc && (desc.get || desc.set)) {
48
+ Object.defineProperty(newObj, key, desc);
49
+ } else {
50
+ newObj[key] = obj[key];
51
+ }
52
+ }
53
+ }
54
+ newObj.default = obj;
55
+ if (cache) {
56
+ cache.set(obj, newObj);
57
+ }
58
+ return newObj;
59
+ }
17
60
  function _ts_decorate(decorators, target, key, desc) {
18
61
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
62
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -26,38 +69,36 @@ function _ts_metadata(k, v) {
26
69
  let McpCommandsService = class McpCommandsService {
27
70
  async cmdMcp(args, smartInput) {
28
71
  const sub = args[0] || 'menu';
29
- const w = (s)=>process.stdout.write(s);
72
+ if (sub === 'menu') {
73
+ try {
74
+ await this.showMcpMenu(smartInput);
75
+ } catch (error) {
76
+ if (error instanceof _promptswithesc.CancelledPromptError || error?.name === 'CancelledPromptError') {
77
+ console.log((0, _theme.colorize)('\n❌ Cancelado. Voltando ao chat...\n', 'warning'));
78
+ } else {
79
+ throw error;
80
+ }
81
+ }
82
+ return;
83
+ }
30
84
  smartInput.pause();
31
85
  try {
32
86
  switch(sub){
33
- case 'menu':
34
- await this.showMcpMenu(smartInput);
35
- break;
36
87
  case 'list':
37
- {
38
- await this.listServers();
39
- break;
40
- }
88
+ await this.listServers();
89
+ break;
41
90
  case 'tools':
42
- {
43
- await this.listTools();
44
- break;
45
- }
91
+ await this.listTools();
92
+ break;
46
93
  case 'add':
47
- {
48
- await this.addMcpWizard(smartInput);
49
- break;
50
- }
94
+ await this.addMcpWizard(smartInput);
95
+ break;
51
96
  case 'remove':
52
- {
53
- await this.removeMcpWizard(smartInput);
54
- break;
55
- }
97
+ await this.removeMcpWizard(smartInput);
98
+ break;
56
99
  case 'test':
57
- {
58
- await this.testMcpTool(smartInput);
59
- break;
60
- }
100
+ await this.testMcpTool(smartInput);
101
+ break;
61
102
  case 'what':
62
103
  case 'about':
63
104
  this.printWhatIsMcp();
@@ -100,24 +141,24 @@ let McpCommandsService = class McpCommandsService {
100
141
  },
101
142
  {
102
143
  key: '3',
144
+ label: 'Conectar servidores',
145
+ description: 'Conectar/reconectar MCPs configurados'
146
+ },
147
+ {
148
+ key: '4',
103
149
  label: 'Adicionar servidor',
104
150
  description: 'Configurar novo MCP'
105
151
  },
106
152
  {
107
- key: '4',
153
+ key: '5',
108
154
  label: 'Remover servidor',
109
155
  description: 'Desconectar MCP'
110
156
  },
111
157
  {
112
- key: '5',
158
+ key: '6',
113
159
  label: 'O que é MCP?',
114
160
  description: 'Entenda o protocolo'
115
161
  },
116
- {
117
- key: '6',
118
- label: 'Como criar um MCP',
119
- description: 'Guia de desenvolvimento'
120
- },
121
162
  {
122
163
  key: 'q',
123
164
  label: 'Voltar',
@@ -128,6 +169,7 @@ let McpCommandsService = class McpCommandsService {
128
169
  console.log((0, _theme.colorize)('\nSaindo do MCP Hub...\n', 'muted'));
129
170
  return;
130
171
  }
172
+ let pause = true;
131
173
  switch(action){
132
174
  case '1':
133
175
  await this.listServers();
@@ -136,20 +178,25 @@ let McpCommandsService = class McpCommandsService {
136
178
  await this.listTools();
137
179
  break;
138
180
  case '3':
139
- await this.addMcpWizard(smartInput);
181
+ await this.connectServers(smartInput);
140
182
  break;
141
183
  case '4':
142
- await this.removeMcpWizard(smartInput);
184
+ await this.addMcpWizard(smartInput);
185
+ pause = false;
143
186
  break;
144
187
  case '5':
145
- this.printWhatIsMcp();
188
+ await this.removeMcpWizard(smartInput);
189
+ pause = false;
146
190
  break;
147
191
  case '6':
148
- this.printHowToCreate();
192
+ this.printWhatIsMcp();
149
193
  break;
150
194
  case 'q':
151
195
  return;
152
196
  }
197
+ if (pause) {
198
+ await smartInput.question((0, _theme.colorize)('\nEnter para continuar...', 'muted'));
199
+ }
153
200
  }
154
201
  }
155
202
  async withEsc(fn) {
@@ -162,6 +209,69 @@ let McpCommandsService = class McpCommandsService {
162
209
  throw error;
163
210
  }
164
211
  }
212
+ async connectServers(smartInput) {
213
+ const w = (s)=>process.stdout.write(s);
214
+ const summaries = this.mcpRegistry.getServerSummaries();
215
+ w('\r\n');
216
+ w((0, _theme.colorize)(_theme.Icons.cloud + ' ', 'accent') + (0, _theme.colorize)('Conectar Servidores MCP', 'bold') + '\r\n');
217
+ w((0, _theme.colorize)(_theme.Box.horizontal.repeat(40), 'subtle') + '\r\n\n');
218
+ if (summaries.length === 0) {
219
+ w(` ${(0, _theme.colorize)('Nenhum servidor configurado. Use a opção Adicionar servidor.', 'muted')}\r\n\n`);
220
+ return;
221
+ }
222
+ w(` ${(0, _theme.colorize)('Conectando ' + summaries.length + ' servidor(es)...', 'muted')}\r\n\n`);
223
+ const results = await this.mcpRegistry.connectAll();
224
+ for (const [name, ok] of results.entries()){
225
+ const icon = ok ? (0, _theme.colorize)('●', 'success') : (0, _theme.colorize)('○', 'error');
226
+ const status = ok ? (0, _theme.colorize)('conectado', 'success') : (0, _theme.colorize)('falhou', 'error');
227
+ w(` ${icon} ${(0, _theme.colorize)(name, 'cyan')} — ${status}\r\n`);
228
+ if (!ok) {
229
+ const config = this.mcpRegistry.getConfig(name);
230
+ if (config?.type === 'http') {
231
+ w(`\r\n ${(0, _theme.colorize)('⚠️ ' + name + ': OAuth bloqueado pelo servidor', 'warning')}\r\n`);
232
+ w(` Este servidor só aceita clientes pré-aprovados (ex: VS Code, Cursor).\r\n`);
233
+ w(` Alternativa: use o proxy mcp-remote para redirecionar via cliente aprovado.\r\n\r\n`);
234
+ } else if (config?.type === 'stdio' && smartInput) {
235
+ const template = (0, _mcptemplates.getTemplate)(name);
236
+ if (template?.credentials?.length) {
237
+ const missing = template.credentials.filter((cred)=>{
238
+ if (cred.isArg) return false;
239
+ return !config.env?.[cred.envVar];
240
+ });
241
+ if (missing.length > 0) {
242
+ w(`\r\n ${(0, _theme.colorize)('🔑 Credenciais necessárias para ' + name, 'warning')}\r\n\r\n`);
243
+ const mcpDir = _path.join(process.cwd(), '.cast', 'mcp');
244
+ const filePath = _path.join(mcpDir, `${name}.json`);
245
+ const updatedConfig = JSON.parse(JSON.stringify(config));
246
+ if (!updatedConfig.env) updatedConfig.env = {};
247
+ for (const cred of missing){
248
+ const value = await smartInput.question((0, _theme.colorize)(` ${cred.name} (${cred.placeholder}): `, 'cyan'));
249
+ if (value.trim()) {
250
+ updatedConfig.env[cred.envVar] = value.trim();
251
+ }
252
+ }
253
+ _fs.writeFileSync(filePath, JSON.stringify({
254
+ [name]: updatedConfig
255
+ }, null, 2));
256
+ this.mcpRegistry.registerMcp(name, updatedConfig);
257
+ w(`\r\n ${(0, _theme.colorize)('Reconectando ' + name + '...', 'muted')}\r\n`);
258
+ const retryOk = await this.mcpRegistry.connectMcp(name);
259
+ const retryIcon = retryOk ? (0, _theme.colorize)('●', 'success') : (0, _theme.colorize)('○', 'error');
260
+ const retryStatus = retryOk ? (0, _theme.colorize)('conectado', 'success') : (0, _theme.colorize)('falhou — verifique a credencial', 'error');
261
+ w(` ${retryIcon} ${(0, _theme.colorize)(name, 'cyan')} — ${retryStatus}\r\n\r\n`);
262
+ } else {
263
+ w(` ${(0, _theme.colorize)('Verifique se o servidor está disponível e tente novamente.', 'muted')}\r\n\r\n`);
264
+ }
265
+ }
266
+ }
267
+ }
268
+ }
269
+ const finalResults = await this.mcpRegistry.connectAll();
270
+ const connected = [
271
+ ...finalResults.values()
272
+ ].filter(Boolean).length;
273
+ w(` ${(0, _theme.colorize)(`${connected}/${finalResults.size} conectado(s)`, connected === finalResults.size ? 'success' : 'warning')}\r\n\r\n`);
274
+ }
165
275
  async listServers() {
166
276
  const w = (s)=>process.stdout.write(s);
167
277
  const summaries = this.mcpRegistry.getServerSummaries();
@@ -212,11 +322,9 @@ let McpCommandsService = class McpCommandsService {
212
322
  w('\r\n');
213
323
  }
214
324
  async addMcpWizard(smartInput) {
215
- const fs = require('fs');
216
- const path = require('path');
217
- const mcpDir = path.join(process.cwd(), '.cast', 'mcp');
218
- if (!fs.existsSync(mcpDir)) {
219
- fs.mkdirSync(mcpDir, {
325
+ const mcpDir = _path.join(process.cwd(), '.cast', 'mcp');
326
+ if (!_fs.existsSync(mcpDir)) {
327
+ _fs.mkdirSync(mcpDir, {
220
328
  recursive: true
221
329
  });
222
330
  }
@@ -321,12 +429,35 @@ let McpCommandsService = class McpCommandsService {
321
429
  }
322
430
  }
323
431
  }
324
- const filePath = path.join(mcpDir, `${name}.json`);
325
- fs.writeFileSync(filePath, JSON.stringify({
432
+ const filePath = _path.join(mcpDir, `${name}.json`);
433
+ _fs.writeFileSync(filePath, JSON.stringify({
326
434
  [name]: config
327
435
  }, null, 2));
328
436
  w(`\r\n${(0, _theme.colorize)('✓', 'success')} MCP configurado: ${(0, _theme.colorize)(filePath, 'accent')}\r\n`);
329
- if (template.config.type === 'http') {
437
+ if (name === 'figma') {
438
+ w('\r\n');
439
+ w((0, _theme.colorize)(' ─────────────────────────────────────────\r\n', 'subtle'));
440
+ w((0, _theme.colorize)(' Tutorial — Figma Desktop MCP\r\n', 'bold'));
441
+ w((0, _theme.colorize)(' ─────────────────────────────────────────\r\n', 'subtle'));
442
+ w('\r\n');
443
+ w((0, _theme.colorize)(' Passo 1: ', 'accent') + 'Instale o Figma Desktop\r\n');
444
+ w((0, _theme.colorize)(' https://www.figma.com/downloads/\r\n', 'muted'));
445
+ w('\r\n');
446
+ w((0, _theme.colorize)(' Passo 2: ', 'accent') + 'Abra qualquer arquivo de Design no Figma\r\n');
447
+ w('\r\n');
448
+ w((0, _theme.colorize)(' Passo 3: ', 'accent') + 'Ative o Dev Mode\r\n');
449
+ w((0, _theme.colorize)(' Clique no botão "<>" no canto superior direito\r\n', 'muted'));
450
+ w('\r\n');
451
+ w((0, _theme.colorize)(' Passo 4: ', 'accent') + 'Habilite o servidor MCP\r\n');
452
+ w((0, _theme.colorize)(' Painel Inspect → seção MCP\r\n', 'muted'));
453
+ w((0, _theme.colorize)(' Ative "Enable desktop MCP server"\r\n', 'muted'));
454
+ w('\r\n');
455
+ w((0, _theme.colorize)(' Passo 5: ', 'accent') + 'Conecte via Cast\r\n');
456
+ w((0, _theme.colorize)(' Reinicie o Cast e use /mcp → Conectar servidores\r\n', 'muted'));
457
+ w('\r\n');
458
+ w((0, _theme.colorize)(' ─────────────────────────────────────────\r\n', 'subtle'));
459
+ w('\r\n');
460
+ } else if (template.config.type === 'http') {
330
461
  w((0, _theme.colorize)('\r\n ⚠️ Servidor HTTP/OAuth detectado!\r\n', 'warning'));
331
462
  w((0, _theme.colorize)(' Autenticação pode ser necessária após conectar.\r\n\r\n', 'muted'));
332
463
  }
@@ -410,22 +541,20 @@ let McpCommandsService = class McpCommandsService {
410
541
  }
411
542
  config.endpoint = endpoint.trim();
412
543
  }
413
- const filePath = path.join(mcpDir, `${name.trim().toLowerCase()}.json`);
414
- fs.writeFileSync(filePath, JSON.stringify({
544
+ const filePath = _path.join(mcpDir, `${name.trim().toLowerCase()}.json`);
545
+ _fs.writeFileSync(filePath, JSON.stringify({
415
546
  [name.trim()]: config
416
547
  }, null, 2));
417
548
  w(`\r\n${(0, _theme.colorize)('✓', 'success')} Config salva: ${(0, _theme.colorize)(filePath, 'accent')}\r\n`);
418
549
  w((0, _theme.colorize)(' Reinicie o Cast para conectar\r\n\r\n', 'muted'));
419
550
  }
420
551
  async removeMcpWizard(smartInput) {
421
- const fs = require('fs');
422
- const path = require('path');
423
- const mcpDir = path.join(process.cwd(), '.cast', 'mcp');
424
- if (!fs.existsSync(mcpDir)) {
552
+ const mcpDir = _path.join(process.cwd(), '.cast', 'mcp');
553
+ if (!_fs.existsSync(mcpDir)) {
425
554
  console.log((0, _theme.colorize)('\nNenhum MCP configurado\n', 'muted'));
426
555
  return;
427
556
  }
428
- const files = fs.readdirSync(mcpDir).filter((f)=>f.endsWith('.json'));
557
+ const files = _fs.readdirSync(mcpDir).filter((f)=>f.endsWith('.json'));
429
558
  if (files.length === 0) {
430
559
  console.log((0, _theme.colorize)('\nNenhum MCP configurado\n', 'muted'));
431
560
  return;
@@ -446,7 +575,7 @@ let McpCommandsService = class McpCommandsService {
446
575
  default: false
447
576
  });
448
577
  if (confirmRemove) {
449
- fs.unlinkSync(path.join(mcpDir, toRemove));
578
+ _fs.unlinkSync(_path.join(mcpDir, toRemove));
450
579
  console.log((0, _theme.colorize)(`\n✓ Servidor removido\n`, 'success'));
451
580
  }
452
581
  }