{"_id":"glance-mcp","_rev":"4-4e8ae14ed07f7bcdc1951b4376025bf0","name":"glance-mcp","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"glance-mcp","version":"1.0.0","keywords":["mcp","browser","automation","playwright","claude","claude-code","testing","screenshot","e2e","debugbase","ai-agent"],"author":{"name":"DebugBase","email":"hello@debugbase.io"},"license":"MIT","_id":"glance-mcp@1.0.0","maintainers":[{"name":"debugbase","email":"info@debugbase.io"}],"homepage":"https://github.com/DebugBase/glance","bugs":{"url":"https://github.com/DebugBase/glance/issues"},"bin":{"glance":"build/index.js"},"dist":{"shasum":"eb736b79e380c6212db0e4f0b5141f781231d37a","tarball":"https://registry.npmjs.org/glance-mcp/-/glance-mcp-1.0.0.tgz","fileCount":4,"integrity":"sha512-3NJfVncMuAywJ4uJ70hGmGUQYxZnRCQbG043WALzXpiJebYxP4ZmCF40RL2qh9ark+b0VB+6+5PQpATlQM3L2A==","signatures":[{"sig":"MEYCIQDkHh6w8JmXo8+PByRuv4P6kQ9MhnpIRuGOr6BwuBKC8QIhAJcgkarn97p7EWVBfvCAJOP3B7AY5vovC6eBddk5cN7m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":800766},"main":"build/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b4e89217502f9d260275a6e0b7e2e55d2fbc9cb0","scripts":{"build":"node esbuild.config.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"debugbase","email":"info@debugbase.io"},"repository":{"url":"git+https://github.com/DebugBase/glance.git","type":"git"},"_npmVersion":"11.6.2","description":"AI-powered browser automation MCP server for Claude Code","directories":{},"_nodeVersion":"24.11.1","dependencies":{"zod":"^3.22.4","uuid":"^9.0.0","pngjs":"^7.0.0","pixelmatch":"^6.0.0","playwright-core":"^1.50.0","@modelcontextprotocol/sdk":"latest"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.27.4","typescript":"^5.3.2","@types/node":"^20.10.0","@types/uuid":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/glance-mcp_1.0.0_1774611188435_0.2997920410033359","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"glance-mcp","version":"1.0.1","keywords":["mcp","browser","automation","playwright","claude","claude-code","testing","screenshot","e2e","debugbase","ai-agent"],"author":{"name":"DebugBase","email":"hello@debugbase.io"},"license":"MIT","_id":"glance-mcp@1.0.1","maintainers":[{"name":"debugbase","email":"info@debugbase.io"}],"homepage":"https://github.com/DebugBase/glance","bugs":{"url":"https://github.com/DebugBase/glance/issues"},"bin":{"glance":"build/index.js","glance-mcp":"build/index.js"},"dist":{"shasum":"5d8390a21142732d677fdc22f0f500b569e64f1e","tarball":"https://registry.npmjs.org/glance-mcp/-/glance-mcp-1.0.1.tgz","fileCount":4,"integrity":"sha512-zAgFCL/W+us4hMcdYCoHE6ww2CJV7l5Dicj0nS4U0KUnxoQdcpKvVJ+Ss6TLdb6h3FdGgbWhgIT2UBY2NM9yJg==","signatures":[{"sig":"MEYCIQD2cP/1fP1vkw+sa2wDbaaxjUELQiK0R956QbmnaNkoIQIhAOOfONMdLJCCptiRHtmXU/J9ijEg2Ijut/kSEWUIi9ER","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":801209},"main":"build/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"cb08b43ba6ebfbfb465fc3c51328d3f80ef90717","scripts":{"build":"node esbuild.config.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"debugbase","email":"info@debugbase.io"},"repository":{"url":"git+https://github.com/DebugBase/glance.git","type":"git"},"_npmVersion":"11.6.2","description":"AI-powered browser automation MCP server for Claude Code","directories":{},"_nodeVersion":"24.11.1","dependencies":{"zod":"^3.22.4","uuid":"^9.0.0","pngjs":"^7.0.0","pixelmatch":"^6.0.0","playwright-core":"^1.50.0","@modelcontextprotocol/sdk":"latest"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.27.4","typescript":"^5.3.2","@types/node":"^20.10.0","@types/uuid":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/glance-mcp_1.0.1_1774625511941_0.9616892389223768","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"glance-mcp","version":"1.0.2","keywords":["mcp","browser","automation","playwright","claude","claude-code","testing","screenshot","e2e","debugbase","ai-agent"],"author":{"name":"DebugBase","email":"hello@debugbase.io"},"license":"MIT","_id":"glance-mcp@1.0.2","maintainers":[{"name":"debugbase","email":"info@debugbase.io"}],"homepage":"https://github.com/DebugBase/glance","bugs":{"url":"https://github.com/DebugBase/glance/issues"},"bin":{"glance":"bin/glance-mcp.mjs","glance-mcp":"bin/glance-mcp.mjs"},"dist":{"shasum":"987e003d070b5f0f86af30a9d06f51d3c77c9a0f","tarball":"https://registry.npmjs.org/glance-mcp/-/glance-mcp-1.0.2.tgz","fileCount":5,"integrity":"sha512-ebF6co+oGKWxtg8ZzKCfIsfnXtFcuTOA8p72AFl0ycLuQ6aF/MTQ1YQJlbWKN4Qifoh3ruuHrhUsTegk8tcDZQ==","signatures":[{"sig":"MEUCIQC4Ujjgc4aFS6TbbQZswDIpnGOssK1AoOJSDjgdFRPxMAIgcwu20OyhGpOl3zU1ZbANIVNj67I6y+ZZ+yaU9DkDrz4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":801256},"main":"build/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"cb08b43ba6ebfbfb465fc3c51328d3f80ef90717","scripts":{"build":"node esbuild.config.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"debugbase","email":"info@debugbase.io"},"repository":{"url":"git+https://github.com/DebugBase/glance.git","type":"git"},"_npmVersion":"11.6.2","description":"AI-powered browser automation MCP server for Claude Code","directories":{},"_nodeVersion":"24.11.1","dependencies":{"zod":"^3.22.4","uuid":"^9.0.0","pngjs":"^7.0.0","pixelmatch":"^6.0.0","playwright-core":"^1.50.0","@modelcontextprotocol/sdk":"latest"},"_hasShrinkwrap":false,"devDependencies":{"esbuild":"^0.27.4","typescript":"^5.3.2","@types/node":"^20.10.0","@types/uuid":"^9.0.7"},"_npmOperationalInternal":{"tmp":"tmp/glance-mcp_1.0.2_1774625733099_0.0776499325186335","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"glance-mcp","version":"1.1.0","description":"AI-powered browser automation MCP server for Claude Code","main":"build/index.js","type":"module","bin":{"glance-mcp":"bin/glance-mcp.mjs","glance":"bin/glance-mcp.mjs"},"scripts":{"build":"node esbuild.config.js","start":"node build/index.js","prepublishOnly":"npm run build"},"keywords":["mcp","browser","automation","playwright","claude","claude-code","testing","screenshot","e2e","debugbase","ai-agent"],"author":{"name":"DebugBase","email":"hello@debugbase.io"},"license":"MIT","homepage":"https://github.com/DebugBase/glance","repository":{"type":"git","url":"git+https://github.com/DebugBase/glance.git"},"bugs":{"url":"https://github.com/DebugBase/glance/issues"},"dependencies":{"@modelcontextprotocol/sdk":"^1.28.0","pixelmatch":"^6.0.0","playwright-core":"^1.50.0","pngjs":"^7.0.0","uuid":"^9.0.0","zod":"^3.22.4"},"devDependencies":{"@types/node":"^20.10.0","@types/uuid":"^9.0.7","esbuild":"^0.27.4","typescript":"^5.3.2"},"engines":{"node":">=18.0.0"},"gitHead":"5233f403a8970f6a9cfa8897966b3fc5a24b173e","_id":"glance-mcp@1.1.0","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-It+51mq0Z4Rx5BzTcpymjMa+07/OV1YV+ZMzVYMU7hA5vbFWGBRcLpxnDOQA99tj3J+ZqqS1mqeUvPzMgGRDFQ==","shasum":"935f7431bdb54649ac4ed04d2765f78919d5a4da","tarball":"https://registry.npmjs.org/glance-mcp/-/glance-mcp-1.1.0.tgz","fileCount":5,"unpackedSize":802668,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIH30K3mKW6IuRkfbR3cFWx0StqWYFxoplKISEwdl7ZXLAiBLSDgNDyaRVqGbeFM6lN4JDc0qHmmX9zvku9X6Sssv1w=="}]},"_npmUser":{"name":"debugbase","email":"info@debugbase.io"},"directories":{},"maintainers":[{"name":"debugbase","email":"info@debugbase.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/glance-mcp_1.1.0_1774627626916_0.26890782538526525"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-27T11:33:08.367Z","modified":"2026-03-27T16:07:07.257Z","1.0.0":"2026-03-27T11:33:08.589Z","1.0.1":"2026-03-27T15:31:52.094Z","1.0.2":"2026-03-27T15:35:33.303Z","1.1.0":"2026-03-27T16:07:07.123Z"},"bugs":{"url":"https://github.com/DebugBase/glance/issues"},"author":{"name":"DebugBase","email":"hello@debugbase.io"},"license":"MIT","homepage":"https://github.com/DebugBase/glance","keywords":["mcp","browser","automation","playwright","claude","claude-code","testing","screenshot","e2e","debugbase","ai-agent"],"repository":{"type":"git","url":"git+https://github.com/DebugBase/glance.git"},"description":"AI-powered browser automation MCP server for Claude Code","maintainers":[{"name":"debugbase","email":"info@debugbase.io"}],"readme":"<p align=\"center\">\n  <img src=\".github/assets/glance-logo.png\" alt=\"Glance\" width=\"80\" />\n</p>\n\n<h1 align=\"center\">Glance</h1>\n\n<p align=\"center\">\n  <strong>AI-powered browser automation for Claude Code</strong><br/>\n  <em>by <a href=\"https://debugbase.io\">DebugBase</a></em>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/glance-mcp\"><img src=\"https://img.shields.io/npm/v/glance-mcp?color=blue&label=npm\" alt=\"npm\" /></a>\n  <a href=\"https://github.com/DebugBase/glance/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/DebugBase/glance\" alt=\"License\" /></a>\n  <a href=\"https://github.com/DebugBase/glance/stargazers\"><img src=\"https://img.shields.io/github/stars/DebugBase/glance?style=social\" alt=\"Stars\" /></a>\n  <a href=\"https://discord.gg/RyGk6HP7Uy\"><img src=\"https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white\" alt=\"Discord\" /></a>\n</p>\n\n<p align=\"center\">\n  Navigate, click, screenshot, test &mdash; all from your terminal.\n</p>\n\n---\n\n## What is Glance?\n\nGlance is an [MCP server](https://modelcontextprotocol.io) that gives Claude Code a real browser. Instead of guessing what your web app looks like, Claude can actually **see** it, **interact** with it, and **test** it.\n\n```\nYou: \"Test the login flow on localhost:3000\"\n\nClaude: *opens browser* *navigates* *fills form* *clicks submit*\n        *takes screenshot* *verifies redirect* *checks for errors*\n        \"Login flow works. Found 1 console warning about...\"\n```\n\n## Features\n\n- **30 MCP tools** for complete browser control\n- **Inline screenshots** — Claude sees what the browser sees\n- **Accessibility snapshots** — full page structure as text\n- **Test scenario runner** — define multi-step tests in JSON\n- **12 assertion types** — exists, textContains, urlEquals, and more\n- **Session recording** — record and replay browser sessions\n- **Visual regression** — pixel-level screenshot comparison\n- **Network & console monitoring** — catch errors and failed requests\n- **Security controls** — URL allowlist/denylist, rate limiting, JS execution policies\n- **Headed mode** — watch the browser in real-time\n\n## Quick Start\n\n### 1. Install\n\n```bash\nnpm install -g glance-mcp\n```\n\nOr add directly to Claude Code:\n\n```bash\nclaude mcp add glance -- npx glance-mcp\n```\n\n### 2. Configure\n\nAdd to your `.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"glance\": {\n      \"command\": \"npx\",\n      \"args\": [\"glance-mcp\"],\n      \"env\": {\n        \"BROWSER_HEADLESS\": \"false\"\n      }\n    }\n  }\n}\n```\n\n### 3. Use\n\nJust ask Claude to interact with your web app:\n\n```\n\"Open localhost:3000 and take a screenshot\"\n\"Test the signup flow with invalid email\"\n\"Check if the pricing page has all three tiers\"\n\"Run a visual regression test on the dashboard\"\n```\n\n## Tools Reference\n\n### Browser Control (19 tools)\n\n| Tool | Description |\n|------|-------------|\n| `browser_navigate` | Navigate to a URL |\n| `browser_click` | Click an element (CSS selector or text) |\n| `browser_type` | Type into an input field |\n| `browser_hover` | Hover over an element |\n| `browser_drag` | Drag and drop between elements |\n| `browser_select_option` | Select from a dropdown |\n| `browser_press_key` | Press a keyboard key |\n| `browser_scroll` | Scroll the page or to an element |\n| `browser_screenshot` | Capture a screenshot (returned inline to Claude) |\n| `browser_snapshot` | Get the accessibility tree as text |\n| `browser_evaluate` | Execute JavaScript in the page |\n| `browser_console_messages` | Read console logs and errors |\n| `browser_network_requests` | Monitor network activity |\n| `browser_go_back` | Navigate back |\n| `browser_go_forward` | Navigate forward |\n| `browser_tab_new` | Open a new tab |\n| `browser_tab_list` | List all open tabs |\n| `browser_tab_select` | Switch to a tab |\n| `browser_close` | Close the browser |\n\n### Test Automation (7 tools)\n\n| Tool | Description |\n|------|-------------|\n| `test_scenario_run` | Run a multi-step test scenario |\n| `test_scenario_status` | Check running scenario status |\n| `test_assert` | Run a single assertion |\n| `test_fill_form` | Auto-fill a form |\n| `test_auth_flow` | Test a login/signup flow |\n| `test_watch_events` | Watch for DOM/network events |\n| `test_stop_watch` | Stop watching events |\n\n### Session & Visual (4 tools)\n\n| Tool | Description |\n|------|-------------|\n| `session_start` | Start recording a session |\n| `session_end` | End and save a session |\n| `session_list` | List recorded sessions |\n| `visual_baseline` | Save a visual baseline |\n| `visual_compare` | Compare against baseline |\n\n## Test Scenarios\n\nDefine multi-step test scenarios in JSON:\n\n```json\n{\n  \"name\": \"Login Flow\",\n  \"steps\": [\n    { \"name\": \"Go to login\", \"action\": \"navigate\", \"url\": \"http://localhost:3000/login\" },\n    { \"name\": \"Enter email\", \"action\": \"type\", \"selector\": \"input[type='email']\", \"value\": \"user@test.com\" },\n    { \"name\": \"Enter password\", \"action\": \"type\", \"selector\": \"input[type='password']\", \"value\": \"password123\" },\n    { \"name\": \"Click submit\", \"action\": \"click\", \"selector\": \"button[type='submit']\" },\n    { \"name\": \"Wait for redirect\", \"action\": \"sleep\", \"ms\": 2000 },\n    { \"name\": \"Verify dashboard\", \"action\": \"assert\", \"type\": \"urlContains\", \"expected\": \"/dashboard\" },\n    { \"name\": \"Screenshot result\", \"action\": \"screenshot\", \"screenshotName\": \"post-login\" }\n  ]\n}\n```\n\n### Assertion Types\n\n| Type | Description |\n|------|-------------|\n| `exists` | Element exists in DOM |\n| `notExists` | Element does not exist |\n| `textContains` | Element text contains value |\n| `textEquals` | Element text equals value |\n| `hasAttribute` | Element has attribute with value |\n| `hasClass` | Element has CSS class |\n| `isVisible` | Element is visible |\n| `isEnabled` | Element is enabled |\n| `urlContains` | Current URL contains value |\n| `urlEquals` | Current URL equals value |\n| `countEquals` | Number of matching elements |\n| `consoleNoErrors` | No console errors |\n\n## Configuration\n\nAll configuration is via environment variables:\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `BROWSER_HEADLESS` | `true` | Run browser in headed mode |\n| `BROWSER_SESSIONS_DIR` | `.browser-sessions` | Directory for screenshots and sessions |\n| `BROWSER_SECURITY_PROFILE` | `local-dev` | Security profile (`local-dev`, `restricted`, `open`) |\n| `BROWSER_VIEWPORT_WIDTH` | `1280` | Browser viewport width |\n| `BROWSER_VIEWPORT_HEIGHT` | `720` | Browser viewport height |\n| `BROWSER_TIMEOUT` | `30000` | Default timeout in ms |\n| `BROWSER_CHANNEL` | — | Browser channel (e.g., `chrome`, `msedge`) |\n\n### Security Profiles\n\n| Profile | URL Access | JS Execution | Rate Limit |\n|---------|-----------|--------------|------------|\n| `local-dev` | All HTTP/HTTPS | Always | 60/min |\n| `restricted` | localhost only | Disabled | 30/min |\n| `open` | Everything | Always | 120/min |\n\n## How It Works\n\n```mermaid\ngraph LR\n    A[\"Claude Code<br/>(Agent)\"] -- \"MCP stdio<br/>tools & results\" --> B[\"Glance<br/>(MCP Server)\"]\n    B -- \"Playwright<br/>automation API\" --> C[\"Browser<br/>(Chromium)\"]\n    C -- \"screenshots<br/>DOM snapshots\" --> B\n    B -- \"inline images<br/>a11y trees\" --> A\n```\n\n1. Claude Code connects to Glance via MCP (stdio transport)\n2. Claude calls tools like `browser_navigate`, `browser_screenshot`\n3. Glance translates these into Playwright commands\n4. Screenshots are returned as base64 images — Claude literally sees the page\n5. Accessibility snapshots give Claude the full DOM structure as text\n\n## Real-World Usage\n\nGlance has been battle-tested on production apps:\n\n- **DebugBase** (debugbase.io) — 12 scenarios, 104 test steps, 97% pass rate\n- **GitScribe AI** — 16 scenarios, 196 test steps, 96% pass rate\n\n## Requirements\n\n- Node.js 18+\n- Playwright-compatible browser (auto-installed)\n\n## Development\n\n```bash\ngit clone https://github.com/DebugBase/glance.git\ncd glance\nnpm install\nnpx playwright install chromium\nnpm run build\nnpm start\n```\n\n## Claude Code Integration\n\n### Agent: `e2e-tester`\n\nGlance ships with a Claude Code agent definition for comprehensive browser testing. The agent knows all 30 tools and follows a structured test workflow: navigate, screenshot, assert, report.\n\n```\nYou: \"Test the entire login flow on localhost:3000\"\nAgent: Opens browser → navigates → fills forms → clicks → screenshots → asserts → reports\n```\n\n### Skill: `/glance-test`\n\nQuick E2E test runner. Just provide a URL:\n\n```\n/glance-test https://myapp.com\n```\n\nThe skill will:\n1. Navigate to the URL\n2. Screenshot and snapshot the page\n3. Discover all navigation links\n4. Test each page with assertions\n5. Check console for JS errors\n6. Generate a pass/fail report\n\n## Contributing\n\nWe welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\n[MIT](LICENSE) — built by [DebugBase](https://debugbase.io)\n","readmeFilename":"README.md"}