BLOG260702 · MCP Proxy
将 MCP Proxy 引入到 API Call Demo 中
在不破坏原有 client-server 结构的前提下,为 Demo 加上一层可扩展的 MCP 工具调用路径。
本文目标是在一个已有的 client-server API Call Demo 中,引入 MCP Proxy,让原本直接调用后端 API 的 Demo,扩展为可以通过 MCP 工具层访问数据,同时尽量不破坏原有项目结构。
整个改造的重点不是推翻原始 API,而是在保留原调用链的基础上,增加一条更接近 Agent 工具调用架构的新路径。
一、MCP 与本实例的基础知识
可以先把 MCP(Model Context Protocol)理解成一层“工具与上下文的标准接口”。大模型负责理解用户意图、规划步骤和生成调用参数;MCP 则把外部能力包装成可发现、可调用、可治理的工具,让模型不必直接耦合每一个后端服务、SDK 或私有接口。
在本实例中,MCP Proxy 位于 API Call Demo 与 MCP Server 之间。它不替代模型,也不替代业务 API,而是把“模型或应用想调用什么工具”和“后端实际如何暴露工具”解耦开来。
MCP Server
实际提供能力的一端,例如读取数据库、调用内部 API、访问文档或执行脚本。
MCP Client / Proxy
发起工具调用并治理调用过程,统一处理路由、鉴权、日志、错误返回和后续扩展。
二、原始 Demo 与改造原则
原始 Demo 只有一条直接路径:前端调用 Express server 暴露的 GET /api/profile,由后端直接返回 profile 数据。
这次改造的原则是只做加法,不破坏原结构。原来的 /api/profile 继续保留,新加的 /api/profile-via-mcp 用来展示通过 MCP Proxy 调用工具层的路径。
三、改造后的调用链路
改造后,Demo 同时保留 Direct API 与 MCP Proxy 两条路径。前端可以用 radio button 在两者之间切换。
| Route | 说明 |
|---|---|
GET /api/profile | 原始 Direct API,保持兼容。 |
GET /api/profile-via-mcp | 通过 MCP Proxy 查询 profile。 |
GET /api/mcp/health | 检查 MCP Server 与 MySQL 状态。 |
四、模块拆分
Server 配置整理
.env 保存数据库连接参数,dbConfig.js 负责统一导出 MySQL 配置,避免 Express server 与 MCP server 配置分叉。
MCP Server Tools
db_health 检查数据库连接是否正常;get_profile_by_name 根据 name 查询 profile 数据。
mcpClient.js
启动或连接 mysqlToolsServer.js,读取 tools,调用指定工具,并接收 tool result。
mcpProxy.js
读取 req.query.name,调用 get_profile_by_name,再把 MCP 返回结果转换成和 /api/profile 一样的 JSON 格式。
五、最终结构
server\ 和 mcp-server\ 结构中都包含 node_modules\,便于读者理解两个 Node 项目各自有独立依赖。
C:\api-demo
client\
index.html
script.js
server\
server.js
mcpClient.js
mcpProxy.js
dbConfig.js
.env
package.json
package-lock.json
node_modules\
mcp-server\
mysqlToolsServer.js
package.json
package-lock.json
node_modules\小结
这次改造的核心,是在原有 API Call Demo 之上增加一层 MCP Proxy。它既保留原始 Demo 的简单性,又展示了 MCP 在工具化、解耦和扩展方面的价值。