{"_id":"@asenli/mcp-prompt-manager","_rev":"4-c6a0a9c512e899e7200ffe3d83a650ca","name":"@asenli/mcp-prompt-manager","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@asenli/mcp-prompt-manager","version":"1.0.0","keywords":["mcp","prompt","template"],"license":"MIT","_id":"@asenli/mcp-prompt-manager@1.0.0","maintainers":[{"name":"asenli","email":"xinxin.li@bangdao-tech.com"}],"bin":{"mcp-prompt-manager":"dist/index.js"},"dist":{"shasum":"6bb7c397a95ce8a71ea598bb0689e0ae71e0338e","tarball":"https://registry.npmjs.org/@asenli/mcp-prompt-manager/-/mcp-prompt-manager-1.0.0.tgz","fileCount":4,"integrity":"sha512-idDwrw1sytIDXKdwwISxxv7foPKv5d4O99vraY+1ZoBqjHQZ1O2+bsKAmZVZPEGrP8xrW/wovEiUT04yttzgCw==","signatures":[{"sig":"MEUCIQDJtlkKn90PRAggE1riFYO+XBeIF9ZlKF22Gs1klAI5dwIgcRzh4Z/9znxykMAIckY1gEb8Mg2PmiYJDXEsTo3rqr0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":53752},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"scripts":{"dev":"tsx src/index.ts","build":"tsup","start":"node dist/index.js","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"asenli","email":"xinxin.li@bangdao-tech.com"},"_npmVersion":"10.9.4","description":"MCP server for local prompt and template management (stdio)","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","typescript":"^5.7.2","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-prompt-manager_1.0.0_1777994630146_0.9780362547783257","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@asenli/mcp-prompt-manager","version":"1.0.1","keywords":["mcp","prompt","template"],"license":"MIT","_id":"@asenli/mcp-prompt-manager@1.0.1","maintainers":[{"name":"asenli","email":"xinxin.li@bangdao-tech.com"}],"bin":{"mcp-prompt-manager":"dist/index.js"},"dist":{"shasum":"750a93d479a42615eb0ee9f9f7503442a75e9030","tarball":"https://registry.npmjs.org/@asenli/mcp-prompt-manager/-/mcp-prompt-manager-1.0.1.tgz","fileCount":4,"integrity":"sha512-eqEEM/BJqV7hOT1kcZWHjtjlCq1dXDfxZcpd3FE+ZIuYydakLA1comuk4oRd/1FBfyJ5q/ymaoXcIo8S6mgCWg==","signatures":[{"sig":"MEYCIQDVko88siaOl6VdNwnBWjMiJI9jshr18tRRZP/wmUAQDAIhAOTa+RbAanie2/iJ5wRVZ+jOWnFjRwaB83/RpeyxKmoc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":56676},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"gitHead":"0d04a69990a8a36911c47a1112c56f5ab301ce75","scripts":{"dev":"tsx src/index.ts","build":"tsup","start":"node dist/index.js","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"asenli","email":"xinxin.li@bangdao-tech.com"},"_npmVersion":"10.9.4","description":"MCP server for local prompt and template management (stdio)","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"^1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","typescript":"^5.7.2","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-prompt-manager_1.0.1_1777995921256_0.8963554564585834","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@asenli/mcp-prompt-manager","version":"1.0.2","keywords":["mcp","prompt","template"],"license":"MIT","_id":"@asenli/mcp-prompt-manager@1.0.2","maintainers":[{"name":"asenli","email":"xinxin.li@bangdao-tech.com"}],"bin":{"mcp-prompt-manager":"dist/index.js"},"dist":{"shasum":"98cddadf0bab582a7ce969e1da5b5b6bc7bc6d58","tarball":"https://registry.npmjs.org/@asenli/mcp-prompt-manager/-/mcp-prompt-manager-1.0.2.tgz","fileCount":4,"integrity":"sha512-yIcCX0UBa6BvH4Q8OF/EBAeZPYwJCLMtBiwuGWfJ5j8/aoHmVNMXcZxHd6oqpVMlViWUySITSAhxp3yua6sPoQ==","signatures":[{"sig":"MEUCIQDl+xbgrwbH72FbIKZpDSa89L4WR0WkNevaSoyB0hGoRQIgFvGDYhcrF48LTc0HyyXb6kcHWrJCbnpxbukEWelWhaE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":290211},"main":"dist/index.js","type":"module","engines":{"node":">=20"},"gitHead":"0d04a69990a8a36911c47a1112c56f5ab301ce75","scripts":{"dev":"tsx src/index.ts","build":"tsup","start":"node dist/index.js","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"asenli","email":"xinxin.li@bangdao-tech.com"},"_npmVersion":"10.9.4","description":"MCP server for local prompt and template management (stdio)","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@modelcontextprotocol/sdk":"1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","typescript":"^5.7.2","@types/node":"^22.10.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-prompt-manager_1.0.2_1777996338553_0.8355864682277085","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@asenli/mcp-prompt-manager","version":"1.0.3","description":"MCP server for local prompt and template management (stdio)","type":"module","main":"dist/index.js","bin":{"mcp-prompt-manager":"dist/index.js"},"scripts":{"build":"tsup","prepublishOnly":"npm run build","start":"node dist/index.js","dev":"tsx src/index.ts","typecheck":"tsc --noEmit"},"engines":{"node":">=20"},"keywords":["mcp","prompt","template"],"license":"MIT","dependencies":{"@modelcontextprotocol/sdk":"1.12.0","zod":"^3.24.0"},"devDependencies":{"@types/node":"^22.10.0","tsup":"^8.3.5","tsx":"^4.19.2","typescript":"^5.7.2"},"_id":"@asenli/mcp-prompt-manager@1.0.3","gitHead":"0d04a69990a8a36911c47a1112c56f5ab301ce75","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-JkiUY2h2pVXSdJExoVxtWKvSHExad1E6Rf4fo2mdRV3LRmQpR7bgK0dQB7UxbGhCryUcnKz46pBfTZGlfWkUPQ==","shasum":"e7ef1f0c2e0274e07592074449f368966ed57c6c","tarball":"https://registry.npmjs.org/@asenli/mcp-prompt-manager/-/mcp-prompt-manager-1.0.3.tgz","fileCount":4,"unpackedSize":289620,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCrsnokWLDUAMky6rONXoqnJeRvWR7R+M1M99TOjiOzZQIhAJ4AI947FCsMDfoPoWTtaL34Ery033TOXSfzemA/eU9N"}]},"_npmUser":{"name":"asenli","email":"xinxin.li@bangdao-tech.com"},"directories":{},"maintainers":[{"name":"asenli","email":"xinxin.li@bangdao-tech.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-prompt-manager_1.0.3_1777996725859_0.14147259020312286"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-05T15:23:50.070Z","modified":"2026-05-05T15:58:46.115Z","1.0.0":"2026-05-05T15:23:50.297Z","1.0.1":"2026-05-05T15:45:21.405Z","1.0.2":"2026-05-05T15:52:18.697Z","1.0.3":"2026-05-05T15:58:45.995Z"},"license":"MIT","keywords":["mcp","prompt","template"],"description":"MCP server for local prompt and template management (stdio)","maintainers":[{"name":"asenli","email":"xinxin.li@bangdao-tech.com"}],"readme":"# @asenli/mcp-prompt-manager\n\n## 用途\n\n本仓库是一个基于 **Model Context Protocol（stdio）** 的 MCP 服务，在本地管理提示词与模板：增删改查、标签与关键词筛选、`{{variable}}` 形式的模板渲染，以及简单统计。数据可落在本机目录（JSON 文件）或仅存在进程内存中，由环境变量控制。\n\n适用场景：在 **Cursor**、**Claude Desktop** 等支持 MCP 的客户端里，让模型通过工具读写你的个人提示词库，而不把内容交给远端服务存储。\n\n## 前置条件\n\n- 本机安装 **Node.js 20 及以上**。\n\n## 接入方式\n\n在客户端的 MCP 配置里增加一个 server（以下为 JSON 片段，需合并进你现有的 `mcpServers` 对象中）。\n\n### 方式一：从 npm 运行（推荐）\n\n无需克隆仓库。将 `PROMPTS_DIR` 改为你本机用于存放数据的**绝对路径**（会写入 `prompts.json`）。\n\n```json\n{\n  \"mcpServers\": {\n    \"prompt-manager\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@asenli/mcp-prompt-manager\"],\n      \"env\": {\n        \"STORAGE_TYPE\": \"file\",\n        \"PROMPTS_DIR\": \"/你的/绝对路径/例如/prompt-data\"\n      }\n    }\n  }\n}\n```\n\n### 方式二：克隆仓库后本地运行\n\n先在仓库根目录执行 `npm install` 与 `npm run build`，把下面路径中的 **`/ABSOLUTE/PATH/TO/mcp-prompt-manager`** 换成你本机仓库的绝对路径。\n\n```json\n{\n  \"mcpServers\": {\n    \"prompt-manager\": {\n      \"command\": \"node\",\n      \"args\": [\"/ABSOLUTE/PATH/TO/mcp-prompt-manager/dist/index.js\"],\n      \"env\": {\n        \"STORAGE_TYPE\": \"file\",\n        \"PROMPTS_DIR\": \"/ABSOLUTE/PATH/TO/mcp-prompt-manager/data\"\n      }\n    }\n  }\n}\n```\n\n配置保存后，在客户端中**重启 MCP 或重载窗口**，确认该 server 已连接且无报错。\n\n### 环境变量说明\n\n| 变量 | 说明 | 默认 |\n|------|------|------|\n| `STORAGE_TYPE` | `file`：使用 `PROMPTS_DIR` 下的 `prompts.json`；`memory`：仅当前进程内，不落盘 | `file` |\n| `PROMPTS_DIR` | `STORAGE_TYPE=file` 时的数据目录 | `~/.mcp-prompt-manager/data` |\n| `LOG_LEVEL` | `info` 或 `debug`（`debug` 时会在 stderr 打印配置摘要） | `info` |\n\n## 如何使用\n\n连接成功后，你主要在**对话里用自然语言**描述需求即可；模型会按需调用下方工具。若你在 **MCP Inspector** 或其它客户端里手动测工具，可直接使用「工具名 + JSON 参数」形式。\n\n### 工具一览\n\n| 工具名 | 作用 |\n|--------|------|\n| `add_prompt` | 新建一条提示词或模板 |\n| `get_prompt` | 按 `id` 读取一条 |\n| `list_prompts` | 列表，支持标签、关键词子串、分类过滤 |\n| `update_prompt` | 按 `id` 部分更新；`category` 传 `null` 可清空分类 |\n| `delete_prompt` | 按 `id` 删除 |\n| `apply_template` | 将模板中的 `{{变量名}}` 替换为传入的值 |\n| `get_stats` | 总数、模板数、标签与分类计数 |\n\n成功时返回体一般为 `{ \"ok\": true, \"data\": ... }`；失败为 `ok: false` 与 `error` 说明。\n\n### 用自然语言可以怎么说（示例）\n\n下面这些话在 Cursor / Claude 里都可以直接说，由模型去选工具与填参数：\n\n- 「帮我加一条提示词，名字叫**代码评审清单**，内容是……，标签打上 `review` 和 `work`。」\n- 「建一个**邮件回复模板**，正文里用 `{{客户名}}`、`{{订单号}}` 占位，并标记为模板。」\n- 「列出我库里所有带 `review` 标签的条目。」\n- 「搜一下内容里包含 `SQL` 的提示词。」\n- 「把 id 为 `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` 的那条改名为**周报模板**。」\n- 「删掉 id 为 `…` 的那条。」\n- 「用我那条**邮件回复模板**渲染一版：`客户名` 填 ACME，`订单号` 填 10086。」\n- 「看一下当前库里的统计：一共多少条、多少模板、常用标签有哪些。」\n\n说明：`id` 是 UUID，通常来自你**新建**后模型返回的 `data.id`，或来自 `list_prompts` / `get_prompt` 的结果；记不清时可以让模型先 `list_prompts` 再操作。\n\n### 参数与返回示例（便于对照）\n\n**1. 新建普通提示词 `add_prompt`**\n\n```json\n{\n  \"name\": \"周报要点\",\n  \"content\": \"本周完成：\\n1. …\\n下周计划：\\n1. …\",\n  \"tags\": [\"work\", \"weekly\"],\n  \"category\": \"文档\"\n}\n```\n\n**2. 新建带占位的模板 `add_prompt`**\n\n正文里出现 `{{客户名}}` 即占位；建议 `isTemplate: true`，并可写变量说明（可选）：\n\n```json\n{\n  \"name\": \"客户跟进邮件\",\n  \"content\": \"尊敬的 {{客户名}}：\\n关于订单 {{订单号}}，我们已安排发货。\",\n  \"isTemplate\": true,\n  \"tags\": [\"email\", \"sales\"],\n  \"variables\": [\n    { \"name\": \"客户名\", \"type\": \"string\", \"required\": true, \"description\": \"客户称呼\" },\n    { \"name\": \"订单号\", \"type\": \"string\", \"required\": true }\n  ]\n}\n```\n\n返回里的 `data.id` 请保存好，后续 `get_prompt`、`apply_template`、`update_prompt`、`delete_prompt` 都要用它。\n\n**3. 列表与搜索 `list_prompts`**\n\n同时包含全部标签（默认 `tagsMatch` 为 `all`）：\n\n```json\n{\n  \"tags\": [\"work\", \"review\"],\n  \"tagsMatch\": \"all\"\n}\n```\n\n包含任一标签：\n\n```json\n{\n  \"tags\": [\"email\", \"sales\"],\n  \"tagsMatch\": \"any\"\n}\n```\n\n按名称或正文子串（不区分大小写）：\n\n```json\n{\n  \"search\": \"SQL\"\n}\n```\n\n按分类精确匹配：\n\n```json\n{\n  \"category\": \"文档\"\n}\n```\n\n**4. 读取单条 `get_prompt`**\n\n```json\n{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\"\n}\n```\n\n**5. 更新 `update_prompt`**\n\n只传需要改的字段，例如只改名称与标签：\n\n```json\n{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"name\": \"周报要点（修订）\",\n  \"tags\": [\"work\", \"weekly\", \"v2\"]\n}\n```\n\n清空分类：\n\n```json\n{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"category\": null\n}\n```\n\n**6. 渲染模板 `apply_template`**\n\n`variables` 的键名必须与正文里的 `{{键名}}` 一致（不含花括号）：\n\n```json\n{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n  \"variables\": {\n    \"客户名\": \"ACME 公司\",\n    \"订单号\": \"10086\"\n  }\n}\n```\n\n返回中的 `data.rendered` 为替换后的完整文本。若必填占位未给值，会返回错误说明。\n\n**7. 统计 `get_stats`**\n\n无参数，传空对象即可：\n\n```json\n{}\n```\n\n**8. 删除 `delete_prompt`**\n\n```json\n{\n  \"id\": \"550e8400-e29b-41d4-a716-446655440000\"\n}\n```\n\n### 数据与存储\n\n- `STORAGE_TYPE=file` 时，数据在 `PROMPTS_DIR` 下的 `prompts.json`；请定期备份该目录。\n- `STORAGE_TYPE=memory` 时数据仅在当前 MCP 进程内，**重启客户端或 server 即清空**，适合临时试验。\n\n## 许可\n\nMIT\n","readmeFilename":"README.md"}