侧边栏壁纸
  • 累计撰写 290 篇文章
  • 累计创建 142 个标签
  • 累计收到 19 条评论

目 录CONTENT

文章目录

Learning AI - MCP

Sherlock
2025-04-22 / 0 评论 / 0 点赞 / 152 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.MCP介绍

Model Context Protocol (MCP)

MCP 是一个开放协议(Anthropic 提出的新一代标准化协议),它为应用程序向 LLM 提供上下文的方式进行了标准化(被喻为:AI 世界的 “USB 协议”)。

你可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化的方式一样,MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口。

用于工具和资源通过结构化输入/输出将代理连接到工具、API 和资源。

先读:一文带你弄懂 MCP 的核心原理

MCP 架构中的关键参与者包括:

  • MCP 宿主 (Host):协调和管理一个或多个 MCP 客户端的 AI 应用
  • MCP 客户端 (Client):维持与 MCP 服务端连接并获取上下文供 MCP 宿主使用的组件
  • MCP 服务端 (Server):为 MCP 客户端提供上下文的程序

例如:Visual Studio Code 充当 MCP 宿主。
当 Visual Studio Code 建立与 MCP 服务端(如 Sentry MCP 服务端)的连接时,Visual Studio Code 运行时会实例化一个 MCP 客户端对象来维持该连接。当 Visual Studio Code 随后连接到另一个 MCP 服务端(如本地文件系统服务端)时,它会实例化另一个 MCP 客户端对象来维持此连接。

请注意,MCP 服务端是指提供上下文数据的程序,无论其运行在何处。MCP 服务端可以在本地或远程执行。


数据层实现了一个基于 JSON-RPC 2.0 的交互协议,定义了消息结构和语义。

1.0 工作原理

当您提交查询时

  • 1、客户端从服务器获取可用工具列表
  • 2、您的查询连同工具描述一起发送给 LLM
  • 3、LLM 决定使用哪些工具(如果有)
  • 4、客户端通过服务器执行任何请求的工具调用
  • 5、结果被发回给 LLM
  • 6、LLM 提供自然语言响应
  • 7、响应将显示给您

1.1 Agent 工具:

Agent工具.jpg

1.2 Agent之MCP接口

最常用的几个接口:

  • 1.initialize 初始化
  • 2.tools/list 获取工具列表
  • 3.tools/call 调用具体工具
  • 4.notifications/initialized 初始化完成通知 Agent之MCP接口.jpg

主要接口:

分类方法名方向核心用途
基础initializeC→S连接初始化、能力协商
initializedS→C初始化完成通知
ping双向心跳
shutdownC→S关闭连接
工具tools/listC→S获取工具列表
tools/callC→S执行工具
资源resources/listC→S获取资源列表
resources/readC→S读取资源
resources/subscribeC→S订阅资源
提示prompts/listC→S获取提示列表
prompts/getC→S获取提示模板
通知tools/listChangedS→C工具列表变更
resources/listChangedS→C资源列表变更
prompts/listChangedS→C提示列表变更Model Context Protocol (MCP)
  • 命名规范:所有方法采用 namespace/action 格式(如 tools/call),避免冲突。
  • 能力声明:服务端在 initialize 响应中声明支持哪些模块(tools/resources/prompts)。
  • 扩展性:协议允许自定义扩展,但核心接口必须严格遵循以保证兼容性。

1.3 Agent调用MCP流程

Agent调用MCP流程.jpg

2.MCP 与 Function Call

这两个都是AI 调用外部能力的技术,但设计目标、架构、调用责任、使用场景完全不同。

Agent之MCP和FunctionCall1.jpg Agent之MCP和FunctionCall2.jpg
对比项Function Call(函数调用)MCP(Model Control Protocol,模型控制协议)
核心定位AI 调用单个本地 / 后端函数 / 工具的轻量方案AI 统一调用各类外部系统、工具、设备标准化协议
架构形态简单的「函数接口」类似 LSP(语言服务协议)的通用通信标准
调用责任AI 决定调用 + 后端 / 客户端执行AI 下发指令 + MCP 客户端 / 服务端统一执行
复杂度轻量、无标准、各家自己实现标准化、可跨语言 / 跨进程 / 跨设备
适用场景简单工具:查天气、查数据库、算数学复杂生态:控制 IDE、浏览器、硬件、多工具串联
  • Function Call 是轻量工具调用,AI 决策,开发者执行,适合简单功能
  • MCP 是 AI 控制外部系统的通用标准协议,AI 发指令,MCP 服务端执行,适合复杂自动化
    总之,无论MCP还是Function Call,大模型都无法直接调用。

2.1 Function Call(函数调用)

一句话:AI 只动嘴,你负责跑腿。
典型场景:查天气、查询订单、计算器等

大模型最基础的工具调用能力:
AI 判断 “我需要外部数据 / 能力” → 输出函数名 + 参数 → 外部程序执行 → 把结果返回给 AI。

它不是标准协议,只是 OpenAI 率先提出的一种AI 交互模式,各家大模型都模仿实现。

2.2 MCP(Model Control Protocol)

它解决 Function Call 的痛点:

  • 无统一标准,每家模型工具调用格式不一样
  • 跨设备、跨进程调用麻烦
  • 安全、权限不可控

MCP 是三层架构,责任更清晰:

  • 大模型(AI):只发控制指令(做什么)
  • MCP 客户端:AI 侧的代理,解析指令
  • MCP 服务端:运行在外部系统(IDE、浏览器、硬件),真正执行操作

最终执行方:MCP 服务端(标准化执行)。AI 不用关心底层怎么实现,只按 MCP 协议发指令即可。

典型场景

  • AI 操控 IDE 写代码(Cursor、Windsurf 就是 MCP)
  • AI 控制浏览器自动化
  • AI 操作本地软件、硬件设备
  • 多工具、多系统串联的复杂自动化

3.MCP 与 SKILL

Agent之MCP和SKILL.jpg

4.工具 VS Agent

  • 工具是具有结构化输入和输出以及(通常)已知行为的基元。
  • 代理是自治应用程序,可以通过使用工具、推理和用户交互来完成新任务。

    代理应用程序必须同时使用工具和代理来实现其用户的目标。


4.1 Agent2Agent

from google,建议将 MCP 用于工具,将 A2A 用于代理。
Agent2Agent.png
AgenticApplications.png

A2A (Agent2Agent 协议) 用于代理 - 代理协作不同代理之间动态、多模式通信,无需共享内存、资源和工具。

模型上下文协议 (MCP) 是将 LLM 与数据、资源和工具连接起来的新兴标准。我们已经观察到 MCP 在不同模型和框架中标准化了“函数调用”。

这正在创建一个由工具服务提供商组成的生态系统,并大大降低了将代理与工具和数据连接起来的复杂性。我们预计,随着越来越多的框架、服务提供商和平台采用 MCP,这一趋势将继续下去。

A2A 专注于一个不同的问题。A2A 是一种应用程序级协议,使代理能够在其自然模式中进行协作。

它允许代理以代理(或用户)而不是工具的身份进行通信。我们希望 A2A 作为 MCP 的补充获得采用,从而支持代理生态系统,并将与社区公开合作以实现这一目标。

5.本地部署 MySQL MCP Server

先给本地 Cherry Studio 使用,后续Dify支持了之后,再折腾Dify版本的。

5.1 安装 MCP 服务

# 创建 mcp server 目录
mkdir /Users/sherlock/dev/mcp_servers/

# 下载 MySQL MCP Server 代码
## 注意:Requires: Python >=3.11
git clone https://github.com/designcomputer/mysql_mcp_server.git

# 可能需要升级下 pip 版本
pip3 install --upgrade pip

# 本地mac的python版本太低了,先安装下python 3.11版本
brew update
brew install xz
brew install python@3.11

# 进入 MySQL MCP Server 目录,安装依赖
cd mysql_mcp_server
pip3.11 install -r requirements.txt

# 安装 uv
pip install uv
uv --version
where uv

# 安装qwen2.5模型,在CherryStudio中添加,并设置模型类型为 工具
ollama run qwen2.5

5.2 配置 Cherry Studio

配置的MCP Json如下

{
  "mcpServers": {
    "mysql_mcp": {
      "name": "MySQL MCP 服务器",
      "description": "",
      "isActive": true,
      "registryUrl": "https://pypi.tuna.tsinghua.edu.cn/simple",
      "command": "/opt/homebrew/bin/uv",
      "args": [
        "--directory",
        "/Users/sherlock/dev/mcp_servers/mysql_mcp_server",
        "run",
        "mysql_mcp_server"
      ],
      "env": {
        "MYSQL_HOST": "xxx",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "root",
        "MYSQL_PASSWORD": "xxx",
        "MYSQL_DATABASE": "cnarea"
      },
      "disabledTools": []
    }
  }
}

5.3 新建聊天助手

选择qwen2.5模型,并在对话框中开启 MCP 选中 MySQL MCP Server

5.4 配置提示词

你是一个查询助手,可以通过MCP Server连接mysql服务查询数据。

数据库中有一张中国行政区划表,表名为cnarea_2023,表为父子关系表,特点如下:
1、每个记录(行)可以有一个父记录。
2、根节点(没有父记录的记录)被称为顶级节点即省级区划节点。
3、多个记录可以共享同一个父记录。

字段说明:
1、行政地区名称字段是name
2、行政代码字段是code
3、父级行政代码字段是parent_code

创建表的语句如下:
CREATE TABLE `cnarea_2023` (
  `id` mediumint unsigned NOT NULL AUTO_INCREMENT,
  `level` tinyint unsigned NOT NULL COMMENT '层级',
  `parent_code` bigint unsigned NOT NULL DEFAULT '0' COMMENT '父级行政代码',
  `area_code` bigint unsigned NOT NULL DEFAULT '0' COMMENT '行政代码',
  `zip_code` mediumint(6) unsigned zerofill NOT NULL DEFAULT '000000' COMMENT '邮政编码',
  `city_code` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '区号',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '名称',
  `short_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '简称',
  `merger_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '组合名',
  `pinyin` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '拼音',
  `lng` decimal(10,6) NOT NULL DEFAULT '0.000000' COMMENT '经度',
  `lat` decimal(10,6) NOT NULL DEFAULT '0.000000' COMMENT '纬度',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_code` (`area_code`) USING BTREE,
  KEY `idx_parent_code` (`parent_code`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=743299 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='中国行政地区表';

5.5 测试效果

可以直接提问了,例如:

东莞市下面只有镇没有区吗?

参考:https://www.panziye.com/ai/16004.html
https://docs.cherry-ai.com/advanced-basic/mcp/config
https://github.com/designcomputer/mysql_mcp_server
https://pypi.org/project/mysql-mcp-server/

0
AI
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区