plugins/aem/edge-delivery-services-content-ops/skills/heading-optimizer/SKILL.md
Audit and optimize headings across AEM Edge Delivery Services pages for search intent, hierarchy, and consistency. Extracts all headings (H1-H6), evaluates uniqueness, keyword alignment, specificity, and structural correctness, then generates optimized heading suggestions per page. Use when improving on-page SEO, fixing heading hierarchy issues, or standardizing heading patterns across a site.
npx skillsauth add adobe/skills heading-optimizerInstall 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.
Audit headings across AEM Edge Delivery Services pages for search intent alignment, structural correctness, and cross-page consistency, then generate specific optimized heading suggestions that authors can apply directly in their source documents.
This skill fetches external web pages for analysis. When fetching:
.plain.html variants).In Edge Delivery Services, headings are set by the content author in the source document (Google Docs or Microsoft Word) using the built-in heading styles: Heading 1, Heading 2, through Heading 6. EDS converts these to <h1> through <h6> in the rendered HTML.
Key EDS heading behaviors:
---) in the source document creates a new section (<div> wrapper). Headings within sections create the content hierarchy..plain.html variant returns all authored content including headings, stripped of site chrome (nav, footer, header).To fix headings, the author edits the source document directly — changing the heading style in Google Docs or Word. No code changes are needed.
.plain.html conventions are EDS-specific.Before starting, create a checklist to track progress:
For a single page, fetch its .plain.html (append .plain.html to the path; for root, use /index.plain.html). For multiple pages, fetch the query index at /query-index.json first to get the page inventory, then fetch .plain.html for each page.
For each page, extract every heading element (H1 through H6) and record:
<div> wrappers or <hr> separators).Present the heading structure for each page as an outline:
/blog/seo-guide
H1: SEO Guide
H2: Overview
H3: What Is SEO?
H2: Getting Started
H3: Step 1
H3: Step 2
H2: Conclusion
If fetching via a tool that converts HTML to markdown, heading levels may be represented as #, ##, etc. Map these back to H1-H6. Some tools strip HTML attributes; if you need raw heading markup, use curl to preserve the original HTML.
The H1 is the most important heading on the page for SEO. Evaluate each page's H1 against these criteria:
| Check | Pass | Fail |
|-------|------|------|
| Exactly one H1 | Page has a single H1 | Page has zero H1s or multiple H1s |
| Unique across site | No other page shares the same H1 text | Another page has an identical H1 |
| Descriptive | H1 clearly describes the page content | H1 is generic: "Home", "Welcome", "Overview", "Untitled" |
| Includes target keyword | H1 naturally contains the primary keyword or topic | H1 is vague or off-topic |
| Appropriate length | 20-70 characters | Too short (<20 chars) or too long (>70 chars) |
| Matches title tag | H1 aligns with the <title> (not necessarily identical, but topically consistent) | H1 and title are about different topics |
For each failing check, note the issue and provide a suggested fix.
H2 headings are the second most important for SEO — they define the subtopics of the page and often match the queries people search for. Evaluate all subheadings:
Flag headings that are generic and do not describe their section's content:
| Generic (Weak) | Why It's Weak | Suggested Improvement | |---|---|---| | Overview | Does not describe what is being overviewed | "What Is Content Delivery?" | | Details | Meaningless without context | "Pricing and Plan Details" | | More Information | Filler heading | "Frequently Asked Questions" | | Getting Started | Acceptable but could be more specific | "How to Set Up Your First Project" | | Features | Common but vague | "Key Features: Speed, Security, and Scalability" | | Benefits | Generic | "How EDS Reduces Page Load Times by 50%" | | Resources | Describes format, not content | "Documentation and API References" | | Contact Us | Acceptable for contact pages | -- |
For each H2, consider: would someone search for this phrase? Good H2s match the way people ask questions or describe topics:
Flag H2s that no one would search for (e.g., "Section 2", "Part B", "Below").
Within a page, headings at the same level should follow a consistent pattern:
Check the structural correctness of the heading outline:
| Rule | Violation | Impact | |------|-----------|--------| | No skipped levels | H1 followed directly by H3 (skipping H2) | Screen readers announce heading levels; skipping confuses the document outline | | Single H1 | Multiple H1s on the page | Dilutes the primary topic signal; confuses search engines | | Logical nesting | H3 under H2 is correct; H2 under H3 is not | Breaks the semantic outline | | Headings not empty | A heading element with no text content | Results in an empty heading in the rendered HTML | | Headings match content | The heading describes the content that follows it | Misleading headings confuse both readers and search engines |
For each violation, report:
| Page | Issue | Location | Details | |------|-------|----------|---------| | /blog/guide | Skipped level | Section 2 | H1 jumps to H3 — missing H2 | | /about | Multiple H1s | Sections 1, 3 | Two H1 headings: "About Us" and "Our Mission" | | /products | Empty heading | Section 4 | H2 with no text content |
When analyzing multiple pages, check for issues that span the site:
List any pages that share the same H1 text:
| H1 Text | Pages |
|----------|-------|
| "Welcome" | /, /landing, /promo |
| "Overview" | /services, /products |
Each page should have a unique H1 that distinguishes it from every other page on the site.
Look for inconsistencies across similar pages. For example, if blog posts use different H1 patterns:
/blog/seo-tips — H1: "10 SEO Tips for 2026" (numbered list format)/blog/content-strategy — H1: "Content Strategy" (bare topic)/blog/analytics-guide — H1: "The Complete Guide to Analytics" (guide format)Recommend a consistent pattern for the content type (e.g., all blog posts should use "[Topic]: [Descriptive Subtitle]" or a similar convention).
If one page in a content type has an H2 section that others lack (e.g., all product pages have "Features" and "Pricing" except one), flag the inconsistency.
For each page with heading issues, produce a before/after comparison:
/blog/seo-guide — "SEO Guide"| Level | Current Heading | Issue | Suggested Heading | |-------|----------------|-------|-------------------| | H1 | SEO Guide | Too short, missing keywords | SEO Guide: How to Optimize Your Site for Search in 2026 | | H2 | Overview | Generic, not searchable | What Is SEO and Why Does It Matter? | | H2 | Getting Started | Vague | How to Start Optimizing Your Site for Search | | H3 | Step 1 | No descriptive content | Step 1: Research Your Target Keywords | | H3 | Step 2 | No descriptive content | Step 2: Optimize Your Page Titles and Meta Descriptions | | H2 | Conclusion | Generic | Key Takeaways for SEO Success |
For each suggestion, note that the author should apply the change by editing the heading style in their Google Doc or Word document. No code changes are needed.
Compile the findings into a final report:
Rate the heading quality: Strong / Needs Improvement / Poor
The tables from Step 6 for each page.
Remind the author how to fix headings in EDS:
| Problem | Cause | Solution |
|---------|-------|----------|
| Cannot find H1 on the page | The author may not have applied Heading 1 style; the first bold/large text is not an H1 | Check the raw HTML for <h1>; if absent, recommend the author set a Heading 1 in the source doc |
| Headings appear inside blocks | Block tables in the source doc can contain headings | Note which block the heading belongs to; block headings may follow different conventions |
| Fetch tool converts headings to markdown | Tools that return markdown lose the distinction between styled and unstyled text | Use curl to get raw HTML if heading levels are ambiguous |
| Site has hundreds of pages | Full audit is too large | Scope to a content type or path prefix; sample 10-20 representative pages |
| Headings contain HTML entities | Encoded characters like & in heading text | Decode entities for display; the source doc will have the plain character |
| Author disagrees with suggestion | Heading optimization is partly subjective | Present suggestions as recommendations, not mandates; explain the SEO rationale |
tools
Use the run-workflow MCP to discover, compose, execute, publish, and save Adobe Firefly workflows. TRIGGER when: user asks what actions are available, what the MCP can do, how to process images/video/3D via workflow, wants to build/run/save/publish a workflow, OR pastes any workflow/batch/execution ID. BARE ID (UUID/workflowId/batchId) = INSPECT ONLY — call inspect_run, NEVER run_workflow_submit. ALWAYS call list_actions first for capability/discovery questions. DO NOT TRIGGER for direct Firefly API calls without MCP (use firefly-api-specs).
tools
Run predefined featured workflows via run-workflow MCP. TRIGGER when user names a featured workflow (retargeting, banners at scale, localization, packaging, banner advertising, etc.) or asks to run a known marketing/production workflow. Requires run-workflow MCP. ALWAYS call get_featured_workflow before compose_workflow. DO NOT TRIGGER for custom one-off workflows with no named template — use run-workflow skill.
tools
Migrate an Adobe Commerce App Builder project from the Integration Starter Kit or Checkout Starter Kit to the new App Management approach. Run from the root of the App Builder project to be migrated. Pass --auto to skip confirmation prompts (suitable for CI or batch use) — auto mode prints a summary of all Q&A questions answered with their defaults. Pass --doc-scan-only to scan README.md and env.dist for outdated content without modifying any files. Use when the user wants to migrate an App Builder project from the Integration Starter Kit or Checkout Starter Kit to the App Management approach, or mentions upgrading their Adobe Commerce extension architecture.
development
Add or modify webhook interceptors in an Adobe Commerce app. Use when the user wants to intercept Commerce operations to validate input, append data, or modify behavior — before or after execution. Requires a base app initialized with commerce-app-init.