MCP Server Implementation

MCP Server Implementation

镜子 (jìng zi)

MCP-Mirror

开发者工具
访问服务器

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。

推荐服务器

Playwright MCP Server

Playwright MCP Server

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

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

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

官方
精选
本地
TypeScript
MCP Package Docs Server

MCP Package Docs Server

促进大型语言模型高效访问和获取 Go、Python 和 NPM 包的结构化文档,通过多语言支持和性能优化来增强软件开发。

精选
本地
TypeScript
Claude Code MCP

Claude Code MCP

一个实现了 Claude Code 作为模型上下文协议(Model Context Protocol, MCP)服务器的方案,它可以通过标准化的 MCP 接口来使用 Claude 的软件工程能力(代码生成、编辑、审查和文件操作)。

精选
本地
JavaScript
@kazuph/mcp-taskmanager

@kazuph/mcp-taskmanager

用于任务管理的模型上下文协议服务器。它允许 Claude Desktop(或任何 MCP 客户端)在基于队列的系统中管理和执行任务。

精选
本地
JavaScript
mermaid-mcp-server

mermaid-mcp-server

一个模型上下文协议 (MCP) 服务器,用于将 Mermaid 图表转换为 PNG 图像。

精选
JavaScript
Jira-Context-MCP

Jira-Context-MCP

MCP 服务器向 AI 编码助手(如 Cursor)提供 Jira 工单信息。

精选
TypeScript
Linear MCP Server

Linear MCP Server

一个模型上下文协议(Model Context Protocol)服务器,它与 Linear 的问题跟踪系统集成,允许大型语言模型(LLM)通过自然语言交互来创建、更新、搜索和评论 Linear 问题。

精选
JavaScript
Sequential Thinking MCP Server

Sequential Thinking MCP Server

这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。

精选
Python
Curri MCP Server

Curri MCP Server

通过管理文本笔记、提供笔记创建工具以及使用结构化提示生成摘要,从而实现与 Curri API 的交互。

官方
本地
JavaScript