Server definition
- Hash
- sha256:67282d983358f3ba73cd2eb5d60540eca74a3878f87bd5496cb96e0ffb5c905d
- What it is
- What a remote MCP server returned when asked what it offers: 13 tools
The blob, as servednamed by its sha256
{
"instructions": "sitectrl builds and hosts real websites. create_site turns a plain-language description into a LIVE hosted site (1-3 min); edit_site changes it; write_site_files lets YOU author the code. Working contact/booking forms: POST to /_sc/form/submit with a hidden _form field — submissions reach the owner's dashboard + email (never mailto:). Sites also have a built-in data API (/_sc/data/<collection>: public_* readable by anyone, member_* needs a signed-in site member, bare names owner-only) and visitor accounts (/_sc/site-auth/register|login|logout|me) — use them for guestbooks, RSVPs, bookings, member areas; never invent your own storage or auth. search_domains finds real domains with prices; purchases hand the user a checkout link (the connector never spends money). get_analytics reads the site's private first-party traffic. Free tier: one site, no card.",
"tools": [
{
"description": "Insert a component from the site's shared library into one or more existing pages, INSTEAD of hand-writing the markup yourself — the classes are already styled and themed to this site's colours. Choices: sc-page-title (the page's one <h1>), sc-gallery (cross-fading photo reel — needs 'images'), sc-info-tiles (title + picture + text sections — needs 'tiles'), sc-instructions (numbered/titled steps, optionally with a button each — needs 'tiles'), sc-event (one dated thing: a class, a session, an opening — needs 'title'), sc-btn (a link styled as a button — needs 'label'). NOT offered: sc-header/sc-footer (the site's own shell already emits those) or sc-hero (placed once, on the home page, by the site's own build). 'anchor' says where it goes: {\"type\": \"heading\", \"value\": \"<text on the page>\", \"position\": \"after\"} (default), {\"type\": \"id\", \"value\": \"<element id>\", \"position\": \"after\"}, {\"type\": \"main_end\"} (append at the end of the page), or {\"type\": \"replace\", \"value\": \"<class of an existing sc-* block>\"}. 'pages' is \"all\" or a list of paths from list_site_files. A page whose anchor doesn't match comes back in 'findings' with what's wrong and the fix — other pages in the same call still get the component. Follow with publish_site.",
"inputSchema": {
"properties": {
"anchor": {
"properties": {
"position": {
"description": "for heading/id anchors, default after",
"enum": [
"before",
"after"
],
"type": "string"
},
"type": {
"enum": [
"heading",
"id",
"main_end",
"replace"
],
"type": "string"
},
"value": {
"description": "heading text / element id / class to replace — not used for main_end",
"type": "string"
}
},
"required": [
"type"
],
"type": "object"
},
"fields": {
"description": "Component-specific content. sc-page-title: {text, eyebrow?}. sc-gallery: {images: [{src, alt}]}. sc-info-tiles: {tiles: [{title, img?, alt?, text}]}. sc-instructions: {title?, intro?, tiles: [{title?, body, img?, alt?, button?: [label, href]}]}. sc-event: {title, img?, meta?: [{label, value}], desc?, rsvp_href?, rsvp_label?}. sc-btn: {label, href}.",
"type": "object"
},
"name": {
"enum": [
"sc-page-title",
"sc-gallery",
"sc-info-tiles",
"sc-instructions",
"sc-event",
"sc-btn"
],
"type": "string"
},
"pages": {
"description": "\"all\", or an array of page paths, e.g. [\"index.html\", \"about.html\"]",
"oneOf": [
{
"enum": [
"all"
],
"type": "string"
},
{
"items": {
"type": "string"
},
"minItems": 1,
"type": "array"
}
]
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"name",
"anchor",
"fields"
],
"type": "object"
},
"name": "add_component",
"outputSchema": null
},
{
"description": "Build a brand-new hosted website from a plain-language description. RETURNS IMMEDIATELY with status 'building' — the site takes about 2-3 minutes and is NOT ready when this returns. Tell the user where it will be (expected_url) and poll get_build_status with the returned claim_token. NEVER call create_site a second time for the same site: each call builds another one. Works WITHOUT signing in: an unauthenticated call builds a guest site and returns a claim_url — the user signs up free (no card) at that link to keep it; unclaimed guest sites are deleted after 72 hours. Signed in, the site lands directly on the connected account (free tier: one site, no card).",
"inputSchema": {
"properties": {
"contact_email": {
"description": "Optional, guest builds only: the user's email — we send the site link and a reminder before the unclaimed site expires.",
"type": "string"
},
"description": {
"description": "What the site is for. MINIMUM 12 CHARACTERS — a bare 'bike shop' is rejected. Say what the business is, where it is, and what the site should include; the AI builds directly from this, so more detail means a better first result. Good: 'Oak Barrel Coffee, a small-batch roaster in Turlock CA — our story, three coffees with tasting notes and prices, and a contact form.' If the user was vague, ask them one question before calling this rather than sending two words.",
"minLength": 12,
"type": "string"
},
"site_name": {
"description": "Short human name for the site, e.g. 'Whitney Apparel'.",
"type": "string"
},
"template": {
"description": "Optional override of the starting template. Omit it and the template is chosen from the description.",
"enum": [
"local-services",
"restaurant",
"shop",
"portfolio",
"classes",
"community"
],
"type": "string"
}
},
"required": [
"site_name",
"description"
],
"type": "object"
},
"name": "create_site",
"outputSchema": null
},
{
"description": "Ask sitectrl's AI editor to change an existing site ('add a contact page', 'make the hero darker'). Edits land in the site's draft; the first build of a brand-new site goes straight live. Returns what changed plus the draft URL.",
"inputSchema": {
"properties": {
"instruction": {
"description": "The change to make, in plain language.",
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"instruction"
],
"type": "object"
},
"name": "edit_site",
"outputSchema": null
},
{
"description": "The site's private first-party traffic: pageviews/visitors/sessions/clicks totals, top pages, referrers, devices. Windows: 24h, 7d, 30d.",
"inputSchema": {
"properties": {
"slug": {
"type": "string"
},
"window": {
"enum": [
"24h",
"7d",
"30d"
],
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "get_analytics",
"outputSchema": null
},
{
"description": "Check whether a site started by create_site has finished. Pass the claim_token create_site returned. Works WITHOUT signing in. Poll this every 30-60 seconds rather than calling create_site again — a second create_site call builds a SECOND site.",
"inputSchema": {
"properties": {
"claim_token": {
"description": "The claim_token from create_site.",
"type": "string"
}
},
"required": [
"claim_token"
],
"type": "object"
},
"name": "get_build_status",
"outputSchema": null
},
{
"description": "Details for one site: live URL, draft URL, status.",
"inputSchema": {
"properties": {
"slug": {
"description": "The site's slug from list_sites.",
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "get_site",
"outputSchema": null
},
{
"description": "List the files in a site's draft tree (paths + sizes).",
"inputSchema": {
"properties": {
"slug": {
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "list_site_files",
"outputSchema": null
},
{
"description": "List the user's sitectrl sites with their live URLs and hosting platform.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "list_sites",
"outputSchema": null
},
{
"description": "Publish the site's draft to the LIVE site (hosted sites). A snapshot of the previous live version is taken first, so it's undoable.",
"inputSchema": {
"properties": {
"slug": {
"type": "string"
}
},
"required": [
"slug"
],
"type": "object"
},
"name": "publish_site",
"outputSchema": null
},
{
"description": "Read one file from a site's draft tree (text, or base64 for binary; 512 KB cap).",
"inputSchema": {
"properties": {
"path": {
"type": "string"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"path"
],
"type": "object"
},
"name": "read_site_file",
"outputSchema": null
},
{
"description": "Search real domain availability + prices (com/net/org/co/io/site and more). Available results include a purchase_url — hand it to the USER to complete checkout; the connector never spends money. Purchased domains connect to their sites in one click.",
"inputSchema": {
"properties": {
"query": {
"description": "Domain or name to check, e.g. 'sierratrailcoffee.com'.",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
},
"name": "search_domains",
"outputSchema": null
},
{
"description": "The connected sitectrl account: email, plan status, free-site slot, and credit balance.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "whoami",
"outputSchema": null
},
{
"description": "Push files (HTML/CSS/JS/images) into a site's DRAFT — use this when YOU are writing the code yourself instead of asking sitectrl's AI. Text files go in 'content'; binary files (images/fonts) in 'content_base64'. Max 40 files/call, 2 MB/file. Keep the <script defer src=\"sc-track.js\"></script> include on every HTML page (the site's built-in private analytics — publish re-adds it if missing). Use clearly-marked placeholder contact info unless the user provided real details. For working forms, POST to /_sc/form/submit with a hidden _form name field — submissions reach the owner's dashboard + email (never use mailto:). Every HTML file is checked before it's written (DOCTYPE, charset, and any invariant this site has declared) — a file that fails is refused and comes back in 'refused' with what's wrong and the exact fix; other files in the same call still write. Follow with publish_site to go live.",
"inputSchema": {
"properties": {
"files": {
"items": {
"properties": {
"content": {
"type": "string"
},
"content_base64": {
"type": "string"
},
"path": {
"description": "Relative path in the site, e.g. index.html or css/style.css",
"type": "string"
}
},
"required": [
"path"
],
"type": "object"
},
"type": "array"
},
"slug": {
"type": "string"
}
},
"required": [
"slug",
"files"
],
"type": "object"
},
"name": "write_site_files",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:67282d983358f3ba73cd2eb5d60540eca74a3878f87bd5496cb96e0ffb5c905d | sha256sum