Skip to main content
Back to Blog
Guide
2026-05-18

Playwright MCP: Browser Automation for AI Agents Complete Guide

Complete guide to Playwright MCP for AI agent browser automation. Learn how MCP works with accessibility trees, setting up the MCP server, connecting to Claude Code and Cursor, testing workflows, and comparisons with direct Playwright.

The Model Context Protocol (MCP) has fundamentally changed how AI coding agents interact with browsers. Instead of generating Playwright test scripts that a human runs later, agents can now control a live browser session in real time -- navigating pages, clicking elements, filling forms, and reading page content through a structured protocol. Playwright MCP is the bridge that makes this possible, and understanding how it works is essential for anyone building AI-powered testing workflows in 2026.

This guide covers everything you need to know about Playwright MCP: what it is, how it works under the hood (accessibility trees vs screenshots), how to set up the MCP server, how to connect it to AI agents like Claude Code and Cursor, practical testing workflows, current limitations, and a detailed comparison with writing Playwright scripts directly.

Key Takeaways

  • Playwright MCP exposes browser automation as a set of structured tools that AI agents can call through the Model Context Protocol
  • The accessibility tree approach is faster and cheaper than screenshot-based browser control, using structured text instead of vision models
  • Setting up Playwright MCP requires minimal configuration -- a single command starts the server
  • AI agents connected via MCP can navigate, interact with, and read web pages as part of their reasoning loop
  • Playwright MCP is best suited for exploratory testing, quick verifications, and prototype interactions -- not for building maintainable test suites
  • Direct Playwright scripting remains superior for regression test suites, CI/CD pipelines, and performance-critical automation
npx @qaskills/cli add playwright-e2e

What Is Playwright MCP

Playwright MCP is a server that wraps Playwright's browser automation capabilities and exposes them through the Model Context Protocol. MCP is an open standard (created by Anthropic) that defines how AI applications connect to external tools and data sources. Think of it as a USB-C port for AI -- a standardized interface that any AI agent can plug into.

When an AI agent connects to a Playwright MCP server, it gains the ability to:

  • Launch and control browser sessions (Chromium, Firefox, WebKit)
  • Navigate to URLs and interact with page elements
  • Read page content through the accessibility tree or screenshots
  • Fill forms, click buttons, and perform keyboard actions
  • Take screenshots for visual verification
  • Execute JavaScript in the browser context
  • Intercept and monitor network requests

The critical distinction is that these capabilities are exposed as structured tools, not as code that the agent writes. The agent calls a tool like browser_navigate with a URL parameter, and the MCP server handles the Playwright implementation details.


How It Works: Accessibility Tree vs Screenshots

There are two fundamentally different approaches to giving AI agents browser access: screenshot-based and accessibility tree-based. Understanding the trade-offs is crucial for choosing the right approach.

Screenshot-Based Approach

In the screenshot-based approach, the agent receives a screenshot of the browser viewport and uses vision capabilities to understand the page. It identifies elements visually (buttons, text fields, links) and specifies click coordinates.

How it works:

  1. Agent requests a screenshot of the current page
  2. The MCP server captures and returns the screenshot as an image
  3. The agent processes the image to identify interactive elements
  4. The agent sends click coordinates (x, y) to interact with elements

Pros: Works with any visual content, handles canvas-rendered applications, can identify visual layout issues.

Cons: Slow (vision model inference for every interaction), expensive (image tokens cost more than text tokens), less precise (coordinate-based clicking can miss targets), and cannot read text that is visually present but not in the DOM.

Accessibility Tree Approach

In the accessibility tree approach, the agent receives a structured text representation of the page -- the same tree that screen readers use to help visually impaired users navigate websites. Each element has a role, name, and reference ID.

How it works:

  1. Agent requests the page snapshot (accessibility tree)
  2. The MCP server returns a structured list of elements with roles and names
  3. The agent identifies the target element by its semantic role and name
  4. The agent sends a click command using the element's reference ID

Example accessibility tree output:

- navigation "Main"
  - link "Home" [ref=e1]
  - link "Products" [ref=e2]
  - link "About" [ref=e3]
- main
  - heading "Welcome to Our Store" [level=1]
  - textbox "Search products" [ref=e4]
  - button "Search" [ref=e5]
  - list "Product List"
    - listitem
      - link "Wireless Headphones - $49.99" [ref=e6]
    - listitem
      - link "Bluetooth Speaker - $79.99" [ref=e7]

Pros: Fast (text processing, no vision model needed), cheap (text tokens are far less expensive), precise (element references instead of coordinates), semantic (understands the page structure, not just pixels), and accessible (leverages the same tree used for screen readers).

Cons: Cannot see visual styling, layout, or images. Canvas-rendered content is invisible. Custom components without proper ARIA roles may be missing from the tree.

Which Approach Does Playwright MCP Use?

Playwright MCP supports both approaches, but the accessibility tree is the primary and recommended mode. The browser_snapshot tool returns the accessibility tree, while browser_take_screenshot captures a visual screenshot. Most AI agent interactions use the accessibility tree for speed and cost efficiency, falling back to screenshots only when visual verification is needed.


Setting Up the Playwright MCP Server

Installation

Playwright MCP can be run directly via npx without any global installation:

# Run the MCP server (downloads and starts automatically)
npx @anthropic-ai/mcp-server-playwright

# Or install globally for repeated use
npm install -g @anthropic-ai/mcp-server-playwright

Configuration Options

The server accepts several configuration options:

# Start with a specific browser
npx @anthropic-ai/mcp-server-playwright --browser chromium

# Start in headed mode (visible browser window)
npx @anthropic-ai/mcp-server-playwright --headed

# Set viewport size
npx @anthropic-ai/mcp-server-playwright --viewport-size 1280,720

# Enable all tools including unsafe ones (like JavaScript execution)
npx @anthropic-ai/mcp-server-playwright --allow-unsafe

MCP Server Configuration File

For persistent configuration, create an MCP settings file. The exact location depends on the AI agent you are using.

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": [
        "@anthropic-ai/mcp-server-playwright",
        "--headed",
        "--viewport-size", "1280,720"
      ]
    }
  }
}

Connecting to Claude Code

Claude Code has native MCP support. To connect Playwright MCP:

Method 1: Project-Level Configuration

Create a .mcp.json file in your project root:

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-playwright", "--headed"]
    }
  }
}

When you start Claude Code in that directory, it automatically discovers and connects to the Playwright MCP server. You can then ask Claude to browse websites, test pages, and interact with web applications directly.

Method 2: Global Configuration

Add the server to your global Claude Code settings at ~/.claude/settings.json:

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-playwright"]
    }
  }
}

Verifying the Connection

After configuring, start Claude Code and check that the Playwright tools are available:

> Can you open https://example.com and tell me what you see?

If the MCP server is connected, Claude will use the browser_navigate tool to open the page and browser_snapshot to read the content, then describe what it found.


Connecting to Cursor

Cursor also supports MCP servers. Configure Playwright MCP in Cursor's settings:

Step-by-Step Setup

  1. Open Cursor settings (Cmd/Ctrl + Shift + P, then search for MCP)
  2. Navigate to the MCP Servers section
  3. Add a new server with the following configuration:
{
  "name": "playwright",
  "command": "npx",
  "args": ["@anthropic-ai/mcp-server-playwright", "--headed"]
}
  1. Save and restart Cursor
  2. The Playwright tools should now appear in the agent's tool list

Using Playwright MCP in Cursor

Once connected, you can ask Cursor's agent to interact with web pages:

  • "Go to our staging site and check if the login form works"
  • "Navigate to the dashboard and verify the chart data matches our API response"
  • "Fill out the registration form with test data and submit it"

The agent will use the MCP tools to perform these actions in a real browser.


Playwright MCP Tool Reference

The Playwright MCP server exposes the following tools to connected AI agents:

Navigation Tools

browser_navigate -- Navigate to a URL in the current tab.

Tool: browser_navigate
Input: { "url": "https://example.com" }

browser_navigate_back -- Go back to the previous page.

browser_navigate_forward -- Go forward in the browser history.

Page Reading Tools

browser_snapshot -- Returns the accessibility tree of the current page. This is the primary tool for understanding page content.

Tool: browser_snapshot
Output: Structured accessibility tree with element references

browser_take_screenshot -- Captures a screenshot of the current viewport. Use when visual verification is needed.

Interaction Tools

browser_click -- Click an element identified by its reference from the snapshot.

Tool: browser_click
Input: { "element": "Submit button", "ref": "e15" }

browser_type -- Type text into a focused element.

Tool: browser_type
Input: { "element": "Search input", "ref": "e4", "text": "test query" }

browser_fill_form -- Fill a form field (clears existing content first).

browser_select_option -- Select an option from a dropdown.

browser_hover -- Hover over an element (useful for tooltips and dropdown menus).

browser_press_key -- Press a keyboard key (Enter, Tab, Escape, etc.).

Tab Management

browser_tabs -- List all open tabs.

browser_new_tab -- Open a new tab.

browser_close_tab -- Close a tab.

Advanced Tools (Requires --allow-unsafe)

browser_evaluate -- Execute JavaScript in the browser context. Disabled by default for security.

browser_file_upload -- Upload a file to a file input element.

browser_network_requests -- View recent network requests made by the page.


Testing Workflows with Playwright MCP

Workflow 1: Exploratory Testing

Playwright MCP excels at exploratory testing where you want an AI agent to investigate a page and report findings:

User: "Go to our staging site at https://staging.myapp.com and test the
checkout flow. Try adding a product, going to cart, and starting checkout.
Report any issues you find."

Agent actions:
1. browser_navigate -> https://staging.myapp.com
2. browser_snapshot -> reads product listing
3. browser_click -> "Add to Cart" button on first product
4. browser_snapshot -> reads updated page, finds cart icon with count
5. browser_click -> Cart icon
6. browser_snapshot -> reads cart page with product details
7. browser_click -> "Proceed to Checkout" button
8. browser_snapshot -> reads checkout form
9. browser_fill_form -> fills shipping address fields
10. browser_take_screenshot -> captures the checkout state for the user

The agent can report issues like missing form validation, broken links, incorrect pricing, or unexpected error messages -- all discovered through real browser interaction.

Workflow 2: Quick Verification After Deployment

After deploying a change, use Playwright MCP to verify the deployment:

User: "Verify that the new pricing page is live at https://myapp.com/pricing
and that the Enterprise plan shows $499/month."

Agent actions:
1. browser_navigate -> https://myapp.com/pricing
2. browser_snapshot -> reads pricing page content
3. Reports: "The pricing page is live. The Enterprise plan shows $499/month
   as expected. I also noticed the Free tier, Starter at $29/month, and
   Professional at $199/month."

Workflow 3: Accessibility Audit

Because Playwright MCP uses the accessibility tree, it naturally surfaces accessibility issues:

User: "Check the login page for accessibility issues."

Agent actions:
1. browser_navigate -> https://myapp.com/login
2. browser_snapshot -> reads accessibility tree
3. Reports findings like: "The email input does not have an associated label
   (only a placeholder is used). The password toggle button has no accessible
   name. The form does not have a role='form' landmark."

Workflow 4: Data Extraction and Validation

Extract data from a web page and validate it against expected values:

User: "Go to our admin dashboard and verify there are more than 100 active
users in the user management table."

Agent actions:
1. browser_navigate -> https://admin.myapp.com/users
2. browser_snapshot -> reads the users table and pagination info
3. Reports: "The user management table shows 247 active users across
   13 pages. The first page displays 20 users, all with 'Active' status."

Workflow 5: Form Testing with Multiple Inputs

User: "Test the registration form with invalid data and verify error messages."

Agent actions:
1. browser_navigate -> https://myapp.com/register
2. browser_fill_form -> email: "not-an-email"
3. browser_fill_form -> password: "123"
4. browser_click -> Submit button
5. browser_snapshot -> reads error messages
6. Reports: "Form validation caught two issues: 'Please enter a valid email
   address' for the email field and 'Password must be at least 8 characters'
   for the password field."

Practical Example: Testing a Todo App

Here is a complete walkthrough of testing a Todo application using Playwright MCP through Claude Code:

User: "Test the todo app at http://localhost:3000 -- add three items,
complete one, delete another, and verify the remaining state."

The agent would execute the following sequence:

Step 1: Navigate to the app
Tool: browser_navigate { "url": "http://localhost:3000" }

Step 2: Read initial state
Tool: browser_snapshot
Result: Empty todo list with input field and "Add" button

Step 3: Add first todo
Tool: browser_click { "ref": "e3" }  // Focus input
Tool: browser_type { "text": "Buy groceries", "ref": "e3" }
Tool: browser_press_key { "key": "Enter" }

Step 4: Add second todo
Tool: browser_type { "text": "Write tests", "ref": "e3" }
Tool: browser_press_key { "key": "Enter" }

Step 5: Add third todo
Tool: browser_type { "text": "Deploy to staging", "ref": "e3" }
Tool: browser_press_key { "key": "Enter" }

Step 6: Verify all three items exist
Tool: browser_snapshot
Result: Three todo items visible in the list

Step 7: Complete the first todo
Tool: browser_click { "ref": "e7" }  // Checkbox for "Buy groceries"

Step 8: Delete the second todo
Tool: browser_click { "ref": "e12" }  // Delete button for "Write tests"

Step 9: Verify final state
Tool: browser_snapshot
Result: Two items remain -- "Buy groceries" (completed) and
"Deploy to staging" (active)

Step 10: Take screenshot for evidence
Tool: browser_take_screenshot

Limitations of Playwright MCP

While Playwright MCP is powerful for interactive exploration, it has significant limitations compared to writing Playwright scripts directly:

1. No Persistent Test Suite

MCP interactions are ephemeral. There is no test file to commit, review, or run in CI. Every interaction is a one-time conversation. If you need repeatable tests, you still need to write Playwright scripts.

2. Sequential Execution Only

MCP interactions happen one at a time in a conversational loop. You cannot run tests in parallel across multiple browsers or devices. This makes MCP unsuitable for regression testing at scale.

3. No Built-in Assertions

Playwright Test has a rich assertion library (expect(locator).toHaveText(), toBeVisible(), toHaveScreenshot()). MCP interactions rely on the AI agent to reason about whether the observed state matches expectations -- which is less reliable and not deterministic.

4. Cost Per Interaction

Every MCP tool call involves an AI agent inference step. For large test suites with hundreds of assertions, this becomes expensive in both time and API costs. A Playwright script running the same checks would be orders of magnitude cheaper.

5. No Network Interception by Default

While Playwright scripts can easily intercept and mock network requests, MCP's network tools are limited. You cannot set up request interception rules the way you can in a Playwright test.

6. Canvas and Complex Visuals

The accessibility tree cannot represent canvas-rendered content, complex SVG charts, or pixel-level visual states. Screenshots help but require vision model processing which is slower and less precise.

7. Authentication State

Managing authentication across MCP sessions requires manual handling. Playwright scripts can save and reuse storageState files; MCP sessions typically start fresh each time.


Playwright MCP vs Direct Playwright: When to Use Each

Use Playwright MCP When:

  • Exploratory testing: You want an AI agent to freely explore a page and report findings
  • Quick verifications: Checking a single page or feature after deployment
  • Accessibility audits: Leveraging the accessibility tree for instant a11y feedback
  • Prototyping interactions: Testing a workflow idea before writing a full test
  • Data extraction: Reading content from a page for analysis
  • Demo and training: Showing stakeholders how a feature works

Use Direct Playwright When:

  • Regression testing: You need repeatable, deterministic tests in CI
  • Parallel execution: Running tests across multiple browsers simultaneously
  • Performance testing: Measuring response times and rendering performance
  • Network mocking: Intercepting API calls and testing edge cases
  • Visual regression: Comparing screenshots against baselines with pixel precision
  • Complex workflows: Multi-step flows requiring precise assertions at each step
  • CI/CD pipelines: Tests must run without human intervention

Comparison Table

AspectPlaywright MCPDirect Playwright
Setup timeMinutesHours (framework setup)
RepeatabilityLow (conversational)High (committed scripts)
SpeedSlow (AI inference per step)Fast (millisecond execution)
Cost per runHigh (token costs)Low (compute only)
Parallel executionNoYes
CI/CD integrationNot practicalNative
Assertion qualityAI judgmentDeterministic matchers
Network interceptionLimitedFull control
MaintenanceNone (no code to maintain)Ongoing (selectors, flows)
FlexibilityVery highFramework-constrained

Combining MCP and Direct Playwright

The most effective approach in 2026 combines both. Use Playwright MCP for exploration and discovery, then codify important findings as Playwright scripts for regression protection.

Workflow: Explore Then Codify

  1. Explore with MCP: Ask your AI agent to navigate the application and test a new feature
  2. Identify critical paths: Based on the exploration, identify which workflows need permanent test coverage
  3. Generate Playwright tests: Ask the agent to generate Playwright test scripts based on the interactions it performed
  4. Review and commit: Review the generated tests, adjust assertions, and commit to your test suite
  5. Run in CI: The Playwright scripts now run automatically on every PR

This workflow gives you the speed of MCP exploration with the reliability of committed test scripts.

Example: From MCP Exploration to Playwright Script

After exploring a checkout flow via MCP, ask the agent to codify it:

// Generated from MCP exploration session
import { test, expect } from '@playwright/test';

test('checkout flow completes successfully', async ({ page }) => {
  await page.goto('https://myapp.com/products');

  // Add product to cart
  await page.getByRole('button', { name: 'Add to Cart' }).first().click();

  // Navigate to cart
  await page.getByRole('link', { name: /cart/i }).click();
  await expect(page.getByRole('heading', { name: 'Your Cart' })).toBeVisible();

  // Proceed to checkout
  await page.getByRole('button', { name: 'Proceed to Checkout' }).click();

  // Fill shipping details
  await page.getByLabel('Full Name').fill('Test User');
  await page.getByLabel('Address').fill('123 Test Street');
  await page.getByLabel('City').fill('Test City');
  await page.getByLabel('Zip Code').fill('12345');

  // Submit order
  await page.getByRole('button', { name: 'Place Order' }).click();

  // Verify confirmation
  await expect(
    page.getByRole('heading', { name: 'Order Confirmed' })
  ).toBeVisible();
});

Advanced MCP Patterns

Custom MCP Server with Authentication

For testing authenticated applications, you can create a custom MCP server that handles login automatically:

// custom-mcp-server.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { chromium } from 'playwright';

async function startAuthenticatedSession() {
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();

  // Perform login
  await page.goto('https://myapp.com/login');
  await page.getByLabel('Email').fill(process.env.TEST_EMAIL || '');
  await page.getByLabel('Password').fill(process.env.TEST_PASSWORD || '');
  await page.getByRole('button', { name: 'Sign in' }).click();
  await page.waitForURL('**/dashboard');

  return { browser, context, page };
}

MCP with Multiple Browser Contexts

Test multi-user scenarios by running multiple MCP sessions:

{
  "mcpServers": {
    "browser-admin": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-playwright", "--port", "3100"]
    },
    "browser-user": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-playwright", "--port", "3101"]
    }
  }
}

Performance Considerations

Token Usage

Each browser_snapshot call returns the full accessibility tree, which can be thousands of tokens for complex pages. To optimize:

  • Request snapshots only when you need updated page state
  • Use browser_click and browser_type without intermediate snapshots when the expected behavior is straightforward
  • For data-heavy pages, consider using browser_evaluate to extract specific values instead of reading the full tree

Latency

Each MCP tool call adds latency: network round-trip to the MCP server plus Playwright execution time plus AI inference time for the next action. A typical interaction loop (snapshot, reason, act) takes 3-8 seconds per step. For complex workflows with 20+ steps, expect 1-3 minutes total.

Browser Resource Usage

The MCP server runs a real browser instance. On machines with limited RAM, use headless mode and close tabs when done. For long-running sessions, monitor memory usage -- Chromium is known for gradual memory growth.


Troubleshooting Common Issues

Server fails to start: Ensure Node.js 18+ is installed. Check that the port is not already in use. Try running with --verbose for detailed logs.

Elements not found in snapshot: The element may not have proper ARIA roles or accessible names. Check that the web application follows accessibility best practices. Try browser_take_screenshot as a fallback.

Slow interactions: Use headless mode for faster execution. Reduce the viewport size to minimize rendering work. Close unnecessary tabs.

Authentication issues: MCP sessions start with a fresh browser profile. Configure cookies or storage state before testing authenticated pages.


The Future of MCP in Testing

Playwright MCP represents the first generation of AI-native browser automation. The trajectory points toward:

  • Smarter exploration: Agents that can autonomously discover and test application features without explicit instructions
  • Self-healing interactions: MCP sessions that adapt when page structure changes
  • Multi-agent testing: Multiple AI agents testing different parts of an application simultaneously through separate MCP sessions
  • Production monitoring: MCP-powered synthetic monitoring that can reason about page state, not just check for element existence
  • Test generation pipeline: MCP exploration that automatically produces Playwright scripts, reviewed and merged by humans

Getting Started

Install a QA skill to give your AI agent expert knowledge for browser testing:

npx @qaskills/cli add playwright-e2e
npx @qaskills/cli add mcp-testing

Browse all available testing skills at qaskills.sh/skills.


Conclusion

Playwright MCP bridges the gap between AI agents and browser automation, enabling a new category of testing workflows that were not possible before. The accessibility tree approach gives agents fast, structured understanding of web pages, while the tool-based interface makes browser interaction natural and safe. However, MCP is not a replacement for traditional Playwright test suites -- it is a complementary tool that excels at exploration, quick verification, and prototype testing. The most effective teams in 2026 use both: MCP for discovery and direct Playwright for regression protection. Understanding when to use each approach is the key to maximizing your testing investment.

Playwright MCP: Browser Automation for AI Agents Complete Guide | QASkills.sh