使用说明
mcp安全获取
用于代理编码工具的确定性内容净化MCP服务器。在不可信内容进入LLM上下文之前,从不可信内容中删除提示注入向量。
三个与Claude Code原生核心接口相匹配的工具 WebFetch, Read,以及 Bash --兼容的参数,相同的输出格式——顶部有一个不可见的净化层。
safe_fetch替换WebFetch完全。网页总是不受信任的内容,safe_fetch提供了确定性的净化——循环中没有模型,没有提示注入的内容。safe_read用于读取不受信任的文件——克隆的存储库、下载的文件、供应商的依赖关系,以及任何你没有写的东西。您自己的源代码与本机兼容Read.safe_exec用于返回不受信任内容的命令--curl,gh pr view,git log在外部存储库上,npm info等等。正常的开发命令,如npm run build或git status不需要消毒。
默认情况下, init 只否认 WebFetch.本地人 Read 和 Bash 可供日常使用。使用 --strict 如果你想强制所有东西都通过安全工具。
为什么
克劳德代码 WebFetch 在内容到达您的上下文之前,通过Turndown和辅助LLM运行内容,但该管道不是作为安全边界设计的。拒绝删除结构化HTML(脚本、样式、导航),但文本级注入向量在转换后仍然存在:零宽度字符、假LLM分隔符、base64有效载荷、markdown溢出URL。使用LLM过滤对抗性内容是循环的——摘要模型正在处理旨在操纵它的精确有效载荷。
在Claude Code之外,问题更严重。API级别 web_fetch其他MCP客户端, curl 输出,克隆存储库——原始不受信任的内容进入LLM上下文,根本不进行任何清理。
mcp-safe-fetch 提供确定性净化——正则表达式、cheerio、字符串处理。循环中没有模型,没有提示注入的内容。
它剥去了什么
HTML级别:
- 隐藏元素--
display:none,visibility:hidden,opacity:0,[hidden] - 屏幕外元素--
position:absolute; left:-9999px,clip:rect(0,0,0,0),font-size:0 - 相同颜色的文本--
color:white; background:white(内联样式,约20种命名颜色+十六进制+rgb) - 危险标签--
<script>,<style>,<noscript>,<meta>,<link> - html注释
角色级别:
- 零宽度字符、软连字符、BOM、双向覆盖、变量选择器、标记字符
- 控制字符(保留
\n,\t,\r) - NFKC规范化(折叠全角和同形字符)
编码有效载荷:
- 解码为指令式文本的Base64字符串
- 十六进制编码指令序列
- 文本数据URI
结构注射:
- 假LLM分隔符--
<|im_start|>,[INST],<<SYS>>,\n\nHuman:等等。 - Markdown图像提取URL--
 - 自定义用户定义的图案
真实世界的结果
在4个实时网站上进行了测试:
| 站点 | 原始HTML令牌 | safe_fetch令牌 | 减少 | 发现威胁 |
|---|---|---|---|---|
| PayloadsAllTheThings | ~39500 | ~7800 | 80% | 3个隐藏元素,4个LLM分隔符 |
| FotMob新闻文章 | ~109500 | ~5900 | 95% | 32个脚本标签,90个样式标签 |
| Node.js文档 | ~75500 | ~2100 | 97% | 2个隐藏元素,1个屏幕外元素 |
| Express.js | ~9400 | ~1400 | 86% | 页面干净 |
与原始HTML相比,平均减少93%。零误报。 保留所有可见的页面内容。
安装
npx -y mcp-safe-fetch init
这将注册MCP服务器,自动允许安全工具,并拒绝本地工具 WebFetch.本地人 Read 和 Bash 可供日常使用。运行后重新启动Claude Code。
对于更严格的设置,您希望所有内容都经过消毒,也请拒绝 Read 和 Bash:
npx -y mcp-safe-fetch init --strict
注:
safe_exec消毒命令 输出 但不在Claude Code的沙盒中运行命令。在--strict模式下,您可以获得输出净化,但在命令执行时失去沙盒保护。
预览在不写任何东西的情况下会发生什么变化:
npx -y mcp-safe-fetch init --dry-run
推荐的CLAUDE.md规则
将此添加到您的 CLAUDE.md 所以克劳德知道什么时候使用安全工具:
## Web Fetching / Untrusted Content
When you need to fetch/read the content of a URL, always use the `safe_fetch` MCP tool. Do not use WebFetch, Playwright, or Chrome DevTools to load web pages.
When reading files from cloned repos, downloaded archives, or vendored dependencies, use `safe_read` instead of `Read`.
When running commands that return untrusted output (curl, gh pr view, git log on external repos), use `safe_exec` instead of `Bash`.
如果没有这些规则,Claude将默认为本地 Read 和 Bash 工具。 safe_fetch 自动工作,因为 init 否认 WebFetch但是 safe_read 和 safe_exec 需要使用明确的说明。
工具
safe_fetch --替换WebFetch
获取一个URL,并返回已删除注入向量的经过净化的markdown。这是一个完全的替代方案——网页总是不受信任的,所以没有理由使用本机 WebFetch.
| 参数 | 类型 | 说明 |
|---|---|---|
url |
string (必填) |
要获取的URL |
prompt |
string |
从页面中提取哪些信息 |
[safe-fetch] Stripped: 5 hidden elements, 68 script tags | 284127 → 12720 bytes (219ms)
Prompt: Extract the API pricing table
safe_read --Read的安全替代方案
读取文件并返回经过净化的内容,格式为 cat -n 输出。将其用于不受信任的文件——克隆的存储库、下载的文件、供应商的依赖关系。您自己的源代码与本机兼容 Read.
| 参数 | 类型 | 说明 |
|---|---|---|
file_path |
string (必填) |
文件的绝对路径 |
offset |
number |
起始行号(从1开始) |
limit |
number |
要返回的行数(默认值:2000) |
输出与本机读取工具完全匹配——右对齐的6个字符行号,制表符分隔符,行>2000个字符截断为 ....HTML文件(.html, .htm, .xhtml, .svg 或以开头的内容 <!DOCTYPE/<html>)通过完整的HTML净化管道进行路由。二进制文件被检测到并被拒绝。
[safe-read] Clean file | 1200 → 1200 bytes (3ms)
1 import express from 'express';
2 const app = express();
safe_exec --Bash的安全替代品
执行shell命令并返回经过净化的stdout/stderr。当命令输出可能包含不受信任的内容时使用此选项-- curl, gh pr view, git log 在外部存储库上, npm info等等。正常的开发命令,如 npm run build 或 git status 不需要这个。
| 参数 | 类型 | 说明 |
|---|---|---|
command |
string (必需) |
要执行的Shell命令 |
timeout |
number |
超时(毫秒)(默认值:120000,最大值:600000) |
description |
string |
命令的作用描述 |
超时默认值和上限与本机Bash工具匹配。如果命令输出看起来像HTML,则通过整个HTML管道(句柄 curl 返回原始页面等)。 timeout_ms 仍被接受为已弃用的别名。
[safe-exec] Show git status | Clean output | 245 → 245 bytes (12ms)
sanitize_stats
显示所有工具中当前会话的累积清理统计信息。
命令行界面
对任何URL进行测试净化:
npx -y mcp-safe-fetch test <url>
查看记录的净化运行的汇总统计数据:
npx -y mcp-safe-fetch stats
配置
可选。创建 .mcp-safe-fetch.json 在项目根目录或主目录中:
{
"logStripped": true,
"logFile": ".claude/sanitize.log",
"allowDataUris": false,
"maxBase64DecodeLength": 500,
"customPatterns": ["IGNORE ALL PREVIOUS"]
}
| 选项 | 默认值 | 描述 |
|---|---|---|
logStripped |
false |
将清理统计数据记录到JSONL文件中 |
logFile |
.claude/sanitize.log |
日志文件路径 |
logMaxBytes |
10485760 (10 MB) |
旋转前的最大日志文件大小 |
allowDataUris |
false |
允许通过以下方式使用文本/*数据URI |
maxBase64DecodeLength |
500 |
解码和检查的最大base64字符串长度 |
customPatterns |
[] |
要剥离的文字字符串(不区分大小写) |
运作原理
两条自动选择的消毒管道:
完整的HTML管道 (网页、HTML文件、类似HTML的命令输出):
文本管道 (源文件,纯命令输出):
- 去掉不可见的unicode字符,用NFKC规范化
- 检测并删除编码的有效载荷(base64、十六进制、数据URI)
- 检测并消除markdown图像中的渗透URL
- 去除假LLM分隔符和自定义图案
许可证
麻省理工学院