Command Palette

Search for a command to run...

UnylyUnyly
Весь каталог

PhantomHand

БесплатноНе проверен

A minimalist browser control engine that allows LLM agents to visually perceive and interact with web pages through the Chrome DevTools Protocol and MCP standar

GitHubEmbed

Описание

A minimalist browser control engine that allows LLM agents to visually perceive and interact with web pages through the Chrome DevTools Protocol and MCP standard.

README

PhantomHand 是一个面向 AI 智能体的浏览器控制引擎。它通过 Chrome DevTools ProtocolModel Context Protocol (MCP) 标准把浏览器的感知与操控能力暴露给大语言模型,让智能体能像人一样视觉理解网页,并真实地点击、输入、采集信息。

所有命令默认作用于浏览器的当前激活标签页,也可通过显式 tabId 参数指定任意标签页。


核心特性

  • 复用已登录的真实浏览器:直接在你的日常 Chrome 上操作,保留登录态、插件、书签——无需另开隔离 profile。
  • 真视觉感知:Set-of-Mark 标注截图,能识别 canvas、视频、复杂 CSS 渲染的内容(纯无障碍树看不到的)。
  • 稳定 ref 引用:每个可交互元素分配稳定的 ref,操控时解析其当前坐标,页面轻微重排也不会失效。
  • 拟人与反检测:贝塞尔鼠标轨迹、人类化打字节奏、点击前瞄准停顿;基于 chrome.debugger 而非 WebDriver,并自动在页面主世界抹除自动化指纹。
  • 信息密度优先:文本快照、批量结构化提取、页面智能摘要、页面身份 API 请求;大体积产物默认存盘或摘要,不回流上下文。
  • 可观测性:console、网络请求、性能指标、Web Storage 全量回流。

快速使用

在你的 AI Agent(Claude Desktop、Cursor、Windsurf、Antigravity 等)的 MCP 配置中注册 phantom-hand。两种部署方式任选其一。

A. 从 npm 安装(已发布)

{
  "mcpServers": {
    "phantom-hand": {
      "command": "npx",
      "args": ["-y", "phantom-hand-mcp"]
    }
  }
}

B. 从本地源码运行(开发 / 未发布)

克隆仓库后先构建,再用产物的绝对路径注册:

npm install && npm run build
{
  "mcpServers": {
    "phantom-hand": {
      "command": "node",
      "args": ["<项目根目录的绝对路径>/dist/index.cjs"]
    }
  }
}

各 Agent 的配置文件位置

Agent 配置文件
Claude Desktop(Windows) %APPDATA%\Claude\claude_desktop_config.json
Claude Desktop(macOS) ~/Library/Application Support/Claude/claude_desktop_config.json
Cursor 工作区 .cursor/mcp.json,或设置中的 MCP GUI
Windsurf ~/.codeium/windsurf/mcp_config.json
Antigravity ~/.gemini/config/mcp_config.json

保存并重启 Agent,服务会在后台启动并监听 ws://localhost:37210


安装浏览器扩展(必需)

PhantomHand 通过一个浏览器扩展与 Chrome 通信,需手动加载一次:

  1. 让你的 AI 助手调用 get_extension_info 工具,获取本机扩展目录的绝对路径(位于 ~/.npm/_npx/.../extension)。
  2. 打开 chrome://extensions/,开启右上角「开发者模式」,点击「加载已解压的扩展程序」,选中上一步的目录。
  3. 点击浏览器工具栏的 PhantomHand 图标,URL 保持默认 ws://localhost:37210,点击「Connect to Agent Server」,指示灯变绿即连接成功。

工具清单

分类 工具
元信息 get_extension_info
感知 browser_scanbrowser_snapshot(文本快照,无图)、browser_screenshotbrowser_get_page_infobrowser_query_ref(按 selector 精确取 ref)
鼠标 browser_clickbrowser_click_refbrowser_double_clickbrowser_triple_clickbrowser_right_clickbrowser_hoverbrowser_drag
键盘 / 剪贴板 browser_typebrowser_type_refbrowser_press_keybrowser_keyboard_shortcutbrowser_select_allbrowser_clipboard_setbrowser_clipboard_get
滚动 browser_scrollbrowser_scroll_to_element
DOM / JS browser_eval_jsbrowser_get_htmlbrowser_extract_textbrowser_get_attributesbrowser_extract_structured(批量 → JSON)、browser_read_page(主内容智能摘要)
表单 browser_set_valuebrowser_clear_valuebrowser_select_optionbrowser_checkbrowser_focusbrowser_upload_file
标签页 / 导航 browser_navigatebrowser_go_backbrowser_go_forwardbrowser_reloadbrowser_tab_newbrowser_tab_closebrowser_tab_listbrowser_tab_switch
可观测性 · debug browser_list_console_messages
可观测性 · network browser_list_network_requestsbrowser_get_network_requestbrowser_fetch(以页面身份请求 API)、browser_mock_requestbrowser_clear_mocks
可观测性 · performance browser_performance_start_tracebrowser_performance_stop_trace
存储 browser_storage_getbrowser_storage_setbrowser_storage_remove
捕获 / 模拟 browser_print_to_pdfbrowser_set_viewportbrowser_clear_viewportbrowser_screencast_startbrowser_screencast_stop
会话 browser_session_exportbrowser_session_import
时序 browser_waitbrowser_wait_for_element(精确等待元素出现/消失)、browser_fast_forwardbrowser_wait_for_download

核心范式

ref 引用(推荐的元素操控方式)

browser_scan / browser_snapshot 为每个可交互元素分配稳定 ref(如 [ref: 3])。优先用 browser_click_ref / browser_type_ref 按 ref 操控——它会解析元素当前的坐标,即使页面发生轻微重排也能正确命中。若已知目标的选择器,可直接用 browser_query_ref 获取 ref,跳过全页扫描。

穿透同源 iframe

感知会递归进入 shadow DOM 与同源 iframe:iframe 内的元素同样分配 ref,坐标已折算到主页面视口,可直接用 ref 操控,无需关心 iframe 边界与坐标偏移。跨域 iframe(如第三方验证码)的 DOM 不可访问,不会出现在感知结果中。

信息密度

为避免上下文膨胀,大体积产物默认存盘或摘要

  • browser_print_to_pdf 把 PDF 写入下载目录,仅返回路径;
  • browser_storage_get 不传 key 时只返回键名列表;
  • browser_screencast_start / browser_screencast_stop 只统计帧数,不回传画面;
  • browser_scan 在长页面上提示「视口内 X / 共 Y 个元素」,告知还有多少未展示。

需要采集成片内容时,优先用高密度工具:browser_extract_structured(批量结构化)、browser_read_page(页面摘要)、browser_fetch(直连站点 API)。

自动等待

导航与点击/输入默认启用 auto-wait:导航等待页面 complete,交互等待网络空闲(networkIdle)。对 SPA 中延迟渲染的元素,用 browser_wait_for_element 精确等待其出现、附着或消失。

反检测

PhantomHand 基于 chrome.debugger(CDP)操控浏览器,不携带 WebDriver 指纹。每次连接一个标签页后,会自动向页面的主世界注入轻量补丁(经 Page.addScriptToEvaluateOnNewDocument,在任何站点脚本之前生效),抹除剩余自动化痕迹:

  • navigator.webdriverundefined
  • 补全 window.chrome.runtime
  • 规整 navigator.languages / navigator.plugins
  • 修正 permissions.querynotifications 的泄漏

注入逐标签页幂等,标签页关闭时自动清理,默认开启、无需配置。鼠标移动采用贝塞尔曲线加随机抖动,打字按字符类型差异化停顿(句末标点长停顿、逗号中停顿),点击前有短暂瞄准停顿。


配置

所有配置通过环境变量驱动(详见 .env.example):

变量 默认 说明
PORT 37210 WebSocket 端口
PHANTOM_HAND_TOKEN (空) WebSocket 鉴权 token
PHANTOM_HAND_SCREENSHOT_FORMAT jpeg 截图重编码格式(jpeg/webp/png,需安装 sharp
PHANTOM_HAND_SCREENSHOT_QUALITY 75 截图质量 1-100
PHANTOM_HAND_SCREENSHOT_MAX_WIDTH / _HEIGHT 0(不限) 截图最大尺寸,超出则等比缩小
PHANTOM_HAND_AUTO_WAIT_TIMEOUT 3000 auto-wait 等待上限(ms),0 关闭
PHANTOM_HAND_DOMAIN_ALLOWLIST (空) 域名白名单(逗号分隔),设置后仅允许这些域名
PHANTOM_HAND_DOMAIN_BLOCKLIST (空) 域名黑名单(逗号分隔)
PHANTOM_HAND_CATEGORY_DEBUG / _NETWORK / _PERFORMANCE / _STORAGE true 设为 false 隐藏整类工具,缩小 agent 选择面

截图压缩(可选):默认极轻量。安装 npm i sharp 后,截图会按上述参数重编码(webp/jpeg 显著小于 png),降低上下文占用;未安装时返回原图,功能不受影响。


安全

  • 服务默认监听 ws://localhost,仅本机可连。不要将服务暴露到公网或不受信任的远程地址——browser_eval_js 等工具等同于本机浏览器的远程代码执行权限。
  • 启用鉴权:设置 PHANTOM_HAND_TOKEN=<密钥>,并在扩展弹窗 URL 中追加 ?token=<密钥>。服务会拒绝未携带正确 token 的连接。
  • 除非完全控制远端主机,否则不要在扩展弹窗填写 wss://远程地址

多 Agent 并发(Proxy Broker)

多个宿主 Agent(如同时运行 Cursor 与 Claude Desktop,各自启动 phantom-hand)可共享同一个浏览器扩展:

  1. 第一个进程占用 37210 端口,成为 Master,承载 WebSocket 服务并与扩展通信。
  2. 后续进程发现端口被占用,自动作为 Proxy 连接到 Master,转发命令。

每条请求/响应通过唯一 requestId 路由,并发调用互不串扰。若希望多个 Agent 各自控制独立标签页,可在工具调用中传入显式 tabId(通过 browser_tab_list 获取)。


开发

npm install      # 安装依赖
npm run build    # esbuild 打包到 dist/index.cjs
npm run dev      # 以 tsx 直接运行 src/index.ts
npm start        # 运行编译产物
npm test         # 单元测试
npm run lint     # tsc --noEmit 类型检查

端到端功能验证见 test/smoke-test.md


常见问题

  1. 发送指令后浏览器无反应? Chrome 禁止扩展在系统保护页(chrome://newtabchrome://settingschrome://extensions、Web Store 等)执行调试 API。请确保当前聚焦一个常规网页。

  2. 端口被占用?37210 被占用,服务不会结束占用进程,而是自动以 Proxy 模式继续工作(见上节)。如需换端口:设置 PORT=xxxx,并在扩展弹窗填入对应端口。

  3. 浏览器一直显示「正在调试此浏览器」黄条? 这是 CDP 调试的正常表现。扩展会在标签页关闭时自动 detach 调试器;如需立即清除,关闭对应标签页。

  4. 剪贴板读取偶尔失败? 现代浏览器要求剪贴板读取有用户手势。无手势上下文中 browser_clipboard_get 可能失败——这是浏览器安全策略。

  5. 按 ref 操作时报「ref not found」? ref 不跨扫描保活。重新 browser_scan / browser_snapshot / browser_query_ref 获取新 ref 后再操作。

from github.com/SilenceEchoLab/PhantomHand

Установка PhantomHand

У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.

▸ github.com/SilenceEchoLab/PhantomHand

FAQ

PhantomHand MCP бесплатный?

Да, PhantomHand MCP бесплатный — установка в пару кликов через Unyly без оплаты.

Нужен ли API-ключ для PhantomHand?

Нет, PhantomHand работает без API-ключей и переменных окружения.

PhantomHand — hosted или self-hosted?

Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.

Как установить PhantomHand в Claude Desktop, Claude Code или Cursor?

Открой PhantomHand на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.

Похожие MCP

Compare PhantomHand with

Не уверен что выбрать?

Найди свой стек за 60 секунд

Автор?

Embed-бейдж для README

Похожее

Все в категории browse