提示清理工具(MCP服务器)
TypeScript MCP服务器,提供提示清理工具和健康检查功能。所有提示均通过该服务器路由 cleaner,采用秘密遮蔽技术、结构化模式,并提供客户端友好的输出规范化。
特点/特性
- 工具
- health-pingliveness probe 返回 { ok: true }。 - cleaner清理原始提示;返回包含修正后的字符串、备注、开放问题、风险和删除内容的结构化JSON。
- 秘密编辑(或:秘密删节)敏感模式从日志和输出中被清除
src/redact.ts. - 输出归一化:
src/server.ts将内容转换为type: "json"对于拒绝JSON内容类型的客户端,转换为纯文本。 - 可配置的大型语言模型基础URL、API密钥、模型、超时、日志级别;可选本地仅强制执行。
- 确定性模型策略通过单一模型
LLM_MODEL默认情况下,不进行动态模型选择/列出。
要求
- Node.js 版本 >= 20
安装与构建
npm install
npm run build跑
- 开发人员(标准输入输出服务器):
npm run dev检查器(调试)
使用MCP Inspector在stdio上测试工具:
npm run inspect环境
通过(某种方式)进行配置 .env 或者环境变量:
LLM_API_BASE(字符串,默认http://localhost:1234/v1): 兼容OpenAI的基础URL。LLM_API_KEY(字符串,可选):API的承载令牌。LLM_MODEL(字符串,默认open/ai-gpt-oss-20b模型标识符已发送至API。LLM_TIMEOUT_MS(数字, 默认60000): 请求超时。LOG_LEVEL(error|warn|info|debug,默认info): 日志详细程度(将 JSON 日志输出到标准错误流)。ENFORCE_LOCAL_API(true|false,默认false): 如果true仅允许本地主机API。LLM_MAX_RETRIES(数字,默认1): 对于可重试的HTTP/网络错误,重试次数。RETOUCH_CONTENT_MAX_RETRIES(数字,默认1):当清理器返回非JSON内容时进行重试。LLM_BACKOFF_MS(数字,默认250): 初始退避延迟,单位为毫秒。LLM_BACKOFF_JITTER(0..1,默认0.2): 应用于退避的抖动因子。
示例 .env:
LLM_API_BASE=http://localhost:1234/v1
LLM_MODEL=open/ai-gpt-oss-20b
LLM_API_KEY=sk-xxxxx
LLM_TIMEOUT_MS=60000
LOG_LEVEL=info
ENFORCE_LOCAL_API=false
LLM_MAX_RETRIES=1
RETOUCH_CONTENT_MAX_RETRIES=1
LLM_BACKOFF_MS=250
LLM_BACKOFF_JITTER=0.2工具(API合约)
所有工具均遵循MCP工具的语义。内容以如下形式返回: [{ type: "json", json: }] 并归一化为 type: "text" 由服务器为需要的客户端提供。
- 健康监测
- 输入: {} - 输出: { ok: true }
- 清洁工
- 输入: { prompt: string, mode?: "code"|"general", temperature?: number } - 输出: { retouched: string, notes?: string[], openQuestions?: string[], risks?: string[], redactions?: ["[REDACTED]"][] } - 行为:应用来自(某处)的系统提示 prompts/cleaner.md调用已配置的大型语言模型(LLM),提取第一个JSON对象,使用Zod进行验证,并对敏感信息进行模糊处理。
- “sanitize-text”翻译成中文是“净化文本”或“清理文本”。这个短语通常用于描述对文本进行清理、过滤或规范化处理的过程,以去除不必要的字符、格式或潜在的安全风险 (的别名,或
cleaner)
- 与……相同的输入/输出模式和行为 cleaner针对那些关键词匹配“净化”、“个人可识别信息 (PII)”或“遮蔽”的代理进行暴露检测。
- 规范化提示(或:标准化提示) (别名、绰号
cleaner)
- 相同的输入/输出模式和行为 cleaner对于关键词匹配“标准化”、“格式化”或“预处理”的代理,已将其暴露出来。
每次调用API密钥覆盖
src/llm.ts 接受 apiKey 在每个调用的覆盖选项中;若无则回退到 LLM_API_KEY.
项目结构
src/server.tsMCP服务器布线、工具列表/调用、输出规范化、日志记录。src/tools.ts工具注册与调度。src/cleaner.ts更清洁的管道和JSON提取/验证。src/llm.ts带有超时、重试和错误规范化功能的LLM客户端。src/redact.ts秘密编辑工具。src/config.ts环境配置与验证。test/*.test.tsVitest 套件,涵盖工具、形状、清理器和健康检查功能。
测试
npm test设计决策
- 单一模式政策用途
LLM_MODEL来自环境;没有模型列表/选择工具以保持行为确定性并减少表面积。 - 输出归一化:
src/server.ts(使)转变;(使)皈依;(使)转换json满意于;乐于text对于拒绝使用JSON的客户端。 - 秘密编辑/秘密删节:
src/redact.ts从日志和输出中过滤掉敏感令牌。
故障排除
- 大型语言模型(LLM)超时增加
LLM_TIMEOUT_MS检查网络可达性至LLM_API_BASE。 - 来自清理器的非JSON数据最多重试次数为
RETOUCH_CONTENT_MAX_RETRIES如果持续存在,请减少temperature或者确保配置的模型符合输出约定。 - 来自LLM的HTTP 5xx状态码自动重试最多至
LLM_MAX_RETRIES使用指数退避(LLM_BACKOFF_MS,LLM_BACKOFF_JITTER)。 - 本地API强制执行错误如果
ENFORCE_LOCAL_API=true,LLM_API_BASE必须指向本地主机(localhost)。 - 日志/输出中的秘密编辑自动运行;如果看到泄露的标记,请更新模式以
src/redact.ts。
风帆冲浪(示例)
在Windsurf设置中添加一个MCP服务器,指向已构建的stdio服务器:
{
"mcpServers": {
"prompt-cleaner": {
"command": "node",
"args": ["/absolute/path/to/prompt-cleaner/dist/server.js"],
"env": {
"LLM_API_BASE": "http://localhost:1234/v1",
"LLM_API_KEY": "sk-xxxxx",
"LLM_MODEL": "open/ai-gpt-oss-20b",
"LLM_TIMEOUT_MS": "60000",
"LOG_LEVEL": "info",
"ENFORCE_LOCAL_API": "false",
"LLM_MAX_RETRIES": "1",
"RETOUCH_CONTENT_MAX_RETRIES": "1",
"LLM_BACKOFF_MS": "250",
"LLM_BACKOFF_JITTER": "0.2"
}
}
}
}用法:
- 在聊天中,要求客服使用
cleaner带着你原始的提示。 - 或者,如果您的设置中提供了访问权限,可以从代理用户界面调用工具。
大语言模型(LLM)API兼容性
- 与支持OpenAI兼容的聊天完成API(例如,LM Studio本地服务器)配合使用,这些API提供了
/v1/chat/completions。 - 通过(某种方式)进行配置
LLM_API_BASE并且可选LLM_API_KEY使用ENFORCE_LOCAL_API=true在开发时限制为本地主机。 - 设定;套装;一套
LLM_MODEL到特定提供者的模型标识符。此服务器遵循单模型策略以确保确定性和可重复性。 - 提供者必须返回有效的JSON;当内容不是严格的JSON格式时,清理程序会包含有限的重试机制。
链接
- 模型上下文协议(规范):https://modelcontextprotocol.io
- 更简洁的系统提示:
prompts/cleaner.md
注释
- 日志以 JSON 行的形式输出到标准错误输出,以避免干扰 MCP 的标准输入输出。
- 一些客户拒绝
json内容类型;此服务器将其规范化为text自动地。
安全
- 秘密被(彻底)清除/抹去
src/redact.ts来自日志和更干净的输出。 ENFORCE_LOCAL_API=true限制使用仅限于本地API端点。
