Skip to content

Dotsy MCP server

Which servers in the official MCP registry are Dotsy's own, whether they answer, and what they offer. A program checked each of these, nobody copied them from a product page.

read 2026-10-23

← Back to Dotsy

Whose server it is
  • Registry nameai.dotsy/mcpverified in the MCP registry

The registry name sits under dotsy.ai. The registry only lets a publisher use that namespace after proving control of the domain through DNS or HTTP.

When we asked itchecked 2026-10-23
  • Stateanswerschecked 2026-10-23
  • Tools98
  • Server calls itselfpaige
  • Server version0.3.0
  • Protocol version2025-06-18

On 2026-10-23 the server answered initialize and tools/list without a sign-in. First answer in 532 ms.

Should an agent connect itNot proven either way yet
  • Whether its tools do the product's job has not been judged yet.
  • Checked on 2 of the 7 days it takes to judge reliability.

Once connected

  • create_site, update_brief, set_analytics_provider, update_site, publish_site change data without a sign-in: anyone with the address can call them.
  • Its definitions take about 36299 tokens of context: enable only the tools a task needs.
  • Parameters are untyped or undescribed in 43 of 98 tools: check arguments before calling.

Said by rules from the measurements above. The likely first call is a model's pick from the tool list; read its description before relying on it.

Measured dailydaily checks: 2, the first on 2026-10-23
  • INITE MCP scoreafter a weeka score needs 7 daily checks: 2 so far
  • Answeredmeasuring2 of the 7 daily checks it takes to print a share
  • Median first answer773 ms
  • Space in an agent's context≈ 36,299 tokensthe definitions of all its tools (98), which an agent carries on every turn
  • Tool definitionsA · 93 of 100
  • Typed results0 of 98 toolsdeclared outputSchema: results come typed, read once
  • Parameters without a type: in 1 of 98
  • Parameters without a description: in 43 of 98

Worth a look

  • Tools that change data, on a server that answers without a sign-in: create_site, update_brief, set_analytics_provider, update_site, publish_site

A program checks the server once a day: initialize and tools/list, no model. Tokens are the definitions' length at about four characters a token. The grade averages six checks of every tool's name, description, schema and annotations; it says how well the tools are described, not whether they work. The score weighs what was measured and nothing else: answering (30%), doing the product's job (25%), definitions (20%), context (10%) and use (15%). A part that was not measured is left out, and a hidden instruction caps the score at 40. The state of vendors' MCP servers: method and numbers →

Tools it offers98 tools · read 2026-10-23
  • 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 renamed site.

  • 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 pages: true for the full array (capped at 1000), or enumerate everything with…

  • 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.

  • get_analytics

    Read-only traffic overview (default) or full breakdowns via include[]; optional bot id for crawler page drill-down.

  • 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 live page — live immediately, no publish needed. Replaces any earlier…

  • update_site

    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'…

  • 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 redirects on the API (301 for reads, 308 for writes) while it stays reserved; the…

  • publish_site

    Publish draft to live. feedback and handoff required (use dummy feedback + one-line handoff if clean).

  • get_draft_status

    Pending draft changes: content keys and routes with status. May include requiredDecision (publish_confirm) before publish_site.

  • 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.

  • delete_site

    Permanently delete site; confirmSlug must equal slug.

  • 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_content_chunk, dotsy push, or PUT content-raw. May queue above the inline threshold.

  • 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 bodies.

  • 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 (concurrent edits surface as per-key conflict). find/replace ≤60KB.

  • search_content

    Find pages containing a phrase (grep without reading bodies). Requires do-sqlite — graduate_site first if search_unavailable.

  • graduate_site

    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…

  • 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 delete takes { key, ifMatch } too); atomic:true makes one stale key write…

  • import_site_from_url

    Import URL to draft. On complete, response may include requiredDecision — preview then ask mirror vs editable before structure_*.

  • get_structure_status

    Flat vs structured page counts; informs user — do not auto-run analyze/apply while requiredDecision pending.

  • structure_site_analyze

    Propose shared layout + fragments; persist:false first. Wait for mirror-vs-editable answer if requiredDecision pending.

  • decompose_analyze

    Deprecated — use structure_site_analyze.

  • 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: afterwards share_section with no arguments lists the other repeated blocks…

  • get_structure_result

    Last structure apply job result (structuredKeys, conflicts, partial).

  • 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 include nextStep (e.g. mega-menu → edit fragments/header.html). Wait for…

  • 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 second apply is refused until adapt_site_revert (or force). Queued applies are…

  • 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).

  • 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 session.

  • 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 through the rest. Per-row `size`/`missing` are measured automatically only on pages…

  • 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, batch_patch_content, or dotsy pull.

  • 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 page: batch_patch_content.

  • 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_changeset with writes[].bodyStaging.

  • patch_content

    Edit one content key via ops[] (selector ops or replace-string; wrap/unwrap/move restructure siblings). Stages draft; op shapes in schema.

  • 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.

  • 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 it first.

  • 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 repoints the route, rewrites menu refs and other redirects aimed at the old path…

  • 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 title override: meta.seoTitle (card always shows meta.title); custom fields…

  • inspect_collection

    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…

  • 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 page lists. Returns a bare array (not wrapped in an object) — pass each row's key…

  • 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 defines membership; doesn't need publish. Provide at least one of name/noun…

  • 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).

  • get_collection_schema

    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…

  • 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_collections returns them ("blog/" or an id). Field: { key, type, label?…

  • 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: [{ field: { key, type, options? }, count, samples, defined }], skipped }…

  • reindex_collection

    Build/finish collection indexes after publish returns collectionDataPending or collectionSqlPending.

  • preview_page

    Verify-only composed HTML check; home preview may include requiredDecision — ask mirror vs editable before structure_*.

  • verify_page

    Pre-publish lint (tags, assets, layout). Pair with preview_page — see get_skill('verify').

  • 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.

  • 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 to '/'.

  • 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 is missing, redirects count, menus grouped by where they show, and…

  • 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 (or selectors: a sibling run, one wrapper): a dry run finds every page with…

  • 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 on that page instead (share_section name + hide).

  • get_route

    Get one route by path (home is '/').

  • put_route

    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.

  • patch_route

    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…

  • 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 the old path by default (leaveRedirect). Retry-safe (resend the same call after…

  • delete_route

    Remove a route by path.

  • list_goals

    List site conversion goals (pageview paths and form submits). Required before start_test.

  • put_goals

    Create or replace all site conversion goals (≤50). Required before start_test when no goal exists.

  • estimate_test

    Estimate days to reach promote readiness for a page (traffic baseline). Read-only.

  • start_test

    Start a same-URL A/B test (draft or live source). Rules → get_skill('verify') § A/B.

The first 60 of 98, as the server listed them.

How to connect

Add the server to your MCP client config. Claude Desktop, Cursor and most other clients read this shape:

{
  "mcpServers": {
    "dotsy": {
      "type": "http",
      "url": "https://mcp.dotsy.ai/mcp"
    }
  }
}

Add it

Claude Code, in a terminal

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

Add to CursorAdd to VS Code

claude.ai, ChatGPT and other clients: add https://mcp.dotsy.ai/mcp as a custom connector in the settings.

OpenAPI spec

87 paths, read 2026-10-23. Open the spec ↗

Each line is something a program found when it went looking: the registry entry, the server's own answer, a spec that parses. A missing line means we did not find it, not that it does not exist.