Tabhand

dev.tabhand由 tabhand.dev 發布v0.10.1更新於 Oct 29, 2026

Let your coding agents use your real, signed-in Chrome, in background tabs that never steal focus.

已驗證STDIO僅桌面瀏覽器自動化開發者工具

概覽

AI 產生的概覽

讓助手在使用者自己已登入的 Chrome 中,以背景分頁操作需登入的頁面,且不會搶走焦點。

可以做什麼
  • 在使用者的 Chrome 中開啟、導覽、列出與關閉背景分頁,並可指定 Chrome 設定檔
  • 以無障礙大綱讀取頁面並標出元素參照,也可對背景分頁截圖
  • 在頁面上點擊、輸入、按鍵、捲動、懸停與拖曳元素
  • 回應頁面跳出的確認框與輸入框
  • 把本機檔案附加到檔案欄位或檔案選擇按鈕
適用情境
適合需要真實瀏覽器工作階段的任務:需登入才能看的信箱、儀表板、管理後台或社群媒體,沒有 API 的網頁應用,或檢查網站的外觀與行為。也適合希望助手在背景工作、不接管使用者畫面的情境。
執行需求
以 npm 套件透過 npx 在本機執行,支援 macOS 與 Windows,Windows 需 Node.js 20 以上。安裝程式會寫入使用者家目錄、向 Chrome(以及 Brave、Edge 或 Dia)註冊原生主機,並把伺服器加入偵測到的助手。需安裝並啟用 Tabhand Chrome 擴充功能,且 Chrome 正在執行。未宣告任何 API 金鑰或環境變數。
安裝前請注意
助手會以使用者身分、用其真實帳號操作,可能送出訊息、發文、購買、刪除或變更設定;伺服器指示要求先詢問使用者,但並非強制。它可以把本機檔案上傳到網頁。安裝會就地修改助手的設定檔(保留備份)。頁面內容會交給正在執行的助手,擴充功能使用 Chrome 偵錯介面,會出現偵錯提示列。不支援 Arc。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Tabhand,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[圖片]

Tabhand

Let your AI agents use your own Chrome, signed in to your accounts,
in background tabs that never steal your focus.

tabhand.dev · Docs · Chrome Web Store

[npm version] [Chrome Web Store] [MIT license] [macOS and Windows: Chrome, Brave, Edge, and Dia on macOS]

https://github.com/user-attachments/assets/d5fe5c5a-c012-471f-bf3b-10fa754c382d

Video not playing? Watch it on tabhand.dev

sh
npx tabhand setup

Works with Claude Code, Codex, Cursor, OpenCode, Gemini CLI, Copilot and more: 19 agents in all, plus anything else that speaks MCP.

Then add the extension from the Chrome Web Store. Setup opens the page for you. It works in Brave, Edge and Dia too.

Why Tabhand

  • Your logins, not a blank browser. Agents work in the Chrome you already use, so email, dashboards and admin panels just work. You never hand over a password.
  • You keep working. Every agent gets tabs of its own in the background, grouped under its name and muted. Chrome never jumps to the front.
  • Your tabs stay yours. An agent can only reach the tabs it opened, never yours and never another agent's.
  • You can watch. Each agent has its own cursor that glides, clicks and types, and its tabs wear its icon. The Tabhand button in Chrome's toolbar shows who's working and pauses every agent at once.
  • No servers. Tabhand runs entirely on your computer, with no analytics. Pages only go to the agent you're running. Read the privacy policy.

[Claude's cursor working on a Wikipedia page in a background tab]

How it works

agent ──stdio──▶ tabhand mcp ──Unix socket──▶ native host ──native messaging──▶ extension ──chrome.debugger──▶ agent's tabs
  • Background by default. Each agent session opens its own tabs with active: false, inside a tab group named after the agent. Focus emulation keeps those tabs rendering, so clicks, typing and screenshots work without bringing anything to the front. Agent tabs are muted, and the agent moves on once a page is usable instead of waiting for every video to load.
  • Agents stay in their lane. The extension only lets a session reach tabs that session opened, plus any tabs and popups those pages open. Your tabs, and other agents' tabs, are invisible to it.
  • Gets along with password managers. Chrome won't let Tabhand control a page while it shows another extension's frame, such as iCloud Passwords' autofill menu. Tabhand takes those frames out of agent tabs and carries on with the step it was on.
  • No network port. The bridge talks over a Unix socket in a directory only you can read, with a fresh token each run. Web pages and other machines can't reach it.
  • Nothing sensitive logged, no telemetry. The bridge logs connect and disconnect events only: no URLs, page content or typed text.
  • You can watch. While an agent works in a tab, its cursor sits on the page, even across page loads. It glides to whatever the agent clicks, ripples on each click, shows typing dots while it types, waves when you switch to the tab, and fades out once the agent is done. It only animates while you're looking, and it's hidden from the agent's own screenshots.
  • Agent tabs stand out. While an agent works in a tab, the tab's icon becomes the agent's arrow. The site's own icon comes back when the agent is done.
  • Each agent wears its own colors, or yours. Claude, Codex, OpenCode, Cursor, Gemini and Copilot each get their own cursor and tab group color; anything else gets a violet cursor with its own name. To give every agent your team's name, color and icon instead, click the Tabhand icon in Chrome's toolbar, then the gear, and choose Custom. The tag's icon can be the name's first letter, one of ten marks, or none, in white or black to suit the color. To set it for every agent on the computer, run tabhand cursor --name Acme --color '#FF5A1F' --icon initial.
  • Stop button. Click the Tabhand icon in Chrome's toolbar and press Pause every agent, or click Cancel on Chrome's "started debugging" bar. Either pauses every agent at once.
  • Several Chrome profiles. If Tabhand is in more than one profile (say, work and personal), agents see each one and can ask for it: "use my Work profile". Click the Tabhand icon in a profile, then its name at the top of the panel, to give it a name agents know it by, or fill in that profile's Google email. Without a choice, agents use the profile that connected first. Pause Tabhand in one profile and new work goes to a profile where it's on. An agent that asked for a profile stays in it: if you pause that one, the agent hears so rather than signing in somewhere else.

[Each agent gets its own cursor: Claude, Codex, OpenCode, Cursor, Gemini, Copilot]

[Tab badges for each harness]

Setup (macOS and Windows)

sh
npx tabhand setup

That's all:

  • It installs Tabhand in ~/.tabhand and connects it to Chrome, and to Brave, Edge and Dia (macOS) if you have them.
  • It adds Tabhand to every agent it finds, for all your projects. Each new session gets the browser tools, and the server's instructions tell the agent when to reach for them.
  • It asks before changing anything. Where an agent has its own mcp add command, setup uses it. Otherwise it edits the agent's settings file in place, keeping comments, and backs up the original to ~/.tabhand/backups.
  • It opens Tabhand in the Chrome Web Store, so you can add the extension (once), and waits for Chrome to connect.

Agents it knows:

  • Claude Code, Codex, OpenCode, Cursor, Gemini CLI, Qwen Code, VS Code (Copilot), Copilot CLI, Kiro, Amp, Factory Droid, Warp, Junie, Antigravity
  • Devin Desktop (Windsurf), Claude Desktop, Cline, Zed

To add it to only some of them, run npx tabhand setup --harness claude,codex.

Using Brave, Edge or Dia? Add the extension there from the same Chrome Web Store page. Edge asks you to allow extensions from other stores first. Each browser shows up to agents as one more profile: click the Tabhand icon in it and give it a name, such as "Brave", so agents can ask for it. Arc isn't supported: tab groups and screenshots never finish there, so Tabhand stays out of Arc even if you add the extension. Arc shuts down on December 22, 2026; Dia works.

tabhand status checks the install, the Chrome connection and each agent. tabhand remove undoes it all. Run npx tabhand@latest setup again to update.

Any other MCP client can run ~/.tabhand/bin/tabhand mcp itself (on Windows, %USERPROFILE%\.tabhand\bin\tabhand.cmd mcp).

On Windows

  • You need Node.js 20 or later, from nodejs.org or winget install OpenJS.NodeJS.LTS.
  • In PowerShell, if npx says running scripts is disabled on this system, run npx.cmd tabhand setup instead, or use Command Prompt.
  • Setup registers Tabhand with Chrome and Edge (Edge comes with Windows), and with Brave if you have it, under HKEY_CURRENT_USER in the registry. Nothing needs an administrator.
  • Agents reach the bridge over a named pipe, not a network port, and each has to show a token kept in your own AppData, new each time Chrome starts the bridge.
  • Tested on Windows 11 with Chrome, and with Claude Code as the agent.

Working on Tabhand

sh
npm installnode bin/tabhand.mjs setup    # builds dist/tabhand.mjs and installs it from this checkoutnode bin/tabhand.mjs reload   # after changing the extension's code

From a checkout, setup has you load the extension unpacked (Developer mode, then "Load unpacked") instead of adding it from the Chrome Web Store.

Setup copies a single bundled file (dist/tabhand.mjs, built by npm run build), because macOS doesn't let Chrome's child processes read Documents, Desktop or Downloads. Agents and Chrome both start it through ~/.tabhand/bin/tabhand. That launcher remembers which Node.js ran setup, since agent apps don't get your shell's PATH. If that Node.js is removed later, it finds another one. If Chrome never connects, the bridge's log at ~/Library/Application Support/tabhand/host.log says why.

On Windows, Chrome starts the bridge through ~\.tabhand\bin\tabhand-host.cmd, which the registry points it to, and agents run the Node.js that ran setup with ~\.tabhand\app\tabhand.mjs directly, since they start programs without a shell. The log is in %LOCALAPPDATA%\tabhand\host.log, and anything the bridge printed while failing to start is in host-errors.log next to it.

Windows-only code lives in src/windows.mjs and extension/windows.js. The shared files call into them only behind a Windows check, and keep their macOS code as it is.

Tools

ToolWhat it does
browser_open_tabOpen a background tab in the agent's tab group, optionally loading a URL, in the Chrome profile it asks for
browser_navigateLoad a URL in one of the session's tabs
browser_snapshotRead the page as an accessibility outline; actionable elements, including ones a page made clickable or draggable out of plain elements, get refs like e123
browser_clickClick an element by ref, or by the text it shows
browser_hoverMove the pointer over an element (by ref or text) to reveal controls that only show on hover, and get a fresh snapshot with refs for them
browser_dragDrag one element onto another, by ref or text: reorder lists, move cards between columns. Works with the browser's own drag and drop and with pages that follow the mouse
browser_typeType into a field, optionally clearing it first and pressing Enter after, or choose a dropdown option by its text
browser_press_keyPress a key or combination such as Shift+Tab
browser_scrollScroll up or down
browser_upload_fileAttach files from your computer to a file field, or through the button that opens a file picker (no system dialog appears)
browser_handle_dialogAccept or dismiss a confirm or prompt dialog the page opened (alerts are closed for you)
browser_screenshotScreenshot a tab, even in the background
browser_list_tabsList the session's tabs, in every Chrome profile
browser_list_profilesList the Chrome profiles that have Tabhand, by name, and whether each is on or paused
browser_close_tabClose one of the session's tabs

Tests

  • npm test runs all of these except the smoke test.
  • node test/setup.mjs runs setup, status and remove in a throwaway home folder holding existing agent configs. It checks that Tabhand gets added, that comments and other settings survive, that a second run changes nothing, and that the launcher serves the MCP server.
  • node test/setup-windows.mjs does the same on Windows, with the registry entries under a key of the test's own, and checks that agents' own mcp add commands get called through cmd.exe.
  • On Windows the tests that start a browser need TABHAND_TEST_BROWSER set to Chrome for Testing's chrome.exe.
  • node test/package.mjs packs the npm package, installs the tarball, and runs setup from it.
  • node test/activator.mjs checks, on macOS, that the helper the bridge starts to hand the front back to your app goes away with the bridge, even when the bridge is killed, and that a new bridge stops helpers an older Tabhand left running and nothing else.
  • node test/arc.mjs checks, on macOS, that a bridge Arc starts stays connected but out of agents' way.
  • node test/profiles.mjs runs two bridges against stand-in extensions, "Work" and "Personal". It checks that agents see both by name and can choose one, that a chosen profile stays chosen, and that pausing one profile sends new work to the other.
  • node test/profile-name.mjs names a throwaway Chrome for Testing profile in the toolbar panel and checks that agents see the name, and that the panel pauses and resumes agents.
  • npm run test:e2e launches a throwaway Chrome for Testing profile, runs two agents in parallel, and checks they can't reach each other's tabs and that the browser never comes to the front.
  • node test/new-tabs.mjs checks that links, window.open() and popups from an agent's tab never take over your tab, and that the agent gets the new tab.
  • node test/drag-hover.mjs checks, in a background tab, that hover-only buttons (shown by CSS :hover or by a mouseenter handler) can be reached, and that lists reorder by dragging, with the browser's own HTML5 drag and drop and with mouse events alone, including lists that want a press delay and ones that have to be scrolled while an item is held.
  • node test/upload.mjs checks that files reach a page byte for byte, through a file field or a button's file picker, including files over Chrome's 1 MB message cap.
  • node test/foreign-frames.mjs checks that an agent gets through pages where a password manager's autofill menu pops up, using a stand-in extension.
  • npm run test:smoke runs a short check against the Chrome you have open.
  • node test/live.mjs --profile Dia --app Dia runs every tool in a real browser profile you have Tabhand in (Dia, Brave, Edge or a Chrome profile), through your install: two agents at once on a local test page, checking that their tabs stay apart and that the browser never comes to the front.
  • node test/cursor-presence.mjs checks the cursor and tab badge show before the first action, survive page loads, and leave when the agent is done.
  • node test/load-speed.mjs [--real] compares how long the agent waits for pages with a plain tab.
  • node test/cursor-gallery.mjs renders every cursor theme side by side, and node test/badge-preview.mjs every tab badge.

Roadmap

  • Per-site approval: agents ask before using a site for the first time
  • Confirmation before sending, buying or deleting
  • Logins filled from your password manager without the AI seeing the password
  • Downloads and iframes
  • Linux

License

MIT

來源:README.md,提交 6c7c566

工具

13

browser_open_tab

Open a new tab in the user's own Chrome, with their logins, and optionally load a URL. The tab opens in the background inside this session's tab group: Chrome is not brought to the front and the user's tabs are untouched, so they can keep working. Returns the tabId the other browser tools need.

輸入參數urlprofile

browser_list_profiles

List the Chrome profiles that have Tabhand (for example work and personal, each signed in to different accounts): each one's name, whether Tabhand is on or paused there, and which one your new tabs open in.

無需輸入參數。

browser_navigate

Load a URL in one of this session's tabs and wait for it to finish loading.

輸入參數url必填tabId必填

browser_snapshot

Read the page as an accessibility outline (headings, text, links, buttons, fields). Elements you can act on carry a ref like e123 for browser_click and browser_type; plain elements the page made clickable show as "clickable". Refs stop working after the page changes, so take a new snapshot then.

輸入參數tabId必填

browser_click

Click an element by its ref from browser_snapshot, or else by the text it shows. Waits for any page load the click starts. Links and popups that open a new tab stay in the background, join this session, and are listed in the result. Clicking an option of a dropdown chooses it.

輸入參數reftexttabId必填

browser_type

Type text into a field. Pass the field's ref to focus it first; omit ref to type into whatever already has focus. Set clear to replace the existing text and submit to press Enter afterwards. Given a dropdown's ref, chooses the option with that text.

輸入參數reftext必填cleartabId必填submit

browser_press_key

Press a key in the page: Enter, Tab, Escape, Backspace, Delete, ArrowUp/Down/Left/Right, Home, End, PageUp, PageDown, Space, a single character, or a combination such as Shift+Tab.

輸入參數key必填tabId必填

browser_handle_dialog

Answer a confirm or prompt dialog the page opened: accept it (OK) or dismiss it (Cancel). The page waits until it is answered. Alerts are closed for you. Ask the user first if accepting would send, buy, delete or change something.

輸入參數texttabId必填accept必填

browser_scroll

Scroll the page up or down, e.g. to load more content or bring something into view for a screenshot.

輸入參數tabId必填amountdirection

browser_screenshot

Take a screenshot of one of this session's tabs, even though it is in the background. Prefer browser_snapshot for reading text; use screenshots to check layout and visuals.

輸入參數tabId必填fullPage

browser_list_tabs

List the tabs this session has open. Other sessions' tabs and the user's own tabs are never shown.

無需輸入參數。

browser_upload_file

Attach files from this computer to the page, as if the user picked them. Pass the ref of a file field, or of the button that opens a file picker (no system dialog appears).

輸入參數ref必填paths必填tabId必填

browser_close_tab

Close one of this session's tabs when you are done with it.

輸入參數tabId必填

版本歷史

1
  1. v0.10.1最新Oct 22, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分