@dynamicu/chromedebug-mcp 2.5.5 → 2.5.7
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 +82 -1
- package/chrome-extension/icon128.png +0 -0
- package/chrome-extension/icon16.png +0 -0
- package/chrome-extension/icon48.png +0 -0
- package/chrome-extension/manifest.free.json +3 -3
- package/package.json +6 -4
- package/scripts/validate-manifest.js +143 -0
- package/src/cli.js +6 -0
- package/src/commands/install-pro.js +554 -0
- package/src/commands/install-pro.js.bak +542 -0
- package/chrome-extension/manifest.json +0 -73
package/README.md
CHANGED
|
@@ -17,6 +17,8 @@ npm install -g @dynamicu/chromedebug-mcp
|
|
|
17
17
|
npm install @dynamicu/chromedebug-mcp
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
+
> **Want unlimited recordings and advanced features?** See [Installing PRO Version](#installing-pro-version) below for automated PRO installation.
|
|
21
|
+
|
|
20
22
|
### Development Installation
|
|
21
23
|
|
|
22
24
|
```bash
|
|
@@ -26,6 +28,83 @@ cd ChromeDebug
|
|
|
26
28
|
npm install
|
|
27
29
|
```
|
|
28
30
|
|
|
31
|
+
## Installing PRO Version
|
|
32
|
+
|
|
33
|
+
ChromeDebug PRO adds advanced features including:
|
|
34
|
+
- **Function call tracking** - Record and replay function execution traces
|
|
35
|
+
- **Advanced debugging** - Enhanced breakpoint and inspection capabilities
|
|
36
|
+
- **Unlimited recordings** - No daily recording limits
|
|
37
|
+
- Priority support and updates
|
|
38
|
+
|
|
39
|
+
### Installation Steps
|
|
40
|
+
|
|
41
|
+
After purchasing ChromeDebug PRO from [LemonSqueezy](https://chromedebug.com/buy/996773cb-682b-430f-b9e3-9ce2130bd967):
|
|
42
|
+
|
|
43
|
+
1. **Download your PRO extension** from the purchase confirmation email (you'll receive a ZIP file named `chromedebug-pro-extension.zip`)
|
|
44
|
+
2. **Run the installer**:
|
|
45
|
+
```bash
|
|
46
|
+
chromedebug-mcp install-pro \
|
|
47
|
+
--license YOUR_LICENSE_KEY \
|
|
48
|
+
--extension-path ~/Downloads/chromedebug-pro-extension.zip
|
|
49
|
+
```
|
|
50
|
+
3. **Restart your terminal** to load the new environment variable
|
|
51
|
+
4. **Launch Chrome** - PRO features are now active!
|
|
52
|
+
|
|
53
|
+
### What the Installer Does
|
|
54
|
+
|
|
55
|
+
The `install-pro` command:
|
|
56
|
+
- ✓ Validates your license key format
|
|
57
|
+
- ✓ Extracts the PRO extension to `~/.chromedebug-pro/extension`
|
|
58
|
+
- ✓ Saves your license information securely to `~/.chromedebug-pro/license.json`
|
|
59
|
+
- ✓ Configures your shell environment automatically (exports `CHROMEDEBUG_EXTENSION_PATH`)
|
|
60
|
+
- ✓ Creates an installation log at `~/.chromedebug-pro/install.log` for troubleshooting
|
|
61
|
+
|
|
62
|
+
The environment variable `CHROMEDEBUG_EXTENSION_PATH` is automatically detected by Chrome Controller when launching Chrome, allowing it to load the PRO extension instead of the bundled FREE version.
|
|
63
|
+
|
|
64
|
+
### Verifying PRO Installation
|
|
65
|
+
|
|
66
|
+
Check that PRO is correctly installed:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Verify environment variable is set
|
|
70
|
+
echo $CHROMEDEBUG_EXTENSION_PATH
|
|
71
|
+
# Should output: /Users/YOUR_USERNAME/.chromedebug-pro/extension
|
|
72
|
+
|
|
73
|
+
# Check license file
|
|
74
|
+
cat ~/.chromedebug-pro/license.json
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
When you launch Chrome with `chromedebug-mcp`, you should see:
|
|
78
|
+
- "ChromeDebug MCP Assistant PRO" in `chrome://extensions/` (with function tracking features enabled)
|
|
79
|
+
|
|
80
|
+
### Troubleshooting PRO Installation
|
|
81
|
+
|
|
82
|
+
**Environment variable not set after installation:**
|
|
83
|
+
- Restart your terminal or run: `source ~/.zshrc` (or `~/.bashrc` for Bash users)
|
|
84
|
+
- If still not set, manually add to your shell config:
|
|
85
|
+
```bash
|
|
86
|
+
export CHROMEDEBUG_EXTENSION_PATH="$HOME/.chromedebug-pro/extension"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Chrome still loading FREE version:**
|
|
90
|
+
- Verify the environment variable is set: `echo $CHROMEDEBUG_EXTENSION_PATH`
|
|
91
|
+
- Close ALL Chrome windows and restart ChromeDebug MCP
|
|
92
|
+
- Check installation log: `cat ~/.chromedebug-pro/install.log`
|
|
93
|
+
|
|
94
|
+
**License validation errors:**
|
|
95
|
+
- Verify you copied the full license key from your purchase email
|
|
96
|
+
- License format should be: `LICENSEID-HASH` (e.g., `ABC12345-0123456789ABCDEF`)
|
|
97
|
+
- Check for extra spaces or line breaks when copying
|
|
98
|
+
|
|
99
|
+
**Extension ZIP file not found:**
|
|
100
|
+
- Verify the path to your downloaded ZIP file is correct
|
|
101
|
+
- Use `~` for home directory: `~/Downloads/chromedebug-pro-extension.zip`
|
|
102
|
+
- Check file permissions: `ls -la ~/Downloads/chromedebug-pro-extension.zip`
|
|
103
|
+
|
|
104
|
+
**Need help?**
|
|
105
|
+
- Check installation log: `~/.chromedebug-pro/install.log`
|
|
106
|
+
- Open an issue: [GitHub Issues](https://github.com/dynamicupgrade/ChromeDebug/issues)
|
|
107
|
+
|
|
29
108
|
## Usage
|
|
30
109
|
|
|
31
110
|
### As MCP Server
|
|
@@ -195,7 +274,7 @@ Install the FREE version directly from the Chrome Web Store:
|
|
|
195
274
|
2. Enable "Developer mode"
|
|
196
275
|
3. Click "Load unpacked" and select the `chrome-extension` directory
|
|
197
276
|
|
|
198
|
-
#### Option 3: PRO Version (Unlimited)
|
|
277
|
+
#### Option 3: PRO Version (Unlimited) - Automated Installation
|
|
199
278
|
|
|
200
279
|
For unlimited recordings and advanced features, purchase the PRO version:
|
|
201
280
|
|
|
@@ -206,6 +285,8 @@ For unlimited recordings and advanced features, purchase the PRO version:
|
|
|
206
285
|
- ✅ Enhanced capture features
|
|
207
286
|
- ✅ Priority support
|
|
208
287
|
|
|
288
|
+
**Installation:** PRO extension is automatically installed via the `chromedebug-mcp install-pro` command. See the [Installing PRO Version](#installing-pro-version) section above for detailed instructions.
|
|
289
|
+
|
|
209
290
|
### Using the Extension
|
|
210
291
|
|
|
211
292
|
1. **Element Selection**
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
|
-
"name": "ChromeDebug MCP Assistant FREE v2.4.
|
|
4
|
-
"version": "2.4.
|
|
5
|
-
"description": "ChromeDebug MCP visual element selector [FREE Edition] [Build: 2025-01-20-v2.4.
|
|
3
|
+
"name": "ChromeDebug MCP Assistant FREE v2.4.1",
|
|
4
|
+
"version": "2.4.1",
|
|
5
|
+
"description": "ChromeDebug MCP visual element selector [FREE Edition] [Build: 2025-01-20-v2.4.1]",
|
|
6
6
|
"permissions": [
|
|
7
7
|
"activeTab",
|
|
8
8
|
"scripting",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamicu/chromedebug-mcp",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.7",
|
|
4
4
|
"description": "ChromeDebug MCP - MCP server that provides full control over a Chrome browser instance for debugging and automation with AI assistants like Claude Code",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -55,8 +55,10 @@
|
|
|
55
55
|
"run-migration": "node scripts/migrate-dual-ids.js",
|
|
56
56
|
"test:mcp": "NODE_OPTIONS='--experimental-vm-modules' jest tests/mcp-server.test.js",
|
|
57
57
|
"tbv:microtest": "cd chrome-extension && npm run tbv:microtest",
|
|
58
|
-
"
|
|
59
|
-
"
|
|
58
|
+
"validate:free": "node scripts/validate-manifest.js free",
|
|
59
|
+
"validate:pro": "node scripts/validate-manifest.js pro",
|
|
60
|
+
"build:free": "npm run validate:free && webpack --config scripts/webpack.config.free.cjs",
|
|
61
|
+
"build:pro": "npm run validate:pro && webpack --config scripts/webpack.config.pro.cjs",
|
|
60
62
|
"build:both": "npm run build:free && npm run build:pro",
|
|
61
63
|
"package-pro": "node scripts/package-pro-extension.js",
|
|
62
64
|
"package-webstore": "node scripts/package-webstore-extension.js"
|
|
@@ -90,7 +92,6 @@
|
|
|
90
92
|
"chrome-extension/*.css",
|
|
91
93
|
"chrome-extension/*.html",
|
|
92
94
|
"chrome-extension/*.png",
|
|
93
|
-
"chrome-extension/manifest.json",
|
|
94
95
|
"chrome-extension/manifest.free.json",
|
|
95
96
|
"chrome-extension/README.md",
|
|
96
97
|
"config/",
|
|
@@ -104,6 +105,7 @@
|
|
|
104
105
|
],
|
|
105
106
|
"dependencies": {
|
|
106
107
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
108
|
+
"adm-zip": "^0.5.16",
|
|
107
109
|
"bcrypt": "^6.0.0",
|
|
108
110
|
"better-sqlite3": "^12.2.0",
|
|
109
111
|
"cors": "^2.8.5",
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Validate Chrome extension manifest file references
|
|
5
|
+
* Ensures all files referenced in manifest actually exist
|
|
6
|
+
*
|
|
7
|
+
* Usage: node scripts/validate-manifest.js <free|pro>
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { promises as fs } from 'fs';
|
|
11
|
+
import { join, dirname } from 'path';
|
|
12
|
+
import { fileURLToPath } from 'url';
|
|
13
|
+
|
|
14
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
15
|
+
const __dirname = dirname(__filename);
|
|
16
|
+
const rootDir = join(__dirname, '..');
|
|
17
|
+
const extensionDir = join(rootDir, 'chrome-extension');
|
|
18
|
+
|
|
19
|
+
async function validateManifest(tier) {
|
|
20
|
+
if (!['free', 'pro'].includes(tier)) {
|
|
21
|
+
console.error('Usage: node scripts/validate-manifest.js <free|pro>');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
console.log(`\n🔍 Validating ${tier.toUpperCase()} manifest...`);
|
|
26
|
+
|
|
27
|
+
// Read manifest file
|
|
28
|
+
const manifestPath = join(extensionDir, `manifest.${tier}.json`);
|
|
29
|
+
let manifest;
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const manifestContent = await fs.readFile(manifestPath, 'utf8');
|
|
33
|
+
manifest = JSON.parse(manifestContent);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
console.error(`❌ Failed to read ${manifestPath}`);
|
|
36
|
+
console.error(error.message);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const missingFiles = [];
|
|
41
|
+
const foundFiles = [];
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Check if a file exists in the extension directory
|
|
45
|
+
*/
|
|
46
|
+
async function checkFile(filePath, description) {
|
|
47
|
+
const fullPath = join(extensionDir, filePath);
|
|
48
|
+
try {
|
|
49
|
+
await fs.access(fullPath);
|
|
50
|
+
foundFiles.push(` ✓ ${filePath} (${description})`);
|
|
51
|
+
return true;
|
|
52
|
+
} catch {
|
|
53
|
+
missingFiles.push(` ✗ ${filePath} (${description})`);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Validate content_scripts
|
|
59
|
+
if (manifest.content_scripts) {
|
|
60
|
+
for (const [index, script] of manifest.content_scripts.entries()) {
|
|
61
|
+
if (script.js) {
|
|
62
|
+
for (const jsFile of script.js) {
|
|
63
|
+
await checkFile(jsFile, `content script #${index + 1}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (script.css) {
|
|
67
|
+
for (const cssFile of script.css) {
|
|
68
|
+
await checkFile(cssFile, `content CSS #${index + 1}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Validate background service worker
|
|
75
|
+
if (manifest.background?.service_worker) {
|
|
76
|
+
await checkFile(manifest.background.service_worker, 'background service worker');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Validate action popup
|
|
80
|
+
if (manifest.action?.default_popup) {
|
|
81
|
+
await checkFile(manifest.action.default_popup, 'action popup');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Validate action icons
|
|
85
|
+
if (manifest.action?.default_icon) {
|
|
86
|
+
const icons = manifest.action.default_icon;
|
|
87
|
+
for (const [size, iconPath] of Object.entries(icons)) {
|
|
88
|
+
await checkFile(iconPath, `action icon ${size}px`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Validate manifest icons
|
|
93
|
+
if (manifest.icons) {
|
|
94
|
+
for (const [size, iconPath] of Object.entries(manifest.icons)) {
|
|
95
|
+
await checkFile(iconPath, `manifest icon ${size}px`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Validate options page
|
|
100
|
+
if (manifest.options_page) {
|
|
101
|
+
await checkFile(manifest.options_page, 'options page');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Validate web_accessible_resources
|
|
105
|
+
if (manifest.web_accessible_resources) {
|
|
106
|
+
for (const resource of manifest.web_accessible_resources) {
|
|
107
|
+
if (resource.resources) {
|
|
108
|
+
for (const resPath of resource.resources) {
|
|
109
|
+
// Skip wildcard patterns
|
|
110
|
+
if (!resPath.includes('*')) {
|
|
111
|
+
await checkFile(resPath, 'web accessible resource');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Report results
|
|
119
|
+
console.log(`\n📊 Validation Results:`);
|
|
120
|
+
console.log(` Files found: ${foundFiles.length}`);
|
|
121
|
+
console.log(` Files missing: ${missingFiles.length}`);
|
|
122
|
+
|
|
123
|
+
if (foundFiles.length > 0) {
|
|
124
|
+
console.log(`\n✅ Found files:`);
|
|
125
|
+
foundFiles.forEach(f => console.log(f));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (missingFiles.length > 0) {
|
|
129
|
+
console.log(`\n❌ Missing files:`);
|
|
130
|
+
missingFiles.forEach(f => console.log(f));
|
|
131
|
+
console.log(`\n❌ Manifest validation FAILED for ${tier.toUpperCase()}`);
|
|
132
|
+
console.log(` Please ensure all referenced files exist in chrome-extension/`);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
console.log(`\n✅ Manifest validation PASSED for ${tier.toUpperCase()}`);
|
|
137
|
+
console.log(` All ${foundFiles.length} referenced files exist\n`);
|
|
138
|
+
process.exit(0);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Get tier from command line argument
|
|
142
|
+
const tier = process.argv[2];
|
|
143
|
+
validateManifest(tier);
|
package/src/cli.js
CHANGED
|
@@ -18,11 +18,17 @@ import {
|
|
|
18
18
|
findActiveSessions
|
|
19
19
|
} from './services/unified-session-manager.js';
|
|
20
20
|
import logger from './utils/logger.js';
|
|
21
|
+
import { installPro } from './commands/install-pro.js';
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Main CLI entry point
|
|
24
25
|
*/
|
|
25
26
|
async function main() {
|
|
27
|
+
// Check for install-pro command
|
|
28
|
+
if (process.argv.includes('install-pro')) {
|
|
29
|
+
await installPro(process.argv.slice(2));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
26
32
|
const app = new ChromePilotApp();
|
|
27
33
|
|
|
28
34
|
// Parse arguments first to get session settings
|