Skip to main content
Glama

Playwright MCP Server 🎭

Trust Score

A Model Context Protocol server that provides browser automation capabilities using Playwright. This server enables LLMs to interact with web pages, take screenshots, generate test code, web scrapes the page and execute JavaScript in a real browser environment.

✨ What's New in v1.0.10

🎯 Device Emulation with 143 Real Device Presets!

Test your web applications on real device profiles with a simple command:

// Test on iPhone 13 with automatic user-agent, touch support, and device pixel ratio
await playwright_resize({ device: "iPhone 13" });

// Switch to iPad with landscape orientation
await playwright_resize({ device: "iPad Pro 11", orientation: "landscape" });

// Test desktop view
await playwright_resize({ device: "Desktop Chrome" });

Natural Language Support for AI Assistants:

  • "Test on iPhone 13"

  • "Switch to iPad view"

  • "Rotate to landscape"

Supports 143 devices: iPhone, iPad, Pixel, Galaxy, and Desktop browsers with proper emulation of viewport, user-agent, touch events, and device pixel ratios.

📚 View Device Quick Reference | Prompt Guide

Related MCP server: Puppeteer MCP Server

Screenshot

Playwright + Claude

Documentation | API reference

Installation

You can install the package using either npm, mcp-get, or Smithery:

Using npm:

npm install -g @executeautomation/playwright-mcp-server

Using mcp-get:

npx @michaellatman/mcp-get@latest install @executeautomation/playwright-mcp-server

Using Smithery

To install Playwright MCP for Claude Desktop automatically via Smithery:

npx @smithery/cli install @executeautomation/playwright-mcp-server --client claude

Using Claude Code:

claude mcp add --transport stdio playwright npx @executeautomation/playwright-mcp-server

Installation in VS Code

Install the Playwright MCP server in VS Code using one of these buttons:

Alternatively, you can install the Playwright MCP server using the VS Code CLI:

# For VS Code
code --add-mcp '{"name":"playwright","command":"npx","args":["@executeautomation/playwright-mcp-server"]}'
# For VS Code Insiders
code-insiders --add-mcp '{"name":"playwright","command":"npx","args":["@executeautomation/playwright-mcp-server"]}'

After installation, the ExecuteAutomation Playwright MCP server will be available for use with your GitHub Copilot agent in VS Code.

Browser Installation

The Playwright MCP Server automatically installs browser binaries when you first use it. When the server detects that a browser is missing, it will:

  1. Automatically download and install the required browser (Chromium, Firefox, or WebKit)

  2. Display installation progress in the console

  3. Retry your request once installation completes

No manual setup required! Just start using the server, and it handles browser installation for you.

Manual Installation (Optional)

If you prefer to install browsers manually or encounter any issues with automatic installation:

# Install all browsers
npx playwright install

# Or install specific browsers
npx playwright install chromium
npx playwright install firefox
npx playwright install webkit

Browser Storage Location

Browsers are installed to:

  • Windows: %USERPROFILE%\AppData\Local\ms-playwright

  • macOS: ~/Library/Caches/ms-playwright

  • Linux: ~/.cache/ms-playwright

Configuration to use Playwright Server

Standard Mode (stdio)

This is the recommended mode for Claude Desktop.

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

Note: In stdio mode, logging is automatically directed to files only (not console) to maintain clean JSON-RPC communication. Logs are written to ~/playwright-mcp-server.log.

HTTP Mode (Standalone Server)

When running headed browser on systems without display or from worker processes of IDEs, you can run the MCP server as a standalone HTTP server:

Note for Claude Desktop Users: Claude Desktop currently requires stdio mode (command/args configuration). HTTP mode is recommended for VS Code, custom clients, and remote deployments. See CLAUDE_DESKTOP_CONFIG.md for details.

Starting the HTTP Server

# Using npx
npx @executeautomation/playwright-mcp-server --port 8931

# Or after global installation
playwright-mcp-server --port 8931

The server will start and display available endpoints:

==============================================
Playwright MCP Server (HTTP Mode)
==============================================
Port: 8931

ENDPOINTS:
- SSE Stream:     GET  http://localhost:8931/sse
- Messages:       POST http://localhost:8931/messages?sessionId=<id>
- MCP (unified):  GET  http://localhost:8931/mcp
- MCP (unified):  POST http://localhost:8931/mcp?sessionId=<id>
- Health Check:   GET  http://localhost:8931/health
==============================================

Client Configuration for HTTP Mode

⚠️ CRITICAL: The "type": "http" field is REQUIRED for HTTP/SSE transport!

For VS Code GitHub Copilot:

{
  "github.copilot.chat.mcp.servers": {
    "playwright": {
      "url": "http://localhost:8931/mcp",
      "type": "http"
    }
  }
}

For Custom MCP Clients:

{
  "mcpServers": {
    "playwright": {
      "url": "http://localhost:8931/mcp",
      "type": "http"
    }
  }
}

Important: Without "type": "http", the connection will fail.

For Claude Desktop: Use stdio mode instead (see Standard Mode above)

Use Cases for HTTP Mode

  • Running headed browsers on systems without display (e.g., remote servers)

  • Integrating with VS Code GitHub Copilot

  • Running the server as a background service

  • Accessing the server from multiple clients

  • Debugging with the /health endpoint

  • Custom MCP client integrations

Monitoring: The server includes a monitoring system that starts on a dynamically allocated port (avoiding conflicts). Check the console output for the actual port.

Note: For Claude Desktop, continue using stdio mode (Standard Mode above) for now.

Troubleshooting

"No transport found for sessionId" Error

Symptom: 400 error with message "Bad Request: No transport found for sessionId"

Solution:

  1. Check configuration includes "type": "http"

    {
      "url": "http://localhost:8931/mcp",
      "type": "http"  // ← This is REQUIRED!
    }
  2. Verify server logs show connection:

    # Should see these in order:
    # 1. "Incoming request" - GET /mcp
    # 2. "Transport registered" - with sessionId
    # 3. "POST message received" - with same sessionId
  3. Restart both server and client

Connection Issues

  • Server not starting: Check if port 8931 is available

  • External access blocked: This is by design (security). Server binds to localhost only

  • For remote access: Use SSH tunneling:

    ssh -L 8931:localhost:8931 user@remote-server

Testing

This project uses Jest for testing. The tests are located in the src/__tests__ directory.

Running Tests

You can run the tests using one of the following commands:

# Run tests using the custom script (with coverage)
node run-tests.cjs

# Run tests using npm scripts
npm test           # Run tests without coverage
npm run test:coverage  # Run tests with coverage
npm run test:custom    # Run tests with custom script (same as node run-tests.cjs)

The test coverage report will be generated in the coverage directory.

Running evals

The evals package loads an mcp client that then runs the index.ts file, so there is no need to rebuild between tests. You can load environment variables by prefixing the npx command. Full documentation can be found here.

OPENAI_API_KEY=your-key  npx mcp-eval src/evals/evals.ts src/tools/codegen/index.ts

Contributing

When adding new tools, please be mindful of the tool name length. Some clients, like Cursor, have a 60-character limit for the combined server and tool name (server_name:tool_name).

Our server name is playwright-mcp. Please ensure your tool names are short enough to not exceed this limit.

Star History

Star History Chart

Available Tools

32 tools
clear_codegen_sessionC

Clear a code generation session without generating a test

Inputs: sessionId (required).

end_codegen_sessionC

End a code generation session and generate the test file

Inputs: sessionId (required).

get_codegen_sessionC

Get information about a code generation session

Inputs: sessionId (required).

playwright_assert_responseB

Wait for and validate a previously initiated HTTP response wait operation.

Inputs: id (required), value.

playwright_clickC

Click an element on the page

Inputs: selector (required).

playwright_click_and_switch_tabA

Click a link and switch to the newly opened tab

Inputs: selector (required).

playwright_closeB

Close the browser and release all resources

Inputs: no named parameters.

playwright_console_logsC

Retrieve console logs from the browser with filtering options

Inputs: clear, limit, search, type.

playwright_custom_user_agentC

Set a custom User Agent for the browser

Inputs: userAgent (required).

playwright_deleteC

Perform an HTTP DELETE request

Inputs: url (required).

playwright_dragC

Drag an element to a target location

Inputs: sourceSelector (required), targetSelector (required).

playwright_evaluateC

Execute JavaScript in the browser console

Inputs: script (required).

playwright_expect_responseB

Ask Playwright to start waiting for a HTTP response. This tool initiates the wait operation but does not wait for its completion.

Inputs: id (required), url (required).

playwright_fillC

fill out an input field

Inputs: selector (required), value (required).

playwright_getC

Perform an HTTP GET request

Inputs: url (required).

playwright_get_visible_htmlC

Get the HTML content of the current page. By default, all tags are removed from the output unless removeScripts is explicitly set to false.

Inputs: cleanHtml, maxLength, minify, removeComments, +4 more.

playwright_get_visible_textB

Get the visible text content of the current page

Inputs: no named parameters.

playwright_go_backB

Navigate back in browser history

Inputs: no named parameters.

playwright_go_forwardA

Navigate forward in browser history

Inputs: no named parameters.

playwright_hoverC

Hover an element on the page

Inputs: selector (required).

playwright_iframe_clickC

Click an element in an iframe on the page

Inputs: iframeSelector (required), selector (required).

playwright_iframe_fillC

Fill an element in an iframe on the page

Inputs: iframeSelector (required), selector (required), value (required).

playwright_navigateC

Navigate to a URL

Inputs: url (required), browserType, headless, height, +3 more.

playwright_patchC

Perform an HTTP PATCH request

Inputs: url (required), value (required).

playwright_postC

Perform an HTTP POST request

Inputs: url (required), value (required), headers, token.

playwright_press_keyC

Press a keyboard key

Inputs: key (required), selector.

playwright_putC

Perform an HTTP PUT request

Inputs: url (required), value (required).

playwright_save_as_pdfC

Save the current page as a PDF file

Inputs: outputPath (required), filename, format, margin, +1 more.

playwright_screenshotC

Take a screenshot of the current page or a specific element

Inputs: name (required), downloadsDir, fullPage, height, +4 more.

playwright_selectC

Select an element on the page with Select tag

Inputs: selector (required), value (required).

playwright_upload_fileC

Upload a file to an input[type='file'] element on the page

Inputs: filePath (required), selector (required).

start_codegen_sessionC

Start a new code generation session to record Playwright actions

Inputs: options (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.3/5.0

    Scored across 32 tools

    Disambiguation4/5

    Most tools have distinct purposes, with clear separation between navigation, interaction, HTTP requests, and code generation functions. However, some overlap exists between playwright_click and playwright_iframe_click, and between playwright_fill and playwright_iframe_fill, which could cause minor confusion about when to use the iframe variants versus regular versions.

    Naming Consistency5/5

    Excellent naming consistency throughout. All tools follow a clear snake_case pattern with 'playwright_' prefix for browser operations and descriptive verb_noun combinations. The three codegen tools also follow a consistent pattern with 'codegen_session' suffix.

    Tool Count3/5

    32 tools is quite large for an MCP server, bordering on heavy. While Playwright is a comprehensive browser automation library, this many tools may overwhelm agents and could potentially be consolidated (e.g., HTTP methods could be a single tool with method parameter).

    Completeness5/5

    The tool surface provides comprehensive coverage of Playwright's core functionality including navigation, element interaction, iframe handling, HTTP requests, debugging (console logs), file operations, PDF/screenshot generation, and code generation. No obvious gaps exist for typical browser automation workflows.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      A Model Context Protocol server that provides browser automation capabilities using Playwright, enabling LLMs to interact with web pages, take screenshots, and execute JavaScript in a real browser environment.
      19
      Apache 2.0
    • A
      license
      B
      quality
      D
      maintenance
      A Model Context Protocol server that provides browser automation capabilities using Puppeteer, enabling LLMs to interact with web pages, take screenshots, and execute JavaScript in a real browser environment.
      7
      28,579 npm
      1
      MIT
    • A
      license
      B
      quality
      D
      maintenance
      A Model Context Protocol server that provides browser automation capabilities using Playwright, enabling LLMs to interact with web pages, take screenshots, generate test code, scrape web content, and execute JavaScript in real browser environments.
      31
      13,901 npm
      MIT