网页搜索与页面抓取服务

一个基于Playwright的统一MCP服务器,提供网页搜索和页面抓取功能,支持JavaScript渲染内容和反爬虫检测。

  • by Corykidios
  • TypeScript
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 Corykidios/hob_hunt_mcp

使用说明

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 install

2.安装Playwright浏览器

npm run install-browser

3.建造

npm run build

4.预热搜索会话(仅限第一次)

这将打开一个可见的浏览器窗口,并运行真正的谷歌搜索来为持久会话文件添加种子。只做一次——在此之后的所有无头搜索都使用保存的会话。

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的原始实现。如果你在这里找到了价值,请考虑在这些存储库中突出显示。如果没有他们,这一切都不会存在——我这么说是因为我刚开始时并不完全理解我在做什么。