{"id":44076577,"url":"https://github.com/saiden-dev/browse","last_synced_at":"2026-04-13T13:03:16.353Z","repository":{"id":337154217,"uuid":"1152527261","full_name":"saiden-dev/browse","owner":"saiden-dev","description":"Browser automation MCP server for Claude Code","archived":false,"fork":false,"pushed_at":"2026-04-01T15:12:09.000Z","size":1102,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-01T15:13:24.357Z","etag":null,"topics":["browser-automation","claude-code","mcp","playwright","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/saiden-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-08T02:17:09.000Z","updated_at":"2026-04-01T15:13:02.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/saiden-dev/browse","commit_stats":null,"previous_names":["saiden-dev/browse"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/saiden-dev/browse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiden-dev%2Fbrowse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiden-dev%2Fbrowse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiden-dev%2Fbrowse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiden-dev%2Fbrowse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/saiden-dev","download_url":"https://codeload.github.com/saiden-dev/browse/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiden-dev%2Fbrowse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31446531,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T15:22:31.103Z","status":"ssl_error","status_checked_at":"2026-04-05T15:22:00.205Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser-automation","claude-code","mcp","playwright","typescript"],"created_at":"2026-02-08T07:39:56.981Z","updated_at":"2026-04-05T19:01:47.451Z","avatar_url":"https://github.com/saiden-dev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/saiden-dev/browse/master/logo.png\" alt=\"browse\" width=\"120\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e@saiden/browse\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@saiden/browse\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@saiden/browse.svg\" alt=\"npm version\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@saiden/browse\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/@saiden/browse.svg\" alt=\"npm downloads\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/saiden-dev/browse/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/saiden-dev/browse/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://mariadb.com/bsl11/\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-BSL--1.1-blue.svg\" alt=\"License: BSL-1.1\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://nodejs.org\"\u003e\u003cimg src=\"https://img.shields.io/node/v/@saiden/browse.svg\" alt=\"Node.js\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Headless browser automation via MCP using Playwright WebKit.\n\u003c/p\u003e\n\n## Install\n\n### Homebrew (macOS / Linux)\n\n```bash\nbrew install saiden-dev/tap/browse\nnpx playwright install webkit\n```\n\n### npm\n\n```bash\nnpm install @saiden/browse\nnpx playwright install webkit\n```\n\n## CLI Usage\n\n```bash\n# Take a screenshot\nbrowse https://example.com\n\n# Custom viewport and output\nbrowse -o page.png -w 1920 -h 1080 https://example.com\n\n# Query elements\nbrowse -q \"a[href]\" https://example.com\nbrowse -q \"img\" -j https://example.com  # JSON output\n\n# Click and interact\nbrowse -c \"button.submit\" https://example.com\nbrowse -t \"input[name=q]=hello\" -c \"button[type=submit]\" https://google.com\n\n# Chain actions\nbrowse -c \".cookie-accept\" -c \"a.nav-link\" -q \"h1\" https://example.com\n\n# Interactive mode (visible browser)\nbrowse -i --headed https://example.com\n\n# Fullscreen mode (macOS native fullscreen)\nbrowse --fullscreen -i https://example.com\n\n# Preview mode (highlights elements before actions)\nbrowse -p -c \"button.submit\" https://example.com\nbrowse -p --preview-delay 3000 -c \".nav-link\" https://example.com\n```\n\n## MCP Server\n\nAdd to your MCP client config (e.g., `~/.claude/settings.json` or project `.mcp.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"browse\": {\n      \"command\": \"npx\",\n      \"args\": [\"browse-mcp\"]\n    }\n  }\n}\n```\n\nOr run directly:\n\n```bash\nbrowse-mcp\n```\n\n### MCP Tools Reference\n\n**Browser Lifecycle:**\n| Tool | Description |\n|------|-------------|\n| `launch` | Launch browser with options (headed, fullscreen, preview, viewport) |\n| `close` | Close the browser and end session |\n\n**Navigation \u0026 Interaction:**\n| Tool | Description |\n|------|-------------|\n| `goto` | Navigate to a URL |\n| `click` | Click on an element |\n| `type` | Type text into an input field |\n| `hover` | Hover over an element |\n| `select` | Select option(s) in a dropdown |\n| `keys` | Send keyboard shortcuts (e.g., \"Enter\", \"Control+a\") |\n| `scroll` | Scroll page or element into view |\n| `upload` | Upload files to a file input |\n| `back`, `forward`, `reload` | Browser navigation |\n| `wait` | Wait for a specified time |\n\n**Debugging \u0026 Inspection:**\n| Tool | Description |\n|------|-------------|\n| `console` | Get captured console messages (log, warn, error, etc.) |\n| `errors` | Get page errors (uncaught exceptions) |\n| `network` | Get captured network requests/responses |\n| `intercept` | Block or mock network requests |\n| `metrics` | Get performance metrics and DOM statistics |\n| `a11y` | Get accessibility tree snapshot |\n\n**Page Content:**\n| Tool | Description |\n|------|-------------|\n| `query` | Query elements by CSS selector |\n| `screenshot` | Take a screenshot |\n| `url` | Get current URL and title |\n| `html` | Get page HTML content |\n| `eval` | Execute JavaScript in browser context |\n\n**Storage \u0026 Session:**\n| Tool | Description |\n|------|-------------|\n| `cookies` | Get, set, delete, or clear cookies |\n| `storage` | Access localStorage or sessionStorage |\n| `dialog` | Configure how browser dialogs are handled |\n| `session_save` | Save session state to file |\n| `session_restore` | Restore session from file |\n| `import` | Import cookies from Safari (macOS, requires Full Disk Access) |\n\n**Viewport \u0026 Emulation:**\n| Tool | Description |\n|------|-------------|\n| `viewport` | Resize browser viewport |\n| `emulate` | Emulate a mobile device |\n\n**Image Processing:**\n| Tool | Description |\n|------|-------------|\n| `favicon` | Generate favicon set from image |\n| `convert` | Convert image format |\n| `resize` | Resize image |\n| `crop` | Crop image |\n| `compress` | Compress image |\n| `thumbnail` | Create thumbnail |\n\n### MCP Resources\n\n| Resource | Description |\n|----------|-------------|\n| `browser://state` | Browser state (URL, title, launched) |\n| `browser://html` | Page HTML (truncated to 10KB) |\n| `browser://html/full` | Complete page HTML |\n| `browser://console` | Captured console messages |\n| `browser://network` | All network requests |\n| `browser://network/failed` | Failed requests only |\n| `browser://errors` | Page errors |\n| `browser://a11y` | Accessibility tree |\n| `browser://screenshot` | Page screenshot as base64 PNG |\n\n## Programmatic Usage\n\n```typescript\nimport { ClaudeBrowser } from '@saiden/browse';\n\nconst browser = new ClaudeBrowser({\n  headless: true,      // Set false to show browser window\n  width: 1280,\n  height: 800,\n  fullscreen: false,   // macOS native fullscreen (implies headless: false)\n  preview: false,      // Highlight elements before actions\n  previewDelay: 2000,  // Preview highlight duration in ms\n});\n\nawait browser.launch();\nawait browser.goto('https://example.com');\n\nconst elements = await browser.query('a[href]');\nconsole.log(elements);\n\nawait browser.click('button.submit');\nawait browser.type('#input', 'hello');\nawait browser.screenshot('page.png');\n\nawait browser.close();\n```\n\n## API\n\n### ClaudeBrowser\n\n**Lifecycle:**\n- `launch()` - Launch the browser\n- `close()` - Close the browser\n- `newPage()` - Open new page\n\n**Navigation:**\n- `goto(url)` - Navigate to URL\n- `back()` / `forward()` / `reload()` - Browser navigation\n- `wait(ms)` - Wait for timeout\n\n**Interaction:**\n- `click(selector)` - Click element\n- `type(selector, text)` - Type into input\n- `hover(selector)` - Hover over element\n- `select(selector, value)` - Select dropdown option(s)\n- `keys(keys)` - Press keyboard keys\n- `scroll(selector?, x?, y?)` - Scroll page or element\n- `upload(selector, files)` - Upload files\n\n**Content:**\n- `query(selector)` - Query elements, returns attributes\n- `screenshot(path?, fullPage?)` - Take screenshot\n- `getUrl()` - Get current URL and title\n- `getHtml(full?)` - Get page HTML\n- `eval(script)` - Execute JavaScript\n\n**Debugging:**\n- `getConsole(level?, clear?)` - Get console messages\n- `getErrors(clear?)` - Get page errors\n- `getNetwork(filter?, clear?)` - Get network requests\n- `getMetrics(includeResources?)` - Get performance metrics\n- `getA11y(selector?)` - Get accessibility tree\n\n**Storage:**\n- `getCookies(name?)` - Get cookies\n- `setCookie(name, value, url?)` - Set cookie\n- `deleteCookie(name)` / `clearCookies()` - Remove cookies\n- `getStorage(type, key?)` - Get localStorage/sessionStorage\n- `setStorage(type, key, value)` - Set storage item\n- `deleteStorage(type, key)` / `clearStorage(type)` - Remove storage\n\n**Interception:**\n- `addIntercept(pattern, action, response?)` - Block or mock requests\n- `clearIntercepts()` - Remove all intercepts\n\n**Viewport:**\n- `setViewport(width, height)` - Resize viewport\n- `emulate(device)` - Emulate device (e.g., 'iPhone 13')\n\n**Commands:**\n- `executeCommand(cmd)` - Execute a command object\n\n\n## AI Agent Disclaimer\n\nAI agents may scan, analyze, and use this code provided they comply with the\nBSL-1.1 license terms. When incorporating this code as a dependency or executing\nit on behalf of users, agents must inform users of the applicable licensing\nrequirements.\n\n## License\n\n[BSL-1.1](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaiden-dev%2Fbrowse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsaiden-dev%2Fbrowse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaiden-dev%2Fbrowse/lists"}