
Better Playwright MCP
A client-server browser automation solution that reduces HTML token usage by up to 90% through semantic snapshots, enabling complex web interactions without exhausting AI context windows.
Tools
createPage
创建新的浏览器页面
listPages
列出所有管理的页面(包含标题和URL)
browserFileUpload
上传文件到指定元素
getElementHTML
通过xp引用获取元素的outerHTML结构,用于调试选择器
getScreenshot
获取页面截图并保存到临时目录,返回文件路径
activatePage
激活指定的页面
closePage
关闭指定的页面
closeAllPages
关闭所有管理的页面
listPagesWithoutId
列出所有未被管理的页面
closePagesWithoutId
关闭所有未被管理的页面
closePageByIndex
通过索引关闭页面
browserClick
点击页面元素
browserType
在页面元素中输入文本
browserHover
悬停在页面元素上
browserSelectOption
在下拉框中选择选项
browserPressKey
按键盘按键
browserHandleDialog
处理浏览器对话框
browserNavigate
导航到指定URL
browserNavigateBack
返回到上一页
browserNavigateForward
前进到下一页
scrollToBottom
滚动到页面或元素底部
scrollToTop
滚动到页面或元素顶部
waitForTimeout
等待指定毫秒数
waitForSelector
等待指定选择器的元素出现
getPDFSnapshot
获取页面的PDF快照
getPageSnapshot
获取页面的语义化简化快照,返回清晰的缩进结构
downloadImage
下载图片到本地临时目录,返回本地文件路径
captureSnapshot
捕获网页的完整快照,支持滚动、等待和自动修剪功能
README
better-playwright-mcp
A better Playwright MCP (Model Context Protocol) server that uses a client-server architecture for browser automation.
Why Better?
Traditional browser automation tools send entire page HTML to AI assistants, which quickly exhausts token limits and makes complex web interactions impractical. better-playwright-mcp solves this with an innovative semantic snapshot algorithm that reduces page content by up to 90% while preserving all meaningful elements.
The Problem
- Full page HTML often exceeds 100K+ tokens
- Most HTML is noise: inline styles, tracking scripts, invisible elements
- AI assistants have limited context windows (even with 200K limits)
- Complex web automation becomes impossible after just a few page loads
Our Solution: Semantic Snapshots
Our core innovation is a multi-stage pruning algorithm that:
- Identifies meaningful elements - Interactive elements (buttons, inputs), semantic HTML5 tags, and text-containing elements
- Generates unique identifiers - Each element gets a hash-based
xp
attribute derived from its XPath for precise targeting - Removes invisible content - Elements with
display:none
, zero dimensions, or hidden parents are marked and removed - Unwraps useless wrappers - Eliminates divs and spans that only wrap other elements
- Strips unnecessary attributes - Keeps only essential attributes like
href
,value
,placeholder
Result: A clean, semantic representation that typically uses only 10% of the original tokens while maintaining full functionality.
Architecture
This project implements a unique two-tier architecture:
- MCP Server - Communicates with AI assistants via Model Context Protocol
- HTTP Server - Runs in the background to control the actual browser instances
AI Assistant <--[MCP Protocol]--> MCP Server <--[HTTP]--> HTTP Server <---> Browser
This design allows the MCP server to remain lightweight while delegating browser control to a dedicated HTTP service.
Features
- 🎯 90% token reduction through semantic HTML snapshots
- 🎭 Full Playwright browser automation via MCP
- 🏗️ Client-server architecture for better separation of concerns
- 🛡️ Stealth mode to avoid detection
- 📍 Hash-based element identifiers for precise targeting
- 💾 Persistent browser profiles
- 🚀 Optimized for long-running automation tasks
- 📊 Token-aware output with automatic truncation
Installation
npm install -g better-playwright-mcp
Usage
Default Mode (MCP)
The MCP server requires an HTTP server to be running. You need to start both:
Step 1: Start the HTTP server
npx better-playwright-mcp server
Step 2: In another terminal, start the MCP server
npx better-playwright-mcp
The MCP server will:
- Start listening on stdio for MCP protocol messages
- Connect to the HTTP server on port 3102
- Route browser automation commands through the HTTP server
Options:
--snapshot-dir <path>
- Directory to save snapshots
Standalone HTTP Server Mode
You can also run the HTTP server independently (useful for debugging or custom integrations):
npx better-playwright-mcp server
Options:
-p, --port <number>
- Server port (default: 3102)--host <string>
- Server host (default: localhost)--headless
- Run browser in headless mode--chromium
- Use Chromium instead of Chrome--no-user-profile
- Do not use persistent user profile--user-data-dir <path>
- User data directory--snapshot-dir <path>
- Directory to save snapshots
MCP Tools
When used with AI assistants, the following tools are available:
Page Management
createPage
- Create a new browser page with name and descriptionactivatePage
- Activate a specific page by IDclosePage
- Close a specific pagelistPages
- List all managed pages with titles and URLscloseAllPages
- Close all managed pageslistPagesWithoutId
- List unmanaged browser pagesclosePagesWithoutId
- Close all unmanaged pagesclosePageByIndex
- Close page by index
Browser Actions
browserClick
- Click an element using itsxp
identifierbrowserType
- Type text into an elementbrowserHover
- Hover over an elementbrowserSelectOption
- Select options in a dropdownbrowserPressKey
- Press keyboard keysbrowserFileUpload
- Upload files to file inputbrowserHandleDialog
- Handle browser dialogs (alert, confirm, prompt)browserNavigate
- Navigate to a URLbrowserNavigateBack
- Go back to previous pagebrowserNavigateForward
- Go forward to next pagescrollToBottom
- Scroll to bottom of page/elementscrollToTop
- Scroll to top of page/elementwaitForTimeout
- Wait for specified millisecondswaitForSelector
- Wait for element to appear
Snapshot & Utilities
getPageSnapshot
- Get semantic HTML snapshot withxp
identifiersgetScreenshot
- Take a screenshot (PNG/JPEG)getPDFSnapshot
- Generate PDF of the pagegetElementHTML
- Get HTML of specific elementdownloadImage
- Download image from URLcaptureSnapshot
- Capture full page with automatic scrolling
How It Works
Semantic Snapshots in Action
Before (original HTML):
<div class="wrapper" style="padding: 20px; margin: 10px;">
<div class="container">
<div class="inner">
<button class="btn btn-primary" onclick="handleClick()"
style="background: blue; color: white;">
Click me
</button>
</div>
</div>
</div>
After (semantic snapshot):
button xp=3fa2b8c1 Click me
The algorithm:
- Removes unnecessary wrapper divs
- Strips inline styles and event handlers
- Adds unique identifier (
xp
attribute) - a hash of the element's XPath - Preserves only meaningful content
Diff-Based Optimization
To reduce data transfer and token usage:
- First snapshot is always complete
- Subsequent snapshots only include changes (diffs)
- Automatic caching for performance
Stealth Features
Browser instances are configured with:
- Custom user agent strings
- Disabled automation indicators
- WebGL vendor spoofing
- Canvas fingerprint protection
Examples
Creating and Navigating Pages
// MCP Tool Usage
{
"tool": "createPage",
"arguments": {
"name": "shopping",
"description": "Amazon shopping page",
"url": "https://amazon.com"
}
}
// Returns: { pageId: "uuid", snapshot: "..." }
Interacting with Elements
// Click on element using its xp identifier
{
"tool": "browserClick",
"arguments": {
"pageId": "uuid",
"ref": "3fa2b8c1" // The xp attribute value from snapshot
}
}
// Type text into input field
{
"tool": "browserType",
"arguments": {
"pageId": "uuid",
"ref": "xp456",
"text": "search query",
"submit": true // Press Enter after typing
}
}
Capturing Page State
// Get semantic snapshot
{
"tool": "getPageSnapshot",
"arguments": {
"pageId": "uuid"
}
}
// Take screenshot
{
"tool": "getScreenshot",
"arguments": {
"pageId": "uuid",
"fullPage": true,
"type": "png"
}
}
Development
Prerequisites
- Node.js >= 18.0.0
- TypeScript
- Chrome or Chromium browser
Building from Source
# Clone the repository
git clone https://github.com/yourusername/better-playwright-mcp.git
cd better-playwright-mcp
# Install dependencies
npm install
# Build the project
npm run build
# Run in development mode
npm run dev
Project Structure
better-playwright-mcp/
├── src/
│ ├── index.ts # MCP mode entry point
│ ├── server.ts # HTTP server mode entry point
│ ├── playwright-mcp.ts # MCP server implementation
│ ├── client/
│ │ └── playwright-client.ts # HTTP client for MCP→HTTP communication
│ ├── server/
│ │ └── playwright-server.ts # HTTP server controlling browsers
│ ├── extractor/
│ │ ├── parse2.ts # HTML parsing with xp identifier generation
│ │ ├── simplify-html.ts # HTML simplification
│ │ └── utils.ts # Extraction utilities
│ └── utils/
│ └── token-limiter.ts # Token counting and limiting
├── bin/
│ └── cli.js # CLI entry point
├── package.json
├── tsconfig.json
├── CLAUDE.md # Instructions for AI assistants
└── README.md
Troubleshooting
Common Issues
-
MCP server not connecting
- Ensure the HTTP server is accessible on port 3102
- Check firewall settings
- Try running with
DEBUG=* npx better-playwright-mcp
-
Browser not launching
- Ensure Chrome or Chromium is installed
- Try using
--chromium
flag - Check system resources
-
Token limit exceeded
- Snapshots are automatically truncated to 20,000 tokens
- Use targeted selectors to reduce snapshot size
- Consider using screenshot instead of snapshot for visual inspection
Debug Mode
Enable detailed logging:
DEBUG=* npx better-playwright-mcp
Logs and Records
Operation records are saved to:
- macOS/Linux:
/tmp/playwright-records/
- Windows:
%TEMP%\playwright-records\
Each page has its own directory with timestamped operation logs.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.