MCP server
Dotsy Official
ai.dotsy/mcp
Checked 26 Oct 2026, 08:29 UTC · Connected to it and listed its tools
Build and publish static sites on Dotsy with draft-first MCP tools, OAuth Connect, and API keys.
Working at last checkVerified publisher: dotsy.aiAbout 42,700 tokens per request once connected101 tools
https://mcp.dotsy.ai/mcp
At a glance
- Type
- MCP server
- Publisher
- dotsy.ai (verified by the MCP Registry)
- Status
- Working at last check
- Tools
- 101
- Token cost
- About 42,700 tokens per request
- Sets up in
- Claude Code, Claude Desktop, Codex, Gemini CLI, Cursor, VS Code, Antigravity, ChatGPT, OpenAI API, Grok
- Last checked
- 26 Oct 2026, 08:29 UTC
Connect it to your agent
Opens the app, which shows the server and asks you to confirm. For other apps, copy the setup below.
Claude Code
claude mcp add --transport http dotsy https://mcp.dotsy.ai/mcp
Claude Desktop
Settings → Connectors → Add custom connector, and paste the URL.
Codex (config.toml)
[mcp_servers.dotsy] url = "https://mcp.dotsy.ai/mcp"
Gemini CLI
{"mcpServers":{"dotsy":{"httpUrl":"https://mcp.dotsy.ai/mcp"}}}
Cursor
{"mcpServers":{"dotsy":{"url":"https://mcp.dotsy.ai/mcp"}}}
VS Code
{"servers":{"dotsy":{"type":"http","url":"https://mcp.dotsy.ai/mcp"}}}
Antigravity
agy mcp add dotsy https://mcp.dotsy.ai/mcp
ChatGPT
Settings → Apps & Connectors → Advanced settings: turn on Developer mode, then Create a connector and paste the URL. Which plans can do this varies.
OpenAI API (Responses tools)
{"type":"mcp","server_label":"dotsy","server_url":"https://mcp.dotsy.ai/mcp","require_approval":"always"}
Grok (xAI API tools)
{"type":"mcp","server_label":"dotsy","server_url":"https://mcp.dotsy.ai/mcp"}
Tools
adapt_site_analyze~641 tokens
Propose nav wiring + blog collectionization for an imported mirror (draft, opt-in). Read-only; returns per-adapter reports + proposalEtag. Nav decline may include nextStep (e.g. mega-menu → edit fragments/header.html). Wait for mirror-vs-editable answer if requiredDecision pending.adapt_site_apply~471 tokens
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 second apply is refused until adapt_site_revert (or force). Queued applies are polled to completion.adapt_site_revert~244 tokens
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~309 tokens
Connect apex and/or www on a paid plan; starts a DNS connect session.apply_changeset~2046 tokens
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 delete takes { key, ifMatch } too); atomic:true makes one stale key write nothing (409 changeset_conflict). At most 10 writes; each body ≤6batch_patch_content~558 tokens
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~754 tokens
Upload 1–200 CMS assets; key = path after /assets/. Each item: exactly one of bodyBase64, bodyText (plain text for .css/.js/.mjs/.json/.svg/.txt/.xml only — not .html pages), or importFromUrl. Optional bodySha256 verifies submitted bytes before write; response sha256 is stored bytes (JS/CSS match; Wbulk_put_content~351 tokens
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_content_chunk, dotsy push, or PUT content-raw. May queue above the inline threshold.claim_site~206 tokens
Move the guest draft onto your signed-in Dotsy account. Requires OAuth Connect; pass the guestToken from start_site.create_site~493 tokens
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 renamed site.decompose_analyze~405 tokens
Deprecated — use structure_site_analyze.delete_assetDeletes data · ~318 tokens
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_contentDeletes data · ~259 tokens
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 it first.delete_draft_testDeletes data · ~240 tokens
Remove a draft A/B test (releases variant bodies; does not publish).delete_menu_itemDeletes data · ~241 tokens
Remove one item from a menu (page stays live).delete_routeDeletes data · ~217 tokens
Remove a route by path.delete_siteDeletes data · ~230 tokens
Permanently delete site; confirmSlug must equal slug.detach_section~441 tokens
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 on that page instead (share_section name + hide).discard_drafts~294 tokens
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~182 tokens
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-only checks (use preview_page).estimate_test~246 tokens
Estimate days to reach promote readiness for a page (traffic baseline). Read-only.find_replace~319 tokens
Case-insensitive find→replace across pages in one staged commit. Batch all replacements into ONE call — never parallelize find_replace on the same key (concurrent edits surface as per-key conflict). find/replace ≤60KB.get_account_context~265 tokens
Account, user, memberships[]. Pass workspace on writes when memberships.length > 1.get_activity~444 tokens
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 — no secrets.get_adapt_status~249 tokens
Read adapt state: proposal summary + proposalEtag (+ applied/consumed flag), undo-record presence, active or queued job progress. Use to resume in a fresh session.get_analytics~410 tokens
Read-only traffic overview (default) or full breakdowns via include[]; optional bot id for crawler page drill-down.get_asset~356 tokens
Read one asset (metadata + base64 + stored sha256). sha256 is the stored blob; may differ from upload bodySha256 when IMAGES re-encodes rasters. Uploaded files are live in the editor and draft preview at once; the published site picks them up at the next publish.get_collection_schema~312 tokens
Read the site's collection field definitions (`_data/collections.json`, draft view): { schema: { v: 1, collections: { "<key>": { fields[], settings? } } }, hash }. hash is null when no schema exists yet — pass it as put_collection_schema ifMatch. 409 collection_schema_invalid { hash, issues } meansget_content~282 tokens
Read one content key; optional selector (region) or published=true (live body). Bodies over 40KB without a selector return a truncated summary — use selector, batch_patch_content, or dotsy pull.get_custom_domain_connect~258 tokens
Current connect session and nextAction (browser URL or manual DNS guide).get_draft_status~239 tokens
Pending draft changes: content keys and routes with status. May include requiredDecision (publish_confirm) before publish_site.get_form_submission~260 tokens
Read one form submission with the full field payload (explicit PII access — use only when needed).get_menu~232 tokens
Read a menu's draft items and etag; menu rules → get_skill('nav').get_menu_doc~308 tokens
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_redirect — computed from the draft routes, so a link that won't show or leads nowhere shows up before publish.get_route~220 tokens
Get one route by path (home is '/').get_site~378 tokens
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 pages: true for the full array (capped at 1000), or enumerate everything with list_content/get_site_manifest. Large sites (200+ pages): list_pagget_site_build_progress~147 tokens
Read-only build progress for humans (build-theater view) during structure/adapt or after import. Agent reads structuredContent.forHumans — optional; do not call in a loop during import_site_from_url (that tool blocks until done). Prefer get_site for agent logic.get_site_manifest~297 tokens
Content keys + hashes only (optional routes=true) — static files live in list_assets, not manifest. Diff keys+hashes before apply_changeset; stage only changed bodies.get_site_outline~344 tokens
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 is missing, redirects count, menus grouped by where they show, and collections with their page placements. Use for 'is my layout missing',get_skill~206 tokens
Skill body + optional questions[]. Accepts an id OR a synonym (e.g. 'list', 'menu') — resolves aliases and suggests near-misses. Start with intake when ambiguous.get_structure_result~257 tokens
Last structure apply job result (structuredKeys, conflicts, partial).get_structure_status~235 tokens
Flat vs structured page counts; informs user — do not auto-run analyze/apply while requiredDecision pending.graduate_site~616 tokens
Enable site search & collections (kv → do-sqlite), one-way. Unlocks search_content, collection indexes, visitor /__paige/search, and moves any R2 form-submission ledger into SiteDb. 409 blocked covers three unrelated gates: an unsupported source backend (no override, ever); strictDrafts — default trimport_site_from_url~730 tokens
Import URL to draft. On complete, response may include requiredDecision — preview then ask mirror vs editable before structure_*.infer_collection_schema~335 tokens
Suggest fields for one collection from a sample of its items' meta.custom values (published data, else drafts) — writes nothing. Returns { sampled, suggestions: [{ field: { key, type, options? }, count, samples, defined }], skipped }. Review, then add the ones you want via put_collection_schema.inspect_collection~595 tokens
Collection state — count, server.mode, sample entries, tag (membershipKind, match=) when discovered; plus name, noun, URL pattern, layout, where it's listed, and post fields used. Pass status/q/cursor/limit (any one, even empty) for a full items[] page instead: status draft = never published; a publlist_assets~296 tokens
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 the editor and draft preview at once; the published site picks them up at the next publish.list_collections~285 tokens
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 page lists. Returns a bare array (not wrapped in an object) — pass each row's key verbatim to inspect_collection/update_collection.list_content~457 tokens
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 through the rest. Per-row `size`/`missing` are measured automatically only on pages of ≤100 rows; past that they're ABSENT (not measured, never `nlist_custom_domains~221 tokens
List all custom hostnames and connection status for the site.list_form_submissions~322 tokens
List form submissions (metadata + bounded field preview — not full PII). Works on kv and do-sqlite backends.list_goals~226 tokens
List site conversion goals (pageview paths and form submits). Required before start_test.list_my_sites~214 tokens
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-only checks (use preview_page). Defaults to your active workspace; pass workspace (org id or slug from get_account_context memberships) tolist_notifications~295 tokens
Account notification inbox (Needs you · Updates). Summary-first: tab counts plus compact rows with nextAction (MCP tool or dashboard URL). OAuth person only — not API keys.list_pages~505 tokens
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 left out there — nothing to open in edit_page); agent reads structuredContent. Use after picking a site — not for editing (use edit_page) orlist_skills~154 tokens
Paige build skills (id + whenToUse). Pull get_skill on demand — do not duplicate in tool text.list_versions~283 tokens
List the site's published versions, newest first (who, when, pages, live, restorable). Use before restore_version.mark_notifications_read~240 tokens
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~333 tokens
Read-only scaffold for a new post — suggested key/path, membership meta, blank or duplicate body. Then put_post (+ optional put_route).optimize_assets~476 tokens
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 — /assets/… uploads or clone paths like /wp-content/… (1–50 per call; batch keys from several entries). Skips animated images, already-smallpatch_content~504 tokens
Edit one content key via ops[] (selector ops or replace-string; wrap/unwrap/move restructure siblings). Stages draft; op shapes in schema.patch_route~1509 tokens
Partial route update (only sent fields change; an OMITTED field is left alone). On a field that accepts null (contentKey, redirectTo, redirectStatus, preserveQuery), sending null CLEARS it back to its default — different from omitting it. To set redirectTo/redirectStatus, include purpose: "redirect"preflight_site~303 tokens
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~377 tokens
Verify-only composed HTML check; home preview may include requiredDecision — ask mirror vs editable before structure_*.promote_experiment~302 tokens
Promote a winning A/B variant to live — explicit user instruction only; see get_skill('verify') § A/B.publish_siteSends messages · ~770 tokens
Publish draft to live. feedback and handoff required (use dummy feedback + one-line handoff if clean).put_collection_schema~584 tokens
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_collections returns them ("blog/" or an id). Field: { key, type, label?, help?, required?, unique?, inCard?, default? } — type text (multilput_content~347 tokens
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 page: batch_patch_content.put_goals~561 tokens
Create or replace all site conversion goals (≤50). Required before start_test when no goal exists.put_menu_doc~532 tokens
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~484 tokens
Partial upsert one menu item: provided fields overwrite; omitted html/childTemplate/childShell/attrs/data are preserved. To remove those keys, use put_menu_doc. A brand-new id dedupes by (menu, ref) — reuses an existing item linking the same target instead of creating a duplicate. An id that alreadyput_post~565 tokens
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 title override: meta.seoTitle (card always shows meta.title); custom fields: meta.custom (typed per collection by get_collection_schema; the resput_route~1413 tokens
Create/replace route; contentKey derived from path if omitted. On a field that accepts null (contentKey, redirectTo, redirectStatus, preserveQuery), sending null clears it back to its default.reapply_custom_domain_oauth~223 tokens
Re-apply DNS with stored Cloudflare OAuth grant (no browser).refresh_custom_domain~246 tokens
Poll one hostname until DNS/cert propagates.reindex_collection~232 tokens
Build/finish collection indexes after publish returns collectionDataPending or collectionSqlPending.remove_custom_domain~239 tokens
Remove one custom hostname from the site.rename_content~568 tokens
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 repoints the route, rewrites menu refs and other redirects aimed at the old path, and — only for an already-PUBLISHED page — leaves a 301 there torename_page~558 tokens
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 the old path by default (leaveRedirect). Retry-safe (resend the same call after any error). Errors: 404 route_not_found (from isn't a route);rename_site~394 tokens
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 redirects on the API (301 for reads, 308 for writes) while it stays reserved; the old host 301s and stays reserved until delete or rename-back.reorder_menu~273 tokens
Set final menu order. Pass ifMatch from get_menu; stale → 409 with current items.restore_version~550 tokens
Bring an earlier published version back as unpublished changes (page content only — routes, menus, images and settings stay). version: a number from list_versions, or "previous". dryRun: show what would change. Then review and publish_site, or discard_drafts to undo; publish:true makes it live at onrevert_change~338 tokens
Undo one activity event by staging the prior version as draft only — call publish_site to go live. Respects AI access.search_content~260 tokens
Find pages containing a phrase (grep without reading bodies). Requires do-sqlite — graduate_site first if search_unavailable.set_analytics_provider~497 tokens
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 live page — live immediately, no publish needed. Replaces any earlier provider (one per site). Use this instead of pasting a GA4 gtag snippset_experiment_note~290 tokens
Record what was learned from an ended A/B test (≤500 chars; null clears).set_primary_custom_domain~254 tokens
Set the canonical host (301 target) when multiple hostnames are connected.share_section~1146 tokens
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 (or selectors: a sibling run, one wrapper): a dry run finds every page with it; dryRun:false shares it. name + scope/hide/show: move an exisstage_content_chunk~324 tokens
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_changeset with writes[].bodyStaging.start_edit_session~258 tokens
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 to '/'.start_site~189 tokens
Start one draft site with no Dotsy account. Returns slug + guestToken — pass guestToken on every later tool call until claim_site.start_test~466 tokens
Start a same-URL A/B test (draft or live source). Rules → get_skill('verify') § A/B.structure_site_analyze~429 tokens
Propose shared layout + fragments; persist:false first. Wait for mirror-vs-editable answer if requiredDecision pending.structure_site_apply~536 tokens
Rewrite flat pages to layout + fragments (draft). Do not call while requiredDecision pending — user must pick editable first. It extracts header/footer only: afterwards share_section with no arguments lists the other repeated blocks (banner, CTA).submit_feedback~461 tokens
Optional mid-session feedback (required feedback rides with publish_site).undo_publishSends messages · ~398 tokens
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 unpublished changes (`restaged`). On a live-mode site nothing is kept (its next save would publish it again): the answer has `redo.version` — restoupdate_brief~1401 tokens
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~450 tokens
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 defines membership; doesn't need publish. Provide at least one of name/noun. null (or "") resets that field back to its derived default — dupdate_site~940 tokens
Update site settings: title, keyConvention, or editingMode ('live' = each editor save publishes immediately; 'staged' = saves stay drafts until publish_site). Slug is the hostname — change it with rename_site, not this tool. Set 'staged' before handing the editor to a person via start_edit_session'sverify_page~459 tokens
Pre-publish lint (tags, assets, layout, SEO, speed and accessibility). Summary first: health issues grouped by code, each with fix:{tool,args,fill?} — supply the fill args, then call. health.summary counts are whole-site (groups/codes filter only issues and assets). Pair with preview_page — see get_wait_for_custom_domain~323 tokens
Poll one hostname until it is connected or the timeout is reached.
Browse
Related MCP servers
- Sitectrl
Your AI builds real hosted websites: describe it, get a live site with SSL, forms, analytics. Free. - Layero
Deploy and operate sites on Layero — hosting with build servers in Russia: domains, env, Data API. - Gemmein
Gemmein docs, API reference, error explainers and a live integration check for coding agents. - VibeDeploy
Deploy AI-built sites and apps to EU hosting from your AI agent. OAuth sign-in, 14-day free trial. - aft.page
Deploy a folder, build output, or public GitHub repo to a live URL. Update, roll back. - AIfra — temporary static previews
48-hour HTTPS previews of prebuilt static sites and HTML slides. No server builds or backends. - ce-net
Connect your AI to your own devices, 3D printers, factory tools and a shared agent task pool. - prxhub
Search, cite, download, and publish .prx research bundles on prxhub.com.
Badge for your README
[](https://aptlynx.net/servers/ai.dotsy/mcp)
Listing text is written by the maker; AptLynx lists tools and does not vouch for them. Find another tool · Browse by topic · For agents