@nextclaw/mcp 0.2.18-beta.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -117,7 +117,7 @@ type McpClientHandle = {
117
117
  };
118
118
  declare class McpClientFactory {
119
119
  private readonly _config?;
120
- constructor(_config?: Config);
120
+ constructor(_config?: Config | undefined);
121
121
  create(record: McpServerRecord): McpClientHandle;
122
122
  }
123
123
  //#endregion
@@ -134,7 +134,9 @@ declare class McpServerLifecycleManager {
134
134
  warmServer(record: McpServerRecord): Promise<McpLifecycleState>;
135
135
  getCachedCatalog(serverName: string): McpToolCatalogEntry[];
136
136
  getCachedState(serverName: string): McpLifecycleState | undefined;
137
- callTool(record: McpServerRecord, toolName: string, args: Record<string, unknown>): Promise<unknown>;
137
+ callTool(record: McpServerRecord, toolName: string, args: Record<string, unknown>, options?: {
138
+ signal?: AbortSignal;
139
+ }): Promise<unknown>;
138
140
  closeAll(): Promise<void>;
139
141
  closeServer(serverName: string): Promise<void>;
140
142
  private ensureConnection;
@@ -165,6 +167,7 @@ declare class McpRegistryService {
165
167
  serverName: string;
166
168
  toolName: string;
167
169
  args: Record<string, unknown>;
170
+ signal?: AbortSignal;
168
171
  }): Promise<unknown>;
169
172
  close(): Promise<void>;
170
173
  private warmRecord;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/config/mcp-config-normalizer.ts","../src/client/mcp-client-factory.ts","../src/lifecycle/mcp-server-lifecycle-manager.ts","../src/registry/mcp-registry-service.ts","../src/doctor/mcp-doctor-service.ts","../src/doctor/mcp-doctor-facade.ts","../src/install/mcp-install-template-materializer.ts","../src/manage/mcp-mutation-service.ts","../src/view/mcp-installed-view-service.ts"],"mappings":";;;;;KAQY,eAAA;EACV,IAAA;EACA,UAAA,EAAY,mBAAA;AAAA;AAAA,KAGF,mBAAA;EACV,aAAA;EACA,UAAA;EACA,QAAA;EACA,WAAA;EACA,UAAA,GAAa,MAAA;AAAA;AAAA,KAGH,mBAAA;EACV,IAAA;EACA,EAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,KAGU,eAAA;EACV,IAAA;EACA,OAAA;EACA,SAAA,EAAW,YAAA;EACX,UAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,KAGU,wBAAA;EACV,KAAA;EACA,OAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,MAAA,EAAQ,mBAAA;AAAA;AAAA,KAGE,gBAAA;EACV,OAAA;AAAA;AAAA,KAGU,iBAAA;EACV,MAAA,EAAQ,eAAA;EACR,KAAA,EAAO,mBAAA;EACP,WAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,KAGU,2BAAA,GAA8B,YAAA;AAAA,KAE9B,wBAAA;EACV,EAAA;EACA,KAAA;EACA,WAAA;EACA,QAAA;EACA,MAAA;EACA,YAAA;AAAA;AAAA,KAGU,6BAAA;EACV,IAAA;EACA,IAAA;EACA,OAAA;EACA,WAAA;EACA,cAAA,EAAgB,2BAAA;EAChB,QAAA,EAAU,mBAAA;EACV,MAAA,EAAQ,wBAAA;AAAA;AAAA,KAGE,kBAAA;EACV,IAAA;EACA,OAAA;EACA,SAAA,EAAW,YAAA;EACX,KAAA,EAAO,cAAA;EACP,MAAA;EACA,WAAA;EACA,WAAA;EACA,MAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,KAGU,iBAAA;EACV,OAAA;EACA,IAAA;EACA,OAAA;EACA,UAAA,GAAa,mBAAA;AAAA;AAAA,KAGH,2BAAA;EACV,QAAA,EAAU,6BAAA;EACV,IAAA;EACA,OAAA;EACA,KAAA,GAAQ,OAAA,CAAQ,cAAA;EAChB,MAAA,GAAS,MAAA;EACT,QAAA,GAAW,OAAA,CAAQ,iBAAA;AAAA;AAAA,iBAGL,sBAAA,CAAuB,IAAA;AAAA,iBAWvB,kBAAA,CAAmB,MAAA,EAAQ,MAAA;AAAA,iBAQ3B,yBAAA,CAA0B,MAAA;EACxC,MAAA,EAAQ,MAAA;EACR,KAAA,EAAO,cAAA;EACP,OAAA;AAAA;AAAA,iBAiBc,yBAAA,CAA0B,UAAA,UAAoB,QAAA;AAAA,iBAI9C,kBAAA,CAAmB,KAAA;;;iBC1JnB,cAAA,CAAe,MAAA,EAAQ,MAAA,GAAS,eAAA;AAAA,iBAShC,YAAA,CAAa,MAAA,EAAQ,MAAA,EAAQ,IAAA,WAAe,eAAA;;;KCHvD,eAAA;EACH,MAAA,EAAQ,MAAA;EACR,SAAA,EAAW,SAAA;AAAA;AAAA,cAiEA,gBAAA;EAAA,iBACkB,OAAA;cAAA,OAAA,GAAU,MAAA;EAIvC,MAAA,CAAO,MAAA,EAAQ,eAAA,GAAkB,eAAA;AAAA;;;cChEtB,yBAAA;EAAA,iBAKQ,OAAA;EAAA,iBAJF,kBAAA;EAAA,iBACA,gBAAA;cAGE,OAAA;IACf,SAAA,QAAiB,MAAA;IACjB,aAAA,GAAgB,gBAAA;IAChB,GAAA,SAAY,IAAA;EAAA;EAIV,UAAA,CAAW,MAAA,EAAQ,eAAA,GAAkB,OAAA,CAAQ,iBAAA;EAKnD,gBAAA,CAAiB,UAAA,WAAqB,mBAAA;EAItC,cAAA,CAAe,UAAA,WAAqB,iBAAA;EAQ9B,QAAA,CAAS,MAAA,EAAQ,eAAA,EAAiB,QAAA,UAAkB,IAAA,EAAM,MAAA,oBAA0B,OAAA;EASpF,QAAA,CAAA,GAAY,OAAA;EAcZ,WAAA,CAAY,UAAA,WAAqB,OAAA;EAAA,QAwBzB,gBAAA;EAAA,QAyBA,OAAA;EAAA,QAwBN,eAAA;EAAA,QAUA,mBAAA;AAAA;;;cC5IG,kBAAA;EAAA,iBAIQ,OAAA;EAAA,iBAHF,gBAAA;cAGE,OAAA;IACf,SAAA,QAAiB,MAAA;IACjB,gBAAA,GAAmB,yBAAA;EAAA;EAQvB,WAAA,CAAA,GAAe,eAAA;EAIf,SAAA,CAAU,IAAA,WAAe,eAAA;EAInB,qBAAA,CAAA,GAAyB,OAAA,CAAQ,mBAAA;EAyBjC,UAAA,CAAW,IAAA,WAAe,OAAA,CAAQ,mBAAA;EAuBlC,eAAA,CAAgB,MAAA;IACpB,UAAA,EAAY,MAAA;IACZ,UAAA,EAAY,MAAA;EAAA,IACV,OAAA,CAAQ,wBAAA;EA0DZ,mBAAA,CAAoB,MAAA,GAAQ,gBAAA,GAAwB,mBAAA;EAepD,cAAA,CAAe,UAAA,WAfwD,iBAAA;EAmBjE,QAAA,CAAS,MAAA;IACb,UAAA;IACA,QAAA;IACA,IAAA,EAAM,MAAA;EAAA,IACJ,OAAA;EAQE,KAAA,CAAA,GAAS,OAAA;EAAA,QAID,UAAA;AAAA;;;cC9KH,gBAAA;EAAA,iBAEQ,OAAA;cAAA,OAAA;IACf,SAAA,QAAiB,MAAA;IACjB,eAAA,GAAkB,kBAAA;EAAA;EAIhB,OAAA,CAAQ,IAAA,YAAgB,OAAA,CAAQ,eAAA;AAAA;;;cCP3B,eAAA;EAAA,iBAIQ,OAAA;EAAA,iBAHF,aAAA;cAGE,OAAA;IACf,SAAA,QAAiB,MAAA;IACjB,eAAA,GAAkB,kBAAA;EAAA;EAShB,OAAA,CAAQ,IAAA,YAAgB,OAAA,CAAQ,eAAA;EAIhC,UAAA,CAAW,IAAA,WAAe,OAAA,CAAQ,eAAA;AAAA;;;cCjB7B,8BAAA;EACX,WAAA,CAAY,MAAA,EAAQ,2BAAA;IAAgC,IAAA;IAAc,UAAA,EAAY,mBAAA;EAAA;EAAA,QAUtE,WAAA;EAAA,QAsBA,UAAA;EAAA,QAYA,aAAA;AAAA;;;cC1CG,kBAAA;EAAA,iBAIQ,OAAA;EAAA,iBAHF,YAAA;cAGE,OAAA;IACf,SAAA,QAAiB,MAAA;IACjB,UAAA,GAAa,MAAA,EAAQ,MAAA;IACrB,YAAA,GAAe,8BAAA;EAAA;EAMnB,eAAA,CAAA;EAIA,SAAA,CAAU,IAAA,UAAc,UAAA,EAAY,mBAAA,GAAsB,iBAAA;EAsB1D,YAAA,CAAa,IAAA,UAAc,UAAA,EAAY,mBAAA,GAAsB,iBAAA;EAqB7D,YAAA,CAAa,IAAA,WAAe,iBAAA;EAmB5B,aAAA,CAAc,IAAA,UAAc,OAAA,YAAmB,iBAAA;EAqB/C,mBAAA,CAAoB,MAAA,EAAQ,IAAA,CAAK,2BAAA;IAC/B,QAAA,EAAU,6BAAA;EAAA,IACR,iBAAA;EAKJ,eAAA,CAAgB,UAAA,UAAoB,UAAA,WAAqB,iBAAA;EAmBzD,YAAA,CAAa,UAAA,UAAoB,UAAA,WAAqB,iBAAA;AAAA;;;cCpI3C,uBAAA;EAAA,iBAIQ,OAAA;EAAA,iBAHF,eAAA;cAGE,OAAA;IACf,SAAA,QAAiB,MAAA;IACjB,eAAA,GAAkB,kBAAA;EAAA;EAQtB,aAAA,CAAA,GAAiB,kBAAA;AAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/config/mcp-config-normalizer.ts","../src/client/mcp-client-factory.ts","../src/lifecycle/mcp-server-lifecycle-manager.ts","../src/registry/mcp-registry-service.ts","../src/doctor/mcp-doctor-service.ts","../src/doctor/mcp-doctor-facade.ts","../src/install/mcp-install-template-materializer.ts","../src/manage/mcp-mutation-service.ts","../src/view/mcp-installed-view-service.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -133,11 +133,11 @@ var McpServerLifecycleManager = class {
133
133
  if (!ready) return;
134
134
  return this.stripConnection(ready);
135
135
  }
136
- async callTool(record, toolName, args) {
136
+ async callTool(record, toolName, args, options = {}) {
137
137
  const result = await (await this.ensureConnection(record)).client.callTool({
138
138
  name: toolName,
139
139
  arguments: args
140
- });
140
+ }, void 0, { signal: options.signal });
141
141
  return this.normalizeToolResult(result);
142
142
  }
143
143
  async closeAll() {
@@ -322,7 +322,7 @@ var McpRegistryService = class {
322
322
  async callTool(params) {
323
323
  const server = this.getServer(params.serverName);
324
324
  if (!server) throw new Error(`Unknown MCP server: ${params.serverName}`);
325
- return this.lifecycleManager.callTool(server, params.toolName, params.args);
325
+ return this.lifecycleManager.callTool(server, params.toolName, params.args, { signal: params.signal });
326
326
  }
327
327
  async close() {
328
328
  await this.lifecycleManager.closeAll();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["undiciFetch"],"sources":["../src/types.ts","../src/config/mcp-config-normalizer.ts","../src/client/mcp-client-factory.ts","../src/lifecycle/mcp-server-lifecycle-manager.ts","../src/registry/mcp-registry-service.ts","../src/doctor/mcp-doctor-service.ts","../src/doctor/mcp-doctor-facade.ts","../src/install/mcp-install-template-materializer.ts","../src/manage/mcp-mutation-service.ts","../src/view/mcp-installed-view-service.ts"],"sourcesContent":["import type {\n Config,\n McpServerDefinition,\n McpServerMetadata,\n McpServerScope,\n McpTransport\n} from \"@nextclaw/core\";\n\nexport type McpServerRecord = {\n name: string;\n definition: McpServerDefinition;\n};\n\nexport type McpToolCatalogEntry = {\n qualifiedName: string;\n serverName: string;\n toolName: string;\n description?: string;\n parameters?: Record<string, unknown>;\n};\n\nexport type McpServerWarmResult = {\n name: string;\n ok: boolean;\n toolCount: number;\n error?: string;\n};\n\nexport type McpDoctorReport = {\n name: string;\n enabled: boolean;\n transport: McpTransport[\"type\"];\n accessible: boolean;\n toolCount: number;\n error?: string;\n};\n\nexport type McpConfigReconcileResult = {\n added: string[];\n removed: string[];\n enabled: string[];\n disabled: string[];\n restarted: string[];\n warmed: McpServerWarmResult[];\n};\n\nexport type McpCatalogFilter = {\n agentId?: string;\n};\n\nexport type McpLifecycleState = {\n record: McpServerRecord;\n tools: McpToolCatalogEntry[];\n clientReady: boolean;\n lastReadyAt?: string;\n lastError?: string;\n};\n\nexport type McpMarketplaceTransportType = McpTransport[\"type\"];\n\nexport type McpMarketplaceInputField = {\n id: string;\n label: string;\n description?: string;\n required?: boolean;\n secret?: boolean;\n defaultValue?: string;\n};\n\nexport type McpMarketplaceInstallTemplate = {\n kind: \"template\";\n spec: string;\n command: string;\n defaultName: string;\n transportTypes: McpMarketplaceTransportType[];\n template: McpServerDefinition;\n inputs: McpMarketplaceInputField[];\n};\n\nexport type McpInstalledRecord = {\n name: string;\n enabled: boolean;\n transport: McpTransport[\"type\"];\n scope: McpServerScope;\n source: \"manual\" | \"marketplace\";\n catalogSlug?: string;\n displayName?: string;\n vendor?: string;\n docsUrl?: string;\n homepage?: string;\n trustLevel?: \"official\" | \"verified\" | \"community\";\n installedAt?: string;\n toolCount?: number;\n accessible?: boolean;\n lastReadyAt?: string;\n lastError?: string;\n};\n\nexport type McpMutationResult = {\n changed: boolean;\n name: string;\n message: string;\n definition?: McpServerDefinition;\n};\n\nexport type McpMaterializeInstallParams = {\n template: McpMarketplaceInstallTemplate;\n name?: string;\n enabled?: boolean;\n scope?: Partial<McpServerScope>;\n inputs?: Record<string, string | undefined>;\n metadata?: Partial<McpServerMetadata>;\n};\n\nexport function normalizeMcpServerName(name: string): string {\n const normalized = name.trim();\n if (!normalized) {\n throw new Error(\"MCP server name is required.\");\n }\n if (!/^[A-Za-z0-9._-]+$/.test(normalized)) {\n throw new Error(\"MCP server name may only contain letters, numbers, dot, underscore, and dash.\");\n }\n return normalized;\n}\n\nexport function readDefaultAgentId(config: Config): string {\n return (\n config.agents.list.find((entry) => entry.default)?.id?.trim() ||\n config.agents.list[0]?.id?.trim() ||\n \"main\"\n );\n}\n\nexport function isServerAccessibleToAgent(params: {\n config: Config;\n scope: McpServerScope;\n agentId?: string;\n}): boolean {\n if (params.scope.allAgents) {\n return true;\n }\n\n const targetAgentId = params.agentId?.trim() || readDefaultAgentId(params.config);\n const explicitAgents = params.scope.agents\n .map((agentId) => agentId.trim())\n .filter(Boolean);\n if (explicitAgents.length > 0) {\n return explicitAgents.includes(targetAgentId);\n }\n\n return targetAgentId === readDefaultAgentId(params.config);\n}\n\nexport function buildQualifiedMcpToolName(serverName: string, toolName: string): string {\n return `mcp_${sanitizeMcpSegment(serverName)}__${sanitizeMcpSegment(toolName)}`;\n}\n\nexport function sanitizeMcpSegment(value: string): string {\n const sanitized = value\n .trim()\n .replace(/[^A-Za-z0-9_]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return sanitized || \"unnamed\";\n}\n","import type { Config } from \"@nextclaw/core\";\nimport { normalizeMcpServerName, type McpServerRecord } from \"../types.js\";\n\nexport function listMcpServers(config: Config): McpServerRecord[] {\n return Object.entries(config.mcp.servers)\n .map(([name, definition]) => ({\n name: normalizeMcpServerName(name),\n definition\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nexport function getMcpServer(config: Config, name: string): McpServerRecord | undefined {\n const normalizedName = normalizeMcpServerName(name);\n const definition = config.mcp.servers[normalizedName];\n if (!definition) {\n return undefined;\n }\n return {\n name: normalizedName,\n definition\n };\n}\n","import { Agent, fetch as undiciFetch } from \"undici\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { Config, McpTransportHttp, McpTransportSse, McpTransportStdio } from \"@nextclaw/core\";\nimport type { McpServerRecord } from \"../types.js\";\n\ntype McpClientHandle = {\n client: Client;\n transport: Transport;\n};\n\nfunction createClient(): Client {\n return new Client({\n name: \"nextclaw-mcp-client\",\n version: \"0.1.0\"\n });\n}\n\nfunction buildFetch(transport: McpTransportHttp | McpTransportSse): typeof fetch {\n const timeoutMs = transport.timeoutMs;\n const insecureAgent = transport.verifyTls ? null : new Agent({\n connect: {\n rejectUnauthorized: false\n }\n });\n\n return async (input, init) => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await undiciFetch(input, {\n ...init,\n dispatcher: insecureAgent ?? (init as { dispatcher?: Agent } | undefined)?.dispatcher,\n signal: controller.signal\n });\n } finally {\n clearTimeout(timeout);\n }\n };\n}\n\nfunction createStdioTransport(transport: McpTransportStdio): Transport {\n return new StdioClientTransport({\n command: transport.command,\n args: transport.args,\n cwd: transport.cwd,\n env: Object.keys(transport.env).length > 0 ? transport.env : undefined,\n stderr: transport.stderr\n });\n}\n\nfunction createHttpTransport(transport: McpTransportHttp): Transport {\n return new StreamableHTTPClientTransport(new URL(transport.url), {\n requestInit: {\n headers: transport.headers\n },\n fetch: buildFetch(transport)\n });\n}\n\nfunction createSseTransport(transport: McpTransportSse): Transport {\n return new SSEClientTransport(new URL(transport.url), {\n requestInit: {\n headers: transport.headers\n },\n eventSourceInit: {\n fetch: buildFetch(transport),\n headers: transport.headers\n } as RequestInit & { fetch: typeof fetch },\n fetch: buildFetch(transport)\n });\n}\n\nexport class McpClientFactory {\n constructor(private readonly _config?: Config) {\n void this._config;\n }\n\n create(record: McpServerRecord): McpClientHandle {\n const transport = (() => {\n switch (record.definition.transport.type) {\n case \"stdio\":\n return createStdioTransport(record.definition.transport);\n case \"http\":\n return createHttpTransport(record.definition.transport);\n case \"sse\":\n return createSseTransport(record.definition.transport);\n default:\n throw new Error(`Unsupported MCP transport: ${String((record.definition.transport as { type?: string }).type)}`);\n }\n })();\n\n return {\n client: createClient(),\n transport\n };\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { Config } from \"@nextclaw/core\";\nimport { McpClientFactory } from \"../client/mcp-client-factory.js\";\nimport {\n buildQualifiedMcpToolName,\n type McpLifecycleState,\n type McpServerRecord,\n type McpToolCatalogEntry\n} from \"../types.js\";\n\ntype ActiveConnection = McpLifecycleState & {\n client: Client;\n transport: Transport;\n};\n\nexport class McpServerLifecycleManager {\n private readonly pendingConnections = new Map<string, Promise<ActiveConnection>>();\n private readonly readyConnections = new Map<string, ActiveConnection>();\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n clientFactory?: McpClientFactory;\n now?: () => Date;\n }\n ) {}\n\n async warmServer(record: McpServerRecord): Promise<McpLifecycleState> {\n const connection = await this.ensureConnection(record);\n return this.stripConnection(connection);\n }\n\n getCachedCatalog(serverName: string): McpToolCatalogEntry[] {\n return this.readyConnections.get(serverName)?.tools ?? [];\n }\n\n getCachedState(serverName: string): McpLifecycleState | undefined {\n const ready = this.readyConnections.get(serverName);\n if (!ready) {\n return undefined;\n }\n return this.stripConnection(ready);\n }\n\n async callTool(record: McpServerRecord, toolName: string, args: Record<string, unknown>): Promise<unknown> {\n const connection = await this.ensureConnection(record);\n const result = await connection.client.callTool({\n name: toolName,\n arguments: args\n });\n return this.normalizeToolResult(result);\n }\n\n async closeAll(): Promise<void> {\n const pending = await Promise.allSettled(this.pendingConnections.values());\n for (const result of pending) {\n if (result.status === \"fulfilled\") {\n this.readyConnections.set(result.value.record.name, result.value);\n }\n }\n for (const connection of this.readyConnections.values()) {\n await connection.transport.close().catch(() => {});\n }\n this.pendingConnections.clear();\n this.readyConnections.clear();\n }\n\n async closeServer(serverName: string): Promise<void> {\n const ready = this.readyConnections.get(serverName);\n this.readyConnections.delete(serverName);\n\n const pending = this.pendingConnections.get(serverName);\n this.pendingConnections.delete(serverName);\n\n if (ready) {\n await ready.transport.close().catch(() => {});\n }\n\n if (!pending) {\n return;\n }\n\n const result = await Promise.allSettled([pending]);\n const settled = result[0];\n if (settled?.status === \"fulfilled\") {\n await settled.value.transport.close().catch(() => {});\n }\n this.readyConnections.delete(serverName);\n this.pendingConnections.delete(serverName);\n }\n\n private async ensureConnection(record: McpServerRecord): Promise<ActiveConnection> {\n const ready = this.readyConnections.get(record.name);\n if (ready) {\n return ready;\n }\n\n const existing = this.pendingConnections.get(record.name);\n if (existing) {\n return existing;\n }\n\n const task = this.connect(record);\n this.pendingConnections.set(record.name, task);\n\n try {\n const connection = await task;\n this.readyConnections.set(record.name, connection);\n this.pendingConnections.delete(record.name);\n return connection;\n } catch (error) {\n this.pendingConnections.delete(record.name);\n throw error;\n }\n }\n\n private async connect(record: McpServerRecord): Promise<ActiveConnection> {\n const config = this.options.getConfig();\n const clientFactory = this.options.clientFactory ?? new McpClientFactory(config);\n const { client, transport } = clientFactory.create(record);\n await client.connect(transport);\n const listedTools = await client.listTools();\n const tools = listedTools.tools.map((tool) => ({\n qualifiedName: buildQualifiedMcpToolName(record.name, tool.name),\n serverName: record.name,\n toolName: tool.name,\n description: tool.description,\n parameters: tool.inputSchema\n }));\n const now = (this.options.now ?? (() => new Date()))().toISOString();\n return {\n record,\n tools,\n clientReady: true,\n lastReadyAt: now,\n client,\n transport\n };\n }\n\n private stripConnection(connection: ActiveConnection): McpLifecycleState {\n return {\n record: connection.record,\n tools: connection.tools,\n clientReady: connection.clientReady,\n lastReadyAt: connection.lastReadyAt,\n lastError: connection.lastError\n };\n }\n\n private normalizeToolResult(result: CallToolResult | { toolResult: unknown }): unknown {\n if (\"toolResult\" in result) {\n return result.toolResult;\n }\n return {\n content: result.content,\n structuredContent: result.structuredContent,\n isError: result.isError ?? false\n };\n }\n}\n","import type { Config, McpServerDefinition } from \"@nextclaw/core\";\nimport { getMcpServer, listMcpServers } from \"../config/mcp-config-normalizer.js\";\nimport { McpServerLifecycleManager } from \"../lifecycle/mcp-server-lifecycle-manager.js\";\nimport {\n isServerAccessibleToAgent,\n type McpConfigReconcileResult,\n type McpCatalogFilter,\n type McpServerRecord,\n type McpServerWarmResult,\n type McpToolCatalogEntry\n} from \"../types.js\";\n\nexport class McpRegistryService {\n private readonly lifecycleManager: McpServerLifecycleManager;\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n lifecycleManager?: McpServerLifecycleManager;\n }\n ) {\n this.lifecycleManager = this.options.lifecycleManager ?? new McpServerLifecycleManager({\n getConfig: this.options.getConfig\n });\n }\n\n listServers(): McpServerRecord[] {\n return listMcpServers(this.options.getConfig());\n }\n\n getServer(name: string): McpServerRecord | undefined {\n return getMcpServer(this.options.getConfig(), name);\n }\n\n async prewarmEnabledServers(): Promise<McpServerWarmResult[]> {\n const results = await Promise.all(\n this.listServers()\n .filter((record) => record.definition.enabled)\n .map(async (record) => {\n try {\n const state = await this.lifecycleManager.warmServer(record);\n return {\n name: record.name,\n ok: true,\n toolCount: state.tools.length\n } satisfies McpServerWarmResult;\n } catch (error) {\n return {\n name: record.name,\n ok: false,\n toolCount: 0,\n error: toErrorMessage(error)\n } satisfies McpServerWarmResult;\n }\n })\n );\n return results.sort((left, right) => left.name.localeCompare(right.name));\n }\n\n async warmServer(name: string): Promise<McpServerWarmResult> {\n const server = this.getServer(name);\n if (!server) {\n throw new Error(`Unknown MCP server: ${name}`);\n }\n\n try {\n const state = await this.lifecycleManager.warmServer(server);\n return {\n name: server.name,\n ok: true,\n toolCount: state.tools.length\n };\n } catch (error) {\n return {\n name: server.name,\n ok: false,\n toolCount: 0,\n error: toErrorMessage(error)\n };\n }\n }\n\n async reconcileConfig(params: {\n prevConfig: Config;\n nextConfig: Config;\n }): Promise<McpConfigReconcileResult> {\n const previousServers = new Map(listMcpServers(params.prevConfig).map((record) => [record.name, record]));\n const nextServers = new Map(listMcpServers(params.nextConfig).map((record) => [record.name, record]));\n const serverNames = Array.from(new Set([...previousServers.keys(), ...nextServers.keys()])).sort((left, right) =>\n left.localeCompare(right)\n );\n\n const result: McpConfigReconcileResult = {\n added: [],\n removed: [],\n enabled: [],\n disabled: [],\n restarted: [],\n warmed: []\n };\n\n for (const serverName of serverNames) {\n const previous = previousServers.get(serverName);\n const next = nextServers.get(serverName);\n\n if (!next) {\n await this.lifecycleManager.closeServer(serverName);\n result.removed.push(serverName);\n continue;\n }\n\n if (!previous) {\n result.added.push(serverName);\n if (next.definition.enabled) {\n result.warmed.push(await this.warmRecord(next));\n }\n continue;\n }\n\n if (previous.definition.enabled && !next.definition.enabled) {\n await this.lifecycleManager.closeServer(serverName);\n result.disabled.push(serverName);\n continue;\n }\n\n if (!previous.definition.enabled && next.definition.enabled) {\n result.enabled.push(serverName);\n result.warmed.push(await this.warmRecord(next));\n continue;\n }\n\n if (hasReconnectRelevantChange(previous.definition, next.definition)) {\n await this.lifecycleManager.closeServer(serverName);\n result.restarted.push(serverName);\n if (next.definition.enabled) {\n result.warmed.push(await this.warmRecord(next));\n }\n }\n }\n\n return result;\n }\n\n listAccessibleTools(filter: McpCatalogFilter = {}): McpToolCatalogEntry[] {\n const config = this.options.getConfig();\n return this.listServers()\n .filter((record) => record.definition.enabled)\n .filter((record) =>\n isServerAccessibleToAgent({\n config,\n scope: record.definition.scope,\n agentId: filter.agentId\n })\n )\n .flatMap((record) => this.lifecycleManager.getCachedCatalog(record.name))\n .sort((left, right) => left.qualifiedName.localeCompare(right.qualifiedName));\n }\n\n getCachedState(serverName: string) {\n return this.lifecycleManager.getCachedState(serverName);\n }\n\n async callTool(params: {\n serverName: string;\n toolName: string;\n args: Record<string, unknown>;\n }): Promise<unknown> {\n const server = this.getServer(params.serverName);\n if (!server) {\n throw new Error(`Unknown MCP server: ${params.serverName}`);\n }\n return this.lifecycleManager.callTool(server, params.toolName, params.args);\n }\n\n async close(): Promise<void> {\n await this.lifecycleManager.closeAll();\n }\n\n private async warmRecord(record: McpServerRecord): Promise<McpServerWarmResult> {\n try {\n const state = await this.lifecycleManager.warmServer(record);\n return {\n name: record.name,\n ok: true,\n toolCount: state.tools.length\n };\n } catch (error) {\n return {\n name: record.name,\n ok: false,\n toolCount: 0,\n error: toErrorMessage(error)\n };\n }\n }\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction hasReconnectRelevantChange(left: McpServerDefinition, right: McpServerDefinition): boolean {\n return JSON.stringify(left.transport) !== JSON.stringify(right.transport);\n}\n","import type { Config } from \"@nextclaw/core\";\nimport { McpRegistryService } from \"../registry/mcp-registry-service.js\";\nimport { type McpDoctorReport } from \"../types.js\";\n\nexport class McpDoctorService {\n constructor(\n private readonly options: {\n getConfig: () => Config;\n registryService?: McpRegistryService;\n }\n ) {}\n\n async inspect(name?: string): Promise<McpDoctorReport[]> {\n const registry = this.options.registryService ?? new McpRegistryService({\n getConfig: this.options.getConfig\n });\n const specificServer = name ? registry.getServer(name) : undefined;\n const servers = specificServer ? [specificServer] : name ? [] : registry.listServers();\n return await Promise.all(\n servers.map(async (server) => {\n const warmResult = await registry.warmServer(server.name);\n return {\n name: server.name,\n enabled: server.definition.enabled,\n transport: server.definition.transport.type,\n accessible: warmResult.ok,\n toolCount: warmResult.toolCount,\n ...(warmResult.error ? { error: warmResult.error } : {})\n } satisfies McpDoctorReport;\n })\n );\n }\n}\n","import type { Config } from \"@nextclaw/core\";\nimport { McpDoctorService } from \"./mcp-doctor-service.js\";\nimport type { McpRegistryService } from \"../registry/mcp-registry-service.js\";\nimport { type McpDoctorReport } from \"../types.js\";\n\nexport class McpDoctorFacade {\n private readonly doctorService: McpDoctorService;\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n registryService?: McpRegistryService;\n }\n ) {\n this.doctorService = new McpDoctorService({\n getConfig: this.options.getConfig,\n registryService: this.options.registryService\n });\n }\n\n async inspect(name?: string): Promise<McpDoctorReport[]> {\n return await this.doctorService.inspect(name);\n }\n\n async inspectOne(name: string): Promise<McpDoctorReport | null> {\n const reports = await this.inspect(name);\n return reports[0] ?? null;\n }\n}\n","import type { McpServerDefinition, McpServerMetadata, McpServerScope } from \"@nextclaw/core\";\nimport {\n normalizeMcpServerName,\n type McpMarketplaceInstallTemplate,\n type McpMaterializeInstallParams\n} from \"../types.js\";\n\nexport class McpInstallTemplateMaterializer {\n materialize(params: McpMaterializeInstallParams): { name: string; definition: McpServerDefinition } {\n const name = normalizeMcpServerName(params.name?.trim() || params.template.defaultName);\n const inputs = params.inputs ?? {};\n const definition = this.applyInputs(params.template.template, inputs);\n definition.enabled = params.enabled ?? definition.enabled;\n definition.scope = this.mergeScope(definition.scope, params.scope);\n definition.metadata = this.mergeMetadata(definition.metadata, params.template, params.metadata);\n return { name, definition };\n }\n\n private applyInputs(definition: McpServerDefinition, inputs: Record<string, string | undefined>): McpServerDefinition {\n const replacer = (value: string): string =>\n value.replace(/\\{\\{\\s*([A-Za-z0-9._-]+)\\s*\\}\\}/g, (_, key: string) => inputs[key]?.trim() ?? \"\");\n\n const transform = (value: unknown): unknown => {\n if (typeof value === \"string\") {\n return replacer(value);\n }\n if (Array.isArray(value)) {\n return value.map((entry) => transform(entry));\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, transform(entry)])\n );\n };\n\n return transform(structuredClone(definition)) as McpServerDefinition;\n }\n\n private mergeScope(current: McpServerScope, override?: Partial<McpServerScope>): McpServerScope {\n if (!override) {\n return current;\n }\n const agents = Array.from(new Set((override.agents ?? current.agents ?? []).map((entry) => entry.trim()).filter(Boolean)));\n const allAgents = override.allAgents ?? current.allAgents ?? agents.length === 0;\n return {\n allAgents,\n agents: allAgents ? [] : agents\n };\n }\n\n private mergeMetadata(\n current: McpServerMetadata | undefined,\n template: McpMarketplaceInstallTemplate,\n override?: Partial<McpServerMetadata>\n ): McpServerMetadata {\n return {\n ...current,\n source: \"marketplace\",\n catalogSlug: template.spec,\n displayName: override?.displayName ?? current?.displayName,\n vendor: override?.vendor ?? current?.vendor,\n docsUrl: override?.docsUrl ?? current?.docsUrl,\n homepage: override?.homepage ?? current?.homepage,\n trustLevel: override?.trustLevel ?? current?.trustLevel ?? \"official\",\n installedAt: override?.installedAt ?? current?.installedAt ?? new Date().toISOString(),\n ...(override ?? {})\n };\n }\n}\n","import type { Config, McpServerDefinition } from \"@nextclaw/core\";\nimport { getMcpServer, listMcpServers } from \"../config/mcp-config-normalizer.js\";\nimport { McpInstallTemplateMaterializer } from \"../install/mcp-install-template-materializer.js\";\nimport {\n normalizeMcpServerName,\n type McpMarketplaceInstallTemplate,\n type McpMaterializeInstallParams,\n type McpMutationResult\n} from \"../types.js\";\n\nexport class McpMutationService {\n private readonly materializer: McpInstallTemplateMaterializer;\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n saveConfig: (config: Config) => void;\n materializer?: McpInstallTemplateMaterializer;\n }\n ) {\n this.materializer = this.options.materializer ?? new McpInstallTemplateMaterializer();\n }\n\n listServerNames(): string[] {\n return listMcpServers(this.options.getConfig()).map((record) => record.name);\n }\n\n addServer(name: string, definition: McpServerDefinition): McpMutationResult {\n const normalizedName = normalizeMcpServerName(name);\n const config = this.options.getConfig();\n if (config.mcp.servers[normalizedName]) {\n return {\n changed: false,\n name: normalizedName,\n message: `MCP server already exists: ${normalizedName}. Use 'mcp list' or remove it first.`,\n definition: config.mcp.servers[normalizedName]\n };\n }\n\n config.mcp.servers[normalizedName] = definition;\n this.options.saveConfig(config);\n return {\n changed: true,\n name: normalizedName,\n message: `Added MCP server ${normalizedName}.`,\n definition\n };\n }\n\n updateServer(name: string, definition: McpServerDefinition): McpMutationResult {\n const normalizedName = normalizeMcpServerName(name);\n const config = this.options.getConfig();\n if (!config.mcp.servers[normalizedName]) {\n return {\n changed: false,\n name: normalizedName,\n message: `Unknown MCP server: ${normalizedName}`\n };\n }\n\n config.mcp.servers[normalizedName] = definition;\n this.options.saveConfig(config);\n return {\n changed: true,\n name: normalizedName,\n message: `Updated MCP server ${normalizedName}.`,\n definition\n };\n }\n\n removeServer(name: string): McpMutationResult {\n const normalizedName = normalizeMcpServerName(name);\n const config = this.options.getConfig();\n if (!config.mcp.servers[normalizedName]) {\n return {\n changed: false,\n name: normalizedName,\n message: `Unknown MCP server: ${normalizedName}`\n };\n }\n delete config.mcp.servers[normalizedName];\n this.options.saveConfig(config);\n return {\n changed: true,\n name: normalizedName,\n message: `Removed MCP server ${normalizedName}.`\n };\n }\n\n toggleEnabled(name: string, enabled: boolean): McpMutationResult {\n const normalizedName = normalizeMcpServerName(name);\n const config = this.options.getConfig();\n const current = config.mcp.servers[normalizedName];\n if (!current) {\n return {\n changed: false,\n name: normalizedName,\n message: `Unknown MCP server: ${normalizedName}`\n };\n }\n current.enabled = enabled;\n this.options.saveConfig(config);\n return {\n changed: true,\n name: normalizedName,\n message: `${enabled ? \"Enabled\" : \"Disabled\"} MCP server ${normalizedName}.`,\n definition: current\n };\n }\n\n installFromTemplate(params: Omit<McpMaterializeInstallParams, \"template\"> & {\n template: McpMarketplaceInstallTemplate;\n }): McpMutationResult {\n const materialized = this.materializer.materialize(params);\n return this.addServer(materialized.name, materialized.definition);\n }\n\n duplicateServer(sourceName: string, targetName: string): McpMutationResult {\n const source = getMcpServer(this.options.getConfig(), sourceName);\n if (!source) {\n return {\n changed: false,\n name: normalizeMcpServerName(sourceName),\n message: `Unknown MCP server: ${normalizeMcpServerName(sourceName)}`\n };\n }\n const definition = structuredClone(source.definition) as McpServerDefinition;\n if (definition.metadata) {\n definition.metadata = {\n ...definition.metadata,\n installedAt: new Date().toISOString()\n };\n }\n return this.addServer(targetName, definition);\n }\n\n renameServer(sourceName: string, targetName: string): McpMutationResult {\n const source = getMcpServer(this.options.getConfig(), sourceName);\n if (!source) {\n return {\n changed: false,\n name: normalizeMcpServerName(sourceName),\n message: `Unknown MCP server: ${normalizeMcpServerName(sourceName)}`\n };\n }\n\n const nextName = normalizeMcpServerName(targetName);\n const config = this.options.getConfig();\n if (source.name === nextName) {\n return {\n changed: false,\n name: nextName,\n message: `MCP server already named ${nextName}.`,\n definition: source.definition\n };\n }\n if (config.mcp.servers[nextName]) {\n return {\n changed: false,\n name: nextName,\n message: `MCP server already exists: ${nextName}. Use another name.`\n };\n }\n\n delete config.mcp.servers[source.name];\n config.mcp.servers[nextName] = source.definition;\n this.options.saveConfig(config);\n return {\n changed: true,\n name: nextName,\n message: `Renamed MCP server ${source.name} -> ${nextName}.`,\n definition: source.definition\n };\n }\n}\n","import type { Config } from \"@nextclaw/core\";\nimport { McpRegistryService } from \"../registry/mcp-registry-service.js\";\nimport { type McpInstalledRecord } from \"../types.js\";\n\nexport class McpInstalledViewService {\n private readonly registryService: McpRegistryService;\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n registryService?: McpRegistryService;\n }\n ) {\n this.registryService = this.options.registryService ?? new McpRegistryService({\n getConfig: this.options.getConfig\n });\n }\n\n listInstalled(): McpInstalledRecord[] {\n return this.registryService.listServers().map((server) => {\n const metadata = server.definition.metadata;\n const cached = this.registryService.getCachedState(server.name);\n return {\n name: server.name,\n enabled: server.definition.enabled,\n transport: server.definition.transport.type,\n scope: server.definition.scope,\n source: metadata?.source === \"marketplace\" ? \"marketplace\" : \"manual\",\n catalogSlug: metadata?.catalogSlug,\n displayName: metadata?.displayName,\n vendor: metadata?.vendor,\n docsUrl: metadata?.docsUrl,\n homepage: metadata?.homepage,\n trustLevel: metadata?.trustLevel,\n installedAt: metadata?.installedAt,\n accessible: cached?.clientReady,\n toolCount: cached?.tools.length,\n lastReadyAt: cached?.lastReadyAt,\n lastError: cached?.lastError\n } satisfies McpInstalledRecord;\n });\n }\n}\n"],"mappings":";;;;;;AAkHA,SAAgB,uBAAuB,MAAsB;CAC3D,MAAM,aAAa,KAAK,MAAM;AAC9B,KAAI,CAAC,WACH,OAAM,IAAI,MAAM,+BAA+B;AAEjD,KAAI,CAAC,oBAAoB,KAAK,WAAW,CACvC,OAAM,IAAI,MAAM,gFAAgF;AAElG,QAAO;;AAGT,SAAgB,mBAAmB,QAAwB;AACzD,QACE,OAAO,OAAO,KAAK,MAAM,UAAU,MAAM,QAAQ,EAAE,IAAI,MAAM,IAC7D,OAAO,OAAO,KAAK,IAAI,IAAI,MAAM,IACjC;;AAIJ,SAAgB,0BAA0B,QAI9B;AACV,KAAI,OAAO,MAAM,UACf,QAAO;CAGT,MAAM,gBAAgB,OAAO,SAAS,MAAM,IAAI,mBAAmB,OAAO,OAAO;CACjF,MAAM,iBAAiB,OAAO,MAAM,OACjC,KAAK,YAAY,QAAQ,MAAM,CAAC,CAChC,OAAO,QAAQ;AAClB,KAAI,eAAe,SAAS,EAC1B,QAAO,eAAe,SAAS,cAAc;AAG/C,QAAO,kBAAkB,mBAAmB,OAAO,OAAO;;AAG5D,SAAgB,0BAA0B,YAAoB,UAA0B;AACtF,QAAO,OAAO,mBAAmB,WAAW,CAAC,IAAI,mBAAmB,SAAS;;AAG/E,SAAgB,mBAAmB,OAAuB;AAKxD,QAJkB,MACf,MAAM,CACN,QAAQ,mBAAmB,IAAI,CAC/B,QAAQ,YAAY,GAAG,IACN;;;;AC/JtB,SAAgB,eAAe,QAAmC;AAChE,QAAO,OAAO,QAAQ,OAAO,IAAI,QAAQ,CACtC,KAAK,CAAC,MAAM,iBAAiB;EAC5B,MAAM,uBAAuB,KAAK;EAClC;EACD,EAAE,CACF,MAAM,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,KAAK,CAAC;;AAG/D,SAAgB,aAAa,QAAgB,MAA2C;CACtF,MAAM,iBAAiB,uBAAuB,KAAK;CACnD,MAAM,aAAa,OAAO,IAAI,QAAQ;AACtC,KAAI,CAAC,WACH;AAEF,QAAO;EACL,MAAM;EACN;EACD;;;;ACPH,SAAS,eAAuB;AAC9B,QAAO,IAAI,OAAO;EAChB,MAAM;EACN,SAAS;EACV,CAAC;;AAGJ,SAAS,WAAW,WAA6D;CAC/E,MAAM,YAAY,UAAU;CAC5B,MAAM,gBAAgB,UAAU,YAAY,OAAO,IAAI,MAAM,EAC3D,SAAS,EACP,oBAAoB,OACrB,EACF,CAAC;AAEF,QAAO,OAAO,OAAO,SAAS;EAC5B,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,UAAU;AAC/D,MAAI;AACF,UAAO,MAAMA,MAAY,OAAO;IAC9B,GAAG;IACH,YAAY,iBAAkB,MAA6C;IAC3E,QAAQ,WAAW;IACpB,CAAC;YACM;AACR,gBAAa,QAAQ;;;;AAK3B,SAAS,qBAAqB,WAAyC;AACrE,QAAO,IAAI,qBAAqB;EAC9B,SAAS,UAAU;EACnB,MAAM,UAAU;EAChB,KAAK,UAAU;EACf,KAAK,OAAO,KAAK,UAAU,IAAI,CAAC,SAAS,IAAI,UAAU,MAAM,KAAA;EAC7D,QAAQ,UAAU;EACnB,CAAC;;AAGJ,SAAS,oBAAoB,WAAwC;AACnE,QAAO,IAAI,8BAA8B,IAAI,IAAI,UAAU,IAAI,EAAE;EAC/D,aAAa,EACX,SAAS,UAAU,SACpB;EACD,OAAO,WAAW,UAAU;EAC7B,CAAC;;AAGJ,SAAS,mBAAmB,WAAuC;AACjE,QAAO,IAAI,mBAAmB,IAAI,IAAI,UAAU,IAAI,EAAE;EACpD,aAAa,EACX,SAAS,UAAU,SACpB;EACD,iBAAiB;GACf,OAAO,WAAW,UAAU;GAC5B,SAAS,UAAU;GACpB;EACD,OAAO,WAAW,UAAU;EAC7B,CAAC;;AAGJ,IAAa,mBAAb,MAA8B;CAC5B,YAAY,SAAmC;AAAlB,OAAA,UAAA;AACtB,OAAK;;CAGZ,OAAO,QAA0C;EAC/C,MAAM,mBAAmB;AACvB,WAAQ,OAAO,WAAW,UAAU,MAApC;IACE,KAAK,QACH,QAAO,qBAAqB,OAAO,WAAW,UAAU;IAC1D,KAAK,OACH,QAAO,oBAAoB,OAAO,WAAW,UAAU;IACzD,KAAK,MACH,QAAO,mBAAmB,OAAO,WAAW,UAAU;IACxD,QACE,OAAM,IAAI,MAAM,8BAA8B,OAAQ,OAAO,WAAW,UAAgC,KAAK,GAAG;;MAElH;AAEJ,SAAO;GACL,QAAQ,cAAc;GACtB;GACD;;;;;ACjFL,IAAa,4BAAb,MAAuC;CACrC,qCAAsC,IAAI,KAAwC;CAClF,mCAAoC,IAAI,KAA+B;CAEvE,YACE,SAKA;AALiB,OAAA,UAAA;;CAOnB,MAAM,WAAW,QAAqD;EACpE,MAAM,aAAa,MAAM,KAAK,iBAAiB,OAAO;AACtD,SAAO,KAAK,gBAAgB,WAAW;;CAGzC,iBAAiB,YAA2C;AAC1D,SAAO,KAAK,iBAAiB,IAAI,WAAW,EAAE,SAAS,EAAE;;CAG3D,eAAe,YAAmD;EAChE,MAAM,QAAQ,KAAK,iBAAiB,IAAI,WAAW;AACnD,MAAI,CAAC,MACH;AAEF,SAAO,KAAK,gBAAgB,MAAM;;CAGpC,MAAM,SAAS,QAAyB,UAAkB,MAAiD;EAEzG,MAAM,SAAS,OADI,MAAM,KAAK,iBAAiB,OAAO,EACtB,OAAO,SAAS;GAC9C,MAAM;GACN,WAAW;GACZ,CAAC;AACF,SAAO,KAAK,oBAAoB,OAAO;;CAGzC,MAAM,WAA0B;EAC9B,MAAM,UAAU,MAAM,QAAQ,WAAW,KAAK,mBAAmB,QAAQ,CAAC;AAC1E,OAAK,MAAM,UAAU,QACnB,KAAI,OAAO,WAAW,YACpB,MAAK,iBAAiB,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM;AAGrE,OAAK,MAAM,cAAc,KAAK,iBAAiB,QAAQ,CACrD,OAAM,WAAW,UAAU,OAAO,CAAC,YAAY,GAAG;AAEpD,OAAK,mBAAmB,OAAO;AAC/B,OAAK,iBAAiB,OAAO;;CAG/B,MAAM,YAAY,YAAmC;EACnD,MAAM,QAAQ,KAAK,iBAAiB,IAAI,WAAW;AACnD,OAAK,iBAAiB,OAAO,WAAW;EAExC,MAAM,UAAU,KAAK,mBAAmB,IAAI,WAAW;AACvD,OAAK,mBAAmB,OAAO,WAAW;AAE1C,MAAI,MACF,OAAM,MAAM,UAAU,OAAO,CAAC,YAAY,GAAG;AAG/C,MAAI,CAAC,QACH;EAIF,MAAM,WADS,MAAM,QAAQ,WAAW,CAAC,QAAQ,CAAC,EAC3B;AACvB,MAAI,SAAS,WAAW,YACtB,OAAM,QAAQ,MAAM,UAAU,OAAO,CAAC,YAAY,GAAG;AAEvD,OAAK,iBAAiB,OAAO,WAAW;AACxC,OAAK,mBAAmB,OAAO,WAAW;;CAG5C,MAAc,iBAAiB,QAAoD;EACjF,MAAM,QAAQ,KAAK,iBAAiB,IAAI,OAAO,KAAK;AACpD,MAAI,MACF,QAAO;EAGT,MAAM,WAAW,KAAK,mBAAmB,IAAI,OAAO,KAAK;AACzD,MAAI,SACF,QAAO;EAGT,MAAM,OAAO,KAAK,QAAQ,OAAO;AACjC,OAAK,mBAAmB,IAAI,OAAO,MAAM,KAAK;AAE9C,MAAI;GACF,MAAM,aAAa,MAAM;AACzB,QAAK,iBAAiB,IAAI,OAAO,MAAM,WAAW;AAClD,QAAK,mBAAmB,OAAO,OAAO,KAAK;AAC3C,UAAO;WACA,OAAO;AACd,QAAK,mBAAmB,OAAO,OAAO,KAAK;AAC3C,SAAM;;;CAIV,MAAc,QAAQ,QAAoD;EACxE,MAAM,SAAS,KAAK,QAAQ,WAAW;EAEvC,MAAM,EAAE,QAAQ,eADM,KAAK,QAAQ,iBAAiB,IAAI,iBAAiB,OAAO,EACpC,OAAO,OAAO;AAC1D,QAAM,OAAO,QAAQ,UAAU;AAU/B,SAAO;GACL;GACA,QAXkB,MAAM,OAAO,WAAW,EAClB,MAAM,KAAK,UAAU;IAC7C,eAAe,0BAA0B,OAAO,MAAM,KAAK,KAAK;IAChE,YAAY,OAAO;IACnB,UAAU,KAAK;IACf,aAAa,KAAK;IAClB,YAAY,KAAK;IAClB,EAAE;GAKD,aAAa;GACb,cALW,KAAK,QAAQ,8BAAc,IAAI,MAAM,IAAI,CAAC,aAAa;GAMlE;GACA;GACD;;CAGH,gBAAwB,YAAiD;AACvE,SAAO;GACL,QAAQ,WAAW;GACnB,OAAO,WAAW;GAClB,aAAa,WAAW;GACxB,aAAa,WAAW;GACxB,WAAW,WAAW;GACvB;;CAGH,oBAA4B,QAA2D;AACrF,MAAI,gBAAgB,OAClB,QAAO,OAAO;AAEhB,SAAO;GACL,SAAS,OAAO;GAChB,mBAAmB,OAAO;GAC1B,SAAS,OAAO,WAAW;GAC5B;;;;;ACpJL,IAAa,qBAAb,MAAgC;CAC9B;CAEA,YACE,SAIA;AAJiB,OAAA,UAAA;AAKjB,OAAK,mBAAmB,KAAK,QAAQ,oBAAoB,IAAI,0BAA0B,EACrF,WAAW,KAAK,QAAQ,WACzB,CAAC;;CAGJ,cAAiC;AAC/B,SAAO,eAAe,KAAK,QAAQ,WAAW,CAAC;;CAGjD,UAAU,MAA2C;AACnD,SAAO,aAAa,KAAK,QAAQ,WAAW,EAAE,KAAK;;CAGrD,MAAM,wBAAwD;AAsB5D,UArBgB,MAAM,QAAQ,IAC5B,KAAK,aAAa,CACf,QAAQ,WAAW,OAAO,WAAW,QAAQ,CAC7C,IAAI,OAAO,WAAW;AACrB,OAAI;IACF,MAAM,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO;AAC5D,WAAO;KACL,MAAM,OAAO;KACb,IAAI;KACJ,WAAW,MAAM,MAAM;KACxB;YACM,OAAO;AACd,WAAO;KACL,MAAM,OAAO;KACb,IAAI;KACJ,WAAW;KACX,OAAO,eAAe,MAAM;KAC7B;;IAEH,CACL,EACc,MAAM,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,KAAK,CAAC;;CAG3E,MAAM,WAAW,MAA4C;EAC3D,MAAM,SAAS,KAAK,UAAU,KAAK;AACnC,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,uBAAuB,OAAO;AAGhD,MAAI;GACF,MAAM,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO;AAC5D,UAAO;IACL,MAAM,OAAO;IACb,IAAI;IACJ,WAAW,MAAM,MAAM;IACxB;WACM,OAAO;AACd,UAAO;IACL,MAAM,OAAO;IACb,IAAI;IACJ,WAAW;IACX,OAAO,eAAe,MAAM;IAC7B;;;CAIL,MAAM,gBAAgB,QAGgB;EACpC,MAAM,kBAAkB,IAAI,IAAI,eAAe,OAAO,WAAW,CAAC,KAAK,WAAW,CAAC,OAAO,MAAM,OAAO,CAAC,CAAC;EACzG,MAAM,cAAc,IAAI,IAAI,eAAe,OAAO,WAAW,CAAC,KAAK,WAAW,CAAC,OAAO,MAAM,OAAO,CAAC,CAAC;EACrG,MAAM,cAAc,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,gBAAgB,MAAM,EAAE,GAAG,YAAY,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,UACtG,KAAK,cAAc,MAAM,CAC1B;EAED,MAAM,SAAmC;GACvC,OAAO,EAAE;GACT,SAAS,EAAE;GACX,SAAS,EAAE;GACX,UAAU,EAAE;GACZ,WAAW,EAAE;GACb,QAAQ,EAAE;GACX;AAED,OAAK,MAAM,cAAc,aAAa;GACpC,MAAM,WAAW,gBAAgB,IAAI,WAAW;GAChD,MAAM,OAAO,YAAY,IAAI,WAAW;AAExC,OAAI,CAAC,MAAM;AACT,UAAM,KAAK,iBAAiB,YAAY,WAAW;AACnD,WAAO,QAAQ,KAAK,WAAW;AAC/B;;AAGF,OAAI,CAAC,UAAU;AACb,WAAO,MAAM,KAAK,WAAW;AAC7B,QAAI,KAAK,WAAW,QAClB,QAAO,OAAO,KAAK,MAAM,KAAK,WAAW,KAAK,CAAC;AAEjD;;AAGF,OAAI,SAAS,WAAW,WAAW,CAAC,KAAK,WAAW,SAAS;AAC3D,UAAM,KAAK,iBAAiB,YAAY,WAAW;AACnD,WAAO,SAAS,KAAK,WAAW;AAChC;;AAGF,OAAI,CAAC,SAAS,WAAW,WAAW,KAAK,WAAW,SAAS;AAC3D,WAAO,QAAQ,KAAK,WAAW;AAC/B,WAAO,OAAO,KAAK,MAAM,KAAK,WAAW,KAAK,CAAC;AAC/C;;AAGF,OAAI,2BAA2B,SAAS,YAAY,KAAK,WAAW,EAAE;AACpE,UAAM,KAAK,iBAAiB,YAAY,WAAW;AACnD,WAAO,UAAU,KAAK,WAAW;AACjC,QAAI,KAAK,WAAW,QAClB,QAAO,OAAO,KAAK,MAAM,KAAK,WAAW,KAAK,CAAC;;;AAKrD,SAAO;;CAGT,oBAAoB,SAA2B,EAAE,EAAyB;EACxE,MAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,SAAO,KAAK,aAAa,CACtB,QAAQ,WAAW,OAAO,WAAW,QAAQ,CAC7C,QAAQ,WACP,0BAA0B;GACxB;GACA,OAAO,OAAO,WAAW;GACzB,SAAS,OAAO;GACjB,CAAC,CACH,CACA,SAAS,WAAW,KAAK,iBAAiB,iBAAiB,OAAO,KAAK,CAAC,CACxE,MAAM,MAAM,UAAU,KAAK,cAAc,cAAc,MAAM,cAAc,CAAC;;CAGjF,eAAe,YAAoB;AACjC,SAAO,KAAK,iBAAiB,eAAe,WAAW;;CAGzD,MAAM,SAAS,QAIM;EACnB,MAAM,SAAS,KAAK,UAAU,OAAO,WAAW;AAChD,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,uBAAuB,OAAO,aAAa;AAE7D,SAAO,KAAK,iBAAiB,SAAS,QAAQ,OAAO,UAAU,OAAO,KAAK;;CAG7E,MAAM,QAAuB;AAC3B,QAAM,KAAK,iBAAiB,UAAU;;CAGxC,MAAc,WAAW,QAAuD;AAC9E,MAAI;GACF,MAAM,QAAQ,MAAM,KAAK,iBAAiB,WAAW,OAAO;AAC5D,UAAO;IACL,MAAM,OAAO;IACb,IAAI;IACJ,WAAW,MAAM,MAAM;IACxB;WACM,OAAO;AACd,UAAO;IACL,MAAM,OAAO;IACb,IAAI;IACJ,WAAW;IACX,OAAO,eAAe,MAAM;IAC7B;;;;AAKP,SAAS,eAAe,OAAwB;AAC9C,QAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;AAG/D,SAAS,2BAA2B,MAA2B,OAAqC;AAClG,QAAO,KAAK,UAAU,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,UAAU;;;;ACtM3E,IAAa,mBAAb,MAA8B;CAC5B,YACE,SAIA;AAJiB,OAAA,UAAA;;CAMnB,MAAM,QAAQ,MAA2C;EACvD,MAAM,WAAW,KAAK,QAAQ,mBAAmB,IAAI,mBAAmB,EACtE,WAAW,KAAK,QAAQ,WACzB,CAAC;EACF,MAAM,iBAAiB,OAAO,SAAS,UAAU,KAAK,GAAG,KAAA;EACzD,MAAM,UAAU,iBAAiB,CAAC,eAAe,GAAG,OAAO,EAAE,GAAG,SAAS,aAAa;AACtF,SAAO,MAAM,QAAQ,IACnB,QAAQ,IAAI,OAAO,WAAW;GAC5B,MAAM,aAAa,MAAM,SAAS,WAAW,OAAO,KAAK;AACzD,UAAO;IACL,MAAM,OAAO;IACb,SAAS,OAAO,WAAW;IAC3B,WAAW,OAAO,WAAW,UAAU;IACvC,YAAY,WAAW;IACvB,WAAW,WAAW;IACtB,GAAI,WAAW,QAAQ,EAAE,OAAO,WAAW,OAAO,GAAG,EAAE;IACxD;IACD,CACH;;;;;ACzBL,IAAa,kBAAb,MAA6B;CAC3B;CAEA,YACE,SAIA;AAJiB,OAAA,UAAA;AAKjB,OAAK,gBAAgB,IAAI,iBAAiB;GACxC,WAAW,KAAK,QAAQ;GACxB,iBAAiB,KAAK,QAAQ;GAC/B,CAAC;;CAGJ,MAAM,QAAQ,MAA2C;AACvD,SAAO,MAAM,KAAK,cAAc,QAAQ,KAAK;;CAG/C,MAAM,WAAW,MAA+C;AAE9D,UADgB,MAAM,KAAK,QAAQ,KAAK,EACzB,MAAM;;;;;ACnBzB,IAAa,iCAAb,MAA4C;CAC1C,YAAY,QAAwF;EAClG,MAAM,OAAO,uBAAuB,OAAO,MAAM,MAAM,IAAI,OAAO,SAAS,YAAY;EACvF,MAAM,SAAS,OAAO,UAAU,EAAE;EAClC,MAAM,aAAa,KAAK,YAAY,OAAO,SAAS,UAAU,OAAO;AACrE,aAAW,UAAU,OAAO,WAAW,WAAW;AAClD,aAAW,QAAQ,KAAK,WAAW,WAAW,OAAO,OAAO,MAAM;AAClE,aAAW,WAAW,KAAK,cAAc,WAAW,UAAU,OAAO,UAAU,OAAO,SAAS;AAC/F,SAAO;GAAE;GAAM;GAAY;;CAG7B,YAAoB,YAAiC,QAAiE;EACpH,MAAM,YAAY,UAChB,MAAM,QAAQ,qCAAqC,GAAG,QAAgB,OAAO,MAAM,MAAM,IAAI,GAAG;EAElG,MAAM,aAAa,UAA4B;AAC7C,OAAI,OAAO,UAAU,SACnB,QAAO,SAAS,MAAM;AAExB,OAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC;AAE/C,OAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO;AAET,UAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU,MAAM,CAAC,CAAC,CACrE;;AAGH,SAAO,UAAU,gBAAgB,WAAW,CAAC;;CAG/C,WAAmB,SAAyB,UAAoD;AAC9F,MAAI,CAAC,SACH,QAAO;EAET,MAAM,SAAS,MAAM,KAAK,IAAI,KAAK,SAAS,UAAU,QAAQ,UAAU,EAAE,EAAE,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC;EAC1H,MAAM,YAAY,SAAS,aAAa,QAAQ,aAAa,OAAO,WAAW;AAC/E,SAAO;GACL;GACA,QAAQ,YAAY,EAAE,GAAG;GAC1B;;CAGH,cACE,SACA,UACA,UACmB;AACnB,SAAO;GACL,GAAG;GACH,QAAQ;GACR,aAAa,SAAS;GACtB,aAAa,UAAU,eAAe,SAAS;GAC/C,QAAQ,UAAU,UAAU,SAAS;GACrC,SAAS,UAAU,WAAW,SAAS;GACvC,UAAU,UAAU,YAAY,SAAS;GACzC,YAAY,UAAU,cAAc,SAAS,cAAc;GAC3D,aAAa,UAAU,eAAe,SAAS,gCAAe,IAAI,MAAM,EAAC,aAAa;GACtF,GAAI,YAAY,EAAE;GACnB;;;;;AC1DL,IAAa,qBAAb,MAAgC;CAC9B;CAEA,YACE,SAKA;AALiB,OAAA,UAAA;AAMjB,OAAK,eAAe,KAAK,QAAQ,gBAAgB,IAAI,gCAAgC;;CAGvF,kBAA4B;AAC1B,SAAO,eAAe,KAAK,QAAQ,WAAW,CAAC,CAAC,KAAK,WAAW,OAAO,KAAK;;CAG9E,UAAU,MAAc,YAAoD;EAC1E,MAAM,iBAAiB,uBAAuB,KAAK;EACnD,MAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,MAAI,OAAO,IAAI,QAAQ,gBACrB,QAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,8BAA8B,eAAe;GACtD,YAAY,OAAO,IAAI,QAAQ;GAChC;AAGH,SAAO,IAAI,QAAQ,kBAAkB;AACrC,OAAK,QAAQ,WAAW,OAAO;AAC/B,SAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,oBAAoB,eAAe;GAC5C;GACD;;CAGH,aAAa,MAAc,YAAoD;EAC7E,MAAM,iBAAiB,uBAAuB,KAAK;EACnD,MAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,MAAI,CAAC,OAAO,IAAI,QAAQ,gBACtB,QAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,uBAAuB;GACjC;AAGH,SAAO,IAAI,QAAQ,kBAAkB;AACrC,OAAK,QAAQ,WAAW,OAAO;AAC/B,SAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,sBAAsB,eAAe;GAC9C;GACD;;CAGH,aAAa,MAAiC;EAC5C,MAAM,iBAAiB,uBAAuB,KAAK;EACnD,MAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,MAAI,CAAC,OAAO,IAAI,QAAQ,gBACtB,QAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,uBAAuB;GACjC;AAEH,SAAO,OAAO,IAAI,QAAQ;AAC1B,OAAK,QAAQ,WAAW,OAAO;AAC/B,SAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,sBAAsB,eAAe;GAC/C;;CAGH,cAAc,MAAc,SAAqC;EAC/D,MAAM,iBAAiB,uBAAuB,KAAK;EACnD,MAAM,SAAS,KAAK,QAAQ,WAAW;EACvC,MAAM,UAAU,OAAO,IAAI,QAAQ;AACnC,MAAI,CAAC,QACH,QAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,uBAAuB;GACjC;AAEH,UAAQ,UAAU;AAClB,OAAK,QAAQ,WAAW,OAAO;AAC/B,SAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,GAAG,UAAU,YAAY,WAAW,cAAc,eAAe;GAC1E,YAAY;GACb;;CAGH,oBAAoB,QAEE;EACpB,MAAM,eAAe,KAAK,aAAa,YAAY,OAAO;AAC1D,SAAO,KAAK,UAAU,aAAa,MAAM,aAAa,WAAW;;CAGnE,gBAAgB,YAAoB,YAAuC;EACzE,MAAM,SAAS,aAAa,KAAK,QAAQ,WAAW,EAAE,WAAW;AACjE,MAAI,CAAC,OACH,QAAO;GACL,SAAS;GACT,MAAM,uBAAuB,WAAW;GACxC,SAAS,uBAAuB,uBAAuB,WAAW;GACnE;EAEH,MAAM,aAAa,gBAAgB,OAAO,WAAW;AACrD,MAAI,WAAW,SACb,YAAW,WAAW;GACpB,GAAG,WAAW;GACd,8BAAa,IAAI,MAAM,EAAC,aAAa;GACtC;AAEH,SAAO,KAAK,UAAU,YAAY,WAAW;;CAG/C,aAAa,YAAoB,YAAuC;EACtE,MAAM,SAAS,aAAa,KAAK,QAAQ,WAAW,EAAE,WAAW;AACjE,MAAI,CAAC,OACH,QAAO;GACL,SAAS;GACT,MAAM,uBAAuB,WAAW;GACxC,SAAS,uBAAuB,uBAAuB,WAAW;GACnE;EAGH,MAAM,WAAW,uBAAuB,WAAW;EACnD,MAAM,SAAS,KAAK,QAAQ,WAAW;AACvC,MAAI,OAAO,SAAS,SAClB,QAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,4BAA4B,SAAS;GAC9C,YAAY,OAAO;GACpB;AAEH,MAAI,OAAO,IAAI,QAAQ,UACrB,QAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,8BAA8B,SAAS;GACjD;AAGH,SAAO,OAAO,IAAI,QAAQ,OAAO;AACjC,SAAO,IAAI,QAAQ,YAAY,OAAO;AACtC,OAAK,QAAQ,WAAW,OAAO;AAC/B,SAAO;GACL,SAAS;GACT,MAAM;GACN,SAAS,sBAAsB,OAAO,KAAK,MAAM,SAAS;GAC1D,YAAY,OAAO;GACpB;;;;;ACxKL,IAAa,0BAAb,MAAqC;CACnC;CAEA,YACE,SAIA;AAJiB,OAAA,UAAA;AAKjB,OAAK,kBAAkB,KAAK,QAAQ,mBAAmB,IAAI,mBAAmB,EAC5E,WAAW,KAAK,QAAQ,WACzB,CAAC;;CAGJ,gBAAsC;AACpC,SAAO,KAAK,gBAAgB,aAAa,CAAC,KAAK,WAAW;GACxD,MAAM,WAAW,OAAO,WAAW;GACnC,MAAM,SAAS,KAAK,gBAAgB,eAAe,OAAO,KAAK;AAC/D,UAAO;IACL,MAAM,OAAO;IACb,SAAS,OAAO,WAAW;IAC3B,WAAW,OAAO,WAAW,UAAU;IACvC,OAAO,OAAO,WAAW;IACzB,QAAQ,UAAU,WAAW,gBAAgB,gBAAgB;IAC7D,aAAa,UAAU;IACvB,aAAa,UAAU;IACvB,QAAQ,UAAU;IAClB,SAAS,UAAU;IACnB,UAAU,UAAU;IACpB,YAAY,UAAU;IACtB,aAAa,UAAU;IACvB,YAAY,QAAQ;IACpB,WAAW,QAAQ,MAAM;IACzB,aAAa,QAAQ;IACrB,WAAW,QAAQ;IACpB;IACD"}
1
+ {"version":3,"file":"index.js","names":["undiciFetch"],"sources":["../src/types.ts","../src/config/mcp-config-normalizer.ts","../src/client/mcp-client-factory.ts","../src/lifecycle/mcp-server-lifecycle-manager.ts","../src/registry/mcp-registry-service.ts","../src/doctor/mcp-doctor-service.ts","../src/doctor/mcp-doctor-facade.ts","../src/install/mcp-install-template-materializer.ts","../src/manage/mcp-mutation-service.ts","../src/view/mcp-installed-view-service.ts"],"sourcesContent":["import type {\n Config,\n McpServerDefinition,\n McpServerMetadata,\n McpServerScope,\n McpTransport\n} from \"@nextclaw/core\";\n\nexport type McpServerRecord = {\n name: string;\n definition: McpServerDefinition;\n};\n\nexport type McpToolCatalogEntry = {\n qualifiedName: string;\n serverName: string;\n toolName: string;\n description?: string;\n parameters?: Record<string, unknown>;\n};\n\nexport type McpServerWarmResult = {\n name: string;\n ok: boolean;\n toolCount: number;\n error?: string;\n};\n\nexport type McpDoctorReport = {\n name: string;\n enabled: boolean;\n transport: McpTransport[\"type\"];\n accessible: boolean;\n toolCount: number;\n error?: string;\n};\n\nexport type McpConfigReconcileResult = {\n added: string[];\n removed: string[];\n enabled: string[];\n disabled: string[];\n restarted: string[];\n warmed: McpServerWarmResult[];\n};\n\nexport type McpCatalogFilter = {\n agentId?: string;\n};\n\nexport type McpLifecycleState = {\n record: McpServerRecord;\n tools: McpToolCatalogEntry[];\n clientReady: boolean;\n lastReadyAt?: string;\n lastError?: string;\n};\n\nexport type McpMarketplaceTransportType = McpTransport[\"type\"];\n\nexport type McpMarketplaceInputField = {\n id: string;\n label: string;\n description?: string;\n required?: boolean;\n secret?: boolean;\n defaultValue?: string;\n};\n\nexport type McpMarketplaceInstallTemplate = {\n kind: \"template\";\n spec: string;\n command: string;\n defaultName: string;\n transportTypes: McpMarketplaceTransportType[];\n template: McpServerDefinition;\n inputs: McpMarketplaceInputField[];\n};\n\nexport type McpInstalledRecord = {\n name: string;\n enabled: boolean;\n transport: McpTransport[\"type\"];\n scope: McpServerScope;\n source: \"manual\" | \"marketplace\";\n catalogSlug?: string;\n displayName?: string;\n vendor?: string;\n docsUrl?: string;\n homepage?: string;\n trustLevel?: \"official\" | \"verified\" | \"community\";\n installedAt?: string;\n toolCount?: number;\n accessible?: boolean;\n lastReadyAt?: string;\n lastError?: string;\n};\n\nexport type McpMutationResult = {\n changed: boolean;\n name: string;\n message: string;\n definition?: McpServerDefinition;\n};\n\nexport type McpMaterializeInstallParams = {\n template: McpMarketplaceInstallTemplate;\n name?: string;\n enabled?: boolean;\n scope?: Partial<McpServerScope>;\n inputs?: Record<string, string | undefined>;\n metadata?: Partial<McpServerMetadata>;\n};\n\nexport function normalizeMcpServerName(name: string): string {\n const normalized = name.trim();\n if (!normalized) {\n throw new Error(\"MCP server name is required.\");\n }\n if (!/^[A-Za-z0-9._-]+$/.test(normalized)) {\n throw new Error(\"MCP server name may only contain letters, numbers, dot, underscore, and dash.\");\n }\n return normalized;\n}\n\nexport function readDefaultAgentId(config: Config): string {\n return (\n config.agents.list.find((entry) => entry.default)?.id?.trim() ||\n config.agents.list[0]?.id?.trim() ||\n \"main\"\n );\n}\n\nexport function isServerAccessibleToAgent(params: {\n config: Config;\n scope: McpServerScope;\n agentId?: string;\n}): boolean {\n if (params.scope.allAgents) {\n return true;\n }\n\n const targetAgentId = params.agentId?.trim() || readDefaultAgentId(params.config);\n const explicitAgents = params.scope.agents\n .map((agentId) => agentId.trim())\n .filter(Boolean);\n if (explicitAgents.length > 0) {\n return explicitAgents.includes(targetAgentId);\n }\n\n return targetAgentId === readDefaultAgentId(params.config);\n}\n\nexport function buildQualifiedMcpToolName(serverName: string, toolName: string): string {\n return `mcp_${sanitizeMcpSegment(serverName)}__${sanitizeMcpSegment(toolName)}`;\n}\n\nexport function sanitizeMcpSegment(value: string): string {\n const sanitized = value\n .trim()\n .replace(/[^A-Za-z0-9_]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return sanitized || \"unnamed\";\n}\n","import type { Config } from \"@nextclaw/core\";\nimport { normalizeMcpServerName, type McpServerRecord } from \"../types.js\";\n\nexport function listMcpServers(config: Config): McpServerRecord[] {\n return Object.entries(config.mcp.servers)\n .map(([name, definition]) => ({\n name: normalizeMcpServerName(name),\n definition\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nexport function getMcpServer(config: Config, name: string): McpServerRecord | undefined {\n const normalizedName = normalizeMcpServerName(name);\n const definition = config.mcp.servers[normalizedName];\n if (!definition) {\n return undefined;\n }\n return {\n name: normalizedName,\n definition\n };\n}\n","import { Agent, fetch as undiciFetch } from \"undici\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { Config, McpTransportHttp, McpTransportSse, McpTransportStdio } from \"@nextclaw/core\";\nimport type { McpServerRecord } from \"../types.js\";\n\ntype McpClientHandle = {\n client: Client;\n transport: Transport;\n};\n\nfunction createClient(): Client {\n return new Client({\n name: \"nextclaw-mcp-client\",\n version: \"0.1.0\"\n });\n}\n\nfunction buildFetch(transport: McpTransportHttp | McpTransportSse): typeof fetch {\n const timeoutMs = transport.timeoutMs;\n const insecureAgent = transport.verifyTls ? null : new Agent({\n connect: {\n rejectUnauthorized: false\n }\n });\n\n return async (input, init) => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await undiciFetch(input, {\n ...init,\n dispatcher: insecureAgent ?? (init as { dispatcher?: Agent } | undefined)?.dispatcher,\n signal: controller.signal\n });\n } finally {\n clearTimeout(timeout);\n }\n };\n}\n\nfunction createStdioTransport(transport: McpTransportStdio): Transport {\n return new StdioClientTransport({\n command: transport.command,\n args: transport.args,\n cwd: transport.cwd,\n env: Object.keys(transport.env).length > 0 ? transport.env : undefined,\n stderr: transport.stderr\n });\n}\n\nfunction createHttpTransport(transport: McpTransportHttp): Transport {\n return new StreamableHTTPClientTransport(new URL(transport.url), {\n requestInit: {\n headers: transport.headers\n },\n fetch: buildFetch(transport)\n });\n}\n\nfunction createSseTransport(transport: McpTransportSse): Transport {\n return new SSEClientTransport(new URL(transport.url), {\n requestInit: {\n headers: transport.headers\n },\n eventSourceInit: {\n fetch: buildFetch(transport),\n headers: transport.headers\n } as RequestInit & { fetch: typeof fetch },\n fetch: buildFetch(transport)\n });\n}\n\nexport class McpClientFactory {\n constructor(private readonly _config?: Config) {\n void this._config;\n }\n\n create(record: McpServerRecord): McpClientHandle {\n const transport = (() => {\n switch (record.definition.transport.type) {\n case \"stdio\":\n return createStdioTransport(record.definition.transport);\n case \"http\":\n return createHttpTransport(record.definition.transport);\n case \"sse\":\n return createSseTransport(record.definition.transport);\n default:\n throw new Error(`Unsupported MCP transport: ${String((record.definition.transport as { type?: string }).type)}`);\n }\n })();\n\n return {\n client: createClient(),\n transport\n };\n }\n}\n","import type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { Config } from \"@nextclaw/core\";\nimport { McpClientFactory } from \"../client/mcp-client-factory.js\";\nimport {\n buildQualifiedMcpToolName,\n type McpLifecycleState,\n type McpServerRecord,\n type McpToolCatalogEntry\n} from \"../types.js\";\n\ntype ActiveConnection = McpLifecycleState & {\n client: Client;\n transport: Transport;\n};\n\nexport class McpServerLifecycleManager {\n private readonly pendingConnections = new Map<string, Promise<ActiveConnection>>();\n private readonly readyConnections = new Map<string, ActiveConnection>();\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n clientFactory?: McpClientFactory;\n now?: () => Date;\n }\n ) {}\n\n async warmServer(record: McpServerRecord): Promise<McpLifecycleState> {\n const connection = await this.ensureConnection(record);\n return this.stripConnection(connection);\n }\n\n getCachedCatalog(serverName: string): McpToolCatalogEntry[] {\n return this.readyConnections.get(serverName)?.tools ?? [];\n }\n\n getCachedState(serverName: string): McpLifecycleState | undefined {\n const ready = this.readyConnections.get(serverName);\n if (!ready) {\n return undefined;\n }\n return this.stripConnection(ready);\n }\n\n async callTool(\n record: McpServerRecord,\n toolName: string,\n args: Record<string, unknown>,\n options: { signal?: AbortSignal } = {},\n ): Promise<unknown> {\n const connection = await this.ensureConnection(record);\n const result = await connection.client.callTool({\n name: toolName,\n arguments: args\n }, undefined, { signal: options.signal });\n return this.normalizeToolResult(result);\n }\n\n async closeAll(): Promise<void> {\n const pending = await Promise.allSettled(this.pendingConnections.values());\n for (const result of pending) {\n if (result.status === \"fulfilled\") {\n this.readyConnections.set(result.value.record.name, result.value);\n }\n }\n for (const connection of this.readyConnections.values()) {\n await connection.transport.close().catch(() => {});\n }\n this.pendingConnections.clear();\n this.readyConnections.clear();\n }\n\n async closeServer(serverName: string): Promise<void> {\n const ready = this.readyConnections.get(serverName);\n this.readyConnections.delete(serverName);\n\n const pending = this.pendingConnections.get(serverName);\n this.pendingConnections.delete(serverName);\n\n if (ready) {\n await ready.transport.close().catch(() => {});\n }\n\n if (!pending) {\n return;\n }\n\n const result = await Promise.allSettled([pending]);\n const settled = result[0];\n if (settled?.status === \"fulfilled\") {\n await settled.value.transport.close().catch(() => {});\n }\n this.readyConnections.delete(serverName);\n this.pendingConnections.delete(serverName);\n }\n\n private async ensureConnection(record: McpServerRecord): Promise<ActiveConnection> {\n const ready = this.readyConnections.get(record.name);\n if (ready) {\n return ready;\n }\n\n const existing = this.pendingConnections.get(record.name);\n if (existing) {\n return existing;\n }\n\n const task = this.connect(record);\n this.pendingConnections.set(record.name, task);\n\n try {\n const connection = await task;\n this.readyConnections.set(record.name, connection);\n this.pendingConnections.delete(record.name);\n return connection;\n } catch (error) {\n this.pendingConnections.delete(record.name);\n throw error;\n }\n }\n\n private async connect(record: McpServerRecord): Promise<ActiveConnection> {\n const config = this.options.getConfig();\n const clientFactory = this.options.clientFactory ?? new McpClientFactory(config);\n const { client, transport } = clientFactory.create(record);\n await client.connect(transport);\n const listedTools = await client.listTools();\n const tools = listedTools.tools.map((tool) => ({\n qualifiedName: buildQualifiedMcpToolName(record.name, tool.name),\n serverName: record.name,\n toolName: tool.name,\n description: tool.description,\n parameters: tool.inputSchema\n }));\n const now = (this.options.now ?? (() => new Date()))().toISOString();\n return {\n record,\n tools,\n clientReady: true,\n lastReadyAt: now,\n client,\n transport\n };\n }\n\n private stripConnection(connection: ActiveConnection): McpLifecycleState {\n return {\n record: connection.record,\n tools: connection.tools,\n clientReady: connection.clientReady,\n lastReadyAt: connection.lastReadyAt,\n lastError: connection.lastError\n };\n }\n\n private normalizeToolResult(result: CallToolResult | { toolResult: unknown }): unknown {\n if (\"toolResult\" in result) {\n return result.toolResult;\n }\n return {\n content: result.content,\n structuredContent: result.structuredContent,\n isError: result.isError ?? false\n };\n }\n}\n","import type { Config, McpServerDefinition } from \"@nextclaw/core\";\nimport { getMcpServer, listMcpServers } from \"../config/mcp-config-normalizer.js\";\nimport { McpServerLifecycleManager } from \"../lifecycle/mcp-server-lifecycle-manager.js\";\nimport {\n isServerAccessibleToAgent,\n type McpConfigReconcileResult,\n type McpCatalogFilter,\n type McpServerRecord,\n type McpServerWarmResult,\n type McpToolCatalogEntry\n} from \"../types.js\";\n\nexport class McpRegistryService {\n private readonly lifecycleManager: McpServerLifecycleManager;\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n lifecycleManager?: McpServerLifecycleManager;\n }\n ) {\n this.lifecycleManager = this.options.lifecycleManager ?? new McpServerLifecycleManager({\n getConfig: this.options.getConfig\n });\n }\n\n listServers(): McpServerRecord[] {\n return listMcpServers(this.options.getConfig());\n }\n\n getServer(name: string): McpServerRecord | undefined {\n return getMcpServer(this.options.getConfig(), name);\n }\n\n async prewarmEnabledServers(): Promise<McpServerWarmResult[]> {\n const results = await Promise.all(\n this.listServers()\n .filter((record) => record.definition.enabled)\n .map(async (record) => {\n try {\n const state = await this.lifecycleManager.warmServer(record);\n return {\n name: record.name,\n ok: true,\n toolCount: state.tools.length\n } satisfies McpServerWarmResult;\n } catch (error) {\n return {\n name: record.name,\n ok: false,\n toolCount: 0,\n error: toErrorMessage(error)\n } satisfies McpServerWarmResult;\n }\n })\n );\n return results.sort((left, right) => left.name.localeCompare(right.name));\n }\n\n async warmServer(name: string): Promise<McpServerWarmResult> {\n const server = this.getServer(name);\n if (!server) {\n throw new Error(`Unknown MCP server: ${name}`);\n }\n\n try {\n const state = await this.lifecycleManager.warmServer(server);\n return {\n name: server.name,\n ok: true,\n toolCount: state.tools.length\n };\n } catch (error) {\n return {\n name: server.name,\n ok: false,\n toolCount: 0,\n error: toErrorMessage(error)\n };\n }\n }\n\n async reconcileConfig(params: {\n prevConfig: Config;\n nextConfig: Config;\n }): Promise<McpConfigReconcileResult> {\n const previousServers = new Map(listMcpServers(params.prevConfig).map((record) => [record.name, record]));\n const nextServers = new Map(listMcpServers(params.nextConfig).map((record) => [record.name, record]));\n const serverNames = Array.from(new Set([...previousServers.keys(), ...nextServers.keys()])).sort((left, right) =>\n left.localeCompare(right)\n );\n\n const result: McpConfigReconcileResult = {\n added: [],\n removed: [],\n enabled: [],\n disabled: [],\n restarted: [],\n warmed: []\n };\n\n for (const serverName of serverNames) {\n const previous = previousServers.get(serverName);\n const next = nextServers.get(serverName);\n\n if (!next) {\n await this.lifecycleManager.closeServer(serverName);\n result.removed.push(serverName);\n continue;\n }\n\n if (!previous) {\n result.added.push(serverName);\n if (next.definition.enabled) {\n result.warmed.push(await this.warmRecord(next));\n }\n continue;\n }\n\n if (previous.definition.enabled && !next.definition.enabled) {\n await this.lifecycleManager.closeServer(serverName);\n result.disabled.push(serverName);\n continue;\n }\n\n if (!previous.definition.enabled && next.definition.enabled) {\n result.enabled.push(serverName);\n result.warmed.push(await this.warmRecord(next));\n continue;\n }\n\n if (hasReconnectRelevantChange(previous.definition, next.definition)) {\n await this.lifecycleManager.closeServer(serverName);\n result.restarted.push(serverName);\n if (next.definition.enabled) {\n result.warmed.push(await this.warmRecord(next));\n }\n }\n }\n\n return result;\n }\n\n listAccessibleTools(filter: McpCatalogFilter = {}): McpToolCatalogEntry[] {\n const config = this.options.getConfig();\n return this.listServers()\n .filter((record) => record.definition.enabled)\n .filter((record) =>\n isServerAccessibleToAgent({\n config,\n scope: record.definition.scope,\n agentId: filter.agentId\n })\n )\n .flatMap((record) => this.lifecycleManager.getCachedCatalog(record.name))\n .sort((left, right) => left.qualifiedName.localeCompare(right.qualifiedName));\n }\n\n getCachedState(serverName: string) {\n return this.lifecycleManager.getCachedState(serverName);\n }\n\n async callTool(params: {\n serverName: string;\n toolName: string;\n args: Record<string, unknown>;\n signal?: AbortSignal;\n }): Promise<unknown> {\n const server = this.getServer(params.serverName);\n if (!server) {\n throw new Error(`Unknown MCP server: ${params.serverName}`);\n }\n return this.lifecycleManager.callTool(server, params.toolName, params.args, {\n signal: params.signal,\n });\n }\n\n async close(): Promise<void> {\n await this.lifecycleManager.closeAll();\n }\n\n private async warmRecord(record: McpServerRecord): Promise<McpServerWarmResult> {\n try {\n const state = await this.lifecycleManager.warmServer(record);\n return {\n name: record.name,\n ok: true,\n toolCount: state.tools.length\n };\n } catch (error) {\n return {\n name: record.name,\n ok: false,\n toolCount: 0,\n error: toErrorMessage(error)\n };\n }\n }\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction hasReconnectRelevantChange(left: McpServerDefinition, right: McpServerDefinition): boolean {\n return JSON.stringify(left.transport) !== JSON.stringify(right.transport);\n}\n","import type { Config } from \"@nextclaw/core\";\nimport { McpRegistryService } from \"../registry/mcp-registry-service.js\";\nimport { type McpDoctorReport } from \"../types.js\";\n\nexport class McpDoctorService {\n constructor(\n private readonly options: {\n getConfig: () => Config;\n registryService?: McpRegistryService;\n }\n ) {}\n\n async inspect(name?: string): Promise<McpDoctorReport[]> {\n const registry = this.options.registryService ?? new McpRegistryService({\n getConfig: this.options.getConfig\n });\n const specificServer = name ? registry.getServer(name) : undefined;\n const servers = specificServer ? [specificServer] : name ? [] : registry.listServers();\n return await Promise.all(\n servers.map(async (server) => {\n const warmResult = await registry.warmServer(server.name);\n return {\n name: server.name,\n enabled: server.definition.enabled,\n transport: server.definition.transport.type,\n accessible: warmResult.ok,\n toolCount: warmResult.toolCount,\n ...(warmResult.error ? { error: warmResult.error } : {})\n } satisfies McpDoctorReport;\n })\n );\n }\n}\n","import type { Config } from \"@nextclaw/core\";\nimport { McpDoctorService } from \"./mcp-doctor-service.js\";\nimport type { McpRegistryService } from \"../registry/mcp-registry-service.js\";\nimport { type McpDoctorReport } from \"../types.js\";\n\nexport class McpDoctorFacade {\n private readonly doctorService: McpDoctorService;\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n registryService?: McpRegistryService;\n }\n ) {\n this.doctorService = new McpDoctorService({\n getConfig: this.options.getConfig,\n registryService: this.options.registryService\n });\n }\n\n async inspect(name?: string): Promise<McpDoctorReport[]> {\n return await this.doctorService.inspect(name);\n }\n\n async inspectOne(name: string): Promise<McpDoctorReport | null> {\n const reports = await this.inspect(name);\n return reports[0] ?? null;\n }\n}\n","import type { McpServerDefinition, McpServerMetadata, McpServerScope } from \"@nextclaw/core\";\nimport {\n normalizeMcpServerName,\n type McpMarketplaceInstallTemplate,\n type McpMaterializeInstallParams\n} from \"../types.js\";\n\nexport class McpInstallTemplateMaterializer {\n materialize(params: McpMaterializeInstallParams): { name: string; definition: McpServerDefinition } {\n const name = normalizeMcpServerName(params.name?.trim() || params.template.defaultName);\n const inputs = params.inputs ?? {};\n const definition = this.applyInputs(params.template.template, inputs);\n definition.enabled = params.enabled ?? definition.enabled;\n definition.scope = this.mergeScope(definition.scope, params.scope);\n definition.metadata = this.mergeMetadata(definition.metadata, params.template, params.metadata);\n return { name, definition };\n }\n\n private applyInputs(definition: McpServerDefinition, inputs: Record<string, string | undefined>): McpServerDefinition {\n const replacer = (value: string): string =>\n value.replace(/\\{\\{\\s*([A-Za-z0-9._-]+)\\s*\\}\\}/g, (_, key: string) => inputs[key]?.trim() ?? \"\");\n\n const transform = (value: unknown): unknown => {\n if (typeof value === \"string\") {\n return replacer(value);\n }\n if (Array.isArray(value)) {\n return value.map((entry) => transform(entry));\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, transform(entry)])\n );\n };\n\n return transform(structuredClone(definition)) as McpServerDefinition;\n }\n\n private mergeScope(current: McpServerScope, override?: Partial<McpServerScope>): McpServerScope {\n if (!override) {\n return current;\n }\n const agents = Array.from(new Set((override.agents ?? current.agents ?? []).map((entry) => entry.trim()).filter(Boolean)));\n const allAgents = override.allAgents ?? current.allAgents ?? agents.length === 0;\n return {\n allAgents,\n agents: allAgents ? [] : agents\n };\n }\n\n private mergeMetadata(\n current: McpServerMetadata | undefined,\n template: McpMarketplaceInstallTemplate,\n override?: Partial<McpServerMetadata>\n ): McpServerMetadata {\n return {\n ...current,\n source: \"marketplace\",\n catalogSlug: template.spec,\n displayName: override?.displayName ?? current?.displayName,\n vendor: override?.vendor ?? current?.vendor,\n docsUrl: override?.docsUrl ?? current?.docsUrl,\n homepage: override?.homepage ?? current?.homepage,\n trustLevel: override?.trustLevel ?? current?.trustLevel ?? \"official\",\n installedAt: override?.installedAt ?? current?.installedAt ?? new Date().toISOString(),\n ...(override ?? {})\n };\n }\n}\n","import type { Config, McpServerDefinition } from \"@nextclaw/core\";\nimport { getMcpServer, listMcpServers } from \"../config/mcp-config-normalizer.js\";\nimport { McpInstallTemplateMaterializer } from \"../install/mcp-install-template-materializer.js\";\nimport {\n normalizeMcpServerName,\n type McpMarketplaceInstallTemplate,\n type McpMaterializeInstallParams,\n type McpMutationResult\n} from \"../types.js\";\n\nexport class McpMutationService {\n private readonly materializer: McpInstallTemplateMaterializer;\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n saveConfig: (config: Config) => void;\n materializer?: McpInstallTemplateMaterializer;\n }\n ) {\n this.materializer = this.options.materializer ?? new McpInstallTemplateMaterializer();\n }\n\n listServerNames(): string[] {\n return listMcpServers(this.options.getConfig()).map((record) => record.name);\n }\n\n addServer(name: string, definition: McpServerDefinition): McpMutationResult {\n const normalizedName = normalizeMcpServerName(name);\n const config = this.options.getConfig();\n if (config.mcp.servers[normalizedName]) {\n return {\n changed: false,\n name: normalizedName,\n message: `MCP server already exists: ${normalizedName}. Use 'mcp list' or remove it first.`,\n definition: config.mcp.servers[normalizedName]\n };\n }\n\n config.mcp.servers[normalizedName] = definition;\n this.options.saveConfig(config);\n return {\n changed: true,\n name: normalizedName,\n message: `Added MCP server ${normalizedName}.`,\n definition\n };\n }\n\n updateServer(name: string, definition: McpServerDefinition): McpMutationResult {\n const normalizedName = normalizeMcpServerName(name);\n const config = this.options.getConfig();\n if (!config.mcp.servers[normalizedName]) {\n return {\n changed: false,\n name: normalizedName,\n message: `Unknown MCP server: ${normalizedName}`\n };\n }\n\n config.mcp.servers[normalizedName] = definition;\n this.options.saveConfig(config);\n return {\n changed: true,\n name: normalizedName,\n message: `Updated MCP server ${normalizedName}.`,\n definition\n };\n }\n\n removeServer(name: string): McpMutationResult {\n const normalizedName = normalizeMcpServerName(name);\n const config = this.options.getConfig();\n if (!config.mcp.servers[normalizedName]) {\n return {\n changed: false,\n name: normalizedName,\n message: `Unknown MCP server: ${normalizedName}`\n };\n }\n delete config.mcp.servers[normalizedName];\n this.options.saveConfig(config);\n return {\n changed: true,\n name: normalizedName,\n message: `Removed MCP server ${normalizedName}.`\n };\n }\n\n toggleEnabled(name: string, enabled: boolean): McpMutationResult {\n const normalizedName = normalizeMcpServerName(name);\n const config = this.options.getConfig();\n const current = config.mcp.servers[normalizedName];\n if (!current) {\n return {\n changed: false,\n name: normalizedName,\n message: `Unknown MCP server: ${normalizedName}`\n };\n }\n current.enabled = enabled;\n this.options.saveConfig(config);\n return {\n changed: true,\n name: normalizedName,\n message: `${enabled ? \"Enabled\" : \"Disabled\"} MCP server ${normalizedName}.`,\n definition: current\n };\n }\n\n installFromTemplate(params: Omit<McpMaterializeInstallParams, \"template\"> & {\n template: McpMarketplaceInstallTemplate;\n }): McpMutationResult {\n const materialized = this.materializer.materialize(params);\n return this.addServer(materialized.name, materialized.definition);\n }\n\n duplicateServer(sourceName: string, targetName: string): McpMutationResult {\n const source = getMcpServer(this.options.getConfig(), sourceName);\n if (!source) {\n return {\n changed: false,\n name: normalizeMcpServerName(sourceName),\n message: `Unknown MCP server: ${normalizeMcpServerName(sourceName)}`\n };\n }\n const definition = structuredClone(source.definition) as McpServerDefinition;\n if (definition.metadata) {\n definition.metadata = {\n ...definition.metadata,\n installedAt: new Date().toISOString()\n };\n }\n return this.addServer(targetName, definition);\n }\n\n renameServer(sourceName: string, targetName: string): McpMutationResult {\n const source = getMcpServer(this.options.getConfig(), sourceName);\n if (!source) {\n return {\n changed: false,\n name: normalizeMcpServerName(sourceName),\n message: `Unknown MCP server: ${normalizeMcpServerName(sourceName)}`\n };\n }\n\n const nextName = normalizeMcpServerName(targetName);\n const config = this.options.getConfig();\n if (source.name === nextName) {\n return {\n changed: false,\n name: nextName,\n message: `MCP server already named ${nextName}.`,\n definition: source.definition\n };\n }\n if (config.mcp.servers[nextName]) {\n return {\n changed: false,\n name: nextName,\n message: `MCP server already exists: ${nextName}. Use another name.`\n };\n }\n\n delete config.mcp.servers[source.name];\n config.mcp.servers[nextName] = source.definition;\n this.options.saveConfig(config);\n return {\n changed: true,\n name: nextName,\n message: `Renamed MCP server ${source.name} -> ${nextName}.`,\n definition: source.definition\n };\n }\n}\n","import type { Config } from \"@nextclaw/core\";\nimport { McpRegistryService } from \"../registry/mcp-registry-service.js\";\nimport { type McpInstalledRecord } from \"../types.js\";\n\nexport class McpInstalledViewService {\n private readonly registryService: McpRegistryService;\n\n constructor(\n private readonly options: {\n getConfig: () => Config;\n registryService?: McpRegistryService;\n }\n ) {\n this.registryService = this.options.registryService ?? new McpRegistryService({\n getConfig: this.options.getConfig\n });\n }\n\n listInstalled(): McpInstalledRecord[] {\n return this.registryService.listServers().map((server) => {\n const metadata = server.definition.metadata;\n const cached = this.registryService.getCachedState(server.name);\n return {\n name: server.name,\n enabled: server.definition.enabled,\n transport: server.definition.transport.type,\n scope: server.definition.scope,\n source: metadata?.source === \"marketplace\" ? \"marketplace\" : \"manual\",\n catalogSlug: metadata?.catalogSlug,\n displayName: metadata?.displayName,\n vendor: metadata?.vendor,\n docsUrl: metadata?.docsUrl,\n homepage: metadata?.homepage,\n trustLevel: metadata?.trustLevel,\n installedAt: metadata?.installedAt,\n accessible: cached?.clientReady,\n toolCount: cached?.tools.length,\n lastReadyAt: cached?.lastReadyAt,\n lastError: cached?.lastError\n } satisfies McpInstalledRecord;\n });\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextclaw/mcp",
3
- "version": "0.2.18-beta.0",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "description": "Platform-level MCP registry, lifecycle, and diagnostics for NextClaw.",
6
6
  "type": "module",
@@ -17,7 +17,7 @@
17
17
  "dependencies": {
18
18
  "@modelcontextprotocol/sdk": "^1.27.1",
19
19
  "undici": "^6.21.0",
20
- "@nextclaw/core": "0.14.8-beta.0"
20
+ "@nextclaw/core": "0.15.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "@types/node": "^20.17.6",