Dotsy
by dotsy.ai · ai.dotsy/mcp
Build and publish static sites on Dotsy with draft-first MCP tools, OAuth Connect, and API keys.
- Category
- Developer tools
- Connection
- Remote (HTTP)
- Tools
- 60 reported
- Status
- Online
Connect it to your AI
Claude Code
claude mcp add --transport http dotsy https://mcp.dotsy.ai/mcpClaude, ChatGPT, Cursor and other apps
Add it as a custom connector with this URL (Streamable HTTP):
https://mcp.dotsy.ai/mcpCursor, VS Code and other apps (mcp.json)
{
"mcpServers": {
"dotsy": {
"url": "https://mcp.dotsy.ai/mcp"
}
}
}Tools it offers
60 tools, as the server itself reported during our check on Oct 31, 2026.
create_siteCreate 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.get_siteSite 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 evupdate_briefUpdate `_intent/site.md` (site brief) or a page brief when `page` is set. See field descriptions for rules, notes, and head enums.get_planRead-only workspace plan and pooled usage; pass slug for this site's add-ons. Call before a large build.get_analyticsRead-only traffic overview (default) or full breakdowns via include[]; optional bot id for crawler page drill-down.set_analytics_providerConnect 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 aget_custom_codeRead the site-wide custom code: `draft` (what the next publish puts live) and `published` (what visitors get now) for both boxes — head (before </head>) and body (before </body>) — plus `pending`, `runOn` and `maxChars`.set_custom_codeSet site-wide custom code: `head` goes before </head> and `body` before </body> on every page, on every layout. It is saved as a draft and goes live with the next publish_site (on a live-mode site the dashboard publishesupdate_siteUpdate 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 trename_siteRename 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 spublish_sitePublish draft to live. feedback and handoff required (use dummy feedback + one-line handoff if clean).get_draft_statusPending draft changes: content keys and routes with status. May include requiredDecision (publish_confirm) before publish_site.review_changesReview queue: what changed and isn't live yet. list (counts first) → get one item (hidden changes, optional diff, bodyChanged: false means only title/meta/route fields changed — review hidden, not the visible page) → mardiscard_draftsDiscard unpublished drafts: all (omit key/keys/routes/menus), one content key (key), menu draft only (menus:true), or a selection (keys, routes). Destructive — check get_draft_status first.delete_sitePermanently delete site; confirmSlug must equal slug.bulk_put_contentStage 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 thget_site_manifestContent keys + hashes only (optional routes=true) — static files live in list_assets, not manifest. Diff keys+hashes before apply_changeset; stage only changed bodies.find_replaceCase-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.search_contentFind pages containing a phrase (grep without reading bodies). Requires do-sqlite — graduate_site first if search_unavailable.graduate_siteEnable 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 gatapply_changesetStage 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 simport_site_from_urlImport URL to draft. On complete, response may include requiredDecision — preview then ask mirror vs editable before structure_*.get_structure_statusFlat vs structured page counts; informs user — do not auto-run analyze/apply while requiredDecision pending.structure_site_analyzePropose shared layout + fragments; persist:false first. Wait for mirror-vs-editable answer if requiredDecision pending.decompose_analyzeDeprecated — use structure_site_analyze.structure_site_applyRewrite 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 repget_structure_resultLast structure apply job result (structuredKeys, conflicts, partial).adapt_site_analyzePropose 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). Wadapt_site_applyApply 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). Quadapt_site_revertAtomically restore everything the last adapt_site_apply wrote (fragments, the menu doc when the op touched it, index, member configs, routes).get_adapt_statusRead adapt state: proposal summary + proposalEtag (+ applied/consumed flag), undo-record presence, active or queued job progress. Use to resume in a fresh session.list_contentList 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 automaticaget_contentRead 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.put_contentStage 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.stage_content_chunkAppend 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.patch_contentEdit one content key via ops[] (selector ops or replace-string; wrap/unwrap/move restructure siblings). Stages draft; op shapes in schema.batch_patch_contentpatch_content on multiple keys; all-or-nothing validation. Preferred edit path for pages over 60KB. replace-string value/replace ≤60KB; whole call ≤80KB.delete_contentDelete 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.rename_contentRe-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 aput_postStage 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); cu
Questions
What is the Dotsy MCP server?
Build and publish static sites on Dotsy with draft-first MCP tools, OAuth Connect, and API keys. It is made by dotsy.ai and listed in the official MCP Registry as ai.dotsy/mcp. MCP (Model Context Protocol) is the open standard that lets AI apps like Claude, ChatGPT and Cursor use outside tools.
How do I add Dotsy to Claude?
In the Claude app or claude.ai, open Settings, then Connectors, choose "Add custom connector" and paste https://mcp.dotsy.ai/mcp. In Claude Code, run: claude mcp add --transport http dotsy https://mcp.dotsy.ai/mcp
How do I add Dotsy to ChatGPT?
ChatGPT can use remote MCP servers as connectors. In ChatGPT settings, under Apps and Connectors, turn on developer mode if asked, create a new connector and paste https://mcp.dotsy.ai/mcp.
How do I add Dotsy to Cursor?
Open Cursor settings, go to MCP, choose "Add new MCP server" (or edit ~/.cursor/mcp.json) and add: { "mcpServers": { "dotsy": { "url": "https://mcp.dotsy.ai/mcp" } } }
Does Dotsy work right now?
Yes. It responded when we last checked on 31 Oct 2026. We check remote MCP servers every day.
What can Dotsy do?
It gives your AI 60 tools, including create_site, get_site, update_brief, get_plan, get_analytics. The full list is on this page.
Is this your server? Get the badge for your README
Markdown (GitHub README)
[](https://chen.media/mcp/ai-dotsy-mcp)HTML (switches to dark mode on its own)
<a href="https://chen.media/mcp/ai-dotsy-mcp"><picture><source media="(prefers-color-scheme: dark)" srcset="https://chen.media/mcp/badge/ai-dotsy-mcp.svg?theme=dark"><img src="https://chen.media/mcp/badge/ai-dotsy-mcp.svg" alt="Listed on chen.media/mcp" height="40"></picture></a>More in Developer tools
See allAlgolia ProductivityVerified maker
@algoliaConnect LLM tools to your Algolia account with user-scoped access for internal workflows.
GitHubVerified maker
@githubConnect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP devkit serverVerified maker
@mapboxProvides AI assistants with direct access to Mapbox developer APIs and documentation.
GitLabVerified maker
gitlab.comOfficial GitLab MCP Server
Perplexity API PlatformVerified maker
perplexity.aiReal-time web search, reasoning, and research through Perplexity's API
Valuein — SEC EDGAR Fundamentals & Smart-Money Data
@valueinPoint-in-time, survivorship-free SEC EDGAR fundamentals + smart-money signals for AI agents.