Skip to content

03 · MCP 协议 ​

🎯 难度:中级⏱ 预计:45 分钟# MCP# Host# Client# Server

如果每接一个外部服务都重写一套工具适配,很快会很累。MCP(Model Context Protocol)为 AI 应用与工具/资料服务之间的通信提供标准协议。

它在架构中的位置 ​

text
用户 → Host(AI 应用,负责模型与权限)
          └─ Client(协议连接)
                └─ Server(暴露 tools / resources / prompts)
  • Host:例如支持 MCP 的 IDE,或你写的 Agent 应用。
  • Client:连接、初始化、列工具、调用工具。
  • Server:把业务功能以协议形式暴露出来。

MCP Server 本身不一定调用大模型。它可以只是「提供一个读取笔记的函数」。Host 才决定什么时候把工具交给模型、如何执行和展示结果。

三种常见能力 ​

能力含义示例
Tools可以执行的操作搜索笔记、查询天气
Resources可以读取的数据文档内容、schema、项目资源
Prompts可复用的提示模板代码分析模板、文档总结模板

工具描述和来源同样不可信。安装第三方 Server 就是在授予一个程序访问环境的机会,不能因为它遵守 MCP 就默认安全。

传输方式 ​

  • stdio:Host 启动本地子进程,通过标准输入输出通信,适合本地学习。
  • Streamable HTTP:网络服务,适合远程连接,需要认证与访问控制。

stdio 下,stdout 是协议通道,不要随意 print 日志到 stdout;日志放 stderr。不要把旧式 HTTP+SSE 教程与新的传输配置混用。

一个版本明确的 Server ​

本教程使用经典 SDK 1.x 路径:

bash
uv add "mcp==1.12.4" "pydantic==2.11.7" "pydantic-settings==2.10.1"
python
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("计算工具")

@mcp.tool()
def add(a: int, b: int) -> int:
    """将两个整数相加。"""
    return a + b

if __name__ == "__main__":
    mcp.run(transport="stdio")

运行后安静地等待输入是正常的,它在等协议客户端,不是一个聊天命令行。完整客户端见 项目 5。

SDK 主版本不可混用

官方 MCP Python SDK 2.x 已提供不同 API(例如 MCPServer、Client)。本课固定 1.12.4 是为了让示例可复现,不表示它是最新版。旧 SDK 依赖 Pydantic 的内部接口,直接安装最新依赖可能发生 ImportError;这里同时固定经过本地协议测试的 Pydantic 和 pydantic-settings。以后升级请按官方迁移指南,不要只改安装命令。

MCP 和 Function Calling 的关系 ​

Function Calling 是模型请求调用工具的方式;MCP 是应用连接外部工具服务的协议。

Host 可以把 Server 的工具列表转换为模型工具 Schema;收到调用后,Host 的 Client 通过 MCP 执行,再把结果回传模型。两者是不同层,不能互相替代。

练习 ​

画出「在 IDE 中用 MCP 查询自己的笔记」的调用链。标出哪一层读取文件、哪一层持有模型 Key、哪一层需要检查用户授权。

用心写给每一个想入门 Agent 开发的前端工程师