我把一个仅限Claude Code使用的网页阅读器变成了一个普通的MCP服务器
我在用智能体构建应用时反复遇到同一个问题:
页面是公开的,浏览器能正常读取,但我的智能体却会被拦截、重定向、限流,或者只拿到一个空壳 HTML,毫无有用内容。
这个领域已经有一个有趣的项目:insane-search。它设计巧妙、手段积极、也很实用,但原始工作流是围绕 Claude Code 设计的。
我希望将同样的公开网页韧性能力做成一个标准的 MCP 服务器,这样任何兼容 MCP 的客户端都能调用它。
于是就有了 unlimited-search。

unlimited-search 是一个 Python 命令行工具和 MCP 服务器,用于在普通直接抓取不够用时读取公开网页内容。它整合了平台公开路由、浏览器级 HTTP 身份、内容回退、公开存档回退以及媒体元数据提取,全部封装在一个本地工具中。
它专为需要从公开 URL 获取可用文本的智能体和自动化任务而设计。它不用于绕过登录、付费墙、验证码、私有网络、账户限制、IP 封禁或访问控制。
快速开始
前置条件:Python 3.12 或更新版本。
python -m pip install unlimited-search
unlimited-search read https://en.wikipedia.org/wiki/OpenAI --max-content-chars 800
该命令返回包含页面内容、判定结果、请求元数据和尝试追踪的 JSON。
对于 MCP 客户端,安装该包并注册 stdio 服务器:
{
mcpServers: {
unlimited-search: {
command: unlimited-search,
args: [serve]
}
}
}
概览
unlimited-search 是一个 Python 命令行工具和 MCP 服务器,通过多种公开路由和回退机制读取公开网页内容。
它可以:
- 读取单个公开 URL
- 在一次 MCP 调用中读取多个公开 URL
- 诊断页面难以访问的原因
- 使用 yt-dlp 提取公开媒体元数据
- 通过公开平台路由、浏览器级 HTTP 抓取、公开存档、订阅源和元数据提取进行回退
它不尝试绕过登录、付费墙、验证码、私有网络、账户限制或真正的访问控制。
安装
python -m pip install unlimited-search
然后将其添加到你的 MCP 客户端:
{
mcpServers: {
unlimited-search: {
command: unlimited-search,
args: [serve]
}
}
}
重启你的 MCP 客户端,你应该会获得以下工具:
- read_public_url
- read_public_urls
- diagnose_access
- extract_media
快速测试
你也可以直接从终端使用它:
unlimited-search read https://example.com --max-content-chars 1000
unlimited-search diagnose https://example.com
输出为 JSON,包含恢复的内容、最终 URL、判定结果、元数据和尝试追踪。
为什么构建它
大多数智能体擅长在文本进入上下文后对其进行推理。
麻烦的部分在于获取文本。
现代公开网站并不一致:
- 有些提供有用的公开 API
- 有些几乎完全在客户端渲染
- 有些暴露 RSS 或 Atom 订阅源
- 有些包含 Open Graph 或 JSON-LD 元数据但 HTML 内容单薄
- 有些只有使用浏览器级 TLS 身份才能正常工作
- 有些通过公开存档快照更容易读取
- 有些媒体页面更适合作为元数据处理,而非原始 HTML
因此,unlimited-search 不假设每个 URL 都一样,而是采用分层策略。
工作原理
对于给定的 URL,读取器首先尝试侵入性最小的公开路由:
- 针对 Reddit、X/Twitter、YouTube 元数据、Bluesky、Mastodon、Hacker News、Stack Overflow、Wikipedia、GitHub、npm、PyPI、Naver Blog、Google Scholar、Amazon 等网站的平台特定公开路由。
- 使用多种身份、URL 变体、引用策略和 HTTP 传输回退的浏览器级 HTTP 抓取。
- 内容回退,如 Jina Reader JSON、RSS/Atom 发现、常见订阅源路径、OGP、JSON-LD、Schema.org 和 Next.js 元数据。
- 通过 Wayback 和 archive.today/archive.ph 尽力而为快照的公开存档回退。
- 通过 yt-dlp 对公开媒体 URL 进行媒体元数据提取。
每个结果都包含一个判定结果:
- strong_ok:高置信度的公开路由成功
- weak_ok:内容已恢复,但可能不完整或基于回退
- suspect_ok:找到了有用内容,但调用方应检查其可靠性
- 针对被拦截、不安全、仅登录、验证码、私有网络或不可用结果的失败判定
示例 MCP 调用
向你的 MCP 客户端发出类似请求:
使用 unlimited-search 读取这个公开 URL 并总结页面内容:
https://example.com
在后台,模型可以调用:
{
url: https://example.com,
max_content_chars: 4000
}
并返回内容及追踪信息,而不是静默失败。
它与普通抓取有何不同?
普通抓取问的是:
我能 GET 这个 URL 吗?
unlimited-search 问的是:
是否存在一条合法的公开路由,能从这个 URL 获取有用的文本?
这种区别对智能体工作流至关重要。
如果直接 HTML 抓取失败,该工具可以尝试公开 API。如果页面元数据丰富但内容稀少,它可以提取元数据。如果实时页面不稳定,它可以尝试公开存档路由。如果页面是媒体内容,它可以返回结构化的媒体元数据,而不是倾倒一个巨大的 HTML 空壳。
目标不是追求神奇,而是追求实用。
安全边界
这一点很重要:unlimited-search 是一个公开内容读取器。
当目标需要以下条件时,它会停止:
- 身份验证
- 付费
- 验证码
- 私有网络访问
- 账户特定授权
- 硬性反滥用绕过
它还会默认拒绝私有地址、回环地址、链路本地地址、组播地址、保留地址和元数据服务目标。
这个边界使该工具对智能体有用,而不会变成绕过工具。
insane-search 的启发
我喜欢 insane-search 的理念:让公开网页读取对智能体工作流更可靠。
区别在于打包方式和接口。
unlimited-search 不将工作流绑定到单一智能体环境,而是将能力暴露为标准的 MCP 服务器:
- 通过 pip 安装
- 通过 stdio 运行
- 从任何兼容 MCP 的客户端调用
- 检查追踪和判定结果
- 在不需要 MCP 时作为命令行工具使用
这使得它更容易接入不同的本地智能体设置。
试试看
python -m pip install unlimited-search
unlimited-search read https://dev.to --max-content-chars 1500
GitHub:
https://github.com/flyingsquirrel0419/unlimited-search
PyPI:
https://pypi.org/project/unlimited-search/
如果这个工具能让你免于再写一个脆弱的页面抓取工具,一个 GitHub 星标将有助于项目被发现。
如果你在某个奇怪的公开网站上测试它,我很想听听哪些成功了、哪些失败了、以及下一步应该添加什么回退机制。