基于Flask的Model Context Protocol (MCP) 完整实现,用于通过外部工具增强大型语言模型的能力。
此仓库展示了如何构建一个处理Model Context Protocol (MCP) 的服务器,这是一种通过在模型文本输出中直接调用工具来扩展LLM能力的方法。与函数调用不同,MCP将工具定义直接放置在上下文窗口中,并解析模型的自然语言响应以识别工具使用情况。
mcp_server/
├── app.py # 主Flask应用程序
├── mcp_handler.py # MCP解析和执行
├── mcp_example.py # 独立的MCP示例
├── requirements.txt # 依赖项
├── tools/ # 工具实现
│ ├── __init__.py
│ ├── weather.py # 天气API工具
│ └── calculator.py # 计算器工具
└── README.md # 此文件
克隆仓库:
git clone https://github.com/yourusername/mcp-server.git
cd mcp-server
创建虚拟环境:
python -m venv venv
source venv/bin/activate # 在Windows上:venv\Scripts\activate
安装依赖项:
pip install -r requirements.txt
设置环境变量:
# 创建一个.env文件,内容如下:
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
curl -X POST http://localhost:5000/chat \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"role": "user",
"content": "波士顿的天气怎么样?"
}
]
}'
运行示例脚本以查看MCP的实际操作:
python mcp_example.py
| 功能 | MCP | 函数调用 |
|---|---|---|
| 定义位置 | 在提示文本中 | 在API参数中 |
| 调用格式 | 自然语言 | 结构化JSON |
| 实现方式 | 文本解析 | API集成 |
| 可见性 | 在响应中可见 | 可能隐藏 |
| 平台支持 | 任何基于文本的LLM | 需要API支持 |
用户:波士顿的天气怎么样?
LLM:
我将为您查询天气。
get_weather(location="Boston, MA", unit="fahrenheit")
处理后:
我将为您查询天气。
get_weather(location="Boston, MA", unit="fahrenheit")
get_weather的结果:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "部分多云",
"humidity": 68,
"wind_speed": 5.8
}
Tool的类示例:
class MyTool(Tool):
def __init__(self):
parameters = [
{
"name": "param1",
"type": "string",
"description": "param1的描述",
"required": True
}
]
super().__init__(
name="my_tool",
description="我的工具的描述",
parameters=parameters
)
def execute(self, param1):
# 工具逻辑在此处
return {"result": "处理了 " + param1}
工具注册:
工具定义注入:
LLM响应处理:
工具执行:
对话管理:
这里是一个对话示例:
用户:波士顿的天气怎么样?
系统:向LLM发送包含MCP工具定义的提示
LLM响应:
我将为您查询天气。
get_weather(location="Boston, MA", unit="fahrenheit")
MCP处理器:解析响应,找到工具调用并执行天气工具
工具执行结果:
get_weather的结果:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "部分多云",
"humidity": 68,
"wind_speed": 5.8
}
处理后的响应(发送给用户):
我将为您查询天气。
get_weather(location="Boston, MA", unit="fahrenheit")
get_weather的结果:
{
"location": "Boston, MA",
"temperature": 72,
"unit": "fahrenheit",
"conditions": "部分多云",
"humidity": 68,
"wind_speed": 5.8
}
用户:你能计算一下144的平方根吗?
LLM响应:
我可以为您计算这个。
calculator(expression="sqrt(144)")
MCP处理器:解析响应,执行计算器工具
工具执行结果:
calculator的结果:
{
"expression": "sqrt(144)",
"result": 12.0
}
处理后的响应(发送给用户):
我可以为您计算这个。
calculator(expression="sqrt(144)")
calculator的结果:
{
"expression": "sqrt(144)",
"result": 12.0
}
144的平方根是12。
这展示了MCP工具使用的完整流程,从LLM的文本调用到执行和响应处理。
MIT
欢迎贡献!请随时提交Pull Request。