微信扫码
添加专属顾问
我要投稿
MCP协议:打破AI应用数据孤岛,实现无缝对接外部资源。核心内容:1. MCP协议的起源、定义及其标准化目标2. MCP如何简化AI应用与外部数据源的交互3. MCP与Function Calling的区别及其应用场景
MCP于2024年11月25日由Anthropic官方正式提出,在24年2月份cursor添加mcp功能支持的时候,才一下子被广大开发人员面前。3月份的时候,又看到各种推文,当时就想不就是一个协议么?你这个协议又没有经过各方的认可,无非就是在多了一层标准化。不同公司的标准又不一样,就是多写两行代码的事。随着阿里的入局,我才开始重视,然后国内很多公司都开始支持MCP了。
所以趁着五一假期好好的深入学习下。
MCP 是一个开放协议,它为应用程序向 LLM 提供上下文的方式进行了标准化。它设计出来的目标,主要是统一模型与外部数据源之间的协议,以解决大模型因数据孤岛限制而无法充分发挥潜力的难题。在这个统一标准下,应用端只要集成了MCP client,就没有了开发成本,通过配置可以调用任何已经发布的 mcp server。因此ai应用有了链接万物的。
而qwen3的发布,直接原生支持MCP。我们只要通过配置mcp server,提交给qwen3,就能调用对应的mcp 服务。见Qwen3 来了!全面超越 DeepSeek R1,原生支持 MCP最后的代码调用。而有了MCP以后,底层的各个api只需要将接口适配到MCP协议,我们在各个应用中引入一个MCP client 客户端就ok了,只需要对接一次。对于非开发人员还是非常友好的,解决了调用外部工具的技术门槛问题。
Function Calling
的区别
这里有必要说一下和Function Calling
的区别,两者都是为了增强大模型与外部数据的交互。但是MCP 不仅适用于大模型。
性质 |
功能接口 |
|
范围 |
通用 |
特定场景 |
目标 |
互操作 |
扩展模型 |
实现方式 |
协议驱动 |
API 参数functions 参数定义函数列表,模型在响应中返回调用指令 |
调用发起方 |
MCP Client |
LLM |
开发复杂度 |
中等 |
低 |
复用性 |
高 |
中 |
灵活性 |
高 |
有限 |
标准化程度 |
强 |
弱 |
典型场景示例 | - 企业级 Agent 平台多源数据接入 - 安全合规的资源订阅与实时更新 |
- 格式化计算函数(加减乘除) - 简单数据库查询辅助回答 |
整个工作流程如上图所示。
MCP Client
发送包含协议版本和能力的initialize
请求,给MCP Server
MCP Server
会返回支持的协议版本和能力MCP Client
会发送initialized
通知作为确认MCP Client
根据需求,构建请求消息,并把请求消息发送给MCP Server
MCP Server
接收到请求以后,解析请求消息,执行对应的操作,比如调用接口,读取文件,读取数据库等。MCP Server
将处理的结果,封装成响应消息,发送给MCP客户端MCP client
,他们发起链接。传输层支持多种传输机制,使用 JSON-RPC 2.0 格式。
Stdio
传输协议HTTP+SSE
传输协议MCP具有以下四种主要的消息类型
Request
: 需要对端返回结果的调用Result
成功响应 RequestError
请求失败时的错误码和信息Notification
单向消息,无需响应Resources 允许 MCP Server 将文件、数据库记录、API 响应、日志文件、图片等各种数据内容暴露给 Client,为 LLM 提供必要的上下文信息。
资源是 “application-controlled” 的,意味着 Client 决定何时、如何使用资源,包括用户手动选择或自动化策略。
按照定义,一共有两类资源:文本资源和二进制资源
resources/list
端点公开一系列具体资源,包含uri
, name
, description
, mimeType
。contents
的列表,每项可带 text
(文本)或 blob
(Base64 二进制)。notifications/resources/list_changed
,Client 可重新拉取最新列表。resources/subscribe
订阅某个 URI,Server 在内容变化时发送 notifications/resources/updated
,Client 再用 resources/read
获取更新后的内容;取消订阅则用 resources/unsubscribe
。在 MCP 中,Prompts 是服务器暴露给客户端的一组可复用的提示模板和工作流,用于统一、标准化与大型语言模型(LLM)的交互。服务器通过 prompts/list
和 prompts/get
两个 JSON-RPC 接口,向客户端公开可用的提示项(包括名称、描述和参数定义),客户端在用户触发时填充参数并向 LLM 发送生成请求。通过参数化、上下文嵌入和多步工作流,Prompts 实现了对复杂操作的封装与复用,并可在客户端以快捷命令、上下文菜单、表单等 UI 形式展现,大大提升了 LLM 应用的一致性与可用性。
客户端通过调用 prompts/list
,服务器返回所有可用 Prompt 的元数据列表。
// 请求
{
method:"prompts/list"
}
// 响应
{
prompts:[
{
name:"analyze-code",
description:"Analyze code for potential improvements",
arguments:[
{
name:"language",
description:"Programming language",
required:true
}
]
}
]
}
客户端调用 prompts/get
,传入 name
与对应的 arguments
,服务器返回用于 LLM messages
// 请求获取
{
method:"prompts/get",
params:{
name:"analyze-code",
arguments:{
language:"python"
}
}
}
// 服务器响应
{
description:"Analyze Python code for potential improvements",
messages:[
{
role:"user",
content:{
type:"text",
text:"Please analyze the following Python code for potential improvements:\n\n```python\ndef calculate_sum(numbers):\n total = 0\n for num in numbers:\n total = total + num\n return total\n\nresult = calculate_sum([1, 2, 3, 4, 5])\nprint(result)\n```"
}
}
]
}
MCP Server 能够将任意可执行操作封装为函数接口,供客户端发现与调用。
这里最后一步,没问题,qwen3内置mcp client,目前在模型没有支持mcp协议的时候,都是通过外部应用内置mcp client实现。
每个工具都使用下面的结构定义
{
name:"github_create_issue",
description:"Create a GitHub issue",
inputSchema:{
type:"object",
properties:{
title:{ type:"string"},
body:{ type:"string"},
labels:{ type:"array", items:{ type:"string"}}
}
}
}
在 MCP 中,Sampling 允许 Server 通过 Client 向 LLM 发起补全(completion)请求,形成一种“反向调用”模式,既能支持复杂的多步骤智能代理行为,又通过“人机在环”设计确保安全与隐私控制
通过Sampling 让整个流程可人为控制,通过交互式确认,让整个生成过程更可控。
Roots 是 MCP 中用于限定服务器可操作的上下文边界的机制。客户端在连接时以根 URI(如文件路径、HTTP API 地址等)告知服务器“关注哪些资源”,从而实现对资源范围的清晰划分与组织管理。
举个栗子:当我们开发代码的时候,我们使用一个MCP Server,用于读取项目文件,我们不可能让让MCP Server读取所有的文件,也不可能一个工程开发一个MCP Server,怎么办?我们开发MCP Server的时候,把工程路径给它,它只处理这个工程里的文件即可,这样就限定了边界。
当然MCP Server并不是只能处理当前目录下的文件,它可以处理任何目录,但是没有意义了。
虽然不是一个强制性约束,当时在开发的MCP Server的时候,建议遵循该约束。
我使用mysql_mcp_server
作为mcp server。
https://github.com/designcomputer/mysql_mcp_server
要求
uv
python>=3.11
mcp>=1.0.0
mysql-connector-python>=9.1.0
#macos或 linux安装,没有curl就用get
curl -LsSf https://astral.sh/uv/install.sh | sh
wget -qO- https://astral.sh/uv/install.sh | sh
# win安装
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# uv验证
uv -V
# 使用uv安装python3.11环境
uv python install 3.11
#创建mcp环境
uv venv mcp
# 激活环境
source mcp/bin/activate
# 验证环境
python -V
# 安装依赖
uv pip install mysql-mcp-server --index-url https://pypi.tuna.tsinghua.edu.cn/simple
1
设置,点击2
MCP 服务器,点击3
添加服务器。官方给了一个claude
和visual studio code
两个配置方案。我参考了vs
的配置
{
"mcpServers":{
"mysql":{
"type":"stdio",
"command":"uvx",
"args":[
"--from",
"mysql-mcp-server",
"mysql_mcp_server"
],
"env":{
"MYSQL_HOST":"localhost",
"MYSQL_PORT":"3306",
"MYSQL_USER":"root",
"MYSQL_PASSWORD":"123456",
"MYSQL_DATABASE":"admin"
}
}
}
}
注意官方写的是
servers
,其实应该写mcpServers
,将对应的配置填写进去
4
参数那里,两个mysql-mcp-server
少一个都不行。通过6
可以看该mcp提供了哪些工具,通过7
可以看该mcp提供了哪些资源。cherry studio
获取连接的mysql的所有资源。这个时候它会调用mcp的工具执行Show databases
,每个模型的能力不一样,最后执行的sql不一样。在测试的过程中cline的效果最好,而且支持你修改交互内容。附上cline的配置。
1
切换模型服务,点击2
选择模型供应商,然后根据自己的需求配置。远程调用,基于http协议,我们可以在请求mcp server之前,先获取一个access_token
,然后把access_token
作为交互的凭证,等退出以后清空,访问的时候,动态续期。后端可以设置过期时间。
cline
消耗的tokens是最多的,基本上一个任务10万左右的tokens,但是效果是真的不错。Cherry Studio
消耗的比较少,但是功能比较简单。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-05-14
微软最新研究:LLM在多轮任务中的性能瓶颈,过早尝试、回答膨胀与中间信息遗忘
2025-05-14
Qwen3技术报告的几点细节、ArXiv论文翻译实现方案及试错历程
2025-05-14
Manus免费开放注册,掀桌中美AI战场:国产智能体竞逐海外,美国财政审查升级
2025-05-14
MCP:AI与工具的完美协作,效率提升N倍!
2025-05-14
高搜商给 AI 应用带来新方向
2025-05-13
重磅!腾讯首发国产 Cursor,CodeBuddy 一键生成小程序
2025-05-13
50页ppt,一起梳理AI Agent的关键技术发展
2025-05-13
面对MCP"工具投毒",我们该如何应对
2024-08-13
2024-06-13
2024-08-21
2024-09-23
2024-07-31
2024-05-28
2024-08-04
2024-04-26
2024-07-09
2024-09-17
2025-05-13
2025-05-13
2025-05-12
2025-05-11
2025-05-09
2025-05-08
2025-05-07
2025-04-30