{"_id":"@aikeymouse/chromelink-mcp","_rev":"5-8264d92e934122921137c784e0dea6a2","name":"@aikeymouse/chromelink-mcp","dist-tags":{"latest":"1.2.4"},"versions":{"1.2.0":{"name":"@aikeymouse/chromelink-mcp","version":"1.2.0","keywords":["mcp","model-context-protocol","chrome","browser-automation","ai","claude","gpt","automation","testing","websocket"],"author":{"name":"aikeymouse"},"license":"MIT","_id":"@aikeymouse/chromelink-mcp@1.2.0","maintainers":[{"name":"aikeymouse","email":"aikeymouse@gmail.com"}],"homepage":"https://github.com/aikeymouse/chrome-link#readme","bugs":{"url":"https://github.com/aikeymouse/chrome-link/issues"},"bin":{"chromelink-mcp":"bin/chromelink-mcp"},"dist":{"shasum":"842e732305202400da1c1b120ee899c019f77ec8","tarball":"https://registry.npmjs.org/@aikeymouse/chromelink-mcp/-/chromelink-mcp-1.2.0.tgz","fileCount":6,"integrity":"sha512-emWR14TvyAOjQW/qFp6VZ0XJJblckgMZt/F8A9pBYg6+rMHyqRaccdno9gyE+KoSPW35reFLEuT3+gZWx0QVkQ==","signatures":[{"sig":"MEUCIQDBq2NnMSrfy01HPd5BFlAqgm1J5TAEbbHM7/uKamTUUAIgfAO08KtXoTBaKuU1H1JldIJqcCC2t/V6dDiPVr8TOZc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aikeymouse%2fchromelink-mcp@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":30914},"main":"index.js","engines":{"node":">=16.0.0"},"gitHead":"b67718bf1a28c36d26f15ece7db48bac321d3646","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node index.js","postpublish":"node scripts/restore-publish.js","prepublishOnly":"node scripts/prepare-publish.js"},"_npmUser":{"name":"aikeymouse","email":"aikeymouse@gmail.com"},"repository":{"url":"git+https://github.com/aikeymouse/chrome-link.git","type":"git","directory":"mcp-server"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) server for Chrome browser automation via AI agents","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","@aikeymouse/chromelink-client":"^1.2.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/chromelink-mcp_1.2.0_1768766272767_0.4265124335760635","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@aikeymouse/chromelink-mcp","version":"1.2.1","keywords":["mcp","model-context-protocol","chrome","browser-automation","ai","claude","gpt","automation","testing","websocket"],"author":{"name":"aikeymouse"},"license":"MIT","_id":"@aikeymouse/chromelink-mcp@1.2.1","maintainers":[{"name":"aikeymouse","email":"aikeymouse@gmail.com"}],"homepage":"https://github.com/aikeymouse/chrome-link#readme","bugs":{"url":"https://github.com/aikeymouse/chrome-link/issues"},"bin":{"chromelink-mcp":"bin/chromelink-mcp"},"dist":{"shasum":"dd8cbe140b26909c595017e8480444ce4987ad66","tarball":"https://registry.npmjs.org/@aikeymouse/chromelink-mcp/-/chromelink-mcp-1.2.1.tgz","fileCount":7,"integrity":"sha512-ddY3i/EumxAM1Tkijy6hFS8gpvV6lzsEsvm+dmH2rGcuVhcjGp1C6kdB6WZ08Q2ogkgYsyztJ28NsVurCZupVw==","signatures":[{"sig":"MEQCIGwA1FkKEFRMq31lZoJRyoJMl0L40ZLqRFxwBLoV/aoZAiA+vzZ4R3rzVgE0HJ+a7MJfpFlUBj4f0bheOVZ1W2oNpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aikeymouse%2fchromelink-mcp@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":35691},"main":"index.js","engines":{"node":">=16.0.0"},"gitHead":"856a32fe5869e289bdef6c20e83a14c17de57b0c","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node index.js","postpublish":"node scripts/restore-publish.js","prepublishOnly":"node scripts/prepare-publish.js"},"_npmUser":{"name":"aikeymouse","email":"aikeymouse@gmail.com"},"repository":{"url":"git+https://github.com/aikeymouse/chrome-link.git","type":"git","directory":"mcp-server"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) server for Chrome browser automation via AI agents","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","@aikeymouse/chromelink-client":"^1.2.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/chromelink-mcp_1.2.1_1768790815406_0.2500312763387076","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@aikeymouse/chromelink-mcp","version":"1.2.2","keywords":["mcp","model-context-protocol","chrome","browser-automation","ai","claude","gpt","automation","testing","websocket"],"author":{"name":"aikeymouse"},"license":"MIT","_id":"@aikeymouse/chromelink-mcp@1.2.2","maintainers":[{"name":"aikeymouse","email":"aikeymouse@gmail.com"}],"homepage":"https://github.com/aikeymouse/chrome-link#readme","bugs":{"url":"https://github.com/aikeymouse/chrome-link/issues"},"bin":{"chromelink-mcp":"bin/chromelink-mcp"},"dist":{"shasum":"af63db35bc635e953625466ad628abe585070067","tarball":"https://registry.npmjs.org/@aikeymouse/chromelink-mcp/-/chromelink-mcp-1.2.2.tgz","fileCount":7,"integrity":"sha512-VqW0LfPy7KrJ6sKNCBex+7oHopiAvdqL+/yjOYj61rWxyiu0DEIBFIGlbAhhkO6Ysps719nr7+tijPpfIXctsQ==","signatures":[{"sig":"MEQCICcpx0vKEdlzH0WoWYuVBZMcqnMjmXVMxJ2ZtxmT7Ju5AiBa3NHyv7H7etFPKlSDn1D/NrM3RbGfIkdv/EXhXAgTOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aikeymouse%2fchromelink-mcp@1.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":39064},"main":"index.js","engines":{"node":">=16.0.0"},"gitHead":"21ec8598661b3026349a13ad769a7f5e0c6fdf97","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node index.js","postpublish":"node scripts/restore-publish.js","prepublishOnly":"node scripts/prepare-publish.js"},"_npmUser":{"name":"aikeymouse","email":"aikeymouse@gmail.com"},"repository":{"url":"git+https://github.com/aikeymouse/chrome-link.git","type":"git","directory":"mcp-server"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) server for Chrome browser automation via AI agents","directories":{},"_nodeVersion":"18.20.8","dependencies":{"ws":"^8.16.0","@aikeymouse/chromelink-client":"^1.2.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/chromelink-mcp_1.2.2_1768865005012_0.7360414307601293","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@aikeymouse/chromelink-mcp","version":"1.2.3","keywords":["mcp","model-context-protocol","chrome","browser-automation","ai","claude","gpt","automation","testing","websocket"],"author":{"name":"aikeymouse"},"license":"MIT","_id":"@aikeymouse/chromelink-mcp@1.2.3","maintainers":[{"name":"aikeymouse","email":"aikeymouse@gmail.com"}],"homepage":"https://github.com/aikeymouse/chrome-link#readme","bugs":{"url":"https://github.com/aikeymouse/chrome-link/issues"},"bin":{"chromelink-mcp":"bin/chromelink-mcp"},"dist":{"shasum":"06b038662120ef58f1a132d5807b79f5a8fb230e","tarball":"https://registry.npmjs.org/@aikeymouse/chromelink-mcp/-/chromelink-mcp-1.2.3.tgz","fileCount":7,"integrity":"sha512-m+gtEyqDzsZNuCpB0nctNIqQpfmN+xkEkebyJHpQlk/INKYAli8vhN9awwwdPlKBZV8WSaxx/x9iVFURaghCvA==","signatures":[{"sig":"MEQCIHtDDLs+vcMzQRKrRF6M9eS3yajs4pS0/rWg1q/6pfkTAiAmv5byBQUAif5/FAOLdH5FxdeV/tlGGDmO2iTPPIVk+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aikeymouse%2fchromelink-mcp@1.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37111},"main":"index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"7a6b5163dd1b8234328166f977ae7efd9af05301","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node index.js","postpublish":"node scripts/restore-publish.js","prepublishOnly":"node scripts/prepare-publish.js"},"_npmUser":{"name":"aikeymouse","email":"aikeymouse@gmail.com"},"repository":{"url":"git+https://github.com/aikeymouse/chrome-link.git","type":"git","directory":"mcp-server"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) server for Chrome browser automation via AI agents","directories":{},"_nodeVersion":"20.20.0","dependencies":{"ws":"^8.16.0","@modelcontextprotocol/sdk":"^0.5.0","@aikeymouse/chromelink-client":"^1.2.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/chromelink-mcp_1.2.3_1771195263550_0.44435775420134394","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@aikeymouse/chromelink-mcp","version":"1.2.4","description":"Model Context Protocol (MCP) server for Chrome browser automation via AI agents","type":"module","main":"index.js","bin":{"chromelink-mcp":"bin/chromelink-mcp"},"scripts":{"start":"node index.js","test":"echo \"Error: no test specified\" && exit 1","prepublishOnly":"node scripts/prepare-publish.js","postpublish":"node scripts/restore-publish.js"},"keywords":["mcp","model-context-protocol","chrome","browser-automation","ai","claude","gpt","automation","testing","websocket"],"author":{"name":"aikeymouse"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/aikeymouse/chrome-link.git","directory":"mcp-server"},"homepage":"https://github.com/aikeymouse/chrome-link#readme","bugs":{"url":"https://github.com/aikeymouse/chrome-link/issues"},"engines":{"node":">=16.0.0"},"dependencies":{"@aikeymouse/chromelink-client":"^1.2.4","@modelcontextprotocol/sdk":"^1.26.0","ws":"^8.16.0"},"publishConfig":{"access":"public","provenance":true},"_id":"@aikeymouse/chromelink-mcp@1.2.4","gitHead":"b7ff33145081d960d045917932d216594ab2c18c","_nodeVersion":"20.20.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-TBS8WGmGRpo/gLWhjxCqVCdqZvDR/UbtXqPFOQVOeeJYr5tNu5EVY/C40iqRiBRqs4Ba6T7+AtREH90B0c25wA==","shasum":"84666c0fc9449eff6808e3df1bd9af3ff7d64664","tarball":"https://registry.npmjs.org/@aikeymouse/chromelink-mcp/-/chromelink-mcp-1.2.4.tgz","fileCount":7,"unpackedSize":37209,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aikeymouse%2fchromelink-mcp@1.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDEI2Nm9QRyKqxFJtj8mAkaZ0sHW6pblyuqNR8XcjXpSgIhAPHiWdeLijnrKdmjD8cakUEPm8uRv9rvVz0Yr7IrI8pS"}]},"_npmUser":{"name":"aikeymouse","email":"aikeymouse@gmail.com"},"directories":{},"maintainers":[{"name":"aikeymouse","email":"aikeymouse@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chromelink-mcp_1.2.4_1771211166150_0.15995528693668493"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-18T19:57:52.713Z","modified":"2026-02-16T03:06:06.667Z","1.2.0":"2026-01-18T19:57:52.897Z","1.2.1":"2026-01-19T02:46:55.549Z","1.2.2":"2026-01-19T23:23:25.170Z","1.2.3":"2026-02-15T22:41:03.724Z","1.2.4":"2026-02-16T03:06:06.343Z"},"bugs":{"url":"https://github.com/aikeymouse/chrome-link/issues"},"author":{"name":"aikeymouse"},"license":"MIT","homepage":"https://github.com/aikeymouse/chrome-link#readme","keywords":["mcp","model-context-protocol","chrome","browser-automation","ai","claude","gpt","automation","testing","websocket"],"repository":{"type":"git","url":"git+https://github.com/aikeymouse/chrome-link.git","directory":"mcp-server"},"description":"Model Context Protocol (MCP) server for Chrome browser automation via AI agents","maintainers":[{"name":"aikeymouse","email":"aikeymouse@gmail.com"}],"readme":"# ChromeLink MCP Server\n\nModel Context Protocol (MCP) server that exposes Chrome browser automation capabilities to AI agents like Claude, GPT, and other MCP-compatible tools.\n\n## Installation\n\n### Option 1: NPM (Recommended)\n\n```bash\nnpm install -g @aikeymouse/chromelink-mcp\n```\n\nThen configure in your MCP client:\n\n```json\n{\n  \"mcpServers\": {\n    \"chrome-link\": {\n      \"command\": \"chromelink-mcp\"\n    }\n  }\n}\n```\n\n### Option 2: From Source\n\nClone the repository and use the server directly:\n\n```bash\ngit clone https://github.com/aikeymouse/chrome-link.git\ncd chrome-link/mcp-server\nnpm install\n```\n\nConfigure with absolute path:\n\n```json\n{\n  \"mcpServers\": {\n    \"chrome-link\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/chrome-link/mcp-server/index.js\"]\n    }\n  }\n}\n```\n\n## Prerequisites\n\n1. **Install ChromeLink extension** in Chrome\n2. **Start browser-link-server** (automatically started by extension on first connection)\n\n## Local Development\n\nFor local development with file dependencies:\n\n```bash\ncd chrome-link/mcp-server\nnpm install  # Creates symlink to ../clients/node\n```\n\nThe MCP server uses a local file dependency (`\"@aikeymouse/chromelink-client\": \"file:../clients/node\"`) for development. This is automatically converted to an npm dependency (`^1.2.0`) during publishing via the `prepublishOnly` script.\n\nAfter version changes, update the symlink:\n```bash\ncd mcp-server && npm install\n```\n\n## Running the MCP Server\n\n### From NPM Installation\n```bash\nchromelink-mcp\n```\n\n### From Source\n```bash\nnode mcp-server/index.js\n```\n\nThe MCP server will:\n- Connect to `ws://localhost:9000` (browser-link-server)\n- Expose 18 Chrome automation tools via MCP protocol\n- Communicate with AI agents via stdio\n\n## Available Tools\n\n### Tab Management\n- `chrome_list_tabs` - List all open tabs\n- `chrome_open_tab` - Open new tab with URL\n- `chrome_navigate_tab` - Navigate tab to URL\n- `chrome_switch_tab` - Switch to specific tab\n- `chrome_close_tab` - Close a tab\n- `chrome_get_active_tab` - Get active tab info\n\n### Navigation History\n- `chrome_go_back` - Navigate back in history\n- `chrome_go_forward` - Navigate forward in history\n\n### DOM Interaction\n- `chrome_wait_for_element` - Wait for element to appear\n- `chrome_get_text` - Get element text content\n- `chrome_click` - Click an element\n- `chrome_type` - Type text into element\n\n### JavaScript Execution\n- `chrome_execute_js` - Execute arbitrary JavaScript\n- `chrome_call_helper` - Call predefined helper functions:\n  - **Element Interaction**: clickElement, typeText, appendChar, clearContentEditable\n  - **Element Query**: getText, getHTML, getLastHTML, elementExists, isVisible, waitForElement\n  - **Element Highlighting**: highlightElement, removeHighlights\n  - **Element Positioning**: getElementBounds, scrollElementIntoView\n  - **Element Inspection**: inspectElement, getContainerElements, extractPageElements\n\n### Screenshots\n- `chrome_capture_screenshot` - Capture tab screenshot (PNG/JPEG)\n\n### Script Injection\n- `chrome_register_injection` - Register content script\n- `chrome_unregister_injection` - Unregister content script\n\n## Element Extraction\n\nThe `extractPageElements` helper provides intelligent extraction of page elements with rich metadata for test automation and page object generation:\n\n```javascript\n// Extract all interactive elements from a form\n// Note: args must be an array of individual parameters, not an object\nconst result = await callHelper('extractPageElements', ['#login-form', false]);\n\n// Equivalent direct call:\n// window.__chromeLinkHelper.extractPageElements('#login-form', false)\n\n// Result structure:\n{\n  container: {\n    tagName: 'form',\n    cssSelector: '#login-form',\n    xpathSelector: '//form[@id=\"login-form\"]',\n    attributes: { id: 'login-form', method: 'POST', action: '/login' },\n    textContent: 'Login to your account',\n    visible: true,\n    type: 'form'\n  },\n  elements: [\n    {\n      tagName: 'input',\n      selector: '#username',\n      xpathSelector: '//input[@id=\"username\"]',\n      attributes: { id: 'username', name: 'username', type: 'text', placeholder: 'Email' },\n      textContent: '',\n      visible: true,\n      type: 'text-input'\n    },\n    {\n      tagName: 'input',\n      selector: '#password',\n      xpathSelector: '//input[@id=\"password\"]',\n      attributes: { id: 'password', name: 'password', type: 'password' },\n      textContent: '',\n      visible: true,\n      type: 'password-input'\n    },\n    {\n      tagName: 'button',\n      selector: '#login-form > button[type=\"submit\"]',\n      xpathSelector: '//button[@type=\"submit\"]',\n      attributes: { type: 'submit', class: 'btn-primary' },\n      textContent: 'Sign In',\n      visible: true,\n      type: 'submit-button',\n      baseType: 'button'\n    }\n  ],\n  url: 'https://example.com/login',\n  title: 'Login - Example Site',\n  timestamp: '2024-01-15T10:30:00.000Z'\n}\n\n// Include hidden elements (second parameter = true)\nconst allElements = await callHelper('extractPageElements', ['body', true]);\n```\n\n**Key Features:**\n- **Dual Selectors**: Both CSS and XPath selectors for maximum flexibility\n- **Semantic Types**: Automatic classification (text-input, button, link, checkbox, etc.)\n- **ARIA Support**: Recognizes ARIA roles with baseType hierarchy (searchbox→textbox, switch→checkbox)\n- **Direct Text**: Extracts only direct child text nodes (excludes nested elements)\n- **Visibility Filtering**: Optional `includeHidden` parameter (default: false)\n- **Rich Metadata**: All attributes, computed visibility, container context\n\n**Element Types:**\n- Form controls: `text-input`, `password-input`, `checkbox`, `radio`, `select`, `textarea`, `submit-button`, `reset-button`, `button`\n- Navigation: `link`\n- Media: `image`, `video`, `audio`\n- Content: `heading`, `label`, `text`\n- Semantic: ARIA roles (searchbox, switch, tab, menuitem, etc.)\n\n**Use Cases:**\n- Page object model generation for test automation\n- Form analysis and data extraction\n- Accessibility auditing (ARIA role verification)\n- UI component discovery\n\n## Configuration for AI Agents\n\n### VS Code (GitHub Copilot)\n\n**Prerequisites:**\n- VS Code version 1.108 or later\n- GitHub Copilot extension installed\n- ChromeLink native host running (port 9000)\n\n**Setup:**\n\n1. **Create MCP configuration file** at:\n   - **macOS/Linux**: `~/Library/Application Support/Code/User/mcp.json`\n   - **Windows**: `%APPDATA%\\Code\\User\\mcp.json`\n\n2. **Add ChromeLink server:**\n\n   **Option A: Global NPM installation (recommended)**\n   ```json\n   {\n     \"servers\": {\n       \"chromelink\": {\n         \"type\": \"stdio\",\n         \"command\": \"chromelink-mcp\"\n       }\n     },\n     \"inputs\": []\n   }\n   ```\n\n   **Option B: Local installation**\n   ```json\n   {\n     \"servers\": {\n       \"chromelink\": {\n         \"type\": \"stdio\",\n         \"command\": \"node\",\n         \"args\": [\n           \"/absolute/path/to/chrome-driver-extension/mcp-server/bin/chromelink-mcp\"\n         ]\n       }\n     },\n     \"inputs\": []\n   }\n   ```\n\n   **Option C: Using npx**\n   ```json\n   {\n     \"servers\": {\n       \"chromelink\": {\n         \"type\": \"stdio\",\n         \"command\": \"npx\",\n         \"args\": [\n           \"chromelink-mcp\"\n         ]\n       }\n     },\n     \"inputs\": []\n   }\n   ```\n\n3. **Reload VS Code**: Press `Cmd+Shift+P` (or `Ctrl+Shift+P` on Windows) → \"Developer: Reload Window\"\n\n4. **Verify**: Open GitHub Copilot Chat and ask: \"What MCP tools do you have?\"\n\n**Quick Example:**\n\n```\nYou: List all my Chrome tabs\n\nCopilot: [Uses chrome_list_tabs to show all open tabs]\n\nYou: Open google.com in a new tab\n\nCopilot: [Uses chrome_open_tab to create new tab with URL]\n\nYou: Take a screenshot of the active tab\n\nCopilot: [Uses chrome_capture_screenshot and shows the image]\n```\n\n### Claude Desktop\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"chrome-link\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/chrome-driver-extension/mcp-server/index.js\"]\n    }\n  }\n}\n```\n\n**Important**: Use absolute path to `index.js`\n\nAfter configuration:\n1. Restart Claude Desktop\n2. Start a conversation\n3. Ask Claude: \"What Chrome tools do you have?\"\n\n### Example Prompts\n\n```\nOpen https://github.com in a new Chrome tab\n\nList all my open Chrome tabs\n\nGo to https://example.com and get the text of the h1 element\n\nTake a screenshot of the current tab in PNG format\n\nFill out the login form:\n1. Open https://the-internet.herokuapp.com/login\n2. Type \"tomsmith\" in #username\n3. Type \"SuperSecretPassword!\" in #password\n4. Click the login button\n```\n\n## Architecture\n\n```\nAI Agent (Claude/GPT)\n    ↓ stdio (MCP protocol)\nMCP Server (this file)\n    ↓ WebSocket (ws://localhost:9000)\nbrowser-link-server\n    ↓ native messaging (stdin/stdout)\nChrome Extension\n```\n\n**Key Design Points:**\n- MCP server runs as **separate process** (avoids stdio conflict)\n- Uses existing WebSocket client (thin wrapper, no code duplication)\n- Zero changes needed to browser-link-server or extension\n- Multiple MCP servers can connect simultaneously\n\n## Testing\n\n### Manual Test\n\n```bash\n# Start browser-link-server (if not auto-started)\nnode native-host/browser-link-server.js\n\n# In another terminal, test MCP server\necho '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0.0\"}}}' | node mcp-server/index.js\n```\n\nExpected output:\n```json\n{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{\"tools\":{}},\"serverInfo\":{\"name\":\"chrome-link\",\"version\":\"1.0.0\"}}}\n```\n\n### Test Tool Invocation\n\n```bash\n# Create test file\ncat > /tmp/test-mcp.json << 'EOF'\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0.0\"}}}\n{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"chrome_list_tabs\",\"arguments\":{}}}\nEOF\n\n# Run test\ncat /tmp/test-mcp.json | node native-host/mcp-server.js 2>/dev/null\n```\n\n### Using MCP Inspector\n\n```bash\nnpm install -g @modelcontextprotocol/inspector\nnpx @modelcontextprotocol/inspector node mcp-server/index.js\n```\n\nOpens web UI for testing tools interactively.\n\n## Troubleshooting\n\n### MCP Server Won't Connect\n\n**Error**: `Failed to connect to browser-link-server`\n\n**Solution**:\n1. Check Chrome extension is installed: `chrome://extensions/`\n2. Check browser-link-server is running: `curl http://localhost:9000/session` (expect `{\"status\":\"ready\",\"message\":\"Upgrade to WebSocket\"}`)\n3. Test WebSocket manually: `wscat -c ws://localhost:9000`\n\n### Tools Not Showing in Claude\n\n**Error**: Claude doesn't list Chrome tools\n\n**Solution**:\n1. Verify config file path is absolute (not relative)\n2. Check JSON syntax: `python3 -m json.tool < ~/Library/Application\\ Support/Claude/claude_desktop_config.json`\n3. Restart Claude Desktop\n4. Check Claude logs: `~/Library/Logs/Claude/`\n\n### Tool Execution Fails\n\n**Error**: `TypeError: tabId is not a number`\n\n**Solution**:\n1. Use `chrome_list_tabs` first to get valid tab IDs\n2. Ensure tab still exists (not closed)\n3. Check MCP server logs (stderr output)\n\n## Logging\n\nMCP server logs to **stderr** (stdout is reserved for MCP protocol):\n- Connection status\n- Tool invocations\n- Errors and warnings\n\nTo see logs:\n```bash\nnode native-host/mcp-server.js 2>&1 | grep \"\\[MCP Server\\]\"\n```\n\n## Security\n\n⚠️ **MCP server has full browser control** - use with trusted AI agents only\n\nRecommendations:\n- Run in separate browser profile for automation\n- Monitor AI agent actions via logs\n- Disable MCP server when not needed\n- Consider adding authentication for production use\n\n## Documentation\n\n- [MCP Server Configuration](../docs/dev/MCP_SERVER_CONFIGURATION.md) - Setup guide for various clients\n- [ChromeLink Protocol](../docs/PROTOCOL.md) - WebSocket protocol specification\n- [Node.js Client](../clients/node/README.md) - Client library used by MCP server\n\n## License\n\nMIT License - see [LICENSE](./LICENSE) file for details.\n\n**Important Licensing Notice:**\n\nThis MCP server (`@aikeymouse/chromelink-mcp`) is licensed under the MIT License and can be used freely in both non-commercial and commercial projects.\n\nHowever, this server connects to the **ChromeLink browser extension**, which uses dual licensing:\n\n- **Non-Commercial Use**: Free under CC BY-NC-ND 4.0\n  - Personal projects, education, research, open source (non-commercial)\n  \n- **Commercial Use**: Requires Commercial License\n  - Commercial products, revenue-generating apps, business use, SaaS, client work\n  - Contact: https://github.com/aikeymouse/chrome-link/issues\n\n**Summary:** While this NPM package is MIT licensed, using it in a commercial application requires a ChromeLink commercial license.\n\nSee the main [ChromeLink LICENSE](https://github.com/aikeymouse/chrome-link/blob/main/LICENSE) for complete details.\n","readmeFilename":"README.md"}