MCP 实战指南
学习链接


MCP?
MCP (Model Context Protocol, 模型上下文协议),2024 年 11 月底, 由 Anthropic 推出的一种开放标准。旨在为大语言模型 (LLM) 提供统一的、标准化方式与外部数据源和工具之间进行通信。

MCP 资源
MCP 应用场景
| 应用领域 | 典型场景 | MCP 价值 | 代表实现 |
| 智能编程助 手 | 代码生成、Bug 修复、 API 集成 | 安全访问本地代码库、 CI / CD 系统 | VS Code 插件 Cursor. |
| 数据分析工 | 自然语言查询数据库、 | 安全查询内部数据库、 | XiYanSQL-MCP、数据 |
| 具 | 可视化生成 | 连接 BI 工具 | 库 MCP 服务器 |
| 企业知识管 | 知识库查询、文档生 | 安全访问内部文档、保 | 文件系统 MCP、Email- |
| 理 | 成、邮件撰写 | 护隐私数据 | MCP |
| 创意设计工 具 | 3D 建模、图形生成、U I 设计 | 与专业软件无缝集成 | Blender MCP、浏览器 自动化 |
| 工作流自动 化 | 多系统协调、事件驱动 流程 | 跨系统安全协作 | Cloudflare MCP. AWS 自动化套件 |



stdio 本地环境安装:UVX
1 | pip install uv |
MCP 架构与工作原理


三个角色
1 | ┌─────────────────────────────────────────────────┐ |
- Host(宿主):用户直接面对的 AI 应用,负责管理连接、汇总各服务器的能力、把工具交给模型决策。
- Client(客户端):宿主内部为每个服务器维持的一个连接(1:1 关系)。
- Server(服务器):你要写的东西 —— 一个轻量进程或服务,暴露 Tools、Resources、Prompts。
通信原理
- 底层消息格式是 JSON-RPC 2.0(
jsonrpc、id、method、params)。 - 连接建立时有能力协商(capability negotiation):双方交换协议版本和各自支持的能力(服务器声明有 tools/resources/prompts,客户端声明支持 sampling/roots/elicitation 等)。
- 你几乎不需要手写 JSON - RPC——SDK 帮你封装好了,写服务器就是写几个带装饰器的普通函数。
为什么是 MCP 而不是直接调 API
写传统 REST API,模型不知道怎么调用它;而 MCP 服务器会主动向客户端描述自己:「我有这些工具、参数 schema 是什么、这些是只读资源、这些是提示词模板」。宿主把这些描述注入模型上下文,模型就能自动发现并正确使用你的能力。
核心概念:Tools / Resources / Prompts 与客户端能力
服务器暴露的三种原语(Primitives)
| 原语 | 谁控制 | 类比 | 典型用途 |
|---|---|---|---|
| Tools(工具) | 模型决定何时调用 | 函数 / POST 接口 | 查询天气、写数据库、发邮件、执行计算 |
| Resources(资源) | 客户端 / 用户选择读取 | GET 接口 / 文件 | 配置文件、文档、数据库 schema、日志 |
| Prompts(提示词) | 用户主动触发 | 参数化模板 | 「代码审查」「周报生成」等固定工作流 |
经验法则:要” 做事” 用 Tool,要” 读数据” 用 Resource,要” 复用话术” 用 Prompt。
客户端提供给服务器的能力(反向调用)
服务器也可以反过来请求客户端:
- Sampling(采样):服务器让客户端帮忙调一次 LLM(例如工具内部需要模型总结)。
- Roots(根目录):客户端告诉服务器「你可以关注这些目录 / URI 边界」。
- Elicitation(征求输入):工具执行中途向用户要结构化输入(例如「请选择删除范围」)。
⚠️ 版本注意:FastMCP 4 中
ctx.sample()与ctx.list_roots()已移除(协议演进为新的多轮交互机制),因此本教程的 Context 例程聚焦在所有版本都稳定的日志、进度报告、资源读取上;Elicitation 在第 7 章以版本注释方式说明。
传输层:stdio 与 Streamable HTTP
| stdio | Streamable HTTP | |
|---|---|---|
| 工作方式 | 客户端把你的服务器拉起来当子进程,走标准输入 / 输出 | 服务器作为 HTTP 服务常驻,端点默认 /mcp |
| 适用场景 | 本地桌面集成(Claude Desktop、Cursor、Claude Code) | 团队共享、远程、容器化、生产部署 |
| 认证 | 不需要(继承本机用户权限) | 需要:Bearer Token / OAuth 2.1 |
| Python 启动 | mcp.run() |
mcp.run(transport="http", host=..., port=...) |
要点:
- 旧的 HTTP + SSE 传输已废弃(2025-03-26 起),新项目一律用 Streamable HTTP。SSE 只作为其内部的流式机制存在。
- stdio 服务器绝对不能往 stdout 打印任何业务日志 ——stdout 是协议通道,打印日志会污染 JSON - RPC 报文导致连接断开。日志请写 stderr 或用
ctx.info()(见例程三)。 - 2026-07-28 修订版把 HTTP 传输改为默认无状态(不再有强制会话握手),并要求服务器校验
Origin头、本地运行时绑定127.0.0.1。
第一个 MCP Server
1 | from fastmcp import FastMCP |
Tools 进阶
1 | import asyncio |
要点小结:
- 让模型看得懂错误:业务错误抛
ToolError(模型可见、可重试); unexpected 的程序异常会被 SDK 兜底为isError结果。 - 优先结构化输出:返回 dict / dataclass / Pydantic 模型,客户端同时拿到文本和 JSON。
- annotations 很重要:
readOnlyHint/destructiveHint/idempotentHint/openWorldHint会影响宿主「是否自动放行还是弹确认」的决策。 - 工具描述写给模型看:描述里说清「什么时候该用、什么时候不该用」,比参数名更能提升调用准确率
Context—— 日志、进度报告与服务器内互调
在工具函数签名里声明一个 ctx: Context 参数,FastMCP 会自动注入上下文对象(它不会出现在工具 schema 里)。
1 | """例程三:Context 上下文 —— 日志、进度报告、读取自身资源。""" |
Context 还能做什么(按版本稳定性排序):
| 能力 | 方法 | 说明 |
|---|---|---|
| 日志 | ctx.debug/info/warning/error() |
全版本稳定 |
| 进度 | ctx.report_progress(progress, total) |
全版本稳定 |
| 读资源 / 提示词 | ctx.read_resource()、ctx.get_prompt() |
服务器内互调 |
| HTTP 请求信息 | ctx.request_context |
仅 HTTP 传输下有值 |
| 征求用户输入 | ctx.elicit()(v2/v3) |
v4 已重构,见文中注释 |
Resources(静态资源与 URI 模板)
资源是只读数据,用 URI 标识。URI 模板(RFC 6570)可以把参数带进 URI,比如 user://{user_id}/profile。
1 | import json |
Prompts(可复用提示词模板)
Prompt 是带参数的提示词模板,用户在客户端里通过「斜杠命令」之类的入口主动触发。
1 | from fastmcp import FastMCP |
SQLite 笔记服务器
1 | """ |
Streamable HTTP 远程部署
1 | import os |