---
title: "Technical SEO — seo-mcp"
description: "Crawling, indexing, rendering, performance and everything the bots must do to find and understand your site."
url: "https://seo-mcp.io/c/technical-seo"
---

# Technical SEO

Crawling, indexing, rendering, performance and everything the bots must do to find and understand your site.

Underlying category: [Technical SEO](https://seo-mcp.io/c/technical-seo) (50 tips).

- [Add LocalBusiness structured data](https://seo-mcp.io/t/add-localbusiness-structured-data) — LocalBusiness markup describes a physical or service-area business: name, address, telephone, hours and coordinates. Use a specific subtype, keep the address identical to the Google Business Profile, and use areaServed for service-area businesses. One page and one block per location.
- [Serve responsive images with srcset](https://seo-mcp.io/t/serve-responsive-images-with-srcset) — srcset with width descriptors and a sizes attribute lets the browser choose an appropriate file per viewport and pixel density. Without sizes, phones download desktop-size images. Provide at least three widths, keep dimensions to reserve layout space, and check the chosen file in the Network panel.
- [Fix crawl traps in filters and calendars](https://seo-mcp.io/t/fix-crawl-traps-in-filters-and-calendars) — Crawl traps are infinite URL spaces: calendars, sort combinations, session IDs and pagination that never ends. They starve real pages of discovery. Find them in Crawl stats, fix the link graph first, return 404 for out-of-range parameters, and block only the truly infinite spaces.
- [Make JavaScript content crawlable](https://seo-mcp.io/t/make-javascript-content-crawlable) — Google renders JavaScript, but rendering costs time and AI retrieval systems often read raw HTML. Server-render primary content, keep titles and links in the initial response, and avoid gating content behind interactions. Verify by curling the URL and by loading it with JavaScript disabled.
- [Implement hreflang for every locale](https://seo-mcp.io/t/implement-hreflang-for-every-locale) — hreflang tells Google which language and region variant to serve. Every variant must list all variants plus itself, using valid language or language-region codes and absolute URLs. Choose one delivery method, keep each variant self-canonical, and validate reciprocity after every locale change.
- [Fix internal links to 404 pages](https://seo-mcp.io/t/fix-internal-links-to-404-pages) — Internal links to 404 pages waste crawl budget and strand visitors. Crawl the site, list every target that returns 404 or 410, and trace the linking pages. Then either update the link to a live URL or add a redirect when a real replacement exists. Re-crawl to confirm zero broken internal links.
- [Fix soft 404 pages properly](https://seo-mcp.io/t/fix-soft-404-pages-properly) — A soft 404 returns HTTP 200 while showing missing-content copy. Google keeps it indexed and wastes crawl budget on empty templates. Find these URLs in the Page indexing report, then make missing content return a real 404 or 410 and keep 200 only for pages with genuine value.
- [Serve responsive images with next/image](https://seo-mcp.io/t/serve-responsive-images-with-next-image) — next/image emits responsive srcset values, picks modern formats and prevents layout shift when width and height are known. Replace raw img tags on content pages, pass sizes for each layout width, mark the LCP image priority, and keep alt text meaningful. Check the rendered HTML for srcset and intrinsic dimensions rather than trusting the component defaults.
- [Canonicalize duplicate URLs](https://seo-mcp.io/t/canonicalize-duplicate-urls) — Duplicate URLs split signals across protocol, host, slash and parameter variants. Pick one canonical form, emit one absolute self-referencing canonical per page, and align internal links, sitemap entries, hreflang and og:url with it. Use redirects when the duplicate should not exist at all.
- [Add canonical URLs with the Next.js Metadata API](https://seo-mcp.io/t/add-canonical-urls-with-the-next-js-metadata-api) — Next.js App Router resolves metadata per route, so each page can declare its own canonical URL instead of inheriting one global value. Set alternates.canonical in the page metadata export or generateMetadata, keep it absolute and self-referencing, and make sure template redirects and trailing-slash handling agree with the URL you declare.
- [Ship app/sitemap.ts and app/robots.ts](https://seo-mcp.io/t/ship-app-sitemap-ts-and-app-robots-ts) — Next.js App Router turns app/sitemap.ts and app/robots.ts into /sitemap.xml and /robots.txt at build time. Return only canonical, indexable URLs from sitemap.ts with honest lastModified values, and set the rules plus the sitemap location from robots.ts. Both files must be reachable without authentication and must not be shadowed by static files in public/.
- [Reduce INP to under 200 milliseconds](https://seo-mcp.io/t/reduce-inp-to-under-200-milliseconds) — Interaction to Next Paint measures how quickly the page responds to input, reported at p75. A good value is under 200 ms. Find the slowest interactions in the Performance panel, then split long tasks, defer third-party scripts, reduce hydration cost and trim DOM size.
- [Load fonts with next/font to avoid layout shift](https://seo-mcp.io/t/load-fonts-with-next-font-to-avoid-layout-shift) — next/font downloads and self-hosts Google or local fonts at build time, generates size-adjust fallbacks and removes the render-blocking stylesheet request. Import the font in the layout, pass its className to the html element, and reference the CSS variable in styles. Verify with a throttled trace that text does not shift and that no font request leaves your origin.
- [Add prerendering and a sitemap endpoint](https://seo-mcp.io/t/add-prerendering-and-a-sitemap-endpoint) — SvelteKit renders pages on the server by default, so crawlers already receive HTML, but every request still needs a render. Enable prerendering for content routes with export const prerender = true and generate a sitemap from src/routes/sitemap.xml/+server.ts so the file exists at build time.
- [Fix mixed content on HTTPS pages](https://seo-mcp.io/t/fix-mixed-content-on-https-pages) — Mixed content is any http:// resource loaded by an https:// page. Browsers block active mixed content such as scripts and styles, and warn or auto-upgrade passive images. Find it in the console and in crawl output, then serve every subresource over HTTPS, including third-party embeds.
- [Remove deprecated schema](https://seo-mcp.io/t/remove-deprecated-schema) — Rich result support changes. FAQPage is limited to authoritative government and health sites, HowTo rich results were retired, and data-vocabulary is obsolete. Remove markup for features you no longer qualify for, keep useful visible content, and check enhancement reports for items that stopped being valid.
- [Add html lang attribute](https://seo-mcp.io/t/add-html-lang-attribute) — The lang attribute on the html element tells browsers and assistive technology which language the page uses. Set it per locale, keep it accurate when content mixes languages, and make it match your hreflang values. A missing or wrong value breaks pronunciation, translation prompts and locale signals.
- [Lazy-load below-the-fold images](https://seo-mcp.io/t/lazy-load-below-the-fold-images) — Native loading=lazy defers offscreen images and iframes until they approach the viewport. Apply it only below the fold, keep width and height so space is reserved, and never lazy-load the LCP image. Verify in the Network panel that above-the-fold media loads immediately.
- [Handle faceted navigation with canonicals](https://seo-mcp.io/t/handle-faceted-navigation-with-canonicals) — Facets multiply URLs into thousands of near-duplicates. Decide which combinations deserve indexing, give those unique titles and copy with self-canonicals, and canonicalize the remainder to the closest indexable parent. Block infinite parameter spaces and monitor crawl stats for facet-heavy URLs.
- [Use descriptive URL slugs](https://seo-mcp.io/t/use-descriptive-url-slugs) — Descriptive slugs help users and give crawlers a topical hint. Keep them short, lowercase, hyphenated and stable. When a slug must change, redirect the old path with a single 301 and update internal links. Avoid dates, session IDs and uppercase characters that create duplicate URLs.
- [Fix redirect chains and loops](https://seo-mcp.io/t/fix-redirect-chains-and-loops) — A redirect chain adds latency and leaks crawl signals. Point each legacy URL directly at the final destination, use 301 or 308 for permanent moves, and keep the map in source control. Audit with curl -IL and update internal links so chains stop growing.
- [Submit your sitemap in Search Console](https://seo-mcp.io/t/submit-your-sitemap-in-search-console) — A sitemap is a hint, not a guarantee, but submitting it in Search Console shortens discovery for new URLs and reports parse errors. Submit under the property that owns the URLs, keep entries canonical and indexable, and resubmit only when the file or its lastmod values actually change.
- [Keep CLS under 0.1 on every page](https://seo-mcp.io/t/keep-cls-under-0-1-on-every-page) — Cumulative Layout Shift scores unexpected movement of visible content. Good means 0.1 or less at p75. The main causes are images without dimensions, injected ads or banners, and web fonts changing metrics. Reserve space, preload fonts and never insert content above existing content.
- [Add pagination handling for archives](https://seo-mcp.io/t/add-pagination-handling-for-archives) — Paginated archives need crawlable anchor links, a self-referencing canonical on each page and a clear stop at the last page. rel=next and rel=prev are no longer used for indexing. Ensure new items get internal links and that page two is not blocked or redirected to page one.
- [Serve security headers](https://seo-mcp.io/t/serve-security-headers) — Security headers reduce injection, clickjacking and downgrade risk. Send HSTS with a long max-age, a Content-Security-Policy in report-only mode first, X-Content-Type-Options nosniff, a Referrer-Policy and frame-ancestors. Verify with curl headers on the production host before you enforce the policy.
- [Improve LCP to under 2.5 seconds](https://seo-mcp.io/t/improve-lcp-to-under-2-5-seconds) — Largest Contentful Paint is the time until the biggest visible element renders. Google's good threshold is 2.5 seconds at the 75th percentile of field data. Measure with CrUX or PageSpeed Insights, identify the element, then fix server response, resource load delay, load duration and render delay.
- [Set canonicals and sitemap with Astro integrations](https://seo-mcp.io/t/set-canonicals-and-sitemap-with-astro-integrations) — Astro needs a production site value before canonicals and sitemaps can be correct. Set site in astro.config.mjs, install the @astrojs/sitemap integration, and let it emit sitemap-index.xml with child files. Then render an absolute canonical in the layout from Astro.url and Astro.site so every page references itself.
- [Monitor index coverage in Search Console](https://seo-mcp.io/t/monitor-index-coverage-in-search-console) — The Page indexing report groups URLs by status and reason. Review it weekly, sample each reason, and separate intentional exclusions from regressions. Track counts over time instead of reacting to a single spike, and use URL Inspection to confirm individual cases before changing code.
- [Add BreadcrumbList structured data](https://seo-mcp.io/t/add-breadcrumblist-structured-data) — BreadcrumbList markup mirrors the visible breadcrumb and gives Google the page hierarchy. Each ListItem needs position, name and item URL, ordered from home to the current page. Generate the markup from the same route data that renders the trail so the two cannot drift.
- [Use modern image formats](https://seo-mcp.io/t/use-modern-image-formats) — AVIF and WebP reduce image weight at equivalent quality, which speeds up LCP and lowers transfer cost. Serve them through picture with a fallback, convert at build time or at the edge, resize to the largest displayed dimension, and check the Content-Type and caching per format.
- [Return true 404s with notFound()](https://seo-mcp.io/t/return-true-404s-with-notfound) — A route that renders an empty template with status 200 is a soft 404: crawlers index it and users see nothing. Call notFound() when a record is missing or the slug is invalid, add app/not-found.tsx for the layout, and confirm the response status over HTTP. Keep redirects for moved content and reserve notFound() for genuinely absent pages.
- [Add Article schema for posts](https://seo-mcp.io/t/add-article-schema-for-posts) — Article markup describes editorial content with headline, image, datePublished, dateModified and author. Use BlogPosting for posts and Article as the generic type. Dates must be ISO 8601 with timezone, and the author should link to a real bio page. Never mark up listing pages as Article.
- [Set meta and canonicals with useSeoMeta](https://seo-mcp.io/t/set-meta-and-canonicals-with-useseometa) — Nuxt 3 resolves head tags per route through useSeoMeta and useHead. Set title, description, og and canonical in the page that owns the route, using an absolute URL built from runtimeConfig.public.siteUrl. Set the same origin in nuxt.config.ts so the sitemap module and prerender steps agree with it.
- [Return correct status codes for removed pages](https://seo-mcp.io/t/return-correct-status-codes-for-removed-pages) — Status codes are the first thing a crawler reads. Use 404 for URLs that never existed or may return, 410 for content removed for good, and 301 only when a real replacement exists. Check the status at the edge, because CDNs and rewrites routinely turn a correct framework 404 into a 200.
- [Move redirects into next.config redirects()](https://seo-mcp.io/t/move-redirects-into-next-config-redirects) — next.config redirects run before rendering and return 308 for permanent rules, so old URLs keep their signals without shipping JavaScript. Move server-side redirect maps into redirects(), mark permanent changes permanent, scope rules with has and missing, and keep temporary campaigns separate. Verify with curl that each old path returns one hop and the expected status.
- [Add a meta viewport tag](https://seo-mcp.io/t/add-a-meta-viewport-tag) — The viewport meta tag tells mobile browsers to use the device width. Without it, pages render at a virtual desktop width and text becomes unreadable. Add width=device-width, initial-scale=1, do not disable zoom, and verify the tag is in the server response.
- [Add BlogPosting JSON-LD in a server component](https://seo-mcp.io/t/add-blogposting-json-ld-in-a-server-component) — Article markup helps Google understand headline, author, publish date and image, and feeds both rich results and AI answers. In a Next.js App Router project, render a JSON-LD script inside the blog page server component from the same fields the page displays. Keep the markup valid and identical to the visible content.
- [Add an x-default hreflang entry](https://seo-mcp.io/t/add-an-x-default-hreflang-entry) — x-default marks the page served when no language or region matches, usually a selector or the global version. Add it to the hreflang set, ensure it returns 200 and is indexable, and never point it at a geolocation redirect. Validate reciprocity with the rest of the set.
- [Use a separate URL for each language](https://seo-mcp.io/t/use-a-separate-url-for-each-language) — Give every language version its own stable URL. Use a subdirectory or subdomain consistently, do not auto-redirect the first request by browser language, and offer a visible language switcher. Keep one canonical per language and annotate the set with hreflang.
- [Add Organization schema](https://seo-mcp.io/t/add-organization-schema) — Organization markup identifies the publisher: name, url, logo and sameAs profiles. Place one JSON-LD block in the sitewide layout, use absolute URLs, and keep names consistent with the brand elsewhere. Validate with the Rich Results Test and do not add ratings or addresses that belong to other types.
- [Fix collection canonicals and product schema offers](https://seo-mcp.io/t/fix-collection-canonicals-and-product-schema-offers) — Shopify renders collection pages at multiple filter and pagination URLs. Keep one canonical per collection, canonicalize filtered views to the base when they are not meant to rank, and emit Product markup whose offers match the real price, currency and availability shown in the buy box.
- [Manage crawl budget on large sites](https://seo-mcp.io/t/manage-crawl-budget-on-large-sites) — Crawl budget matters most for large or fast-changing sites. Segment server logs by Googlebot, measure requests per template, and remove the causes of waste: parameter URLs, soft 404s and duplicate paths. Improving response speed and internal linking also raises how much Google can crawl.
- [Set up Bing Webmaster Tools and IndexNow](https://seo-mcp.io/t/set-up-bing-webmaster-tools-and-indexnow) — Bing Webmaster Tools covers Bing and Copilot surfaces that Search Console reports do not. Verify the site, submit the sitemap and enable IndexNow so new URLs are pushed instead of waiting for a crawl. Keep the IndexNow key file at the site root, ping each changed URL after deploy and review crawl errors monthly.
- [Verify indexing with URL Inspection](https://seo-mcp.io/t/verify-indexing-with-url-inspection) — URL Inspection shows the indexed version Google holds for one URL: crawl time, selected canonical, status code and blocked resources. Run it before rewriting content or changing redirects. It separates indexing failures from ranking problems and confirms whether Google sees the same page your browser renders.
- [Write a crawlable robots.txt](https://seo-mcp.io/t/write-a-crawlable-robots-txt) — robots.txt controls crawling, not indexing. Serve one file per host at the root with a 200 status and a sitemap reference, allow CSS and JavaScript so rendering matches users, and block only infinite or private URL spaces. A single Disallow: / line can remove the entire site from search.
- [Add sitemap.xml with accurate lastmod](https://seo-mcp.io/t/add-sitemap-xml-with-accurate-lastmod) — An XML sitemap lists canonical, indexable URLs so crawlers discover them without following every link. Build it from the content store, use absolute URLs that match the page canonical, and set lastmod only when content meaningfully changed. Split large sites into child sitemaps under an index.
- [Programmatic SEO for Niche Job Boards: Templated Pages at Scale](https://seo-mcp.io/t/programmatic-seo-for-niche-job-boards-templated-pages-at) — Generate templated listing pages from structured job data so every role-and-location combination has a crawlable URL, then invest in the technical SEO underneath it. Unique titles built from template fields, internal links from hub pages, fast list and detail templates and clean indexation are what turn the template set into rankings. The tactic transfers to any niche with repeating structured records; without that technical layer the generated pages stay thin.
- [Shorten and clean URL slugs for on-page SEO](https://seo-mcp.io/t/shorten-and-clean-url-slugs-for-on-page-seo) — Rewrite each page's URL slug to two or three lowercase, hyphen-separated words built around the primary keyword. Drop underscores, capital letters and dates or numbers that do not describe time-sensitive content. Cleaner slugs are easier to read in search results and restate the target keyword in the URL; apply the rule to new content and templates first.
- [Add sameAs Markup to Link TikTok, Instagram and YouTube](https://seo-mcp.io/t/add-sameas-markup-to-link-tiktok-instagram-and-youtube) — Adding the sameAs property to a site's Organization or Person structured data tells Google which TikTok, Instagram and YouTube profiles belong to the brand. The change takes minutes, costs nothing, and connects off-site social profiles to the entity the website already describes, giving Google an explicit link between the site and its social presence.
- [Audit Googlebot crawl behavior with server logs to find crawl traps](https://seo-mcp.io/t/audit-googlebot-crawl-behavior-with-server-logs-to-find) — Server log analysis reveals how Googlebot actually spends crawl budget, exposing infinite URL spaces, thin faceted combinations and orphan pages that internal tools miss. The tip walks through filtering verified Googlebot requests, grouping them by URL pattern, then using robots rules, canonicals and internal links to redirect crawl attention toward pages that earn traffic.
