MCP 从入门到实战:让大模型真正「动手」
本文基于个人学习与实践整理,面向希望在 Cherry Studio、Cursor 等客户端中使用 MCP 的读者。
重点讲清 协议是什么、模型如何决定调用哪个工具,并附带一个可直接接入 Cherry Studio 的 Python 示例。
目录
- 为什么需要 MCP
- 三个核心角色:Host、Server、Tool
- 一次完整对话里发生了什么
- AI 如何「听懂」你的问题并选对工具
- MCP 协议分两层,别混在一起
- 在 Cherry Studio 里接入 MCP
- 动手:用 Python 写一个标准 MCP 工具服务
1. 为什么需要 MCP
大语言模型擅长理解和生成文字,但默认情况下它:
- 不能直接读你电脑上的文件;
- 不能实时查天气、股价、新闻;
- 不能替你执行搜索、发邮件、操作数据库。
过去每一家 AI 产品都要单独对接每一种能力,接口五花八门,开发和维护成本都很高。
MCP(Model Context Protocol,模型上下文协议) 由 Anthropic 在 2024 年底提出,目标很简单:用一套统一规范,让「AI 客户端」和「外部能力程序」对话。
你可以把它理解成:
| 类比 | 含义 |
|---|---|
| USB 接口 | 不同设备(键盘、U 盘)只要符合标准,就能插到电脑上 |
| MCP | 不同工具(查时间、读文件、调 API)只要实现 MCP Server,就能被各种 Host 调用 |
对使用者来说:在客户端里配置好 MCP Server 后,用自然语言提问,模型会在需要时自动选用合适的工具,再把结果组织成回答。
2. 三个核心角色:Host、Server、Tool
2.1 MCP Host(宿主 / 客户端)
Host 是你日常打交道的 AI 应用,负责:
- 启动、管理 MCP Server 进程;
- 把用户问题和「当前有哪些工具」一起交给大模型;
- 按模型的指示去调用 Server,并把结果再喂回模型。
常见 Host:Cherry Studio、Cursor、Claude Desktop 等。本文以 Cherry Studio 为例演示配置与使用。
2.2 MCP Server(能力提供方)
Server 是一个按 MCP 规范运行的程序,名字里虽有 “Server”,但多数是 在你本机通过子进程启动 的(例如 Python / Node 脚本),而不是必须部署在远程机房。
它向 Host 声明:
- 有哪些 Tool(可执行函数);
- 可选的 Resource(可读数据);
- 可选的 Prompt(预设提示模板)。
2.3 Tool(工具)
Tool 就是 Server 暴露给模型的一条「可调用能力」,在代码里通常对应一个带类型注解的函数。
每个 Tool 会带有:
- name:工具名,如
get_cpu_status; - description:自然语言说明(常来自函数的 docstring);
- inputSchema:参数的 JSON Schema,约束模型填什么字段。
模型靠 description + inputSchema 判断「该不该用、参数怎么填」。
3. 一次完整对话里发生了什么
下面用「用户问:我电脑现在卡不卡?内存占用多少?」且已接入系统性能 MCP 为例,说明数据流:

4. AI 如何「听懂」你的问题并选对工具
很多人以为 MCP 规定了「模型怎么思考」。实际上:MCP 只规范 Host 与 Server 之间怎么通信;模型与 Host 之间用什么格式(Function Calling、XML 工具块等),由各家客户端自己实现。
但对使用者,理解下面这条链路就够了。
4.1 Host 在每次请求里多塞了什么
当你开启 MCP 并选中某个 Server 后,Host 大致会做:
- 把
tools/list拿到的信息,转成模型能识别的 工具定义列表(名称、描述、参数 schema); - 把你的 用户消息 和这段工具定义 一起发送 给大模型 API;
- 若模型返回「需要调用某工具 + JSON 参数」,Host 去执行
tools/call,再把结果作为 工具结果消息 追加到对话,再次请求模型 生成最终回复。
所以:模型并不是事先“安装”了 MCP,而是在每一轮里看到「当前会话可用工具说明书」,再自己做选择。
4.2 模型靠什么做决策
模型主要依据三类信号:
| 信号 | 作用 |
|---|---|
| 用户意图 | 「内存占用多少」→ 内存类;「C 盘还剩多少」→ 磁盘类 |
Tool 的 description |
说明这个函数解决什么问题,避免误用 |
inputSchema |
规定参数名、类型、是否必填,模型从中 抽取或推断 参数值 |
例如工具描述写「查询物理内存占用」,用户说「我电脑内存还剩多少」,模型更可能调用 get_memory_status。
4.3 为什么有时不调用、有时乱调用
不调用 常见原因:
- 模型认为凭自身知识就能答(历史常识类问题);
- 没有启用 MCP,或对话里未勾选对应 Server;
- 所用模型 不支持工具调用 / Function Calling(Cherry Studio 里应选带「工具」能力的模型)。
乱调用 常见原因:
- Tool 描述过于笼统,多个工具边界不清;
- 参数 schema 太宽,缺少
required或枚举约束; - 用户问题模糊,模型做了猜测。
改进建议:函数名见名知意、docstring 写清「何时使用、返回什么」、参数用类型注解和枚举缩小空间。
4.4 和「RAG / 联网搜索」的区别
- RAG:先检索文档片段,再让模型阅读总结;
- MCP Tool:模型主动发起一次 结构化函数调用,由 Server 执行逻辑(算数、查 API、读本地文件等)。
二者可以并存:MCP 解决的是 标准化、可执行、可组合 的外部能力接口。
5. MCP 协议分两层,别混在一起
| 层级 | 谁和谁 | 规范什么 |
|---|---|---|
| 层 A | MCP Host ↔ MCP Server | 握手、列工具、调工具、传资源等(JSON-RPC 风格消息,常见传输为 stdio 或 SSE) |
| 层 B | MCP Host ↔ 大模型 API | 如何把工具清单编进 prompt、如何解析模型的 tool_call(各 Host 实现不同) |
MCP 只管层 A。 这也是为什么同一个 Python MCP Server,可以接到 Cherry Studio、Cursor 等不同 Host——只要对方实现了 MCP 客户端逻辑。
Model Context Protocol 里的 Context,指的是:让模型感知「外部环境里有哪些可调用能力」,从而获取实时、私有或结构化信息,而不是只靠训练数据。
6. 在 Cherry Studio 里接入 MCP
6.1 环境准备
Cherry Studio 运行 STDIO 类 MCP 时,通常需要本机有:
- Python 3.10+(自建 Server 用);
- uv(推荐,用于跑 Python 项目);
- 使用社区现成的 uvx / npx 工具时,按官方文档在 Cherry Studio 设置里安装内置运行环境。
6.2 添加社区 Server(示例:网页抓取)
- 打开 设置 → MCP Server → 添加服务器;
- 名称自定,类型选 STDIO;
- 命令填
uvx,参数填mcp-server-fetch(首次会下载依赖,可能较慢); - 保存后在对话界面 启用该 MCP,并选择支持工具调用的模型。
等价 JSON 片段:
{
"mcpServers": {
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
}
6.3 添加本文自带的 Python Server(下文第 7 节)
工作区已附带可运行项目:mcp-sys-monitor/。先在该目录执行 uv sync,再在 Cherry Studio 新增 STDIO 服务器:
{
"mcpServers": {
"sys-monitor": {
"description": "查询本机 CPU、内存、磁盘、网络、GPU 性能",
"isActive": true,
"command": "uv",
"args": [
"--directory",
"C:/Users/25700/Desktop/test/mcp-sys-monitor",
"run",
"server.py"
]
}
}
}
请将 --directory 后的路径改成你本机 mcp-sys-monitor 的实际位置(Windows 建议用正斜杠 /)。
保存后连接成功,在对话里勾选 sys-monitor,并选择支持工具调用的模型即可试用。
6.4 话术建议
- 「帮我看一下电脑现在的整体性能状态」
- 「CPU 占用多少?频率多少?」
- 「内存还剩多少?有没有快满了?」
- 「C 盘和 D 盘各用了百分之几?」
- 「现在网速怎么样?」


7. 动手:用 Python 写一个标准 MCP 工具服务
Cherry Studio 本身不会把「任务管理器里的实时性能数据」直接交给大模型。下面这个 mcp-sys-monitor 就是一个有明确价值的例子:让 AI 能查询你这台电脑当前的 CPU、内存、磁盘、网络和 GPU 状态——类似你截图里 Windows 任务管理器的「性能」页。
7.1 这个 Server 提供什么
| 工具 | 对应任务管理器 | 用途 |
|---|---|---|
get_system_overview |
性能页总览 | 一次返回 CPU / 内存 / 磁盘 / 网络 / GPU 摘要 |
get_cpu_status |
CPU 卡片 | 利用率、核心数、运行频率 |
get_memory_status |
内存卡片 | 已用 / 总量 / 可用、页面文件 |
get_disk_status |
磁盘卡片 | 各分区占用、短时读写速度 |
get_network_status |
网络卡片 | 各网卡实时收发速率 |
get_gpu_status |
GPU 卡片 | 显卡名称;NVIDIA 独显可读利用率与显存 |
底层用 psutil 采集跨平台指标;Windows 下额外通过 WMI 补充内存频率等信息,有 nvidia-smi 时读取独显占用。
7.2 设计上的三个「标准写法」
① 按指标拆工具,同时提供总览
用户问「内存多少」时,模型应调 get_memory_status;问「电脑卡不卡」时,调 get_system_overview。粒度清晰,避免一个巨型函数难以选择。
② docstring 写清触发场景
@mcp.tool()
def get_memory_status() -> str:
"""查询物理内存与交换区占用情况。
当用户问内存用了多少、还剩多少、内存占用率时使用。
Windows 下会尽量补充内存频率、插槽等信息。
"""
③ 采样型指标要注明等待时间
CPU 利用率、网速需要两次采样相减。在 docstring 里说明「约 0.6 秒采样」,用户和模型才知道结果有短暂延迟,这是正常现象。
7.3 项目结构
mcp-sys-monitor/
├── pyproject.toml
└── server.py
7.4 pyproject.toml
[project]
name = "mcp-sys-monitor"
version = "0.1.0"
description = "查询本机 CPU、内存、磁盘、网络、GPU 性能的 MCP 服务"
requires-python = ">=3.10"
dependencies = [
"mcp[cli]>=1.6.0",
"psutil>=6.0.0",
]
[project.scripts]
mcp-sys-monitor = "server:main"
7.5 核心代码摘录
总览工具(组合多个采集函数):
@mcp.tool()
def get_system_overview() -> str:
"""获取本机性能总览,类似任务管理器「性能」页。
当用户问「电脑现在什么状态」「性能怎么样」「卡不卡」时使用。
一次返回 CPU、内存、磁盘、网络、GPU 的摘要。
"""
sections = [
("【CPU】", _cpu_block()),
("【内存】", _memory_block()),
("【磁盘】", _disk_block()),
("【网络】", _network_block()),
("【GPU】", _collect_gpu_info()),
]
# 拼接为可读文本返回给模型
...
CPU 采样(psutil 需短暂 interval 才准确):
def _cpu_block(interval: float = 0.6) -> list[str]:
usage = psutil.cpu_percent(interval=interval)
freq = psutil.cpu_freq()
lines = [
f"总利用率:{usage:.1f}%",
f"物理核心:{psutil.cpu_count(logical=False)} | "
f"逻辑核心:{psutil.cpu_count(logical=True)}",
]
if freq and freq.current:
lines.append(f"当前频率:{freq.current:.2f} GHz")
return lines
网速(两次采样求速率):
def _network_block() -> list[str]:
net1 = psutil.net_io_counters(pernic=True)
time.sleep(0.6)
net2 = psutil.net_io_counters(pernic=True)
for nic, c2 in net2.items():
down = (c2.bytes_recv - net1[nic].bytes_recv) / 0.6
up = (c2.bytes_sent - net1[nic].bytes_sent) / 0.6
# 格式化为 KB/s、MB/s 返回
...
7.6 本地运行
cd mcp-sys-monitor
uv sync
uv run server.py
也可在终端快速验证(不经过 MCP 协议):
uv run python -c "import server; print(server.get_system_overview())"
7.7 写好 MCP 工具的检查清单
- 一事一工具:总览 + 分项查询,方便模型精准调用;
- 返回人类可读文本:模型直接转述给用户,比裸 JSON 更自然;
- 注明采样耗时:实时指标有延迟,要在描述里说清楚;
- 平台差异做降级:GPU 读不到利用率时仍返回显卡名称,不直接崩溃;
- stdio 干净:
log_level="ERROR",不要用print污染协议通道。
小结
| 要点 | 一句话 |
|---|---|
| MCP 是什么 | AI 客户端与外部能力程序之间的统一对话协议 |
| 谁调用谁 | Host 管模型和 Server;模型 决策,Host 执行 |
| 模型怎么选对工具 | 靠工具描述 + JSON Schema + 用户问题,在支持 tool calling 的 API 里完成 |
| 怎么落地 | Cherry Studio 配置 mcp-sys-monitor,对话里问「电脑性能怎么样」即可 |
掌握 Host / Server / Tool 与 「发现 → 决策 → 执行 → 总结」 四步,再做一个 Cherry Studio 本身做不到、但 MCP 很擅长 的扩展(如本机性能监控),你就能真正理解 MCP 的价值。