MCP 模型上下文协议入门
背景
让大模型“用工具”早就不是新鲜事,但 2024 年之前 everyone was 各做各的:每个应用要把同一个数据库、同一套 API 各自对接一遍。N 个模型 × M 个工具 = N×M 套集成,重复劳动且难以复用。
2024 年底,Anthropic 提出了 Model Context Protocol(MCP),一套开放标准,被形象地称为“AI 应用的 USB-C 接口”。只要工具方按协议实现一个 MCP Server,任何兼容 MCP 的客户端(IDE、桌面应用、Agent 框架)都能即插即用地调用它。
核心概念
MCP 把“谁在跑模型”和“能力从哪来”解耦,定义了三个角色:
- 1 Host(宿主):运行模型的应用,例如 Claude Desktop、Cursor、VS Code 插件。
- 2 Client(客户端):内嵌在 Host 中,负责与某个 Server 建立连接、收发消息。
- 3 Server(服务端):真正提供能力的进程,可以是一个本地脚本,也可以是远端服务。
Server 通过三类“原语”暴露能力:
- T Tools(工具):模型可主动调用的函数,例如“查天气”“跑 SQL”。带 JSON Schema 描述的输入。
- R Resources(资源):可供读取的数据,例如文件内容、数据库行,由应用侧决定何时注入。
- P Prompts(提示模板):预置给用户复用的交互模板,例如“帮我 code review 这段代码”。
示例
用官方 Python SDK 的 FastMCP 写一个最小天气工具 Server,只需十几行:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather")
@mcp.tool()
def get_forecast(city: str) -> str:
"""返回指定城市的天气预报(模型据此理解何时调用)"""
return f"{city} 今天晴,25°C,微风"
if __name__ == "__main__":
mcp.run() # 默认通过 stdio 与 Host 通信
客户端发现这个 Server 后,会在合适的时机把 get_forecast 暴露给模型;模型决定调用时,参数由 SDK 自动按类型校验。传输层除了 stdio,也支持基于 HTTP/SSE 的远程连接,方便把内部系统封装成团队共享的 MCP 服务。
总结
MCP 把“模型怎么连工具”这件事标准化了。对开发者来说,一次实现、处处可用;对 Agent 平台来说,可以直接把现成的 MCP Server 编排进工作流。
我计划在“AI Agent 工作台”项目里,把我们已有的企业知识库、Elasticsearch、MySQL 等能力都封装成 MCP Server,这样不同客户端和 Agent 都能用同一套接口调用,避免重复造轮子。