A CLI and MCP server for managing Chrome browser tabs from the terminal or an AI assistant.
Chrome Extension → Native Messaging (stdin/stdout) → Go binary → Unix domain socket ← CLI / MCP clients
- Extension (
extension/): Manifest V3 Chrome extension. Handles Chrome APIs, tabignore filtering. Thin — proxies requests to/from native host. - Go binary (
cmd/tabb/): Native Messaging host + Unix socket server. Routes messages between extension and CLI/MCP clients. - CLI commands:
list,show,close— connect to Unix socket. - MCP server:
tabb mcp— stdio MCP server bridging to Unix socket.
.claude-plugin/
marketplace.json # Lists this repo's plugins for /plugin marketplace add
cmd/tabb/ # Go CLI entrypoint
internal/
native/ # Native Messaging protocol (length-prefixed JSON)
socket/ # Unix domain socket server
profile/ # Profile management (profiles.json, resolution)
protocol/ # Shared message types
extension/
manifest.json # Manifest V3
background.js # Service worker
lib/ # Vendored libraries (Readability, Turndown)
plugins/
tabb/ # Claude Code plugin (installed standalone from marketplace)
.claude-plugin/
plugin.json # Plugin manifest
.mcp.json # Auto-wires the tabb MCP server on install
skills/
tabb/
SKILL.md # Discoverability + usage skill
The Go project and the Claude Code plugin live in the same repo but do not overlap on disk:
everything under plugins/tabb/ is what gets copied into a user's ~/.claude/plugins/cache/
when they install the plugin. The Go source, Makefile, and extension/ directory stay out
of that cache.
- Go code uses standard library where possible
- Extension is vanilla JS (no build step)
- Unix socket path:
~/.tabb/<profileId>.sock(one per browser/profile) - Native Messaging host name:
com.tabb - CLI output: human-readable by default,
--jsonflag for machine-readable showoutputs markdown with YAML frontmatter
tabb [--profile <name>] list— list tab metadatatabb [--profile <name>] show <tab-id>— page content as markdown (Readability mode),--rawfor full DOMtabb [--profile <name>] focus <tab-id> [--reload]— bring a tab to the foreground, optionally reloadtabb [--profile <name>] close <tab-id>— close a tabtabb profiles— list configured profiles and their statustabb mcp— run as MCP stdio servertabb setup— install Native Messaging host manifest and register a profile
tabb supports multiple browser profiles and Chrome-based browsers. Each extension installation
gets its own named profile. Profile data is stored in ~/.tabb/profiles.json.
- Socket files:
~/.tabb/<profileId>.sock(one per browser profile; profileId is generated by the extension and sent in the handshake) - Browser info:
~/.tabb/<profileId>.browser(written by native host on handshake; two lines: browser name, extension id) - Profile resolution:
--profileflag >TABB_PROFILEenv var > auto-detect (single socket)
This repo is also a Claude Code plugin marketplace. Users run:
/plugin marketplace add joelhelbling/tabb
/plugin install tabb
The plugin lives entirely under plugins/tabb/ so the Go source and build artifacts
don't end up in users' plugin caches. The plugin contributes:
- The
tabbMCP server (viaplugins/tabb/.mcp.json) — assumes thetabbbinary is on$PATH - A
tabbskill (viaplugins/tabb/skills/tabb/SKILL.md) — makes Claude Code reach for tabb when the user mentions their open browser tabs
- Load extension unpacked from
extension/directory in Chrome - Run
go build ./cmd/tabbto build the binary - Socket file is created when the extension connects and launches the native host