关于 MCP Server Implementation
这是一个基于 Flask 的 MCP 实现示例,供开发者构建带有外部工具的 LLM 对话服务。它通过解析文本中的工具调用来执行操作,并将结果放回对话流程。
主要功能
- 01解析并执行文本中的工具调用
- 02提供天气和计算器示例工具
- 03维护多轮对话上下文
- 04通过正则表达式识别调用
- 05提供 Flask 聊天 API
适用场景
- 01在聊天流程中查询天气
- 02在对话中执行计算
- 03为工具添加参数和执行逻辑
- 04通过 REST API 接入聊天应用
MCP 相关
该项目实现了以文本解析方式处理工具调用的 MCP 流程,并提供 Flask API。它向 LLM 提供工具定义,解析调用后执行工具并将结果注入对话。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
MCP 服务实现
这是一个完整的 Flask 实现,基于 Model Context Protocol(MCP),用于通过外部工具增强大模型的能力。
概述
本仓库演示如何构建一个处理 Model Context Protocol(MCP)的服务。MCP 是一种通过直接在模型的文本输出中调用工具来扩展大模型能力的方法。与函数调用不同,MCP 会将工具定义直接放入上下文窗口,并解析模型的自然语言响应,以识别工具调用。
功能
- 🔧 完整的 MCP 实现:完整支持解析、执行和响应处理
- 🌤️ 示例工具:包含天气和计算器工具,并支持参数验证
- 🔄 对话流程:在多轮交互中保留上下文
- 🧩 基于正则表达式的解析:灵活解析工具调用文本
- 🚀 Flask API:用于聊天集成的 REST API 端点
项目结构
mcp_server/
├── app.py # Main Flask application
├── mcp_handler.py # MCP parsing and execution
├── mcp_example.py # Standalone MCP example
├── requirements.txt # Dependencies
├── tools/ # Tool implementations
│ ├── __init__.py
│ ├── weather.py # Weather API tool
│ └── calculator.py # Calculator tool
└── README.md # This file
安装
-
克隆仓库:
git clone https://github.com/yourusername/mcp-server.git cd mcp-server -
创建虚拟环境:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate -
安装依赖:
pip install -r requirements.txt -
设置环境变量:
# Create a .env file with: LLM_API_KEY=your_llm_api_key_here WEATHER_API_KEY=your_weather_api_key_here FLASK_APP=app.py FLASK_ENV=development
使用方法
运行服务
启动 Flask 开发服务:
flask run
用于生产环境:
gunicorn app:app
API 端点
- POST /chat:使用 MCP 处理聊天消息
curl -X POST http://localhost:5000/chat \ -H "Content-Type: application/json" \ -d '{ "messages": [ { "role": "user", "content": "What's the weather like in Boston?" } ] }'
独立示例
运行示例脚本,查看 MCP 的运行效果:
python mcp_example.py
工作原理
- 工具注册:注册工具及其参数和执行逻辑
- 注入工具定义:将 XML 格式的工具描述添加到提示词中
- 处理大模型响应:使用正则表达式模式识别大模型文本输出中的工具调用
- 工具执行:解析参数并传递给相应的工具处理程序
- 注入结果:将工具执行结果插入响应中
MCP 与函数调用的比较
| 特性 | MCP | 函数调用 |
|---|---|---|
| 定义位置 | 提示词文本中 | API 参数中 |
| 调用格式 | 自然语言 | 结构化 JSON |
| 实现方式 | 文本解析 | API 集成 |
| 可见性 | 在响应中可见 | 可能不可见 |
| 平台支持 | 任何基于文本的大模型 | 需要 API 支持 |
示例对话
用户:波士顿的天气怎么样?
大模型:
I'll check the weather for you.
get_weather(location="Boston, MA", unit="fahrenheit")
处理后:
I'll check the weather for you.
get_weather(location="Boston, MA", unit="fahrenheit")
Result from get_weather:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "Partly Cloudy",
"humidity": 68,
"wind_speed": 5.8
}
添加自定义工具
- 创建一个继承自
Tool的新类 - 定义参数和执行逻辑
- 向 MCP 处理程序注册该工具
示例:
class MyTool(Tool):
def __init__(self):
parameters = [
{
"name": "param1",
"type": "string",
"description": "Description of param1",
"required": True
}
]
super().__init__(
name="my_tool",
description="Description of my tool",
parameters=parameters
)
def execute(self, param1):
# Tool logic here
return {"result": "Processed " + param1}
MCP 配置和调用流程
-
工具注册:
- 向处理程序注册 MCP 工具
- 每个工具提供名称、描述和参数定义
-
注入工具定义:
- 将工具定义添加到系统消息中
- 格式遵循 MCP 的 XML 结构
-
处理大模型响应:
- 大模型生成的响应可能包含工具调用
- 通过模式匹配识别文本中的工具调用
- 解析工具参数并传递给工具执行方法
-
工具执行:
- 使用提供的参数执行工具
- 将结果注入对话
-
对话管理:
- 将包含工具结果的处理后响应添加到对话历史中
- 后续的大模型请求会将此历史记录作为上下文
示例对话
以下是对话可能呈现的示例:
用户:波士顿的天气怎么样?
系统:向 LLM 发送包含 MCP 工具定义的提示词
LLM 响应:
I'll check the weather for you.
get_weather(location="Boston, MA", unit="fahrenheit")
MCP 处理程序:解析响应,找到工具调用并执行天气工具
工具执行结果:
Result from get_weather:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "Partly Cloudy",
"humidity": 68,
"wind_speed": 5.8
}
处理后的响应(发送给用户):
I'll check the weather for you.
get_weather(location="Boston, MA", unit="fahrenheit")
Result from get_weather:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "Partly Cloudy",
"humidity": 68,
"wind_speed": 5.8
}
用户:你能计算 144 的平方根吗?
LLM 响应:
I can calculate that for you.
calculator(expression="sqrt(144)")
MCP 处理程序:解析响应并执行计算器工具
工具执行结果:
Result from calculator:
{
"expression": "sqrt(144)",
"result": 12.0
}
处理后的响应(发送给用户):
I can calculate that for you.
calculator(expression="sqrt(144)")
Result from calculator:
{
"expression": "sqrt(144)",
"result": 12.0
}
The square root of 144 is 12.
这展示了 MCP 工具使用的完整流程,从 LLM 基于文本的调用,到执行和响应处理。
许可证
MIT
贡献
欢迎贡献!请随时提交 Pull Request。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。