playwright-slim-mcp
# playwright-slim-mcp
A proxy MCP server for Playwright that summarizes accessibility snapshots using Claude Haiku to reduce context usage.
## Quickstart
Add to your Claude Code MCP config (`~/.claude.json`):
```json
{
"mcpServers": {
"playwright-slim": {
"command": "npx",
"args": ["playwright-slim-mcp"],
"env": {
"ANTHROPIC_API_KEY": "sk-ant-..."
}
}
}
}
```
That's it! The proxy will automatically download and run.
## Problem
The official `@playwright/mcp` returns full accessibility tree snapshots after every action (click, type, navigate, etc.). These snapshots can be 2-10KB+ each, quickly consuming context window.
## Solution
This proxy:
1. Forwards all requests to the real Playwright MCP
2. Intercepts responses containing page snapshots
3. Uses Anthropic API (Claude Haiku) to summarize snapshots to ~10 lines
4. Preserves `[ref=XXX]` values for interactive elements so you can still click/type
## Installation
### Via npx (recommended)
No installation needed - just add to your MCP config as shown in Quickstart.
### Global install
```bash
npm install -g playwright-slim-mcp
```
Then use in your MCP config:
```json
{
"mcpServers": {
"playwright-slim": {
"command": "playwright-slim-mcp",
"env": {
"ANTHROPIC_API_KEY": "sk-ant-..."
}
}
}
}
```
### From source
```bash
git clone https://github.com/jsdf/playwright-slim-mcp.git
cd playwright-slim-mcp
npm install
npm run build
```
## Requirements
- `ANTHROPIC_API_KEY` environment variable
- Node.js 18+
## Environment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| `ANTHROPIC_API_KEY` | Yes | Your Anthropic API key |
| `PLAYWRIGHT_SLIM_MODEL` | No | Model for summarization (default: `claude-3-5-haiku-latest`) |
| `DEBUG` or `PLAYWRIGHT_SLIM_DEBUG` | No | Set to `1` to enable file logging to `logs/` |
## Configuration
The proxy summarizes snapshots for these tools:
- `browser_click`
- `browser_type`
- `browser_press_key`
- `browser_select_option`
- `browser_hover`
- `browser_drag`
- `browser_navigate`
- `browser_navigate_back`
- `browser_handle_dialog`
- `browser_file_upload`
- `browser_fill_form`
- `browser_snapshot`
Small snapshots (<500 chars) are passed through unchanged.
### Unsummarized Snapshots
Use `browser_snapshot_full` to get the raw accessibility tree without summarization. This tool is automatically added as an alias.
## Testing
```bash
# Create .env file with your API key
echo "ANTHROPIC_API_KEY=sk-ant-..." > .env
# Run tests (includes real API calls and browser tests)
npm test
```
## Example
**Before (2KB+):**
```yaml
- generic [ref=e327]:
- generic [ref=e328]:
- heading "Go back James's Workspace" [level=4] [ref=e329]:
- button "Go back" [ref=e330] [cursor=pointer]:
- img [ref=e331]
- text: James's Workspace
# ... 100+ more lines
```
**After (~200 bytes):**
```
Admin settings for "James's Workspace"
Tabs: Overview [e343], Feature flags [e348, selected], Members [e353], Tables [e358]
Actions: Go back [e330], Impersonate [e334]
```
## License
MIT
TDQS
Scored across 25 tools
Most tools have clearly distinct purposes, but browser_snapshot vs browser_snapshot_full, browser_evaluate vs browser_run_code_unsafe, and browser_close vs browser_tabs (closing page vs tab) create some overlap. Descriptions help but an agent must read carefully to pick correctly.
All tools use the browser_ prefix with snake_case and clear verb_noun or noun patterns (e.g., browser_click, browser_navigate, browser_take_screenshot). The convention is consistent throughout with no deviations.
25 tools is at the high end for a single server; while many are necessary for full browser control, some could be consolidated (e.g., snapshot variants, separate network request tools). The count feels heavy and borderline for the 'slim' name.
The surface covers navigation, interaction, forms, keyboard, mouse, tabs, network, console, dialogs, file upload, drag/drop, screenshots, and snapshots. Minor gaps include no explicit forward navigation (only back) or page reload, but these are workaroundable.