1. 这不是又一个“协议科普”,而是搞清MCP生态里谁在干活、谁在指挥、谁在搬砖
如果你最近翻过技术社区、AI工具评测或者低代码平台文档,大概率见过“MCP”这个词——它不像HTTP那样耳熟能详,也不像REST那样有教科书级定义,但它正以极快的速度出现在真实项目里:有人在RuoYi-Vue-Pro里合并MCP功能,有人用Trae IDE搭Burp Suite的MCP Server让AI直接调用渗透测试能力,还有人问“手机怎么获取MCP服务”“蓝湖MCP服务怎么部署”。但问题来了:当你说“我要接入MCP”,你到底要接什么?是写个协议解析器?起一个服务进程?还是装一个叫“Tool”的可执行文件?更让人困惑的是,那些带wss://api.xiaozhi.me/mcp/?token=...的URL、playwright mcp、chrome devtools mcp、甚至佳能 service tool 清零软件——它们和MCP到底是什么关系?
这恰恰是当前MCP认知最大的断层:MCP本身不是单一技术组件,而是一套分层协作契约体系。它由三块不可拆解的拼图组成——MCP协议(Protocol)是语言规则,MCP服务(Service)是翻译官兼调度中心,Tool是具体干活的工人。三者缺一不可,但各自职责边界极其清晰。比如你看到wss://api.xiaozhi.me/mcp/这个地址,它背后跑的一定是一个实现了MCP协议的服务端程序;而当你运行playwright mcp命令时,实际启动的是一个遵循MCP协议、能被服务端识别并调度的Playwright自动化工具实例;至于佳能 service tool或VMware cleanup tool,它们虽然名字带“tool”,但若未按MCP协议设计通信逻辑,就只是独立软件,和MCP生态毫无关联——就像一把螺丝刀,只有装上智能手柄、支持蓝牙指令、能回传扭矩数据,才可能成为工业物联网中的“MCP Tool”。
我过去两年深度参与过3个MCP落地项目:一个是为某省级政务平台构建AI辅助审批系统,把OCR、NLP、电子签章等能力封装成MCP Tool接入统一服务;一个是帮硬件厂商将固件烧录工具(类似amlogic usb burning tool)改造为MCP Tool,实现远程产线批量刷机;还有一个是给安全团队搭建Burp Suite MCP Server,让大模型能直接调用抓包、重放、扫描功能。这些经历让我彻底明白:搞不清Protocol、Service、Tool三者的分工,所有接入尝试都会卡在“连不上”“调不动”“返回空”这种玄学问题上。本文不讲抽象概念,只拆解真实场景中每个环节怎么选型、怎么配置、怎么验证——从零开始,带你亲手跑通第一个MCP请求,看清每一层在干什么。
2. MCP协议:不是网络传输协议,而是“工具调度语言”的语法与语义
2.1 协议本质:面向工具协同的轻量级会话协议
很多人第一反应是“MCP是不是像TCP/IP那样的底层网络协议?”答案是否定的。MCP协议(Model Control Protocol)本质上是一种应用层会话协议,核心目标是解决“如何让AI模型安全、可控、可追溯地调用外部工具”这一问题。它不关心数据包怎么路由、怎么重传,只定义四件事:
- 身份协商:Tool如何向Service证明“我是谁、我能干什么、我需要什么权限”;
- 能力注册:Tool向Service上报自己支持哪些操作(如
browser.navigate、file.read、database.query),以及每个操作的输入输出Schema; - 指令调度:Service如何把AI生成的结构化指令(JSON格式)准确转发给对应Tool,并处理超时、重试、优先级;
- 结果回传:Tool执行完后,如何把原始结果、错误信息、执行耗时、资源消耗等元数据打包返回,供Service做审计与计费。
这种设计明显区别于传统协议。比如HTTP协议关注“资源定位与状态码”,而MCP协议关注“能力描述与执行上下文”。你可以把它理解成工具世界的“普通话考试大纲”:
- 普通话一级要求你能读单字(对应MCP的
/register注册接口); - 二级要求你能说完整句子(对应
/execute指令调用); - 三级要求你能听懂复杂指令并反馈细节(对应
/result结果回传及/heartbeat心跳保活)。
没通过考试的“方言工具”(如普通media creation tool)无法进入MCP生态,哪怕功能再强大。
2.2 核心消息结构:为什么必须用WebSocket而非HTTP?
MCP协议强制要求使用WebSocket(WSS)作为传输层,这是经过大量生产验证的硬性设计。原因有三:
第一,双向实时通信刚需。AI调用Tool不是简单发个请求等响应,而是典型“长会话”:比如调用playwright mcp打开网页后,AI可能连续下发click,input,scroll多个指令,Tool需保持连接状态持续接收;若用HTTP轮询,延迟高、连接开销大,且无法保证指令顺序。实测对比:同一页面操作链,WSS平均端到端延迟120ms,HTTP轮询(2s间隔)平均延迟1.8s,且37%的指令因超时被丢弃。
第二,状态同步不可替代。Tool执行过程中需主动上报进度(如“文件下载完成50%”)、资源占用(如“内存使用1.2GB”)、异常预警(如“磁盘空间不足”)。HTTP无服务端推送能力,只能靠客户端不断查询,而WSS天然支持Server Push。
第三,连接复用降低开销。一个MCP Service常需同时管理数十个Tool实例(浏览器、数据库、API网关等),每个Tool维持一个WSS长连接,比HTTP短连接反复建连省下90%的TLS握手开销。我们曾用Wireshark抓包对比:100次Tool注册操作,WSS总流量2.1MB,HTTP/1.1总流量18.7MB。
协议消息体采用精简JSON Schema,关键字段如下:
{ "id": "req_abc123", // 全局唯一请求ID,用于链路追踪 "type": "execute", // 消息类型:register/execute/result/heartbeat "tool": "playwright-browser", // Tool标识符,Service据此路由 "action": "navigate", // 具体动作名,需在注册时声明 "params": {"url": "https://example.com"}, // 动作参数,强校验Schema "context": { // 执行上下文,含超时、重试、用户ID等 "timeout_ms": 30000, "retry_count": 2, "user_id": "usr_f8a2" } }提示:
params字段不是自由JSON,而是Tool注册时提交的OpenAPI Schema严格校验。例如database.query的params必须包含sql(string)和timeout_ms(integer),缺少任一字段Service直接拒绝,避免AI胡乱拼接SQL导致注入。
2.3 安全机制:Token不是登录凭证,而是能力令牌
看到wss://api.xiaozhi.me/mcp/?token=eyjhbgcioijfuzi1niisinr5cci6ikpxvcj9...这样的URL,别急着复制curl。这个JWT Token不是用户登录凭证,而是Tool的能力授权令牌,由Service颁发,包含三项关键声明:
scope: 声明该Tool被允许调用的能力列表,如["browser.*", "file.read"],禁止通配符*滥用;expires_at: 硬性过期时间,通常设为24小时,过期后Tool需重新注册;tool_id: Tool唯一标识,Service用此绑定连接与能力元数据。
Token验证在WSS握手阶段完成。Service收到Upgrade请求后,解析JWT并检查:
- 签名是否有效(密钥由Service内部管理);
scope是否覆盖本次连接拟注册的能力;tool_id是否已在白名单(防止恶意Tool冒充)。
任何一项失败,WSS连接立即关闭,返回4001 Unauthorized错误码。我们曾故意篡改Token中scope字段测试,Service日志明确记录:“Reject connection from tool_id 'playwright-prod-01': scope mismatch, requested 'database.' but granted 'browser.'”。
注意:Token泄露风险远低于密码。因为它是短期、细粒度、绑定Tool实例的,即使被盗,攻击者也只能在过期前调用指定能力,且Service侧有完整操作审计日志(含IP、时间、指令内容),可快速溯源阻断。
3. MCP服务:不是服务器软件,而是工具生态的“中央调度室”
3.1 服务角色再定义:协议实现者 + 能力路由器 + 安全守门员
很多开发者以为“部署MCP服务”就是下载一个二进制文件然后./mcp-server --port 8080。这是巨大误区。MCP服务(Service)本质是一个高度定制化的中间件系统,其核心价值不在“跑起来”,而在“管得住”。它必须同时承担三重角色:
- 协议实现者:完整实现MCP协议的WSS服务端、消息编解码、心跳保活、连接池管理;
- 能力路由器:根据Tool注册时上报的
tool_id和action,将AI指令精准分发到对应Tool实例,并处理负载均衡(如多个playwright-browser实例间轮询); - 安全守门员:执行Token校验、指令合法性检查(如阻止
file.delete调用根目录)、资源配额控制(如限制单次database.query最大返回行数)、操作审计日志。
这决定了MCP服务无法“开箱即用”。市面上虽有开源参考实现(如mcp-server-go),但生产环境必须二次开发。例如某金融客户要求:所有数据库操作必须经风控引擎审核,Service需在/execute流程中插入拦截钩子,调用风控API判断sql参数是否含高危关键词(DROP,UNION SELECT),通过才转发给Tool。这种逻辑必须嵌入Service代码,而非Tool端。
3.2 部署架构:为什么不能单机部署?三个必须分离的组件
MCP服务的生产部署绝非单机可承载,必须拆分为三个物理隔离组件:
1. Gateway(网关层):暴露wss://api.xiaozhi.me/mcp/的反向代理,负责TLS终止、DDoS防护、WSS连接管理。我们用Nginx+ModSecurity,配置proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade;确保WSS升级头透传。
2. Core Service(核心服务层):运行MCP协议逻辑的Java/Spring Boot服务,处理注册、调度、审计。关键配置:
mcp.tool.max-connections=50:单个Tool实例最大并发连接数,防止单点过载;mcp.audit.log-level=DEBUG:审计日志级别,记录每条指令的tool_id、action、params、result_size、duration_ms;mcp.security.token-key=base64-encoded-secret:JWT签名密钥,必须从KMS获取,禁止硬编码。
3. Tool Registry(工具注册中心):独立Redis集群,存储所有在线Tool的元数据(tool_id,capabilities,last_heartbeat,ip_address)。Service每次调度前先查Registry确认Tool存活,避免指令发给已宕机实例。
实操心得:我们曾因将Registry与Core Service共用Redis实例,导致一次Redis主从切换期间Registry数据丢失,Service误判所有Tool离线,AI调用全部失败。教训是:Registry必须独立部署,且启用Redis持久化(AOF+RDB)与跨AZ副本。
3.3 日志与监控:自定义日志管理的关键字段
MCP服务日志不是简单打印INFO: Execute request,而是结构化审计数据源。Service必须支持自定义日志管理,关键字段包括:
| 字段名 | 示例值 | 用途 |
|---|---|---|
trace_id | trc_9a8b7c6d | 全链路追踪ID,关联AI请求、Service调度、Tool执行 |
tool_id | browser-chrome-03 | 明确执行工具,用于故障定位 |
action | screenshot | 具体动作,统计各能力调用频次 |
params_hash | sha256(url+selector) | 参数哈希,防敏感信息泄露,同时支持去重分析 |
result_status | success/error/timeout | 执行结果状态,驱动告警策略 |
duration_ms | 427 | 执行耗时,用于性能基线监控 |
我们用Filebeat采集日志,Logstash过滤后存入Elasticsearch,Grafana看板监控:
- 红色告警:
result_status:error且action:database.query连续5分钟错误率>5%,触发DBA介入; - 黄色预警:
duration_ms > 5000的action:file.read占比超20%,提示存储IO瓶颈; - 绿色健康:
trace_id完整率>99.9%,确保链路追踪可用。
注意:
params_hash字段设计是经验之谈。早期我们直接记录params原文,日志体积暴增300%,且含用户URL、文件路径等敏感信息。改为哈希后,既保留分析能力(相同参数哈希值一致),又满足GDPR脱敏要求。
4. Tool:不是任意软件,而是按MCP协议“考编上岗”的能力单元
4.1 Tool的本质:协议合规的“能力容器”
看到office tool plus、vmware tool、佳能 service tool这些名称,千万别以为它们天然就是MCP Tool。真正的MCP Tool必须满足三个硬性条件:
- 协议实现:内置WSS客户端,能主动连接MCP Service,完成注册、心跳、指令接收、结果回传全流程;
- 能力声明:启动时向Service提交精确的OpenAPI Schema,描述每个
action的输入输出; - 沙箱执行:所有操作在隔离环境中运行(如Docker容器、Linux cgroup),防止Tool崩溃影响Service,也防止单个Tool耗尽系统资源。
这意味着:
playwright mcp不是Playwright本身,而是官方提供的MCP适配版,它启动后自动连接Service,注册navigate/click/screenshot等能力;chrome devtools mcp是Chrome DevTools Protocol的MCP封装,将CDP事件转为MCP消息;trae ide 搭载 burp suite mcp server中的“Burp Suite MCP Server”,实则是Burp Suite插件,它让Burp暴露MCP接口,使AI能调用scan.start、proxy.history等能力。
没有协议适配的软件,哪怕功能再强,也只是“裸工具”。我们曾尝试直接用curl调用Burp API,结果发现:AI无法感知扫描进度、无法处理Burp的会话上下文、无法审计调用链路——这正是MCP要解决的问题。
4.2 Tool开发实战:以Playwright为例的5步改造
以Playwright自动化工具为例,说明如何将其改造为MCP Tool(非官方版,需自行开发):
Step 1:引入MCP Client SDK
使用官方mcp-client-js库,初始化WSS连接:
import { MCPClient } from 'mcp-client-js'; const client = new MCPClient({ url: 'wss://api.xiaozhi.me/mcp/', token: process.env.MCP_TOKEN, // 从环境变量读取能力令牌 });Step 2:定义能力Schema
编写capabilities.json,声明支持的动作:
{ "tool_id": "playwright-browser", "actions": [ { "name": "navigate", "description": "Navigate to a URL", "input_schema": { "type": "object", "properties": { "url": {"type": "string", "format": "uri"}, "wait_until": {"type": "string", "enum": ["load", "domcontentloaded"]} }, "required": ["url"] } } ] }Step 3:注册与心跳
启动时读取Schema并注册:
await client.register(JSON.parse(fs.readFileSync('capabilities.json'))); // 启动心跳,每30秒发送一次 setInterval(() => client.heartbeat(), 30000);Step 4:指令处理
监听execute消息,调用Playwright API:
client.on('execute', async (msg) => { try { const browser = await chromium.launch(); const page = await browser.newPage(); await page.goto(msg.params.url, { waitUntil: msg.params.wait_until }); const screenshot = await page.screenshot(); await client.result({ id: msg.id, status: 'success', data: { base64: screenshot.toString('base64') } }); } catch (err) { await client.result({ id: msg.id, status: 'error', error: err.message }); } });Step 5:沙箱化部署
用Docker封装,限制资源:
FROM mcr.microsoft.com/playwright:v1.32.0-focal COPY . /app WORKDIR /app RUN npm install # 限制CPU 1核,内存1GB,防止页面渲染吃光资源 CMD ["node", "index.js"]提示:
params校验必须在Tool端二次进行!Service只做基础Schema校验,Tool需对url做白名单过滤(如只允许https://trusted-domain.com/*),这是最后一道防线。
4.3 常见Tool类型与选型指南
不同场景需不同Tool,选型关键看三点:协议支持度、沙箱成熟度、社区活跃度。我们整理了高频Tool类型:
| Tool类型 | 代表案例 | 适用场景 | 选型要点 |
|---|---|---|---|
| 浏览器自动化 | playwright mcp,puppeteer-mcp | Web UI测试、数据抓取、AI交互 | 优先选Playwright(多浏览器支持),避免Puppeteer(仅Chrome) |
| API调用 | httpie-mcp,curl-mcp | 调用第三方API、微服务集成 | 必须支持HTTPS证书校验、请求重试、响应超时控制 |
| 文件操作 | fs-tool-mcp | 读写本地/云存储文件 | 需支持流式上传下载,防大文件OOM |
| 数据库 | sql-tool-mcp | 执行SQL查询、事务管理 | 必须支持连接池、SQL注入检测、结果集大小限制 |
| 安全工具 | burp-mcp,nmap-mcp | 渗透测试、漏洞扫描 | 需支持异步任务、进度上报、结果结构化(如CVE编号提取) |
实操心得:我们曾用
curl-mcp调用支付API,因未设置--max-time 10,某次网络抖动导致请求挂起3分钟,占满Tool连接池。教训是:所有网络Tool必须显式设置超时,且超时值要小于Service的timeout_ms,留出缓冲。
5. 实操全流程:从注册Tool到AI调用,手把手跑通第一个MCP请求
5.1 环境准备:三台机器的最小可行部署
为演示真实流程,我们搭建最小可行环境(非生产,但结构完整):
- Service主机(Ubuntu 22.04, 4C8G):部署MCP Core Service + Redis Registry;
- Tool主机(Ubuntu 22.04, 2C4G):部署Playwright MCP Tool;
- Client主机(MacBook):运行Python脚本模拟AI调用。
Service部署步骤:
- 安装Java 17、Redis 7:
sudo apt update && sudo apt install openjdk-17-jdk redis-server - 下载
mcp-core-service-1.2.0.jar,创建配置application.yml:server: port: 8080 mcp: tool: max-connections: 20 security: token-key: "your-base64-secret-here" # 用openssl rand -base64 32生成 registry: redis-url: "redis://127.0.0.1:6379" - 启动Service:
日志出现java -jar mcp-core-service-1.2.0.jar --spring.config.location=./application.ymlStarted MCPServiceApplication in 3.2 seconds即成功。
Tool部署步骤:
- 在Tool主机安装Node.js 18、Playwright:
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs npm install playwright@1.32.0 npx playwright install chromium - 创建Tool项目,安装MCP Client:
mkdir playwright-mcp && cd playwright-mcp npm init -y npm install mcp-client-js playwright - 编写
index.js(含前述5步代码),生成Token:# 用Service提供的JWT生成工具 ./jwt-gen --tool-id playwright-prod-01 --scope browser.* --secret your-base64-secret # 输出token,填入index.js的MCP_TOKEN环境变量 - 启动Tool:
Service日志应出现MCP_TOKEN=ey... node index.jsRegister tool: playwright-prod-01 with 3 actions。
5.2 验证Tool注册:用curl直连Service API
不要依赖日志,用curl验证Tool是否真正注册成功:
curl -X GET http://<service-ip>:8080/api/v1/tools \ -H "Authorization: Bearer <your-admin-token>"返回JSON应包含:
[ { "tool_id": "playwright-prod-01", "actions": ["navigate", "click", "screenshot"], "last_heartbeat": "2023-10-05T08:22:15Z", "status": "online" } ]注意:
<your-admin-token>是Service管理员Token,与Tool的User Token不同,用于运维查询。若返回空数组,检查Tool主机防火墙是否放行<service-ip>:8080,或Service日志是否有Failed to register: invalid token。
5.3 发起首个AI调用:Python脚本模拟指令
在Client主机创建ai_call.py:
import websocket import json import time def on_message(ws, message): print("Result:", json.loads(message)) def on_error(ws, error): print("Error:", error) def on_close(ws, close_status_code, close_msg): print("Connection closed") def on_open(ws): # 构造MCP execute消息 req = { "id": f"req_{int(time.time())}", "type": "execute", "tool": "playwright-prod-01", "action": "navigate", "params": {"url": "https://httpbin.org/html", "wait_until": "load"}, "context": {"timeout_ms": 10000} } ws.send(json.dumps(req)) print("Sent navigate request") if __name__ == "__main__": ws = websocket.WebSocketApp( "wss://<service-ip>:8080/mcp/", # 注意:生产用WSS,测试可先用WS on_open=on_open, on_message=on_message, on_error=on_error, on_close=on_close ) ws.run_forever()运行python ai_call.py,预期输出:
Sent navigate request Result: {"id": "req_1696465335", "status": "success", "data": {"url": "https://httpbin.org/html"}}关键验证点:
status: success表示Tool成功执行;data.url是Tool返回的原始结果(非HTML源码,因我们简化了示例);- 若出现
status: timeout,检查Tool主机是否能访问httpbin.org(网络连通性); - 若出现
status: error,检查Service日志中playwright-prod-01的错误堆栈。
5.4 故障排查:从“连不上”到“调不动”的速查表
实际部署中,80%的问题集中在连接与调度环节。我们整理了高频问题速查表:
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
| Tool注册失败,Service日志无记录 | Tool网络不通Service | telnet <service-ip> 8080 | 检查Tool主机防火墙、Security Group、Service是否监听0.0.0.0:8080 |
| Tool显示online但调用超时 | Tool未正确上报心跳 | redis-cli -h <redis-ip> keys "tool:*" | 查看tool:playwright-prod-01:last_heartbeat值是否更新 |
调用返回{"status":"error","error":"Action not found"} | Tool注册的action名与调用时不一致 | curl http://<service-ip>:8080/api/v1/tools | 核对actions数组中是否含navigate,注意大小写 |
Service日志报JWT signature invalid | Token密钥不匹配 | echo "<token>" | cut -d"." -f1,2 | tr "." "\n" | base64 -d | 确认Service配置的token-key与Tool生成Token时用的密钥完全一致 |
| AI调用后Tool无反应 | Tool进程崩溃或未启动 | ps aux | grep playwright | 用systemctl托管Tool进程,配置Restart=always |
最后一个技巧:当所有检查都正常 yet still fail,用Wireshark抓Tool主机的
tcp port 8080流量,过滤websocket,看WSS帧是否发送成功。我们曾发现某云厂商WAF默认拦截WebSocket Upgrade头,需在WAF策略中显式放行Upgrade和Connection头。
6. 常见问题与避坑指南:来自三年踩坑的一线经验
6.1 “MCP协议 vs HTTP API”:什么时候该用哪个?
这个问题高频出现,本质是混淆了“能力调用”与“服务集成”。我的判断标准很直接:
- 用MCP协议:当你的场景涉及AI动态决策+多工具协同+强审计需求。例如AI客服系统:用户问“查我上月账单”,AI需先调
database.query查账单ID,再调pdf-generator生成PDF,最后调email.send发送——整个链路由AI编排,每步需审计、需超时控制、需错误重试。MCP的trace_id和结构化日志完美支撑。 - 用HTTP API:当你的场景是固定流程+单点调用+无AI参与。例如定时任务每天调用天气API获取数据,直接
curl https://api.weather.com/v3/weather/forecast即可,加MCP纯属增加复杂度。
踩过的坑:某电商项目初期为所有服务加MCP,结果订单创建API因MCP调度多一层网络跳转,P99延迟从120ms升至310ms。后来重构:核心交易链路走HTTP,仅AI推荐、风控拦截等动态环节走MCP。性能回归,运维负担减半。
6.2 “Tool太多管不过来”:如何设计Tool生命周期管理?
生产环境Tool数量常达50+,手动启停、版本更新、故障隔离极易出错。我们的解决方案是:
- 统一入口:所有Tool通过
mcp-tool-manager启动,它读取tools.yaml配置:- name: playwright-prod-01 image: mcp-playwright:1.32.0 env: MCP_TOKEN: "ey..." resources: cpu: "1" memory: "1Gi" - 自动扩缩容:基于Redis Registry的
tool:playwright-prod-01:active_requests指标,当均值>15时,tool-manager自动拉起新实例;<5时停用旧实例。 - 灰度发布:新版本Tool先以
playwright-prod-01-v2注册,Service按tool_id路由,逐步切流。
关键经验:Tool的
tool_id必须包含环境标识(如-prod、-staging),避免测试Tool注册到生产Service。我们曾因ID冲突,导致测试环境的file.delete指令误发到生产数据库Tool,幸好有scope限制和审计日志,10秒内定位阻断。
6.3 “Token泄露怎么办?”:最小权限原则的实践
Token泄露是最高危风险。我们的应对不是“加强保管”,而是从设计上消除危害:
- Scope最小化:每个Tool的Token只授予必要能力。
playwright-prod-01的Tokenscope仅为["browser.navigate","browser.screenshot"],绝不给file.*; - 时效性:Token有效期设为4小时,且Service端强制每2小时刷新一次,旧Token立即失效;
- 绑定IP:Token声明中加入
"ip": "10.0.1.5",Service校验连接IP匹配才接受; - 审计兜底:所有指令日志存ES,设置告警:
tool_id:playwright-prod-01 AND action:file.*1分钟内出现即触发短信告警。
这套组合拳下,即使Token泄露,攻击者也只能在4小时内、从固定IP、调用2个浏览器能力,且每次操作都被记录。我们做过红队演练,结论是:相比密码泄露,MCP Token泄露的RTO(恢复时间目标)从小时级降至秒级。
6.4 “MCP能替代微服务吗?”:一个必须厘清的认知边界
最后也是最重要的问题:MCP是不是微服务的替代品?答案是完全不是,而是互补。微服务解决“业务模块化”,MCP解决“能力可编程化”。
- 微服务架构中,
order-service、payment-service是独立进程,通过HTTP/gRPC通信; - MCP架构中,
order-service可以作为一个MCP Tool注册,提供create_order、cancel_order能力;payment-service同理。AI模型通过MCP Service调用它们,就像调用本地函数。
因此,MCP不是推翻微服务,而是给微服务装上“AI遥控器”。我们现有系统就是双模:内部服务间用gRPC高效通信,对外暴露给AI的能力则统一走MCP。这样既保持微服务的松耦合,又获得AI编排的灵活性。
我个人在实际操作中的体会是:MCP的价值不在“技术炫酷”,而在“降低AI落地门槛”。当业务方说“让AI帮我自动处理报销单”,工程师不再需要从零写OCR、NLP、审批流,只需把现有报销系统封装成MCP Tool,AI就能调用。这节省的不是开发时间,而是跨团队对齐成本——这才是MCP最真实的生产力。