本系列:00 什么是 MCP · 01 协议与心智模型 · 02 Python 框架选型 · 03 部署与调用 · 04 重任务与优化 · 05 从 0 开发 · 06 进阶示例(本文) · 07 阿里云案例
1. 示例目标
在 05 最小 Tool 基础上,同一 Server 演示:
| 原语 | 示例能力 |
|---|---|
| Tool | 同步查询:统计字符串词数 |
| Resource | 只读配置 config://app |
| Prompt | 参数化代码审查模板 |
| Tool + Task | 模拟批处理(Progress + 后台 Task) |
完整源码见同目录 advanced_server.py。
2. Host 侧:Tool vs Resource vs Prompt
| 原语 | 模型/Host 典型行为 | 你何时主动提 |
|---|---|---|
| Tool | 模型在需要「执行动作」时 tools/call |
「用 xxx 工具统计词数」 |
| Resource | Host 或模型 resources/read 拉上下文 |
「读取 config 资源」;部分 Host 需手动订阅 |
| Prompt | 用户或模型选用模板展开为消息 | 「使用 code_review 提示」 |
Resources 不应替代 Tool 做有副作用操作;大结果应用 Resource 卸载(见 04)。
3. 完整示例代码
以下以 官方 SDK 的 FastMCP 为主;§3.4 长任务 需 FastMCP 2.14+(pip install "fastmcp>=2.14")且 Inspector / Host 支持 Tasks。若环境仅有 mcp[cli],可注释 §3.4,改用 04 的三 Tool 兼容模式。
1 | """进阶 MCP Server:Tools + Resources + Prompts +(可选)Tasks。""" |
3.1 运行方式
1 | uv init advanced-mcp && cd advanced-mcp |
3.2 stdio Host 配置(片段)
1 | { |
3.3 Inspector 验证清单
- 连接后
tools/list应含count_words、batch_process。 resources/list应含config://app;读取得到 JSON。prompts/list应含code_review。- 调用
batch_process:若返回 Task(status: working),在 Inspector 中轮询tasks/get直至completed;若 Host 不支持 Tasks,可能超时或报错 → 见 §5。
4. Task 生命周期(Inspector / 支持 Tasks 的 Host)
1 | sequenceDiagram |
与 01 Tasks 小节 及 04 重任务 一致。
5. Host 不支持 Tasks 时的降级
保留 count_words、app_config、code_review;将长任务拆为三个同步 Tool(内存 dict 或 Redis 存 job 状态):
1 | _JOBS: dict[str, str] = {} |
在 Tool description 中写清调用顺序。
6. 与部署、重任务的衔接
| 话题 | 篇章 |
|---|---|
| stdio vs HTTP、Docker、Serverless | 03 部署与调用 |
| 队列、Resource 卸载、取消 | 04 重服务与长任务 |
| 框架与 uv 环境 | 02 Python 框架选型 |
| 阿里云 Argo + 多 MCP 蛋白设计 | 07 阿里云案例 |
7. 小结
| 能力 | 装饰器 / API |
|---|---|
| Tool | @mcp.tool() |
| Resource | @mcp.resource("uri://...") |
| Prompt | @mcp.prompt() |
| 长任务 | @mcp.tool(task=True) + Context.report_progress |
版本提示:Tasks 与 task=True 依赖 FastMCP ≥2.14 及 Client 的 Tasks 实现;以 官方 SDK release 为准,逐步迁移至单一 mcp 包。