如何使用 curl 命令行测试 FastMCP (SSE 模式)

在开发 FastMCP Server 时,我们经常需要快速验证某个 Tool 或 Resource 是否工作正常。虽然编写 Python 客户端代码是最正规的方式,但有时手边只有命令行。

本文将手把手教你如何使用 curl 征服 MCP over SSE 协议。

1. 原理解析:为什么需要两个窗口?

MCP (Model Context Protocol) 在使用 SSE (Server-Sent Events) 传输时,采用了 "读写分离" 的模式:

  • 读 (Read): 一个持久的 HTTP 长连接,服务器通过它源源不断地推送数据(Events)。
  • 写 (Write): 短暂的 HTTP POST 请求,客户端通过它发送指令。

因此,我们需要打开两个终端窗口:一个负责"听",一个负责"说"。


2. 准备工作

假设您的 FastMCP Server 运行在本地:

  • Host : 127.0.0.1
  • Port : 13333

3. 实战步骤

第一步:建立监听 (Terminal A)

打开第一个终端窗口,输入以下命令连接到 SSE 端点:

bash 复制代码
curl -N http://127.0.0.1:13333/sse

注意:-N 参数至关重要,它告诉 curl 禁用缓冲,立即显示服务器推过来的数据。

Sample Output (成功连接):

复制代码
event: endpoint
data: /messages/?session_id=6e0d5044d8fd45b595fbba50a15d65c4

: ping - 2026-01-03 10:00:10.371033+00:00

👉 关键动作 :请复制 data: 后面的完整路径 /messages/?session_id=...。这是您的专属通信频道。


第二步:发送指令 (Terminal B)

保持 Terminal A 开启,打开第二个终端窗口。我们将构造一个 JSON-RPC 请求来调用工具。

假设我们要调用的工具是 multiply,参数是 a=3, b=4

构造 POST 请求:

  1. URL : 拼接 host 和刚才复制的路径。
    • ⚠️ 注意 :URL 末尾的斜杠 / 不能少!FastMCP 默认路由是 /messages/。如果少了斜杠,会收到 307 Redirect 错误。
  2. Body: 标准的 JSON-RPC 2.0 格式。

命令示例

bash 复制代码
curl -X POST "http://127.0.0.1:13333/messages/?session_id=YOUR_SESSION_ID_HERE" \
     -H "Content-Type: application/json" \
     -d '{
           "jsonrpc": "2.0", 
           "method": "tools/call", 
           "params": {
             "name": "multiply", 
             "arguments": {"a": 3, "b": 4}
           }, 
           "id": 1
         }'

Terminal B 的 Sample Output:

复制代码
Accepted

(是的,这里通常只返回 Accepted,表示服务器已收到请求。真正的结果会在 Terminal A 显示。)


第三步:查看结果 (Terminal A)

回到第一个窗口,您会看到新的事件被推出来了:

Sample Output (工具执行结果):

复制代码
event: message
data: {"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"12.0"}]}}

可以看到,result 字段里包含了计算结果 12.0


4. 常见坑点排查 (Troubleshooting)

Q: 发送 POST 后没反应?

  • 检查 Terminal A:结果是异步返回的,一定要看监听窗口。
  • 检查斜杠 :确认 POST URL 是 /messages/?... 而不是 /messages?...。可以加 -v 参数查看是否返回了 307 Temporary Redirect

Q: Session ID 过期?

  • SSE 连接如果断开,Session ID 就会失效。每次重新运行 curl -N .../sse 都会生成一个新的 ID,发 POST 时记得更新。

Q: 乱码或无输出?

  • 确保 curl 加上了 -N (no buffer)。
  • 确保 curl 加上了 -H "Content-Type: application/json",否则服务器可能不解析 Body。
相关推荐
深紫色的三北六号20 小时前
基于 ContextCapture SDK 的 Python 自动化三维建模
python·点云·三维建模·contextcapture·las
郑泰科技20 小时前
python虚拟环境:如何使用Literal类型来限制函数参数的取值范围?
开发语言·python
Kratzdisteln20 小时前
【Python】配置LLM API Key
java·服务器·python
默默前行的虫虫20 小时前
Python轻松实现某德地图可视化
python
智算菩萨20 小时前
基于Pygame的沉浸式新年特效系统设计与实现
开发语言·python·pygame
Dxy123931021621 小时前
国家税务总局中文点选验证码识别
python·深度学习·机器学习·图像识别·验证码识别·中文识别
一晌小贪欢21 小时前
Python安装最新(2026版)python最新版安装(图文并茂-详细)
开发语言·python·python安装·pycharm安装·python最新安装·pycharm最新安装
BBB努力学习程序设计21 小时前
深入理解 Python 中的__slots__:优化内存与属性管控的利器
python
机器懒得学习21 小时前
通达信分时资金流向分析系统【附源码】
开发语言·python