Skip to content

MCP servers › ai.dotsy › mcp

MCP server · registry snapshot 2026-10-23 · last tested 2026-10-23

ai.dotsy/mcp

Build and publish static sites on Dotsy with draft-first MCP tools, OAuth Connect, and API keys. — the publisher's description

1 of 2 record checks metRead-only · tools listed 2026-10-23Topic: developer-tools · AI-classifiedversion 0.5.1streamable HTTP98 tools

Summary

ai.dotsy/mcp is a remote MCP server listed in the official MCP registry at version 0.5.1. On 2026-10-23 ProtocolProbe connected to it in read-only mode and read its inventory: 98 tools, 8 resources and 0 prompts.

Record checks

1 of 2 record checks met · 7 do not apply

  • met: Registry entry is active and says how to run it
  • not met: Source repository link opens
  • not applicable: Repository is not archived
  • not applicable: Code pushed to the repository in the 90 days before our check
  • not applicable: Repository publishes a security policy (SECURITY.md)
  • not applicable: Package names its licence with a standard (SPDX) identifier
  • not applicable: The version the registry lists can be installed and is not withdrawn
  • not applicable: npm package carries build provenance (attestation)
  • not applicable: No known critical or high advisory in the package or its dependencies
  • Not ranked by downloads: a remote server publishes no download figure
  • Not ranked by stars: no public GitHub repository

From public records, not a safety rating. Each check with its reason · Is it safe to install?

Key facts

Runs
remote (hosted by the publisher)
Transport
streamable HTTP
Sign-in
none needed to open a session
Tools
98
Described as changing data
57 of 98 toolsAI-classified
Mainly works on
files and code on the machine it runs onAI-classified
Topic
developer-toolsAI-classified
Last tested
2026-10-23

Add to your client

Observed fact

This server accepted a session without any credential and lists 42 tools whose name or declaration suggests they change data (create_site, update_brief, set_analytics_provider, update_site, rename_site and 37 more). That is our reading of the names; we did not call them. Source: our connection, 2026-10-23.

Worth knowing before you connect it

  • 57 tools are described as changing something (create_site, update_brief, set_analytics_provider, …): our AI model's reading of the descriptions, not something we tested, and the server opened a session without any credential. We did not call them.

Each line comes from a section below, with its source and date.

How fresh this is

Live-tested
yes, a real session (not a text-only review)
Last tested
2026-10-23
Mode
read-only (no tool calls)
Latest version
0.5.1, published 2026-10-22 (registry, as of the 2026-10-23 snapshot)
First listed version
2026-10-06 (earliest version still in the registry; older removed versions would be earlier)
Version history
5 versions listed, 2026-10-06 to 2026-10-22; 5 in the 90 days before the 2026-10-23 snapshot.
Most recent 5 versions
  • 0.5.1 · 2026-10-22
  • 0.5.0 · 2026-10-21
  • 0.4.1 · 2026-10-12
  • 0.4.0 · 2026-10-10
  • 0.3.0 · 2026-10-06
(versions still listed in the registry only)
Registry data
snapshot 2026-10-23
Package and repository
checked 2026-10-23
Engine
mcp-runtime-engine@0.1.0 · sdk@1.32.0

Changes since the last refresh

New in the registry: not in the list of 2026-10-04, listed on 2026-10-23 with version 0.5.1 (published 2026-10-22).

Source: the official MCP Registry list on 2026-10-04 and on 2026-10-23.

What it is

What does this server offer?

Observed inventory
98tools
8resources
0prompts

What it mainly works on, as our AI model read its tool descriptions: files and code on the machine it runs on.

57 of 98 tools are described as changing something (creating, editing, deleting, sending or running). For 1 the reading was uncertain, so no mark is shown.

  • create_siteon 15 other serverscreates or changes datadescribed as changing data

    “Create empty site; seeds brief.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    9 inputs, 2 required
    • slugstringrequired
    • titlestring
    • keyConventionstring
    • purposestring
    • onSlugTakenstring
    • editingModestring“How the editor's Save behaves.”
    • workspacestring or null“Workspace org id or slug (see get_account_context memberships).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_siteon 22 other serversreads or searches

    “Site detail, stats, publicUrl, brief head (default-on), and readiness flags.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    5 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • briefboolean“Include parsed brief head (default true).”
    • pagesboolean“Return the full pages[] array instead of the default ~25-entry head (server-capped at 1000 either way).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • update_briefon 7 other serverscreates or changes datadescribed as changing data

    “Update `_intent/site.md` (site brief) or a page brief when `page` is set.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    11 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • pagestring“Content key — targets that page's brief (`_intent/pages/<key>.md`).”
    • head“Head fields to merge.”
    • bodystring“Replace narrative body (site ≤50k chars; page ≤10k).”
    • goalstring“Current goal (site ≤4k chars; page ≤2k).”
    • notesstring or object“Site: free-form ## Notes string (≤4k) OR per-section notes object for Design system / Content & CMS / SEO (null clears one).”
    • rulesarray“Rules & guidelines lines to add or change (upsert by id — send only fields you change; omitted fields keep their stored value; check: null turns a Rule into a …”
    • removeRulesarray“Ids of rules or guidelines to remove (site brief only).”
    • appendHandoffstring“Append a hand-off log line — site brief only; ignored when page is set.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_analyticson 32 other serversreads or searches

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

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    6 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • rangestring“Time window; default 30d.”
    • includearray“Full breakdown sections to add under `detail`: pages, sources, countries, devices, browsers, os, utm, goals, series, crawlers, experiments, events — or 'all'.”
    • botstring“Crawler bot id (e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • set_analytics_providercreates or changes datadescribed as changing data

    “Connect a third-party analytics provider (GA4, Plausible, Fathom, Umami) or remove it (provider 'none').”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    9 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • providerstringrequired
    • measurementIdstring“GA4 only: measurement ID, e.g.”
    • domainstring“Plausible only: the site domain registered in Plausible, e.g.”
    • siteIdstring“Fathom only: site ID (uppercase letters/digits).”
    • websiteIdstring“Umami only: website ID (UUID).”
    • hoststring“Umami only: https origin of the Umami instance, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • update_siteon 7 other serverscreates or changes datadescribed as changing data

    “Update site settings: title, keyConvention, or editingMode ('live' = each editor save publishes immediately; 'staged' = saves stay drafts until publish_site).”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    9 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • titlestring
    • keyConventionstring
    • editingModestring“How the editor's Save behaves.”
    • signatureobject“"Made with Dotsy" signature badge.”
    • trailingSlashstring“Page URL form.”
    • ownSeoFilesboolean“Use the site's own robots.txt and sitemap.xml even when they can hurt search: a robots.txt that blocks the whole site (Disallow: /), and a static sitemap.xml, …”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • rename_sitecreates or changes datadescribed as changing data

    “Rename the site slug (public hostname {slug}.dotsy.site).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • newSlugstringrequired“New site slug (lowercase hostname stem)”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • publish_siteon 10 other serverscreates or changes datadescribed as changing data

    “Publish draft to live.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    8 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • feedbackobjectrequired“Required.”
    • handoffstringrequired“One sentence: decisions, preferences, or open threads for the next session (appended to the brief).”
    • confirmedDraftFingerprintstring“Required when get_draft_status returned requiredDecision (publish_confirm).”
    • acknowledgeSeoWarningsboolean“Required when brief.priorities.seo is must and verify_page reported SEO errors (not warnings).”
    • pagesarray“Publish only these pages — use when a publish returns rules_not_fully_checked; publish the rest in further batches (≤50 route paths, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_draft_statuson 5 other serversreads or searches

    “Pending draft changes: content keys and routes with status.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • discard_draftsdeletesdescribed as changing data

    “Discard unpublished drafts: all (omit key/keys/routes), one content key (key), or a selection (keys, routes).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    6 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • keystring
    • keysarray
    • routesarray
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • delete_siteon 16 other serversdeletesdescribed as changing data

    “Permanently delete site; confirmSlug must equal slug.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • confirmSlugstringrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • bulk_put_contentcreates or changes datadescribed as changing data

    “Stage many content keys (pages, layouts, fragments).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    5 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • titlestring
    • contentarrayrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
Show 86 more tools
  • get_site_manifestreads or searches

    “Content keys + hashes only (optional routes=true) — static files live in list_assets, not manifest.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    7 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • modestring
    • routesboolean
    • limitinteger
    • cursorstring
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • find_replaceon 2 other serverscreates or changes datadescribed as changing data

    “Case-insensitive find→replace across pages in one staged commit.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    7 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • findstringrequired
    • replacestringrequired
    • keysarray
    • expectPerKeyinteger
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • search_contenton 49 other serversreads or searches

    “Find pages containing a phrase (grep without reading bodies).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    5 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • qstringrequired
    • limitinteger
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • graduate_sitecreates or changes datadescribed as changing data

    “Enable site search & collections (kv → do-sqlite), one-way.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    5 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • strictDraftsboolean“Block on unpublished drafts or unrecovered KV content rows (default true — publish/discard first, or pass false to proceed anyway).”
    • forceboolean“Proceed past the incomplete-KV-snapshot 409 only — not the unsupported-backend or strictDrafts blocks, which force does nothing for.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • apply_changesetcreates or changes datadescribed as changing data

    “Stage writes[] + deletes[] in one call; attach routes via writes[].route.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    7 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • writesarray
    • deletesarray“Keys to delete: a key, or { key, ifMatch } (the hash you read) so a page changed since is not deleted (listed in conflicts).”
    • messagestring
    • atomicboolean“All or nothing: every writes[].ifMatch and deletes[].ifMatch is checked before anything is written.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • import_site_from_urlcreates or changes datadescribed as changing data

    “Import URL to draft.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world yes

    10 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • sourceUrlstringrequired
    • modestring“Default auto — per-page mirror with silent render escalation”
    • pagesarray“Explicit page list; omit to import sourceUrl as index.html”
    • segmentsarray“Split-origin segments — each expands into pages by fetching its own `sitemap`.”
    • keyConventionstring“Content key shape: directory = Astro dist (about/index.html); default flat”
    • onSlugTakenstring
    • workspacestring or null“Workspace org id or slug (see get_account_context memberships).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_structure_statusreads or searches

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

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • structure_site_analyzecreates or changes datadescribed as changing data

    “Propose shared layout + fragments; persist:false first.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    9 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • sampleLimitinteger
    • profileIdstring
    • scopestring“Default flat-only; analyze clusters flat keys only.”
    • persistboolean“First call: false (preview only).”
    • refreshManifestboolean“Replace persisted manifest when true.”
    • fullboolean“Return the full manifest incl.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • decompose_analyzecreates or changes datadescribed as changing data

    “Deprecated — use structure_site_analyze.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    9 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • sampleLimitinteger
    • profileIdstring
    • scopestring“Default flat-only; analyze clusters flat keys only.”
    • persistboolean“First call: false (preview only).”
    • refreshManifestboolean“Replace persisted manifest when true.”
    • fullboolean“Return the full manifest incl.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • structure_site_applycreates or changes datadescribed as changing data

    “Rewrite flat pages to layout + fragments (draft).”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    9 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • ifMatchstringrequired“Manifest etag from structure_site_analyze or get_structure_status.”
    • modestring“Default apply.”
    • scopestring
    • keysarray“Required when scope is keys.”
    • restructureboolean“Required true when scope all and site has structured pages.”
    • overridesobject
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_structure_resultreads or searches

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

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • fullboolean“Return the full manifest/detail (default: compacted for the token budget).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • adapt_site_analyzereads or searches

    “Propose nav wiring + blog collectionization for an imported mirror (draft, opt-in).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    7 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • fullboolean“Return the full per-member harvest report (default: compacted for the token budget).”
    • adaptersarray“Which adapters to analyze (default: both).”
    • optionsobject
    • refreshProposalboolean“Replace an existing UNCONSUMED proposal (otherwise re-analyze 409s proposal_exists).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • adapt_site_applycreates or changes datadescribed as changing data

    “Apply the adapt proposal (draft): wire nav into the menu store and/or rewrite the blog index to a live <dotsy-collection>.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    7 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • ifMatchstringrequired“The proposal etag from analyze (or GET …/adapt/proposal / status).”
    • adaptersarrayrequired“Which analyzed adapters to apply.”
    • dryRunboolean“Full computation, would-write set + previews, ZERO writes, no undo.”
    • forcestring“An undo record from a prior apply exists (409 adapt_undo_exists): defer-discard it — the prior record is dropped only when this apply SUCCEEDS; a partial-failu…”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • adapt_site_revertdeletesdescribed as changing data

    “Atomically restore everything the last adapt_site_apply wrote (fragments, the menu doc when the op touched it, index, member configs, routes).”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_adapt_statusreads or searches

    “Read adapt state: proposal summary + proposalEtag (+ applied/consumed flag), undo-record presence, active or queued job progress.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • list_contenton 9 other serversreads or searches

    “List content keys (HTML/md); not assets — use list_assets.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    6 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • limitinteger“Keys per page (default 50, max 1000).”
    • cursorstring“Resume from a prior response's nextCursor.”
    • withSizeboolean“Force size/missing measurement on a page bigger than 100 rows (costs one storage read per returned row).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_contenton 11 other serversreads or searches

    “Read one content key; optional selector (region) or published=true (live body).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    6 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired
    • selectorstring
    • publishedboolean
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • put_contentcreates or changes datadescribed as changing data

    “Stage one content key.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    6 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired“Content key: a page (about.html, blog/post.html), a layout (layouts/<name>.html) or a fragment (fragments/<name>.html).”
    • bodystringrequired
    • contentTypestring
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • stage_content_chunkcreates or changes datadescribed as changing data

    “Append one ≤60KB chunk of a large new page.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    8 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • stagingIdstring
    • seqintegerrequired
    • bodystringrequired
    • contentTypestring
    • finalizeboolean
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • patch_contentcreates or changes datadescribed as changing data

    “Edit one content key via ops[] (selector ops or replace-string; wrap/unwrap/move restructure siblings).”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    5 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired
    • opsarrayrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • batch_patch_contentcreates or changes datadescribed as changing data

    “patch_content on multiple keys; all-or-nothing validation.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • itemsarrayrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • delete_contenton 2 other serversdeletesdescribed as changing data

    “Delete content key (tombstone if published).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • rename_contenton 1 other servercreates or changes datadescribed as changing data

    “Re-key a page by slug (draft or published static).”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    7 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired“Current content key, e.g.”
    • newSlugstringrequired“New filename stem; directory prefix preserved (blog/foo → blog/bar)”
    • movePathboolean“false (default): delete routes bound to old key.”
    • leaveRedirectboolean“With movePath:true on an already-published page, leave a 301 at the old path (default true).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • put_postcreates or changes datadescribed as changing data

    “Stage a blog post via structured meta+body (?format=post).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    7 inputs, 5 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired
    • metaobjectrequired
    • bodystringrequired
    • headarray
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • inspect_collectionreads or searches

    “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.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    8 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • prefixstringrequired“Collection id or prefix, e.g.”
    • statusstring“Filter items[] by status (see the tool description for what each means).”
    • qstring“Case-insensitive title search within items[].”
    • cursorstring“Resume from a prior response's nextCursor.”
    • limitinteger“Items per page (default 50, max 200).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • list_collectionson 59 other serversreads or searches

    “Collections on the site — name, noun, item count (or 'not published yet'), URL pattern, and whether any member is staged.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • update_collectionon 6 other serverscreates or changes datadescribed as changing data

    “Rename a collection's display name and/or noun (e.g.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    6 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired“Collection key exactly as list_collections returned it, e.g.”
    • namestring or null“Display name (≤80 chars).”
    • nounstring or null“Singular noun for one item, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • new_post_templatereads or searches

    “Read-only scaffold for a new post — suggested key/path, membership meta, blank or duplicate body.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    6 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • collectionstringrequired“Collection id or prefix, e.g.”
    • templateKeystring“Exemplar content key; default = most recent member”
    • modestring“blank (default) or duplicate full body”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_collection_schemaon 2 other serversreads or searches

    “Read the site's collection field definitions (`_data/collections.json`, draft view): { schema: { v: 1, collections: { "<key>": { fields[], settings?”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • put_collection_schemacreates or changes datadescribed as changing data

    “Replace the whole field schema (draft; publish makes it live).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    5 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • schemaobjectrequired“Whole schema file: { "v": 1, "collections": { "<key>": { "fields": [...], "settings"?: {...} } } }.”
    • ifMatchstring or null“hash from get_collection_schema (stale → 409 conflict).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • infer_collection_schemareads or searches

    “Suggest fields for one collection from a sample of its items' meta.custom values (published data, else drafts) — writes nothing.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • collectionstringrequired“Collection key exactly as list_collections returned it, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • reindex_collectiondescribed as changing data

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

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • preview_pageon 3 other serversreads or searches

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

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    8 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • pathstring
    • selectorstring“Return matched elements only (tag/attrs/text).”
    • containsarray“Assert substrings present in composed HTML.”
    • notContainsarray“Assert absent — e.g.”
    • variantstring“A/B variant arm to compose (e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • verify_pageon 1 other serverreads or searches

    “Pre-publish lint (tags, assets, layout).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • pathsarray“Routes to check; omit to verify every route on the site.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • preflight_sitereads or searches

    “Plan check before publish or large build (counts, route soft limit, seo suggestions).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    5 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • requiredRoutesinteger“How many routes you plan to add”
    • requiredAssetsinteger“How many assets you plan to upload”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • start_edit_sessiondescribed as changing data

    “Open a draft session.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    4 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • pathstring
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_site_outlinereads or searches

    “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 gro…”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • share_sectioncreates or changes datadescribed as changing data

    “Make a block that repeats on several pages one shared section, or change where one shows.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    16 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • sourceKeystring“Content key of the page the element is on, e.g.”
    • selectorstring“CSS selector of the element in the page's stored HTML (the editor's selector, or one checked with get_content?selector=).”
    • ifMatchstring“The page's content hash (analyze's sourceEtag).”
    • namestring“With sourceKey + selector: the new section's name (default: proposed).”
    • scopestring“where_found: each page that has it gets a reference.”
    • keysarray“Pages with an exact copy to share it on (analyze's matches.keys).”
    • similararray“Pages with a similar copy (analyze's similar.keys) that take the shared version, losing their own wording.”
    • hidearray“every_page: pages that should not show it (they keep their own copy).”
    • showarray“Pages that should show it again (removes their marker).”
    • dryRunboolean“Default true: report what would change and write nothing.”
    • selectorsarray“Instead of selector: a run of elements next to each other in one parent, in page order (each matches one element).”
    • wrapTagstring“With selectors: the wrapper.”
    • keepLayoutboolean“With selectors: wrapper gets style="display:contents" so a flex/grid parent lays the run out as before.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • detach_sectioncreates or changes datadescribed as changing data

    “Give one page its own copy of a shared section; every other page keeps the shared one.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    7 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • namestringrequired“Section name.”
    • pageKeystringrequired“Content key of the page that gets its own copy, e.g.”
    • ifMatchstring“The page's content hash.”
    • dryRunboolean“Default true: report what would change and write nothing.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_routeon 15 other serversreads or searches

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

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • pathstringrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • put_routecreates or changes datadescribed as changing data

    “Create/replace route; contentKey derived from path if omitted.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    16 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • pathstringrequired
    • contentKeystring or null“Explicit content key (defaults to a path-derived key when omitted).”
    • layoutstring or null“Layout NAME, bare: "default" for layouts/default.html — not the file key.”
    • titlestring or null
    • varsobject or null
    • purposestring or null
    • redirectTostring or null“Redirect target, a root-relative path (/…).”
    • redirectStatusnumber or null“301 permanent / 302 or 308 temporary (default 301 on a redirect).”
    • preserveQueryboolean or null“Append the visitor's original query string to the redirect target (default true on a redirect).”
    • navLabelstring or null“DEPRECATED — use put_menu_item / menu API.”
    • navarray or null“DEPRECATED — use put_menu_item / menu API.”
    • experimentobject or null
    • noindexboolean or null“Exclude from sitemap/RSS; inject noindex meta (0.69).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • patch_routecreates or changes datadescribed as changing data

    “Partial route update (only sent fields change; an OMITTED field is left alone).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    16 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • pathstringrequired
    • contentKeystring or null“Explicit content key (defaults to a path-derived key when omitted).”
    • layoutstring or null“Layout NAME, bare: "default" for layouts/default.html — not the file key.”
    • titlestring or null
    • varsobject or null
    • purposestring or null
    • redirectTostring or null“Redirect target, a root-relative path (/…).”
    • redirectStatusnumber or null“301 permanent / 302 or 308 temporary (default 301 on a redirect).”
    • preserveQueryboolean or null“Append the visitor's original query string to the redirect target (default true on a redirect).”
    • navLabelstring or null“DEPRECATED — use put_menu_item / menu API.”
    • navarray or null“DEPRECATED — use put_menu_item / menu API.”
    • experimentobject or null
    • noindexboolean or null“Exclude from sitemap/RSS; inject noindex meta (0.69).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • rename_pageon 7 other serverscreates or changes datadescribed as changing data

    “Change a page's URL: moves its route from `from` to `to`.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    6 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • fromstringrequired“Current route path, e.g.”
    • tostringrequired“New route path, e.g.”
    • leaveRedirectboolean“Leave a 301 from the old path to the new one (default true).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • delete_routedeletesdescribed as changing data

    “Remove a route by path.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • pathstringrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • list_goalson 7 other serversreads or searches

    “List site conversion goals (pageview paths and form submits).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • put_goalscreates or changes datadescribed as changing data

    “Create or replace all site conversion goals (≤50).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • goalsarrayrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • estimate_testreads or searches

    “Estimate days to reach promote readiness for a page (traffic baseline).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • pathstringrequired“Route path, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • start_teston 3 other serverscreates or changes datadescribed as changing data

    “Start a same-URL A/B test (draft or live source).”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    11 inputs, 5 required
    • sitestringrequired“Site slug, e.g.”
    • pathstringrequired
    • goalIdstringrequired
    • sourcestringrequired
    • weightsarray
    • namestring
    • hypothesisstring
    • changeNotestring“One line on what the variant changes, shown on the test card (≤120 chars).”
    • handsOffboolean“Hands-off mode (0.56e M4): Dotsy finishes the test WITHOUT further user instruction — the LIVE SITE may change later on its own (a ≥95% winner is auto-promoted…”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • promote_experimentcreates or changes datadescribed as changing data

    “Promote a winning A/B variant to live — explicit user instruction only; see get_skill('verify') § A/B.”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    6 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • experimentIdstringrequired
    • variantIdstringrequired“Winning variant arm id (usually "b").”
    • loserDispositionstring
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • delete_draft_testdeletesdescribed as changing data

    “Remove a draft A/B test (releases variant bodies; does not publish).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • experimentIdstringrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • set_experiment_notecreates or changes datadescribed as changing data

    “Record what was learned from an ended A/B test (≤500 chars; null clears).”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    5 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • experimentIdstringrequired
    • notestring or nullrequired“The learning, in plain words (≤500 chars, multiline ok) — null clears it.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_menuon 17 other serversreads or searches

    “Read a menu's draft items and etag; menu rules → get_skill('nav').”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • menustringrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • put_menu_itemcreates or changes datadescribed as changing data

    “Partial upsert one menu item: provided fields overwrite; omitted html/childTemplate/childShell/attrs/data are preserved.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    16 inputs, 9 required
    • sitestringrequired“Site slug, e.g.”
    • menustringrequired
    • idstringrequired
    • sortintegerrequired
    • parentstring or nullrequired
    • labelstringrequired
    • kindstringrequired
    • refstringrequired
    • newTabboolean
    • attrsobject
    • dataobject
    • htmlstring
    • childShellstring or null
    • childTemplatestring
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • delete_menu_itemdeletesdescribed as changing data

    “Remove one item from a menu (page stays live).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    5 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • menustringrequired
    • idstringrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • reorder_menucreates or changes datadescribed as changing data

    “Set final menu order.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    6 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • menustringrequired
    • orderedIdsarrayrequired
    • ifMatchstring
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_menu_docreads or searches

    “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 rout…”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • sourcestring“Which doc to read.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • put_menu_doccreates or changes datadescribed as changing data

    “Replace the whole menu doc (ifMatch from get_menu_doc required).”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    5 inputs, 4 required
    • sitestringrequired“Site slug, e.g.”
    • docobjectrequired
    • ifMatchstringrequired“Whole-doc etag from get_menu_doc.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • list_assetson 32 other serversreads or searches

    “CMS uploads under assets/ only — not mirrored clone CDN (get_site mirroredAssets or import warmJob).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    5 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • limitinteger
    • cursorstring
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_asseton 28 other serversreads or searches

    “Read one asset (metadata + base64 + stored sha256).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired“Path after /assets/ on the site — e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • bulk_put_assetscreates or changes datadescribed as changing data

    “Upload 1–200 CMS assets; key = path after /assets/.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • itemsarrayrequired
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • delete_asseton 9 other serversdeletesdescribed as changing data

    “Delete a static asset by key.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • keystringrequired“Path after /assets/ on the site — e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • start_sitecreates or changes datadescribed as changing data

    “Start one draft site with no Dotsy account.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    3 inputs, 1 required
    • titlestring
    • purposestring
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
  • claim_siteon 3 other serverscreates or changes datadescribed as changing data

    “Move the guest draft onto your signed-in Dotsy account.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    2 inputs, 2 required
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstringrequired“Guest token from start_site (required).”
  • list_skillson 48 other serversreads or searches

    “Paige build skills (id + whenToUse).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    1 input, 1 required
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
  • get_skillon 67 other serversreads or searches

    “Skill body + optional questions[].”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    2 inputs, 2 required
    • idstringrequired“Skill id or synonym from list_skills, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
  • submit_feedbackon 138 other serverssends messagesdescribed as changing data

    “Optional mid-session feedback (required feedback rides with publish_site).”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    9 inputs, 5 required
    • sitestringrequired“Site slug, e.g.”
    • categorystringrequired“missing_tool | blocking_error | extra_round_trips | confusing_response | workaround | other”
    • impactPercentintegerrequired
    • titlestringrequired
    • descriptionstring
    • suggestedImprovementstring
    • findingsarray
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_activityon 21 other serversreads or searches

    “List site activity or fetch one change diff (pass id).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    10 inputs, 2 required
    • slugstringrequired“Site slug, e.g.”
    • whostring“Default all.”
    • statestring“needs_review = agent drafts awaiting a person's publish.”
    • actorstring“Actor id or me.”
    • sincestring“ISO date (default 7 days, plan retention floor).”
    • limitinteger“Page size (default 20).”
    • idstring“Event id — returns diff for this change instead of the list.”
    • keystring“Content key when id is set (default first key in the event).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • list_versionson 22 other serversreads or searches

    “List the site's published versions, newest first (who, when, pages, live, restorable).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    5 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • cursorstring“nextCursor from the previous call.”
    • limitinteger“Page size (default 20).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • restore_versionon 7 other serverscreates or changes datadescribed as changing data

    “Bring an earlier published version back as unpublished changes (page content only — routes, menus, images and settings stay).”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    9 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • versioninteger or stringrequired“A version from list_versions, or "previous" (the one before live).”
    • dryRunboolean“Only list what would change; writes nothing.”
    • keysarray“Restore only these content keys (single-page restore: CORE workspaces).”
    • removeAddedboolean“Remove pages added since the version.”
    • replaceDraftsboolean“Replace unpublished changes on the pages the restore touches.”
    • publishboolean“Publish exactly the restored pages at once (live-mode sites).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • undo_publishdescribed as changing data

    “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`).”

    Publisher declares: read-only no · destructive yes · idempotent no · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • publishVersionintegerrequired“The version the publish to undo returned.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • revert_changedescribed as changing data

    “Undo one activity event by staging the prior version as draft only — call publish_site to go live.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world no

    6 inputs, 3 required
    • slugstringrequired“Site slug, e.g.”
    • idstringrequired“Activity event id from get_activity.”
    • keysarray“Undo only these keys of the change.”
    • reasonstring“Why — shown next to 'Reverted by …'.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_account_contextreads or searches

    “Account, user, memberships[].”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 1 required
    • workspacestring or null“Workspace org id or slug (see get_account_context memberships).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • add_custom_domainon 5 other serverscreates or changes datadescribed as changing data

    “Connect apex and/or www on a paid plan; starts a DNS connect session.”

    Publisher declares: read-only no · destructive no · idempotent no · open-world yes

    5 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • hostsarray“1–2 hostnames: apex (example.com) and/or www (www.example.com).”
    • domainstring“Bare domain when hosts omitted — apex expands to apex + www; a subdomain connects as-is.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_custom_domain_connectreads or searches

    “Current connect session and nextAction (browser URL or manual DNS guide).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • sessionIdstring“Connect session id from add_custom_domain; omit to resume pending.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • reapply_custom_domain_oauthcreates or changes datadescribed as changing data

    “Re-apply DNS with stored Cloudflare OAuth grant (no browser).”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world yes

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • refresh_custom_domaincreates or changes datadescribed as changing data

    “Poll one hostname until DNS/cert propagates.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world yes

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • hoststringrequired“Hostname to refresh, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • wait_for_custom_domainreads or searches

    “Poll one hostname until it is connected or the timeout is reached.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world yes

    6 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • hoststringrequired“Hostname to wait for, e.g.”
    • timeoutSecinteger“Max seconds to wait (default 300, max 600).”
    • intervalSecinteger“Seconds between polls (default 30, min 10, max 60).”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • set_primary_custom_domaincreates or changes datadescribed as changing data

    “Set the canonical host (301 target) when multiple hostnames are connected.”

    Publisher declares: read-only no · destructive no · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • hoststringrequired“Connected hostname to make primary”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • list_custom_domainson 2 other serversreads or searches

    “List all custom hostnames and connection status for the site.”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    3 inputs, 2 required
    • sitestringrequired“Site slug, e.g.”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • remove_custom_domainon 5 other serversdeletesdescribed as changing data

    “Remove one custom hostname from the site.”

    Publisher declares: read-only no · destructive yes · idempotent yes · open-world yes

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • hoststringrequired“Hostname to remove”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • list_form_submissionson 2 other serversreads or searches

    “List form submissions (metadata + bounded field preview — not full PII).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    9 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • formstringrequired“Form id from dotsy-config, e.g.”
    • limitinteger
    • cursorstring
    • fromMsinteger
    • toMsinteger
    • qstring“Search reply-to email (indexed)”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • get_form_submissionreads or searches

    “Read one form submission with the full field payload (explicit PII access — use only when needed).”

    Publisher declares: read-only yes · destructive no · idempotent yes · open-world no

    4 inputs, 3 required
    • sitestringrequired“Site slug, e.g.”
    • idstringrequired“Submission id from list_form_submissions”
    • contextstringrequired“One sentence: why you are calling this tool and what you are trying to accomplish.”
    • guestTokenstring“Guest token from start_site.”
  • list_my_sitesreads or searches

    “List your Dotsy sites.”

    Publisher declares: read-only yes · destructive no · open-world no

    1 input
    • workspacestring or null“Workspace org id or slug (see get_account_context memberships).”
  • list_pageson 71 other serversreads or searches

    “List pages on a site — route settings (path/title/navLabel/purpose) by default, one row per route.”

    Publisher declares: read-only yes · destructive no · open-world no

    7 inputs, 1 required
    • sitestringrequired“Site slug.”
    • limitinteger“Pages per page (server default applies when omitted).”
    • cursorstring“Resume from a prior response's nextCursor.”
    • viewstring“pages: group by layout — enables layout/noLayout/q below, adds page-structure fields and indexing progress.”
    • layoutstring“Only with view:'pages'.”
    • noLayoutboolean“Only with view:'pages'.”
    • qstring“Only with view:'pages'.”
  • “Open the interactive page canvas to change content: the user clicks an element, then you call patch_content.”

    Publisher declares: read-only yes · destructive no · open-world no

    3 inputs, 1 required
    • sitestringrequired“Site slug.”
    • pathstring“Route path (default /).”
    • stagestring“Preview stage.”
  • get_site_build_progressreads or searches

    “Read-only build progress for humans (build-theater view) during structure/adapt or after import.”

    Publisher declares: read-only yes · destructive no · open-world no

    1 input, 1 required
    • sitestringrequired“Site slug.”

Each quoted sentence is the first sentence of the publisher’s own description. The kind of tool and the “changes data” mark are our AI model’s reading of that description, not something we tested: two differently worded runs had to agree, otherwise no label is shown, and nobody has checked them by hand. A tool without the “changes data” mark is described as only reading, searching or calculating, or the two runs did not agree. No tool was called. Read the publisher’s full description before relying on it. “Publisher declares” lists the hints the server itself sends with the tool (MCP annotations: read-only, destructive, idempotent, open-world); they are the publisher's claims, not checked by us. Inputs are the parameters in the tool's own input schema: name, declared type, whether it is required, and the first sentence of its description. Read 2026-10-23.

How well are its tools described?

Features #4 and #5

How clearly this server's own tool descriptions say what a tool does, and how consistent its tool list is. The first part is an AI model's yes/no reading of each description; the second part is counted. We do not turn it into a grade.

Descriptions

AI reading of each description

Says what the tool does
100% of 98 tools
Says what it returns
46% of 95 tools
States limits, defaults or errors
24% of 70 tools
Says when to use it
100% of 58 tools
Items covered per tool
2.8 of 4 on average

Counted from the listing

Parameters with a description
80% of 564
Tools with a description
100% of 98
Typical description length
235 characters

The tool set

Counted from the listing

Tools
98
Size of the list
about 44,585 tokens for an agent to load (characters ÷ 4)
Naming
98 of 98 names use snake_case

AI reading: easy to mix up

No pair found.

The AI items cover 98 of 98 tools: for a tool where two differently worded runs disagreed, that item is left out. They were not checked by hand, and no tool was called. “Easy to mix up” means two tools whose names or descriptions overlap without saying how they differ; the AI found none, comparing tools within groups of 40. We do not rate whether the tool set is complete or whether side effects are spelled out, because our AI reading of those was not reliable enough.

How do I add it to my client?

Config from the registry entry

From the remote endpoint (Streamable HTTP)

We connected to this URL on 2026-10-23 (a read-only session: no tool was called).

Add to CursorAn install link in the format Cursor documents, holding the Cursor config below.

Claude Desktop or claude.ai
Settings → Connectors → Add custom connector, then paste:
https://mcp.dotsy.ai/mcp
Cursor · .cursor/mcp.json in a project, or ~/.cursor/mcp.json
{
  "mcpServers": {
    "mcp": {
      "url": "https://mcp.dotsy.ai/mcp"
    }
  }
}
VS Code · .vscode/mcp.json
{
  "servers": {
    "mcp": {
      "type": "http",
      "url": "https://mcp.dotsy.ai/mcp"
    }
  }
}
VS Code (command line) · Bash or zsh terminal (macOS, Linux)
code --add-mcp '{"name":"mcp","type":"http","url":"https://mcp.dotsy.ai/mcp"}'
Claude Code
claude mcp add --transport http mcp https://mcp.dotsy.ai/mcp
Try it in the MCP Inspector · runs on your machine, opens in your browser · Node 22.19+
npx @modelcontextprotocol/inspector@2.11.0 --server-url https://mcp.dotsy.ai/mcp --transport http
  • The server runs on the operator's infrastructure; it may ask you to sign in when you first connect.
  • The MCP Inspector lists the server's tools, resources and prompts; a tool you call there runs for real.

Built from the server's registry entry with each client's documented format (checked 2026-10-14; the Cursor link and the VS Code command 2026-10-19; the MCP Inspector command 2026-10-21). Values in < > are yours to fill in; this page never contains a key. Where the server needs a setting the entry does not declare, it can still fail to start.

Does the registry listing match what we found?

Feature #6

The registry verifies a package once, when it is published, and does not re-check it. A difference below is about the listing, not a judgement of the publisher.

Registry saysWe foundResultSource · date
Remote endpoint mcp.dotsy.ai/mcpSession openedmatchesour test · 2026-10-23
No credential declared as requiredOpened a session without any credentialmatchesour test · 2026-10-23

Choosing

Record checks

Public records · not a safety rating

1 of 2 record checks met · 7 do not apply

  • Not ranked by downloads: a remote server publishes no download figure
  • Not ranked by stars: no public GitHub repository
  • MetRegistry entry is active and says how to run itActive, with a package or a remote address.
  • Not metSource repository link opensThe registry entry gives no repository link.
  • Does not applyRepository is not archivedNo public GitHub repository to read.
  • Does not applyCode pushed to the repository in the 90 days before our checkNo public GitHub repository to read.
  • Does not applyRepository publishes a security policy (SECURITY.md)No public GitHub repository to read.
  • Does not applyPackage names its licence with a standard (SPDX) identifierRemote server: it ships no package.
  • Does not applyThe version the registry lists can be installed and is not withdrawnRemote server: it ships no package.
  • Does not applynpm package carries build provenance (attestation)Remote server: it ships no package.
  • Does not applyNo known critical or high advisory in the package or its dependenciesRemote server: it ships no package.

Read from public records only: the registry entry, npm/PyPI, GitHub and advisory databases, checked 2026-10-23. No tool was called. Only “met” and “not met” are counted, so the total differs between servers; a check that does not apply or that we could not run is listed, never counted against it. It is not a safety rating. How each check works · Leaderboards

Common questions about ai.dotsy/mcp

Answered from the data above

Is ai.dotsy/mcp safe to install?

We do not rate servers as safe or unsafe. 1 of its 2 applicable record checks are met (facts from public records, each listed on this page). What the records show: 57 of its tools describe changing data (our AI model's reading of the descriptions). These are facts with their sources on this page, not a safety guarantee, and we did not run its tools.

Does ai.dotsy/mcp need an API key or sign-in?

It opened a session without any credential on 2026-10-23. The registry entry declares no required credential; no declaration is not a guarantee.

Has ai.dotsy/mcp been security tested?

Partly. 4 of the 15 checks that apply to it were exercised. It accepted a session without any credential and lists tools whose names suggest they change data. We did not call them. No security verdict is published before verification.

What can ai.dotsy/mcp do?

It lists 98 tools. In our AI model's reading of their descriptions (two runs had to agree, nobody checked it by hand), they include tools that read or search, create or change data, delete and send messages. We did not call any tool, so this describes the text, not the behaviour.

Can ai.dotsy/mcp change or delete data?

57 of its tools say in their description that they create, edit, delete, send or run something (our AI model's reading). We did not call any tool, so we cannot say what actually happens.

Found this page useful?

Anonymous · no sign-in

A quick, anonymous reaction — no account, no email. One per kind from your browser. The tally updates when the page is next refreshed, and it is only a rough count, never a safety rating or a measured number of people.

Similar servers

Same topic · AI-read

Active servers whose topic is also “developer-tools” and that have at least one tool of the same kind; most kinds in common first, then most GitHub stars. The topic and the tool kinds are an AI model's reading of the publishers' descriptions, not checked by hand. Similar is not a recommendation.

Compare with another server

Side by side: registry entry, our read-only session, the tools and the 18 classification fields. Same values as each page; no score.

Security testing

What did we test, and what did we leave out?

18 checks · features #1, #2

Open without sign-in

It accepted a session without any credential and lists tools whose names suggest they change data. We did not call them. No security score is given; a check we did not run is never counted as passed.

The 18 checks at a glanceour test · 2026-10-23
  1. Inventory: exercised
  2. Hidden instructions: exercised
  3. Real execution: not run · our policy
  4. Secret leak: not run · nothing to check it against
  5. Internal addresses: not run · our policy
  6. Unconfirmed changes: not run · our policy
  7. Bad input: not run · our policy
  8. Model requests: not run · nothing to check it against
  9. Sensitive questions: not run · nothing to check it against
  10. Folder boundary: not run · our policy
  11. Log leaks: not run · nothing to check it against
  12. Hidden content: exercised
  13. Fake assistant turns: not applicable
  14. Token passthrough: not applicable
  15. Token audience: not applicable
  16. Sign-in redirect: not run · our policy
  17. Consent handling: not testable from outside
  18. Sign-in metadata: exercised

4 exercised11 not run (reason given)3 not applicable

Each check ends in exactly one state: exercised, not run (with the reason), or not applicable (with the reason). 4 of the 15 checks that apply to it were exercised. We do not publish security-check outcomes for named servers.

Exercised · 4
  • 1Inventory
    tool-list
    Reads the declared tools, resources and prompts.exercised
  • 2Hidden instructions
    description-poisoning
    Looks for hidden instructions in tool descriptions.exercised
  • 12Hidden content
    audience-hiding
    Checks resources that hide content from the user.exercised
  • 18Sign-in metadata
    oauth-url-scheme
    Checks the published sign-in metadata for unsafe URLs.exercised
Not run, with the reason · 11
  • 3Real execution
    real-execution
    Calls a tool and checks what really happens.This check calls the server's tools. ProtocolProbe calls no server's tools for anything it publishes; an operator can run this check on their own server with our self-test command.not run · our policy
  • 4Secret leak
    canary-leak
    Plants a fake secret and checks whether it leaks.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 5Internal addresses
    ssrf
    Checks whether a tool can be steered to internal addresses.This check calls the server's tools. ProtocolProbe calls no server's tools for anything it publishes; an operator can run this check on their own server with our self-test command.not run · our policy
  • 6Unconfirmed changes
    write-without-confirmation
    Checks whether tools that change data act without asking.This check calls the server's tools. ProtocolProbe calls no server's tools for anything it publishes; an operator can run this check on their own server with our self-test command.not run · our policy
  • 7Bad input
    error-handling
    Sends bad input and watches how the server answers.This check calls the server's tools. ProtocolProbe calls no server's tools for anything it publishes; an operator can run this check on their own server with our self-test command.not run · our policy
  • 8Model requests
    sampling
    Checks whether the server asks the client's model to act for it.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 9Sensitive questions
    elicitation-sensitive-data
    Checks whether the server asks users for sensitive data.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 10Folder boundary
    root-boundary
    Checks whether the server reaches outside the folders it was given.This check calls the server's tools. ProtocolProbe calls no server's tools for anything it publishes; an operator can run this check on their own server with our self-test command.not run · our policy
  • 11Log leaks
    logging-side-channel
    Checks whether log messages carry data they should not.This check needs at least one successful tool call to have something to check, and no tool was called.not run · nothing to check it against
  • 16Sign-in redirect
    open-redirect
    Checks the sign-in redirect for abuse.Testing the sign-in redirect means sending probes to the operator's sign-in service, which we do not do.not run · our policy
  • 17Consent handling
    confused-deputy
    Checks consent handling when one service acts for another.Depends on the operator's own consent screen, which differs per server and cannot be tested from outside.not testable from outside
Does not apply to this server · 3
  • 13Fake assistant turns
    fake-assistant-turn
    Checks prompts that pose as the assistant's own words.The server exposes no prompts.not applicable
  • 14Token passthrough
    token-passthrough
    Checks whether the server forwards a user's token to other services.The server opened a session without sign-in, so there is no token flow to check.not applicable
  • 15Token audience
    token-audience-validation
    Checks whether tokens meant for another service are accepted.The server opened a session without sign-in, so there is no token flow to check.not applicable

Source: our own test, 2026-10-23, mcp-runtime-engine@0.1.0. Which checks count and why follows our published scoring model.

What happened during the test?

Feature #8

The steps in order, as the test record holds them.

  1. 0 msStarted a read-only session with the server's remote endpoint
  2. 586 msConnected after 0 redirects. No credential was sent or needed.
  3. Read the inventory: 98 tools, 8 resources, 0 prompts.
  4. 3,029 msFinished: 4 checks exercised.

Reference

How is it classified?

18 fields

One value per field, each with its source. Fields written by AI models are marked. A field with no value says why.

TopicAI-classified
AI-classified · 2026-10-23
Pricing modelAI-classified
no value
No value: the AI answer was held back because the quoted text did not clearly support it.
Programming language
does not apply
no existing GitHub repository (server declares no repository link, so there is nothing to fetch)
Hosting type
registry · 2026-10-23
MCP capability
resources, tools
our test · 2026-10-23
Transport
streamable HTTP
registry · 2026-10-23
Required credentials
none declared
registry · no declaration is not a guarantee
Package registry
does not apply
remote-only server: no package is shipped, so there is no package registry
Freshness
0–30 days
registry updatedAt · 2026-10-23
Lifecycle status
registry · 2026-10-23
License class
does not apply
remote-only server: ships no package, so there is nothing to look up in a package registry
Integrity hash
does not apply
remote-only server: ships no package, so there is nothing to look up in a package registry
Signature / provenance
does not apply
remote-only server: ships no package, so there is nothing to look up in a package registry
Dependency advisories
does not apply
ships no package, so there are no dependencies to audit
Popularity
does not apply
remote-only server: ships no package, so there is nothing to look up in a package registry
Publisher signals
not stated
no readable GitHub owner to describe
Maintenance
does not apply
server declares no repository link, so there is nothing to fetch
Environment
the publisher's infrastructure
where it runs, from the hosting type

“Not stated” means the source did not state it; “does not apply” means it does not apply to this kind of server; “our limit” means our own lookup failed. A linked value opens the directory filtered to the same value.

Cite or correct this page

Sources and corrections

Suggested citation

ProtocolProbe. “ai.dotsy/mcp: MCP server record.” Data checked 2026-10-23. https://protocolprobe.com/mcp/servers/ai.dotsy/mcp

Figures are valid for the date shown. Our facts on this page are CC BY 4.0: reuse them with a link and the check date. Quoted text (the publisher’s descriptions, website quotes, tool names) is not ours to license.

As JSON: this record in the API · API documentation.

Badge for your README

ProtocolProbe: 1 of 2 record checks met

[![ProtocolProbe](https://protocolprobe.com/api/v1/badge/ai.dotsy/mcp)](https://protocolprobe.com/mcp/servers/ai.dotsy/mcp)

It shows this server's record-check count: facts from public records, no tool called. It is not a security rating or a pass. It links here and updates after each data reload.

Something wrong, or is this yours?

If a fact here is wrong, tell us and we will re-check it. If you operate this server, you can run our checks on it yourself with the free self-test command; we call no server’s tools ourselves for anything shown here.

Write to hello@protocolprobe.com · corrections log · methodology