MCP工具、资源与提示模板:三种能力怎样使用
正在读取学习记录…
1. 三种入口交出不同内容
Tool(工具)接收参数并执行操作,例如运行测试。Resource(资源)提供可读取内容,例如源文件。Prompt(提示模板)提供一组消息,例如代码复核说明。
可以想成工作台三个抽屉:工具放扳手,资源放资料,模板放步骤清单。工具返回执行结果,资源返回内容,模板返回组织好的消息。
| 需求 | 能力 | 方法 |
|---|---|---|
| 运行测试 | Tool | tools/call |
| 读取源文件 | Resource | resources/read |
| 取得复核消息 | Prompt | prompts/get |
工具规范通常把工具描述为模型选择的能力,资源由应用管理上下文,模板通常由用户选择。应用可以设计自己的界面和确认流程。
2. 看一个应用目录
新建catalog_lab.py:
先在 PowerShell 创建本篇的独立目录并进入;路径可换成你自己的非系统盘位置:
mkdir -Force "F:\学习\agentdepth-l2-mcp-capabilities"
cd "F:\学习\agentdepth-l2-mcp-capabilities"将本篇的 catalog_lab.py、test_catalog_lab.py 保存到这个目录。保存全部文件后运行 dir *.py,核对上述文件名,再执行下文命令;新开窗口时先回到该目录,并按 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))python catalog_lab.py输出:
{'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
# 核对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()python -m unittest test_catalog_lab -v恢复实验中的改动后运行测试。失败时先查看对应参数、编号或权限条件,再核对程序分支。
课后练习展开习题收起习题
正在读取本地记录…
不调用模型,不执行代码。简答、代码和场景题仅保存答案并展示自查标准,不生成评分、徽章或认证。输入内容不会自动保存,请点击提交;不要填写个人信息或密钥。
选择题 · 先判断边界
关于“MCP Tools、Resources 与 Prompts”,哪种做法更稳妥?
对应知识点:L2-mcp-capabilities
简答题 · 解释失败
写出一个失败输入并说明记录字段。
对应知识点:L2-mcp-capabilities
代码题 · 边界测试
补充正常、边界、失败三组输入和预期结果。
对应知识点:L2-mcp-capabilities
场景题 · 结果未知
证据不足时如何设计状态和人工接管?
对应知识点:L2-mcp-capabilities
描述会发送给本站维护者,用于修订文章,保存90天。请只填写文章问题,省略个人信息、密钥和内部资料。