From wovol-lab
Drive the user's logged-in Arc browser via Playwright MCP over CDP for arbitrary web operations — form fills, multi-step flows, data extraction, navigation, clicks. Reuses Arc's existing session cookies so authenticated sites work without re-login. Use when the user asks to "do X on website Y", fill out an online form, perform a task in a web app, or automate something in their browser.
How this skill is triggered — by the user, by Claude, or both
Slash command
/wovol-lab:arc-browser-opsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
General-purpose browser automation skill. Attaches Playwright MCP to the user's
General-purpose browser automation skill. Attaches Playwright MCP to the user's already-running Arc browser via Chrome DevTools Protocol (CDP), reusing the user's existing logged-in sessions. Works for any web task: form filling, multi-page flows, data extraction, dashboard navigation, posting content, toggling settings, etc.
Arc is Chromium-based, so it exposes CDP when launched with a debug port.
Playwright cannot launch Arc itself, but it can attach to an already-running
Arc instance via connectOverCDP and inherit the user's existing profile —
cookies, MFA tokens, logins, all of it. This skill wraps that pattern through
the Playwright MCP server so you can drive Arc directly from this conversation.
Activate when the user asks for any of:
Do not use for: tasks that don't require auth or interactivity (use curl
or a fetch tool), or tasks fully covered by a dedicated MCP (Gmail, Linear,
Notion, GitHub, etc. — prefer those direct integrations).
open -a "Arc" --args --remote-debugging-port=9222
(Alternative if open -a doesn't take the flag through reliably:
/Applications/Arc.app/Contents/MacOS/Arc --remote-debugging-port=9222)
curl -s http://localhost:9222/json/version returns JSON.browser_navigate to open a logged-in URL from scratch — through
Playwright MCP this opens in a fresh context that does not inherit
Arc's cookies, even though Arc itself is connected. Result: the page
redirects to a login or /sorry.aspx-style error.
browser.contexts()[0] to reuse the
default context, but the MCP wrapper does not expose that — switch to
the user's existing tab instead.Browser automation pulls Arc to the foreground, which buries whatever app the user was working in (Cursor / Claude app / Terminal / VS Code). Before touching the browser, snapshot the frontmost app; when the skill completes (success or failure), restore it.
# At the very start of browser work
bash lib/macos/return-focus.sh save
# ... do all browser ops ...
# At the very end (success path AND failure path)
bash lib/macos/return-focus.sh restore
Always pair save with restore — both in the happy path and in any
early-exit branches (errors, user cancel, refused operations). Treat
it like a defer / finally block.
Opt-out: set WOVOL_LAB_NO_RETURN_FOCUS=1 in the environment when the
user explicitly wants the browser to stay in front (e.g. they're
following along visually). The helper becomes a no-op in that case.
This is the #1 feedback. Default workflow:
MEMORY.md and any linked memory files for
user profile (name, status, nationality, language, role). The
project-level CLAUDE.local.md (gitignored) is the canonical place for
per-user defaults the skill should use.CLAUDE.local.md.)Only ask up-front when:
Never paste passwords or secrets into chat — route through the visible browser. See [[feedback-passwords]].
Before any action:
curl -s http://localhost:9222/json | python3 -c "import sys,json; [print(i,t.get('url','')[:90]) for i,t in enumerate(json.load(sys.stdin)) if t.get('type')=='page']"
mcp__plugin_everything-claude-code_playwright__browser_tabs with
action=list. Note: this can occasionally timeout on the first call
against Arc CDP — retry once, or fall back to the curl approach above.browser_tabs action=select, index=N.browser_navigate is only safe for public / unauthenticated URLs.
Snapshot → fill → confirm → submit should happen in one tight sequence.
Don't pause for unnecessary back-and-forth between snapshot and submit —
some forms (e.g. recruitment / banking sessions) expire in minutes and
redirect to /error.aspx or similar. If that happens, the form data is
lost and the user must re-login and reopen the page.
If a fresh snapshot is needed (e.g. after a step changes the page), grab it immediately before the next action — don't reuse stale element refs.
Stop and ask before:
Doesn't need confirmation:
mcp__plugin_everything-claude-code_playwright__browser_fill_form accepts an
array of fields (combobox / radio / checkbox / textbox) in one call. Prefer
this over per-field clicks — faster, fewer round trips, and the radio/combobox
values can be addressed by their visible label.
1. Verify CDP up: curl -s http://localhost:9222/json/version
2. Find the right tab: browser_tabs list (or curl /json)
3. Switch: browser_tabs select index=N
4. Snapshot: browser_snapshot
5. Plan fills from context: read user memory, infer values, pick defaults
6. Batch fill: browser_fill_form
7. Summarize + confirm: one question, list every filled value + skipped
8. Apply edits if any: browser_fill_form again
9. Advance: browser_click on Next (or local equivalent)
10. If review screen: summarize what will submit, let user do the
final click themselves (or get explicit go-ahead)
| Symptom | Cause | Fix |
|---|---|---|
curl localhost:9222 fails | Arc not launched with CDP | Ask user to ⌘Q Arc completely, relaunch with open -a "Arc" --args --remote-debugging-port=9222 |
Page redirects to /sorry.aspx or login | browser_navigate opened fresh context without Arc cookies | Use browser_tabs select on the existing logged-in tab instead |
| Form refs are gone / wrong / "element not found" | Page reloaded, stale snapshot | Take a fresh browser_snapshot before next action |
browser_tabs list timeout | Playwright MCP + Arc CDP quirk on first call | Retry once, or use curl /json to enumerate targets |
/error.aspx, "session expired", or localized equivalent | Form sat too long between open and submit | User re-logs in, reopens form tab, then re-run the playbook — quickly |
| Selectors keep failing on a SPA | Dynamic content not yet rendered | browser_wait_for on a visible text, or re-snapshot after a short pause |
This skill should consult and update the following memory:
When a new web task is in progress and may span sessions, save a
project_<site>_<task>.md memory so a future session can resume cleanly.
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub whitestonetak/wovol-lab --plugin wovol-lab