从零到一实现生产级 MCP Gateway(一):项目概述与架构设计
2025-02-06·5 分钟阅读
从零到一实现生产级 MCP Gateway(一):项目概述与架构设计
前言
2024 年 11 月,Anthropic 发布了 Model Context Protocol (MCP),这个协议被称为"AI 应用界的 USB-C"。短短几个月内,OpenAI、Google、微软、阿里等科技巨头纷纷宣布支持 MCP 协议。2025 年,MCP 生态呈爆发式增长,成为 AI Agent 与外部工具交互的事实标准。
本系列将从零开始,实现一个生产级的 MCP Gateway,深入理解 MCP 协议规范、认证授权、限流熔断、可观测性等核心技术。与之前的 mini-mcp-gateway 不同,本项目将完整实现企业级特性,可直接用于生产环境。
为什么需要生产级 MCP Gateway?
mini-mcp-gateway 的局限性
之前的 mini-mcp-gateway 系列已经介绍了 MCP Gateway 的基础实现,但要真正投入生产使用,还缺少以下关键能力:
┌─────────────────────────────────────────────────────────────────────┐
│ 生产级 vs 教学级 对比 │
├─────────────────┬─────────────────────┬─────────────────────────────┤
│ 特性 │ mini-mcp-gateway │ mcp-gateway-core │
├─────────────────┼─────────────────────┼─────────────────────────────┤
│ MCP 协议版本 │ 部分实现 │ 完整实现 2025-11-25 规范 │
│ 认证授权 │ 基础 JWT │ JWT + API Key + RBAC │
│ 参数验证 │ 简单校验 │ 完整 JSON Schema 验证 │
│ 持久化存储 │ 内存 │ SQLAlchemy (SQLite/PG) │
│ 限流熔断 │ 无 │ Token Bucket + 熔断器 │
│ 可观测性 │ 简单日志 │ OpenTelemetry + Prometheus │
│ 分布式追踪 │ 无 │ 完整 TraceContext 支持 │
│ 高可用部署 │ 单机 │ Docker + K8s Ready │
│ 测试覆盖 │ 基础测试 │ 完整单元测试 + 集成测试 │
└─────────────────┴─────────────────────┴─────────────────────────────┘
企业级场景的核心诉求
┌─────────────────────────────────────────────────────────────────────┐
│ │
│ 企业级 MCP Gateway │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 安全管控 │ │ 流量治理 │ │ 可观测性 │ │
│ ├──────────────┤ ├──────────────┤ ├──────────────┤ │
│ │ • 多租户隔离 │ │ • 限流熔断 │ │ • 分布式追踪 │ │
│ │ • RBAC 权限 │ │ • 负载均衡 │ │ • Prometheus │ │
│ │ • 审计日志 │ │ • 灰度发布 │ │ • 结构化日志 │ │
│ │ • 敏感数据脱敏│ │ • 健康检查 │ │ • 告警通知 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ 合规与治理 │ │
│ │ • 数据保留策略 • 操作审批流程 • 合规审计报告 │ │
│ └──────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
MCP 协议规范深度解析
协议版本与能力协商
MCP 协议目前最新版本为 2025-11-25,客户端和服务端通过 initialize 方法交换能力:
// 客户端请求
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {
"roots": { "listChanged": true },
"sampling": {}
},
"clientInfo": {
"name": "my-client",
"version": "1.0.0"
}
}
}
// 服务端响应
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-11-25",
"capabilities": {
"tools": { "listChanged": true },
"resources": { "subscribe": true, "listChanged": true },
"prompts": { "listChanged": true },
"logging": {}
},
"serverInfo": {
"name": "mcp-gateway-core",
"version": "1.0.0"
},
"instructions": "This gateway provides unified access to enterprise tools..."
}
}
核心能力矩阵
┌─────────────────────────────────────────────────────────────────────┐
│ MCP 核心能力矩阵 │
├─────────────────┬───────────────────────────────────────────────────┤
│ 能力域 │ 支持的方法 │
├─────────────────┼───────────────────────────────────────────────────┤
│ 生命周期管理 │ initialize, ping │
├─────────────────┼───────────────────────────────────────────────────┤
│ 工具调用 │ tools/list, tools/call │
├─────────────────┼───────────────────────────────────────────────────┤
│ 资源访问 │ resources/list, resources/read, │
│ │ resources/subscribe, resources/unsubscribe, │
│ │ resources/templates/list │
├─────────────────┼───────────────────────────────────────────────────┤
│ 提示词管理 │ prompts/list, prompts/get │
├─────────────────┼───────────────────────────────────────────────────┤
│ 日志控制 │ logging/setLevel │
├─────────────────┼───────────────────────────────────────────────────┤
│ 通知机制 │ notifications/initialized, │
│ │ notifications/tools/list_changed, │
│ │ notifications/resources/list_changed, │
│ │ notifications/resources/updated, │
│ │ notifications/prompts/list_changed, │
│ │ notifications/progress │
└─────────────────┴───────────────────────────────────────────────────┘
架构设计
整体架构
┌─────────────────────────────────────────────────────────────────────┐
│ MCP Gateway │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 接入层 (API Layer) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ /mcp │ │ /sse │ │ /tools │ │/metrics │ │ │
│ │ │ JSON-RPC│ │ SSE │ │ REST │ │ Prometheus│ │ │
│ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │
│ └───────┼────────────┼────────────┼────────────┼────────────────┘ │
│ │ │ │ │ │
│ ┌───────┴────────────┴────────────┴────────────┴────────────────┐ │
│ │ 中间件层 (Middleware) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Auth │ │RateLimit│ │ CORS │ │ Logging │ │ │
│ │ │ Layer │ │ Token │ │ Policy │ │ Tracing │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 协议层 (Protocol Layer) │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ JSON-RPC Handler │ │ │
│ │ │ initialize │ ping │ tools/* │ resources/* │ prompts/* │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 注册中心 (Registry) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Tool │ │ Resource │ │ Prompt │ │ │
│ │ │ Registry │ │ Registry │ │ Registry │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 存储层 (Storage Layer) │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ SQLAlchemy (Async) │ │ │
│ │ │ API Keys │ Tool Regs │ Audit Logs │ Resources │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ 可观测性 (Observability) │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Logging │ │ Metrics │ │ Tracing │ │ │
│ │ │ (JSON) │ │ (Prometheus)│ │(OpenTelemetry)│ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
核心模块职责
| 模块 | 职责 | 关键类/函数 |
|---|---|---|
protocol/ | MCP 协议实现 | JSONRPCHandler, types.py |
registry/ | 工具/资源/提示词注册 | ToolRegistry, ResourceRegistry |
auth/ | 认证授权 | JWTManager, APIKeyManager, RBAC |
middleware/ | 请求处理中间件 | RateLimitMiddleware, RequestLogger |
storage/ | 数据持久化 | Database, Repository |
observability/ | 可观测性 | setup_tracing, get_logger, metrics |
技术选型
核心技术栈
# 后端框架
Web 框架: FastAPI # 高性能异步框架,原生支持 OpenAPI
ASGI 服务器: Uvicorn # 生产级 ASGI 服务器
# 数据处理
数据验证: Pydantic v2 # 类型安全,自动文档生成
配置管理: pydantic-settings # 分层配置管理
# 认证授权
JWT: python-jose # JWT 生成与验证
密码哈希: passlib # bcrypt 密码哈希
# 数据存储
ORM: SQLAlchemy 2.0 # 异步 ORM,支持 SQLite/PostgreSQL
异步驱动: aiosqlite, asyncpg
# 可观测性
追踪: OpenTelemetry # 分布式追踪标准
指标: prometheus-client # Prometheus 指标采集
日志: structlog # 结构化日志
# 测试
测试框架: pytest # 单元测试
异步测试: pytest-asyncio # 异步测试支持
覆盖率: pytest-cov # 测试覆盖率
# 代码质量
Linter: ruff # 快速 Linter
类型检查: mypy # 静态类型检查
为什么选择这些技术?
┌─────────────────────────────────────────────────────────────────────┐
│ 技术选型考量 │
├─────────────────┬───────────────────────────────────────────────────┤
│ 技术 │ 选择理由 │
├─────────────────┼───────────────────────────────────────────────────┤
│ FastAPI │ 原生异步支持、自动 OpenAPI 文档、高性能 │
├─────────────────┼───────────────────────────────────────────────────┤
│ Pydantic v2 │ Rust 加速、严格类型检查、优秀的错误提示 │
├─────────────────┼───────────────────────────────────────────────────┤
│ SQLAlchemy 2.0 │ 异步支持完善、成熟稳定、社区活跃 │
├─────────────────┼───────────────────────────────────────────────────┤
│ OpenTelemetry │ 厂商中立、生态完整、K8s 原生支持 │
├─────────────────┼───────────────────────────────────────────────────┤
│ pytest │ Python 社区标准、插件丰富、asyncio 原生支持 │
└─────────────────┴───────────────────────────────────────────────────┘
项目结构
mcp-gateway-core/
├── src/mcp_gateway_core/
│ ├── __init__.py # 公共 API 导出
│ ├── main.py # FastAPI 应用入口
│ ├── config.py # 分层配置管理
│ │
│ ├── protocol/ # MCP 协议实现
│ │ ├── __init__.py
│ │ ├── types.py # 协议类型定义
│ │ └── jsonrpc.py # JSON-RPC 处理器
│ │
│ ├── registry/ # 注册中心
│ │ ├── __init__.py
│ │ ├── tool_registry.py # 工具注册
│ │ ├── resource_registry.py # 资源注册
│ │ └── prompt_registry.py # 提示词注册
│ │
│ ├── auth/ # 认证授权
│ │ ├── __init__.py
│ │ ├── jwt.py # JWT 管理
│ │ ├── api_key.py # API Key 管理
│ │ └── rbac.py # 角色权限控制
│ │
│ ├── middleware/ # 中间件
│ │ ├── __init__.py
│ │ ├── rate_limit.py # 限流中间件
│ │ └── request_logger.py# 请求日志
│ │
│ ├── observability/ # 可观测性
│ │ ├── __init__.py
│ │ ├── logging.py # 结构化日志
│ │ ├── metrics.py # Prometheus 指标
│ │ └── tracing.py # 分布式追踪
│ │
│ ├── storage/ # 存储层
│ │ ├── __init__.py
│ │ ├── database.py # 数据库连接
│ │ ├── models.py # SQLAlchemy 模型
│ │ └── repositories.py # 仓储模式数据访问
│ │
│ └── utils/ # 工具函数
│
├── tests/ # 测试套件
│ ├── conftest.py # pytest 配置
│ ├── test_protocol.py
│ ├── test_registry.py
│ ├── test_auth.py
│ └── test_integration.py
│
├── examples/ # 使用示例
├── docs/ # 文档
├── pyproject.toml # 项目配置
└── README.md
API 端点设计
┌─────────────────────────────────────────────────────────────────────┐
│ API 端点一览 │
├─────────────────┬────────┬──────────────────────────────────────────┤
│ 端点 │ 方法 │ 描述 │
├─────────────────┼────────┼──────────────────────────────────────────┤
│ /mcp │ POST │ MCP JSON-RPC 主端点 │
├─────────────────┼────────┼──────────────────────────────────────────┤
│ /sse │ POST │ SSE 流式响应端点 │
├─────────────────┼────────┼──────────────────────────────────────────┤
│ /tools │ GET │ 列出所有已注册工具 (需认证) │
├─────────────────┼────────┼──────────────────────────────────────────┤
│ /health │ GET │ 详细健康检查 │
├─────────────────┼────────┼──────────────────────────────────────────┤
│ /ready │ GET │ Kubernetes 就绪探针 │
├─────────────────┼────────┼──────────────────────────────────────────┤
│ /live │ GET │ Kubernetes 存活探针 │
├─────────────────┼────────┼──────────────────────────────────────────┤
│ /metrics │ GET │ Prometheus 指标 │
└─────────────────┴────────┴──────────────────────────────────────────┘
配置管理设计
分层配置
# config.py - 分层配置类设计
from pydantic_settings import BaseSettings, SettingsConfigDict
class ServerConfig(BaseSettings):
"""服务器配置"""
model_config = SettingsConfigDict(env_prefix='MCP_GATEWAY_')
host: str = "0.0.0.0"
port: int = 8000
debug: bool = False
workers: int = 1
class AuthConfig(BaseSettings):
"""认证配置"""
model_config = SettingsConfigDict(env_prefix='MCP_AUTH_')
enabled: bool = True
secret_key: str = "change-me-in-production"
algorithm: str = "HS256"
access_token_expire_minutes: int = 30
class DatabaseConfig(BaseSettings):
"""数据库配置"""
model_config = SettingsConfigDict(env_prefix='MCP_DB_')
url: str = "sqlite+aiosqlite:///./mcp_gateway.db"
echo: bool = False
class RateLimitConfig(BaseSettings):
"""限流配置"""
model_config = SettingsConfigDict(env_prefix='MCP_RATE_LIMIT_')
enabled: bool = True
requests_per_second: float = 100.0
burst_size: int = 50
class ObservabilityConfig(BaseSettings):
"""可观测性配置"""
model_config = SettingsConfigDict(env_prefix='MCP_OBS_')
log_level: str = "INFO"
tracing_enabled: bool = False
tracing_endpoint: str = "http://localhost:4317"
class Config(BaseSettings):
"""总配置"""
server: ServerConfig = ServerConfig()
auth: AuthConfig = AuthConfig()
database: DatabaseConfig = DatabaseConfig()
rate_limit: RateLimitConfig = RateLimitConfig()
observability: ObservabilityConfig = ObservabilityConfig()
环境变量映射
# .env.example
# 服务器配置
MCP_GATEWAY_HOST=0.0.0.0
MCP_GATEWAY_PORT=8000
MCP_GATEWAY_DEBUG=false
MCP_GATEWAY_WORKERS=1
# 认证配置
MCP_AUTH_ENABLED=true
MCP_AUTH_SECRET_KEY=your-super-secret-key-change-in-production
MCP_AUTH_ALGORITHM=HS256
MCP_AUTH_ACCESS_TOKEN_EXPIRE_MINUTES=30
# 数据库配置
MCP_DB_URL=sqlite+aiosqlite:///./mcp_gateway.db
MCP_DB_ECHO=false
# 限流配置
MCP_RATE_LIMIT_ENABLED=true
MCP_RATE_LIMIT_REQUESTS_PER_SECOND=100
MCP_RATE_LIMIT_BURST_SIZE=50
# 可观测性配置
MCP_OBS_LOG_LEVEL=INFO
MCP_OBS_TRACING_ENABLED=false
MCP_OBS_TRACING_ENDPOINT=http://localhost:4317
本系列文章规划
| 章节 | 标题 | 核心内容 |
|---|---|---|
| 一 | 项目概述与架构设计 | 整体架构、技术选型、项目结构 |
| 二 | MCP 协议与 JSON-RPC 实现 | 协议类型、消息处理、方法路由 |
| 三 | 注册中心 | 工具/资源/提示词注册与执行 |
| 四 | 认证授权 | JWT、API Key、RBAC 权限模型 |
| 五 | 中间件 | 限流、日志、请求处理 |
| 六 | 存储层 | SQLAlchemy 模型、仓储模式 |
| 七 | 可观测性 | 日志、指标、分布式追踪 |
| 八 | 生产实践 | Docker 部署、K8s 配置、性能调优 |
小结
本章介绍了生产级 MCP Gateway 的设计理念与整体架构。与教学级的 mini-mcp-gateway 相比,mcp-gateway-core 在认证授权、可观测性、存储层等方面都有显著增强,能够满足企业级应用的核心诉求。
关键要点:
- 生产级 Gateway 需要完整的安全管控、流量治理、可观测性能力
- MCP 2025-11-25 规范定义了完整的能力矩阵
- 分层架构设计保证了模块的独立性和可测试性
- 配置管理采用 pydantic-settings 实现分层配置
下一章我们将深入 MCP 协议的实现细节,包括 JSON-RPC 消息处理、类型系统设计和方法路由机制。
参考资料
相关文章
从零到一实现生产级 MCP Gateway(五):中间件与插件机制
2025-03-20·5 分钟阅读
深入实现 Token Bucket 限流算法和请求日志中间件,构建高可用、可观测的 MCP Gateway。
从零到一实现生产级 MCP Gateway(七):可观测性
2025-04-07·5 分钟阅读
深入实现结构化日志、Prometheus 指标和 OpenTelemetry 分布式追踪,构建完整的可观测性体系。
从零到一实现生产级 MCP Gateway(六):存储层设计
2025-03-27·5 分钟阅读
深入实现基于 SQLAlchemy 的异步存储层和仓储模式,构建可扩展的持久化数据访问架构。