MCP Server

MCP Server

一个基于 Flask 的服务器,实现了模型上下文协议(Model Context Protocol),通过自然语言增强大型语言模型(LLM)的外部工具能力,从而允许像天气查询和计算等工具直接在模型的文本输出中被调用。

Category
访问服务器

README

MCP 服务器实现

这是一个基于 Flask 的完整模型上下文协议 (MCP) 实现,旨在通过外部工具增强大型语言模型的能力。

概述

本仓库演示了如何构建一个处理模型上下文协议 (MCP) 的服务器。MCP 是一种通过直接在模型的文本输出中调用工具来扩展 LLM 能力的方法。与函数调用不同,MCP 将工具定义直接放置在上下文窗口中,并解析模型的自然语言响应以识别工具的使用。

特性

  • 🔧 完整的 MCP 实现: 完整的解析、执行和响应处理
  • 🌤️ 示例工具: 带有参数验证的天气和计算器工具
  • 🔄 对话流程: 跨多个交互维护上下文
  • 🧩 基于正则表达式的解析: 灵活的文本解析,用于工具调用
  • 🚀 Flask API: 用于聊天集成的 REST API 端点

项目结构

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               # 本文件

安装

  1. 克隆仓库:

    git clone https://github.com/yourusername/mcp-server.git
    cd mcp-server
    
  2. 创建一个虚拟环境:

    python -m venv venv
    source venv/bin/activate  # 在 Windows 上: venv\Scripts\activate
    
  3. 安装依赖项:

    pip install -r requirements.txt
    
  4. 设置环境变量:

    # 创建一个 .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

API 端点

  • POST /chat: 处理带有 MCP 的聊天消息
    curl -X POST http://localhost:5000/chat \
      -H "Content-Type: application/json" \
      -d '{
        "messages": [
          {
            "role": "user",
            "content": "波士顿的天气怎么样?"
          }
        ]
      }'
    

独立示例

运行示例脚本以查看 MCP 的实际效果:

python mcp_example.py

工作原理

  1. 工具注册: 工具及其参数和执行逻辑一起注册
  2. 工具定义注入: XML 格式的工具描述被添加到提示中
  3. LLM 响应处理: 正则表达式模式识别 LLM 文本输出中的工具调用
  4. 工具执行: 参数被解析并传递给适当的工具处理程序
  5. 结果注入: 工具执行结果被插入回响应中

MCP vs. 函数调用

特性 MCP 函数调用
定义位置 在提示文本中 在 API 参数中
调用格式 自然语言 结构化 JSON
实现 文本解析 API 集成
可见性 在响应中可见 可能隐藏
平台支持 任何基于文本的 LLM 需要 API 支持

示例对话

用户: 波士顿的天气怎么样?

LLM:

我将为您查询波士顿的天气。

get_weather(location="Boston, MA", unit="fahrenheit")

处理后:

我将为您查询波士顿的天气。

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
}

添加您自己的工具

  1. 创建一个继承自 Tool 的新类
  2. 定义参数和执行逻辑
  3. 向 MCP 处理程序注册

示例:

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}

MCP 配置和调用流程

  1. 工具注册:

    • MCP 工具已向处理程序注册
    • 每个工具都提供其名称、描述和参数定义
  2. 工具定义注入:

    • 工具定义已添加到系统消息中
    • 格式遵循 MCP 的 XML 结构
  3. LLM 响应处理:

    • LLM 生成可能包含工具调用的响应
    • 模式匹配识别文本中的工具调用
    • 工具参数被解析并传递给工具执行方法
  4. 工具执行:

    • 使用提供的参数执行工具
    • 结果被注入回对话中
  5. 对话管理:

    • 带有工具结果的处理后的响应已添加到对话历史记录中
    • 未来的 LLM 请求包括此历史记录以获取上下文

示例对话

这是一个对话可能是什么样子的示例:

用户: 波士顿的天气怎么样?

系统: 将带有 MCP 工具定义的提示发送到 LLM

LLM 响应:

我将为您查询波士顿的天气。

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
}

处理后的响应 (发送回用户):

我将为您查询波士顿的天气。

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 响应:

我可以为您计算。

calculator(expression="sqrt(144)")

MCP 处理程序: 解析响应,执行计算器工具

工具执行结果:

Result from calculator:
{
  "expression": "sqrt(144)",
  "result": 12.0
}

处理后的响应 (发送回用户):

我可以为您计算。

calculator(expression="sqrt(144)")

Result from calculator:
{
  "expression": "sqrt(144)",
  "result": 12.0
}

144 的平方根是 12。

这演示了 MCP 工具使用的完整流程,从 LLM 基于文本的调用到执行和响应处理。

许可证

MIT

贡献

欢迎贡献!请随时提交 Pull Request。

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选