PortfolioKB/mcp-safe-fetch

GitHub: PortfolioKB/mcp-safe-fetch

一个通过 MCP 暴露的注入感知型内容抓取器,为 AI Agent 抓取开放互联网内容时提供多层提示词注入防护、大小限制和并发安全的缓存机制。

Stars: 0 | Forks: 0

# mcp-safe-fetch ![测试](https://static.pigsec.cn/wp-content/uploads/repos/cas/6b/6b52945adbf8d9e421fe243515ae54cfbd3da263f16b1eabda37cdc0b797b8eb.svg) 一个具备注入防护意识的内容抓取器,通过 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绕过, 逆向工具