PortfolioKB/mcp-safe-fetch
GitHub: PortfolioKB/mcp-safe-fetch
一个通过 MCP 暴露的注入感知型内容抓取器,为 AI Agent 抓取开放互联网内容时提供多层提示词注入防护、大小限制和并发安全的缓存机制。
Stars: 0 | Forks: 0
# mcp-safe-fetch

一个具备注入防护意识的内容抓取器,通过 Model Context Protocol 暴露。
读取开放互联网的 Agent 会读取到并非由你团队编写的内容。一个页面或帖子
可能包含一个伪造的闭合标签,紧随其后的是“忽略之前的指令并且...”。这个
服务器会抓取 URL,将其提取为纯文本,执行纵深防御清理,限制
大小,并缓存结果。它刻意保持小巧。它是一系列生产环境强化实战笔记的
参考实现,而不是一个框架。
## 为什么需要它
大多数 MCP 服务器是为演示而编写的:单一调用者,单一理想路径,没有不可信的输入,
也没有成本上限。在生产环境中,故障通常集中在三个方面,而这些
在第一天都不会显现出来:
- **不可信的内容。** 单一的标签剥离器看似安全,实则不然。Unicode 变体和
未闭合的标签可以直接穿透单一的正则表达式。
- **成本。** 无限制的响应体或过大的上下文意味着把钱浪费在无用的信息上。
- **并发。** 两个工具同时操作同一个 SQLite 文件会抛出 `database is locked` 错误。
这个服务器用你能在五分钟内读完的代码解决了上述三个问题。
## 它是如何工作的
`fetch_clean(url, max_chars=2500)` 返回经过清理、大小受限的文本,以及对
所执行操作的审计记录。这种防御依靠的是顺序,而非复杂的逻辑:
1. 首先通过字面量名称剥离注入包装器
2. 规范化 Unicode (NFKC),使得同形异义标签无处遁形
3. 移除 script 和 style 的内容主体,然后进行通用的标签剥离
4. 针对常见的指令覆盖短语设置的第二道防线
它使用 `[truncated]` 标记来限制输入大小(如果模型不得不忽略大部分的
输入,你就是在白白浪费钱),在入口处将每次调用的上限严格限制在硬性天花板之内,
并在以 `WAL` 和 `busy_timeout` 模式打开的 SQLite 中缓存结果,以便重叠的调用者
选择等待而不是崩溃。
## 安装
```
pip install -e .
```
## 运行
作为一个独立的 MCP 服务器 (stdio) 运行:
```
mcp-safe-fetch
```
通过将客户端指向
`mcp-safe-fetch` 命令,将其注册到 MCP 客户端(例如,Claude Code)中。该服务器暴露了一个工具,即 `fetch_clean`。
## 测试
```
pip install -e ".[dev]"
pytest
```
## 背后的实战笔记
其背后的推理,以及促使每种防御手段诞生的生产事故,都记录在
这里:这是一篇关于 MCP 强化(并发、提示词注入、成本)以及第 30 天之后会出现什么问题的短文。`src/mcp_safe_fetch/sanitize.py` 中的清理器正是
那篇文章中提到的原始函数。
## 许可证
MIT。
标签:MCP, Python, SSRF防护, 人工智能, 内容获取, 安全规则引擎, 提示词注入防御, 无后门, 用户模式Hook绕过, 逆向工具