关于 Mcp Prompt Manager
Mcp Prompt Manager 是一个以 Git 为数据源的 MCP 服务,用于集中管理并向 AI 编辑器提供提示词模板。它支持 Handlebars 动态模板、分组筛选和无需重启的热加载,适合需要协作维护提示词的团队。
主要功能
- 01从 Git 仓库同步提示词
- 02Handlebars 模板与 Partials
- 03提示词热加载
- 04按组筛选提示词
- 05本地缓存与过期清理
- 06版本与状态管理
适用场景
- 01团队通过 Git 统一维护提示词
- 02在 Cursor 等客户端使用动态模板
- 03更新提示词而不重启服务
MCP 相关
它向 MCP 客户端提供 Git 仓库中的提示词模板,并支持通过客户端列出和使用提示词。README 提及 Cursor、Claude Desktop、VS Code 等客户端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
MCP 提示词管理器(Git 驱动)
📋 简介
这是一个由 Git 驱动的 Model Context Protocol(MCP)服务,旨在管理和提供提示词模板。它允许你将提示词存储在单独的 Git 仓库中,并通过 MCP 协议直接在 Cursor、Claude Desktop 等 AI 编辑器中使用。
主要优势:
- 🔄 团队协作:通过 Git 版本控制,确保团队使用统一的提示词版本
- 🎯 动态模板:支持 Handlebars 语法,可创建可复用的动态提示词
- 🚀 零停机重载:支持热重载,无需重启即可更新提示词
- 🔍 智能管理:内置提示词版本管理、状态跟踪和分组筛选
- 📊 完整监控:系统健康状态和提示词统计
✨ 功能特性
- Git 同步:直接从指定的 Git 仓库同步提示词,确保团队使用统一的提示词版本。
- Handlebars 模板:支持强大的 Handlebars 语法,可创建动态、可复用的提示词模板。
- Partials 支持:支持 Handlebars Partials,用于拆分和复用提示词片段(例如角色设定、输出格式)。
- 本地缓存:自动将 Git 仓库内容缓存到本地
.prompts_cache目录,以加快读取速度。 - 缓存过期策略:定期自动清理过期缓存项,防止内存泄漏并确保数据一致性。
- 分组筛选:支持按分组筛选提示词,只加载所需内容。
- 错误处理:提供完整的错误统计和报告,便于跟踪问题。
- 重试机制:自动重试 Git 操作,提升可靠性。
- 类型安全:使用 Zod 验证配置和提示词定义,确保类型安全。
- 专业日志记录:使用 pino 日志系统,支持结构化日志和多个日志级别。
🚀 快速开始
选项 1:从市场安装(最简单)
如果你从 MCP 市场(例如 mcp.so)安装,请遵循市场的安装说明。通常,你需要:
- 通过市场安装:使用市场的安装界面
- 配置你的 MCP 客户端:将服务配置添加到你的 MCP 客户端
前置条件
安装前,请确保你已具备:
- 已安装 Node.js(版本 18.0.0 或更高)
- pnpm 包管理器(版本 8.0.0 或更高)
- 一个包含提示词的 Git 仓库(或提示词的本地路径)
- 一个 兼容 MCP 的客户端(Cursor、Claude Desktop、VS Code 等)
安装步骤
-
从 Marketplace 安装:
- 访问你首选的 MCP marketplace
- 搜索 "mcp-prompt-manager"
- 按照 marketplace 的安装说明操作
- 记下服务的安装路径
-
查找安装路径:
- 从 marketplace 安装后,找到
dist/index.js所在的位置 - 通常位于全局 node_modules 目录或专用安装文件夹中
- 配置时需要使用此文件的绝对路径
- 从 marketplace 安装后,找到
-
配置 MCP 客户端:
- 打开 MCP 客户端的配置文件(文件位置请参阅配置部分)
- 添加服务配置(请参阅下方示例)
- 重要:使用绝对路径,而非相对路径
配置示例
安装后,使用以下配置来配置 MCP 客户端(Cursor、Claude Desktop 等):
适用于 Cursor(~/Library/Application Support/Cursor/User/globalStorage/cursor.mcp/mcp.json):
{
"mcpServers": {
"mcp-prompt-manager": {
"command": "node",
"args": ["/absolute/path/to/mcp-prompt-manager/dist/index.js"],
"env": {
"PROMPT_REPO_URL": "https://github.com/yourusername/your-prompts-repo.git",
"MCP_LANGUAGE": "en",
"MCP_GROUPS": "common",
"LOG_LEVEL": "info"
}
}
}
}
注意:将
/absolute/path/to/mcp-prompt-manager/dist/index.js替换为 marketplace 安装服务时使用的实际绝对路径。
提示:完整的配置模板请参阅 mcp.json.example。
查找安装路径
如果你不确定 marketplace 将服务安装在了哪里:
macOS/Linux:
# Search for the installed file
find ~ -name "index.js" -path "*/mcp-prompt-manager/dist/index.js" 2>/dev/null
# Or check common installation locations
ls -la ~/.local/share/mcp-prompt-manager/dist/index.js
ls -la /usr/local/lib/node_modules/mcp-prompt-manager/dist/index.js
Windows:
# Search for the installed file
Get-ChildItem -Path $env:USERPROFILE -Filter "index.js" -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.FullName -like "*mcp-prompt-manager\dist\index.js" }
验证
配置完成后:
- 完全重启 MCP 客户端
- 检查服务状态:
- 在 Cursor 中:按
Cmd/Ctrl + Shift + P,搜索 "MCP: Show servers" - 在 Claude Desktop 中:在设置里的 MCP 服务列表中检查
- 在 Cursor 中:按
- 确认提示词已加载:使用客户端的 MCP 工具列出可用提示词
不同 MCP 客户端的详细配置说明请参阅下方的配置部分。
选项 2:Docker 部署(推荐)
使用 Docker 是最简单的入门方式:
# 1. Clone the repository
git clone <project URL>
cd mcp-prompt-manager
# 2. Copy environment variables example
cp .env.docker.example .env
# 3. Edit .env and set your Git repository URL
# PROMPT_REPO_URL=https://github.com/yourusername/your-prompts-repo.git
# 4. Start with Docker Compose
docker-compose up -d
# 5. View logs
docker-compose logs -f
Docker 部署的详细说明请参阅 DOCKER.md。
选项 3:本地安装
此选项推荐用于开发,或希望完全掌控安装过程的情况。
前置条件
- Node.js 18.0.0 或更高版本
- pnpm 8.0.0 或更高版本(必需,npm/yarn 将无法使用)
- Git(用于克隆仓库)
安装步骤
- 克隆仓库:
git clone https://github.com/CarlLee1983/mcp-prompt-manager.git
cd mcp-prompt-manager
- 安装依赖:
# Use pnpm (required - npm/yarn will fail)
pnpm install
注意:安装必须使用 pnpm;由于预安装检查,npm/yarn 将无法使用。
- 构建项目:
pnpm run build
此操作会将 TypeScript 编译为 JavaScript,并输出到 dist/ 目录。
- 配置环境变量:
复制示例配置文件并创建 .env:
cp .env.example .env
编辑 .env 文件,设置 Prompt Git Repository 的路径或 URL:
# Git Repository source (required)
# Local path example
PROMPT_REPO_URL=/Users/yourname/Desktop/my-local-prompts
# Or remote Git URL examples
# PROMPT_REPO_URL=https://github.com/yourusername/my-prompts.git
# [email protected]:yourusername/my-prompts.git
# Output language setting (optional, default: en)
MCP_LANGUAGE=en # or zh
# Group filter setting (optional, defaults to loading only common group when not set)
# Example: MCP_GROUPS="laravel,vue,react"
# Note: When not set, the system will explicitly prompt in logs about using default groups
MCP_GROUPS=laravel,vue
# Custom storage directory (optional, default: .prompts_cache)
STORAGE_DIR=/custom/path
# Git branch (optional, default: main)
GIT_BRANCH=main
# Git retry count (optional, default: 3)
GIT_MAX_RETRIES=3
# Cache cleanup interval (optional, default: 10000 milliseconds)
# Set the interval time (in milliseconds) for periodic cleanup of expired cache items
# Default is 10 seconds (CACHE_TTL * 2) to ensure expired items are cleaned up promptly
# Recommended values: 5000-30000 milliseconds, adjust based on usage frequency
CACHE_CLEANUP_INTERVAL=10000
# Log level (optional)
# Options: fatal, error, warn, info, debug, trace, silent
# Notes:
# - stderr only outputs warn/error/fatal level logs (to avoid being marked as error)
# - info/debug/trace level logs only output to file (if LOG_FILE is set)
# - If LOG_FILE is not set, info level logs are completely suppressed (to avoid confusion)
# - Production environment defaults to warn (only warnings and errors), development defaults to info
# - Setting silent completely disables log output
LOG_LEVEL=info
# Log file path (optional, strongly recommended)
# After setting this variable, all level logs will be written to file (JSON format)
# stderr still only outputs warn/error/fatal (to avoid being marked as error)
# Can be absolute or relative path (relative to project root)
# Examples:
# LOG_FILE=/tmp/mcp-prompt-manager.log
# LOG_FILE=logs/mcp.log
# Note: File is written in append mode, will not overwrite existing content
# Recommendation: Set this variable to view complete logs (including info level)
LOG_FILE=logs/mcp.log
- 配置 MCP 客户端:
构建完成后,需要配置 MCP 客户端以使用本地安装的服务。路径如下:
/path/to/mcp-prompt-manager/dist/index.js
将 /path/to/mcp-prompt-manager 替换为克隆仓库时使用的实际绝对路径。
不同客户端的详细配置说明请参阅下方的配置部分。
快速开始(开发)
开发时,可以使用以下命令:
# Install dependencies
pnpm install
# Build the project
pnpm run build
# Start development server with Inspector
pnpm dev
# Run tests
pnpm test:run
# Lint code
pnpm lint
🛠️ 使用方法
使用 Inspector 测试
我们提供了一个便捷命令,用于启动 MCP Inspector 进行测试:
基本用法
重要:Inspector 运行的是编译后的 dist/index.js,因此如果你修改了源代码,需要先编译:
# 1. Compile first (if source code was modified)
pnpm run build
# 2. Start Inspector
pnpm run inspector
快速开发模式
开发时,可以使用组合命令,在启动 Inspector 前自动进行编译:
pnpm run inspector:dev
此命令会自动运行 build,然后启动 Inspector,确保你测试的是最新编译的代码。
Inspector 功能
Inspector 会启动一个 Web 界面,你可以在其中:
- 查看所有已加载的提示词
- 测试提示词输出
- 查看错误消息
- 验证环境变量设置
在 Cursor 中使用
配置文件位置
macOS:
~/Library/Application Support/Cursor/User/globalStorage/cursor.mcp/mcp.json
Windows:
%APPDATA%\Cursor\User\globalStorage\cursor.mcp\mcp.json
Linux:
~/.config/Cursor/User/globalStorage/cursor.mcp/mcp.json
配置步骤
-
找到配置文件:
- 方法 1:在 Cursor 中,按下
Cmd/Ctrl + Shift + P,搜索 “MCP: Add server” - 方法 2:直接编辑上述路径中的
mcp.json文件
- 方法 1:在 Cursor 中,按下
-
编辑配置文件:
{
"mcpServers": {
"mcp-prompt-manager": {
"command": "node",
"args": ["/path/to/mcp-prompt-manager/dist/index.js"],
"env": {
"PROMPT_REPO_URL": "/Users/yourname/Desktop/my-local-prompts",
"MCP_LANGUAGE": "zh",
"MCP_GROUPS": "laravel,vue"
}
}
}
}
-
重要配置说明:
command:使用node执行编译后的 JavaScript 文件args:必须是指向dist/index.js的绝对路径env:环境变量(可选,如果已在.env中设置)
-
验证配置:
- 重启 Cursor
- 在 Cursor 中,按下
Cmd/Ctrl + Shift + P,搜索 “MCP: Show servers” - 确认
mcp-prompt-manager显示为已连接
注意:
- 将
/path/to/mcp-prompt-manager替换为此项目的实际绝对路径- 如果环境变量已在
.env中设置,可以省略env块,但直接在 JSON 中指定通常更可靠- 如果配置文件不存在,则需要先创建
mcp.json文件
在 Claude Desktop 中使用
配置文件位置
macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Windows:
%APPDATA%\Claude\claude_desktop_config.json
Linux:
~/.config/Claude/claude_desktop_config.json
配置步骤
- 创建或编辑配置文件:
如果文件不存在,请先创建:
# macOS/Linux
mkdir -p ~/Library/Application\ Support/Claude
touch ~/Library/Application\ Support/Claude/claude_desktop_config.json
- 编辑配置文件:
{
"mcpServers": {
"mcp-prompt-manager": {
"command": "node",
"args": ["/path/to/mcp-prompt-manager/dist/index.js"],
"env": {
"PROMPT_REPO_URL": "/Users/yourname/Desktop/my-local-prompts",
"MCP_LANGUAGE": "zh",
"MCP_GROUPS": "laravel,vue"
}
}
}
}
- 验证配置:
- 完全关闭 Claude Desktop(确保所有窗口都已关闭)
- 重启 Claude Desktop
- 在对话中,Claude 应该能够使用你定义的提示词
注意:
- 配置文件必须采用有效的 JSON 格式
- 路径必须使用绝对路径
- 修改配置文件后,必须完全重启 Claude Desktop
在 VS Code 中使用(通过扩展)
VS Code 可通过 MCP 扩展使用 MCP 服务。
配置步骤
-
安装 MCP 扩展:
- 在 VS Code 扩展市场中搜索 “MCP” 或 “Model Context Protocol”
- 安装相应的扩展
-
配置 MCP 服务:
- 打开 VS Code 设置(
Cmd/Ctrl + ,) - 搜索与 “MCP” 相关的设置
- 或编辑
settings.json:
- 打开 VS Code 设置(
{
"mcp.servers": {
"mcp-prompt-manager": {
"command": "node",
"args": ["/absolute/path/to/mcp-prompt-manager/dist/index.js"],
"env": {
"PROMPT_REPO_URL": "/path/to/your/repo",
"MCP_LANGUAGE": "zh",
"MCP_GROUPS": "laravel,vue"
}
}
}
}
在 Continue 中使用
Continue 是一款支持 MCP 的开源 AI 编码助手。
配置文件位置
macOS:
~/.continue/config.json
Windows:
%APPDATA%\Continue\config.json
Linux:
~/.config/Continue/config.json
配置步骤
编辑 config.json:
{
"mcpServers": {
"mcp-prompt-manager": {
"command": "node",
"args": ["/absolute/path/to/mcp-prompt-manager/dist/index.js"],
"env": {
"PROMPT_REPO_URL": "/path/to/your/repo",
"MCP_LANGUAGE": "zh",
"MCP_GROUPS": "laravel,vue"
}
}
}
}
在 Aider 中使用
Aider 是一款支持 MCP 的 AI 代码编辑器。
配置方法
在 Aider 的配置文件中(通常为 ~/.aider/config.json,也可以通过环境变量配置):
{
"mcp_servers": {
"mcp-prompt-manager": {
"command": "node",
"args": ["/absolute/path/to/mcp-prompt-manager/dist/index.js"],
"env": {
"PROMPT_REPO_URL": "/path/to/your/repo"
}
}
}
}
在自定义应用中使用(编程方式)
如果你正在开发自己的应用并希望集成 MCP 服务,可以使用 MCP SDK:
TypeScript/JavaScript 示例
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js"
import { spawn } from "child_process"
// Create MCP Client
const client = new Client(
{
name: "my-app",
version: "1.0.0",
},
{
capabilities: {},
}
)
// Create transport (using stdio)
const transport = new StdioClientTransport({
command: "node",
args: ["/path/to/mcp-prompt-manager/dist/index.js"],
env: {
PROMPT_REPO_URL: "/path/to/repo",
MCP_LANGUAGE: "en",
},
})
// Connect
await client.connect(transport)
// List available prompts
const prompts = await client.listPrompts()
console.log("Available prompts:", prompts)
// Get specific prompt
const prompt = await client.getPrompt({
name: "code-review",
arguments: {
code: "const x = 1",
language: "TypeScript",
},
})
Python 示例
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
# Configure server parameters
server_params = StdioServerParameters(
command="node",
args=["/path/to/mcp-prompt-manager/dist/index.js"],
env={
"PROMPT_REPO_URL": "/path/to/repo",
"MCP_LANGUAGE": "en"
}
)
# Create session
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# Initialize
await session.initialize()
# List prompts
prompts = await session.list_prompts()
print(f"Available prompts: {prompts}")
# Get prompt
prompt = await session.get_prompt(
name="code-review",
arguments={
"code": "const x = 1",
"language": "TypeScript"
}
)
print(f"Prompt result: {prompt}")
MCP 客户端快速参考
| 客户端 | 配置文件位置 | 配置格式 | 备注 |
|---|---|---|---|
| Cursor | ~/Library/Application Support/Cursor/User/globalStorage/cursor.mcp/mcp.json (macOS) | mcpServers | 支持通过 UI 配置 |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) | mcpServers | 需要完全重启 |
| VS Code | settings.json | mcp.servers | 需要 MCP 扩展 |
| Continue | ~/.continue/config.json | mcpServers | 开源 AI 助手 |
| Aider | ~/.aider/config.json | mcp_servers | AI 代码编辑器 |
注意:路径中的
~表示用户主目录,展开后为:
- macOS/Linux:
/Users/username或/home/username- Windows:
C:\Users\username
通用配置格式
所有兼容 MCP 的客户端都遵循相同的配置格式:
{
"mcpServers": {
"mcp-prompt-manager": {
"command": "node",
"args": ["/absolute/path/to/mcp-prompt-manager/dist/index.js"],
"env": {
"PROMPT_REPO_URL": "your-repo-url-or-path",
"MCP_LANGUAGE": "en",
"MCP_GROUPS": "common",
"LOG_LEVEL": "info"
}
}
}
}
📝 环境变量参考
| 变量 | 必填 | 默认值 | 说明 |
|---|---|---|---|
PROMPT_REPO_URL | 是* | - | 主 Git 仓库 URL 或本地路径。(*如果未设置 PROMPT_REPO_URLS,则必填) |
PROMPT_REPO_URLS | 否 | - | 以逗号分隔的多个仓库 URL 列表(例如 url1,url2)。 |
SYSTEM_REPO_URL | 否 | - | 用于系统级提示词(例如通用提示词)的独立仓库 URL。 |
MCP_LANGUAGE | 否 | en | 输出语言。可选项:en、zh。 |
MCP_GROUPS | 否 | - | 要加载的提示词组列表,以逗号分隔(例如 laravel,vue)。如果未设置,则检查 System Repo 或使用默认行为。 |
TRANSPORT_TYPE | 否 | stdio | 通信方式。可选项:stdio、http、sse。 |
LOG_LEVEL | 否 | info | 日志详细程度。可选项:debug、info、warn、error、silent。 |
LOG_FILE | 否 | - | 日志文件写入路径(例如 logs/mcp.log)。强烈建议用于调试。 |
STORAGE_DIR | 否 | .prompts_cache | 用于存储克隆仓库的目录。 |
GIT_BRANCH | 否 | main | 要克隆的默认 Git 分支。 |
GIT_MAX_RETRIES | 否 | 3 | Git 操作失败时的重试次数。 |
GIT_POLLING_INTERVAL | 否 | 300000 | 在 WATCH_MODE=true 时检查更新的间隔(毫秒)。 |
WATCH_MODE | 否 | false | 检测到仓库变更时启用自动重新加载。 |
CACHE_PROVIDER | 否 | local | 缓存机制。可选项:local、redis。 |
CACHE_TTL | 否 | - | 缓存项的生存时间(可选)。 |
CACHE_CLEANUP_INTERVAL | 否 | 10000 | 清理过期缓存项的间隔(毫秒)。 |
安全注意事项:
- 切勿将
.env文件提交到版本控制中。.env.example文件仅作为模板提供。- 避免在
PROMPT_REPO_URL中硬编码敏感凭据(密码、令牌)。- 使用 SSH 密钥(
[email protected]...)进行安全的无密码身份验证。- 在生产环境中,请使用 Docker Secrets 或平台的密钥管理系统。
重要配置说明
- 绝对路径:配置 Cursor/Claude 等客户端时,
dist/index.js的路径必须是绝对路径。 - JSON 格式:确保配置文件是有效的 JSON(末尾不能有逗号)。
- 优先级:客户端配置 JSON 中定义的
env会覆盖.env文件。 - 重启:更改配置后,务必重启 AI 编辑器/客户端。
验证 MCP 服务是否正常运行
方法 1:使用 MCP Inspector
cd /path/to/mcp-prompt-manager
# If source code was modified, compile first
pnpm run build
# Start Inspector (or use inspector:dev for auto-compile)
pnpm run inspector
# or
pnpm run inspector:dev
这会启动一个 Web 界面,你可以在其中:
- 查看所有已加载的提示词
- 测试提示词输出
- 查看错误消息
注意:Inspector 会运行
dist/index.js,因此修改源代码后,必须先运行build,才能看到最新更改。
方法 2:检查日志
在配置文件中添加环境变量,以查看详细日志:
{
"mcpServers": {
"mcp-prompt-manager": {
"command": "node",
"args": ["/path/to/mcp-prompt-manager/dist/index.js"],
"env": {
"PROMPT_REPO_URL": "/path/to/repo",
"LOG_LEVEL": "debug"
}
}
}
}
然后查看客户端的日志输出(Cursor 的输出面板或 Claude Desktop 的日志)。
方法 3:检查文件系统
确认 Git 仓库已成功同步:
ls -la /path/to/mcp-prompt-manager/.prompts_cache
你应该能看到从 Git 仓库克隆的文件。
常见配置问题
问题 1:找不到配置文件
解决方案:
- 确认应用至少启动过一次(应用会自动创建配置目录)
- 手动创建配置文件和目录
- 检查路径是否正确(注意区分大小写和空格)
问题 2:JSON 格式错误
解决方案:
- 使用 JSON 验证工具检查格式(例如,JSONLint)
- 确保所有字符串都使用双引号
- 确保最后一项后没有逗号
问题 3:服务无法启动
解决方案:
- 确认
dist/index.js文件存在 - 确认路径是绝对路径
- 确认已安装 Node.js,且版本 >= 18
- 检查环境变量是否正确
- 检查客户端错误日志
问题 4:未找到提示词
解决方案:
- 确认
PROMPT_REPO_URL正确 - 检查
MCP_GROUPS设置是否包含你需要的分组- 注意:如果未设置
MCP_GROUPS,系统默认只加载common分组 - 检查日志消息,确认是否正在使用默认分组
- 设置
MCP_GROUPS=laravel,vue等以加载其他分组
- 注意:如果未设置
- 确认 Git 仓库包含
.yaml或.yml文件 - 使用
LOG_LEVEL=debug查看详细日志,并确认加载了哪些分组
📂 提示词仓库结构
你的提示词仓库(PROMPT_REPO_URL 指向的位置)应具有以下结构:
my-prompts/
├── partials/ # Store Handlebars partials (.hbs)
│ ├── role-expert.hbs
│ └── output-format.hbs
├── common/ # common group (always loaded)
│ ├── common-prompt.yaml
│ └── partials/
│ └── common-partial.hbs
├── laravel/ # laravel group (must be specified in MCP_GROUPS)
│ └── laravel-prompt.yaml
├── vue/ # vue group (must be specified in MCP_GROUPS)
│ └── vue-prompt.yaml
├── root-prompt.yaml # Root directory (always loaded)
└── another-prompt.yml
分组筛选规则
- 根目录(
/):始终加载 - common 分组(
common/):始终加载 - 其他分组:仅在
MCP_GROUPS环境变量中指定时加载
默认行为
当未设置 MCP_GROUPS 时:
- 系统自动加载
common分组(以及根目录中的提示词) - 启动日志会明确提示正在使用默认分组
- 日志会提示设置
MCP_GROUPS以加载更多分组
示例
MCP_GROUPS=laravel,vue→ 加载根目录、common、laravel、vueMCP_GROUPS=或未设置 → 仅加载根目录和 common(系统会提示正在使用默认分组)
提示词定义文件示例(.yaml)
id: "code-review"
title: "Code Review"
description: "Help me review code"
args:
code:
type: "string"
description: "Code to review"
language:
type: "string"
description: "Programming language"
template: |
{{> role-expert }}
You are a senior {{language}} engineer.
Please review the following code:
{{ code }}
参数类型
提示词支持三种参数类型:
string:字符串类型(默认)number:数字类型boolean:布尔类型
注册表功能(可选)
你可以在提示词仓库的根目录中创建 registry.yaml 文件,以集中管理提示词的可见性和弃用状态。
注册表文件格式
prompts:
- id: "code-review"
group: "common"
visibility: "public" # public, private, internal
deprecated: false
- id: "old-prompt"
visibility: "private"
deprecated: true
注册表字段说明
id:提示词 ID(必填)group:分组名称(可选)visibility:可见性设置public:公开(默认)private:私有internal:内部使用
deprecated:是否已弃用(默认值为false)
注册表用途
- 集中管理:在单个文件中管理所有提示词的可见性和弃用状态
- 覆盖默认值:可覆盖提示词定义文件中的默认设置
- 版本控制:通过 Git 跟踪提示词生命周期
注意:
registry.yaml是可选的。如果该文件不存在,系统将使用提示词定义文件中的默认值。
提示词运行时状态
每个提示词都有一个运行时状态(runtime_state),用于指示提示词当前是否可用:
active:活跃状态,提示词正常工作,可作为 MCP 工具使用legacy:旧版状态,提示词仍可用,但标记为旧版本,建议使用新版本invalid:无效状态,提示词定义存在问题(例如缺少必填字段、模板错误等),无法使用disabled:已禁用,提示词已明确禁用(例如在注册表中标记为弃用)warning:警告状态,提示词可以正常工作,但存在一些警告(例如版本过旧)
提示词来源
每个提示词都有一个来源(source)标签,用于指示元数据的来源:
embedded:元数据嵌入在提示词定义文件中(使用metadata:块)registry:来自registry.yaml的设置legacy:旧版模式,没有元数据,使用默认值
提示词状态
每个提示词都有一个状态(status),用于指示其开发阶段:
draft:草稿,正在开发中stable:稳定版本,可正常使用deprecated:已弃用,不建议使用legacy:旧版,仍可用,但建议升级
🔧 MCP 工具和资源
此项目提供多个 MCP 工具和资源,用于管理和查询提示词。
MCP 工具
1. mcp.reload / mcp.reload_prompts
无需重启服务即可重新加载所有提示词(热重载)。
- 功能:从 Git 仓库拉取最新更改、清除缓存,并重新加载所有 Handlebars 局部模板和提示词
- 参数:无
- 使用示例:
{ "tool": "mcp.reload", "arguments": {} }
2. mcp.stats / mcp.prompt.stats
获取提示词统计信息。
- 功能:返回所有提示词的统计信息,包括按运行时状态分类的数量(active、legacy、invalid、disabled、warning)
- 参数:无
- 返回内容:
total:总数active:活跃状态数量legacy:旧版状态数量invalid:无效状态数量disabled:已禁用数量warning:警告状态数量
3. mcp.list / mcp.prompt.list
使用多种筛选选项列出所有提示词。
- 功能:列出所有提示词运行时及其完整元数据信息
- 参数(可选):
status:按状态筛选(draft、stable、deprecated、legacy)group:按组名筛选tag:按标签筛选(提示词必须包含此标签)runtime_state:按运行时状态筛选(active、legacy、invalid、disabled、warning)
- 使用示例:
{ "tool": "mcp.list", "arguments": { "group": "laravel", "runtime_state": "active" } }
4. mcp.inspect
检查特定提示词的详细运行时信息。
- 功能:根据提示词 ID 获取完整的运行时元数据,包括状态、来源、版本、标签和用例
- 参数:
id:提示词 ID(必填)
- 使用示例:
{ "tool": "mcp.inspect", "arguments": { "id": "code-review" } }
5. mcp.repo.switch
切换到其他 Prompt 仓库并重新加载(零停机)。
- 功能:切换到新的 Git 仓库并重新加载所有提示词
- 参数:
repo_url:仓库 URL(必需)branch:分支名称(可选)
- 使用示例:
{ "tool": "mcp.repo.switch", "arguments": { "repo_url": "/path/to/new/repo", "branch": "main" } }
6. preview_prompt
使用给定参数预览/渲染提示词模板,而不执行它(调试工具)。
- 功能:使用给定参数渲染提示词模板,显示最终文本,但不会将其发送给大模型。可用于验证模板逻辑。
- 参数:
promptId:提示词 ID(必需,例如'laravel:code-review')args:包含模板参数/变量的 JSON 对象(必需)
- 返回值:
success:表示成功或失败的布尔值renderedText:渲染后的提示词文本highlightedText:以 Markdown 粗体突出显示变量的渲染文本statistics:包含renderedLength(字符数)和estimatedTokens(预估词元数)的对象warnings:架构验证警告数组(例如,缺少建议字段)
- 使用示例:
{ "tool": "preview_prompt", "arguments": { "promptId": "laravel:code-review", "args": { "code": "function test() { return true; }", "language": "php" } } } - 高级功能:
- 架构验证:根据提示词的 Zod 架构严格验证参数
- 词元估算:估算词元数量(支持英文和中文文本)
- 变量突出显示:使用 Markdown 粗体格式突出显示动态替换的变量
- 架构警告:检测并报告缺少的必需或建议字段
MCP 资源
1. system://health
系统运行状况资源。
- URI:
system://health - MIME 类型:
application/json - 内容:包含以下信息:
git:Git 仓库信息(URL、路径、HEAD 提交)prompts:提示词统计信息(总数、各状态数量、已加载数量、分组列表)registry:注册表状态(已启用、来源)cache:缓存信息(大小、清理间隔)system:系统信息(运行时间、内存使用情况)
2. prompts://list
提示词列表资源。
- URI:
prompts://list - MIME 类型:
application/json - 内容:所有提示词的完整元数据列表,包括:
id:提示词 IDtitle:标题version:版本status:状态runtime_state:运行时状态source:来源tags:标签数组use_cases:用例数组group:分组名称visibility:可见性
工具使用建议
- 开发期间:使用
mcp.reload快速重新加载提示词,无需重启服务 - 调试期间:使用
mcp.inspect检查特定提示词的详细信息,或使用preview_prompt测试模板渲染效果 - 监控期间:使用
mcp.stats和system://health资源监控系统状态 - 查询期间:使用带筛选条件的
mcp.list查找特定提示词 - 测试期间:使用
preview_prompt验证模板逻辑、检查词元数量,并在实际执行前查看变量替换结果
💻 开发指南
架构概览
MCP Prompt Manager 采用模块化架构,各部分职责划分清晰:
核心组件
-
仓库接口(
src/repositories/strategy.ts)- 不同仓库类型(Git、本地)的抽象接口
- 支持多个仓库策略,并按优先级加载
- 处理仓库同步和文件监视
-
源管理器(
src/services/sourceManager.ts)- 使用单例模式管理提示词生命周期
- 处理提示词的加载、缓存和注册
- 在加载时编译 Handlebars 模板,以提升性能
- 管理提示词运行时状态和元数据
-
缓存层(
src/cache/)- 支持本地缓存和 Redis(未来)的抽象缓存提供程序接口
- 支持 LRU 淘汰和 TTL 的本地缓存
- 自动清理过期缓存项
提示词存储流程
┌─────────────────────────────────────────────────────────────┐
│ Git Repository │
│ (Remote URL or Local Path) │
└────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Repository Strategy │
│ • GitRepositoryStrategy: Clone/Pull from remote │
│ • LocalRepositoryStrategy: Watch local file system │
└────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Local Storage (.prompts_cache) │
│ • Cached repository files │
│ • File system cache (TTL-based) │
└────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Source Manager │
│ 1. Scan YAML files │
│ 2. Parse prompt definitions │
│ 3. Compile Handlebars templates │
│ 4. Validate with Zod schemas │
│ 5. Cache compiled templates │
└────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ MCP Server │
│ • Register prompts as MCP Tools │
│ • Provide MCP Resources (health, list) │
│ • Handle tool invocations │
└────────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ MCP Clients │
│ (Cursor, Claude Desktop, etc.) │
└─────────────────────────────────────────────────────────────┘
关键模块
- 仓库接口:用于 Git 和本地仓库的抽象策略模式
- 源管理器:集中管理提示词生命周期并提供缓存
- 缓存提供程序:可插拔的缓存系统(本地内存或 Redis)
- 加载器:用于加载提示词和局部模板的高级 API
- MCP 工具:根据已加载的提示词动态注册工具
项目结构
mcp-prompt-manager/
├── src/
│ ├── index.ts # Main entry point
│ ├── config/
│ │ └── env.ts # Environment variable configuration and validation
│ ├── services/
│ │ ├── control.ts # MCP control tool handlers
│ │ ├── git.ts # Git sync service
│ │ ├── health.ts # Health status service
│ │ ├── loaders.ts # Prompt and Partials loader
│ │ └── sourceManager.ts # Core prompt lifecycle manager
│ ├── repositories/
│ │ ├── strategy.ts # Repository interface
│ │ ├── gitStrategy.ts # Git repository strategy
│ │ ├── localStrategy.ts # Local file system strategy
│ │ └── repoManager.ts # Repository manager
│ ├── cache/
│ │ ├── cacheProvider.ts # Cache interface
│ │ ├── localCache.ts # Local memory cache
│ │ └── cacheFactory.ts # Cache factory
│ ├── types/
│ │ ├── prompt.ts # Prompt type definitions
│ │ ├── promptMetadata.ts # Prompt metadata types
│ │ ├── promptRuntime.ts # Prompt runtime types
│ │ └── registry.ts # Registry type definitions
│ └── utils/
│ ├── fileSystem.ts # File system utilities (with cache)
│ ├── logger.ts # Logging utilities
│ ├── errorFormatter.ts # Error formatting utilities
│ └── repoConfig.ts # Repository configuration utilities
├── test/ # Test files
│ ├── config.test.ts
│ ├── loaders.test.ts
│ ├── sourceManager.test.ts
│ ├── cache.test.ts
│ ├── fileSystem.test.ts
│ └── integration.test.ts # Integration tests
├── dist/ # Compiled output
├── package.json
├── tsconfig.json
└── vitest.config.ts
常用命令
# Compile TypeScript
npm run build
# or
pnpm run build
# Start MCP Inspector for debugging
# Note: Need to run build first, or use inspector:dev for auto-compile
pnpm run build && pnpm run inspector
# or use development mode (auto-compile)
pnpm run inspector:dev
# Run tests
npm run test
# or
pnpm test
# Run tests (once)
npm run test:run
# or
pnpm test:run
# Open test UI
npm run test:ui
# or
pnpm test:ui
# Format code
npm run format
# or
pnpm format
# Check code format
npm run format:check
# or
pnpm format:check
开发工作流
- 在
src/目录中修改代码。 - 运行
pnpm run build重新编译(或使用pnpm run inspector:dev自动编译并测试)。 - 运行
pnpm run test执行测试。 - 使用
pnpm run inspector:dev验证更改(该命令会自动编译并启动 Inspector)。 - 在 Cursor 或 Claude Desktop 中重启 MCP Server 以应用更改。
重要说明:
inspector命令运行的是dist/index.js(编译后的文件)- 修改源代码后,必须先运行
build才能看到最新更改- 使用
inspector:dev可自动编译并启动,适合开发
提示词仓库验证
建议使用 @carllee1983/prompt-toolkit,在部署到 MCP Prompt Manager 之前验证提示词仓库。这有助于确保提示词质量,并在开发早期发现错误。
安装
# Install globally
npm install -g @carllee1983/prompt-toolkit
# or
pnpm add -g @carllee1983/prompt-toolkit
带验证的开发工作流
- 开发提示词:在仓库中创建和编辑提示词
- 本地验证:使用工具包在提交前进行验证
prompt-toolkit validate repo - CI/CD 验证:在 CI/CD 流水线中自动验证
prompt-toolkit validate repo --exit-code --severity error - 部署到 MCP Prompt Manager:MCP Prompt Manager 加载已验证的提示词
快速验证命令
# Validate entire repository
prompt-toolkit validate repo
# Validate with specific severity (show warnings and errors)
prompt-toolkit validate repo --severity warning
# Validate and exit with error code (for CI/CD)
prompt-toolkit validate repo --exit-code
# Validate single prompt file
prompt-toolkit validate file path/to/prompt.yaml
# Validate registry file
prompt-toolkit validate registry --repo-root /path/to/repo
# Validate partials directory
prompt-toolkit validate partials --partials-path partials
CI/CD 集成
将验证添加到 CI/CD 流水线中,以便在部署前发现错误:
# .github/workflows/validate-prompts.yml
name: Validate Prompts
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install prompt-toolkit
run: npm install -g @carllee1983/prompt-toolkit
- name: Validate repository
run: prompt-toolkit validate repo --exit-code --severity error
最佳实践
- ✅ 提交前验证:推送更改前在本地运行验证
- ✅ 使用 CI/CD:在 CI/CD 流水线中自动验证,以发现错误
- ✅ 监控结果:跟踪验证结果,维护仓库健康
- ✅ 按严重性筛选:使用
--severity选项聚焦关键问题 - ✅ JSON 输出:在 CI/CD 中使用
--format json输出机器可读的结果
编程式用法
也可以在脚本中以编程方式使用该工具包:
import { validatePromptRepo } from "@carllee1983/prompt-toolkit"
const result = validatePromptRepo("/path/to/prompt-repo")
if (result.success) {
console.log("Repository validation passed!")
} else {
console.error("Validation errors:", result.errors)
}
更多信息请参阅 prompt-toolkit 文档。
🧪 测试
项目包含一套完整的测试:
- 单元测试:多个测试文件覆盖所有核心功能
- 集成测试:针对提示词加载和 MCP 工具的端到端测试
- 总计:107 项测试,全部通过
运行测试:
# Watch mode
pnpm test
# Run once
pnpm test:run
# Open UI
pnpm test:ui
测试覆盖率
本项目通过全面的测试覆盖率来维持高代码质量,覆盖率阈值如下:
- 语句:≥ 80%
- 行:≥ 75%
- 函数:≥ 75%
- 分支:≥ 70%
注意:覆盖率报告使用
@vitest/coverage-v8,该工具要求 Node.js 19+。为维持代码质量,项目会强制执行覆盖率阈值。如果覆盖率低于阈值,测试将失败,以确保达到质量标准。
查看覆盖率报告
-
本地开发:运行
pnpm test:coverage生成覆盖率报告,或使用pnpm test:coverage:view在浏览器中自动打开 HTML 覆盖率报告。 -
CI/CD:运行
pnpm test:coverage:ci生成覆盖率报告并强制执行阈值。如果未达到覆盖率阈值,CI 流水线将失败,确保在合并或发布之前达到代码质量标准。 -
覆盖率报告:覆盖率报告以多种格式生成在
coverage/目录中:coverage/index.html- 交互式 HTML 报告coverage/coverage-final.json- 用于 CI 集成的 JSON 格式coverage/lcov.info- 用于覆盖率服务的 LCOV 格式
覆盖率命令
# Generate coverage report (local development)
pnpm test:coverage
# Generate coverage report with threshold enforcement (CI)
pnpm test:coverage:ci
# Generate coverage report and open HTML report
pnpm test:coverage:view
代码质量与 CI/CD
本项目通过多层检查来确保代码质量:
提交前钩子
使用 Husky 和 lint-staged 在每次提交前自动运行 lint 和格式化:
- ESLint:自动修复 TypeScript 文件中的 lint 问题
- Prettier:自动格式化代码,确保风格一致
- 类型安全:已启用 TypeScript 严格模式(
tsconfig.json中的strict: true)
提交前钩子仅对暂存文件运行,在维持代码质量的同时确保提交迅速完成。
持续集成(CI)
GitHub Actions CI 工作流会在每次推送和拉取请求时运行:
- Node.js 兼容性:针对 Node.js 16.x、18.x 和 20.x 运行测试
- Lint:ESLint 检查代码质量和风格
- 类型检查:TypeScript 类型检查(
tsc --noEmit) - 测试:运行完整测试套件并生成覆盖率报告
- 上传覆盖率报告:自动上传至 Codecov
拉取请求所需检查
为确保代码质量,合并 PR 前必须通过以下检查:
- Lint:必须通过所有 ESLint 规则检查
- 类型检查:TypeScript 编译必须成功且无错误
- 测试:所有测试必须通过,且达到覆盖率阈值
在 GitHub 中设置必需检查:
- 前往仓库设置
- 导航至 Branches → Branch protection rules
- 为主分支添加或编辑规则
- 在 Require status checks to pass before merging 下,启用:
Test (Node.js 16.x)或Test (Node.js 18.x)或Test (Node.js 20.x)(至少一项)- 这些检查将自动包含 lint、类型检查和测试步骤
如果其中任何检查失败,CI 工作流将自动失败,从而阻止合并不符合质量标准的代码。
🔧 配置
环境变量
| 变量名称 | 必填 | 默认值 | 描述 |
|---|---|---|---|
PROMPT_REPO_URL | ✅ | - | Git 仓库 URL 或本地路径 |
MCP_LANGUAGE | ❌ | en | 输出语言(en 或 zh) |
MCP_GROUPS | ❌ | common | 要加载的分组(以逗号分隔);未设置时,系统会询问默认行为 |
STORAGE_DIR | ❌ | .prompts_cache | 本地缓存目录 |
GIT_BRANCH | ❌ | main | Git 分支名称 |
GIT_MAX_RETRIES | ❌ | 3 | Git 操作的最大重试次数 |
CACHE_CLEANUP_INTERVAL | ❌ | 10000 | 缓存清理间隔(毫秒),用于定期清理过期的缓存项 |
LOG_LEVEL | ❌ | warn (prod) / info (dev) | 日志级别,生产环境默认仅输出警告和错误 |
缓存过期策略
系统使用基于 TTL 的定期清理机制管理文件列表缓存,以确保内存使用效率。
缓存机制
- 缓存 TTL:5 秒(硬编码)
- 清理间隔:默认 10 秒(
CACHE_TTL * 2),可通过CACHE_CLEANUP_INTERVAL环境变量调整 - 自动清理:应用启动时自动启动清理机制
- 优雅关闭:应用关闭时自动停止清理计时器
工作原理
- 创建缓存:调用
getFilesRecursively()时,扫描结果会缓存 5 秒 - 定期清理:每 10 秒(或按配置的间隔),自动扫描并删除过期缓存项
- 内存管理:防止缓存无限增长,避免内存泄漏
配置示例
# Set shorter cleanup interval (for testing)
CACHE_CLEANUP_INTERVAL=2000 # Cleanup every 2 seconds
# Set longer cleanup interval (for production, reduce cleanup frequency)
CACHE_CLEANUP_INTERVAL=30000 # Cleanup every 30 seconds
监控缓存状态
你可以通过日志查看缓存清理状态(需要设置 LOG_LEVEL=debug):
[DEBUG] Cache cleanup mechanism started { interval: 10000 }
[DEBUG] Cache cleanup completed { cleaned: 2 }
验证缓存机制
请参阅 CACHE_VERIFICATION.md,了解完整的验证方法和测试指南。
安全性
- ✅ 输入验证:使用 Zod 验证所有环境变量
- ✅ 路径安全:防止路径遍历攻击
- ✅ 分组验证:验证分组名称格式(仅允许字母、数字、下划线和连字符)
📝 日志记录
项目使用 pino 作为日志系统,支持结构化日志记录。
日志级别
fatal:导致程序退出的致命错误error:错误消息warn:警告消息info:常规信息debug:调试消息trace:跟踪消息silent:完全禁用日志输出
默认行为:
- 生产环境(未设置
NODE_ENV或其值不是development):默认为warn,仅输出警告和错误 - 开发环境(
NODE_ENV=development):默认为info,输出info级别及以上的所有日志 - 可通过
LOG_LEVEL环境变量覆盖默认值
设置日志级别
# Set in .env
LOG_LEVEL=debug
# Or set in environment variables
export LOG_LEVEL=debug
❓ 常见问题与故障排除
Q:如何安装 MCP Prompt Manager?
A:共有 3 种安装方式:
- 通过市场安装(最简单):从 mcp.so 等 MCP 市场安装
- Docker 部署(推荐用于生产环境):使用 Docker Compose 轻松部署
- 本地安装(用于开发):克隆仓库并在本地构建
详细说明请参阅快速入门部分。
Q:通过市场安装后,如何找到安装路径?
A:使用以下命令查找已安装的服务:
macOS/Linux:
find ~ -name "index.js" -path "*/mcp-prompt-manager/dist/index.js" 2>/dev/null
Windows:
Get-ChildItem -Path $env:USERPROFILE -Filter "index.js" -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.FullName -like "*mcp-prompt-manager\dist\index.js" }
Q:为什么配置中必须使用绝对路径?
A:MCP 客户端会将服务作为独立进程执行,因此需要完整路径来定位可执行文件。相对路径无法使用,因为工作目录可能不同。
Q:配置后,MCP 客户端中没有显示该服务。
A:请尝试以下步骤:
- 确认路径为绝对路径:检查
args是否包含完整的绝对路径,而不是相对路径 - 检查是否已安装 Node.js:运行
node --version,确认已安装 Node.js 18+ - 确认文件存在:确保指定路径下存在
dist/index.js - 检查 JSON 语法:确认配置文件是有效的 JSON(没有尾随逗号)
- 完全重启:完全关闭并重启 MCP 客户端(而不仅仅是重新加载)
- 检查日志:在配置中启用
LOG_LEVEL=debug,以查看详细的错误消息
Q:如何在本地运行服务?
A:开发时可以使用 pnpm dev(带检查器),生产模式下可以使用 pnpm start。更多详情请参阅 package.json 中的脚本。
Q:我遇到了 Git 克隆错误(退出代码 128)。
A:这通常表示权限问题或 URL 无效。
- SSH 与 HTTPS:如果使用 SSH(
[email protected]...),请确保 SSH 密钥已正确挂载或可用。如果使用 HTTPS,请确认是否需要令牌(如需要,请提供令牌)。 - 已知主机:如果在 Docker 中运行,请确保已运行
ssh-keyscan,或已挂载known_hosts文件。 - 仓库有效性:在你的机器上手动尝试
git clone <URL>,以验证 URL。
问题:Git 同步失败(一般情况)
解决方案:
- 检查
PROMPT_REPO_URL是否正确 - 确认网络连接正常
- 检查 Git 凭据是否正确
- 查看日志中的详细错误消息
问题:未加载提示词
解决方案:
- 检查
MCP_GROUPS设置是否正确 - 确认提示词文件位于正确的目录结构中(
prompts/<group>/...) - 检查 YAML 文件格式是否正确
- 查看日志中的错误消息
问题:无法使用局部模板
解决方案:
- 确认局部模板文件的扩展名为
.hbs - 确认局部模板位于
partials/目录中 - 检查局部模板文件内容是否正确
- 确认在模板中使用
{{> partial-name }}语法
📦 主要依赖项
- @modelcontextprotocol/sdk:MCP SDK,提供 MCP 服务核心功能
- handlebars:Handlebars 模板引擎,支持动态生成提示词
- simple-git:Git 操作库,用于同步 Git 仓库
- js-yaml:YAML 解析器,用于解析提示词定义文件
- zod:以 TypeScript 为先的架构验证库,用于配置和类型验证
- pino:高性能结构化日志记录库
- dotenv:环境变量加载工具
📚 相关资源
- Model Context Protocol 官方文档
- Handlebars 文档
- Zod 文档
- Simple Git 文档
- Pino 文档
- @carllee1983/prompt-toolkit - MCP 提示词仓库验证工具包
📄 许可证
ISC
🤝 参与贡献
欢迎提交 Issue 和 Pull Request!
版本:1.0.0
最后更新:2024-11-30
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。