第02章 三大核心概念:Resources、Tools、Prompts

作者:光谷老亢 | 源码地址:https://github.com/kang-airtc/mcp-mini-book

上一章把 MCP 协议的定位与诞生背景讲清楚之后,本章进入它的能力模型。一个 MCP Server 究竟能“暴露什么”给 Client?这正是 MCP 与早期工具协议拉开差距的地方。

MCP 把 AI 应用与外部能力之间的交互切分为三个正交维度:Resources(资源)、Tools(工具)、Prompts(提示)。三者的语义边界、触发方、生命周期都不一样,把它们混淆是初学者最常见的认知偏差。

读完本章,读者将能用一句话说清三者各自的职责,并能在工单分析这一贯穿案例中找到它们的对应实例。

2.1 Resources:面向AI的上下文数据

Resources 在 MCP 中代表上下文数据,可以是一个文件、一段数据库记录、一个 API 的响应,或一份动态生成的报告。Resources 由 Server 声明,但触发权在用户或 Client 一端,模型本身并不会主动去读 Resource。

Resource 通过统一资源标识符(Uniform Resource Identifier,URI)标识。URI 的 scheme 部分由 Server 自定义,常见的有 file://https://,本书示例则使用业务化的 tickets://。Client 通过 resources/list 拉取可用 URI 清单,再通过 resources/read 拿到具体内容。下面是 tickets://list 资源的最小声明形态:

{
  "uri": "tickets://list",
  "name": "工单列表",
  "mimeType": "application/json"
}

声明中三个字段各司其职:uri 是访问入口,name 是给用户看的展示名,mimeType 告知 Client 如何渲染内容。Resource 的实际读取通过另一个请求完成,Client 发送的报文骨架如下:

{
  "method": "resources/read",
  "params": { "uri": "tickets://list" }
}

Server 接到 resources/read 后,返回对应 URI 的数据正文。Resource 的核心特征是被动:Server 只声明“我有哪些数据可被读取”,至于何时读取、是否读取,由用户决定。这一语义和 IDE 类应用中“用户主动选择当前要让 AI 看的文件”这一场景天然契合。

2.2 Tools:可被AI自动调用的功能

Tools 是 MCP 三大能力中最常用的一个,对应可被模型自动调用的函数。Server 通过 tools/list 暴露工具清单(含名称、描述、参数 schema),Client 把这份清单转译为 Function Calling 的 schema 喂给模型;模型在推理时决定调用哪个工具、传什么参数;Client 收到调用意图后,通过 tools/call 把请求转发给 Server,拿到结果再回填到模型的下一轮上下文。

Tool 有两个结构性特征。其一,输入是结构化的,由 JSON Schema 约束参数类型与必填项。其二,输出也是结构化的,Server 返回的 content 字段是数组,每个元素可以是文本块、图像块、嵌入的资源块等多种类型。下面是一个 Tool 的声明示例:

{
  "name": "query_tickets_by_status",
  "description": "按状态查询工单",
  "inputSchema": {
    "type": "object",
    "properties": {
      "status": {
        "type": "string",
        "description": "工单状态:open、in_progress、resolved、closed"
      }
    },
    "required": ["status"]
  }
}

description 是给模型看的,模型在决定是否调用某个 Tool 时,主要依靠这段自然语言描述。inputSchema 是给模型与 Client 共用的契约,Client 在转发 tools/call 之前会按 schema 校验参数。当模型生成调用意图后,Client 发出的请求形如下:

{
  "method": "tools/call",
  "params": {
    "name": "query_tickets_by_status",
    "arguments": { "status": "in_progress" }
  }
}

Tool 的设计哲学是“动作”,它接收参数、执行副作用或返回计算结果。与 Resource 的“被动数据”相对,Tool 是 MCP 中唯一让模型主动操控外部世界的入口。

2.3 Prompts:用户触发的提示模板

Prompts 是 MCP 三大能力中最容易被忽视的一个。它既不是模型自动调用的工具,也不是用户挑选的数据,而是预置的提示词模板,通常在 IDE 中以斜杠命令的形式呈现,例如 /code_review/explain/analyze_priority

Prompt 由 Server 提供,但触发权在用户。当用户输入斜杠命令后,Client 通过 prompts/get 从 Server 拉取该模板的完整内容,再把它注入到当前对话流,模型据此执行后续推理,这一过程往往会进一步触发 Tool 调用。Prompt 本身只是一段精心设计的提示词,真正的执行交由模型与 Tools 完成。下面是一个 Prompt 的声明示例:

{
  "name": "analyze_priority_tickets",
  "description": "分析所有高优先级工单",
  "arguments": []
}

Prompt 的价值不在于“做了什么”,而在于把领域专家的提示词工程经验沉淀下来。工单分析中的“高优先级工单排查”、“客户满意度归因”等场景,往往需要一段精心设计的多步指令才能引导模型按业务逻辑思考;把这些指令封装为 Prompt 放进 MCP Server,等于把提示词资产也工具化、可复用。一个团队如果有 30 名工程师都在使用同一个 MCP Server,就意味着这些提示词只需写一次,人人受益。

注意:同一份数据既可以做成 Tool(由模型主动调用),也可以做成 Resource(由用户主动附加到上下文)。两种实现的 SQL 与业务逻辑可以完全一样,差别只在装饰器与触发权归属。把高频拉取的列表做成 Resource,把动作类操作做成 Tool,是常见的设计取舍。

2.4 三者的协作关系与典型工作流

把三者放在同一张图上,各自的归属、触发方、传输方向就清晰了,如图 2-1 所示。三者由 Server 单向暴露给 Client,但触发方不同:Resources 由用户挑选、Tools 由模型决定、Prompts 由用户激活。

在这里插入图片描述

将这一职责差异整理成速查表,便于读者在写代码前对照确认,如表 2-1 所示。

表 2-1 三大核心概念速查表

维度 Resources Tools Prompts
触发方 用户主动选择 模型自动调用 用户主动触发
携带内容 数据本身 函数及调用结果 提示词模板
典型场景 文件列表、汇总报告 查询、计算、写入 斜杠命令
Server 接口 resources/listresources/read tools/listtools/call prompts/listprompts/get

以本书贯穿的工单分析场景为例,一次端到端的工作流可以拆成五步:第一步,用户在 IDE 中输入 /analyze_priority 激活高优先级分析 Prompt;第二步,Client 从 MCP Server 拉取该 Prompt 模板并注入对话上下文;第三步,模型读取模板后判断需要先看统计数据,自动调用 get_ticket_statistics Tool;第四步,Server 返回统计结果,模型继续推理,可能再调用 query_tickets_by_status 拿到处理中的高优先级工单;第五步,若需要更完整的背景,用户可以主动把 tickets://report 资源附进上下文。

三者在这次流程中各自扮演不同角色:Prompts 起到“工作流入口”的作用,Tools 承载“动作”,Resources 提供“补充上下文”。它们不是替代关系,而是组合关系,一个成熟的 MCP Server 通常会同时实现这三种能力,共同构成 Server 的能力面。

下一章进入更底层的视角,讨论这些 tools/callresources/readprompts/get 究竟以什么样的报文格式在 Client 与 Server 之间传递,以及 MCP 在传输层做了哪些不同选择。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐