这篇适合谁,读完能做到什么
适合已经听说过 MCP,想弄清它由哪些部分组成的开发者和学生。读完你应该能说清主机、客户端、服务器各自的职责,分得出资源、提示词、工具三类能力,并照着示例写出一个能被智能体调用的工具函数。
MCP 是什么
MCP(Model Context Protocol,模型上下文协议)是一个标准化框架,用来优化大语言模型与外部工具、应用和数据源之间的通信[1]。它的核心价值是统一接口:工具按照同一套协议暴露能力,支持 MCP 的应用就能调用,不必为每个应用单独写一遍接入代码。
三个角色:主机、客户端和服务器
MCP 采用客户端-服务器架构,一个主机应用可以连接多个服务器[1]。常见的主机有 Claude Desktop、Visual Studio Code 和 Claude Code[1]。主机负责协调模型交互、控制界面、执行权限和安全约束,并管理用户对数据共享和工具执行的同意[1]。
主机会为每个服务器创建一个客户端。客户端由主机为某个具体服务器建立,两者是逻辑上的一对一关系,并不要求保持持久的网络连接[1]。服务器则负责提供上下文、工具和能力,它可以运行在和主机同一台电脑上,也可以部署在外部平台[1]。
服务器的三类基本能力
服务器可以暴露三种基本能力,任意组合都可以[1]:
- 资源(resources):文件、数据库条目、知识库文章、API 返回的数据等上下文信息。资源用 URI 标识,用
resources/list发现,用resources/read读取[1]。 - 提示词(prompts):可复用的模板,用来组织与模型的对话,支持变量替换。用
prompts/list发现,用prompts/get获取[1]。 - 工具(tools):模型可以调用的可执行函数,用来执行操作或获取实时数据。每个工具有唯一的名称、描述,以及用 JSON Schema 定义的参数。用
tools/list发现,用tools/call执行[1]。
可以这样理解:工具是动词,负责做事;资源是名词性质的上下文,负责提供材料。工具还可以附带注解,例如 readOnlyHint 和 destructiveHint,说明它是只读还是有破坏性,方便客户端在执行前做判断[1]。
一次工具调用的大致过程是这样的:用户在主机里提问,主机把输入交给客户端;如果模型判断需要某个工具,客户端就向服务器发送工具调用请求,写明工具名称和参数;服务器执行函数,把结果以结构化格式返回;客户端把结果并入模型的上下文,模型据此生成回答,再由主机展示给用户[1]。
客户端能力:采样、根目录、询问用户和日志
客户端也可以向服务器暴露一些能力[1]:
- 采样(sampling):服务器请求客户端的 AI 应用生成一次模型补全,方法是
sampling/createMessage。 - 根目录(roots):告诉服务器哪些文件系统位置与请求相关,使用
file://URI。它只是提示,不授予访问权限,也不构成安全边界[1]。 - 询问用户(elicitation):服务器通过客户端界面向用户索取补充信息或确认,方法是
elicitation/create[1]。 - 日志(logging):服务器向客户端发送结构化日志,便于调试和监控。
在 2026-07-28 版规范中,采样、根目录和日志已被标记为弃用,仍可用于兼容。新的实现应直接接入模型厂商的 API,用工具参数、资源 URI 或服务器配置传递目录,并用 stderr 配合 OpenTelemetry 做可观测性。这三项都可能在 2027 年 7 月 28 日或之后发布的规范修订中被移除[1]。询问用户没有被弃用。
协议版本和通信方式
MCP 用日期作版本号,格式为 YYYY-MM-DD,当前版本是 2026-07-28[1]。这一版去掉了 initialize 握手和协议层的会话 ID,使传输层变成无状态[1]。
MCP 消息基于 JSON-RPC 2.0。请求带有 id、method 和可选的 params;通知没有 id,也不需要回应[1]。
传输方式主要有两种[1]:
- STDIO:通过标准输入输出与同一台机器上的本地进程通信,适合本地服务器。
- Streamable HTTP:客户端用 HTTP POST 发送消息,服务器可以选用 Server-Sent Events 推送消息,适合跨网络的远程服务器。它支持 Bearer Token、API Key 和自定义请求头,MCP 推荐用 OAuth 做令牌认证[1]。
上手:用 Python 写一个天气工具
示例使用 fastmcp 包,先安装[1]:
pip install fastmcp接下来是工具函数本身。@mcp.tool() 装饰器把普通函数注册为 MCP 工具[1]:
@mcp.tool()
def get_weather(location: str) -> dict:
"""Gets current weather for a location."""
return {
"temperature": 72.5,
"conditions": "Sunny",
"location": location
}这段代码只包含工具函数。要让它运行起来,还需要先创建 fastmcp 的服务器对象,并通过标准输入输出启动服务,这部分的写法请以官方文档为准[2]。这个示例返回的是固定数据,真正使用时应在函数里调用天气接口。
常见问题和限制
- 工具会被模型调用,就会产生真实动作,权限要从一开始考虑。MCP 本身并不要求每次工具调用都弹出确认框,但主机应当让工具调用可见、允许用户拒绝,并在执行敏感操作前展示输入和影响[1]。
- 远程连接应使用 HTTPS 和 MCP 授权模型;本地 stdio 服务器依赖进程隔离、可信配置,以及对继承凭证的安全处理[1]。
- 对所有参数做校验,按 JSON Schema 拒绝不合规的输入,可以防止注入类攻击[1]。
- Tasks 扩展用于耗时较长的操作。在 2026-07-28 版中它已是官方扩展,通过
tasks/get、tasks/update和tasks/cancel查询和管理任务,tasks/list已被删除[1]。 - 从 2025-11-25 版迁移过来的服务器要参考 2026-07-28 版的变更说明,部分概念已经变了[1]。
下一步
读完这篇,建议接着看官方规范,核对每个方法和字段的细节[2]。下一步动手时,先在本地写一个只读工具,确认主机能列出它、能调用它,再考虑加入写操作和权限控制。
本文改编自 Microsoft 开源课程《MCP for Beginners》第 1 课「核心概念」[1],原文以 MIT 许可证发布。
来源
- 1MCP Core Concepts: Mastering the Model Context Protocol for AI IntegrationMicrosoft mcp-for-beginners (MIT)
- 2MCP Specification 2026-07-28Model Context Protocol
引用本页: MCP 核心概念:主机、客户端、服务器与三类能力. TellWorld, https://www.tellworld.net/zh/practice/practice-mcp-core-concepts. 更新于 2026-11-14