playread
Google search automation via Playwright MCP. Can be used as a CLI tool or as an MCP server.
Installation
npm install -g playread
Or use directly with npx:
npx -y playread@latest google-search
Usage
As an MCP Server
Start playread as an MCP server to expose all flows as tools:
playread mcp
Or configure in your MCP client settings (e.g., Claude Desktop):
{
"mcpServers": {
"playread": {
"command": "npx",
"args": ["-y", "playread@latest", "mcp"]
}
}
}
Available MCP tools:
fetch- Fetch and extract main content from a web page URLgoogle-search- Perform a Google search and extract results
As a CLI Tool
Google Search
playread google-search
Output format:
{
"query": "Playwright automation testing",
"totalResults": 18,
"results": [
{
"title": "Playwright: Fast and reliable end-to-end testing for modern ...",
"url": "https://playwright.dev/",
"description": "Playwright enables reliable end-to-end testing for modern web apps..."
}
]
}
Fetch URL Content
Extract important text content from any URL:
playread fetch https://example.com
Output format:
{
"url": "https://example.com/",
"title": "Example Domain",
"contentLength": 129,
"content": "# Example Domain\nThis domain is for use in documentation examples..."
}
Perfect for:
- Extracting documentation from websites
- Fetching article content
- Parsing blog posts
- Getting README content from GitHub
- Any text-heavy webpage
Creating Custom Flows
Flows are JavaScript modules that export a single async function. The function receives a connected PlaywrightMCPClient instance.
Create a new flow in the flows/ directory:
module.exports = async function(client) {
await client.navigate('https://example.com');
const snapshot = await client.snapshot();
console.log('Page loaded');
await client.close();
};
Available Client Methods
Connection
connect()- Connect to Playwright MCP serverdisconnect()- Disconnect and cleanup
Tools Discovery
listTools()- List all available toolscallTool(name, args)- Call any tool directly
Browser Control
navigate(url)- Navigate to URLnavigateBack()- Go backclose()- Close browserresize(width, height)- Resize windowinstall()- Install browser
Page Interaction
snapshot()- Get accessibility snapshotclick(element, ref)- Click elementtype(element, ref, text, submit, slowly)- Type textpressKey(key)- Press keyboard keyhover(element, ref)- Hover over elementdrag(startElement, startRef, endElement, endRef)- Drag and drop
Forms
fillForm(fields)- Fill multiple form fieldsselectOption(element, ref, values)- Select dropdown optionfileUpload(paths)- Upload files
Page State
evaluate(func)- Execute JavaScriptscreenshot(filename, type, fullPage, element, ref)- Take screenshotconsoleMessages(onlyErrors)- Get console logsnetworkRequests()- Get network activity
Dialogs
handleDialog(accept, promptText)- Handle alerts/confirms
Tabs
tabs(action, index)- Manage browser tabs
Wait
waitFor(text, textGone, time)- Wait for conditions
Flow Details
google-search
- Navigates to Google
- Searches for "Playwright automation testing"
- Waits 30 seconds for results to load
- Extracts all result titles, URLs, and descriptions
- Returns comprehensive JSON output with full result metadata
fetch
- Accepts a URL as an argument
- Navigates to the URL
- Intelligently extracts main content using heuristics:
- Prioritizes
<main>,<article>, and semantic content areas - Extracts structured text including headings, paragraphs, lists, and code blocks
- Removes duplicate content and navigation elements
- Formats output as clean markdown
- Prioritizes
- Returns JSON with URL, title, content length, and extracted content
- Limits output to 50,000 characters for conciseness
- Works universally across documentation sites, blogs, articles, and more
Requirements
- Node.js 14+
- Playwright MCP server (installed automatically via npx)
Notes
- Always close the browser before flows complete
- Supports
file://URLs for local testing - Use
browser_evaluatefor debugging window globals - No hardcoded values - all flows use ground truth from snapshots
- Screenshots are automatically saved to
/tmp/playwright-mcp-output/<timestamp>/