一、一句话定位 APIBridge = 动态 MCP Server 生成引擎 + 协议转换反向代理 + 集中治理控制台 。
它解决的核心痛点:企业每接入一个老系统,传统做法要为该系统的接口写一套 MCP Server 代码 (SDK、transport、tool 注册、参数映射、鉴权)。APIBridge 把这步变成「在 UI 上填接口地址 / 参数 / 鉴权 → 平台自动生成并托管 MCP 服务」,业务 / 运维人员零代码即可完成。
二、为什么不用 Spring AI Alibaba
维度
Spring AI Alibaba
APIBridge(本方案)
技术栈绑定
强绑定 Java / Spring / Nacos / Dubbo
引擎无关,后端可用任意语言
使用对象
Java 开发,需改 pom.xml + 写 @Tool / YAML
运维 / 业务,浏览器可视化配置
遗留系统覆盖
主要面向 HTTP / Dubbo(Nacos 注册)
任意遗留 API(.NET / PHP / Python / SOAP / SAP / 数据库)
治理
需自行基于 Nacos 生态搭建
内置统一鉴权 / 审计 / 限流 / 多租户
交付
一堆依赖与配置,自行组装
打包好的私有化交付,开箱即用
决策结论 :SAA 的 MCP Proxy / Gateway 本质是「造 MCP 的砖头 / 引擎」,且锁死 Java 生态。APIBridge 要服务的是没有 Java 开发资源、系统异构、需要集中治理 的企业客户,因此必须自研引擎层,做到:
技术栈解耦 —— 不被 Java / Nacos 绑架,后端可用 Python / Go / Node 任意选型;
自主可控 —— 协议演进、鉴权策略、治理逻辑全自研,不被框架升级牵制;
轻量 —— 核心就是 JSON-RPC + 反向代理,官方 MCP SDK 已足够,无需引入整套 Spring 体系。
注:不排斥 SAA。SAA 可作为本平台在 Java 生态下的备选引擎 之一,但产品本体保持引擎无关,核心转换逻辑自研。
三、整体架构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ┌──────────────────────────── 配置控制台(Web UI)───────────────────────────┐ │ 录入:接口地址 / 请求方法 / 参数 / 鉴权方式 / 响应映射 / 缓存 / 限流 │ └───────────────────────────────────┬───────────────────────────────────────┘ │ 写入 ▼ ┌──── 配置存储 Config Store ────┐ │ DB / etcd / JSON(热更新源) │ └────────────────┬───────────────┘ │ 读取 ┌──────────────────────────┼──────────────────────────┐ ▼ ▼ ▼ ┌─────────────── ① Schema 生成器 ─────────┐ ┌──── ⑤ 治理层(横切)────┐ │ API 定义 → MCP Tool inputSchema(JSON) │ │ 统一密钥库 / 审计日志 │ └────────────────────────┬───────────────┘ │ 限流 / 多租户 RBAC │ │ └─────────────────────────┘ ▼ ┌──── ② 动态 MCP Server 运行时 ────┐ │ 官方 MCP SDK 兜底 transport/协议 │ │ list_tools / call_tool 动态回调 │ │ 对外暴露:Streamable-HTTP / SSE / │ │ stdio(推荐 Streamable-HTTP)│ └───────────────┬───────────────────┘ │ JSON-RPC over MCP ┌───────────────┴───────────────────┐ │ Agent:Codex / Trae / 千问办公 / WorkBuddy … │ └───────────────┬───────────────────┘ │ tools/call(结构化参数) ▼ ┌──── ③ 协议转换 / 反向代理层 ────┐ │ 解析参数 → 拼 URL/Header/Body │ └───────────────┬─────────────────┘ │ 注入凭证 ▼ ┌──── ④ 鉴权适配层(策略模式)────┐ │ none/bearer/apikey/basic/ │ │ oauth2/mtls/hmac-signature │ └───────────────┬──────────────────┘ │ 真实 HTTP 请求 ▼ ┌──── 遗留系统 API ────┐ │ ERP / CRM / 内部接口 / │ │ 数据库 / SOAP / SAP │ └────────────────────────┘ │ 响应 ▼ ┌──── ⑥ 响应处理层 ────────────┐ │ 字段裁剪 / 脱敏 / 缓存 / │ │ 错误归一化 → 封装 MCP content │ └────────────────────────────────┘
数据流一句话 :Agent 的 MCP 调用 → ② 运行时路由到对应 tool → ③ 反向代理按配置拼请求 → ④ 注入鉴权 → 打到遗留系统 → ⑥ 响应处理后封装回 MCP 结果 → ② 返回 Agent。
四、MCP 协议基础 MCP(Model Context Protocol)本质是 JSON-RPC 2.0 + 一组约定方法 。本平台只聚焦 tools 能力:
方法
方向
作用
initialize
Client→Server
握手,协商协议版本 / 能力
tools/list
Client→Server
列出所有可用工具及其 inputSchema
tools/call
Client→Server
调用某工具,传入结构化 arguments
resources/list / prompts/list
—
本平台暂不暴露(按需扩展)
传输方式(官方 SDK 已封装):
stdio :Agent 以子进程方式拉起 Server,走标准输入输出,适合本地嵌入。
Streamable-HTTP (2025 起推荐,替代旧 SSE):Server 作为独立 HTTP 服务,远程多 Client 共享,适合集中托管、多租户 场景,本平台主推。
SSE :旧方案,单向推送,逐步淘汰。
关键结论 :协议 plumbing(JSON-RPC 编解码、会话、transport)由官方 MCP SDK 兜底。我们要写的只是「业务层」——从配置动态生成 tool、在 tools/call 里做反向代理。这就是为什么核心 MVP 一个后端几天能跑通。
五、核心模块拆解 5.1 配置模型(Config Schema) 一条 API 配置(即一个未来暴露的 MCP Tool)的字段定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 { "id" : "order_query" , "name" : "订单查询" , "description" : "按订单号查询订单状态、物流与支付信息,供客服 Agent 使用" , "method" : "GET" , "baseUrl" : "http://order-svc.internal" , "path" : "/api/v1/orders/{orderId}" , "params" : [ { "name" : "orderId" , "in" : "path" , "type" : "string" , "required" : true , "description" : "订单号" } , { "name" : "fields" , "in" : "query" , "type" : "string" , "required" : false , "description" : "返回字段,逗号分隔" } , { "name" : "token" , "in" : "header" , "type" : "string" , "required" : true , "description" : "内部调用令牌" } ] , "auth" : { "type" : "oauth2" , "grantType" : "client_credentials" , "tokenUrl" : "https://auth.internal/oauth/token" , "clientId" : "${env.ORDER_CLIENT_ID}" , "clientSecret" : "${secret.ORDER_CLIENT_SECRET}" , "scope" : "order:read" } , "timeout" : 5000 , "retry" : 1 , "cache" : { "ttl" : 30 } , "responseTransform" : { "pick" : [ "orderId" , "status" , "logistics" , "payStatus" ] , "mask" : [ "userPhone" ] } }
设计要点:
params[].in 决定参数落点(path / query / header / body),是参数映射的核心。
auth 与 responseTransform 走模板 / 策略 ,不硬编码。
密钥(如 clientSecret)不存明文,引用 ${secret.xxx} 指向密钥库。
5.2 Schema 生成器 把 params 转成 MCP Tool 的 inputSchema(JSON Schema draft-07):
1 2 3 4 5 6 7 算法: 1. 遍历 params 2. 每个 param → properties[name] = { type, description, (enum?) } 3. required 标记的 param → 加入 required 数组 4. 嵌套对象:type=object,递归展开 properties 5. 枚举:加入 enum 字段(提升 Agent 选参准确率) 6. 输出 { type:"object", properties:{...}, required:[...] }
description 字段至关重要——它是 LLM 决定「何时调该工具、传什么值」的唯一依据,必须写清用途、输入约束、输出格式(本质是面向 LLM 的 API 文档)。
5.3 动态 MCP Server 运行时
启动时从 Config Store 加载全部 API 定义。
注册为 MCP tools:name = api.id,description = api.description,inputSchema = build_input_schema(api)。
实现 tools/list(返回全部)、tools/call(按 name 路由到 handler)。
热更新 :监听 Config Store 变更(DB 触发器 / etcd watch / 文件 inotify),动态增删 tool,无需重启进程 。这是比「改 YAML 重启 Spring」更强的体验。
5.4 协议转换 / 反向代理层 tools/call handler 逻辑:
取出 api = API_INDEX[name];
拼 url = baseUrl + path,初始化 headers;
按每个 param 的 in 分派:path→替换 URL 模板、query→query 参数、header→请求头、body→JSON body;
调鉴权适配层注入凭证;
发 HTTP 请求到遗留系统(带 timeout / retry);
响应经响应处理层裁剪 / 脱敏 / 格式化 → 封装成 MCP TextContent 返回。
5.5 鉴权适配层(策略模式) 每种鉴权实现统一接口 apply(auth, headers, request) -> request,由 auth.type 分发:
type
处理方式
none
不处理
apikey
注入到指定 header 或 query
bearer
Authorization: Bearer <静态token>
basic
Authorization: Basic base64(user:pass)
oauth2
client_credentials 换 token,带自动刷新 (缓存 access_token + 过期前续期)
mtls
httpx 走 client 证书(cert / verify)
hmac
按 secret 对请求签名注入 header(构造待签串 → HMAC-SHA256 → 注入 X-Sign / X-Timestamp)
企业真实环境的鉴权最刁钻,是「能用」和「好用」的分水岭。策略模式让新增一种鉴权=加一个类,不影响主干。
5.6 响应处理层
字段裁剪(pick) :只回传 Agent 需要的字段,降低 token 消耗;
脱敏(mask) :手机号 / 身份证 / 姓名按规则打码(合规要求);
缓存(cache.ttl) :相同参数命中缓存,减轻后端压力、提速;
错误归一化 :上游 4xx / 5xx → 统一成可读错误文本,避免把堆栈丢给 LLM。
5.7 治理层(横切)
能力
说明
统一密钥库
凭证存 KMS / secret manager,auth 配置只引用句柄,不落明文
审计日志
记录 谁 / 哪个 Agent / 哪个 tool / 入参 / 响应摘要 / 耗时
限流
per-tool / per-tenant 配额,防止 Agent 失控刷爆遗留系统
多租户
tenant_id 隔离配置与配额,支持 SaaS 化交付
六、Python 参考实现 以下为可运行骨架 (需 pip install mcp httpx)。核心演示:从配置动态生成 tool + tools/call 反向代理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 import jsonimport httpxfrom mcp.server.lowlevel import Serverfrom mcp.types import Tool, TextContentfrom mcp.server.stdio import stdio_serverserver = Server("apibridge" ) def load_api_defs () -> list [dict ]: return [{ "id" : "order_query" , "description" : "按订单号查询订单状态与物流" , "method" : "GET" , "baseUrl" : "http://order-svc.internal" , "path" : "/api/v1/orders/{orderId}" , "params" : [ {"name" : "orderId" , "in" : "path" , "type" : "string" , "required" : True }, {"name" : "fields" , "in" : "query" , "type" : "string" , "required" : False }, ], "auth" : {"type" : "none" }, "timeout" : 5 , }] API_DEFS = load_api_defs() API_INDEX = {a["id" ]: a for a in API_DEFS} def build_input_schema (api: dict ) -> dict : props, required = {}, [] for p in api.get("params" , []): prop = {"type" : p.get("type" , "string" ), "description" : p.get("description" , "" )} if "enum" in p: prop["enum" ] = p["enum" ] props[p["name" ]] = prop if p.get("required" ): required.append(p["name" ]) schema = {"type" : "object" , "properties" : props} if required: schema["required" ] = required return schema @server.list_tools() async def list_tools () -> list [Tool]: return [ Tool(name=a["id" ], description=a.get("description" , "" ), inputSchema=build_input_schema(a)) for a in API_DEFS ] def apply_auth (auth: dict , headers: dict ) -> None : t = auth.get("type" ) if t == "bearer" : headers["Authorization" ] = f"Bearer {auth['token' ]} " elif t == "apikey" : headers[auth["key" ]] = auth["value" ] elif t == "basic" : import base64 raw = f"{auth['username' ]} :{auth['password' ]} " headers["Authorization" ] = "Basic " + base64.b64encode(raw.encode()).decode() elif t == "oauth2" : headers["Authorization" ] = f"Bearer {get_oauth2_token(auth)} " elif t == "mtls" : pass @server.call_tool() async def call_tool (name: str , arguments: dict ) -> list [TextContent]: api = API_INDEX[name] url = api["baseUrl" ].rstrip("/" ) + api["path" ] method = api["method" ] headers = {"Content-Type" : "application/json" } params, json_body = {}, None for p in api["params" ]: v = arguments.get(p["name" ]) if v is None : continue if p["in" ] == "query" : params[p["name" ]] = v elif p["in" ] == "header" : headers[p["name" ]] = v elif p["in" ] == "path" : url = url.replace(f"{{{p['name' ]} }}" , str (v)) elif p["in" ] == "body" : json_body = json_body or {} json_body[p["name" ]] = v apply_auth(api["auth" ], headers) async with httpx.AsyncClient(timeout=api.get("timeout" , 10 )) as c: r = await c.request(method, url, params=params, headers=headers, json=json_body) r.raise_for_status() text = r.text return [TextContent(type ="text" , text=text)] async def main (): async with stdio_server() as (read, write): await server.run(read, write, server.create_initialization_options()) if __name__ == "__main__" : import asyncio asyncio.run(main())
远程部署(推荐) :将 transport 换成 StreamableHTTPServerTransport + Starlette / FastAPI,把 Server 挂到 HTTP 端口,多个 Agent 通过 https://apibridge.internal/mcp 远程连接,配合 5.7 节的治理层做鉴权与多租户。
七、关键难点与对策
难点
对策
鉴权广度(OAuth2 刷新 / mTLS / HMAC 签名)
策略模式 + 预置模板,新增鉴权=加一个类
Schema 映射质量(嵌套 / 枚举 / 文件上传)
支持 OpenAPI / Swagger 导入 + UI 人工校验
协议演进(SSE→Streamable-HTTP)
跟官方 SDK,不自造 JSON-RPC
大响应 token 爆炸
字段裁剪 / 分页 / 响应缓存
私有化与离线
容器化 + 配置外置 + 离线 license
八、部署形态
MVP :单进程 Python 服务,暴露 Streamable-HTTP,连接 Config Store。
企业版 :APIBridge Core(动态 Server)+ Config DB + 治理组件(密钥库 / 审计 / 限流)+ 前端控制台,K8s 或单机 Docker 私有化。
数据不出域 :全部组件部署在客户内网,无外联,满足政企 / 金融合规。
九、总结 APIBridge 的核心并不神秘——它就是「配置驱动的动态 MCP Server + 反向代理 」。难点不在协议本身(官方 SDK 已兜底),而在产品化 :鉴权广度、Schema 映射质量、集中治理、私有化交付、非技术用户的可视化体验。不依赖 SAA 是为了技术栈解耦与自主可控,让平台能服务任意异构遗留系统、不被 Java 生态绑定。
演进路线 :MVP(代理跑通)→ +OpenAPI 导入 → +多鉴权 → +治理层 → +连接器市场(预置模板)→ +可视化编排。
模型版本说明 ⚠️ 文中涉及的模型 / SDK 版本(如官方 mcp / @modelcontextprotocol/sdk、各 Agent 接入形态)以发布时为准,实际实现请参考对应官方文档的最新版本。