Skip to main content
Glama
README.md
# playread

Google search automation via Playwright MCP. Can be used as a CLI tool or as an MCP server.

## Installation

```bash
npm install -g playread
```

Or use directly with npx:

```bash
npx -y playread@latest google-search
```

## Usage

### As an MCP Server

Start playread as an MCP server to expose all flows as tools:

```bash
playread mcp
```

Or configure in your MCP client settings (e.g., Claude Desktop):

```json
{
  "mcpServers": {
    "playread": {
      "command": "npx",
      "args": ["-y", "playread@latest", "mcp"]
    }
  }
}
```

Available MCP tools:
- `fetch` - Fetch and extract main content from a web page URL
- `google-search` - Perform a Google search and extract results

### As a CLI Tool

### Google Search
```bash
playread google-search
```

Output format:
```json
{
  "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:

```bash
playread fetch https://example.com
```

Output format:
```json
{
  "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:

```javascript
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 server
- `disconnect()` - Disconnect and cleanup

### Tools Discovery
- `listTools()` - List all available tools
- `callTool(name, args)` - Call any tool directly

### Browser Control
- `navigate(url)` - Navigate to URL
- `navigateBack()` - Go back
- `close()` - Close browser
- `resize(width, height)` - Resize window
- `install()` - Install browser

### Page Interaction
- `snapshot()` - Get accessibility snapshot
- `click(element, ref)` - Click element
- `type(element, ref, text, submit, slowly)` - Type text
- `pressKey(key)` - Press keyboard key
- `hover(element, ref)` - Hover over element
- `drag(startElement, startRef, endElement, endRef)` - Drag and drop

### Forms
- `fillForm(fields)` - Fill multiple form fields
- `selectOption(element, ref, values)` - Select dropdown option
- `fileUpload(paths)` - Upload files

### Page State
- `evaluate(func)` - Execute JavaScript
- `screenshot(filename, type, fullPage, element, ref)` - Take screenshot
- `consoleMessages(onlyErrors)` - Get console logs
- `networkRequests()` - 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
- 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_evaluate` for debugging window globals
- No hardcoded values - all flows use ground truth from snapshots
- Screenshots are automatically saved to `/tmp/playwright-mcp-output/<timestamp>/`