创建可复用的提示模板和工作流
提示(Prompts)使服务器能够定义可复用的提示模板和工作流,客户端可以轻松向用户和 LLM(大语言模型)展示这些内容。它们提供了一种强大的方式来标准化和共享常见的 LLM 交互。
提示被设计为用户可控的,这意味着它们从服务器暴露给客户端,目的是让用户能够明确选择并使用它们。
概述
MCP(模型上下文协议)中的提示是预定义的模板,可以:
- 接受动态参数
- 包含来自资源的上下文
- 串联多个交互
- 引导特定的工作流
- 作为 UI 元素(例如斜杠命令)显示
提示结构
每个提示由以下结构定义:
{name: string; // 提示的唯一标识符description?: string; // 人类可读的描述arguments?: [ // 可选的参数列表{name: string; // 参数标识符description?: string; // 参数描述required?: boolean; // 是否为必填参数}]}
发现提示
客户端可以通过 prompts/list 端点发现可用的提示:
// 请求{method: "prompts/list"}// 响应{prompts: [{name: "analyze-code",description: "分析代码以改进",arguments: [{name: "language",description: "编程语言",required: true}]}]}
使用提示
要使用提示,客户端可以发送 prompts/get 请求:
// 请求{method: "prompts/get",params: {name: "analyze-code",arguments: {language: "python"}}}// 响应{description: "分析 Python 代码以改进",messages: [{role: "user",content: {type: "text",text: "请分析以下 Python 代码并提供改进建议:\n\n```python\ndef calculate_sum(numbers):\n total = 0\n for num in numbers:\n total = total + num\n return total\n\nresult = calculate_sum([1, 2, 3, 4, 5])\nprint(result)\n```"}}]}
动态提示
提示可以是动态的,并且包含:
嵌入式资源上下文
{"name": "analyze-project","description": "分析项目日志和代码","arguments": [{"name": "timeframe","description": "要分析日志的时间范围","required": true},{"name": "fileUri","description": "要审查的代码文件 URI","required": true}]}
当处理 prompts/get 请求时:
{"messages": [{"role": "user","content": {"type": "text","text": "分析这些系统日志和代码文件是否存在问题:"}},{"role": "user","content": {"type": "resource","resource": {"uri": "logs://recent?timeframe=1h","text": "[2024-03-14 15:32:11] ERROR: 网络超时于 network.py:127\n[2024-03-14 15:32:15] WARN: 正在重试连接 (尝试 2/3)\n[2024-03-14 15:32:20] ERROR: 超过最大重试次数","mimeType": "text/plain"}}},{"role": "user","content": {"type": "resource","resource": {"uri": "file:///path/to/code.py","text": "def connect_to_service(timeout=30):\n retries = 3\n for attempt in range(retries):\n try:\n return establish_connection(timeout)\n except TimeoutError:\n if attempt == retries - 1:\n raise\n time.sleep(5)\n\ndef establish_connection(timeout):\n # 连接实现\n pass","mimeType": "text/x-python"}}}]}
多步骤工作流
const debugWorkflow = {name: "debug-error",async getMessages(error: string) {return [{role: "user",content: {type: "text",text: `这是我遇到的错误:${error}`}},{role: "assistant",content: {type: "text",text: "我会帮你分析这个错误。你尝试过哪些方法?"}},{role: "user",content: {type: "text",text: "我尝试过重启服务,但错误仍然存在。"}}];}};
示例实现
在 MCP 服务器中实现提示
TypeScript 实现:
import { Server } from "@modelcontextprotocol/sdk/server";import {ListPromptsRequestSchema,GetPromptRequestSchema} from "@modelcontextprotocol/sdk/types";const PROMPTS = {"git-commit": {name: "git-commit",description: "生成 Git 提交信息",arguments: [{name: "changes",description: "Git 差异(diff)或变更描述",required: true}]},"explain-code": {name: "explain-code",description: "解释代码的作用",arguments: [{name: "code",description: "需要解释的代码",required: true},{name: "language",description: "编程语言",required: false}]}};const server = new Server({name: "example-prompts-server",version: "1.0.0"}, {capabilities: {prompts: {}}});// 列出可用的提示server.setRequestHandler(ListPromptsRequestSchema, async () => {return {prompts: Object.values(PROMPTS)};});// 获取特定提示server.setRequestHandler(GetPromptRequestSchema, async (request) => {const prompt = PROMPTS[request.params.name];if (!prompt) {throw new Error(`未找到提示: ${request.params.name}`);}if (request.params.name === "git-commit") {return {messages: [{role: "user",content: {type: "text",text: `为以下变更生成一个简洁但描述性的提交信息:\n\n${request.params.arguments?.changes}`}}]};}if (request.params.name === "explain-code") {const language = request.params.arguments?.language || "未知";return {messages: [{role: "user",content: {type: "text",text: `解释这段 ${language} 代码的作用:\n\n${request.params.arguments?.code}`}}]};}throw new Error("未找到提示实现");});
最佳实践
- 使用清晰、描述性的提示名称
- 为提示和参数提供详细描述
- 验证所有必需参数
- 优雅地处理缺少参数的情况
- 考虑为提示模板添加版本控制
- 适当缓存动态内容
- 实现错误处理
- 记录参数格式
- 设计可组合的提示
- 测试各种输入情况
