
Mcp server
Using FastAPI and MCP (Model Context Protocol), achieve standardized context interaction between AI models and development environments, enhancing the scalability and maintainability of AI applications.
概述
MCP Server
项目概述
基于 FastAPI 和 MCP(模型上下文协议),该项目通过简化模型部署、提供高效的 API 端点以及确保一致的模型输入输出来实现 AI 模型与开发环境之间标准化的上下文交互。它通过增强应用程序的可扩展性和可维护性使得开发人员更容易集成和管理 AI 任务。
MCP(模型上下文协议)是 AI 模型与开发环境之间进行上下文交互的统一协议。本项目提供了一个基于 Python 的 MCP 服务器实现,支持基本的 MCP 协议功能,包括初始化、采样和会话管理。
功能特性
- JSON-RPC 2.0: 基于标准 JSON-RPC 2.0 协议的请求-响应通信
- SSE 连接: 支持基于服务器发送事件(Server-Sent Events)的实时通知
- 模块化设计: 易于扩展和定制的模块化架构
- 异步处理: 使用 FastAPI 和异步 I/O 的高性能服务
- 完整客户端: 包含完整的测试客户端实现
项目结构
mcp_server/
├── mcp_server.py # MCP 服务器主程序
├── mcp_client.py # MCP 客户端测试程序
├── routers/
│ ├── __init__.py # 路由包初始化
│ └── base_router.py # 基础路由实现
├── requirements.txt # 项目依赖项
└── README.md # 项目文档
安装
- 克隆仓库:
bash
git clone https://github.com/freedanfan/mcp_server.git
cd mcp_server
- 安装依赖:
bash
pip install -r requirements.txt
使用方法
启动服务器
bash
python mcp_server.py
默认情况下,服务器将在 127.0.0.1:12000
上启动。可以通过环境变量自定义主机名和端口:
bash
export MCP_SERVER_HOST=0.0.0.0
export MCP_SERVER_PORT=8000
python mcp_server.py
运行客户端
在另一个终端中运行客户端:
bash
python mcp_client.py
如果服务器未运行在默认地址,请设置环境变量:
bash
export MCP_SERVER_URL="http://your-server-address:port"
python mcp_client.py
API 路径
服务器提供了以下 API 路径:
- 根路径 (
/
): 提供服务器信息 - API 路径 (
/api
): 处理 JSON-RPC 请求 - SSE 路径 (
/sse
): 处理 SSE 连接
MCP 协议实现
初始化流程
- 客户端通过 SSE 连接到服务器。
- 服务器返回 API 端点 URI。
- 客户端发送带有协议版本和能力的功能初始化请求。
- 服务器对初始化请求作出响应,返回服务器的能力信息。
采样请求
客户端可以使用提示发送采样请求:
json
{
"jsonrpc": "2.0",
"id": "request-id",
"method": "sample",
"params": {
"prompt": "Hello, please introduce yourself."
}
}
服务器将返回采样结果:
json
{
"jsonrpc": "2.0",
"id": "request-id",
"result": {
"content": "This is a response to the prompt...",
"usage": {
"prompt_tokens": 10,
"completion_tokens": 50,
"total_tokens": 60
}
}
}
关会话
客户端可以发送关机请求:
json
{
"jsonrpc": "2.0",
"id": "request-id",
"method": "shutdown",
"params": {}
}
服务器将优雅地关闭:
json
{
"jsonrpc": "2.0",
"id": "request-id",
"result": {
"status": "shutting_down"
}
}
开发扩展
添加新方法
要添加新的 MCP 方法,请向 MCPServer
类添加一个处理器函数并注册到 _register_methods
方法中:
python
def handle_new_method(self, params: dict) -> dict:
"""处理新方法请求"""
logger.info(f"收到新方法请求:{params}")
# 处理逻辑
return {"result": "success"}
def _register_methods(self):
# 注注册现有方法
self.router.register_method("initialize", self.handle_initialize)
self.router.register_method("sample", self.handle_sample)
self.router.register_method("shutdown", self.handle_shutdown)
# 注册新方法
self.router.register_method("new_method", self.handle_new_method)
集成 AI 模型
为了集成实际的 AI 模型,请修改 handle_sample
方法:
python
async def handle_sample(self, params: dict) -> dict:
"""处理采样请求"""
logger.info(f"接收到了采样请求:{params}")
# 获取提示
prompt = params.get("prompt", "")
# 调用 AI 模型 API
# 例如:使用 OpenAI API
response = await openai.ChatCompletion.acreate(
model="gpt-4",
messages=[{"role": "user", "content": prompt}]
)
content = response.choices[0].message.content
usage = response.usage
return {
"content": content,
"usage": {
"prompt_tokens": usage.prompt_tokens,
"completion_tokens": usage.completion_tokens,
"total_tokens": usage.total_tokens
}
}
常见问题和解决
常见问题
- 连接错误: 确保服务器在运行并且客户端正在使用正确的服务器 URL。
- 405 方法不允许: 确保客户端正确发送请求到相应的 API 端点。
- SSE 连接失败: 检查网络连接和防火墙设置。
日志记录
服务器和客户端均提供详细的日志记录。查看日志以获取更多信息:
bash
# 增加日志级别
export PYTHONPATH=.
python -m logging -v DEBUG -m mcp_server
参考资料
授权
该项目基于 MIT 许可证授权,详情请参阅 LICENSE 文件。