构建基于 SSE 协议通信的 MCP Server 和 Client

在之前的系列教程中,我们编写的 MCP 服务器与 MCP 客户端是通过 **stdio(Standard Input/Output,标准输入输出)**来进行交互的。客户端通过启动服务器子进程,并利用标准输入(stdin)和标准输出(stdout)建立双向通信。这种模式导致 MCP 客户端与服务器之间存在强耦合,且每个服务器进程只能与启动它的客户端通信(1:1 的关系)。

为了解耦 MCP 客户端与服务器,本文将演示如何使用 **SSE(Server-Sent Events,服务器发送事件)**协议进行通信,使服务器能够作为一个独立运行的进程,支持多个客户端的灵活连接、使用和断开。换句话说,基于 SSE 的服务器和客户端可以是完全解耦的进程,甚至运行在不同的节点上,从而提供更高的灵活性和扩展性。

本文使用到的所有代码可以在 Github 上找到:https://github.com/cr7258/hands-on-lab/tree/main/ai/claude/mcp/sse/elasticsearch-mcp-sse

MCP 系列文章:

什么是 SSE?

Server-Sent Events(SSE,服务器发送事件)是一种基于 HTTP 协议的技术,允许服务器向客户端单向、实时地推送数据。在 SSE 模式下,客户端通过创建一个 EventSource 对象与服务器建立持久连接,服务器则通过该连接持续发送数据流,而无需客户端反复发送请求。

SSE 的主要特点包括:

  • 单向通信:服务器主动向客户端推送数据,客户端无法通过同一连接向服务器发送数据。
  • 基于 HTTP 协议:利用现有的 HTTP 协议,无需额外的协议支持,易于实现和部署。
  • 轻量级:实现简单,适用于需要实时更新的应用场景,如新闻推送、股票行情等。
  • 自动重连:客户端在连接断开时会自动尝试重新连接,确保数据传输的连续性。

需要注意的是,SSE 仅支持服务器到客户端的单向通信,若应用场景需要双向实时通信,可能需要考虑使用 WebSocket 等其他技术。

环境准备

在本教程中,我们将使用 MCP Python SDK 来编写项目,使用 uv 来管理 Python 项目依赖。

uv add "mcp[cli]" elasticsearch python-dotenv uvicorn openai

实验用到的 Elasticsearch 集群可以通过 Github 中的 docker-compose.yaml 文件启动:

docker-compose up -d

浏览器输入 http://localhost:5601 访问 Kibana 界面,用户名 elastic,密码 test123

.env 文件中设置好 Elasticsearch 的连接信息。

ELASTIC_HOST=https://localhost:9200
ELASTIC_USERNAME=elastic
ELASTIC_PASSWORD=test123

准备测试数据

在 Kibana 中打开 Management -> Dev Tools 页面, 执行以下代码创建两个索引 studentteacher,分别插入几条数据:

POST /student/_doc
{
   
   
  "name": "Alice",
  "age": 20,
  "major": "Computer Science"
}

POST /student/_doc
{
   
   
  "name": "Bob",
  "age": 22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值