# SEO Baseline

> 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.

- Skill: `biznitos/seo-baseline` (Agent Skill)
- Install (CLI): `npx skillmds@latest add biznitos/seo-baseline`
- Raw SKILL.md: https://api.skillmd.com/api/skills/biznitos/seo-baseline/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: biznitos (https://skillmd.com/u/biznitos)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/biznitos/seo-baseline

---


# 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

1. **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.

2. **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")`.)

3. **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"`.

4. **Write the JSON-LD partial** from `get_skeleton("seo")` to `/partials/seo` —
   a `LocalBusiness` block built from `{{ site.* }}`.

5. **Posts get article structured data automatically** when rendered through the
   post templates — set each post's `meta_title` / `meta_description`.

6. **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")`.

