Server providing Argo CD integration for MCP clients.
Dotsy is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Build and publish static sites on Dotsy with draft-first MCP tools, OAuth Connect, and API keys.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http dotsy-mcp https://mcp.dotsy.ai/mcp
# 2 — ask your agent for something these tools do
# create_site, get_site, update_brief and 88 more
Dotsy costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http dotsy-mcp https://mcp.dotsy.ai/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
91 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | — |
| title | string | no | — |
| keyConvention | string | no | — |
| purpose | string | no | — |
| onSlugTaken | string | no | — |
| editingMode | string | no | How the editor's Save behaves. 'live' (default) publishes each save immediately; 'staged' keeps saves as drafts until publish_site. Prefer 'staged' when an agent will hand the editor to a person (see |
| workspace | string/null | no | Workspace org id or slug (see get_account_context memberships). Only for multi-workspace users; omit otherwise. Ignored for pga_ keys (fixed workspace). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Site detail, stats, publicUrl, brief head (default-on), and readiness flags. pages[] is a ~25-entry head by default (stats.pages has the true count) — pass pages: true for the full array (capped at 1000), or enumerate everything with list_content/get_site_manifest. Large sites (200+ pages): list_pages is paginated — use cursor or get_site_manifest for the full route set.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| brief | boolean | no | Include parsed brief head (default true). |
| pages | boolean | no | Return the full pages[] array instead of the default ~25-entry head (server-capped at 1000 either way). Default false. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Update _intent/site.md (site brief) or a page brief when page is set. See field descriptions for rules, notes, and head enums.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| page | string | no | Content key — targets that page's brief (_intent/pages/<key>.md). Omit for the site brief. |
| head | no | Head fields to merge. Site: purpose, audience, kind (exploration|production), priorities ({seo,analytics,design,mobile}: must|nice|skip), editingModel (ai|simple-editor|creator), sections, design (str | |
| body | string | no | Replace narrative body (site ≤50k chars; page ≤10k). |
| goal | string | no | Current goal (site ≤4k chars; page ≤2k). |
| notes | no | Site: free-form ## Notes string (≤4k) OR per-section notes object for Design system / Content & CMS / SEO (null clears one). Page brief: string only (≤2k). | |
| rules | array | no | 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 Guideline). A supported check (title-max, |
| removeRules | array | no | Ids of rules or guidelines to remove (site brief only). |
| appendHandoff | string | no | Append a hand-off log line — site brief only; ignored when page is set. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Read-only traffic overview (default) or full breakdowns via include[]; optional bot id for crawler page drill-down.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| range | string | no | Time window; default 30d. |
| include | array | no | Full breakdown sections to add under detail: pages, sources, countries, devices, browsers, os, utm, goals, series, crawlers, experiments, events — or 'all'. Omit for the overview only. |
| bot | string | no | Crawler bot id (e.g. googlebot, gptbot) → that bot's top crawled pages under crawlerBotPages. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Update site settings: title, keyConvention, or editingMode ('live' = each editor save publishes immediately; 'staged' = saves stay drafts until publish_site). Slug is the hostname — change it with rename_site, not this tool. Set 'staged' before handing the editor to a person via start_edit_session's draftEditorUrl. signature toggles the "Made with Dotsy" badge ({enabled, mark: logo|dot, reveal: pi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| title | string | no | — |
| keyConvention | string | no | — |
| editingMode | string | no | How the editor's Save behaves. 'live' (default) publishes each save immediately; 'staged' keeps saves as drafts until publish_site. Prefer 'staged' when an agent will hand the editor to a person (see |
| signature | object | no | "Made with Dotsy" signature badge. Takes effect on the live site immediately, no publish needed. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Rename the site slug (public hostname {slug}.dotsy.site). Owner-only. After success: use the returned slug in every later tool. Published site: the old slug redirects on the API (301 for reads, 308 for writes) while it stays reserved; the old host 301s and stays reserved until delete or rename-back. Never published: the old slug 404s on the API and the old hostname is released (no 301; create_site
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| newSlug | string | yes | New site slug (lowercase hostname stem) |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Publish draft to live. feedback and handoff required (use dummy feedback + one-line handoff if clean).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| feedback | object | yes | Required. Canonical dummy OK on friction-free sessions; tool intents attached automatically. |
| handoff | string | yes | One sentence: decisions, preferences, or open threads for the next session (appended to the brief). |
| confirmedDraftFingerprint | string | no | Required when get_draft_status returned requiredDecision (publish_confirm). Must match the current draft fingerprint from get_draft_status. |
| acknowledgeSeoWarnings | boolean | no | Required when brief.priorities.seo is must and verify_page reported SEO errors (not warnings). User must have explicitly chosen to publish despite errors. |
| pages | array | no | Publish only these pages — use when a publish returns rules_not_fully_checked; publish the rest in further batches (≤50 route paths, e.g. /pricing). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Pending draft changes: content keys and routes with status. May include requiredDecision (publish_confirm) before publish_site.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Discard unpublished drafts: all (omit key/keys/routes), one content key (key), or a selection (keys, routes). Destructive — check get_draft_status first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | no | — |
| keys | array | no | — |
| routes | array | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Permanently delete site; confirmSlug must equal slug.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| confirmSlug | string | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| title | string | no | — |
| content | array | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| mode | string | no | — |
| routes | boolean | no | — |
| limit | integer | no | — |
| cursor | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| find | string | yes | — |
| replace | string | yes | — |
| keys | array | no | — |
| expectPerKey | integer | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Find pages containing a phrase (grep without reading bodies). Requires do-sqlite — graduate_site first if search_unavailable.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| q | string | yes | — |
| limit | integer | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Enable site search & collections (kv → do-sqlite), one-way. Unlocks search_content, collection indexes, visitor /__paige/search, and moves any R2 form-submission ledger into SiteDb. 409 blocked covers three unrelated gates: an unsupported source backend (no override, ever); strictDrafts — default true, this client sends true unless you pass strictDrafts:false — blocking on unpublished drafts or un
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| strictDrafts | boolean | no | Block on unpublished drafts or unrecovered KV content rows (default true — publish/discard first, or pass false to proceed anyway). |
| force | boolean | no | Proceed past the incomplete-KV-snapshot 409 only — not the unsupported-backend or strictDrafts blocks, which force does nothing for. Read the blocked response's reason + audit first; the flip is o |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Atomic writes[] + deletes[]; attach routes via writes[].route. At most 10 writes; each body ≤60KB and the call ≤80KB. Larger new pages: stage_content_chunk then writes[].bodyStaging, or dotsy push / PUT content-raw.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| writes | array | no | — |
| deletes | array | no | — |
| message | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Import URL to draft. On complete, response may include requiredDecision — preview then ask mirror vs editable before structure_*.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| sourceUrl | string | yes | — |
| mode | string | no | Default auto — per-page mirror with silent render escalation |
| pages | array | no | Explicit page list; omit to import sourceUrl as index.html |
| segments | array | no | Split-origin segments — each expands into pages by fetching its own sitemap. A segment without sitemap imports only its pathPrefix hub page (with a warning), not the whole prefix. |
| keyConvention | string | no | Content key shape: directory = Astro dist (about/index.html); default flat |
| onSlugTaken | string | no | — |
| workspace | string/null | no | Workspace org id or slug (see get_account_context memberships). Only for multi-workspace users; omit otherwise. Ignored for pga_ keys (fixed workspace). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Flat vs structured page counts; informs user — do not auto-run analyze/apply while requiredDecision pending.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Propose shared layout + fragments; persist:false first. Wait for mirror-vs-editable answer if requiredDecision pending.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| sampleLimit | integer | no | — |
| profileId | string | no | — |
| scope | string | no | Default flat-only; analyze clusters flat keys only. |
| persist | boolean | no | First call: false (preview only). true only after user confirms editable/CMS mode. |
| refreshManifest | boolean | no | Replace persisted manifest when true. |
| full | boolean | no | Return the full manifest incl. per-page HTML samples (default: compacted — etag/action/counts kept, samples truncated — to fit the token budget). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Deprecated — use structure_site_analyze.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| sampleLimit | integer | no | — |
| profileId | string | no | — |
| scope | string | no | Default flat-only; analyze clusters flat keys only. |
| persist | boolean | no | First call: false (preview only). true only after user confirms editable/CMS mode. |
| refreshManifest | boolean | no | Replace persisted manifest when true. |
| full | boolean | no | Return the full manifest incl. per-page HTML samples (default: compacted — etag/action/counts kept, samples truncated — to fit the token budget). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Rewrite flat pages to layout + fragments (draft). Do not call while requiredDecision pending — user must pick editable first. It extracts header/footer only: afterwards share_section with no arguments lists the other repeated blocks (banner, CTA).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| ifMatch | string | yes | Manifest etag from structure_site_analyze or get_structure_status. |
| mode | string | no | Default apply. Neither value is a dry run — review-only persists the same content/layout write as apply. Only pass review-only after a review_required error (low analyze confidence); it labels the res |
| scope | string | no | — |
| keys | array | no | Required when scope is keys. |
| restructure | boolean | no | Required true when scope all and site has structured pages. |
| overrides | object | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Last structure apply job result (structuredKeys, conflicts, partial).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| full | boolean | no | Return the full manifest/detail (default: compacted for the token budget). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Propose nav wiring + blog collectionization for an imported mirror (draft, opt-in). Read-only; returns per-adapter reports + proposalEtag. Nav decline may include nextStep (e.g. mega-menu → edit fragments/header.html). Wait for mirror-vs-editable answer if requiredDecision pending.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| full | boolean | no | Return the full per-member harvest report (default: compacted for the token budget). |
| adapters | array | no | Which adapters to analyze (default: both). |
| options | object | no | — |
| refreshProposal | boolean | no | Replace an existing UNCONSUMED proposal (otherwise re-analyze 409s proposal_exists). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Apply the adapt proposal (draft): wire nav into the menu store and/or rewrite the blog index to a live <dotsy-collection>. One undo covers the whole apply; a second apply is refused until adapt_site_revert (or force). Queued applies are polled to completion.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| ifMatch | string | yes | The proposal etag from analyze (or GET …/adapt/proposal / status). |
| adapters | array | yes | Which analyzed adapters to apply. |
| dryRun | boolean | no | Full computation, would-write set + previews, ZERO writes, no undo. |
| force | string | no | 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-failure rollback reinstates it. Prefer adapt r |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Atomically restore everything the last adapt_site_apply wrote (fragments, the menu doc when the op touched it, index, member configs, routes).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Read adapt state: proposal summary + proposalEtag (+ applied/consumed flag), undo-record presence, active or queued job progress. Use to resume in a fresh session.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
List content keys (HTML/md); not assets — use list_assets. Defaults to 50 keys per page — raise limit (max 1000) or pass cursor (from nextCursor) to page through the rest. Per-row size/missing are measured automatically only on pages of ≤100 rows; past that they're ABSENT (not measured, never null) unless you pass withSize:true, which forces measurement at a cost of one storage read per retu
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| limit | integer | no | Keys per page (default 50, max 1000). |
| cursor | string | no | Resume from a prior response's nextCursor. |
| withSize | boolean | no | Force size/missing measurement on a page bigger than 100 rows (costs one storage read per returned row). Default false — rows in a ≤100-row page are measured either way. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | — |
| selector | string | no | — |
| published | boolean | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | Content key: a page (about.html, blog/post.html), a layout (layouts/<name>.html) or a fragment (fragments/<name>.html). A <dotsy-fragment name> tag and a route's layout use the bare name, not the key. |
| body | string | yes | — |
| contentType | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| stagingId | string | no | — |
| seq | integer | yes | — |
| body | string | yes | — |
| contentType | string | no | — |
| finalize | boolean | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Edit one content key via ops[] (selector ops or replace-string; wrap/unwrap/move restructure siblings). Stages draft; op shapes in schema.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | — |
| ops | array | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
patch_content on multiple keys; all-or-nothing validation. Preferred edit path for pages over 60KB. replace-string value/replace ≤60KB; whole call ≤80KB.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| items | array | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Re-key a page by slug (draft or published static). Server-side hash copy — no body round-trip. Default deletes static routes (obscure-URL); movePath:true repoints the route, rewrites menu refs and other redirects aimed at the old path, and — only for an already-PUBLISHED page — leaves a 301 there too (leaveRedirect, default true; no effect on a never-published page, or when movePath is false). Ret
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | Current content key, e.g. dashboard.html |
| newSlug | string | yes | New filename stem; directory prefix preserved (blog/foo → blog/bar) |
| movePath | boolean | no | false (default): delete routes bound to old key. true: move static route path to match slug. |
| leaveRedirect | boolean | no | With movePath:true on an already-published page, leave a 301 at the old path (default true). false removes the old path outright — old links break. No effect when movePath is false, or on a page that |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Stage a blog post via structured meta+body (?format=post). Key e.g. blog/my-post.html. Declared membership: meta.collections; schedule: meta.visibleAt; SEO title override: meta.seoTitle (card always shows meta.title); custom fields: meta.custom.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | — |
| meta | object | yes | — |
| body | string | yes | — |
| head | array | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Collection state — count, server.mode, sample entries, tag (membershipKind, match=) when discovered; plus name, noun, URL pattern, layout, where it's listed, and post fields used. Pass status/q/cursor/limit (any one, even empty) for a full items[] page instead: status draft = never published; a published post with unpublished edits is status published with hasChanges:true (never draft) and shows i
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| prefix | string | yes | Collection id or prefix, e.g. "posts" or "blog/" — use the key exactly as list_collections returned it. |
| status | string | no | Filter items[] by status (see the tool description for what each means). Providing this (or q/cursor/limit) is what makes the response include items[]. |
| q | string | no | Case-insensitive title search within items[]. |
| cursor | string | no | Resume from a prior response's nextCursor. |
| limit | integer | no | Items per page (default 50, max 200). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Collections on the site — name, noun, item count (or 'not published yet'), URL pattern, and whether any member is staged. Includes a collection only a draft page lists. Returns a bare array (not wrapped in an object) — pass each row's key verbatim to inspect_collection/update_collection.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Rename a collection's display name and/or noun (e.g. the generic 'posts' key shown as 'Recipes' / 'recipe') — cosmetic only, stored separately from the tag that defines membership; doesn't need publish. Provide at least one of name/noun. null (or "") resets that field back to its derived default — different from omitting it, which leaves the current value alone.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | Collection key exactly as list_collections returned it, e.g. "posts" or "blog/" (a hand-typed key may 404 or get silently normalized). |
| name | no | Display name (≤80 chars). null resets to the derived name. | |
| noun | no | Singular noun for one item, e.g. "post" (≤40 chars). null resets to the derived noun. | |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Read-only scaffold for a new post — suggested key/path, membership meta, blank or duplicate body. Then put_post (+ optional put_route).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| collection | string | yes | Collection id or prefix, e.g. "posts" or "blog/" |
| templateKey | string | no | Exemplar content key; default = most recent member |
| mode | string | no | blank (default) or duplicate full body |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Build/finish collection indexes after publish returns collectionDataPending or collectionSqlPending.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Verify-only composed HTML check; home preview may include requiredDecision — ask mirror vs editable before structure_*.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| path | string | no | — |
| selector | string | no | Return matched elements only (tag/attrs/text). |
| contains | array | no | Assert substrings present in composed HTML. |
| notContains | array | no | Assert absent — e.g. <dotsy- for unresolved template tags. |
| variant | string | no | A/B variant arm to compose (e.g. "b") — same as ?dotsy-variant= on the public URL. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Pre-publish lint (tags, assets, layout). Pair with preview_page — see get_skill('verify').
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| paths | array | no | Routes to check; omit to verify every route on the site. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| requiredRoutes | integer | no | How many routes you plan to add |
| requiredAssets | integer | no | How many assets you plan to upload |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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 '/'.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| path | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Site shape: every layout and shared section (sections: fragments/* by name, with page count, whether the file exists and staged-change flag), whether a layout is missing, redirects count, menus grouped by where they show, and collections with their page placements. Use for 'is my layout missing', 'which shared sections exist and where', 'where does this menu show' — without listing every page. R
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Make a block that repeats on several pages one shared section, or change where one shows. No arguments: lists blocks repeated on 3+ pages. sourceKey + selector (or selectors: a sibling run, one wrapper): a dry run finds every page with it; dryRun:false shares it. name + scope/hide/show: move an existing section to/from every page, or hide/show it per page. Over the per-call cap (too_many_pages, no
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| sourceKey | string | no | Content key of the page the element is on, e.g. 'about.html'. |
| selector | string | no | CSS selector of the element in the page's stored HTML (the editor's selector, or one checked with get_content?selector=). It must match exactly one element. |
| ifMatch | string | no | The page's content hash (analyze's sourceEtag). If the page changed since, nothing is written. |
| name | string | no | With sourceKey + selector: the new section's name (default: proposed). Alone: the existing section to re-place. |
| scope | string | no | where_found: each page that has it gets a reference. every_page: one slot in the layout, at the top or bottom of the page content; pages listed in hide don't show it. |
| keys | array | no | Pages with an exact copy to share it on (analyze's matches.keys). Omit for every exact copy. The source page is always included. |
| similar | array | no | Pages with a similar copy (analyze's similar.keys) that take the shared version, losing their own wording. Default none. |
| hide | array | no | every_page: pages that should not show it (they keep their own copy). Send them with the first move, never later. |
| show | array | no | Pages that should show it again (removes their marker). |
| dryRun | boolean | no | Default true: report what would change and write nothing. false: stage the change as a draft (publish_site makes it live). |
| selectors | array | no | Instead of selector: a run of elements next to each other in one parent, in page order (each matches one element). Shared as one section inside a wrapper, on the pages with the same run. |
| wrapTag | string | no | With selectors: the wrapper. Default footer when the run ends the page content, else section. |
| keepLayout | boolean | no | With selectors: wrapper gets style="display:contents" so a flex/grid parent lays the run out as before. Default true. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| name | string | yes | Section name. Its file is fragments/<name>.html, placed with <dotsy-fragment name="<name>">. |
| pageKey | string | yes | Content key of the page that gets its own copy, e.g. 'pricing.html'. |
| ifMatch | string | no | The page's content hash. If the page changed since, nothing is written. |
| dryRun | boolean | no | Default true: report what would change and write nothing. false: stage the change as a draft (publish_site makes it live). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Get one route by path (home is '/').
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| path | string | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| path | string | yes | — |
| contentKey | no | Explicit content key (defaults to a path-derived key when omitted). null clears an explicit key back to that path default — same as omitting it, but usable on a PATCH to undo a prior set. | |
| layout | string/null | no | Layout NAME, bare: "default" for layouts/default.html — not the file key. It must already exist as layouts/<name>.html (400 layout_not_found otherwise). null removes the layout. |
| title | string/null | no | — |
| vars | no | — | |
| purpose | string/null | no | — |
| redirectTo | no | Redirect target, a root-relative path (/…). Required when purpose is "redirect". null clears it — only valid once purpose stops being "redirect" (a redirect route always needs a target). | |
| redirectStatus | no | 301 permanent / 302 or 308 temporary (default 301 on a redirect). null clears an explicit override. | |
| preserveQuery | boolean/null | no | Append the visitor's original query string to the redirect target (default true on a redirect). null clears an explicit override. |
| navLabel | string/null | no | DEPRECATED — use put_menu_item / menu API. Menu link text for <dotsy-nav> (separate from title). Still accepted during transition and synced to menu items. |
| nav | no | DEPRECATED — use put_menu_item / menu API. Menu memberships on the route row. Still accepted during transition and synced to menu items. See get_skill('nav'). | |
| experiment | no | — | |
| noindex | boolean/null | no | Exclude from sitemap/RSS; inject noindex meta (0.69). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Partial route update (only sent fields change; an OMITTED field is left alone). On a field that accepts null (contentKey, redirectTo, redirectStatus, preserveQuery), sending null CLEARS it back to its default — different from omitting it. To set redirectTo/redirectStatus, include purpose: "redirect" in the SAME call — the check looks only at what's sent, not the route's stored purpose, so a PATCH
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| path | string | yes | — |
| contentKey | no | Explicit content key (defaults to a path-derived key when omitted). null clears an explicit key back to that path default — same as omitting it, but usable on a PATCH to undo a prior set. | |
| layout | string/null | no | Layout NAME, bare: "default" for layouts/default.html — not the file key. It must already exist as layouts/<name>.html (400 layout_not_found otherwise). null removes the layout. |
| title | string/null | no | — |
| vars | no | — | |
| purpose | string/null | no | — |
| redirectTo | no | Redirect target, a root-relative path (/…). Required when purpose is "redirect". null clears it — only valid once purpose stops being "redirect" (a redirect route always needs a target). | |
| redirectStatus | no | 301 permanent / 302 or 308 temporary (default 301 on a redirect). null clears an explicit override. | |
| preserveQuery | boolean/null | no | Append the visitor's original query string to the redirect target (default true on a redirect). null clears an explicit override. |
| navLabel | string/null | no | DEPRECATED — use put_menu_item / menu API. Menu link text for <dotsy-nav> (separate from title). Still accepted during transition and synced to menu items. |
| nav | no | DEPRECATED — use put_menu_item / menu API. Menu memberships on the route row. Still accepted during transition and synced to menu items. See get_skill('nav'). | |
| experiment | no | — | |
| noindex | boolean/null | no | Exclude from sitemap/RSS; inject noindex meta (0.69). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Change a page's URL: moves its route from from to to. Menu links and other redirects that pointed at the old path retarget automatically; a 301 is left at the old path by default (leaveRedirect). Retry-safe (resend the same call after any error). Errors: 404 route_not_found (from isn't a route); 400 reserved_route (to is under /__dotsy/) or invalid_body (missing/malformed from or to); 422 rena
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| from | string | yes | Current route path, e.g. /old-page |
| to | string | yes | New route path, e.g. /new-page |
| leaveRedirect | boolean | no | Leave a 301 from the old path to the new one (default true). false removes the old path outright — old links break. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Remove a route by path.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| path | string | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
List site conversion goals (pageview paths and form submits). Required before start_test.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Create or replace all site conversion goals (≤50). Required before start_test when no goal exists.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| goals | array | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Estimate days to reach promote readiness for a page (traffic baseline). Read-only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| path | string | yes | Route path, e.g. /pricing |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Start a same-URL A/B test (draft or live source). Rules → get_skill('verify') § A/B.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| path | string | yes | — |
| goalId | string | yes | — |
| source | string | yes | — |
| weights | array | no | — |
| name | string | no | — |
| hypothesis | string | no | — |
| changeNote | string | no | One line on what the variant changes, shown on the test card (≤120 chars). |
| handsOff | boolean | no | 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, old page kept as a draft; or after 30 d |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Promote a winning A/B variant to live — explicit user instruction only; see get_skill('verify') § A/B.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| experimentId | string | yes | — |
| variantId | string | yes | Winning variant arm id (usually "b"). |
| loserDisposition | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Remove a draft A/B test (releases variant bodies; does not publish).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| experimentId | string | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Record what was learned from an ended A/B test (≤500 chars; null clears).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| experimentId | string | yes | — |
| note | yes | The learning, in plain words (≤500 chars, multiline ok) — null clears it. | |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Read a menu's draft items and etag; menu rules → get_skill('nav').
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| menu | string | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Partial upsert one menu item: provided fields overwrite; omitted html/childTemplate/childShell/attrs/data are preserved. To remove those keys, use put_menu_doc. A brand-new id dedupes by (menu, ref) — reuses an existing item linking the same target instead of creating a duplicate. An id that already names an item always updates that exact item, even if another item links the same page.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| menu | string | yes | — |
| id | string | yes | — |
| sort | integer | yes | — |
| parent | string/null | yes | — |
| label | string | yes | — |
| kind | string | yes | — |
| ref | string | yes | — |
| newTab | boolean | no | — |
| attrs | object | no | — |
| data | object | no | — |
| html | string | no | — |
| childShell | string/null | no | — |
| childTemplate | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Remove one item from a menu (page stays live).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| menu | string | yes | — |
| id | string | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Set final menu order. Pass ifMatch from get_menu; stale → 409 with current items.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| menu | string | yes | — |
| orderedIds | array | yes | — |
| ifMatch | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Read the whole menu doc (all menus + shell/template), etag for put_menu_doc, and issues (by item id) — page_not_routable, page_missing, page_dead_link, page_is_redirect — computed from the draft routes, so a link that won't show or leads nowhere shows up before publish.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| source | string | no | Which doc to read. Default draft. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Replace the whole menu doc (ifMatch from get_menu_doc required). Each item may omit menu — the enclosing menu key in doc is used.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| doc | object | yes | — |
| ifMatch | string | yes | Whole-doc etag from get_menu_doc. Required (sent as If-Match). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
CMS uploads under assets/ only — not mirrored clone CDN (get_site mirroredAssets or import warmJob). Not content — use list_content. Uploaded files are live in the editor and draft preview at once; the published site picks them up at the next publish.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| limit | integer | no | — |
| cursor | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Read one asset (metadata + base64 + stored sha256). sha256 is the stored blob; may differ from upload bodySha256 when IMAGES re-encodes rasters. Uploaded files are live in the editor and draft preview at once; the published site picks them up at the next publish.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | Path after /assets/ on the site — e.g. photos/hero.webp or style.css. Do not prefix with assets/ or /. Uploaded files are live in the editor and draft preview at once; the published site picks them up |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Upload 1–200 CMS assets; key = path after /assets/. Each item: exactly one of bodyBase64, bodyText (plain text for .css/.js/.mjs/.json/.svg/.txt/.xml only — not .html pages), or importFromUrl. Optional bodySha256 verifies submitted bytes before write; response sha256 is stored bytes (JS/CSS match; WebP rasters may differ). Uploaded files are live in the editor and draft preview at once; the publis
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| items | array | yes | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Delete a static asset by key. The editor and draft preview drop it at once; the published site drops it at the next publish.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| key | string | yes | Path after /assets/ on the site — e.g. photos/hero.webp or style.css. Do not prefix with assets/ or /. Uploaded files are live in the editor and draft preview at once; the published site picks them up |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Start one draft site with no Dotsy account. Returns slug + guestToken — pass guestToken on every later tool call until claim_site.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | no | — |
| purpose | string | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
Move the guest draft onto your signed-in Dotsy account. Requires OAuth Connect; pass the guestToken from start_site.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | yes | Guest token from start_site (required). Pass the pgg_ value returned by start_site. |
Paige build skills (id + whenToUse). Pull get_skill on demand — do not duplicate in tool text.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
Skill body + optional questions[]. Accepts an id OR a synonym (e.g. 'list', 'menu') — resolves aliases and suggests near-misses. Start with intake when ambiguous.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | Skill id or synonym from list_skills, e.g. intake, clone, list, menu |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
Optional mid-session feedback (required feedback rides with publish_site).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| category | string | yes | missing_tool | blocking_error | extra_round_trips | confusing_response | workaround | other |
| impactPercent | integer | yes | — |
| title | string | yes | — |
| description | string | no | — |
| suggestedImprovement | string | no | — |
| findings | array | no | — |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
List site activity or fetch one change diff (pass id). Filters: who, state, actor (me), since, limit≤20. Notes from context are visible to everyone on the site — no secrets.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | Site slug, e.g. acme-studio |
| who | string | no | Default all. |
| state | string | no | needs_review = agent drafts awaiting a person's publish. |
| actor | string | no | Actor id or me. |
| since | string | no | ISO date (default 7 days, plan retention floor). |
| limit | integer | no | Page size (default 20). |
| id | string | no | Event id — returns diff for this change instead of the list. |
| key | string | no | Content key when id is set (default first key in the event). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Undo one activity event by staging the prior version as draft only — call publish_site to go live. Respects AI access.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | Site slug, e.g. acme-studio |
| id | string | yes | Activity event id from get_activity. |
| keys | array | no | Undo only these keys of the change. Default: every key. |
| reason | string | no | Why — shown next to 'Reverted by …'. Visible to everyone on the site. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Account, user, memberships[]. Pass workspace on writes when memberships.length > 1.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| workspace | string/null | no | Workspace org id or slug (see get_account_context memberships). Only for multi-workspace users; omit otherwise. Ignored for pga_ keys (fixed workspace). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Connect apex and/or www on a paid plan; starts a DNS connect session.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| hosts | array | no | 1–2 hostnames: apex (example.com) and/or www (www.example.com). |
| domain | string | no | Bare domain when hosts omitted — apex expands to apex + www; a subdomain connects as-is. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Current connect session and nextAction (browser URL or manual DNS guide).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| sessionId | string | no | Connect session id from add_custom_domain; omit to resume pending. |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Re-apply DNS with stored Cloudflare OAuth grant (no browser).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Poll one hostname until DNS/cert propagates.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| host | string | yes | Hostname to refresh, e.g. www.example.com |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Poll one hostname until it is connected or the timeout is reached.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| host | string | yes | Hostname to wait for, e.g. www.example.com |
| timeoutSec | integer | no | Max seconds to wait (default 300, max 600). |
| intervalSec | integer | no | Seconds between polls (default 30, min 10, max 60). |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Set the canonical host (301 target) when multiple hostnames are connected.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| host | string | yes | Connected hostname to make primary |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
List all custom hostnames and connection status for the site.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Remove one custom hostname from the site.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| host | string | yes | Hostname to remove |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
List form submissions (metadata + bounded field preview — not full PII). Works on kv and do-sqlite backends.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| form | string | yes | Form id from dotsy-config, e.g. contact |
| limit | integer | no | — |
| cursor | string | no | — |
| fromMs | integer | no | — |
| toMs | integer | no | — |
| q | string | no | Search reply-to email (indexed) |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
Read one form submission with the full field payload (explicit PII access — use only when needed).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug, e.g. acme-studio |
| id | string | yes | Submission id from list_form_submissions |
| context | string | yes | One sentence: why you are calling this tool and what you are trying to accomplish. Stored on the site's activity log and visible to everyone on the site — never put secrets or personal data here. |
| guestToken | string | no | Guest token from start_site. Send it on every call until claim_site. Omit when this chat is already signed in to Dotsy. |
List your Dotsy sites. Renders a site-picker for humans; agent reads structuredContent. Use to choose a site — not for editing content (use edit_page) or verify-only checks (use preview_page). Defaults to your active workspace; pass workspace (org id or slug from get_account_context memberships) to list another workspace's sites without switching the dashboard session.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| workspace | string/null | no | Workspace org id or slug (see get_account_context memberships). Only for multi-workspace users; omit otherwise. Ignored for pga_ keys (fixed workspace). |
List pages on a site — route settings (path/title/navLabel/purpose) by default, one row per route. Renders a page-picker for humans (redirect and worker routes left out there — nothing to open in edit_page); agent reads structuredContent. Use after picking a site — not for editing (use edit_page) or verify-only checks (use preview_page). Pass view:'pages' to group by layout instead — adds layout/n
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug. |
| limit | integer | no | Pages per page (server default applies when omitted). |
| cursor | string | no | Resume from a prior response's nextCursor. |
| view | string | no | pages: group by layout — enables layout/noLayout/q below, adds page-structure fields and indexing progress. Omit for the default per-route listing. |
| layout | string | no | Only with view:'pages'. Layout file key (e.g. layouts/store.html, or bare 'store') — only pages using it. Exclusive with noLayout. |
| noLayout | boolean | no | Only with view:'pages'. Only pages with no layout (routeless keys included). Exclusive with layout. |
| q | string | no | Only with view:'pages'. Case-insensitive substring match on path or title. |
Open the interactive page canvas to change content: the user clicks an element, then you call patch_content. Use when the intent is editing — not for verify-only checks (use preview_page).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug. |
| path | string | no | Route path (default /). |
| stage | string | no | Preview stage. Default draft; published is planned but not supported yet. |
Read-only build progress for humans (build-theater view) during structure/adapt or after import. Agent reads structuredContent.forHumans — optional; do not call in a loop during import_site_from_url (that tool blocks until done). Prefer get_site for agent logic.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| site | string | yes | Site slug. |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Dotsy or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 0.4.1.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Dotsy can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.