MCP browser tools have a fundamental problem: . With Playwright MCP, every response includes the full accessibility tree plus console messages. After a few page queries, your context window is full.
Обзор
MCP browser tools have a fundamental problem: . With Playwright MCP, every response includes the full accessibility tree plus console messages. After a few page queries, your context window is full.
README
webctl
Browser automation for AI agents and humans, built on the command line.
pip install webctl
webctl navigate "https://example.com" # Auto-starts browser, returns page data
webctl click "Sign in" # Click by text description
webctl snapshot # See all elements with @refs
webctl stop # Closes browser and daemon
Why CLI Instead of MCP?
MCP browser tools have a fundamental problem: the server controls what enters your context. With Playwright MCP, every response includes the full accessibility tree plus console messages. After a few page queries, your context window is full. This leads to degraded performance, lost context, and higher costs.
CLI flips this around: you control what enters context.
# Filter before context
webctl snapshot --interactive-only --limit 30 # Only buttons, links, inputs
webctl snapshot --within "role=main" # Skip nav, footer, ads
# Pipe through Unix tools
webctl snapshot | grep -i "submit" # Find specific elements
webctl --format jsonl snapshot | jq '.data.role' # Extract with jq
Beyond filtering, CLI gives you:
| Capability | CLI | MCP |
|---|---|---|
| Filter output | Built-in flags + grep/jq/head | Server decides |
| Debug | Run same command as agent | Opaque |
| Cache & Cost | webctl snapshot > cache.txt |
Every call hits server |
| Script | Save to .sh, version control | Ephemeral |
| Human takeover | Same commands | Different interface |
See also: MCP Considered Suboptimal — a community knowledge base collecting CLI-over-MCP patterns and alternatives.
Benchmarks
Head-to-head comparison of webctl vs agent-browser (Vercel’s browser cli) across 4 real-world web tasks. Both tools use Claude Opus as the driving agent.
| Task | webctl | agent-browser | ||||||
|---|---|---|---|---|---|---|---|---|
| Score | Turns | Tokens | Cost | Score | Turns | Tokens | Cost | |
| Amazon product lookup | 9/10 | 11 | 119k | $0.25 | 9/10 | 18 | 247k | $0.28 |
| Spiegel.de headlines | 9/10 | 7 | 62k | $0.14 | 8/10 | 5 | 47k | $0.12 |
| Google Maps restaurants | 8/10 | 9 | 106k | $0.22 | 7/10 | 13 | 185k | $0.29 |
| DuckDuckGo search | 8/10 | 4 | 29k | $0.11 | 4/10 | 17 | 253k | $0.36 |
| Average | 8.5/10 | 8 | 79k | $0.18 | 7.0/10 | 13 | 183k | $0.26 |
webctl achieves higher quality scores on all 4 tasks at lower cost. Landmark-aware snapshots collapse navigation/sidebars and prioritize content, while automatic fallbacks (cookie dismiss, scroll-to-find, overlay retry) handle complex sites without extra agent turns.
Agent Integration
Option A: Install the skill (works across Claude Code, Cursor, Codex, Gemini CLI, Copilot, Goose, Windsurf, and OpenCode)
npx skills add cosinusalpha/webctl
This installs the skill file. Your agent will install the webctl package automatically on first use.
Option B: Install via pip
pip install webctl
webctl setup # Downloads Chromium
webctl init # Generate skills/prompts for your agents
webctl init --global # Or install globally (works across all projects)
webctl init creates on-demand skills for Claude Code and Goose, and lean prompts for Gemini, Copilot, and Codex.
If your agent doesn’t auto-detect the generated files, add this to your system prompt:
For web browsing, use webctl CLI. Run
webctl agent-promptfor instructions.
Note: If a browser MCP is already configured, disable it to avoid conflicts.
Commands
Navigation & Observation
webctl navigate "https://..." # Structured data + page summary
webctl navigate "https://..." --snapshot # Full a11y snapshot with @refs
webctl navigate "https://..." --read # Readable markdown content
webctl navigate "https://..." --search "query" # Find search box, type, submit
webctl navigate "https://..." --grep "price" # Filtered a11y snapshot
webctl back / forward / reload
webctl snapshot --interactive-only # Buttons, links, inputs only
webctl snapshot --within "role=main" # Scope to container
webctl query "role=button name~=Submit" # Debug query
webctl screenshot --path shot.png
Interaction
webctl click "Submit" # By text description
webctl click @e3 # By @ref from snapshot
webctl click "Submit" --snapshot # Click + return updated page state
webctl type "Email" "[email protected]" # Smart targeting
webctl type "Country" "Germany" # Auto-detects dropdowns
webctl type "Search" "query" --submit # Type + press Enter
webctl press Enter
webctl do '[[...],[...]]' --snapshot # Batch multiple actions
Wait Conditions
webctl wait network-idle
webctl wait 'exists:role=button name~="Continue"'
webctl wait 'url-contains:"/dashboard"'
Session & Console
webctl status # Current state & error counts
webctl save # Persist cookies now
webctl console --count # Just counts by level (LLM-friendly)
webctl console --level error # Filter to errors only
Core Concepts
Sessions
Browser stays open across commands. Cookies persist to disk.
webctl start # Visible browser
webctl start --mode unattended # Headless (invisible)
webctl -s work start # Named profile (separate cookies)
Element Queries
Semantic targeting based on ARIA roles — stable across CSS refactors:
role=button # Any button
role=button name="Submit" # Exact match
role=button name~="Submit" # Contains text (preferred)
Output Control
webctl snapshot # Human-readable
webctl --quiet navigate "..." # Suppress events
webctl --result-only --format jsonl navigate "..." # Pure JSON
Architecture
┌─────────────┐ Unix Socket ┌─────────────┐
│ CLI │ ◄────────────► │ Daemon │
│ (webctl) │ JSON-RPC │ (browser) │
└─────────────┘ └─────────────┘
│ │
▼ ▼
Agent/User Chromium + Playwright
- CLI: Stateless, sends commands to daemon
- Daemon: Manages browser, auto-starts on first command
- Socket:
$WEBCTL_SOCKET_DIRor OS default (see below) - Profiles:
~/.local/share/webctl/profiles/
Security
webctl verifies that CLI commands come from the same user as the daemon:
| Platform | Mechanism | Strength |
|---|---|---|
| Linux | SO_PEERCRED |
Kernel-enforced UID check |
| macOS | LOCAL_PEERCRED |
Kernel-enforced UID check |
| Windows | SIO_AF_UNIX_GETPEERPID + process token |
Kernel-enforced SID check |
All platforms use kernel-level credential verification. This prevents other users from controlling your browser session.
License
MIT
Рекомендуемые инструменты
Попробуйте другой запрос или уберите фильтр.
Установка
npx skillfish add cosinusalpha/webctl