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 +17 -0
- package/dist/src/transport/connector-script.d.ts.map +1 -1
- package/dist/src/transport/connector-script.js +3 -2
- package/dist/src/transport/connector-script.js.map +1 -1
- package/dist/src/transport/http-receiver.d.ts.map +1 -1
- package/dist/src/transport/http-receiver.js +28 -0
- package/dist/src/transport/http-receiver.js.map +1 -1
- package/extension/background.js +18 -0
- package/extension/content.js +38 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon128.svg +1 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon16.svg +1 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/icons/icon48.svg +1 -0
- package/extension/manifest.json +31 -0
- package/extension/popup.html +57 -0
- package/extension/popup.js +54 -0
- package/package.json +2 -1
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,
|
|
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
|
-
(
|
|
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
|
|
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,
|
|
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": "
|
|
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
|
],
|