Skip to content
Back to skills

Chrome Devtools Mcp

ASecurity

Chrome DevTools MCP server — agent-controlled browser via MCP. take_snapshot (accessibility tree + uids), click/fill/navigate automation, screenshot, evaluate_script, console/network inspection. 41k+ stars. Sources: ChromeDevTools/chrome-devtools-mcp (Apache-2.0).

  • 10 stars
  • 0 votes
  • 0 copies
  • 6 views
  • Added September 9, 2026
ai-agentstypescriptgotestingdebuggingapiperformance

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned September 9, 2026

npx -y skills add yanacuti1121/Yana-AI --skill chrome-devtools-mcp --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Chrome Devtools Mcp?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Chrome Devtools Mcp
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/yanacuti1121-chrome-devtools-mcp/badge)](https://www.skillsdirectory.com/skills/yanacuti1121-chrome-devtools-mcp)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: chrome-devtools-mcp
description: Chrome DevTools MCP server — agent-controlled browser via MCP. take_snapshot (accessibility tree + uids), click/fill/navigate automation, screenshot, evaluate_script, console/network inspection. 41k+ stars. Sources: ChromeDevTools/chrome-devtools-mcp (Apache-2.0).
origin: yana-ai — synthesized from ChromeDevTools/chrome-devtools-mcp (Apache-2.0)
license: Apache-2.0
version: 1.0.0
compatibility: yana-ai >= 1.3.55
---

# /chrome-devtools-mcp

## When to Use

- AI agent needs to control a live Chrome browser (click, fill forms, navigate)
- Debugging a web page: console errors, network requests, accessibility tree
- Performance analysis: LCP traces, Lighthouse audits (use [[chrome-devtools-lcp-debug]])
- Memory leak investigation (use [[chrome-devtools-memory-leak]])

## Do NOT use for

- Headless scraping at scale (use Playwright/Puppeteer directly)
- `--slim` mode sessions (reduced tool set — see slim-tool-reference)
- Firefox or Safari (only Chrome / Chrome for Testing officially supported)

---

## MCP config

```json
{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": ["-y", "chrome-devtools-mcp@latest"]
    }
  }
}
```

```json
// Slim mode (basic automation only, lower token cost)
{ "args": ["-y", "chrome-devtools-mcp@latest", "--slim", "--headless"] }
```

---

## Core workflow pattern

```
1. navigate_page  → go to URL
2. wait_for       → wait for selector/network-idle if needed
3. take_snapshot  → get accessibility tree with element uids
4. click/fill     → interact using uid from snapshot
5. take_snapshot  → verify updated state (only when needed)
```

```typescript
// Step-by-step example (via MCP tool calls)
// 1. Navigate
await mcp.call("navigate_page", { url: "https://example.com/login" });

// 2. Snapshot → get uids
const snapshot = await mcp.call("take_snapshot", {});
// snapshot contains: { elements: [{ uid: "a1b2", role: "textbox", name: "Email" }, ...] }

// 3. Fill form in ONE call (preferred over multiple fill calls)
await mcp.call("fill_form", {
  elements: [
    { uid: "a1b2", value: "user@example.com" },   // Email field
    { uid: "c3d4", value: "password123" },          // Password field
    { uid: "e5f6", value: "true" },                 // Remember me checkbox
  ]
});

// 4. Click submit
await mcp.call("click", { uid: "g7h8" });

// 5. Wait for navigation
await mcp.call("wait_for", { selector: "[data-testid='dashboard']" });
```

---

## Tool selection guide

```
Goal                          Tool
────────────────────────────  ─────────────────────────────────────────────
Understand page structure     take_snapshot (accessibility tree, faster)
See visual state              take_screenshot (when human needs to see)
Get extra data                evaluate_script (data not in accessibility tree)
Fill multiple form fields     fill_form (one call > multiple fill calls)
Check errors                  list_console_messages (types: ["error"])
Check network                 list_network_requests / get_network_request
Run Lighthouse audit          lighthouse_audit
```

---

## Efficient data retrieval patterns

```typescript
// Large outputs → use filePath to avoid polluting context
await mcp.call("take_screenshot",  { filePath: "/tmp/screenshot.png" });
await mcp.call("take_snapshot",    { filePath: "/tmp/snapshot.json" });

// Console: filter by type + pagination
await mcp.call("list_console_messages", {
  types: ["error", "warning"],
  pageSize: 20,
  pageIdx: 0,
  includePreservedMessages: true,   // catch load-time issues
});

// Network: filter to API calls only
await mcp.call("list_network_requests", {
  urlFilter: "/api/",
  pageSize: 10,
});

// evaluate_script: extract structured data not in accessibility tree
await mcp.call("evaluate_script", {
  script: "JSON.stringify(window.__APP_STATE__)"
});
```

---

## Parallel tool calls

```
Rules:
  1. navigate → wait → snapshot → interact (must be sequential — each depends on prior)
  2. Independent reads can run in parallel:
     [list_console_messages, list_network_requests] — parallel OK
     [take_screenshot, evaluate_script]             — parallel OK
  3. NEVER parallelize writes (click, fill) — order matters
```

---

## Extension testing workflow

```typescript
// 1. Install unpacked extension
const { extensionId } = await mcp.call("install_extension", {
  path: "/path/to/extension"
});

// 2. Trigger popup / side panel
await mcp.call("trigger_extension_action", { extensionId });

// 3. Verify service worker state
await mcp.call("evaluate_script", {
  serviceWorkerId: extensionId,
  script: "self.registration.scope"
});

// 4. Navigate and verify content script effect
await mcp.call("navigate_page", { url: "https://example.com" });
const snapshot = await mcp.call("take_snapshot", {});
// Check snapshot for injected elements
```

---

## Anti-Fake-Pass Checklist

```
❌ Taking a screenshot when take_snapshot suffices → screenshot costs more tokens; use for visual-only needs
❌ Multiple fill calls instead of fill_form → 3-5x more tool calls for the same form
❌ Reading snapshot after every action → only re-snapshot when you need the updated state
❌ Not using filePath for large outputs → raw screenshot/trace data floods context
❌ Assuming Chrome is already open → browser starts automatically on first tool call; no pre-launch needed
❌ Using slim mode without knowing its limitations → slim mode lacks performance/memory/extension tools
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.