/** * RemoteGatewayMcpServerProvider —— 可选真实上行适配器(连支付宝开放 MCP 网关)。 * * 把 {@link IMcpServerProvider} 端口落到「远端 SSE 网关 + linkquegw 远程签名」的真实实现上: * 复用 {@link RemoteSignatureSigner} + {@link createSseTransport} + {@link createSigningFetch} * 做出站签名(每次出站调 linkquegw 签名服务取三头)与 SSE transport,再用 * `@modelcontextprotocol/sdk` 的 `Client` 连远端 server,包成 {@link IMcpServer} * (`listTools`/`callTool` 委托 client)。 * * runtime 不持应用私钥(签名由服务端完成);环境只需提供 `agentId` 与网关地址,经构造参数 * `resolveConfig` 回调让**环境注入**全量配置。这样: * - 可复用部分(远程签名 + transport + client + 工具映射)留在本包; * - 环境相关部分(agentId/网关地址解析)由各运行环境提供。 * * 不进默认组合根(默认用 {@link NoopMcpServerProvider} 零网络);appwrite/CLI 需要远端 * 网关时显式 `new RemoteGatewayMcpServerProvider({ resolveConfig })` 传入。 */ import { Client } from '@modelcontextprotocol/sdk/client'; import { RemoteSignatureSigner } from './remoteSignatureSigner.js'; import type { GetAuthorizationHeader, IMcpProxyConfig } from './types.js'; import type { IMcpResource } from '../../../vendor/linkque-agent-protocol/index.js'; import type { IMcpServer, IMcpServerProvider } from '../../../core/ports.js'; /** * 构造本 provider 的选项。 */ export interface IRemoteGatewayMcpServerProviderOptions { /** * 把一份 {@link IMcpResource} 解析成连远端网关所需的全量配置(含 agentId、网关 base、 * server 名等)。环境负责提供 agentId(来自 IMcpResource.config.agentId)与网关地址—— * 这是本 provider 唯一的环境相关输入(私钥不再在 runtime 侧,签名由 linkquegw 服务端完成)。 */ resolveConfig: (resource: IMcpResource) => IMcpProxyConfig | Promise; /** * 取调签名服务用的 `Authorization` 头**完整值**(含 scheme)——集成层注入。每次出站签名前调一次, * 原样写入签名请求头(沙箱 `ak ${占位符}` / Chat Gateway `Bearer `)。集成层的 * token 缓存/刷新策略(session token 15min 过期、SSE 长连接多次出站)由此承担。缺省不带鉴权头—— * 仅本地 fixture/离线桩用,真实链路必须注入。 */ getAuthorizationHeader?: GetAuthorizationHeader; /** * 可选:自定义签名器工厂(默认 {@link RemoteSignatureSigner})。 * 测试可注入 stub signer 跳过真实联网签名。注入的 createSigner 会收到 * `getAuthorizationHeader`(环境注入的鉴权头取数器),需透传给自定义签名器以保持鉴权语义。 */ createSigner?: (config: IMcpProxyConfig, getAuthorizationHeader: GetAuthorizationHeader | undefined) => RemoteSignatureSigner; /** * 可选:自定义 MCP `Client` 工厂(测试注入离线 stub client,避免真实联网)。 */ createClient?: () => Client; } /** * 远端网关 IMcpServerProvider。对每个 {@link IMcpResource} 建独立 client 连远端, * 包成 {@link IMcpServer}。各 server `close()` 时断开对应 client。 */ export declare class RemoteGatewayMcpServerProvider implements IMcpServerProvider { private readonly resolveConfig; private readonly getAuthorizationHeader; private readonly createSigner; private readonly createClient; constructor(options: IRemoteGatewayMcpServerProviderOptions); servers(resources: IMcpResource[]): Promise; /** 连单个远端 server 并包装成 IMcpServer。建连失败有限重试 + 失败清理由 helper 负责。 */ private connectOne; }