Skip to main content
Glama
README.md
# 秋池(QiuChi)

[English](README.en.md) | 中文

---

## 项目简介

**秋池(QiuChi)** 是一个**生产级 MCP(Model Context Protocol)服务器框架**,基于 [FastMCP](https://github.com/modelcontextprotocol/python-sdk) 构建。通过六层清晰架构、插件化设计、中间件管道和统一配置管理,为企业提供开箱即用的 MCP 服务器开发体验。

**核心价值**:

- **协议合规** —— 完整实现 MCP 协议 Tools、Resources、Prompts 三大原语
- **架构清晰** —— Core / Plugins / Runtime / Transport / Utils / Examples 六层职责分明
- **开箱即用** —— 装饰器一键注册、插件自动发现、中间件即插即用
- **生产就绪** —— 结构化日志、健康检查、容器化部署、TLS 支持

**适配场景**:

- 为 LLM 应用(Claude、GPT 等)快速搭建 MCP 工具服务
- 构建企业级 AI Agent 工具链平台
- 需要多传输层(Stdio / SSE / HTTP)灵活切换的 MCP 服务
- 需要插件化扩展和中间件治理的 AI 基础设施

---

## 快速开始

### 1. 环境要求

| 依赖项 | 最低版本 | 说明 |
|--------|---------|------|
| Python | >= 3.11 | 类型提示、异常组等特性要求 |
| uv | >= 0.1 | 推荐包管理器([安装指南](https://docs.astral.sh/uv/getting-started/installation/)) |
| Git | >= 2.0 | 项目克隆 |

**Windows 环境**:

```powershell
# 安装 uv(PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# 或使用 pip 安装
pip install uv
```

**Linux 环境**:

```bash
# 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# 或使用 pip
pip install uv
```

**macOS 环境**:

```bash
# 使用 Homebrew 安装
brew install uv

# 或使用官方安装脚本
curl -LsSf https://astral.sh/uv/install.sh | sh

# 或使用 pip
pip install uv
```

### 2. 项目代码克隆

```bash
git clone https://github.com/chain-engine/x-QiuChi.git
cd x-QiuChi
```

### 3. 依赖同步安装

```bash
# 使用 uv 同步依赖(推荐)
uv sync

# 开发模式(包含测试、格式化、类型检查等工具)
uv sync --extra dev
```

### 4. 环境配置

```bash
# 复制配置文件
cp config.yaml.example config.yaml
```

**核心配置项说明**(`config.yaml`):

| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| `mcp.server_name` | `QiuChi` | MCP 服务器名称 |
| `mcp.version` | `1.0.0` | 服务器版本号 |
| `mcp.transport` | `streamable-http` | 传输层类型:`stdio` / `sse` / `streamable-http` |
| `mcp.host` | `0.0.0.0` | HTTP 监听地址 |
| `mcp.port` | `8000` | HTTP 监听端口 |
| `mcp.json_response` | `true` | 是否启用 JSON 响应模式 |
| `logging.level` | `INFO` | 日志级别:`DEBUG` / `INFO` / `WARNING` / `ERROR` / `CRITICAL` |
| `logging.output` | `both` | 日志输出目标:`stderr` / `file` / `both` |
| `logging.file_path` | `logs/x-QiuChi_{time}.log` | 日志文件路径(支持时间模板) |
| `logging.rotation` | `1 hour` | 日志轮转周期 |
| `logging.retention` | `7 days` | 日志保留时长 |
| `features.tools` | `true` | 是否启用工具原语 |
| `features.resources` | `true` | 是否启用资源原语 |
| `features.prompts` | `true` | 是否启用提示词原语 |
| `features.middleware` | `true` | 是否启用中间件管道 |
| `features.cache` | `false` | 是否启用缓存中间件 |
| `plugins.auto_discovery` | `true` | 是否自动发现插件 |
| `plugins.discovery_paths` | `["src.plugins", "src.examples"]` | 插件扫描路径 |
| `middleware.auth.enabled` | `false` | 是否启用 Token 认证 |
| `middleware.cache.enabled` | `false` | 是否启用内存缓存 |
| `middleware.cache.default_ttl` | `300` | 缓存默认 TTL(秒) |

**环境变量覆盖**:所有配置均可通过环境变量覆盖,优先级为 **环境变量 > YAML > 默认值**。常用环境变量:

| 环境变量 | 说明 |
|----------|------|
| `MCP_SERVER_NAME` | 服务器名称 |
| `MCP_TRANSPORT` | 传输层类型 |
| `MCP_HOST` | 监听地址 |
| `MCP_PORT` | 监听端口 |
| `MCP_LOG_LEVEL` | 日志级别 |
| `MCP_LOG_OUTPUT` | 日志输出目标 |

### 5. 启动服务

#### 方式一:CLI 启动(推荐)

```bash
# HTTP 模式(默认,端口 8000)
uv run x-QiuChi

# Stdio 模式(兼容 Claude Desktop)
uv run x-QiuChi --transport stdio

# 自定义参数
uv run x-QiuChi --host 127.0.0.1 --port 8080 --log-level DEBUG

# 查看帮助
uv run x-QiuChi --help
```

#### 方式二:uv run 直接启动

```bash
# HTTP 模式(默认,端口 8000)
uv run python src/main.py

# Stdio 模式(兼容 Claude Desktop)
uv run python src/main.py --transport stdio

# 自定义参数
uv run python src/main.py --host 127.0.0.1 --port 8080 --log-level DEBUG
```

#### 方式三:Docker 容器部署

```bash
# 构建并启动
docker compose up -d --build

# 查看日志
docker compose logs -f

# 停止
docker compose down
```

### 6. 常用工程命令

```bash
# 运行全部测试
uv run pytest

# 运行指定测试文件(详细输出)
uv run pytest tests/test_integration.py -v

# 测试覆盖率报告
uv run pytest --cov=src tests/

# 代码格式化
uv run ruff format src/

# 代码静态检查
uv run ruff check src/

# 自动修复可修复的 lint 问题
uv run ruff check --fix src/

# 类型检查
uv run mypy src/

# MCP Inspector 验证
npx @anthropic-ai/mcp-inspector
# 连接地址: http://localhost:8000/mcp
```

### 7. 使用方法示例

#### 装饰器注册工具

```python
from main import create_server, tool, resource, prompt

server = create_server("MyServer")

# 注册工具
@tool(category="math")
def add(a: float, b: float) -> float:
    """两数相加"""
    return a + b

# 注册资源
@resource(name="config://app", category="config")
def get_app_config() -> str:
    """获取应用配置"""
    return '{"version": "1.0.0"}'

# 注册提示词
@prompt(category="code")
def code_review(language: str) -> str:
    """生成代码审查提示词"""
    return f"请审查以下 {language} 代码的最佳实践。"

server.run()
```

#### HTTP 客户端调用

```python
import httpx

# 获取 Session ID
resp = httpx.get("http://localhost:8000/mcp",
                 headers={"Accept": "text/event-stream"})
session_id = resp.headers.get("mcp-session-id")

# 调用工具
resp = httpx.post(
    "http://localhost:8000/mcp",
    json={"jsonrpc": "2.0", "method": "tools/call",
          "params": {"name": "add", "arguments": {"a": 10, "b": 20}},
          "id": 1},
    headers={"Content-Type": "application/json",
             "mcp-session-id": session_id}
)
print(resp.json())  # {"result": {"content": [{"text": "30.0"}]}}
```

#### LangChain / LangGraph 集成

```python
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.chat_models import init_chat_model
from langgraph.prebuilt import create_react_agent

client = MultiServerMCPClient({
    "qiuchi_mcp": {
        "transport": "http",
        "url": "http://localhost:8000/mcp",
    }
})

tools = await client.get_tools()
model = init_chat_model("openai:gpt-4o-mini")
agent = create_react_agent(model, tools)

response = await agent.ainvoke({"messages": "计算 123 + 456"})
print(response['messages'][-1].content)
```

---

## 项目结构

```
x-QiuChi/
├── config.yaml                      # 运行时配置文件
├── config.yaml.example              # 配置示例(含全部字段说明)
├── pyproject.toml                   # 包配置、依赖声明、工具链设置
├── Dockerfile                       # 多阶段构建镜像定义
├── docker-compose.yml               # 容器编排配置
├── LICENSE                          # MIT 开源许可证
│
├── src/                             # 源码根目录
│   ├── main.py                      # 主入口:CLI 参数解析与服务器启动
│   │
│   ├── constants/                   # 常量定义层
│   │   ├── base.py                  # 基础常量
│   │   ├── constants.py             # 业务常量
│   │   └── enums.py                 # 枚举类型定义
│   │
│   ├── core/                        # 核心层:框架基础设施
│   │   ├── config.py                # Pydantic Settings 配置管理(多源优先级、热重载)
│   │   ├── exceptions.py            # 自定义异常体系
│   │   ├── logger.py                # loguru 结构化日志封装(文件轮转、敏感信息过滤)
│   │   └── middleware.py            # 中间件管道(ErrorHandler / Logging / Auth / Cache)
│   │
│   ├── plugins/                     # 插件层:插件系统核心
│   │   ├── base.py                  # 插件抽象基类与元数据定义(PluginType / PluginMetadata)
│   │   ├── registry.py              # UnifiedRegistry 统一注册表(线程安全)
│   │   ├── manager.py               # PluginManager 插件管理器(自动发现、依赖解析、生命周期)
│   │   ├── discovery.py             # 插件发现扫描器
│   │   ├── loader.py                # 插件加载器
│   │   └── collector.py             # 插件收集器(装饰器注册入口)
│   │
│   ├── server/                      # 服务层:MCP 服务器核心
│   │   ├── server.py                # MCPServer 类(封装 FastMCP,装饰器注册,中间件集成)
│   │   └── lifecycle.py             # 服务器生命周期状态机(UNINITIALIZED → RUNNING → STOPPED)
│   │
│   ├── runtime/                     # 运行时层:请求上下文与会话管理
│   │   ├── context.py               # RequestContext 请求上下文
│   │   └── session.py               # SessionManager 会话管理器
│   │
│   ├── transport/                   # 传输层:多协议传输抽象
│   │   └── transport.py             # 传输层配置(Stdio / SSE / Streamable-HTTP / TLS)
│   │
│   ├── utils/                       # 工具层:通用辅助函数
│   │   └── helpers.py               # 工具函数集合
│   │
│   └── examples/                    # 示例层:内置示例插件
│       ├── tools/
│       │   └── math.py              # 8 个数学工具(加减乘除、幂、开方、温度转换)
│       ├── resources/
│       │   └── config.py            # 3 个配置资源(server config / version / API docs)
│       └── prompts/
│           └── templates.py         # 5 个提示词模板(问候、代码审查、天气穿搭等)
│
├── examples/                        # 外部示例代码
│   ├── mcp_clients/
│   │   ├── mcp_client.py            # 原生 JSON-RPC MCP 客户端示例
│   │   └── langchain_mcp_client.py  # LangChain MCP 集成示例
│   └── mcp_servers/
│       └── weather_mcp_server.py    # OpenWeatherMap 天气 MCP 服务示例
│
├── tests/                           # 测试目录
│   └── test_integration.py          # 7 步集成测试套件
│
├── docs/                            # 文档目录
├── scripts/                         # 脚本工具目录
├── static/                          # 静态资源目录
├── logs/                            # 日志输出目录(运行时生成)
└── tmp/                             # 临时文件目录
```

---

## 系统架构

### 系统分层架构图

```mermaid
flowchart TD
    A["MCP 客户端<br/>(Claude Desktop / LangChain / 自定义客户端)"]
    B["传输层<br/>Stdio / SSE / Streamable-HTTP"]
    C["中间件管道<br/>ErrorHandler → Logging → Auth → Cache → Handler"]
    subgraph D["MCP 三大原语"]
        direction LR
        D1["Tools(工具原语)"]
        D2["Resources(资源原语)"]
        D3["Prompts(提示词原语)"]
    end
    E["插件系统<br/>Discovery → Load → Register → Enable → Serve"]
    F["统一注册表(线程安全)"]
    G["核心服务器<br/>MCPServer(封装 FastMCP)+ 生命周期管理"]
    H["配置管理<br/>Pydantic Settings(环境变量 > YAML > 默认值)"]
    I["结构化日志<br/>loguru(stderr + 文件轮转)"]

    A -->|"MCP 协议(JSON-RPC)"| B
    B --> C
    C --> D
    D --> E
    E --> F
    F --> G
    G --> H
    H --> I
```

### 服务器启动流程

```mermaid
flowchart TD
    S1["解析 CLI 参数 / 加载配置"] --> S2["创建 MCPServer 实例"]
    S2 --> S3["注册默认中间件管道<br/>ErrorHandler / Logging / Auth(可选) / Cache(可选)"]
    S3 --> S4["扫描 discovery_paths<br/>自动发现并加载插件"]
    S4 --> S5["注册到 UnifiedRegistry<br/>(Tools / Resources / Prompts)"]
    S5 --> S6["启动传输层监听<br/>(Stdio / SSE / HTTP)"]
    S6 --> S7["状态:RUNNING"]
```

### 请求处理流程

```mermaid
flowchart TD
    R1["接收 MCP 请求"] --> R2["中间件链<br/>ErrorHandler → Logging → Auth → Cache"]
    R2 --> R3{"缓存命中?"}
    R3 -->|"是"| R8["直接返回缓存结果"]
    R3 -->|"否"| R4["路由到对应原语处理器<br/>Tool / Resource / Prompt"]
    R4 --> R5["执行业务逻辑"]
    R5 --> R6["写入缓存(可选)"]
    R6 --> R7["返回 MCP 响应"]
```

### 模块依赖关系图

```mermaid
flowchart TD
    A["src/main.py<br/>主入口"] --> B["src/server/server.py<br/>MCPServer"]
    A --> K["src/core/logger.py<br/>日志系统"]
    K --> K1["loguru(外部依赖)"]

    B --> C1["FastMCP(外部依赖)"]
    B --> D["src/plugins/manager.py<br/>插件管理器"]
    B --> E["src/core/middleware.py<br/>中间件管道"]
    B --> F["src/transport/transport.py<br/>传输层"]

    D --> D1["src/plugins/base.py<br/>插件基类"]
    D --> D2["src/plugins/registry.py<br/>统一注册表"]
    D --> D3["src/plugins/discovery.py<br/>插件发现"]

    E --> E1["ErrorHandler 中间件"]
    E --> E2["Logging 中间件"]
    E --> E3["Auth 中间件"]
    E --> E4["Cache 中间件"]

    B --> G["src/runtime/<br/>上下文与会话"]
    B --> H["src/core/config.py<br/>配置管理"]
    H --> H1["Pydantic Settings(外部依赖)"]
```

---

## 技术栈

| 分类 | 技术 | 版本 | 说明 |
|------|------|------|------|
| **开发语言** | [Python](https://www.python.org/) | >= 3.11 | 主开发语言 |
| **MCP 框架** | [FastMCP (mcp)](https://github.com/modelcontextprotocol/python-sdk) | >= 1.0.0 | MCP 协议 Python SDK,服务器核心 |
| **数据验证** | [Pydantic](https://docs.pydantic.dev/) / pydantic-settings | >= 2.0.0 | 类型安全配置管理与数据验证 |
| **HTTP 客户端** | [httpx](https://www.python-httpx.org/) | >= 0.27.0 | 异步 HTTP 客户端 |
| **HTTP 工具** | [Requests](https://requests.readthedocs.io/) | >= 2.28.0 | 同步 HTTP 请求库 |
| **配置解析** | [PyYAML](https://pyyaml.org/) | >= 6.0 | YAML 配置文件解析 |
| **日志** | [loguru](https://loguru.readthedocs.io/) | >= 0.7.0 | 结构化日志,文件轮转与敏感信息过滤 |
| **代码质量** | [Ruff](https://docs.astral.sh/ruff/) | >= 0.6.0 | 代码格式化 + Lint(替代 Black + Flake8) |
| **类型检查** | [Mypy](https://mypy.readthedocs.io/) | >= 1.0.0 | 静态类型检查(strict 模式) |
| **测试框架** | [Pytest](https://docs.pytest.org/) + pytest-asyncio | >= 8.0.0 | 单元测试与异步测试 |
| **包管理** | [uv](https://docs.astral.sh/uv/) | >= 0.1 | 高性能 Python 包管理器 |
| **容器化** | [Docker](https://www.docker.com/) / Docker Compose | - | 多阶段构建,非 root 用户运行,健康检查 |
| **构建后端** | [Hatchling](https://hatch.pypa.io/) | - | PEP 517 构建后端 |

---

## API 文档说明

秋池(QiuChi)作为 MCP 服务器框架,不提供传统 REST API,而是通过 **MCP 协议** 进行能力发现与交互。

### MCP 协议接口清单

| 能力 | MCP 方法 | 说明 |
|------|---------|------|
| 工具列表 | `tools/list` | 获取所有已注册工具及其参数定义 |
| 工具调用 | `tools/call` | 调用指定工具并返回执行结果 |
| 资源列表 | `resources/list` | 获取所有已注册资源及其 URI |
| 资源读取 | `resources/read` | 读取指定 URI 的资源内容 |
| 提示词列表 | `prompts/list` | 获取所有已注册提示词模板 |
| 提示词获取 | `prompts/get` | 获取指定提示词模板及其参数 |

### 内置示例

**工具(8 个)**:

| 工具名 | 说明 |
|--------|------|
| `add` | 两数相加 |
| `subtract` | 两数相减 |
| `multiply` | 两数相乘 |
| `divide` | 两数相除 |
| `power` | 幂运算 |
| `sqrt` | 开平方 |
| `celsius_to_fahrenheit` | 摄氏度转华氏度 |
| `fahrenheit_to_celsius` | 华氏度转摄氏度 |

**资源(3 个)**:

| 资源 URI | 说明 |
|----------|------|
| `config://server` | 服务器配置信息 |
| `config://version` | 版本信息 |
| `docs://api` | API 文档 |

**提示词(5 个)**:

| 提示词名 | 说明 |
|----------|------|
| `greeting` | 个性化问候 |
| `code_review` | 代码审查提示词 |
| `weather_outfit_advice` | 天气穿搭建议 |
| `explain_concept` | 概念解释提示词 |
| `summarize_document` | 文档摘要提示词 |

---

## 存储配置说明

### 内存存储

| 存储类型 | 实现方式 | 配置位置 | 说明 |
|---------|---------|---------|------|
| 会话存储 | 内存字典 | `src/runtime/session.py` | SessionManager,支持 TTL 和自动清理 |
| 缓存存储 | 内存字典 | `src/core/middleware.py` | CacheMiddleware,支持 TTL、SHA-256 Key 生成 |
| 插件注册表 | 内存字典 | `src/plugins/registry.py` | UnifiedRegistry,线程安全(RLock) |

### 日志文件存储

| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| `logging.file_path` | `logs/x-QiuChi_{time:YYYY-MM-DD-HH}.log` | 日志文件路径(支持时间模板变量) |
| `logging.rotation` | `1 hour` | 日志轮转周期 |
| `logging.retention` | `7 days` | 日志保留时长 |
| `logging.output` | `both` | 输出目标:`stderr`(仅标准错误)/ `file`(仅文件)/ `both`(两者) |

> **扩展说明**:缓存中间件设计了抽象后端接口,可扩展为 Redis 等外部存储后端。当前版本暂不提供对象存储集成,预留扩展接口。

---

## 许可证

本项目采用 [MIT](LICENSE) 许可证。

---

## 参考资料

| 资源 | 链接 |
|------|------|
| MCP 协议规范 | https://modelcontextprotocol.io/ |
| FastMCP SDK | https://github.com/modelcontextprotocol/python-sdk |
| Python 官方文档 | https://docs.python.org/3.11/ |
| Pydantic 文档 | https://docs.pydantic.dev/ |
| Pydantic Settings 文档 | https://docs.pydantic.dev/latest/concepts/pydantic_settings/ |
| uv 包管理器 | https://docs.astral.sh/uv/ |
| loguru 日志库 | https://loguru.readthedocs.io/ |
| httpx 文档 | https://www.python-httpx.org/ |
| PyYAML 文档 | https://pyyaml.org/wiki/PyYAMLDocumentation |
| Ruff 文档 | https://docs.astral.sh/ruff/ |
| Mypy 文档 | https://mypy.readthedocs.io/ |
| Pytest 文档 | https://docs.pytest.org/ |
| Docker 官方文档 | https://docs.docker.com/ |
| Hatchling 文档 | https://hatch.pypa.io/ |

---

## 联系方式

| 渠道 | 信息 |
|------|------|
| 作者 | John Young(夜雨诗来) |
| 邮箱 | [john.young@foxmail.com](mailto:john.young@foxmail.com) |
| Gitee | https://gitee.com/yeyushilai |
| GitHub | https://github.com/yeyushilai |
| 项目地址 | https://github.com/chain-engine/x-QiuChi |