环境:uv(推荐,免预装依赖)或pip install mcp(Python 3.10+)。本模块示例实测环境:mcp SDK 2.1.1。 来源: https://github.com/modelcontextprotocol/python-sdk、https://py.sdk.modelcontextprotocol.io/client/(访问于 2026-08-30)
cd 06-mcp/examples
uv run --with mcp python 01_server_primitives_demo.py
对照输出完成:
protocol_version 输出(应为 2026-07-28)——这是 SDK 自动协商的结果(Modern 规范:无 initialize 握手)tools/list 返回了什么?host 为什么需要这一步才能组装 Claude API 的 tools 参数?resources/templates/list 里 catalog://{section} 是 Resource Template(RFC 6570 URI 模板);把 resources/read 的调用换成一个不存在的 section,观察行为prompts/get 渲染出的消息是给谁的?(提示:prompts 是 user-controlled,由用户触发)验收:能口头回答——tools / resources / prompts 各自由谁控制?
uv run --with mcp python 02_tool_error_handling.py
观察四段输出(成功 / ToolError / 未知工具 / 修复后重试),回答:
is_error=True + content 里的错误文本 vs 抛异常)ToolError 时为什么要把「已知 SKU 列表」写进错误消息?(修复式重试的线索)is_error,再信任结构化数据)对照规范:tools/call 结果携带 isError 标志。 来源: https://modelcontextprotocol.io/specification/2026-07-28/server/tools(访问于 2026-08-30)
uv run --with mcp python 03_context_cost_simulator.py
两个场景(12 工具 vs 210 工具)输出后:
task_needs 改成 1 或 10 再跑——progressive discovery 的成本对任务用到的工具数敏感吗?对照官方数据点:上百工具全量定义 ~150,000 tokens vs 渐进式 ~2,000 tokens。 来源: https://modelcontextprotocol.io/docs/2026-07-28/develop/clients/client-best-practices(访问于 2026-08-30)
把 01_server_primitives_demo.py 复制到 /tmp/my_server.py(不要改 examples 原文件),然后:
check_order_status(order_id: str, verbose: bool = False)),未知 order_id 时抛带修复线索的 ToolErrororders://{customer_id})summarize_orders(period: str))参考 API:@mcp.tool()、@mcp.resource("scheme://{param}")、@mcp.prompt()、from mcp.server.mcpserver.exceptions import ToolError。 来源: https://github.com/modelcontextprotocol/python-sdk(访问于 2026-08-30)
验收:故意调用未知 order_id,确认输出是 is_error=True 而不是崩溃。
04_mcp_connector_api.py,找出三个组件:mcp_servers 定义、mcp_toolset 工具配置、beta header mcp-client-2025-11-20来源: https://platform.claude.com/docs/en/agents-and-tools/mcp-connector(访问于 2026-08-30)
ANTHROPIC_API_KEY + 一个公网 MCP server)按文件头注释的 env vars 实跑;没有 server 可用时可参考官方文档中的 https://example-server.modelcontextprotocol.io/sse 示例形态