browser-lens-mcp 2.3.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -180,6 +180,23 @@ claude mcp add browser-lens npx -y browser-lens-mcp@latest
180
180
 
181
181
  ### Step 2 — Connect your browser
182
182
 
183
+ **Option A: Chrome Extension** (recommended — persists across page reloads)
184
+
185
+ ```bash
186
+ # Find the extension folder
187
+ ls node_modules/browser-lens-mcp/extension/
188
+ ```
189
+
190
+ 1. Open `chrome://extensions` in Chrome/Edge
191
+ 2. Enable **Developer Mode** (top right)
192
+ 3. Click **Load unpacked**
193
+ 4. Select `node_modules/browser-lens-mcp/extension/`
194
+ 5. Done — auto-connects on every page load, survives reload!
195
+
196
+ Configure ports via the extension popup icon.
197
+
198
+ **Option B: Bookmarklet** (zero install, one-time per page)
199
+
183
200
  1. Open **http://localhost:3202** (or your custom port)
184
201
  2. Drag the **bookmarklet** to your bookmarks bar
185
202
  3. Navigate to any web app → click the bookmarklet
@@ -1 +1 @@
1
- {"version":3,"file":"connector-script.d.ts","sourceRoot":"","sources":["../../../src/transport/connector-script.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAqa3E"}
1
+ {"version":3,"file":"connector-script.d.ts","sourceRoot":"","sources":["../../../src/transport/connector-script.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsa3E"}
@@ -277,9 +277,10 @@ function _renderScreenshot(target,type,selector){
277
277
  function _loadH2C(){
278
278
  return new Promise(function(resolve){
279
279
  if(typeof html2canvas==='function'){resolve(true);return;}
280
- log('Loading html2canvas via eval (CSP-safe)...');
280
+ log('Loading html2canvas via fetch+eval (CSP-safe)...');
281
281
  fetch(HTTP_URL.replace('/ingest','/html2canvas.js')).then(function(r){return r.text();}).then(function(code){
282
- (0,eval)(code);
282
+ new Function(code).call(window);
283
+ if(typeof html2canvas!=='function'&&window.html2canvas)html2canvas=window.html2canvas;
283
284
  log('html2canvas loaded: '+(typeof html2canvas==='function'));
284
285
  resolve(typeof html2canvas==='function');
285
286
  }).catch(function(e){err('html2canvas load failed',e);resolve(false);});
@@ -1 +1 @@
1
- {"version":3,"file":"connector-script.js","sourceRoot":"","sources":["../../../src/transport/connector-script.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,MAAc;IACjE,OAAO;;;+BAGsB,MAAM;mCACF,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+ZtC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"connector-script.js","sourceRoot":"","sources":["../../../src/transport/connector-script.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,MAAc;IACjE,OAAO;;;+BAGsB,MAAM;mCACF,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAgatC,CAAC;AACN,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"http-receiver.d.ts","sourceRoot":"","sources":["../../../src/transport/http-receiver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAkL9D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAAC,MAAM,CA+Fb"}
1
+ {"version":3,"file":"http-receiver.d.ts","sourceRoot":"","sources":["../../../src/transport/http-receiver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAkL9D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAAC,MAAM,CA0Hb"}
@@ -191,6 +191,34 @@ export function createHttpReceiver(store, port, wsPort) {
191
191
  res.end(getConnectorScript(port, effectiveWsPort));
192
192
  return;
193
193
  }
194
+ if (req.method === "GET" && url.pathname === "/extension") {
195
+ const extDir = path.resolve(__dirname, "..", "..", "..", "extension");
196
+ try {
197
+ const files = ["manifest.json", "background.js", "content.js", "popup.html", "popup.js"];
198
+ const iconFiles = ["icons/icon16.png", "icons/icon48.png", "icons/icon128.png"];
199
+ const allFiles = [...files, ...iconFiles];
200
+ const fileData = {};
201
+ for (const f of allFiles) {
202
+ const fp = path.join(extDir, f);
203
+ if (fs.existsSync(fp))
204
+ fileData[f] = fs.readFileSync(fp);
205
+ }
206
+ res.writeHead(200, {
207
+ ...CORS_HEADERS,
208
+ "Content-Type": "application/json",
209
+ });
210
+ res.end(JSON.stringify({
211
+ message: "Browser Lens Chrome Extension",
212
+ install: "1) Go to chrome://extensions 2) Enable Developer Mode 3) Click 'Load unpacked' 4) Select the extension/ folder from the npm package",
213
+ npmPath: "node_modules/browser-lens-mcp/extension/",
214
+ files: Object.keys(fileData),
215
+ }));
216
+ }
217
+ catch {
218
+ jsonResponse(res, 500, { error: "Extension files not found" });
219
+ }
220
+ return;
221
+ }
194
222
  if (req.method === "GET" && url.pathname === "/html2canvas.js") {
195
223
  res.writeHead(200, {
196
224
  ...CORS_HEADERS,
@@ -1 +1 @@
1
- {"version":3,"file":"http-receiver.js","sourceRoot":"","sources":["../../../src/transport/http-receiver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-receiver.js","sourceRoot":"","sources":["../../../src/transport/http-receiver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ const DEFAULTS = { enabled: true, httpPort: 3202, wsPort: 3203 };
2
+
3
+ chrome.runtime.onInstalled.addListener(() => {
4
+ chrome.storage.local.get(DEFAULTS, (cfg) => {
5
+ chrome.storage.local.set(cfg);
6
+ });
7
+ });
8
+
9
+ chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
10
+ if (msg.type === "getConfig") {
11
+ chrome.storage.local.get(DEFAULTS, (cfg) => sendResponse(cfg));
12
+ return true;
13
+ }
14
+ if (msg.type === "setConfig") {
15
+ chrome.storage.local.set(msg.config, () => sendResponse({ ok: true }));
16
+ return true;
17
+ }
18
+ });
@@ -0,0 +1,38 @@
1
+ (function () {
2
+ if (window.__MCP_BROWSER_LENS_EXT__) return;
3
+ window.__MCP_BROWSER_LENS_EXT__ = true;
4
+
5
+ function inject(cfg) {
6
+ if (!cfg.enabled) return;
7
+ var httpPort = cfg.httpPort || 3202;
8
+
9
+ fetch("http://localhost:" + httpPort + "/connector.js")
10
+ .then(function (r) {
11
+ if (!r.ok) throw new Error("HTTP " + r.status);
12
+ return r.text();
13
+ })
14
+ .then(function (code) {
15
+ try {
16
+ new Function(code).call(window);
17
+ console.log("[BrowserLens Extension] Injected on " + location.hostname);
18
+ } catch (e) {
19
+ console.error("[BrowserLens Extension] Inject failed:", e);
20
+ }
21
+ })
22
+ .catch(function () {
23
+ console.log("[BrowserLens Extension] MCP server not running on port " + httpPort);
24
+ });
25
+ }
26
+
27
+ if (typeof chrome !== "undefined" && chrome.runtime && chrome.runtime.sendMessage) {
28
+ chrome.runtime.sendMessage({ type: "getConfig" }, function (cfg) {
29
+ if (chrome.runtime.lastError) {
30
+ inject({ enabled: true, httpPort: 3202, wsPort: 3203 });
31
+ return;
32
+ }
33
+ inject(cfg || { enabled: true, httpPort: 3202, wsPort: 3203 });
34
+ });
35
+ } else {
36
+ inject({ enabled: true, httpPort: 3202, wsPort: 3203 });
37
+ }
38
+ })();
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 32 32"><rect width="32" height="32" rx="6" fill="#0e1628"/><circle cx="16" cy="16" r="10" stroke="#8b5cf6" stroke-width="1.5" fill="none" opacity="0.4"/><circle cx="16" cy="16" r="6" stroke="#8b5cf6" stroke-width="1.5" fill="none" opacity="0.6"/><circle cx="16" cy="16" r="2.5" fill="#06b6d4"/><path d="M22 22l3 3" stroke="#06b6d4" stroke-width="2" stroke-linecap="round"/></svg>
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 32 32"><rect width="32" height="32" rx="6" fill="#0e1628"/><circle cx="16" cy="16" r="10" stroke="#8b5cf6" stroke-width="1.5" fill="none" opacity="0.4"/><circle cx="16" cy="16" r="6" stroke="#8b5cf6" stroke-width="1.5" fill="none" opacity="0.6"/><circle cx="16" cy="16" r="2.5" fill="#06b6d4"/><path d="M22 22l3 3" stroke="#06b6d4" stroke-width="2" stroke-linecap="round"/></svg>
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 32 32"><rect width="32" height="32" rx="6" fill="#0e1628"/><circle cx="16" cy="16" r="10" stroke="#8b5cf6" stroke-width="1.5" fill="none" opacity="0.4"/><circle cx="16" cy="16" r="6" stroke="#8b5cf6" stroke-width="1.5" fill="none" opacity="0.6"/><circle cx="16" cy="16" r="2.5" fill="#06b6d4"/><path d="M22 22l3 3" stroke="#06b6d4" stroke-width="2" stroke-linecap="round"/></svg>
@@ -0,0 +1,31 @@
1
+ {
2
+ "manifest_version": 3,
3
+ "name": "Browser Lens — MCP UI Inspector",
4
+ "version": "2.3.1",
5
+ "description": "Real-time DOM, CSS, layout inspection for your IDE's AI agent. Connects to Browser Lens MCP server.",
6
+ "permissions": ["storage", "activeTab"],
7
+ "host_permissions": ["<all_urls>"],
8
+ "action": {
9
+ "default_popup": "popup.html",
10
+ "default_icon": {
11
+ "16": "icons/icon16.png",
12
+ "48": "icons/icon48.png",
13
+ "128": "icons/icon128.png"
14
+ }
15
+ },
16
+ "icons": {
17
+ "16": "icons/icon16.png",
18
+ "48": "icons/icon48.png",
19
+ "128": "icons/icon128.png"
20
+ },
21
+ "background": {
22
+ "service_worker": "background.js"
23
+ },
24
+ "content_scripts": [
25
+ {
26
+ "matches": ["<all_urls>"],
27
+ "js": ["content.js"],
28
+ "run_at": "document_idle"
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,57 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <style>
6
+ *{margin:0;padding:0;box-sizing:border-box}
7
+ body{width:280px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:#09090b;color:#fafafa;padding:16px}
8
+ .header{display:flex;align-items:center;gap:8px;margin-bottom:16px}
9
+ .header svg{flex-shrink:0}
10
+ .header h1{font-size:15px;font-weight:700;background:linear-gradient(135deg,#8b5cf6,#06b6d4);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
11
+ .status{padding:10px 12px;border-radius:8px;font-size:12px;margin-bottom:12px;display:flex;align-items:center;gap:8px}
12
+ .status.on{background:#052e16;border:1px solid #14532d;color:#22c55e}
13
+ .status.off{background:#1c1917;border:1px solid #44403c;color:#f59e0b}
14
+ .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
15
+ .dot.on{background:#22c55e}
16
+ .dot.off{background:#f59e0b}
17
+ .field{margin-bottom:10px}
18
+ .field label{display:block;font-size:11px;color:#71717a;margin-bottom:4px;text-transform:uppercase;letter-spacing:.05em}
19
+ .field input{width:100%;padding:8px 10px;background:#18181b;border:1px solid #27272a;border-radius:6px;color:#fafafa;font-size:13px;font-family:monospace}
20
+ .field input:focus{outline:none;border-color:#8b5cf6}
21
+ .toggle{display:flex;align-items:center;justify-content:space-between;padding:10px 12px;background:#18181b;border:1px solid #27272a;border-radius:8px;margin-bottom:12px;cursor:pointer}
22
+ .toggle span{font-size:13px;font-weight:500}
23
+ .switch{width:36px;height:20px;border-radius:10px;background:#27272a;position:relative;transition:background .2s}
24
+ .switch.on{background:#8b5cf6}
25
+ .switch::after{content:'';position:absolute;width:16px;height:16px;border-radius:50%;background:#fafafa;top:2px;left:2px;transition:transform .2s}
26
+ .switch.on::after{transform:translateX(16px)}
27
+ .btn{width:100%;padding:8px;background:#8b5cf6;color:#fff;border:none;border-radius:6px;font-size:13px;font-weight:600;cursor:pointer;margin-top:4px}
28
+ .btn:hover{background:#7c3aed}
29
+ .footer{margin-top:12px;text-align:center;font-size:10px;color:#52525b}
30
+ .footer a{color:#8b5cf6;text-decoration:none}
31
+ </style>
32
+ </head>
33
+ <body>
34
+ <div class="header">
35
+ <svg width="20" height="20" viewBox="0 0 32 32"><rect width="32" height="32" rx="6" fill="#0e1628"/><circle cx="16" cy="16" r="6" stroke="#8b5cf6" stroke-width="1.5" fill="none" opacity="0.6"/><circle cx="16" cy="16" r="2.5" fill="#06b6d4"/><path d="M22 22l3 3" stroke="#06b6d4" stroke-width="2" stroke-linecap="round"/></svg>
36
+ <h1>Browser Lens</h1>
37
+ </div>
38
+ <div id="status" class="status off"><span class="dot off"></span>Checking...</div>
39
+ <div class="toggle" id="toggleBtn">
40
+ <span>Auto-inject on page load</span>
41
+ <div id="switchEl" class="switch on"></div>
42
+ </div>
43
+ <div class="field">
44
+ <label>HTTP Port</label>
45
+ <input id="httpPort" type="number" value="3202">
46
+ </div>
47
+ <div class="field">
48
+ <label>WebSocket Port</label>
49
+ <input id="wsPort" type="number" value="3203">
50
+ </div>
51
+ <button class="btn" id="saveBtn">Save & Reconnect</button>
52
+ <div class="footer">
53
+ <a href="https://github.com/nano-step/mcp-browser-lens" target="_blank">GitHub</a> · <a href="https://www.npmjs.com/package/browser-lens-mcp" target="_blank">npm</a>
54
+ </div>
55
+ <script src="popup.js"></script>
56
+ </body>
57
+ </html>
@@ -0,0 +1,54 @@
1
+ const statusEl = document.getElementById("status");
2
+ const switchEl = document.getElementById("switchEl");
3
+ const toggleBtn = document.getElementById("toggleBtn");
4
+ const httpPortEl = document.getElementById("httpPort");
5
+ const wsPortEl = document.getElementById("wsPort");
6
+ const saveBtn = document.getElementById("saveBtn");
7
+
8
+ let config = { enabled: true, httpPort: 3202, wsPort: 3203 };
9
+
10
+ function updateUI() {
11
+ switchEl.className = "switch " + (config.enabled ? "on" : "");
12
+ httpPortEl.value = config.httpPort;
13
+ wsPortEl.value = config.wsPort;
14
+ checkStatus();
15
+ }
16
+
17
+ function checkStatus() {
18
+ fetch("http://localhost:" + config.httpPort + "/health")
19
+ .then((r) => r.json())
20
+ .then((d) => {
21
+ const connected = d.hasDom || d.elements > 0;
22
+ statusEl.className = "status " + (connected ? "on" : "off");
23
+ statusEl.innerHTML =
24
+ '<span class="dot ' + (connected ? "on" : "off") + '"></span>' +
25
+ (connected
26
+ ? "Connected — " + d.elements + " elements"
27
+ : "Server running, no browser data yet");
28
+ })
29
+ .catch(() => {
30
+ statusEl.className = "status off";
31
+ statusEl.innerHTML = '<span class="dot off"></span>MCP server not running on port ' + config.httpPort;
32
+ });
33
+ }
34
+
35
+ toggleBtn.addEventListener("click", () => {
36
+ config.enabled = !config.enabled;
37
+ chrome.runtime.sendMessage({ type: "setConfig", config }, updateUI);
38
+ });
39
+
40
+ saveBtn.addEventListener("click", () => {
41
+ config.httpPort = parseInt(httpPortEl.value) || 3202;
42
+ config.wsPort = parseInt(wsPortEl.value) || 3203;
43
+ chrome.runtime.sendMessage({ type: "setConfig", config }, () => {
44
+ chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
45
+ if (tabs[0]) chrome.tabs.reload(tabs[0].id);
46
+ });
47
+ updateUI();
48
+ });
49
+ });
50
+
51
+ chrome.runtime.sendMessage({ type: "getConfig" }, (cfg) => {
52
+ if (cfg) config = cfg;
53
+ updateUI();
54
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-lens-mcp",
3
- "version": "2.3.0",
3
+ "version": "3.0.0",
4
4
  "description": "MCP server that connects to your browser for real-time DOM, CSS, layout inspection, screenshot capture, and Figma design comparison — your IDE's AI agent sees exactly what users see",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -63,6 +63,7 @@
63
63
  },
64
64
  "files": [
65
65
  "dist",
66
+ "extension",
66
67
  "README.md",
67
68
  "LICENSE"
68
69
  ],