MCP 服务如何从本地走向线上?SSE 模式部署实践
前面我们已经实现了两个 MCP 工具:一个负责自动发布文章,另一个负责发送消息通知。
在本地开发阶段,可以通过 stdio 模式调用它们:主程序启动一个 Jar,然后通过标准输入输出与 MCP 服务通信。这种方式简单、适合调试,但不适合线上长期运行。
本篇介绍如何将 MCP 服务改造成 SSE 模式,并通过 Docker 部署为可复用的网络服务。
一、stdio 模式的问题
stdio 模式的调用方式可以理解为:
AI 主程序启动 MCP Jar → 本地进程通信 → 工具执行完成
它适合个人电脑和本地测试,但有几个限制:
- MCP 服务通常依赖主程序启动;
- 服务与主程序耦合较强;
- 不方便被多个应用复用;
- 不利于独立升级、监控和扩容;
- 部署时需要处理本地 Jar 路径。
如果想把“发帖”“通知”等能力真正部署到服务器上,更适合使用 SSE 模式。
二、什么是 SSE 模式?
SSE(Server-Sent Events)是一种基于 HTTP 的服务端推送技术。
对于 MCP 而言,可以把它理解为:原先运行在本地的工具 Jar,现在变成了一个带 HTTP 地址的服务。AI 主程序通过网络连接它,并调用工具。
部署后,整体架构会变成:
- 文章发布 MCP:提供发帖工具,例如运行在
8101端口; - 消息通知 MCP:提供微信、邮件或企业微信通知工具,例如运行在
8102端口; - AI 主服务:负责生成内容、编排工作流,并连接两个 MCP 服务。
工作流程如下:
AI 生成文章 → 调用发帖 MCP → 获取文章链接 → 调用通知 MCP → 用户收到消息
三、从 stdio 切换到 SSE,需要改什么?
核心改动只有三类。
1. MCP 服务支持 Web 模式
原来的 stdio MCP 是一个命令行程序,改为 SSE 后,需要引入与当前 Spring AI 版本匹配的 MCP Web/WebFlux Server 依赖。
启动后,服务会监听端口,并暴露 SSE 连接地址,例如:
http://localhost:8101/sse
浏览器或命令行访问该地址时,能够建立 SSE 连接,说明服务已正常启动。
2. AI 主服务改为配置远程地址
此前,主服务通过 Java 命令和 Jar 路径启动 MCP:
{
"command": "java",
"args": ["-jar", "/app/mcp-server-article.jar"]
}
切换为 SSE 后,只需配置 MCP 服务地址:
spring:
ai:
mcp:
client:
request-timeout: 360s
sse:
connections:
article-publisher:
url: http://mcp-server-article:8101
message-notifier:
url: http://mcp-server-notice:8102
这样,AI 主服务不再关心 MCP Jar 位于哪里,只要知道服务地址即可。
3. 每个 MCP 服务独立部署
文章发布和消息通知分别构建镜像、独立运行:
services:
mcp-server-article:
image: your-registry/mcp-server-article:1.0
ports:
- "8101:8101"
mcp-server-notice:
image: your-registry/mcp-server-notice:1.0
ports:
- "8102:8102"
ai-app:
image: your-registry/ai-app:1.0
depends_on:
- mcp-server-article
- mcp-server-notice
在同一个 Docker 网络中,AI 主服务可以直接通过服务名访问 MCP,例如:
http://mcp-server-article:8101
不需要写死服务器 IP。
四、为什么不应该使用 127.0.0.1?
这是容器部署中最容易踩的坑。
在 Docker 容器里,127.0.0.1 指向的是当前容器自身,而不是其他容器。
因此,AI 主服务如果要访问发帖 MCP,不能配置:
http://127.0.0.1:8101
而应该使用 Docker Compose 的服务名:
http://mcp-server-article:8101
Docker 会自动为同一网络下的服务提供 DNS 解析。
五、上线前的几个关键检查
部署完成后,建议依次检查:
- 每个容器是否正常启动;
- MCP 服务端口是否已监听;
/sse地址是否可以建立连接;- AI 主服务是否成功发现工具;
- 发帖工具是否返回文章链接;
- 通知工具是否收到正确的标题、摘要和 URL;
- 容器日志中是否存在超时、认证或重复工具注册问题。
如果工具调用耗时较长,例如生成文章、请求第三方平台接口,适当提高 MCP 客户端超时时间,避免任务尚未完成就被中断。
六、安全配置不能忽略
发帖服务和通知服务通常需要 Cookie、API Key、App Secret 等敏感信息。
线上部署时应遵循几个原则:
- 不要把密钥写进代码或 Docker 镜像;
- 使用环境变量、配置中心或密钥管理服务;
- 不要把真实凭证提交到 Git 仓库;
- 对外暴露 MCP 服务时增加网络访问限制;
- 发布前优先创建草稿,并记录执行日志;
- 为失败任务设置告警和重试机制。
七、总结
stdio 模式适合本地开发,SSE 模式适合线上部署。
将 MCP 服务独立为 SSE 服务后,发帖、通知、数据查询等能力都可以像普通微服务一样被复用。AI 主服务只负责理解需求和编排工具,不再与具体 Jar 文件绑定。
这也是 MCP 从“本地小工具”走向“可部署 AI 能力服务”的关键一步。