構建 MCP 服務器:第 3 部分 — 添加提示

這是我們構建 MCP 服務器的四部分教程的第三部分。在第一部分中,我們使用基本資源創建了第一個MCP 服務器;在第二部分中,我們添加了資源模板并改進了代碼組織。現在,我們將進一步重構代碼并添加提示功能。

什么是 MCP 提示?

MCP 中的提示符是服務器提供的結構化模板,用于標準化與語言模型的交互。與提供數據的資源或執行操作的工具不同,提示符定義了可重用的消息序列和工作流,有助于以一致、可預測的方式指導 LLM 行為。它們可以接受參數來自定義交互,同時保持標準化的結構。如果您曾經研究過提示符工程,那么您可能對提示符的概念已經有了相當的了解。在 MCP 服務器中創建這些提示符,使我們能夠為我們認為最有用的提示符創建一個空間,使其易于重用甚至共享。想象一下去餐廳,提示符就像一個菜單項,您可以從中挑選并提供給服務員。有時,您可以通過要求添加或刪除某些菜品或以特定方式烹飪來自定義菜單項。以這種方式提供的提示符具有類似的功能。

為什么要使用提示?

提示有助于為 LLM 交互創建一致、可重復使用的模式。以下是一些實際示例:

代碼審查提示

"name" -> code-review
Please review the following {{language}} code focusing on {{focusAreas}} for the following block of code:
```{{language}}
{{codeBlock}}
```

用戶:請檢查以下關注安全性和性能的 Python 代碼:
“Python
...代碼

數據分析提示

"name" -> analyze-sales-data
Analyze {{timeframe}} sales data focusing on {{metrics}}User: Analyze Q1 sales data focusing on revenue and growth

內容生成提示

"name" -> generate-email
Generate a {{tone}} {{type}} email for {{context}}

用戶:生成一封正式的支持電子郵件,以向 Bob's Barbecue LLC 提出退款請求。

代碼組織

在第二部分中,我們從 index.ts 中抽象出了處理程序代碼,并將其放入 handlers.ts 文件中。這個文件可能會變得過大。我們應該將處理程序代碼組織到各個模塊中:

// src/resources.ts
export const resources = [{uri: "hello://world",name: "Hello World Message",description: "A simple greeting message",mimeType: "text/plain",},
];export const resourceHandlers = {"hello://world": () => ({contents: [{uri: "hello://world",text: "Hello, World! This is my first MCP resource.",},],}),
};

// src/resource-templates.ts
export const resourceTemplates = [{uriTemplate: "greetings://{name}",name: "Personal Greeting",description: "A personalized greeting message",mimeType: "text/plain",},
];const greetingExp = /^greetings:\/\/(.+)$/;
const greetingMatchHandler =(uri: string, matchText: RegExpMatchArray) => () => {const name = decodeURIComponent(matchText[1]);return {contents: [{uri,text: `Hello, ${name}! Welcome to MCP.`,},],};};
export const getResourceTemplate = (uri: string) => {const greetingMatch = uri.match(greetingExp);if (greetingMatch) return greetingMatchHandler(uri, greetingMatch);
};

更新我們的處理程序:

// src/handlers.ts
import {ListResourcesRequestSchema,ListResourceTemplatesRequestSchema,ReadResourceRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { type Server } from "@modelcontextprotocol/sdk/server/index.js";
import { resourceHandlers, resources } from "./resources.js";
import {getResourceTemplate,resourceTemplates,
} from "./resource-templates.js";export const setupHandlers = (server: Server): void => {// List available resources when clients request themserver.setRequestHandler(ListResourcesRequestSchema,() => ({ resources }),);// Resource Templatesserver.setRequestHandler(ListResourceTemplatesRequestSchema, () => ({resourceTemplates,}));// Return resource content when clients request itserver.setRequestHandler(ReadResourceRequestSchema, (request) => {const { uri } = request.params ?? {};const resourceHandler =resourceHandlers[uri as keyof typeof resourceHandlers];if (resourceHandler) return resourceHandler();const resourceTemplateHandler = getResourceTemplate(uri);if (resourceTemplateHandler) return resourceTemplateHandler();throw new Error("Resource not found");});
};

添加提示

現在添加我們的新提示功能:

// src/prompts.ts
export const prompts = {"create-greeting": {name: "create-greeting",description: "Generate a customized greeting message",arguments: [{ name: "name",description: "Name of the person to greet",required: true,},{name: "style",description: "The style of greeting, such a formal, excited, or casual. If not specified casual will be used"}],},
};export const promptHandlers = {"create-greeting": ({ name, style = "casual" }: { name: string, style?: string }) => {return {messages: [{role: "user",content: {type: "text",text: `Please generate a greeting in ${style} style to ${name}.`,},},],};},
};

將我們的新提示處理程序添加到處理程序文件中:

// src/handlers.ts
import {GetPromptRequestSchema,ListPromptsRequestSchema,// ... other imports
} from "@modelcontextprotocol/sdk/types.js";
// ... other imports
import { promptHandlers, prompts } from "./prompts.js";export const setupHandlers = (server: Server): void => {// ... Other resource handlers here// Promptsserver.setRequestHandler(ListPromptsRequestSchema, () => ({prompts: Object.values(prompts),}));server.setRequestHandler(GetPromptRequestSchema, (request) => {const { name, arguments: args } = request.params;const promptHandler = promptHandlers[name as keyof typeof promptHandlers];if (promptHandler) return promptHandler(args as { name: string, style?: string });throw new Error("Prompt not found");});
};

最后,我們需要更新服務器初始化:

// src/index.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { setupHandlers } from "./handlers.js";const server = new Server({name: "hello-mcp",version: "1.0.0",},{capabilities: {prompts: {}, // <-- Add promptsresources: {},},},
);setupHandlers(server);// ... remaining code

理解代碼

模塊組織

  • 資源和模板已放置在各自的模塊中
  • 提示清晰地分開
  • 處理程序現在充當路由層

提示結構

  • 每個提示都有名稱、描述和參數(如果需要)
  • 參數描述提示的預期輸入
  • 處理程序生成結構化消息以提示目標 AI

消息序列

  • 提示返回消息數組
  • 消息具有角色(“用戶”或“助手”)
  • 內容可以包括多步驟工作流的初始請求和后續響應(請注意,目前多步驟工作流的支持有限)

使用檢查器進行測試

啟動檢查器:

npx @modelcontextprotocol/inspector node build/index.js

測試提示:

  • 點擊“提示”選項卡
  • 找到“create-greeting”
  • 嘗試不同的參數組合:
名字:“愛麗絲”,風格:“興奮”
{"messages": [{"role": "user","content": {"type": "text","text": "Please generate a greeting in excited style to Alice."}}]
}

使用 Claude Desktop 進行測試

嘗試以下示例:

基本提示:

1:打開Claude桌面
假設:

  • 您已經構建了服務器(npx tsc)并設置了 Claude Desktop來使用它。

2:與我們添加資源的方式類似,點擊“從 MCP 附加”

3:在模態彈出窗口中,點擊“選擇并集成”,然后從“hello-mcp”下的列表中選擇“create-greeting”提示

4:現在,只需輸入姓名即可進行測試。在姓名字段中輸入類似“John”的內容,然后點擊“提交”。

5:您將看到一個“create-greeting”附件。點擊它查看其中的內容。

6:您將看到這里有一個給克勞德的提示,上面寫著“請向約翰致以隨意的問候”。

7:無需輸入任何其他提示,只需單擊聊天框右上角的提交箭頭即可

8:您將看到類似“嗨,約翰!你今天過得怎么樣?”的回復。

樣式提示:

1:現在,嘗試使用不同的特定樣式創建問候語。打開“從 MCP 附加”對話框,然后再次選擇“創建問候語”提示。這次,我們可以添加名稱“Alice”和樣式“正式”,然后提交聊天。再次使用箭頭鍵,或者直接按 Enter 鍵也可以,我還沒試過。

2:這一次,您可能會看到返回如下消息:

親愛的愛麗絲,

祝您一切安好。謹致以最誠摯的問候。

謹致問候,
克勞德

下一步是什么?

在第 4 部分中,我們將:

  • 了解MCP 工具及其與提示的區別
  • 為我們的服務器添加工具功能
  • 了解工具如何提供動態功能
  • 使用所有主要的 MCP 功能完成我們的問候服務器

資料來源及其他閱讀材料:

  • Prompts - Model Context Protocol
  • GitHub - amidabuddha/unichat-mcp-server
  • Prompt engineering overview - Anthropic
  • 10 Prompt Engineering Best Practices - DEV Community
  • https://promptingguide.ai

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

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

相關文章

MySQL 索引優化(Explain執行計劃) 詳細講解

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 MySQL 索引優化&#xff08;Explain執行計劃…

使用 IntelliJ IDEA 安裝通義靈碼(TONGYI Lingma)插件,進行后端 Java Spring Boot 項目的用戶用例生成及常見問題處理

一、什么是通義靈碼&#xff08;TONGYI Lingma&#xff09;&#xff1f; 通義靈碼是阿里巴巴推出的智能代碼輔助工具&#xff0c;結合大模型技術&#xff0c;支持代碼生成、用例生成、代碼補全等功能&#xff0c;能極大提升開發效率。 二、在 IDEA 中安裝通義靈碼插件 打開 In…

AI編程在BOSS項目的實踐經驗分享

前言 在人工智能技術革新浪潮的推動下&#xff0c;智能編程助手正以前所未有的速度重塑開發領域。這些基于AI的代碼輔助工具通過智能提示生成、實時錯誤檢測和自動化重構等功能&#xff0c;顯著提升了軟件工程的全流程效率。無論是初入行業的開發者還是資深程序員&#xff0c;…

JVM 類加載器 詳解

類加載器 兩個類來源于同一個 Class文件&#xff0c;被同一個Java虛擬機加載&#xff0c;只要加載它們的類加載器不同&#xff0c;那這兩個類就必定不相等 這里所指的“相等”&#xff0c;包括代表類的Class對象的equals()方法、isAssignableFrom()方法、isInstance()方法的返…

Javascript 編程基礎(5)面向對象 | 5.1、構造函數實例化對象

文章目錄 一、構造函數實例化對象1、基本語法2、構造函數與原型的關系3、完整的原型鏈4、構造函數的特點5、prototype與__proto__屬性5.1、對象實例的__proto__屬性5.2、prototype屬性僅存在于函數對象5.3、實例與原型的關系5.4、獲取對象原型 6、注意事項 前言&#xff1a; 在…

自動駕駛科普(百度Apollo)學習筆記

1. 寫在前面 在過去的幾年里&#xff0c;自動駕駛技術取得飛速發展&#xff0c;人類社會正逐漸走向一個新時代&#xff0c;這個時代中&#xff0c;汽車不僅僅是一個交通工具&#xff0c;更是一個智能的、能夠感知環境、做出決策并自主導航的機器伙伴。現在正好也從事這塊的工作…

Windows應用-音視頻捕獲

下載“Windows應用-音視頻捕獲”項目 本應用可以同時捕獲4個視頻源和4個音頻源&#xff0c;可以監視視頻源圖像&#xff0c;監聽音頻源&#xff1b;可以將視頻源圖像寫入MP4文件&#xff0c;將音頻源寫入MP3或WAV文件&#xff1b;還可以錄制系統播放的聲音。本應用使用MFC對話框…

MATLAB生成大規模無線通信網絡拓撲(任意節點數量)

功能&#xff1a; 生成任意節點數量的網絡拓撲&#xff0c;符合現實世界節點空間分布和連接規律 效果&#xff1a; 30節點&#xff1a; 100節點&#xff1a; 500節點&#xff1a; 程序&#xff1a; %創建時間&#xff1a;2025年6月8日 %zhouzhichao %自然生長出n節點的網絡% …

TDengine 開發指南—— UDF函數

UDF 簡介 在某些應用場景中&#xff0c;應用邏輯需要的查詢功能無法直接使用內置函數來實現&#xff0c;TDengine 允許編寫用戶自定義函數&#xff08;UDF&#xff09;&#xff0c;以便解決特殊應用場景中的使用需求。UDF 在集群中注冊成功后&#xff0c;可以像系統內置函數一…

C#提取CAN ASC文件時間戳:實現與性能優化

C#提取CAN ASC文件時間戳&#xff1a;實現與性能優化 在汽車電子和工業控制領域&#xff0c;CAN總線是最常用的通信協議之一。而ASC&#xff08;ASCII&#xff09;文件作為CAN總線數據的標準日志格式&#xff0c;廣泛應用于數據記錄和分析場景。本文將深入探討如何高效地從CAN…

計算機網絡基礎總結:TCP/IP 模型、TCP vs UDP、DNS 查詢過程

在學習計算機網絡的過程中&#xff0c;理解 TCP/IP 模型與 OSI 模型的對應關系、掌握 TCP 與 UDP 的區別&#xff0c;以及熟悉 DNS 的查詢過程&#xff0c;是打好網絡基礎的關鍵。本文將圍繞這三部分進行簡明扼要的講解。 一、TCP/IP 模型與 OSI 七層模型的對應關系 1. OSI 七…

基于PHP的扎染文創產品商城

有需要請加文章底部Q哦 可遠程調試 基于PHP的扎染文創產品商城 一 介紹 扎染文創產品商城系統基于原生PHP開發&#xff0c;數據庫mysql&#xff0c;前端bootstrap&#xff0c;jquery.js等。系統角色分為用戶和管理員。 技術棧&#xff1a;phpmysqlbootstrapphpstudyvscode 二…

數據庫學習(三)——MySQL鎖

一、MySQL鎖 當多個用戶或進程并發操作數據庫時&#xff0c;為了避免數據沖突、臟讀、不可重復讀、幻讀等問題&#xff0c;數據庫通過鎖機制來保證數據的一致性和完整性。 MySQL 鎖的總體分類&#xff1a; 分類維度類型說明按作用對象表級鎖&#xff08;Table Lock&#xff…

<3>-MySQL表的操作

目錄 一&#xff0c;創建表 二&#xff0c;查看表結構 三&#xff0c;修改表 四&#xff0c;刪除表 一&#xff0c;創建表 語法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校驗規則 eng…

【OSG學習筆記】Day 15: 路徑動畫與相機漫游

本章來學習下漫游相機。 路徑動畫與相機漫游 本屆內容比較簡單&#xff0c;其實就是實現物體的運動和相機的運動 當然這兩個要一起執行。 貝塞爾曲線 貝塞爾曲線&#xff08;Bzier curve&#xff09;是一種在計算機圖形學、動畫制作、工業設計等領域廣泛應用的參數曲線&am…

LabVIEW自感現象遠程實驗平臺

LabVIEW開發自感現象遠程實驗平臺&#xff0c;通過整合 NI數據采集設備、菲尼克斯&#xff08;Phoenix Contact&#xff09;繼電器模塊及羅技&#xff08;Logitech&#xff09;高清攝像頭&#xff0c;實現遠程數據采集、儀器控制與實時監控三大核心功能。平臺突破傳統實驗裝置局…

數據結構——F/圖

一、圖的基本概念 圖是由頂點集合及頂點間的關系組成的一種數據結構&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 頂點集合V {x|x屬于某個數據對象集}是有窮非空集合&#xff1b; E {(x,y)|x,y屬于V}或者E {<x, y>|x,y屬于V && Path(x, y)…

springcloud openfeign 偶現 Caused by: java.net.UnknownHostException

背景 最近查看日志發現某服務偶現Caused by: java.net.UnknownHostException 同時查看eureka的access.log 出現如下異常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…

第12篇:數據庫中間件日志設計與追蹤系統落地實踐

12.1 引言&#xff1a;中間件日志系統為何如此關鍵&#xff1f; 數據庫中間件作為連接前端應用與后端數據庫的“網關”&#xff0c;承載著路由、負載均衡、SQL 改寫、權限控制等復雜邏輯。 在出現 性能問題、故障排查、安全審計 等場景中&#xff0c;若沒有完善的日志體系&am…

OpenAI對抗法庭命令:捍衛ChatGPT用戶隱私之戰

人工智能公司OpenAI近期正積極對抗一項涉及隱私問題的法庭命令。該命令要求OpenAI保留所有ChatGPT用戶日志&#xff0c;包括已刪除的對話記錄以及通過API調用生成的聊天內容。 命令背后的真實動機 值得注意的是&#xff0c;法院發布這一指令并非出于對用戶隱私或內容安全的考…