SEO baseline
What a site needs to rank and look right when shared. On MCP Village a lot of
this is table stakes the platform handles for you — focus the owner's effort
on the parts that need their real facts.
The platform does these automatically — do NOT build them
- robots.txt — generated; correctly blocks indexing while a site is
coming-soon / suspended.
- sitemap.xml — generated from your published pages and posts.
- LocalBusiness JSON-LD — injected into every page from the site's
name/address/phone/email. The SEO partial just makes it richer.
- llms.txt — generated for the
llmstxt.org convention. Note: Google has
said you do not need llms.txt to appear in its AI features — good SEO is
what matters. Don't treat it as an AI-ranking lever.
- Clean redirects — every
move_file records a 301 so old links keep working.
- Canonical host + HTTPS.
Don't write /robots.txt, /sitemap.xml, or /llms.txt yourself — you'd shadow
the generated ones.
The one hard gate for AI features: a page must be indexed and
snippet-eligible. Don't set noindex, nosnippet, or max-snippet:0 on a page
you want surfaced — it disqualifies the page from AI Overviews and normal results.
What you build — the per-site SEO that needs real facts
Confirm identity first — get_site. Name, address, phone, email, logo,
locale feed every meta tag and the structured data. Never invent them; ask the
owner if a detail is missing. Render them as {{ site.* }} so they update
everywhere when the owner changes them.
Build /layout from get_skeleton("layout"). Its <head> IS the
baseline and every page inherits it: title, description, robots, canonical,
theme-color, favicon, Open Graph + Twitter cards, and the JSON-LD partial.
Keep all of it. (See get_docs("layouts").)
Per-page title + description on EVERY page. Pass title and description
to write_file. Unique, specific, human — the single highest-leverage step. A
page that should stay out of search: pass robots: "noindex, follow".
Write the JSON-LD partial from get_skeleton("seo") to /partials/seo —
a LocalBusiness block built from {{ site.* }}.
Posts get article structured data automatically when rendered through the
post templates — set each post's meta_title / meta_description.
Business facts via set_seo — the richer the structured data, the better
the local/rich results: business_type (Restaurant, Dentist, Plumber…),
hours, price_range, area_served, geo_lat/geo_lng, social (profile
URLs → sameAs), theme_color, tagline.
After it's live — get it indexed
Proactively help the owner verify ownership so search engines index the site:
- Google Search Console and Bing Webmaster Tools → HTML-tag verification.
- Record the tokens with
set_seo(google_site_verification: …, bing_site_verification: …)
— they render the verification meta tags in <head>.
- See
get_docs("search-console").
1---2name: seo-baseline3description: Get a website found on Google and looking right when shared — the SEO baseline for a site built on MCP Village. Use when the owner wants to "show up on Google", "get found", "rank", fix how their site looks when shared, or set up Search Console, and the MCP Village connector is connected. Covers what the platform handles automatically vs. the per-site facts you must set.4---56# SEO baseline78What a site needs to rank and look right when shared. On MCP Village a lot of9this is **table stakes the platform handles for you** — focus the owner's effort10on the parts that need their real facts.1112## The platform does these automatically — do NOT build them1314- **robots.txt** — generated; correctly blocks indexing while a site is15 coming-soon / suspended.16- **sitemap.xml** — generated from your published pages and posts.17- **LocalBusiness JSON-LD** — injected into every page from the site's18 name/address/phone/email. The SEO partial just makes it richer.19- **llms.txt** — generated for the `llmstxt.org` convention. Note: Google has20 said you do **not** need llms.txt to appear in its AI features — good SEO is21 what matters. Don't treat it as an AI-ranking lever.22- **Clean redirects** — every `move_file` records a 301 so old links keep working.23- **Canonical host + HTTPS.**2425Don't write `/robots.txt`, `/sitemap.xml`, or `/llms.txt` yourself — you'd shadow26the generated ones.2728**The one hard gate for AI features:** a page must be indexed **and29snippet-eligible**. Don't set `noindex`, `nosnippet`, or `max-snippet:0` on a page30you want surfaced — it disqualifies the page from AI Overviews and normal results.3132## What you build — the per-site SEO that needs real facts33341. **Confirm identity first** — `get_site`. Name, address, phone, email, logo,35 locale feed every meta tag and the structured data. Never invent them; ask the36 owner if a detail is missing. Render them as `{{ site.* }}` so they update37 everywhere when the owner changes them.38392. **Build `/layout` from `get_skeleton("layout")`.** Its `<head>` IS the40 baseline and every page inherits it: title, description, robots, canonical,41 theme-color, favicon, Open Graph + Twitter cards, and the JSON-LD partial.42 Keep all of it. (See `get_docs("layouts")`.)43443. **Per-page title + description on EVERY page.** Pass `title` and `description`45 to `write_file`. Unique, specific, human — the single highest-leverage step. A46 page that should stay out of search: pass `robots: "noindex, follow"`.47484. **Write the JSON-LD partial** from `get_skeleton("seo")` to `/partials/seo` —49 a `LocalBusiness` block built from `{{ site.* }}`.50515. **Posts get article structured data automatically** when rendered through the52 post templates — set each post's `meta_title` / `meta_description`.53546. **Business facts via `set_seo`** — the richer the structured data, the better55 the local/rich results: `business_type` (Restaurant, Dentist, Plumber…),56 `hours`, `price_range`, `area_served`, `geo_lat`/`geo_lng`, `social` (profile57 URLs → `sameAs`), `theme_color`, `tagline`.5859## After it's live — get it indexed6061Proactively help the owner verify ownership so search engines index the site:62- Google Search Console and Bing Webmaster Tools → HTML-tag verification.63- Record the tokens with `set_seo(google_site_verification: …, bing_site_verification: …)`64 — they render the verification meta tags in `<head>`.65- See `get_docs("search-console")`.