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.
- package/dist/main.js +3 -1
- package/dist/main.js.map +1 -1
- package/dist/modules/mcp/catalog/mcp-templates.js +13 -2
- package/dist/modules/mcp/catalog/mcp-templates.js.map +1 -1
- package/dist/modules/mcp/services/cast-oauth-provider.js +187 -0
- package/dist/modules/mcp/services/cast-oauth-provider.js.map +1 -0
- package/dist/modules/mcp/services/mcp-client.service.js +72 -43
- package/dist/modules/mcp/services/mcp-client.service.js.map +1 -1
- package/dist/modules/mcp/services/mcp-registry.service.js +6 -0
- package/dist/modules/mcp/services/mcp-registry.service.js.map +1 -1
- package/dist/modules/repl/services/commands/mcp-commands.service.js +180 -51
- package/dist/modules/repl/services/commands/mcp-commands.service.js.map +1 -1
- package/package.json +2 -1
|
@@ -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
|
-
|
|
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
|
-
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
88
|
+
await this.listServers();
|
|
89
|
+
break;
|
|
41
90
|
case 'tools':
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
91
|
+
await this.listTools();
|
|
92
|
+
break;
|
|
46
93
|
case 'add':
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
94
|
+
await this.addMcpWizard(smartInput);
|
|
95
|
+
break;
|
|
51
96
|
case 'remove':
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
97
|
+
await this.removeMcpWizard(smartInput);
|
|
98
|
+
break;
|
|
56
99
|
case 'test':
|
|
57
|
-
|
|
58
|
-
|
|
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: '
|
|
153
|
+
key: '5',
|
|
108
154
|
label: 'Remover servidor',
|
|
109
155
|
description: 'Desconectar MCP'
|
|
110
156
|
},
|
|
111
157
|
{
|
|
112
|
-
key: '
|
|
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.
|
|
181
|
+
await this.connectServers(smartInput);
|
|
140
182
|
break;
|
|
141
183
|
case '4':
|
|
142
|
-
await this.
|
|
184
|
+
await this.addMcpWizard(smartInput);
|
|
185
|
+
pause = false;
|
|
143
186
|
break;
|
|
144
187
|
case '5':
|
|
145
|
-
this.
|
|
188
|
+
await this.removeMcpWizard(smartInput);
|
|
189
|
+
pause = false;
|
|
146
190
|
break;
|
|
147
191
|
case '6':
|
|
148
|
-
this.
|
|
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
|
|
216
|
-
|
|
217
|
-
|
|
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 =
|
|
325
|
-
|
|
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 (
|
|
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 =
|
|
414
|
-
|
|
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
|
|
422
|
-
|
|
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 =
|
|
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
|
-
|
|
578
|
+
_fs.unlinkSync(_path.join(mcpDir, toRemove));
|
|
450
579
|
console.log((0, _theme.colorize)(`\n✓ Servidor removido\n`, 'success'));
|
|
451
580
|
}
|
|
452
581
|
}
|