hob_hunt_mcp
基于Playwright构建的用于网络搜索和页面获取的统一MCP服务器。
两个工具。一个浏览器进程。没有冗余。
______________________________________________________________________
工具
hunt_site
使用隐藏的Playwright浏览器获取一个或多个网页。处理JavaScript渲染的内容、重定向、反机器人检测和延迟加载的内容。单个URL或多个URL——始终传递一个数组。
两种模式:
- 获取 *(默认)* --以干净的Markdown(或原始HTML)形式返回页面内容。
- 地图 --返回页面上发现的所有URL的JSON列表。在决定取什么之前,这对现场探索很有用。
集 pages 大于1则遵循相同域链接的广度优先,最多可达那么多总页面——这是一个轻量级的网站抓取,没有任何额外的依赖关系。
相同URL和选项的结果会缓存在会话的内存中(5分钟TTL),因此在单个代理运行中重复获取是即时的。
hunt_search
使用具有类似人类导航和持久会话状态的隐形浏览器并行执行一个或多个谷歌搜索。一次传递多个查询,并在单个结构化JSON响应中获取所有结果。
集 fetchTopN 自动获取每个查询前N个结果页的内容并将其附加到响应中——一次性搜索和阅读。提取的页面始终在沙盒中 EXTERNAL CONTENT 分隔符。
在首次运行新IP时,谷歌可能会显示验证码。运行一次预热脚本(见下文)以创建一个有效的会话文件——所有未来的无头搜索都会自动使用它。
______________________________________________________________________
快速开始
1.安装依赖项
npm install2.安装Playwright浏览器
npm run install-browser3.建造
npm run build4.预热搜索会话(仅限第一次)
这将打开一个可见的浏览器窗口,并运行真正的谷歌搜索来为持久会话文件添加种子。只做一次——在此之后的所有无头搜索都使用保存的会话。
node test/warmup_search.mjs如果谷歌在浏览器窗口中显示验证码,请手动解决。脚本最多等待两分钟,然后保存会话并关闭。
5.在MCP客户端中进行配置
克劳德桌面版 — %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"hob_hunt": {
"command": "node",
"args": ["C:/c/apps/servers/hob_hunt_mcp/build/index.js"]
}
}
}调试模式 (打开可见浏览器——可用于诊断验证码或检查页面):
{
"mcpServers": {
"hob_hunt": {
"command": "node",
"args": ["C:/c/apps/servers/hob_hunt_mcp/build/index.js", "--debug"]
}
}
}______________________________________________________________________
工具参考
hunt_site
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
urls | string[] | *(必填)* | 要获取的URL。并行获取多个URL。 |
mode | string | "fetch" | fetch =返回内容; map =返回发现的URL |
pages | number | 1 | 相同域链接后每个起始URL可抓取的最大页面数(1-20) |
timeout | number | 30000 | 页面加载超时(毫秒) |
waitUntil | string | "load" | 导航信号: load, domcontentloaded, networkidle, commit |
extractContent | boolean | true | 通过可读性条带导航/广告;仅返回主要内容 |
maxLength | number | 0 | 将输出截断为这么多字符(0=无限制) |
returnHtml | boolean | false | 返回原始HTML而不是Markdown |
selector | string | "" | CSS选择器——仅提取匹配的元素(空=整页) |
waitForSelector | string | "" | 在提取之前等待此CSS选择器出现 |
scrollToBottom | boolean | false | 自动滚动以触发延迟加载内容 |
extractLinks | boolean | false | 添加页面上所有出站链接的列表 |
sandbox | boolean | false | 包裹输出 EXTERNAL CONTENT 安全分隔符 |
waitForNavigation | boolean | false | 初始加载后等待第二次导航 |
navigationTimeout | number | 10000 | 额外导航等待超时(毫秒) |
disableMedia | boolean | true | 阻止图像、样式表、字体和媒体 |
debug | boolean | false | 显示浏览器窗口 |
返回(获取模式): 页面内容为Markdown(或HTML),前缀为标题和URL。多个页面由水平规则分隔。
返回(地图模式): JSON-- { source, links: string[] }
______________________________________________________________________
hunt_search
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
queries | string[] | *(必填)* | 并行运行的搜索查询 |
limit | number | 10 | 每次查询的最大结果数(最多100个) |
timeout | number | 60000 | 页面加载超时(毫秒) |
fetchTopN | number | 0 | 自动获取每个查询的前N个结果页并附加内容(0-5) |
noSaveState | boolean | false | 跳过保存/加载持久浏览器会话 |
locale | string | "en-US" | BCP-47结果区域设置 |
debug | boolean | false | 显示浏览器窗口(用于手动解决验证码) |
stateDir | string | *(见下文)* | 持久浏览器会话文件目录 |
退货: JSON-- { searches: [{ query, results: [{ title, link, snippet }] }] }
随着 fetchTopN >0,还返回附加在JSON下面的提取的页面内容部分,每个部分都包装在 EXTERNAL CONTENT 安全分隔符。
默认 stateDir: C:/c/apps/servers/hob_hunt_mcp/browser-state
______________________________________________________________________
为什么选择统一服务器?
hunt_search 和 hunt_site 共享相同的Playwright Chromium依赖项和相同的隐形浏览器单例。将它们作为单独的服务器运行意味着两个浏览器进程和两个MCP配置条目。把它们放在一起意味着每一个——更瘦、更快、更整洁。
______________________________________________________________________
需求
- Node.js 18或更高版本
- npm
______________________________________________________________________
发展
# Watch mode (auto-rebuild on save)
npm run dev
# Build
npm run build
# Run integration tests
node test/run_tests.mjs
# Warm up search session (first time)
node test/warmup_search.mjs
# Diagnose Google DOM structure (if search returns 0 results)
node test/diagnose_google.mjs______________________________________________________________________
许可证
麻省理工学院
______________________________________________________________________
万分感谢
该项目直接建立在两个优秀的开源MCP服务器的肩膀上 周周:
- g-search-mcp --谷歌搜索工具
hunt_search源自于 - 菲彻mcp --剧作家获取服务器
hunt_site源自于
两者都经过精心设计,有据可查,并得到积极维护。指纹识别、隐形浏览器管理、会话持久性和多选择器提取策略使该服务器在现实世界中实际工作,所有这些都可以追溯到jae-jae的原始实现。如果你在这里找到了价值,请考虑在这些存储库中突出显示。如果没有他们,这一切都不会存在——我这么说是因为我刚开始时并不完全理解我在做什么。
