Loading...
Loading...
Browser debugging and inspection toolkit for AI coding assistants via MCP protocol
npx skill4agent add aradotso/devtools-skills kaboom-browser-ai-devtoolsSkill by ara.so — Devtools Skills collection.
--remote-debugging-portconsole.log().warn().error()curl -sSL https://raw.githubusercontent.com/brennhill/Kaboom-Browser-AI-Devtools-MCP/STABLE/scripts/install.sh | bashirm https://raw.githubusercontent.com/brennhill/Kaboom-Browser-AI-Devtools-MCP/STABLE/scripts/install.ps1 | iex~/.kaboom/extensiontar -xzf kaboom-*.tar.gz
chmod +x kaboom
mv kaboom /usr/local/bin/chrome://extensions~/.kaboom/extensionclaude_desktop_config.json{
"mcpServers": {
"kaboom": {
"command": "/usr/local/bin/kaboom",
"args": ["--mcp"]
}
}
}config.json.cursor/{
"mcpServers": {
"kaboom": {
"command": "/usr/local/bin/kaboom",
"args": ["--mcp"]
}
}
}settings.json{
"context_servers": {
"kaboom": {
"command": {
"path": "/usr/local/bin/kaboom",
"args": ["--mcp"]
}
}
}
}kaboom_console_clear// No arguments required
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_console_clear"
});kaboom_console_getawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_console_get",
arguments: {
level: "error" // Optional: "log", "warn", "error", "info"
}
});kaboom_network_getawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_network_get",
arguments: {
status: "failed", // "all", "failed", "success"
includeBody: true
}
});kaboom_network_clearawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_network_clear"
});kaboom_dom_queryawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_dom_query",
arguments: {
selector: ".error-message",
includeStyles: true,
includeAttributes: true
}
});kaboom_dom_snapshotawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_dom_snapshot",
arguments: {
includeInlineStyles: true
}
});kaboom_recording_startawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_start",
arguments: {
captureClicks: true,
captureInputs: true,
captureNavigation: true,
captureScrolls: true
}
});kaboom_recording_stopconst recording = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_stop"
});
// Returns array of recorded actions with selectorskaboom_recording_generate_testawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_generate_test",
arguments: {
format: "playwright", // "playwright" or "puppeteer"
includeAssertions: true
}
});kaboom_browser_clickawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_click",
arguments: {
selector: "button[type='submit']"
}
});kaboom_browser_typeawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_type",
arguments: {
selector: "input[name='email']",
text: "user@example.com",
clear: true
}
});kaboom_browser_navigateawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_navigate",
arguments: {
url: "https://example.com/dashboard",
waitForLoad: true
}
});kaboom_browser_selectawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_select",
arguments: {
selector: "select[name='country']",
value: "US"
}
});kaboom_browser_uploadawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_upload",
arguments: {
selector: "input[type='file']",
filePath: "/path/to/file.pdf"
}
});kaboom_a11y_auditawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_a11y_audit",
arguments: {
standard: "WCAG2AA", // "WCAG2A", "WCAG2AA", "WCAG2AAA"
includeWarnings: true
}
});kaboom_a11y_exportawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_a11y_export",
arguments: {
format: "sarif" // "sarif", "json", "html"
}
});kaboom_security_auditawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_security_audit",
arguments: {
checkCredentials: true,
checkPII: true,
checkHeaders: true,
checkCookies: true,
checkThirdParty: true
}
});kaboom_vitals_getawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_vitals_get",
arguments: {
metrics: ["LCP", "CLS", "INP", "FCP"] // Optional, defaults to all
}
});kaboom_vitals_baselineawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_vitals_baseline",
arguments: {
metric: "LCP",
threshold: 2500 // milliseconds
}
});kaboom_annotation_enableawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_annotation_enable"
});kaboom_annotation_getawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_annotation_get",
arguments: {
includeStyles: true
}
});// 1. Get all error logs
const errors = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_console_get",
arguments: { level: "error" }
});
// 2. Inspect DOM at error location
const elements = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_dom_query",
arguments: {
selector: ".error-component",
includeStyles: true
}
});
// 3. Clear logs after fix
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_console_clear"
});// 1. Get failed network requests
const failed = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_network_get",
arguments: {
status: "failed",
includeBody: true
}
});
// 2. Check for auth issues in request headers
// Analyze the response from failed requests
// 3. Clear network buffer
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_network_clear"
});// 1. Start recording
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_start",
arguments: {
captureClicks: true,
captureInputs: true,
captureNavigation: true
}
});
// 2. User performs actions in browser...
// 3. Stop recording and get actions
const actions = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_stop"
});
// 4. Generate Playwright test
const test = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_generate_test",
arguments: {
format: "playwright",
includeAssertions: true
}
});// Navigate to login page
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_navigate",
arguments: {
url: "https://app.example.com/login",
waitForLoad: true
}
});
// Fill in credentials
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_type",
arguments: {
selector: "input[name='email']",
text: "test@example.com"
}
});
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_type",
arguments: {
selector: "input[name='password']",
text: "testpass123"
}
});
// Submit form
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_click",
arguments: {
selector: "button[type='submit']"
}
});
// Check for errors
const errors = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_console_get",
arguments: { level: "error" }
});// Run WCAG 2.1 AA audit
const audit = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_a11y_audit",
arguments: {
standard: "WCAG2AA",
includeWarnings: true
}
});
// Export results as SARIF
const report = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_a11y_export",
arguments: {
format: "sarif"
}
});// Set baseline for LCP
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_vitals_baseline",
arguments: {
metric: "LCP",
threshold: 2500
}
});
// Get current metrics
const vitals = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_vitals_get"
});
// Check if LCP regressed
if (vitals.LCP > 2500) {
console.log("LCP regression detected!");
}window.__kaboom// Add custom annotation to help AI understand context
window.__kaboom.annotate({
type: "error-boundary",
component: "CheckoutForm",
message: "Payment validation failed",
metadata: {
step: 3,
validationErrors: ["invalid_card", "expired"]
}
});
// Check if Kaboom is available
if (window.__kaboom) {
// Kaboom is active
}# Disable telemetry
export KABOOM_TELEMETRY=off
# Custom port (default: 3333)
export KABOOM_PORT=8080
# Log level
export KABOOM_LOG_LEVEL=debug # debug, info, warn, error
# Custom extension path
export KABOOM_EXTENSION_PATH=/custom/path/to/extension# Start MCP server
kaboom --mcp
# Custom port
kaboom --mcp --port 8080
# Enable debug logging
kaboom --mcp --debug
# Print version
kaboom --versionchrome://extensionsps aux | grep kaboomawait use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_console_clear"
});// Get ALL requests, not just failed
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_network_get",
arguments: { status: "all" }
});<button data-testid="submit-btn">Submit</button><button><div onclick>which kaboom
# Should output: /usr/local/bin/kaboom{
"mcpServers": {
"kaboom": {
"command": "/usr/local/bin/kaboom",
"args": ["--mcp"]
}
}
}127.0.0.1KABOOM_TELEMETRY=offconst test = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_generate_test",
arguments: {
format: "playwright",
includeAssertions: true
}
});
// Add custom assertions to generated test
const customTest = test.replace(
"// end of test",
`
// Custom assertions
await expect(page.locator('.success-message')).toBeVisible();
await expect(page).toHaveURL(/.*dashboard/);
`
);// Set up baseline thresholds
const thresholds = {
LCP: 2500,
CLS: 0.1,
INP: 200,
FCP: 1800
};
for (const [metric, threshold] of Object.entries(thresholds)) {
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_vitals_baseline",
arguments: { metric, threshold }
});
}
// Periodically check for regressions
const vitals = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_vitals_get"
});
// Flag regressions
const regressions = Object.entries(vitals)
.filter(([metric, value]) => value > thresholds[metric])
.map(([metric, value]) => `${metric}: ${value} > ${thresholds[metric]}`);
if (regressions.length > 0) {
console.log("Performance regressions detected:", regressions);
}// Start recording
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_start",
arguments: { captureNavigation: true }
});
// Navigate through multiple pages
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_navigate",
arguments: { url: "https://example.com/page1" }
});
// Perform actions...
await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_browser_navigate",
arguments: { url: "https://example.com/page2" }
});
// More actions...
// Stop and generate comprehensive test
const recording = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_stop"
});
const test = await use_mcp_tool({
server_name: "kaboom",
tool_name: "kaboom_recording_generate_test",
arguments: {
format: "playwright",
includeAssertions: true
}
});