debug-optimize-lcp
chromedevtools/chrome-devtools-mcp
Debug and optimize Largest Contentful Paint (LCP) performance using Chrome DevTools MCP.
What is debug-optimize-lcp?
Guides systematic debugging and optimization of LCP—the time until a page's main content becomes visible—using Chrome DevTools. Use this skill when investigating slow page loads, Core Web Vitals issues, or understanding why hero images and primary content render slowly.
- Record and analyze performance traces to identify LCP timing and bottlenecks
- Break down LCP into four sequential subparts (TTFB, resource load delay, resource load duration, element render delay) to pinpoint which is the constraint
- Inspect the LCP element and its resource URL using script evaluation
- Examine network waterfall timing to detect delayed resource discovery or slow delivery
- Audit HTML for common issues like lazy-loaded viewport images, missing fetchpriority, and render-blocking scripts
- Apply prioritized optimization strategies targeting the identified bottleneck subpart
How to install debug-optimize-lcp
npx skills add https://github.com/chromedevtools/chrome-devtools-mcp --skill debug-optimize-lcp- Chrome DevTools MCP server installed and running
- Access to a live or staging web page to profile
- Basic understanding of web performance metrics and the Chrome DevTools interface
How to use debug-optimize-lcp
- 1.Navigate to the target page using navigate_page with the page URL.
- 2.Start a performance trace with performance_start_trace, setting reload: true and autoStop: true to capture the full page load.
- 3.Review the trace results and note the insight set IDs; look for LCPBreakdown, DocumentLatency, RenderBlocking, and LCPDiscovery insights.
- 4.Call performance_analyze_insight for each relevant insight to understand which LCP subpart is the bottleneck.
- 5.Use evaluate_script with the 'Identify LCP Element' snippet to reveal the LCP element's tag, resource URL, and raw timing.
- 6.Call list_network_requests filtered by resource type (Image, Font, etc.) to inspect the network waterfall and compare the LCP resource's start time and duration against other resources.
- 7.Use evaluate_script with the 'Audit Common Issues' snippet to check for lazy-loaded images, missing fetchpriority, and render-blocking scripts.
- 8.Apply the prioritized optimization strategy matching your bottleneck: eliminate resource load delay (preload, fetchpriority), eliminate render delay (inline CSS, defer JS), reduce load duration (modern formats, CDN), or reduce TTFB (minimize redirects, edge caching).
Use cases
- A page's LCP is 4.5 seconds; use the trace analysis workflow to identify whether TTFB, resource delay, load duration, or render delay is the primary bottleneck, then apply the matching fix.
- An image-heavy hero section loads slowly; inspect the network waterfall and HTML to check for lazy-loading or missing preload directives, then add fetchpriority or convert to standard img tags.
- A site's Core Web Vitals score is poor on mobile; emulate Fast 3G and CPU throttling to surface real-world constraints, then re-run traces to verify optimization impact.
- A text-based LCP element (headline or paragraph) renders late; check for render-blocking stylesheets or scripts in the head, then defer or inline critical CSS.
- Verify that an LCP optimization (e.g., image compression, CDN migration) actually improved the metric; re-run the trace and compare the new subpart breakdown.
- Web performance engineers and optimization specialists
- Frontend developers responsible for Core Web Vitals
- Product teams focused on user experience and search ranking
- QA engineers testing page load performance under various network conditions
debug-optimize-lcp FAQ
2.5 seconds or less is considered good. 2.5–4.0 seconds needs improvement, and greater than 4.0 seconds is poor. LCP is a Core Web Vital that affects user experience and search ranking.
LCP has four sequential subparts with no gaps. If you reduce resource load duration (e.g., compress an image) but the real bottleneck is element render delay, the saved time just shifts to render delay. Always identify the bottleneck subpart first using LCPBreakdown insights.
No. Never lazy-load the LCP image. Use a standard <img> tag with src, and add fetchpriority="high" to prioritize it. If the image isn't discoverable in HTML, use <link rel="preload" fetchpriority="high">.
Use the 'Identify LCP Element' script snippet to inspect the LCP element. If the url field is empty, it's text-based (no resource to load). If url is populated, it's an image or other resource.
Lab traces (DevTools) measure under ideal conditions. Use emulate with Fast 3G and CPU throttling to simulate real-world constraints and surface issues visible only on slower connections or devices.
Full instructions (SKILL.md)
Source of truth, from chromedevtools/chrome-devtools-mcp.
name: debug-optimize-lcp description: Guides debugging and optimizing Largest Contentful Paint (LCP) using Chrome DevTools MCP tools. Use this skill whenever the user asks about LCP performance, slow page loads, Core Web Vitals optimization, or wants to understand why their page's main content takes too long to appear. Also use when the user mentions "largest contentful paint", "page load speed", "CWV", or wants to improve how fast their hero image or main content renders.
What is LCP and why it matters
Largest Contentful Paint (LCP) measures how quickly a page's main content becomes visible. It's the time from navigation start until the largest image or text block renders in the viewport.
- Good: 2.5 seconds or less
- Needs improvement: 2.5–4.0 seconds
- Poor: greater than 4.0 seconds
LCP is a Core Web Vital that directly affects user experience and search ranking. On 73% of mobile pages, the LCP element is an image.
LCP Subparts Breakdown
Every page's LCP breaks down into four sequential subparts with no gaps or overlaps. Understanding which subpart is the bottleneck is the key to effective optimization.
| Subpart | Ideal % of LCP | What it measures |
|---|---|---|
| Time to First Byte (TTFB) | ~40% | Navigation start → first byte of HTML received |
| Resource load delay | <10% | TTFB → browser starts loading the LCP resource |
| Resource load duration | ~40% | Time to download the LCP resource |
| Element render delay | <10% | LCP resource downloaded → LCP element rendered |
The "delay" subparts should be as close to zero as possible. If either delay subpart is large relative to the total LCP, that's the first place to optimize.
Common Pitfall: Optimizing one subpart (like compressing an image to reduce load duration) without checking others. If render delay is the real bottleneck, a smaller image won't help — the saved time just shifts to render delay.
Debugging Workflow
Follow these steps in order. Each step builds on the previous one.
Step 1: Record a Performance Trace
Navigate to the page, then record a trace with reload to capture the full page load including LCP:
navigate_pagewithpageIdto the target URL.performance_start_tracewithpageId,reload: trueandautoStop: true.
The trace results will include LCP timing and available insight sets. Note the insight set IDs from the output — you'll need them in the next step.
Step 2: Analyze LCP Insights
Use performance_analyze_insight to drill into LCP-specific insights. Look for these insight names in the trace results:
- LCPBreakdown — Shows the four LCP subparts with timing for each.
- DocumentLatency — Server response time issues affecting TTFB.
- RenderBlocking — Resources blocking the LCP element from rendering.
- LCPDiscovery — Whether the LCP resource was discoverable early.
Call performance_analyze_insight with pageId, the insight set ID, and the insight name from the trace results.
Step 3: Identify the LCP Element
Use evaluate_script (with pageId) and the "Identify LCP Element" snippet found in references/lcp-snippets.md to reveal the LCP element's tag, resource URL, and raw timing data.
The url field tells you what resource to look for in the network waterfall. If url is empty, the LCP element is text-based (no resource to load).
Step 4: Check the Network Waterfall
Use list_network_requests to see when the LCP resource loaded relative to other resources:
- Call
list_network_requestswithpageIdfiltered byresourceTypes: ["Image", "Font"](adjust based on Step 3). - Then use
get_network_requestwithpageIdand the LCP resource's request ID for full details.
Key Checks:
- Start Time: Compare against the HTML document and the first resource. If the LCP resource starts much later than the first resource, there's resource load delay to eliminate.
- Duration: A large resource load duration suggests the file is too big or the server is slow.
Step 5: Inspect HTML for Common Issues
Use evaluate_script (with pageId) and the "Audit Common Issues" snippet found in references/lcp-snippets.md to check for lazy-loaded images in the viewport, missing fetchpriority, and render-blocking scripts.
Optimization Strategies
After identifying the bottleneck subpart, apply these prioritized fixes.
1. Eliminate Resource Load Delay (target: <10%)
The most common bottleneck. The LCP resource should start loading immediately.
- Root Cause: LCP image loaded via JS/CSS,
data-srcusage, orloading="lazy". - Fix: Use standard
<img>withsrc. Never lazy-load the LCP image. - Fix: Add
<link rel="preload" fetchpriority="high">if the image isn't discoverable in HTML. - Fix: Add
fetchpriority="high"to the LCP<img>tag.
2. Eliminate Element Render Delay (target: <10%)
The element should render immediately after loading.
- Root Cause: Large stylesheets, synchronous scripts in
<head>, or main thread blocking. - Fix: Inline critical CSS, defer non-critical CSS/JS.
- Fix: Break up long tasks blocking the main thread.
- Fix: Use Server-Side Rendering (SSR) so the element exists in initial HTML.
3. Reduce Resource Load Duration (target: ~40%)
Make the resource smaller or faster to deliver.
- Fix: Use modern formats (WebP, AVIF) and responsive images (
srcset). - Fix: Serve from a CDN.
- Fix: Set
Cache-Controlheaders. - Fix: Use
font-display: swapif LCP is text blocked by a web font.
4. Reduce TTFB (target: ~40%)
The HTML document itself takes too long to arrive.
- Fix: Minimize redirects and optimize server response time.
- Fix: Cache HTML at the edge (CDN).
- Fix: Ensure pages are eligible for back/forward cache (bfcache).
Verifying Fixes & Emulation
- Verification: Re-run the trace (
performance_start_tracewithpageIdandreload: true) and compare the new subpart breakdown. The bottleneck should shrink. - Emulation: Lab measurements differ from real-world experience. Use
emulateto test under constraints:emulatewithpageId,networkConditions: "Fast 3G"andcpuThrottlingRate: 4.- This surfaces issues visible only on slower connections/devices.
Related skills
More from chromedevtools/chrome-devtools-mcp and the wider catalog.

memory-leak-debugging
Diagnose and fix memory leaks in JavaScript/Node.js apps using Chrome DevTools MCP heap snapshot tools.

troubleshooting
Diagnose and fix Chrome DevTools MCP connection and initialization failures.

a11y-debugging
Debug and audit web accessibility using Chrome DevTools with semantic HTML, ARIA, focus, and contrast checks.

chrome-devtools
Debug, automate, and inspect web pages using Chrome DevTools via MCP.

ego-browser
Chromium browser for AI agents to automate websites, fill forms, extract data, and test web apps.

clickup
Interact with ClickUp tasks and documents via API—get details, manage tasks, post comments, and create/edit docs.