# Website Builder

> Build, launch, or update a small-business website by talking to the MCP Village connector — pages, business hours, contact forms, leads, blog posts, and SEO, all in plain English. Use when a non-technical owner wants a real website created or kept current (e.g. "build me a site for my café", "change my phone number", "add a contact form", "show me my leads") and the MCP Village connector (mcpvillage.com/mcp) is connected.

- Skill: `biznitos/website-builder` (Agent Skill)
- Install (CLI): `npx skillmds@latest add biznitos/website-builder`
- Raw SKILL.md: https://api.skillmd.com/api/skills/biznitos/website-builder/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/website-builder

---


# Building a website with MCP Village

MCP Village hosts a real website that the owner edits by talking to you. The
owner is usually a busy, **non-technical** small-business person. Your job is to
do the work and report back plainly — never explain HTML, Liquid, or SEO
mechanics unless they ask.

The connector ships its own deeper guides and starter templates; **pull them in**
rather than guessing:
- `get_docs("layouts")` — the layout paradigm (read before a multi-page site).
- `get_docs("reference")` — every Liquid variable, tag, and filter available.
- `list_skeletons` / `get_skeleton(key)` — ready-made starters; start from one.
- `list_skills` / `get_skill(name)` — packaged procedures, including an
  `seo-baseline` and per-industry build guides (restaurant, trades, clinic,
  portfolio, nonprofit, and more). When the owner's business matches one, fetch
  and follow it.

## The golden path

1. **`get_site` before changing anything.** It holds the AUTHORITATIVE facts —
   name, email, phone, address, logo, status. Never invent a business fact. In
   pages, render them as `{{ site.name }}` / `{{ site.email }}` / `{{ site.phone }}`
   / `{{ site.address }}` so they stay correct everywhere; if a detail you need
   isn't set, ask the owner rather than guessing.

2. **Build the frame once.** For anything beyond a single page, start from
   `get_skeleton("layout")` and write it to `/layout`. The layout holds the
   shared header, nav, footer, and a complete SEO `<head>`. Every page then
   inherits it.

3. **Write pages as BODY-ONLY content** — just the inner `<section>`s, NEVER a
   full `<!doctype>`/`<html>`/`<head>` document. The platform automatically wraps
   your content in a complete, SEO-ready page. Writing a full document opts the
   page out of the layout and the auto-SEO.

4. **Pass `title` + `description` on every page** (`write_file`) — they surface
   as `{{ page.title }}` / `{{ page.description }}`. Unique and specific: this is
   the highest-leverage SEO step.

5. **Reuse with partials.** Write a snippet to `/partials/<name>` and include it
   with `{% partial "/partials/<name>" %}`. Partials and the layout only render
   inside `render: "liquid"` content.

6. **Record the business facts for SEO** with `set_seo` — `business_type`
   (Restaurant, Dentist, Plumber…), `hours`, `area_served`, `geo_lat`/`geo_lng`,
   `price_range`, `social`. They power rich results and local ranking. Follow the
   `seo-baseline` skill for the full checklist.

7. **Don't build `robots.txt`, `sitemap.xml`, or `llms.txt`** — they're generated
   automatically. Writing them shadows the generated ones.

## Other common jobs

- **Images:** pages are text. Add photos with `upload_file` (a URL, or base64
  data); reference them by the returned `url`. `list_media` shows what's already
  uploaded.
- **Repeating content** (blog posts, products, articles): `create_post`. Each
  renders through a template and gets article/product structured data
  automatically. Set each post's `meta_title` / `meta_description`.
- **Leads:** visitors submit forms; `list_submissions` and `list_contacts` show
  them. There's no `create_submission` — only visitors create those.
- **Multiple sites:** `list_sites` shows the owner's sites; `use_site` switches
  which one you're editing; `create_site` makes a new one (ask for the name, what
  it's about, and a contact email first, confirm, THEN create — it's a real
  public subdomain, and the system computes the address from the name).

## Talking to the owner

Keep replies short, friendly, and non-technical. Confirm what you changed and
give the link to view it (`write_file` returns the page's `url`). Skip the markup
and the SEO jargon unless they ask for it.

