Best for
- Use when [BROWSE] marker is present.
kirodotdev/KiroCrew/skills/browser-auth/SKILL.md
Authenticate and browse sites that require a logged-in session using Playwright MCP. Use when [BROWSE] marker is present.
Decision brief
You are browsing websites with Playwright MCP. Public pages need no auth — just navigate. For pages that require a logged-in session (dashboards, internal tools, anything behind a login wall), authentication is supplied by injecting cookies the user exported from their own brows…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/kirodotdev/KiroCrew --skill "skills/browser-auth"Inspect the Agent Skill "browser-auth" from https://github.com/kirodotdev/KiroCrew/blob/5bcf51037a10a420d51a290b505245a3e6f0b1ee/skills/browser-auth/SKILL.md at commit 5bcf51037a10a420d51a290b505245a3e6f0b1ee. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
If healthy, refresh storage state so Playwright has the freshest cookies:
Use Playwright MCP tools directly — cookies are pre-loaded via storage state (no manual injection needed once refreshed):
Session cookies expire. When a navigation lands on a login page or returns a 401/403, the fix is to re-export the cookie jar and re-load it:
Tell the user these steps:
Many single-page apps never reach "network idle" because of background telemetry/polling. Use this pattern:
Permission review
The documentation asks the agent to read local files, directories, or repositories.
If you need to analyze the screenshot content, use the Read tool on the file pathThe documentation includes network, browsing, or remote request actions.
browser_route pattern="https://blocked-site.example.com/**" headers=["User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"]Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 88/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 1,286 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
You are browsing websites with Playwright MCP. Public pages need no auth — just navigate. For pages that require a logged-in session (dashboards, internal tools, anything behind a login wall), authentication is supplied by injecting cookies the user exported from their own browser as Playwright storage state. There is no bundled SSO; the model is simply "reuse the session cookies the user already has".
kirocrew browse auth health
If healthy, refresh storage state so Playwright has the freshest cookies:
kirocrew browse auth refresh
If unhealthy or no cookies found, the user needs to export a fresh cookie
jar from the browser where they are already logged in, then re-run the refresh.
See "Exporting a cookie jar" below, then run kirocrew browse auth refresh.
Use Playwright MCP tools directly — cookies are pre-loaded via storage state (no manual injection needed once refreshed):
browser_navigate — go to URL (use waitUntil: "domcontentloaded" for SPAs)browser_snapshot — get page structure with interactive elements (fast, no visual wait)browser_click — click elementsbrowser_fill_form — fill input fieldsbrowser_type — type textbrowser_take_screenshot — capture page for userbrowser_press_key — keyboard inputbrowser_wait_for — wait for a specific selector before interactingbrowser_evaluate — run JavaScript (requires user confirmation)Many single-page apps never reach "network idle" because of background telemetry/polling. Use this pattern:
browser_navigate with the URLbrowser_wait_for with a key selector (e.g., text="Welcome" or .main-content)browser_take_screenshot — captures immediately without waiting for network idleIf browser_take_screenshot times out, use browser_snapshot instead — it returns the page structure as text without waiting for visual stability. Show the snapshot content to the user and explain what's on the page.
Playwright responses are automatically compressed by the KiroCrew proxy before reaching you. Full accessibility trees (~50-100K tokens) are reduced to compact outlines (~2-5K tokens) showing only interactive elements with refs. You do NOT need to do anything special — just use Playwright tools normally.
What you see: [Compressed: 2030 elements → 151 interactive] followed by a compact list of links, buttons, inputs, headings with refs like [ref=e7].
Interacting after compression:
ref values directly: browser_click(ref="e7"), browser_type(ref="e15", text="search query")browser_click also includes a compressed snapshot of the new stateScreenshots are auto-saved to files by the proxy:
browser_take_screenshot returns a file path (e.g., Screenshot saved: /tmp/kirocrew-screenshots/screenshot-123.jpeg) — NOT raw base64 image databrowser_snapshot for navigation/interaction — it gives refs for clicking without needing visual confirmationbrowser_take_screenshot when the user says "show me" or "what does it look like"If you need full text content (e.g., reading an article body):
browser_evaluate with targeted JS: document.querySelector('.article-body').innerTextFallback tools (if proxy compression is insufficient):
browse_outline — re-compress a snapshot manually with custom max_linesbrowse_search — regex search a snapshot for specific contentSession cookies expire. When a navigation lands on a login page or returns a 401/403, the fix is to re-export the cookie jar and re-load it:
kirocrew browse auth refresh
Then call browser_set_storage_state with the storage-state file path:
filename: ~/.kiro/crew/playwright-storage-state.json
This reloads cookies WITHOUT restarting the MCP server. Then retry navigation.
If the refresh reports no valid cookies, the exported jar is stale — the user
must log in again in their own browser, re-export the cookie jar, and re-run
kirocrew browse auth refresh. Tell the user:
"Your session cookies expired. Please log in again in your browser, export a fresh cookie jar, then let me know so I can refresh."
Some sites block headless browsers by User-Agent. Spoof a normal User-Agent for that host:
browser_route pattern="https://blocked-site.example.com/**" headers=["User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"]
Remove when done: browser_unroute pattern="https://blocked-site.example.com/**"
Authenticated browsing works by reusing the session cookies from a browser
where the user is already logged in. The user exports those cookies to a
Netscape/Mozilla cookie jar (a plain-text cookies.txt file) using any
standard browser extension or tool that produces that format. KiroCrew parses
that file (parse_netscape_cookies) and converts it to Playwright storage
state during kirocrew browse auth refresh.
~/.kiro/crew/browser-cookies.txt
(any Netscape/Mozilla-format file works).| Credential | Lifetime | Refresh |
|---|---|---|
| Site session cookie | Varies by site (hours to weeks) | Re-export cookie jar + kirocrew browse auth refresh + browser_set_storage_state |
Session cookies read from storage state are applied at browser-context
creation. After a browser_set_storage_state, no MCP restart is required.
If navigation fails with auth errors, use these tools:
browser_network_requests with requestHeaders: true — see what cookies/UA were sentbrowser_console_messages with level: "error" — catch client-side auth errorsbrowser_snapshot — check if you're on a login page vs the real contentExtension mode (recommended for macOS):
Tell the user these steps:
Install the Chrome extension: https://chromewebstore.google.com/detail/mmlmfjhmonkocbjadbfplnigmagldckm
Get the connection token:
Click the Playwright extension icon in Chrome toolbar → copy the token value
(looks like: PLAYWRIGHT_MCP_EXTENSION_TOKEN=xxxxxxx...)
Save the token (choose one):
kirocrew browse extension on → paste token when promptedRestart the gateway: kirocrew stop && kirocrew gateway
Keep Chrome open — Playwright connects to your running Chrome via the extension. If Chrome is closed, browsing tools won't work until you reopen it.
Headless mode (default on Linux / servers):
No special setup beyond exporting cookies. The flow:
kirocrew browse auth refresh converts the cookie jar to Playwright storage statecontextOptions.storageState| Issue | Cause | Fix |
|---|---|---|
| Playwright install fails on old glibc (aarch64) | glibc too old for bundled Chromium | Use a newer OS image or run browsing on a supported host |
| 401 / redirect to login | Session cookies expired | User re-exports cookie jar; run kirocrew browse auth refresh |
| Screenshots are the only output | Headless — no visible browser | Always show screenshots to user |
browser_evaluate is NOT auto-approved — it can access cookies. Requires user confirmation.browser_evaluate('window.location = ...') — use browser_navigatePlaywright MCP tools not available (browser_navigate not in tool list):
kirocrew browse setup to install Playwright MCP + browsers"Playwright MCP is installed but not loaded. Add it to your agent config, then restart the gateway:
kirocrew stop && kirocrew gateway"
The config at ~/.kiro/crew/playwright-config.json sets:
isolated: true — required for storageState to take effect (without it, Playwright uses a persistent profile and ignores our cookies)contextOptions.storageState — pre-loads exported cookies at context creationcapabilities: ["network", "storage"] — network enables browser_route for UA spoofing; storage enables browser_set_storage_state for cookie hot-reloadkirocrew browse setup)~/.kiro/crew/playwright-config.jsonAlternatives
coreyhaines31/marketingskills
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
prowler-cloud/prowler
PostgreSQL indexing best practices for Prowler: index design, partial indexes, partitioned table indexing, EXPLAIN ANALYZE validation, concurrent operations, monitoring, and maintenance. Trigger: When creating or modifying PostgreSQL indexes, analyzing query performance with EXPLAIN, debugging slow queries, reviewing index usage statistics, reindexing, dropping indexes, or working with partitioned table indexes. Also trigger when discussing index strategies, partial indexes, or index maintenance
dotnet/skills
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing