# Dotsy MCP server

Source: https://glimind.com/server/mcp-registry%2Fai.dotsy%2Fmcp
Registry id: `mcp-registry/ai.dotsy/mcp`
Status: live (checked 2026-10-27T00:48:06.558Z)

## Measurements (30 days)

- Uptime: 100%
- Checks: 3861
- Outages (90 days): 0

## Install

```json
{
  "mcpServers": {
    "dotsy-mcp-server": {
      "type": "http",
      "url": "https://mcp.dotsy.ai/mcp"
    }
  }
}
```

Claude Code:

```sh
claude mcp add --transport http dotsy-mcp-server https://mcp.dotsy.ai/mcp
```

## Tools (102)

- `adapt_site_analyze`: Propose nav wiring + blog collectionization for an imported mirror (draft, opt-in). Read-only; returns per-adapter reports + proposalEtag. Nav decline may inclu
- `adapt_site_apply`: Apply the adapt proposal (draft): wire nav into the menu store and/or rewrite the blog index to a live <dotsy-collection>. One undo covers the whole apply; a se
- `adapt_site_revert`: Atomically restore everything the last adapt_site_apply wrote (fragments, the menu doc when the op touched it, index, member configs, routes).
- `add_custom_domain`: Connect apex and/or www on a paid plan; starts a DNS connect session.
- `apply_changeset`: Stage writes[] + deletes[] in one call; attach routes via writes[].route. writes[].ifMatch (hash from get_site_manifest; "" = must not exist) guards each key (a
- `batch_patch_content`: patch_content on multiple keys; all-or-nothing validation. Preferred edit path for pages over 60KB. replace-string value/replace ≤60KB; whole call ≤80KB.
- `bulk_put_assets`: Upload 1–200 CMS assets; key = path after /assets/, or sitePath for an exact URL path (e.g. /.well-known/security.txt, /ads.txt). Each item: exactly one of body
- `bulk_put_content`: Stage many content keys (pages, layouts, fragments). Content only — not routes or assets. Each body ≤60KB and the whole call ≤80KB; larger pages use stage_conte
- `claim_site`: Move the guest draft onto your signed-in Dotsy account. Requires OAuth Connect; pass the guestToken from start_site.
- `create_site`: Create empty site; seeds brief. Globally taken slugs auto-suffix to `{slug}-{adjective}-{noun}` (default); pass onSlugTaken:"fail" to get a 409 instead of a ren
- `decompose_analyze`: Deprecated — use structure_site_analyze.
- `delete_asset`: Delete a static asset by key. The editor and draft preview drop it at once; the published site drops it at the next publish.
- `delete_content`: Delete content key (tombstone if published). A fragments/* section that pages still place is refused with section_in_use (lists the pages) — detach it or remove
- `delete_draft_test`: Remove a draft A/B test (releases variant bodies; does not publish).
- `delete_menu_item`: Remove one item from a menu (page stays live).
- `delete_route`: Remove a route by path.
- `delete_site`: Permanently delete site; confirmSlug must equal slug.
- `detach_section`: Give one page its own copy of a shared section; every other page keeps the shared one. A draft — publish_site to go live. A section the layout places is hidden 
- `discard_drafts`: Discard unpublished drafts: all (omit key/keys/routes), one content key (key), or a selection (keys, routes). Destructive — check get_draft_status first.
- `edit_page`: Open the interactive page canvas to change content: the user clicks an element, then you call patch_content. Use when the intent is editing — not for verify-onl
- `estimate_test`: Estimate days to reach promote readiness for a page (traffic baseline). Read-only.
- `find_replace`: Case-insensitive find→replace across pages in one staged commit. Batch all replacements into ONE call — never parallelize find_replace on the same key (concurre
- `get_account_context`: Account, user, memberships[]. Pass workspace on writes when memberships.length > 1.
- `get_activity`: List site activity or fetch one change diff (pass id). Filters: who, state, actor (me), since, limit≤20. Notes from context are visible to everyone on the site 
- `get_adapt_status`: Read adapt state: proposal summary + proposalEtag (+ applied/consumed flag), undo-record presence, active or queued job progress. Use to resume in a fresh sessi
- `get_analytics`: Read-only traffic overview (default) or full breakdowns via include[]; optional bot id for crawler page drill-down.
- `get_asset`: Read one asset (metadata + base64 + stored sha256). sha256 is the stored blob; may differ from upload bodySha256 when IMAGES re-encodes rasters. Uploaded files 
- `get_collection_schema`: Read the site's collection field definitions (`_data/collections.json`, draft view): { schema: { v: 1, collections: { "<key>": { fields[], settings? } } }, hash
- `get_content`: Read one content key; optional selector (region) or published=true (live body). Bodies over 40KB without a selector return a truncated summary — use selector, b
- `get_custom_domain_connect`: Current connect session and nextAction (browser URL or manual DNS guide).
- `get_draft_status`: Pending draft changes: content keys and routes with status. May include requiredDecision (publish_confirm) before publish_site.
- `get_form_submission`: Read one form submission with the full field payload (explicit PII access — use only when needed).
- `get_menu`: Read a menu's draft items and etag; menu rules → get_skill('nav').
- `get_menu_doc`: Read the whole menu doc (all menus + shell/template), etag for put_menu_doc, and issues (by item id) — page_not_routable, page_missing, page_dead_link, page_is_
- `get_plan`: Read-only workspace plan and pooled usage; pass slug for this site's add-ons. Call before a large build.
- `get_route`: Get one route by path (home is '/').
- `get_site`: Site detail, stats, publicUrl, brief head (default-on), and readiness flags. pages[] is a ~25-entry head by default (stats.pages has the true count) — pass page
- `get_site_build_progress`: Read-only build progress for humans (build-theater view) during structure/adapt or after import. Agent reads structuredContent.forHumans — optional; do not call
- `get_site_manifest`: Content keys + hashes only (optional routes=true) — static files live in list_assets, not manifest. Diff keys+hashes before apply_changeset; stage only changed 
- `get_site_outline`: Site shape: every layout and shared section (`sections`: fragments/* by name, with page count, whether the file exists and staged-change flag), whether a layout
- `get_skill`: Skill body + optional questions[]. Accepts an id OR a synonym (e.g. 'list', 'menu') — resolves aliases and suggests near-misses. Start with intake when ambiguou
- `get_structure_result`: Last structure apply job result (structuredKeys, conflicts, partial).
- `get_structure_status`: Flat vs structured page counts; informs user — do not auto-run analyze/apply while requiredDecision pending.
- `graduate_site`: Enable site search & collections (kv → do-sqlite), one-way. Unlocks search_content, collection indexes, visitor /__paige/search, and moves any R2 form-submissio
- `import_site_from_url`: Import URL to draft. On complete, response may include requiredDecision — preview then ask mirror vs editable before structure_*.
- `infer_collection_schema`: Suggest fields for one collection from a sample of its items' meta.custom values (published data, else drafts) — writes nothing. Returns { sampled, suggestions:
- `inspect_collection`: Collection state — count, server.mode, sample entries, tag (membershipKind, match=) when discovered; plus name, noun, URL pattern, layout, where it's listed, an
- `list_assets`: CMS uploads under assets/ only — not mirrored clone CDN (get_site mirroredAssets or import warmJob). Not content — use list_content. Uploaded files are live in 
- `list_collections`: Collections on the site — name, noun, item count (or 'not published yet'), URL pattern, and whether any member is staged. Includes a collection only a draft pag
- `list_content`: List content keys (HTML/md); not assets — use list_assets. Defaults to 50 keys per page — raise limit (max 1000) or pass cursor (from nextCursor) to page throug
- `list_custom_domains`: List all custom hostnames and connection status for the site.
- `list_form_submissions`: List form submissions (metadata + bounded field preview — not full PII). Works on kv and do-sqlite backends.
- `list_goals`: List site conversion goals (pageview paths and form submits). Required before start_test.
- `list_my_sites`: List your Dotsy sites. Renders a site-picker for humans; agent reads structuredContent. Use to choose a site — not for editing content (use edit_page) or verify
- `list_notifications`: Account notification inbox (Needs you · Updates). Summary-first: tab counts plus compact rows with nextAction (MCP tool or dashboard URL). OAuth person only — n
- `list_pages`: List pages on a site — route settings (path/title/navLabel/purpose) by default, one row per route. Renders a page-picker for humans (redirect and worker routes 
- `list_skills`: Paige build skills (id + whenToUse). Pull get_skill on demand — do not duplicate in tool text.
- `list_versions`: List the site's published versions, newest first (who, when, pages, live, restorable). Use before restore_version.
- `mark_notifications_read`: Mark Update notifications read (ids or all). Needs-you Actions refuse with 422 action_not_markable — fix the cause; it clears itself.
- `new_post_template`: Read-only scaffold for a new post — suggested key/path, membership meta, blank or duplicate body. Then put_post (+ optional put_route).
- `optimize_assets`: Shrink heavy images in place (0.98): JPEG/PNG/still GIF → WebP at the same address, so no HTML changes. keys = site paths from verify_page health.assets[].ref —
- `patch_content`: Edit one content key via ops[] (selector ops or replace-string; wrap/unwrap/move restructure siblings). Stages draft; op shapes in schema.
- `patch_route`: Partial route update (only sent fields change; an OMITTED field is left alone). On a field that accepts null (contentKey, redirectTo, redirectStatus, preserveQu
- `preflight_site`: Plan check before publish or large build (counts, route soft limit, seo suggestions). When ok is false, blocking lists the failed suggestion codes. Read-only.
- `preview_page`: Verify-only composed HTML check; home preview may include requiredDecision — ask mirror vs editable before structure_*.
- `promote_experiment`: Promote a winning A/B variant to live — explicit user instruction only; see get_skill('verify') § A/B.
- `publish_site`: Publish draft to live. feedback and handoff required (use dummy feedback + one-line handoff if clean).
- `put_collection_schema`: Replace the whole field schema (draft; publish makes it live). Read it with get_collection_schema first and send it back edited. Collection keys exactly as list
- `put_content`: Stage one content key. Body ≤60KB. Larger pages: stage_content_chunk + apply_changeset bodyStaging, dotsy push, or PUT content-raw. Edits to an existing large p
- `put_goals`: Create or replace all site conversion goals (≤50). Required before start_test when no goal exists.
- `put_menu_doc`: Replace the whole menu doc (ifMatch from get_menu_doc required). Each item may omit menu — the enclosing menu key in doc is used.
- `put_menu_item`: Partial upsert one menu item: provided fields overwrite; omitted html/childTemplate/childShell/attrs/data are preserved. To remove those keys, use put_menu_doc.
- `put_post`: Stage a blog post via structured meta+body (?format=post). Key e.g. blog/my-post.html. Declared membership: meta.collections; schedule: meta.visibleAt; SEO titl
- `put_route`: Create/replace route; contentKey derived from path if omitted. On a field that accepts null (contentKey, redirectTo, redirectStatus, preserveQuery), sending nul
- `reapply_custom_domain_oauth`: Re-apply DNS with stored Cloudflare OAuth grant (no browser).
- `refresh_custom_domain`: Poll one hostname until DNS/cert propagates.
- `reindex_collection`: Build/finish collection indexes after publish returns collectionDataPending or collectionSqlPending.
- `remove_custom_domain`: Remove one custom hostname from the site.
- `rename_content`: Re-key a page by slug (draft or published static). Server-side hash copy — no body round-trip. Default deletes static routes (obscure-URL); movePath:true repoin
- `rename_page`: Change a page's URL: moves its route from `from` to `to`. Menu links and other redirects that pointed at the old path retarget automatically; a 301 is left at t
- `rename_site`: Rename the site slug (public hostname {slug}.dotsy.site). Owner-only. After success: use the returned slug in every later tool. Published site: the old slug red
- `reorder_menu`: Set final menu order. Pass ifMatch from get_menu; stale → 409 with current items.
- `restore_version`: Bring an earlier published version back as unpublished changes (page content only — routes, menus, images and settings stay). version: a number from list_versio
- `revert_change`: Undo one activity event by staging the prior version as draft only — call publish_site to go live. Respects AI access.
- `search_content`: Find pages containing a phrase (grep without reading bodies). Requires do-sqlite — graduate_site first if search_unavailable.
- `set_analytics_provider`: Connect a third-party analytics provider (GA4, Plausible, Fathom, Umami) or remove it (provider 'none'). Dotsy adds the provider's script to the <head> of every
- `set_experiment_note`: Record what was learned from an ended A/B test (≤500 chars; null clears).
- `set_primary_custom_domain`: Set the canonical host (301 target) when multiple hostnames are connected.
- `share_section`: Make a block that repeats on several pages one shared section, or change where one shows. No arguments: lists blocks repeated on 3+ pages. sourceKey + selector 
- `stage_content_chunk`: Append one ≤60KB chunk of a large new page. Omit stagingId on seq 0; pass the returned stagingId on later seq. Set finalize:true on the last chunk, then apply_c
- `start_edit_session`: Open a draft session. Returns preview/edit URLs for the person (see linkGuidance). draftEditorUrl only when the site gives AI agents Full access. path defaults 
- `start_site`: Start one draft site with no Dotsy account. Returns slug + guestToken — pass guestToken on every later tool call until claim_site.
- `start_test`: Start a same-URL A/B test (draft or live source). Rules → get_skill('verify') § A/B.
- `structure_site_analyze`: Propose shared layout + fragments; persist:false first. Wait for mirror-vs-editable answer if requiredDecision pending.
- `structure_site_apply`: Rewrite flat pages to layout + fragments (draft). Do not call while requiredDecision pending — user must pick editable first. It extracts header/footer only: af
- `submit_feedback`: Optional mid-session feedback (required feedback rides with publish_site).
- `undo_publish`: Take back the last publish at once: restores the version before it for the pages that publish changed and publishes them, and the undone changes stay as unpubli
- `update_brief`: Update `_intent/site.md` (site brief) or a page brief when `page` is set. See field descriptions for rules, notes, and head enums.
- `update_collection`: Rename a collection's display name and/or noun (e.g. the generic 'posts' key shown as 'Recipes' / 'recipe') — cosmetic only, stored separately from the tag that
- `update_site`: Update site settings: title, keyConvention, or editingMode ('live' = each editor save publishes immediately; 'staged' = saves stay drafts until publish_site). S

Measured by Glimind (https://glimind.com): MCP handshake + tool list only, no tool is ever called. CC BY 4.0.
