seed-skills/chrome-devtools-mcp-performance/SKILL.md
Teach agents to use the Chrome DevTools MCP server for performance testing with traces, Core Web Vitals, throttling, and evidence-based analysis.
npx skillsauth add PramodDutta/qaskills Chrome DevTools MCP PerformanceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
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.
| 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 |
development
Research market rates, build negotiation strategy, and create counter-offer scripts
data-ai
Track different resume versions, maintain master resume, manage tailored versions
testing
Customize resume for specific job postings while maintaining truthfulness
development
Create targeted resume sections optimized for different experience levels and roles