{"_id":"@borgius/brop-mcp","_rev":"6-ff96f20ed2e42b828d232ed856aecef4","name":"@borgius/brop-mcp","dist-tags":{"latest":"2.7.8"},"versions":{"2.7.1":{"name":"@borgius/brop-mcp","version":"2.7.1","keywords":["mcp","model-context-protocol","brop","browser-automation","chrome-extension","websocket","browser-control","remote-browser","automation","cdp","chrome-devtools-protocol"],"author":{"name":"borgius"},"license":"MIT","_id":"@borgius/brop-mcp@2.7.1","maintainers":[{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"}],"homepage":"https://github.com/borgius/brop#readme","bugs":{"url":"https://github.com/borgius/brop/issues"},"bin":{"brop":"bridge/mcp-server.js"},"dist":{"shasum":"f242fc147b18759b6f6a7c9f0a0a4f0d9fd779fb","tarball":"https://registry.npmjs.org/@borgius/brop-mcp/-/brop-mcp-2.7.1.tgz","fileCount":6,"integrity":"sha512-potlA4POEpZhN2i019gxs3TM8fOl4zNHMvGiAo4wcdBZjiMOZmM4p3LPD0/iOQBrBfPMBsEMR0VYwJz150Co4A==","signatures":[{"sig":"MEUCIQDQ3+S0pFNU+7RmZYB3nELAZWh7nsVy1foYThXJj4aO/AIgKk1xt19yuunmWr/gPG6NRTDD0oiB2zbOtmze0IO6Lfc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105030},"main":"background.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"6c96a0a4046849c67e891a7c73bbc07e08530378","scripts":{"dev":"nodemon","mcp":"node bridge/mcp-server.js","test":"cd tests && node unified-bridge-test.js","bridge":"node bridge/bridge_server.js","cdp:logs":"node tools/cdp-log-viewer.js","test:cdp":"cd tests && node quick-cdp-test.js","debug:cdp":"pnpm run cdp:logs:pretty -l 50","test:brop":"cd tests && node quick-brop-test.js","cdp:analyze":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html","test:bridge":"cd tests && node unified-bridge-test.js","catch:bridge":"env CDP_DUMP_FILE=reports/cdp_dump_bridge.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:native":"env CDP_DUMP_FILE=reports/cdp_dump_native.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:report":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html && open reports/cdp_comparison.html","test:console":"node tests/test-explicit-console-capture.js","pack:extension":"node tools/pack-extension.js","test:keepalive":"node tests/test-enhanced-keepalive.js","test:stagehand":"node tests/test-stagehand-simple.js","test:wikipedia":"cd tests && node playwright-wikipedia-test.js","cdp:logs:export":"node tools/cdp-log-viewer.js -l 0 -f jsonl -o reports/cdp_dump_bridge.jsonl","cdp:logs:pretty":"node tools/cdp-log-viewer.js -f pretty","test:cdp:logging":"node tests/test-cdp-logging.js","test:stagehand:ai":"node tests/test-stagehand-ai-features.js","test:console:clear":"node tests/test-clear-console-logs.js","test:console:legacy":"node tests/test-console-logs.js","test:stagehand:full":"node tests/test-stagehand-cdp.js","pack:extension:clean":"node tools/pack-extension.js --no-timestamp","test:element-detection":"node tests/run-element-detection-tests.js","test:stagehand:minimal":"node tests/test-stagehand-minimal.js","test:element-detection:core":"node tests/test-element-detection-framework.js","test:element-detection:edge":"node tests/test-element-detection-edge-cases.js"},"_npmUser":{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"},"repository":{"url":"git+https://github.com/borgius/brop.git","type":"git"},"_npmVersion":"11.6.2","description":"Browser Remote Operations Protocol with multiplexed CDP relay support","directories":{},"_nodeVersion":"25.1.0","dependencies":{"ws":"^8.18.2","zod":"^3.25.67","playwright":"^1.53.0","@mastra/mcp":"^0.10.4","@ai-sdk/openai":"^1.3.22","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.13.1"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.5.0","nodemon":"^3.0.2","proxy-agent":"^6.5.0","@types/chrome":"^0.0.270","https-proxy-agent":"^7.0.6","@browserbasehq/stagehand":"^2.3.0"},"optionalDependencies":{"protobufjs":"^7.2.5","google-protobuf":"^3.21.2"},"_npmOperationalInternal":{"tmp":"tmp/brop-mcp_2.7.1_1763994696110_0.1186365401781464","host":"s3://npm-registry-packages-npm-production"}},"2.7.2":{"name":"@borgius/brop-mcp","version":"2.7.2","keywords":["mcp","model-context-protocol","brop","browser-automation","chrome-extension","websocket","browser-control","remote-browser","automation","cdp","chrome-devtools-protocol"],"author":{"url":"99% based on original work by Jack Rudenko <i@madappgang.com>","name":"BROP Team","email":"i@madappgang.com"},"license":"MIT","_id":"@borgius/brop-mcp@2.7.2","maintainers":[{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"}],"homepage":"https://github.com/borgius/brop#readme","bugs":{"url":"https://github.com/borgius/brop/issues"},"bin":{"brop":"bridge/mcp-server.js"},"dist":{"shasum":"b4180b11a67d7fbeee4a0e798596d9f082d1b72e","tarball":"https://registry.npmjs.org/@borgius/brop-mcp/-/brop-mcp-2.7.2.tgz","fileCount":6,"integrity":"sha512-fv6C83r7AZYGvHI8mh/ewhzs3mnTQ8KlLy4TbTgDKU2ha6oj/6VxLB3/bzdofG0pSk8alzFYEtGvNnnjpNi6fA==","signatures":[{"sig":"MEYCIQDoikOnyRcUztf7HZRD0fszdS+l+H1tnLTf6ttCapsL+gIhAK+6EivFBOA6oRixgoxfnm4vi/LYPXJid71NMaYGrhWA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105097},"main":"background.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"1349eb0a5de383f14a719d19b7b4940bba6bf4c5","scripts":{"dev":"nodemon","mcp":"node bridge/mcp-server.js","test":"cd tests && node unified-bridge-test.js","bridge":"node bridge/bridge_server.js","cdp:logs":"node tools/cdp-log-viewer.js","test:cdp":"cd tests && node quick-cdp-test.js","debug:cdp":"pnpm run cdp:logs:pretty -l 50","test:brop":"cd tests && node quick-brop-test.js","cdp:analyze":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html","test:bridge":"cd tests && node unified-bridge-test.js","catch:bridge":"env CDP_DUMP_FILE=reports/cdp_dump_bridge.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:native":"env CDP_DUMP_FILE=reports/cdp_dump_native.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:report":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html && open reports/cdp_comparison.html","test:console":"node tests/test-explicit-console-capture.js","pack:extension":"node tools/pack-extension.js","test:keepalive":"node tests/test-enhanced-keepalive.js","test:stagehand":"node tests/test-stagehand-simple.js","test:wikipedia":"cd tests && node playwright-wikipedia-test.js","cdp:logs:export":"node tools/cdp-log-viewer.js -l 0 -f jsonl -o reports/cdp_dump_bridge.jsonl","cdp:logs:pretty":"node tools/cdp-log-viewer.js -f pretty","test:cdp:logging":"node tests/test-cdp-logging.js","test:stagehand:ai":"node tests/test-stagehand-ai-features.js","test:console:clear":"node tests/test-clear-console-logs.js","test:console:legacy":"node tests/test-console-logs.js","test:stagehand:full":"node tests/test-stagehand-cdp.js","pack:extension:clean":"node tools/pack-extension.js --no-timestamp","test:element-detection":"node tests/run-element-detection-tests.js","test:stagehand:minimal":"node tests/test-stagehand-minimal.js","test:element-detection:core":"node tests/test-element-detection-framework.js","test:element-detection:edge":"node tests/test-element-detection-edge-cases.js"},"_npmUser":{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"},"repository":{"url":"git+https://github.com/borgius/brop.git","type":"git"},"_npmVersion":"11.6.2","description":"Browser Remote Operations Protocol with multiplexed CDP relay support","directories":{},"_nodeVersion":"25.1.0","dependencies":{"ws":"^8.18.2","zod":"^3.25.67","playwright":"^1.53.0","@mastra/mcp":"^0.10.4","@ai-sdk/openai":"^1.3.22","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.13.1"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.5.0","nodemon":"^3.0.2","proxy-agent":"^6.5.0","@types/chrome":"^0.0.270","https-proxy-agent":"^7.0.6","@browserbasehq/stagehand":"^2.3.0"},"optionalDependencies":{"protobufjs":"^7.2.5","google-protobuf":"^3.21.2"},"_npmOperationalInternal":{"tmp":"tmp/brop-mcp_2.7.2_1763995371980_0.9426013402181737","host":"s3://npm-registry-packages-npm-production"}},"2.7.4":{"name":"@borgius/brop-mcp","version":"2.7.4","keywords":["mcp","model-context-protocol","brop","browser-automation","chrome-extension","websocket","browser-control","remote-browser","automation","cdp","chrome-devtools-protocol"],"author":{"url":"99% based on original work by Jack Rudenko <i@madappgang.com>","name":"BROP Team","email":"i@madappgang.com"},"license":"MIT","_id":"@borgius/brop-mcp@2.7.4","maintainers":[{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"}],"homepage":"https://github.com/borgius/brop#readme","bugs":{"url":"https://github.com/borgius/brop/issues"},"bin":{"brop":"bridge/mcp-server.js"},"dist":{"shasum":"fba1d783f42ad592cd7b72f7342deceb2a5a3b44","tarball":"https://registry.npmjs.org/@borgius/brop-mcp/-/brop-mcp-2.7.4.tgz","fileCount":6,"integrity":"sha512-ie5fI9uSLvAZWflA4eyDDAWBz6BixwiGQtTfPfJITkkfhnl9geb2DzL0cEAQi0VwEWewdim9dsfVb0O/AaR2dQ==","signatures":[{"sig":"MEUCIER/jTC/+oyhZ3WvWo4Qc7Its3IPTzjnTwG+iO3dPuK0AiEAr4IZlLpfdmgDgfEf6IB0u33zZbwAYN4+oY+Lfks/Jd8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":105115},"main":"background.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"d74f9566230c5b821a5956f9bb628d34e52c98ba","scripts":{"dev":"nodemon","mcp":"node bridge/mcp-server.js","test":"cd tests && node unified-bridge-test.js","bridge":"node bridge/bridge_server.js","cdp:logs":"node tools/cdp-log-viewer.js","test:cdp":"cd tests && node quick-cdp-test.js","debug:cdp":"pnpm run cdp:logs:pretty -l 50","test:brop":"cd tests && node quick-brop-test.js","cdp:analyze":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html","test:bridge":"cd tests && node unified-bridge-test.js","catch:bridge":"env CDP_DUMP_FILE=reports/cdp_dump_bridge.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:native":"env CDP_DUMP_FILE=reports/cdp_dump_native.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:report":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html && open reports/cdp_comparison.html","test:console":"node tests/test-explicit-console-capture.js","pack:extension":"node tools/pack-extension.js","test:keepalive":"node tests/test-enhanced-keepalive.js","test:stagehand":"node tests/test-stagehand-simple.js","test:wikipedia":"cd tests && node playwright-wikipedia-test.js","cdp:logs:export":"node tools/cdp-log-viewer.js -l 0 -f jsonl -o reports/cdp_dump_bridge.jsonl","cdp:logs:pretty":"node tools/cdp-log-viewer.js -f pretty","test:cdp:logging":"node tests/test-cdp-logging.js","test:stagehand:ai":"node tests/test-stagehand-ai-features.js","test:console:clear":"node tests/test-clear-console-logs.js","test:console:legacy":"node tests/test-console-logs.js","test:stagehand:full":"node tests/test-stagehand-cdp.js","pack:extension:clean":"node tools/pack-extension.js --no-timestamp","test:element-detection":"node tests/run-element-detection-tests.js","test:stagehand:minimal":"node tests/test-stagehand-minimal.js","test:element-detection:core":"node tests/test-element-detection-framework.js","test:element-detection:edge":"node tests/test-element-detection-edge-cases.js"},"_npmUser":{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"},"repository":{"url":"git+https://github.com/borgius/brop.git","type":"git"},"_npmVersion":"11.6.2","description":"Browser Remote Operations Protocol with multiplexed CDP relay support","directories":{},"_nodeVersion":"25.1.0","dependencies":{"ws":"^8.18.2","zod":"^3.25.67","playwright":"^1.53.0","@mastra/mcp":"^0.10.4","@ai-sdk/openai":"^1.3.22","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.13.1"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.5.0","nodemon":"^3.0.2","proxy-agent":"^6.5.0","@types/chrome":"^0.0.270","https-proxy-agent":"^7.0.6","@browserbasehq/stagehand":"^2.3.0"},"optionalDependencies":{"protobufjs":"^7.2.5","google-protobuf":"^3.21.2"},"_npmOperationalInternal":{"tmp":"tmp/brop-mcp_2.7.4_1763995538815_0.9879572800871008","host":"s3://npm-registry-packages-npm-production"}},"2.7.5":{"name":"@borgius/brop-mcp","version":"2.7.5","keywords":["mcp","model-context-protocol","brop","browser-automation","chrome-extension","websocket","browser-control","remote-browser","automation","cdp","chrome-devtools-protocol"],"author":{"url":"99% based on original work by Jack Rudenko <i@madappgang.com>","name":"BROP Team","email":"i@madappgang.com"},"license":"MIT","_id":"@borgius/brop-mcp@2.7.5","maintainers":[{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"}],"homepage":"https://github.com/borgius/brop#readme","bugs":{"url":"https://github.com/borgius/brop/issues"},"bin":{"brop":"bridge/mcp-server.js"},"dist":{"shasum":"0b2eac8065475fc174a7c35b1aa8af35fb4c25a8","tarball":"https://registry.npmjs.org/@borgius/brop-mcp/-/brop-mcp-2.7.5.tgz","fileCount":6,"integrity":"sha512-yFGjmCUnPNR1fns7+lNcIw4L2fGH9zoHDqFUGvS9n+9eLDSkr04H85mZiY7+PP8tHehBkheBR7x2GP6c7/Ow/w==","signatures":[{"sig":"MEUCIQDR5AuTl9kokazZhjsMM1QpuH6fVVjOamXoV/9Gq9qY4gIgVryJnp/gbdX9OkGHUXV/FGuTPytx8Nv2OdgO9JtpvjU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112492},"main":"background.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"20afb45b967ff0c7e8c49f71c5dad3e2557462c1","scripts":{"dev":"nodemon","mcp":"node bridge/mcp-server.js","test":"cd tests && node unified-bridge-test.js","bridge":"node bridge/bridge_server.js","release":"pnpm run pack:extension:clean && gh release create v$(node -p \"require('./manifest.json').version\") brop-extension.zip --title \"BROP Extension v$(node -p \"require('./manifest.json').version\")\" --generate-notes","cdp:logs":"node tools/cdp-log-viewer.js","test:cdp":"cd tests && node quick-cdp-test.js","debug:cdp":"pnpm run cdp:logs:pretty -l 50","test:brop":"cd tests && node quick-brop-test.js","cdp:analyze":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html","test:bridge":"cd tests && node unified-bridge-test.js","catch:bridge":"env CDP_DUMP_FILE=reports/cdp_dump_bridge.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:native":"env CDP_DUMP_FILE=reports/cdp_dump_native.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:report":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html && open reports/cdp_comparison.html","test:console":"node tests/test-explicit-console-capture.js","pack:extension":"node tools/pack-extension.js","test:keepalive":"node tests/test-enhanced-keepalive.js","test:stagehand":"node tests/test-stagehand-simple.js","test:wikipedia":"cd tests && node playwright-wikipedia-test.js","cdp:logs:export":"node tools/cdp-log-viewer.js -l 0 -f jsonl -o reports/cdp_dump_bridge.jsonl","cdp:logs:pretty":"node tools/cdp-log-viewer.js -f pretty","test:cdp:logging":"node tests/test-cdp-logging.js","test:stagehand:ai":"node tests/test-stagehand-ai-features.js","test:console:clear":"node tests/test-clear-console-logs.js","test:console:legacy":"node tests/test-console-logs.js","test:stagehand:full":"node tests/test-stagehand-cdp.js","pack:extension:clean":"node tools/pack-extension.js --no-timestamp","test:element-detection":"node tests/run-element-detection-tests.js","test:stagehand:minimal":"node tests/test-stagehand-minimal.js","test:element-detection:core":"node tests/test-element-detection-framework.js","test:element-detection:edge":"node tests/test-element-detection-edge-cases.js"},"_npmUser":{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"},"repository":{"url":"git+https://github.com/borgius/brop.git","type":"git"},"_npmVersion":"11.6.2","description":"Browser Remote Operations Protocol with multiplexed CDP relay support","directories":{},"_nodeVersion":"25.1.0","dependencies":{"ws":"^8.18.2","zod":"^3.25.67","playwright":"^1.53.0","@mastra/mcp":"^0.10.4","@ai-sdk/openai":"^1.3.22","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.13.1"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.5.0","nodemon":"^3.0.2","proxy-agent":"^6.5.0","@types/chrome":"^0.0.270","https-proxy-agent":"^7.0.6","@browserbasehq/stagehand":"^2.3.0"},"optionalDependencies":{"protobufjs":"^7.2.5","google-protobuf":"^3.21.2"},"_npmOperationalInternal":{"tmp":"tmp/brop-mcp_2.7.5_1767366936101_0.6651146001543919","host":"s3://npm-registry-packages-npm-production"}},"2.7.7":{"name":"@borgius/brop-mcp","version":"2.7.7","keywords":["mcp","model-context-protocol","brop","browser-automation","chrome-extension","websocket","browser-control","remote-browser","automation","cdp","chrome-devtools-protocol"],"author":{"url":"99% based on original work by Jack Rudenko <i@madappgang.com>","name":"BROP Team","email":"i@madappgang.com"},"license":"MIT","_id":"@borgius/brop-mcp@2.7.7","maintainers":[{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"}],"homepage":"https://github.com/borgius/brop#readme","bugs":{"url":"https://github.com/borgius/brop/issues"},"bin":{"brop":"bridge/mcp-server.js"},"dist":{"shasum":"f612800edc7bceb5410e64a6462b72db96f414a5","tarball":"https://registry.npmjs.org/@borgius/brop-mcp/-/brop-mcp-2.7.7.tgz","fileCount":6,"integrity":"sha512-GQkTo59CQIYkOYyeQJZkMKbz/XxkHgx/y4ucV9iA6eD8Fm/Ah76SPMFy8Z6BP06ASBFrX4hhoUD4wamWKr5HvA==","signatures":[{"sig":"MEUCIDNTsQo9PL9zKoxt1V4x+ftifdIts+5AOAXU6JnOgaCBAiEA9jbYoUs/07HjHbNJEHrWfxmlvkOfS05R1ziwagY+2Ps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112665},"main":"background.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"995ab34ca00767f5e3e6a6bd7deb52a994739e8c","scripts":{"dev":"nodemon","mcp":"node bridge/mcp-server.js","test":"cd tests && node unified-bridge-test.js","bridge":"node bridge/bridge_server.js","version":"node tools/sync-manifest-version.js && git add manifest.json","cdp:logs":"node tools/cdp-log-viewer.js","test:cdp":"cd tests && node quick-cdp-test.js","debug:cdp":"pnpm run cdp:logs:pretty -l 50","test:brop":"cd tests && node quick-brop-test.js","cdp:analyze":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html","postversion":"git push && git push --tags && npm publish && npm run release:github","test:bridge":"cd tests && node unified-bridge-test.js","catch:bridge":"env CDP_DUMP_FILE=reports/cdp_dump_bridge.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:native":"env CDP_DUMP_FILE=reports/cdp_dump_native.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:report":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html && open reports/cdp_comparison.html","test:console":"node tests/test-explicit-console-capture.js","pack:extension":"node tools/pack-extension.js","release:github":"pnpm run pack:extension:clean && gh release create v$(node -p \"require('./manifest.json').version\") brop-extension.zip --title \"BROP Extension v$(node -p \"require('./manifest.json').version\")\" --generate-notes","test:keepalive":"node tests/test-enhanced-keepalive.js","test:stagehand":"node tests/test-stagehand-simple.js","test:wikipedia":"cd tests && node playwright-wikipedia-test.js","cdp:logs:export":"node tools/cdp-log-viewer.js -l 0 -f jsonl -o reports/cdp_dump_bridge.jsonl","cdp:logs:pretty":"node tools/cdp-log-viewer.js -f pretty","test:cdp:logging":"node tests/test-cdp-logging.js","test:stagehand:ai":"node tests/test-stagehand-ai-features.js","test:console:clear":"node tests/test-clear-console-logs.js","test:console:legacy":"node tests/test-console-logs.js","test:stagehand:full":"node tests/test-stagehand-cdp.js","pack:extension:clean":"node tools/pack-extension.js --no-timestamp","test:element-detection":"node tests/run-element-detection-tests.js","test:stagehand:minimal":"node tests/test-stagehand-minimal.js","test:element-detection:core":"node tests/test-element-detection-framework.js","test:element-detection:edge":"node tests/test-element-detection-edge-cases.js"},"_npmUser":{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"},"repository":{"url":"git+https://github.com/borgius/brop.git","type":"git"},"_npmVersion":"11.6.2","description":"Browser Remote Operations Protocol with multiplexed CDP relay support","directories":{},"_nodeVersion":"25.1.0","dependencies":{"ws":"^8.18.2","zod":"^3.25.67","playwright":"^1.53.0","@mastra/mcp":"^0.10.4","@ai-sdk/openai":"^1.3.22","@mozilla/readability":"^0.6.0","@modelcontextprotocol/sdk":"^1.13.1"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.5.0","nodemon":"^3.0.2","proxy-agent":"^6.5.0","@types/chrome":"^0.0.270","https-proxy-agent":"^7.0.6","@browserbasehq/stagehand":"^2.3.0"},"optionalDependencies":{"protobufjs":"^7.2.5","google-protobuf":"^3.21.2"},"_npmOperationalInternal":{"tmp":"tmp/brop-mcp_2.7.7_1767367292969_0.949104540256924","host":"s3://npm-registry-packages-npm-production"}},"2.7.8":{"name":"@borgius/brop-mcp","version":"2.7.8","description":"Browser Remote Operations Protocol with multiplexed CDP relay support","type":"module","main":"background.js","bin":{"brop":"bridge/mcp-server.js"},"keywords":["mcp","model-context-protocol","brop","browser-automation","chrome-extension","websocket","browser-control","remote-browser","automation","cdp","chrome-devtools-protocol"],"author":{"name":"BROP Team","email":"i@madappgang.com","url":"99% based on original work by Jack Rudenko <i@madappgang.com>"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/borgius/brop.git"},"homepage":"https://github.com/borgius/brop#readme","bugs":{"url":"https://github.com/borgius/brop/issues"},"engines":{"node":">=18.0.0"},"scripts":{"dev":"nodemon","bridge":"node bridge/bridge_server.js","mcp":"node bridge/mcp-server.js","pack:extension":"node tools/pack-extension.js","pack:extension:clean":"node tools/pack-extension.js --no-timestamp","test":"cd tests && node unified-bridge-test.js","test:bridge":"cd tests && node unified-bridge-test.js","test:brop":"cd tests && node quick-brop-test.js","test:cdp":"cd tests && node quick-cdp-test.js","test:wikipedia":"cd tests && node playwright-wikipedia-test.js","test:stagehand":"node tests/test-stagehand-simple.js","test:stagehand:full":"node tests/test-stagehand-cdp.js","test:stagehand:ai":"node tests/test-stagehand-ai-features.js","test:stagehand:minimal":"node tests/test-stagehand-minimal.js","test:cdp:logging":"node tests/test-cdp-logging.js","test:console":"node tests/test-explicit-console-capture.js","test:console:clear":"node tests/test-clear-console-logs.js","test:console:legacy":"node tests/test-console-logs.js","test:keepalive":"node tests/test-enhanced-keepalive.js","test:element-detection":"node tests/run-element-detection-tests.js","test:element-detection:core":"node tests/test-element-detection-framework.js","test:element-detection:edge":"node tests/test-element-detection-edge-cases.js","cdp:logs":"node tools/cdp-log-viewer.js","cdp:logs:pretty":"node tools/cdp-log-viewer.js -f pretty","cdp:logs:export":"node tools/cdp-log-viewer.js -l 0 -f jsonl -o reports/cdp_dump_bridge.jsonl","cdp:analyze":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html","debug:cdp":"pnpm run cdp:logs:pretty -l 50","release:github":"pnpm run pack:extension:clean && gh release create v$(node -p \"require('./manifest.json').version\") brop-extension.zip --title \"BROP Extension v$(node -p \"require('./manifest.json').version\")\" --generate-notes","version":"node tools/sync-manifest-version.js && git add manifest.json","postversion":"git push && git push --tags && npm publish && npm run release:github","catch:bridge":"env CDP_DUMP_FILE=reports/cdp_dump_bridge.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:native":"env CDP_DUMP_FILE=reports/cdp_dump_native.jsonl mitmproxy -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222","catch:report":"node tools/cdp-traffic-analyzer.js reports/cdp_dump_native.jsonl reports/cdp_dump_bridge.jsonl reports/cdp_comparison.html && open reports/cdp_comparison.html"},"devDependencies":{"@browserbasehq/stagehand":"^2.3.0","@types/chrome":"^0.0.270","dotenv":"^16.5.0","https-proxy-agent":"^7.0.6","nodemon":"^3.0.2","proxy-agent":"^6.5.0"},"dependencies":{"@ai-sdk/openai":"^1.3.22","@mastra/mcp":"^0.10.4","@modelcontextprotocol/sdk":"^1.13.1","@mozilla/readability":"^0.6.0","playwright":"^1.53.0","ws":"^8.18.2","zod":"^3.25.67"},"optionalDependencies":{"google-protobuf":"^3.21.2","protobufjs":"^7.2.5"},"gitHead":"8f3c0a139069bf6146f6680a573c62891662e593","_id":"@borgius/brop-mcp@2.7.8","_nodeVersion":"25.1.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-GVeW6N6C3ca/h+U6VxqLCNXLRKfWhGlRlRUacEFyKtTm8I5K60uGdUBesf7BlCeh9z9EAIIzA1HvIzFMLkx1GA==","shasum":"2a53baf58560d9bbf86d964fcf9327424cb0f947","tarball":"https://registry.npmjs.org/@borgius/brop-mcp/-/brop-mcp-2.7.8.tgz","fileCount":6,"unpackedSize":114522,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCh8AZ5O2udiCvD2vV17Cmy6uMFALaFng9djiovl5feEQIgKa36zOAISU1JtCkBcaXIUMegpgzu6oobEp5gKbYRwh8="}]},"_npmUser":{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"},"directories":{},"maintainers":[{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/brop-mcp_2.7.8_1767369125716_0.06310655559286427"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-24T14:31:36.014Z","modified":"2026-01-02T15:52:06.069Z","2.7.1":"2025-11-24T14:31:36.313Z","2.7.2":"2025-11-24T14:42:52.178Z","2.7.4":"2025-11-24T14:45:39.014Z","2.7.5":"2026-01-02T15:15:36.242Z","2.7.7":"2026-01-02T15:21:33.134Z","2.7.8":"2026-01-02T15:52:05.884Z"},"bugs":{"url":"https://github.com/borgius/brop/issues"},"author":{"name":"BROP Team","email":"i@madappgang.com","url":"99% based on original work by Jack Rudenko <i@madappgang.com>"},"license":"MIT","homepage":"https://github.com/borgius/brop#readme","keywords":["mcp","model-context-protocol","brop","browser-automation","chrome-extension","websocket","browser-control","remote-browser","automation","cdp","chrome-devtools-protocol"],"repository":{"type":"git","url":"git+https://github.com/borgius/brop.git"},"description":"Browser Remote Operations Protocol with multiplexed CDP relay support","maintainers":[{"name":"borgius","email":"e3w2q1+yamlx@gmail.com"}],"readme":"# BROP - Browser Remote Operations Protocol\n\nA Chrome extension that provides native browser automation capabilities through a unified WebSocket bridge server, Chrome extension interface, and **Model Context Protocol (MCP) server**.\n\n## Features\n\n- **🌉 Unified Bridge Server**: Single WebSocket server providing both BROP and Chrome DevTools Protocol (CDP) compatibility\n- **🔧 MCP Server**: Model Context Protocol interface for AI agents and tools (dual-mode: server/relay)\n- **🧩 Chrome Extension**: Native Chrome extension for direct browser control and automation\n- **📝 Content Extraction**: Advanced content extraction with Mozilla Readability and semantic markdown\n- **⚙️ JavaScript Execution**: Full JavaScript execution using Chrome Debugger API with async/await support\n- **🎯 DOM Operations**: Simplified DOM extraction and element interaction (click, type, wait)\n- **📸 Screenshot Capture**: Take screenshots of browser tabs\n- **🧭 Navigation Control**: Navigate pages with status monitoring\n- **🔍 Debug Toolkit**: Comprehensive debugging and monitoring tools\n- **📦 Extension Packaging**: Production-ready Chrome extension packaging\n\n## Installation\n\n1. **Install dependencies:**\n\n```bash\npnpm install\n```\n\n2. **Load the extension in Chrome:**\n\n   - **Option A:** Install from Chrome Web Store (Recommended)\n   \n     Install the [Browser Remote Operations Protocol extension](https://chromewebstore.google.com/detail/browser-remote-operations/olbecmikepkjffhkidaecjlbhhcdgeki) from the Chrome Web Store.\n\n   - **Option B:** Load unpacked extension (Development)\n\n     - Open Chrome and go to `chrome://extensions/`\n     - Enable \"Developer mode\"\n     - Click \"Load unpacked\" and select this directory\n\n   - **Option C:** Install packaged extension\n     ```bash\n     pnpm run pack:extension:clean  # Creates brop-extension.zip\n     ```\n     - Drag and drop the zip file to `chrome://extensions/`\n\n3. **Start the bridge server:**\n\n```bash\npnpm run dev          # Development mode with auto-reload\n# OR\npnpm run bridge       # Production bridge server\n```\n\n4. **Start MCP server (optional):**\n\n```bash\npnpm run mcp          # Auto-detects server/relay mode\n```\n\n**Note:** No build process required! The extension works immediately after loading.\n\n## Usage\n\n### Bridge Server\n\nStart the development server with auto-reload:\n\n```bash\npnpm run dev\n```\n\nThe unified bridge server provides:\n\n- **BROP endpoint**: `ws://localhost:9225` (BROP clients)\n- **Extension endpoint**: `ws://localhost:9224` (Chrome extension connects here)\n- **CDP endpoint**: `ws://localhost:9222` (Playwright/CDP clients)\n- **HTTP logs endpoint**: `http://localhost:9222/logs` (debugging)\n- **Chrome DevTools Protocol compatibility**\n- **Real-time logging and debugging**\n\n### MCP Server\n\nThe MCP server provides AI agents with browser automation capabilities.\n\n**Running via npx (recommended):**\n\n```bash\nnpx @borgius/brop-mcp@latest  # Run directly without installation\n```\n\n**Running from local development:**\n\n```bash\npnpm run mcp  # STDIO transport on auto-detected mode\n```\n\n**Using in VS Code or Claude Desktop:**\n\nAdd to your MCP configuration:\n\n```json\n{\n  \"servers\": {\n    \"brop-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"@borgius/brop-mcp@latest\"\n      ]\n    }\n  }\n}\n```\n\n**Dual-Mode Operation:**\n\n- **Server Mode**: When port 9225 is free, starts full BROP bridge servers\n- **Relay Mode**: When port 9225 is occupied, connects as client to existing server\n\n**Robustness & Recovery:**\n\n- **Auto-Reconnection**: Automatically attempts to reconnect to the BROP server (3 attempts) if the connection is lost.\n- **Zombie Process Cleanup**: Use the `--restart-on-error` flag to automatically kill zombie processes on ports 9225/9224/9222 and restart the server if initialization fails.\n\n**Example Config with Restart:**\n```json\n{\n  \"mcp-brop\": {\n    \"command\": \"npx\",\n    \"args\": [\n      \"@borgius/brop-mcp@latest\",\n      \"--restart-on-error\"\n    ]\n  }\n}\n```\n\n**Available Tools:** `brop_navigate`, `brop_get_page_content`, `brop_get_simplified_content`, `brop_execute_script`, `brop_click_element`, `brop_type_text`, `brop_create_page`, `brop_close_tab`, `brop_list_tabs`, `brop_activate_tab`, `brop_get_server_status`, `brop_start_console_capture`, `brop_get_console_logs`, `brop_clear_console_logs`, `brop_stop_console_capture`\n\nSee **[MCP_README.md](MCP_README.md)** for complete MCP documentation.\n\n### Chrome Extension\n\nOnce loaded, the extension will:\n\n- Show a popup with service status and connection details\n- Inject content scripts into pages for DOM operations\n- Run background scripts to handle automation commands\n- Provide debugging and monitoring tools\n\n### JavaScript Client\n\nConnect to the bridge server using WebSocket:\n\n```javascript\n// BROP commands\nconst bropWs = new WebSocket(\"ws://localhost:9225\");\n\nbropWs.onopen = () => {\n  bropWs.send(\n    JSON.stringify({\n      id: 1,\n      method: \"navigate_to_url\",\n      params: { url: \"https://example.com\" },\n    })\n  );\n};\n\n// CDP commands (Playwright/Puppeteer compatible)\nconst cdpWs = new WebSocket(\"ws://localhost:9222/devtools/browser/brop-bridge\");\n\ncdpWs.onopen = () => {\n  cdpWs.send(\n    JSON.stringify({\n      id: 1,\n      method: \"Runtime.evaluate\",\n      params: { expression: \"document.title\" },\n    })\n  );\n};\n```\n\n## API Reference\n\n### Bridge Server Commands\n\nThe bridge server supports both BROP and Chrome DevTools Protocol (CDP) methods:\n\n#### BROP Commands (Port 9225)\n\n**Tab Management:**\n- `create_tab`: Create new browser tab\n- `close_tab`: Close specific tab\n- `list_tabs`: List all open tabs\n- `activate_tab`: Switch to specific tab\n\n**Navigation & Content:**\n- `navigate`: Navigate to URL with options\n- `get_page_content`: Extract page content and metadata\n- `get_simplified_dom`: Get simplified DOM structure (HTML/Markdown via Readability)\n- `get_element`: Find and get element details by CSS selector\n- `get_screenshot`: Capture page screenshot\n\n**Interaction:**\n- `click`: Click element with visibility checks and navigation detection\n- `type`: Type text with human-like typing simulation\n- `wait_for_element`: Wait for element to appear with MutationObserver\n- `fill_form`: Fill entire forms with field detection\n\n**JavaScript Execution:**\n- `evaluate_js`: Execute JavaScript with full async/await support\n- `execute_console`: Execute safe console operations\n\n**Console Log Capture:**\n- `start_console_capture`: Start collecting console logs for a tab using Chrome Debugger API\n- `get_console_logs`: Retrieve captured console logs (requires active capture session)\n- `clear_console_logs`: Clear captured logs without stopping the session\n- `stop_console_capture`: Stop log collection and detach debugger\n\n**Extension Management:**\n- `get_extension_version`: Get extension info\n- `get_extension_errors`: View extension errors\n- `clear_extension_errors`: Clear error logs\n- `reload_extension`: Reload the extension\n\n#### CDP Commands (Port 9222)\n\n- `Runtime.evaluate`: Execute JavaScript in page context\n- `Runtime.getProperties`: Get object properties\n- `Runtime.callFunctionOn`: Call function on remote object\n- `Page.navigate`: Navigate to a URL\n- `Page.captureScreenshot`: Capture page screenshot\n- `Page.getLayoutMetrics`: Get page layout information\n- `DOM.getDocument`: Get document root node\n- `DOM.querySelector`: Query for elements\n- `DOM.getOuterHTML`: Get element HTML\n- `Target.*`: Target management for Playwright compatibility\n\n### Response Format\n\nAll responses follow CDP format:\n\n- `id`: Request identifier\n- `result`: Command result data (on success)\n- `error`: Error information (on failure)\n\n## Architecture\n\n```\n┌─────────────────┐    STDIO/WebSocket   ┌──────────────────┐    WebSocket    ┌──────────────────┐\n│   MCP Client    │ ◄─────────────────► │   MCP Server     │ ◄─────────────► │  Bridge Server   │\n│  (AI Agents)    │                     │  (port 3000)     │                 │  (port 9225)     │\n└─────────────────┘                     └──────────────────┘                 └──────────────────┘\n                                                                                        │\n┌─────────────────┐    WebSocket         ┌──────────────────┐                         │ WebSocket\n│ BROP Client App │ ◄─────────────────► │  Unified Bridge  │                         │ (port 9224)\n│  (JavaScript)   │      Port 9225      │     Server       │                         ▼\n└─────────────────┘                     │  (Node.js)       │                ┌──────────────────┐\n                                        └──────────────────┘                │  Chrome Extension │\n┌─────────────────┐    WebSocket                  │                         │  Background Script│\n│ CDP Client App  │ ◄─────────────────────────────┘                         └──────────────────┘\n│ (Playwright)    │      Port 9222                                                   │\n└─────────────────┘                                                                  │ Chrome APIs\n                                                                                      ▼\n                                                                             ┌──────────────────┐\n                                                                             │   Web Pages      │\n                                                                             │  Content Scripts │\n                                                                             └──────────────────┘\n```\n\n### Components\n\n1. **MCP Server** (`bridge/mcp.js`): Model Context Protocol server with dual-mode operation (STDIO transport)\n2. **Unified Bridge Server** (`bridge/bridge_server.js`): Node.js WebSocket server providing both BROP and CDP compatibility\n3. **Background Script** (`main_background.js`): Extension service worker handling automation commands\n4. **Content Script** (`content.js`): Injected into web pages for DOM interaction and monitoring\n5. **Injected Script** (`injected.js`): Runs in page context for enhanced JavaScript execution\n6. **Popup** (`popup.html/js`): Extension UI showing service status and debugging tools\n7. **Content Extractor** (`content-extractor.js`): Advanced content extraction with Readability and semantic markdown\n8. **DOM Simplifier** (`dom_simplifier.js`): Utility for extracting simplified DOM structures\n\n## Key Capabilities\n\n### JavaScript Execution (`evaluate_js`)\n\nExecute arbitrary JavaScript in page context with full async/await support:\n\n```javascript\n// Simple expression\nawait sendCommand('evaluate_js', { \n  tabId, \n  code: 'document.title' \n});\n\n// Extract structured data\nawait sendCommand('evaluate_js', { \n  tabId, \n  code: `\n    Array.from(document.querySelectorAll('.product'))\n      .map(p => ({\n        name: p.querySelector('h3').textContent,\n        price: p.querySelector('.price').textContent\n      }))\n  ` \n});\n\n// Async operations\nawait sendCommand('evaluate_js', { \n  tabId, \n  code: `\n    async () => {\n      await new Promise(r => setTimeout(r, 1000));\n      return document.querySelector('.dynamic-content').textContent;\n    }\n  ` \n});\n```\n\nSee [evaluate_js Guide](docs/EVALUATE_JS_GUIDE.md) for comprehensive documentation.\n\n### Human-like Interaction\n\nSimulate realistic user behavior with typing and clicking:\n\n```javascript\n// Type with human-like delays and occasional typos\nawait sendCommand('type', { \n  tabId, \n  selector: '#search',\n  text: 'hello world',\n  humanLike: true,\n  delay: 100\n});\n\n// Click with visibility checks\nawait sendCommand('click', { \n  tabId, \n  selector: '#submit',\n  waitForNavigation: true\n});\n```\n\n### Advanced Content Extraction\n\nExtract clean, semantic content from any webpage:\n\n```javascript\n// Get Markdown with CSS selectors for automation\nawait sendCommand('get_simplified_dom', { \n  tabId,\n  format: 'markdown',\n  includeSelectors: true\n});\n```\n\n### Console Log Capture\n\nCapture and manage browser console logs with explicit control:\n\n```javascript\n// Start capturing console logs\nawait sendCommand('start_console_capture', { \n  tabId \n});\n\n// Generate some logs\nawait sendCommand('evaluate_js', { \n  tabId,\n  code: `\n    console.log('Application started');\n    console.warn('Warning: Low memory');\n    console.error('Error: Connection failed');\n  `\n});\n\n// Get captured logs\nconst logs = await sendCommand('get_console_logs', { \n  tabId,\n  limit: 50,\n  level: 'error'  // Optional: filter by level\n});\n\n// Clear logs without stopping capture\nawait sendCommand('clear_console_logs', { \n  tabId \n});\n\n// Stop capturing when done\nawait sendCommand('stop_console_capture', { \n  tabId \n});\n```\n\n## Development\n\n### Development Mode\n\nStart the bridge server with auto-reload:\n\n```bash\npnpm run dev\n```\n\n### Testing\n\n**Bridge Server Tests:**\n\n```bash\npnpm run test:bridge     # Test unified bridge server\npnpm run test:brop       # Test BROP protocol specifically\npnpm run test:cdp        # Test CDP functionality\npnpm run test:quick      # Quick CDP test\n```\n\n**MCP Server Tests:**\n\n```bash\npnpm run test:mcp        # Test MCP server modes\n```\n\n**Extension Packaging:**\n\n```bash\npnpm run pack:extension        # Timestamped zip\npnpm run pack:extension:clean  # Clean brop-extension.zip\n```\n\n## Debug Toolkit\n\nBROP includes comprehensive debugging tools accessible via npm scripts:\n\n### Extension Error Collection\n\n```bash\npnpm run debug:errors    # Get current extension errors\npnpm run debug:clear     # Clear extension errors for fresh testing\n```\n\n### Extension Management\n\n```bash\npnpm run debug:reload    # Remotely reload Chrome extension\n```\n\n### Bridge Server Logs\n\n```bash\npnpm run debug:logs      # Get bridge server console logs remotely\n```\n\n### Complete Debug Workflow\n\n```bash\npnpm run debug:workflow  # Run full debug cycle\n```\n\n### Testing Commands\n\n```bash\npnpm run test:complete   # Complete flow test\npnpm run test:reload     # Test extension reload mechanism\n```\n\n## Documentation\n\n- [BROP Protocol Reference](docs/BROP_PROTOCOL.md) - Complete protocol documentation\n- [evaluate_js Guide](docs/EVALUATE_JS_GUIDE.md) - Comprehensive JavaScript execution guide\n- [Architecture Overview](ARCHITECTURE.md) - System design and components\n- [Markdown Format Guide](docs/MARKDOWN_FORMAT_GUIDE.md) - CSS selector extraction format\n\n## Limitations\n\n- Chrome extension permissions and security model\n- Limited to Chrome/Chromium browsers\n- Extension API overhead compared to direct browser control\n- Cannot access chrome:// internal pages (security restriction)\n- Requires bridge server to be running for external connections\n- JavaScript execution on file:// URLs has some restrictions\n\n## Security Notes\n\n- The extension requests broad permissions for full functionality\n- All communication uses Chrome's secure runtime messaging and WebSocket\n- Bridge server runs locally on configurable ports\n- Runs within Chrome's security sandbox\n- No external Chrome dependency - everything routes through extension APIs\n\n## License\n\nMIT License - see LICENSE file for details\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Test with the BROP test suite\n5. Submit a pull request\n\n## Development & Debugging\n\nFor detailed development instructions, see **[CLAUDE.md](CLAUDE.md)** - Complete debugging toolkit and workflow guide.\n\n### Quick Debug Commands\n\n**Extension Console (chrome://extensions/ → BROP → Inspect views):**\n\n```javascript\n// Check bridge server connection\nbridgeConnection.isConnected;\n\n// View recent activity logs\nlogs.getLogs(10);\n\n// Check extension status\nextensionAPI.getStatus();\n```\n\n**Page Console (F12 on any webpage):**\n\n```javascript\n// Test content script\nwindow.BROP?.getConsoleLogs();\n\n// Test simplified DOM\nwindow.BROP?.getSimplifiedDOM();\n```\n\n**Bridge Server Debug:**\n\n```bash\n# View real-time logs\npnpm run debug:logs\n\n# Check server status\ncurl http://localhost:9222/json/version\n```\n\n## Extension UI Features\n\nThe extension popup includes:\n\n### 🎛️ **Service Control**\n\n- **Service Status** - Bridge server connection indicator\n- **Extension Health** - Background script and content script status\n- **Debug Controls** - Quick access to debugging functions\n\n### 📊 **Activity Monitoring**\n\n- **Real-time Logs** - See automation commands as they execute\n- **Performance Metrics** - Response times and success rates\n- **Error Tracking** - Monitor and diagnose issues\n\n### ⚙️ **Settings & Tools**\n\n- **Connection Settings** - Configure bridge server endpoints\n- **Debug Utilities** - Access to error collection and diagnostics\n- **Extension Management** - Reload and reset functions\n\n## Quick Start\n\n1. **Install dependencies:** `pnpm install`\n2. **Load the extension** in Chrome developer mode (or use `pnpm run pack:extension:clean`)\n3. **Start bridge server:** `pnpm run dev`\n4. **Start MCP server (optional):** `pnpm run mcp`\n5. **Open the popup** and verify connection\n6. **Run tests:** `pnpm run test:bridge` or `pnpm run test:mcp`\n\n## Roadmap\n\n- [x] **Unified Bridge Server** - Single server handling both BROP and CDP protocols\n- [x] **MCP Server Implementation** - Complete Model Context Protocol support\n- [x] **Advanced Content Extraction** - Mozilla Readability and semantic markdown\n- [x] **Extension Packaging** - Production-ready Chrome extension packaging\n- [x] **Dual-Mode MCP** - Server/relay mode detection and switching\n- [x] **No External Chrome Dependency** - Everything routes through extension APIs\n- [ ] Enhanced debugging and monitoring tools\n- [ ] Firefox extension support\n- [ ] Additional CDP method implementations\n- [ ] Performance optimizations\n- [ ] TypeScript conversion\n- [ ] npm package for JavaScript client library\n\n## CDP Traffic Analysis\n\nBROP includes powerful tools for capturing and analyzing Chrome DevTools Protocol (CDP) traffic to debug and compare implementations.\n\n### Capturing CDP Traffic\n\n1. **Start mitmproxy with CDP capture script:**\n\n```bash\n# Capture native Chrome CDP traffic\nexport CDP_DUMP_FILE=\"cdp_dump_native.jsonl\"\nmitmdump -s tools/cdp_dump.py --mode reverse:http://localhost:9222 -p 19222\n\n# Or use npm script\npnpm run capture:cdp:native\n```\n\n2. **Connect Playwright to the proxy:**\n\n```javascript\n// Connect through proxy to capture traffic\nconst browser = await chromium.connectOverCDP('http://localhost:19222');\n```\n\n3. **Run your test scenario**\n\n4. **Stop mitmproxy (Ctrl+C)** - Traffic is saved to the JSONL file\n\n### Analyzing CDP Traffic\n\nCompare two CDP dumps side-by-side:\n\n```bash\n# Compare native Chrome vs Bridge implementation\npnpm run analyze:cdp:traffic cdp_dump_native.jsonl cdp_dump_bridge.jsonl\n\n# Or use the npm shortcut\npnpm run compare:cdp\n```\n\nThis generates an interactive HTML report with:\n- Side-by-side message timeline\n- Expandable message details\n- Divergence highlighting\n- Search and filtering\n- Performance metrics\n\n### Example Workflow\n\n```bash\n# 1. Capture native Chrome CDP traffic\npnpm run capture:cdp:native\n# Run your Playwright test against Chrome\n# Stop with Ctrl+C\n\n# 2. Capture Bridge CDP traffic  \npnpm run capture:cdp:bridge\n# Run same test against Bridge\n# Stop with Ctrl+C\n\n# 3. Generate comparison report\npnpm run compare:cdp\n# Opens interactive HTML report\n```\n\n### CDP Analysis Features\n\n- **Visual Timeline**: See messages in chronological order\n- **Expandable Details**: Click any message to see full JSON\n- **Divergence Detection**: Automatically highlights differences\n- **Performance Metrics**: Compare timing and message counts\n- **Method Analysis**: See which CDP methods are used/missing\n- **Search & Filter**: Find specific messages quickly\n\n## Related Documentation\n\n- **[MCP_README.md](MCP_README.md)** - Complete MCP server documentation and usage examples\n- **[CLAUDE.md](CLAUDE.md)** - Development instructions and debugging toolkit\n- **[ARCHITECTURE.md](ARCHITECTURE.md)** - System architecture and component overview","readmeFilename":"README.md"}