MCP流式HTTP示例

一个使用FastMCP构建支持流式HTTP传输的MCP服务器的完整示例,展示工具调用、资源访问和提示生成功能。

  • by nerunja
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 nerunja/mcp-examples

使用说明

MCP 可流式传输 HTTP 示例

一个全面的示例,展示了如何使用(某技术或框架)构建一个MCP(模型上下文协议)服务器 FastMCP 支持可流式传输的HTTP传输。

概述

这个项目展示了三种主要的MCP(可能是指某种特定技术或框架中的)基本原语:

  • 工具数学运算(加、减、乘、除)
  • 资源静态内容端点(问候语、数学常量)
  • 提示模板生成器(数学问题、个性化问候语)

要求

  • Python 版本 >= 3.13
  • 紫外线 (推荐)或使用 pip
  • curl(用于测试)
  • jq(可选,用于美化JSON输出)

安装

使用紫外线(推荐)

uv sync

使用 pip

pip install -r requirements.txt

运行服务器

启动使用流式HTTP传输的MCP服务器:

使用紫外线(推荐)

uv run mcp-streamable_http.py

直接使用Python

python mcp-streamable_http.py

服务器将在 http://127.0.0.1:8000/mcp 默认情况下。

测试服务器

提供了一个综合测试脚本,展示了MCP的所有功能:

./mcp-streamable_http.sh

这个脚本将:

  1. 与MCP服务器初始化会话
  2. 列出并调用工具
  3. 列出并阅读资源
  4. 列出并检索提示

示例输出

测试脚本的输出被保存到 mcp-streamable_http.sh.log(文件名翻译为中文可保持原样,但若需解释其含义,可译为:“MCP流式HTTP脚本日志文件”) 这表明:

  • 会话初始化
  • 工具执行结果
  • 可用资源
  • 提示模板

API 端点

工具

工具 描述 参数 返回值
标题1 标题2 标题3 标题4
subtract a: int, b: int 两个整数相减 int
multiply a: int, b: int 两个整数相乘 int
divide a: int, b: int 两个整数相除 float

|

资源 | URI | 描述 | 返回 | |-----|-------------|---------| greeting://hello | | 简单问候信息 | 普通文本 | math://constants |

| 数学常数(π,e,φ,√2)| 普通文本 |

提示 | 提示 | 描述 | 参数 | |--------|-------------|-----------| math_problem | operation: str, num1: int, num2: int | 生成数学问题 | | greeting_prompt | name: str | 生成个性化问候语 |

|

.
├── mcp-streamable_http.py      # Main MCP server implementation
├── mcp-streamable_http.sh      # Test script using curl
├── mcp-streamable_http.sh.log  # Example test output
├── pyproject.toml              # Project dependencies
├── uv.lock                     # Dependency lock file
└── README.md                   # This file

项目结构

实施细节 该服务器是使用FastMCP

  • ,其中提供:
  • 基于装饰器的简单API,用于定义工具、资源和提示
  • 内置对多种传输协议的支持(stdio、SSE、可流式HTTP)
  • 自动处理JSON-RPC

类型安全的参数验证

  • 关键特性可流式传输的HTTP传输
  • 使用带有服务器发送事件(SSE)的HTTP进行实时通信会话管理 Mcp-Session-Id 每个客户端都会通过(某种方式)获得一个唯一的会话ID
  • 头球JSON-RPC 2.0
  • 所有通信均遵循JSON-RPC 2.0规范类型安全

所有函数和参数的完整类型提示

使用curl进行手动测试

SID=$(curl -sS -L -D - -o /dev/null \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -X POST http://127.0.0.1:8000/mcp \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{
        "protocolVersion":"2025-03-26",
        "capabilities":{},
        "clientInfo":{"name":"test","version":"1.0"}
      }}' | sed -nE 's/^Mcp-Session-Id:[[:space:]]*//Ip' | tr -d '\r')

初始化会话

curl -sS --no-buffer -N \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -H "Mcp-Session-Id: $SID" \
  -X POST http://127.0.0.1:8000/mcp \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{
        "name":"add","arguments":{"a":2,"b":3}}}'

调用一个工具

curl -sS --no-buffer \
  -H "Accept: application/json, text/event-stream" \
  -H "Content-Type: application/json" \
  -H "Mcp-Session-Id: $SID" \
  -X POST http://127.0.0.1:8000/mcp \
  -d '{"jsonrpc":"2.0","id":3,"method":"resources/list","params":{}}'

列出资源

许可证

这是一个用于演示目的的示例项目。