【翻譯、轉載】MCP 提示 (Prompts)

原文地址:https://modelcontextprotocol.io/docs/concepts/prompts#python

---

提示 (Prompts)

創建可重用的提示模板和工作流

提示 (Prompts) 使服務器能夠定義可重用的提示模板和工作流,客戶端可以輕松地將其呈現給用戶和 LLM。它們提供了一種強大的方式來標準化和共享常見的 LLM 交互。

提示被設計為用戶控制 (user-controlled),這意味著它們從服務器暴露給客戶端,目的是讓用戶能夠顯式選擇它們來使用。

在這里插入圖片描述

概述

MCP 中的提示是預定義的模板,可以:

  • 接受動態參數 (arguments)
  • 包含來自資源 (resources) 的上下文
  • 鏈接多個交互
  • 指導特定的工作流
  • 作為 UI 元素呈現(例如斜杠命令)

在這里插入圖片描述

提示結構

每個提示都通過以下結構定義:

{name: string;              // 提示的唯一標識符description?: string;      // 人類可讀的描述arguments?: [              // 可選的參數列表{name: string;          // 參數標識符description?: string;  // 參數描述required?: boolean;    // 參數是否必需}]
}

發現提示

客戶端可以通過 prompts/list 端點發現可用的提示:

// 請求
{method: "prompts/list"
}// 響應
{prompts: [{name: "analyze-code",description: "分析代碼以尋找潛在改進", // Analyze code for potential improvementsarguments: [{name: "language",description: "編程語言", // Programming languagerequired: true}]}// ... 其他提示]
}

使用提示

要使用一個提示,客戶端發出 prompts/get 請求:

// 請求
{method: "prompts/get",params: {name: "analyze-code", // 要使用的提示名稱arguments: {         // 提供的參數language: "python"}}
}// 響應
{description: "分析 Python 代碼以尋找潛在改進", // Analyze Python code for potential improvementsmessages: [ // 生成的、準備發送給 LLM 的消息列表{role: "user", // 角色通常是 "user" 或 "assistant"content: {type: "text", // 內容類型,可以是 "text" 或 "resource"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": "分析項目日志和代碼", // Analyze project logs and code"arguments": [{"name": "timeframe","description": "要分析日志的時間段", // Time period to analyze logs"required": true},{"name": "fileUri","description": "要審查的代碼文件的 URI", // URI of code file to review"required": true}]
}

當處理 prompts/get 請求時,服務器可以動態獲取資源內容并將其嵌入到消息中:

// prompts/get 的響應
{"messages": [{"role": "user","content": {"type": "text","text": "請分析這些系統日志和代碼文件是否存在任何問題:" // Analyze these system logs and the code file for any issues:}},{"role": "user","content": {"type": "resource", // 內容類型為資源"resource": {      // 包含資源詳情"uri": "logs://recent?timeframe=1h", // 資源的 URI (可能是動態生成的)// 服務器動態獲取的資源內容"text": "[2024-03-14 15:32:11] ERROR: Connection timeout in network.py:127\n[2024-03-14 15:32:15] WARN: Retrying connection (attempt 2/3)\n[2024-03-14 15:32:20] ERROR: Max retries exceeded","mimeType": "text/plain"}}},{"role": "user","content": {"type": "resource","resource": {"uri": "file:///path/to/code.py", // 另一個資源的 URI// 該資源的內容"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    # Connection implementation\n    pass","mimeType": "text/x-python"}}}]
}

多步驟工作流

提示可以定義包含多個交互輪次的工作流:

// 服務器端的邏輯示例
const debugWorkflow = {name: "debug-error",async getMessages(error: string) {// 返回一個預設的對話流程return [{role: "user",content: {type: "text",text: `我遇到了這個錯誤:${error}` // Here's an error I'm seeing: ${error}}},{role: "assistant", // 預設的助手回應content: {type: "text",text: "我來幫你分析這個錯誤。你目前嘗試了哪些方法?" // I'll help analyze this error. What have you tried so far?}},{role: "user", // 預設的用戶后續輸入提示content: {type: "text",text: "我嘗試重啟了服務,但錯誤依舊存在。" // I've tried restarting the service, but the error persists.}}// ... 后續可以由 LLM 或用戶繼續];}
};

實現示例

這是一個在 MCP 服務器中實現提示的完整示例:

from mcp.server import Server
import mcp.types as types# Define available prompts
PROMPTS = {"git-commit": types.Prompt(name="git-commit",description="Generate a Git commit message",arguments=[types.PromptArgument(name="changes",description="Git diff or description of changes",required=True)],),"explain-code": types.Prompt(name="explain-code",description="Explain how code works",arguments=[types.PromptArgument(name="code",description="Code to explain",required=True),types.PromptArgument(name="language",description="Programming language",required=False)],)
}# Initialize server
app = Server("example-prompts-server")@app.list_prompts()
async def list_prompts() -> list[types.Prompt]:return list(PROMPTS.values())@app.get_prompt()
async def get_prompt(name: str, arguments: dict[str, str] | None = None
) -> types.GetPromptResult:if name not in PROMPTS:raise ValueError(f"Prompt not found: {name}")if name == "git-commit":changes = arguments.get("changes") if arguments else ""return types.GetPromptResult(messages=[types.PromptMessage(role="user",content=types.TextContent(type="text",text=f"Generate a concise but descriptive commit message "f"for these changes:\n\n{changes}"))])if name == "explain-code":code = arguments.get("code") if arguments else ""language = arguments.get("language", "Unknown") if arguments else "Unknown"return types.GetPromptResult(messages=[types.PromptMessage(role="user",content=types.TextContent(type="text",text=f"Explain how this {language} code works:\n\n{code}"))])raise ValueError("Prompt implementation not found")

最佳實踐

在實現提示時:

  1. 使用清晰、描述性的提示名稱
  2. 為提示和參數提供詳細的描述
  3. 驗證所有必需的參數
  4. 優雅地處理缺失的參數
  5. 考慮對提示模板進行版本控制
  6. 在適當時緩存動態內容
  7. 實現錯誤處理
  8. 記錄預期的參數格式
  9. 考慮提示的可組合性
  10. 使用各種輸入測試提示

UI 集成

提示可以在客戶端 UI 中呈現為:

  • 斜杠命令 (Slash commands)
  • 快捷操作 (Quick actions)
  • 上下文菜單項 (Context menu items)
  • 命令面板條目 (Command palette entries)
  • 引導式工作流 (Guided workflows)
  • 交互式表單 (Interactive forms)

更新與變更

服務器可以通知客戶端關于提示的變更:

  1. 服務器能力聲明:prompts.listChanged(表明服務器支持此通知)
  2. 通知消息:notifications/prompts/list_changed
  3. 客戶端收到通知后重新獲取提示列表

安全注意事項

在實現提示時:

  • 驗證所有參數
  • 凈化用戶輸入
  • 考慮速率限制
  • 實施訪問控制
  • 審計提示使用情況
  • 適當地處理敏感數據
  • 驗證生成的內容(如果適用)
  • 實現超時機制
  • 考慮提示注入 (prompt injection) 風險
  • 記錄安全要求

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79944.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

accept() reject() hide()

1. accept() 用途 確認操作:表示用戶完成了對話框的交互并確認了操作(如點擊“確定”按鈕)。 關閉模態對話框:結束 exec() 的事件循環,返回 QDialog::Accepted 結果碼。適用場景 模態對話框(通過 exec()…

如何查看電腦IP地址和歸屬地:全面指南

在數字化時代,了解自己電腦的IP地址和歸屬地信息變得越來越重要。無論是進行網絡故障排查、遠程辦公設置,還是出于網絡安全考慮,掌握這些基本信息都很有必要。本文將詳細介紹如何查看電腦的公網IP、內網IP以及歸屬地信息,并提供常…

基于python生成taskc語言文件--時間片輪詢

目錄 前言 utf-8 chinese GB2312 utf-8 排除task.c chinese GB2312 排除task.c 運行結果 前言 建議是把能正常工作的單個功能函數放到一起(就和放while函數里的程序一樣),程序會按順序自動配置。 不同的格式已經對應給出。 utf-8 impo…

Docker手動重構Nginx鏡像,融入Lua、Redis功能

核心內容:Docker重構Nginx鏡像,融入Lua、Redis功能 文章目錄 前言一、準備工作1、說明2、下載模塊3、Nginx配置文件3、Dockerfile配置文件3、準備工作全部結束 二、構建鏡像三、基于鏡像創建容器三、lua腳本的redis功能使用總結 前言 ???? ????…

DeepSeek+Excel:解鎖辦公效率新高度

目錄 一、引言:Excel 遇上 DeepSeek二、認識 DeepSeek:大模型中的得力助手2.1 DeepSeek 的技術架構與原理2.2 DeepSeek 在辦公場景中的獨特優勢 三、DeepSeek 與 Excel 結合的準備工作3.1 獲取 DeepSeek API Key3.2 配置 Excel 環境 四、DeepSeekExcel 實…

解決Vue2------You may use special comments to disable some warnings.問題

問題截圖 解決辦法 打開項目中.eslintrc.js在rules中,添加以下代碼,并extends的 vue/standard注釋掉 space-before-function-paren: 0, semi: off, quotes : off, comma-dangle : off, vue/comment-directive: off

數據集-目標檢測系列- 牙刷 檢測數據集 toothbrush >> DataBall

數據集-目標檢測系列- 牙刷 檢測數據集 toothbrush >> DataBall DataBall 助力快速掌握數據集的信息和使用方式。 貴在堅持! * 相關項目 1)數據集可視化項目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/over…

解決:前后端跨域請求

目錄 關于跨域請求出現的原因 同源策略 示例(跨域問題) 如何解決跨域請求 方法一:配置后端服務器以允許跨域請求(后端) 方法二:使用代理服務器(前端) 一 ,使用aja…

AI內容檢測的技術優勢與應用場景

隨著互聯網的普及和數字內容的爆發式增長,文本、圖片、音頻、視頻等多樣化內容已成為信息傳播的主要載體。然而,伴隨內容增長的是違法違規信息的泛濫,如涉黃、涉政、虛假廣告、惡意引流等,不僅威脅用戶體驗,還對平臺合…

DockerDesktop替換方案

背景 由于DockerDesktop并非開源軟件,如果在公司使用,可能就有一些限制,那是不是除了使用DockerDesktop外,就沒其它辦法了呢,現在咱們來說說替換方案。 WSL WSL是什么,可自行百度,這里引用WS…

『Linux_網絡』 基于狀態機的Connect斷線重連

客戶端會面臨服務器崩潰的情況, 我們可以試著寫一個客戶端重連的代碼, 模擬并理 解一些客戶端行為, 比如游戲客戶端等。 客戶端部分,我們本次采用狀態機的設計模式實現 下面是關于狀態機模式的介紹 狀態機模式 狀態機模式&…

5月6日日記

一點心得是 看通知要仔細認真,自己想問的問題要先看看通知或者文件中說了沒有,如果沒說再去問相關負責人。 上課的教室一定要看好,看準了再去。別像今天一樣先去了科技樓又去了工學館。 線代開課了。感覺總體還行,并不是很難。…

【算法專題十】哈希表

文章目錄 0.哈希表簡介1. 兩數之和1.1 題目1.2 思路1.3 代碼 2.判斷是否為字符重排2.1 題目2.2 思路2.3 代碼 3. leetcode.217.存在重復元素3.1 題目3.2 思路3.3 代碼 4. leetcode.219.存在重復的元素Ⅱ4.1 題目4.2 思路4.3 代碼 5. leetcode.49.字母異位詞分組5.1 題目5.2 思路…

【前綴和】矩陣區域和

文章目錄 1314. 矩陣區域和解題思路1314. 矩陣區域和 1314. 矩陣區域和 ? 給你一個 m x n 的矩陣 mat 和一個整數 k ,請你返回一個矩陣 answer ,其中每個 answer[i][j] 是所有滿足下述條件的元素 mat[r][c] 的和: i - k <= r <= i + k, j - k <= c <= j + k …

MyBatis的SQL映射文件中,`#`和`$`符號的區別

在MyBatis的SQL映射文件中,#和$符號用于處理SQL語句中的參數替換,但它們的工作方式和使用場景有所不同。 #{} 符號 預編譯參數:#{} 被用來作為預編譯SQL語句的占位符。這意味著MyBatis會將你傳入的參數設置為PreparedStatement的參數,從而防止SQL注入攻擊,并允許MyBatis對…

Linux中為某個進程臨時指定tmp目錄

起因&#xff1a; 在linux下編譯k8s&#xff0c;由于編譯的中間文件太多而系統的/tmp分區設置太小&#xff0c;導致編譯失敗&#xff0c;但自己不想或不能更改/tmp分區大小&#xff0c;所以只能通過其他方式解決。 現象&#xff1a; tmp分區大小&#xff1a; 解決方法&#x…

Tomcat中Web應用程序停止時為了防止內存泄漏,JDBC驅動程序被強制取消注冊出現原因

1.問題描述 本地Windows環境開發的Springboot項目同樣的mysql版本&#xff0c;jdk版本&#xff0c;tomcat版本&#xff0c;本地運行沒有任何問題&#xff0c;發布到阿里云服務器上時報以下問題&#xff1a; 06-May-2025 20:06:12.842 警告 [main] org.apache.catalina.loader…

主流國產大模型(以華為盤古大模型和騰訊混元大模型為例)API調用接口的具體參數和使用方法,包括Python和C++的示例代碼

以下是主流國產大模型&#xff08;以華為盤古大模型和騰訊混元大模型為例&#xff09;API調用接口的具體參數和使用方法&#xff0c;包括Python和C的示例代碼。 華為盤古大模型 API參數&#xff1a; - model&#xff1a;模型名稱&#xff0c;如pangu-nlp-large。 - messages&…

高效調用京東 API 實戰:商品詳情頁實時數據采集接口開發指南?

在當今數字化商業環境中&#xff0c;電商數據的實時獲取與分析對于企業的決策制定和市場競爭力提升至關重要。京東作為國內領先的電商平臺&#xff0c;提供了豐富的 API 接口&#xff0c;允許開發者高效地獲取商品詳情頁的實時數據。本文將詳細介紹如何通過實戰開發&#xff0c…

MFC自定義控件開發與使用指南

MFC自定義控件開發與使用指南 自定義控件、雙緩沖 1. 概述 MFC(Microsoft Foundation Classes)框架提供了豐富的內置控件,但在實際開發中,我們常常需要創建自定義控件來滿足特定的界面需求。本文將詳細介紹如何在MFC中開發自定義控件,并以CCustomTextControl為例,展示自…