/** * mcpAggregator —— 协议级 MCP 资源按 serverName 聚合器(core,env 无关)。 * * 协议里 MCP 工具有两种资源形态: * - {@link IMcpResource}(`EResourceType.MCP`):server 级,连整个 server;可选 * `config.allowedTools` 声明白名单。 * - {@link IMcpToolResource}(`EResourceType.MCP_TOOL`):server 内**单个 tool** 的声明, * 携带 `toolName`。 * * 消费侧(runtime)需把两者按 `serverName` 聚合成「一次连接 + 一份白名单」: * - 同 serverName 的多条资源合并为一个 spec,只连一次(避免重复建连)。 * - `allowedTools` = 该 server 命中的 `IMcpResource.config.allowedTools`(若给)与所有 * `IMcpToolResource.config.toolName` 的**并集**。两来源都未声明 → undefined(全放行)。 * - `argsMappingRules`:server 级规则原样追加;tool 级规则(简版,无 `mcpToolName`) * 回填 `mcpToolName = toolResource.config.toolName` 还原为完整形状后追加,统一为一组。 * * 输出 {@link IMcpServerSpec} 供 {@link McpProxyTool} 消费:connect 时按 `spec.allowedTools` * 过滤 `server.listTools()` 的结果,实现「listTool 层就不透出未声明 tool」(非 callTool 拦截)。 * * 纯函数 + 纯类型,无运行时副作用,无 IO。 */ import { type ArgsMappingRule, type IMcpResource, type IMcpToolResource } from '../vendor/linkque-agent-protocol/index.js'; /** * 按 serverName 聚合后的单个 server 规格。 * * 一份 spec = 一次 server 连接 + 一份白名单 + 合并后的入参映射规则集。 * {@link McpProxyTool} 据此:用 agentId/serverName/argsMappingRules 合成 IMcpResource * 喂给 provider 建连,用 allowedTools 在 listTool 层过滤透出。 */ export interface IMcpServerSpec { /** 聚合 key + 暴露名。 */ serverName: string; /** 连 server 用的 agentId(取自命中资源;同 server 多资源应一致,否则首个胜出)。 */ agentId: string; /** 合并后的入参映射规则(server 级 + 各 tool 级回填 mcpToolName)。 */ argsMappingRules: ArgsMappingRule[]; /** * 允许调用的工具名集合;undefined = 该 server 无 tool 级声明,全放行。 * 一旦任一来源(IMcpResource.allowedTools 或某 IMcpToolResource.toolName)贡献, * 即收敛为白名单(并集)。 */ allowedTools: Set | undefined; /** 聚合到此 server 的全部原始 resourceId(resolve(resourceId,...) 反查 spec 用)。 */ resourceIds: string[]; } /** * 把 protocol 的 MCP + MCP_TOOL 资源按 serverName 聚合成 {@link IMcpServerSpec[]}。 * * 顺序:按资源数组中**首次出现某 serverName** 的顺序输出 spec(保插入序,稳定可预测)。 * 同 serverName 的后续资源合并入既有 spec。agentId 冲突(同 server 不同 agentId) * 静默取首个,不抛错(聚合器纯函数,无诊断 sink;消费侧若需告警自行比对)。 */ export declare function aggregateMcpServers(resources: Array): IMcpServerSpec[];