MCP学习模拟项目
该项目是对 模型上下文协议(MCP) 使用Python。它演示了如何构建一个公开工具的MCP服务器,以及一个连接到服务器并使用LLM与这些工具交互的MCP客户端。
特性
- 标准MCP服务器(
server.py):使用核心mcp.server.Server类通过提供三个简单的工具stdio运输:
- get_weather:给定位置的模拟天气数据。 - add_note:将文字注释保存到本地 notes_db 目录。 - list_notes:列出所有已保存的笔记。
- MCP客户端(
client.py):通过以下方式连接到服务器stdio,初始化会话并获取工具。它将MCP工具转换为OpenAI工具格式,并使用OpenRouter API与LLM通信。 - 模型回退:客户端利用OpenRouter的模型路由/回退功能(通过
extra_body参数)以确保高可用性,如果主模型速率受限或不可用,则优雅地降级。 - JSON-RPC拦截(
wrapper_server.py):一个包装器脚本,将服务器作为子进程运行,将客户端和服务器之间的原始底层JSON-RPC通信回显到控制台(stderr)用于学习和调试目的。 - 自动验证(
test_server.py):一个测试脚本,用于验证服务器的工具,而不需要LLM,包括在add_note工具。
先决条件
- Python 3.10+
- 在您的环境中定义的所需Python包(例如。,
mcp,pydantic,openai,python-dotenv).
通过创建 .env 根目录中的文件:
OPENROUTER_API_KEY="your_openrouter_api_key_here"运行应用程序
- 激活您的虚拟环境 (如果使用一个):
.\.venv\Scripts\activate- 运行MCP客户端:
python client.py客户端将初始化,连接到服务器(通过包装器),并将您放入聊天提示中。你可以问它这样的问题:
- *“巴黎的天气怎么样?”* - *“你能留张纸条提醒我喝水吗?”* - *“列出我的笔记。”*
类型 exit 或 quit 以停止会话。
架构和通信流程
- 用户运行
client.py. - 客户端生成
wrapper_server.py作为一个子流程。 - 包装纸发芽了
server.py作为其子流程,并开始拦截标准输入和输出流。 - 客户使用
stdio_client通过其发送JSON-RPC请求stdout. - 包装器将这些请求打印到控制台(供您查看)并将其转发到服务器。
- 服务器处理请求(例如,执行工具),格式化响应,并通过其
stdout. - 包装器拦截响应,打印它,并将其转发回客户端。
- 客户端接收响应,并通过OpenRouter将上下文交还给LLM。
自动化测试
要在不影响LLM API的情况下运行自动服务器工具检查,请执行以下操作:
python test_server.py此测试工具是否存在、基本I/O和净化/安全措施。
