1396 字
约 4 分钟
0
MCP 服务如何从本地走向线上?SSE 模式部署实践

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 解析。

五、上线前的几个关键检查

部署完成后,建议依次检查:

  1. 每个容器是否正常启动;
  2. MCP 服务端口是否已监听;
  3. /sse 地址是否可以建立连接;
  4. AI 主服务是否成功发现工具;
  5. 发帖工具是否返回文章链接;
  6. 通知工具是否收到正确的标题、摘要和 URL;
  7. 容器日志中是否存在超时、认证或重复工具注册问题。

如果工具调用耗时较长,例如生成文章、请求第三方平台接口,适当提高 MCP 客户端超时时间,避免任务尚未完成就被中断。

六、安全配置不能忽略

发帖服务和通知服务通常需要 Cookie、API Key、App Secret 等敏感信息。

线上部署时应遵循几个原则:

  • 不要把密钥写进代码或 Docker 镜像;
  • 使用环境变量、配置中心或密钥管理服务;
  • 不要把真实凭证提交到 Git 仓库;
  • 对外暴露 MCP 服务时增加网络访问限制;
  • 发布前优先创建草稿,并记录执行日志;
  • 为失败任务设置告警和重试机制。

七、总结

stdio 模式适合本地开发,SSE 模式适合线上部署。

将 MCP 服务独立为 SSE 服务后,发帖、通知、数据查询等能力都可以像普通微服务一样被复用。AI 主服务只负责理解需求和编排工具,不再与具体 Jar 文件绑定。

这也是 MCP 从“本地小工具”走向“可部署 AI 能力服务”的关键一步。

MCP 服务如何从本地走向线上?SSE 模式部署实践
http://www.clxhxhhr.top/posts/605/
作者
clxstart
发布于
2026-09-13
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。