pramoddutta/chrome devtools mcp performance
Teach agents to use the Chrome DevTools MCP server for performance testing with traces, Core Web Vitals, throttling, and evidence-based analysis.
npx skills add https://github.com/PramodDutta/qaskills --skill Chrome DevTools MCP Performance
You are a web performance engineer who drives Chrome DevTools through an MCP server to capture traces, measure Core Web Vitals, analyze network and CPU bottlenecks, and turn observations into targeted fixes.
Install the MCP server and prepare a local performance target.
npm install --save-dev @playwright/test typescript
npm pkg set scripts.perf:serve='vite --host 127.0.0.1'
npm pkg set scripts.perf:smoke='tsx scripts/perf-smoke.ts'
Configure your agent to expose Chrome DevTools MCP according to your MCP client.
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": ["chrome-devtools-mcp@latest"]
}
}
}
Keep performance evidence and scripts outside normal E2E tests.
performance/
traces/
budgets/
web-vitals.json
notes/
checkout-lcp.md
scripts/
perf-smoke.ts
summarize-trace.ts
Use this loop when asked to investigate performance.
10. Capture the same trace again.
11. Compare before and after.
12. Recommend a budget if the issue can regress.
Use Playwright to collect browser-side performance entries for quick checks.
// scripts/perf-smoke.ts
import { chromium } from '@playwright/test';
const url = process.env.PERF_URL || 'http://127.0.0.1:5173';
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle' });
const metrics = await page.evaluate(() => {
const nav = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;
const resources = performance.getEntriesByType('resource') as PerformanceResourceTiming[];
return {
domContentLoaded: Math.round(nav.domContentLoadedEventEnd - nav.startTime),
load: Math.round(nav.loadEventEnd - nav.startTime),
transferKb: Math.round(resources.reduce((sum, item) => sum + item.transferSize, 0) / 1024),
resourceCount: resources.length,
};
});
console.log(JSON.stringify(metrics, null, 2));
await browser.close();
Turn repeated findings into a simple local budget.
// scripts/check-performance-budget.ts
type Metrics = {
domContentLoaded: number;
load: number;
transferKb: number;
resourceCount: number;
};
const budget = {
domContentLoaded: 2000,
load: 3500,
transferKb: 900,
resourceCount: 90,
};
export function assertBudget(metrics: Metrics): void {
const failures = Object.entries(budget).filter(([key, limit]) => {
return metrics[key as keyof Metrics] > limit;
});
if (failures.length > 0) {
throw new Error(`Performance budget failed: ${JSON.stringify(failures)}`);
}
}
When reviewing a trace, inspect these areas in order.
10. Network waterfall gaps.
| Signal | DevTools Evidence | Likely Fix |
|---|---|---|
| Slow LCP | LCP element and waterfall | Preload image, reduce server time, optimize hero |
| High CLS | Layout shift records | Reserve dimensions, avoid late banners |
| Poor INP | Long tasks near input | Split JavaScript and reduce handler work |
| High TTFB | Navigation timing | Cache, optimize backend, use edge |
| Large JS | Coverage and network | Code split and remove unused libraries |
| Slow fonts | Waterfall and rendering | Preload, swap, subset fonts |
10. Not saving trace artifacts.
Take pramoddutta/chrome devtools mcp performance from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference npm.
Without those the skill loads but fails at the first command.