AgentDepthAgent 工程学习指南
输入概念或问题,检索正文和待编写目录。
第一次学习?从 L0 总览开始 →

MCP工具、资源与提示模板:三种能力怎样使用

我的学习 →

正在读取学习记录…

1. 三种入口交出不同内容

Tool(工具)接收参数并执行操作,例如运行测试。Resource(资源)提供可读取内容,例如源文件。Prompt(提示模板)提供一组消息,例如代码复核说明。

可以想成工作台三个抽屉:工具放扳手,资源放资料,模板放步骤清单。工具返回执行结果,资源返回内容,模板返回组织好的消息。

工具返回测试结果,资源返回源文件,模板返回复核消息
根据需要的输出选择入口:操作、内容或任务消息。
需求能力方法
运行测试Tooltools/call
读取源文件Resourceresources/read
取得复核消息Promptprompts/get

工具规范通常把工具描述为模型选择的能力,资源由应用管理上下文,模板通常由用户选择。应用可以设计自己的界面和确认流程。

2. 看一个应用目录

新建catalog_lab.py:

先在 PowerShell 创建本篇的独立目录并进入;路径可换成你自己的非系统盘位置:

Bash
mkdir -Force "F:\学习\agentdepth-l2-mcp-capabilities"
cd "F:\学习\agentdepth-l2-mcp-capabilities"

将本篇的 catalog_lab.py、test_catalog_lab.py 保存到这个目录。保存全部文件后运行 dir *.py,核对上述文件名,再执行下文命令;新开窗口时先回到该目录,并按 Python 环境篇核对 python 的解释器路径。

Python
"""按工具、资源和提示模板的用途选择入口。"""

from dataclasses import dataclass
from typing import Dict, List


@dataclass(frozen=True)
class Capability:
    name: str
    kind: str
    method: str
    selector: str
    effect: str


CATALOG: Dict[str, Capability] = {
    "run_tests": Capability("run_tests", "tool", "tools/call", "model_suggests_host_approves", "execute"),
    "selected_file": Capability("selected_file", "resource", "resources/read", "host_selects", "read_context"),
    "review_errors": Capability("review_errors", "prompt", "prompts/get", "user_selects", "template"),
}


# 根据入口类型检查本次选择需要的确认或读取权限。
def decide(name: str, *, user_confirmed: bool, read_allowed: bool) -> Dict[str, str]:
    """对固定目录应用选择规则;实际消息交换在传输篇实现。"""
    if name not in CATALOG:
        return {"status": "reject", "reason": "unknown_name"}
    item = CATALOG[name]
    if item.kind == "tool" and not user_confirmed:
        return {"status": "reject", "reason": "approval_required"}
    if item.kind == "resource" and not read_allowed:
        return {"status": "reject", "reason": "read_denied"}
    return {"status": "selected", "kind": item.kind, "method": item.method,
            "selector": item.selector, "effect": item.effect}


def inventory() -> List[Dict[str, str]]:
    return [dict(name=item.name, kind=item.kind, method=item.method,
                 selector=item.selector, effect=item.effect) for item in CATALOG.values()]


if __name__ == "__main__":
    for row in inventory():
        print(row)
    print("denied_tool", decide("run_tests", user_confirmed=False, read_allowed=True))
    print("denied_resource", decide("selected_file", user_confirmed=True, read_allowed=False))
Bash
python catalog_lab.py

输出:

TXT
{'name': 'run_tests', 'kind': 'tool', 'method': 'tools/call', 'selector': 'model_suggests_host_approves', 'effect': 'execute'}
{'name': 'selected_file', 'kind': 'resource', 'method': 'resources/read', 'selector': 'host_selects', 'effect': 'read_context'}
{'name': 'review_errors', 'kind': 'prompt', 'method': 'prompts/get', 'selector': 'user_selects', 'effect': 'template'}
denied_tool {'status': 'reject', 'reason': 'approval_required'}
denied_resource {'status': 'reject', 'reason': 'read_denied'}

前三行列出目录,后两行是策略检查:运行测试需要本次确认,读取文件需要读取权限。Capability保存类型与方法,decide选择当前入口,具体协议消息由Client构造。

selector表示谁发起选择:model_suggests_host_approves为模型建议、应用批准,host_selects为应用选择资料,user_selects为用户选择模板。这些值是示例应用的策略说明。

把末尾工具调用的user_confirmed改为True,会得到selected和tools/call。资源的read_allowed改为True,也会进入读取入口。模板获取返回消息;若模板生成过程还要读文件,该读取需要对应权限。

4. 同一任务怎样组合三种能力

代码复核可以先选模板,再读取相关文件,最后按需要运行测试。模板组织目标,文件提供依据,测试提供执行反馈。

资源地址叫URI,客户端按地址读取;大文件可选择有关片段,减少上下文用量。工具目录带输入Schema,实际执行时检查参数和资源权限。模板带参数,按参数填入相应消息。

目录声明可用能力,应用策略决定本次选择。高风险操作可以加入批准;资源可以按当前用户范围筛选。总结:操作选工具,内容选资源,消息选模板。继续读 传输。

5. 验证消息与边界

测试文件保存到同一目录:

下面的测试检查应用怎样在工具、资源和提示模板之间作出选择,以及入口方法、确认条件、读取权限和未知名称处理。运行结果列出所选能力,消息发送与服务返回在传输篇展开。

测试代码:test_catalog_lab.py
Python
# 核对MCP工具、资源与提示模板的正常结果和错误分支;断言失败时会显示对应的测试。
import unittest

from catalog_lab import decide, inventory


class CatalogTests(unittest.TestCase):
    def test_three_distinct_methods(self):
        self.assertEqual({row["method"] for row in inventory()},
                         {"tools/call", "resources/read", "prompts/get"})

    def test_tool_requires_host_approval(self):
        self.assertEqual(decide("run_tests", user_confirmed=False, read_allowed=True)["reason"],
                         "approval_required")

    def test_resource_uri_does_not_grant_read(self):
        self.assertEqual(decide("selected_file", user_confirmed=True, read_allowed=False)["reason"],
                         "read_denied")

    def test_prompt_selection_does_not_execute_tool(self):
        selected = decide("review_errors", user_confirmed=False, read_allowed=False)
        self.assertEqual((selected["kind"], selected["effect"]), ("prompt", "template"))

    def test_unknown_name_rejected(self):
        self.assertEqual(decide("delete_workspace", user_confirmed=True, read_allowed=True)["reason"],
                         "unknown_name")


if __name__ == "__main__":
    unittest.main()
Bash
python -m unittest test_catalog_lab -v

恢复实验中的改动后运行测试。失败时先查看对应参数、编号或权限条件,再核对程序分支。

课后练习展开习题收起习题

4 道练习 · 客观题规则评分 · 其余题目待批改

正在读取本地记录…

不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。

练习 1 / 4 · v1.0.1

选择题 · 先判断边界

关于“MCP Tools、Resources 与 Prompts”,哪种做法更稳妥?

对应知识点:L2-mcp-capabilities

选择一个答案
练习 2 / 4 · v1.0.0

简答题 · 解释失败

写出一个失败输入并说明记录字段。

对应知识点:L2-mcp-capabilities

练习 3 / 4 · v1.0.0

代码题 · 边界测试

补充正常、边界、失败三组输入和预期结果。

对应知识点:L2-mcp-capabilities

练习 4 / 4 · v1.0.0

场景题 · 结果未知

证据不足时如何设计状态和人工接管?

对应知识点:L2-mcp-capabilities

图片查看器
100%

文章配图 · 按 Esc 关闭