Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

dotsy

REMOTE · MCP.DOTSY.AI

Build and publish static sites on dotsy with draft-first MCP tools, OAuth Connect, and API keys.

Available components

+3 this week 90 Trust /100

Last scanned (16 hours ago)

Scores higher than 98% of remote servers

Reachable. Last reached 5 Nov 2026.

Category Developer Tools

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security89
Transport & Reachability100
Schema Quality & AI Usability76
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 18437 tokens (~147/item across 125 items; 117 tools + 8 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management94
  • Stability check failed: schema churn in the 29 days we've observed: 1 tool removals, 3 breaking changes, 0 auth/transport breaks, 29 additions. See how to fix → Fail
Tool Coverage92
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 76% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 10 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 119 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
  • Supports UI / widget rendering.Pass
What we tested

Checks we ran (14)

  • TLS certificate
  • Authorization
  • HTTPS
  • HSTS header
  • DNSSEC
  • Transport
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol
  • Capabilities

Does not apply to this hosted endpoint (2)

  • Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
  • Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 5 Nov 26 +1
    • Resource “get_site_build_progress” now points somewhere else: ui://views/apps-sdk/build-theater.html?v=0b9659cd → ui://views/ext-apps/build-theater.html?v=0b9659cd security
    • Resource “edit_page” now points somewhere else: ui://views/apps-sdk/page-canvas.html?v=88974c83 → ui://views/ext-apps/page-canvas.html?v=88974c83 security
    • Resource “get_site_build_progress” now points somewhere else: ui://views/apps-sdk/build-theater.html?v=34c6d210 → ui://views/ext-apps/build-theater.html?v=0b9659cd security
    • Resource “get_site_build_progress” now points somewhere else: ui://views/ext-apps/build-theater.html?v=34c6d210 → ui://views/ext-apps/build-theater.html?v=0b9659cd security
    • Resource “list_my_sites” now points somewhere else: ui://views/apps-sdk/site-picker.html?v=20fa5fa4 → ui://views/ext-apps/site-picker.html?v=20fa5fa4 security
    • Resource “list_pages” now points somewhere else: ui://views/apps-sdk/page-picker.html?v=3fce7297 → ui://views/ext-apps/page-picker.html?v=3fce7297 security
    • Tool “update_site” rewrote its description, which is the text the model reads security
    • Server version: 0.8.6 → 0.8.8 functional
    • New tool “form_recipients” functional
    • New tool “install_product_kit” functional
  • 4 Nov 26 0
    • Resource “edit_page” now points somewhere else: ui://views/apps-sdk/page-canvas.html?v=88974c83 → ui://views/ext-apps/page-canvas.html?v=88974c83 security
    • Resource “get_site_build_progress” now points somewhere else: ui://views/apps-sdk/build-theater.html?v=34c6d210 → ui://views/ext-apps/build-theater.html?v=34c6d210 security
    • Resource “list_my_sites” now points somewhere else: ui://views/apps-sdk/site-picker.html?v=20fa5fa4 → ui://views/ext-apps/site-picker.html?v=20fa5fa4 security
    • Resource “list_pages” now points somewhere else: ui://views/apps-sdk/page-picker.html?v=3fce7297 → ui://views/ext-apps/page-picker.html?v=3fce7297 security
  • 3 Nov 26 +1
    • Resource “edit_page” now points somewhere else: ui://views/apps-sdk/page-canvas.html?v=bfd4da19 → ui://views/ext-apps/page-canvas.html?v=88974c83 security
    • Resource “edit_page” now points somewhere else: ui://views/ext-apps/page-canvas.html?v=bfd4da19 → ui://views/ext-apps/page-canvas.html?v=88974c83 security
    • Resource “get_site_build_progress” now points somewhere else: ui://views/apps-sdk/build-theater.html?v=317f2c43 → ui://views/ext-apps/build-theater.html?v=34c6d210 security
    • Resource “get_site_build_progress” now points somewhere else: ui://views/ext-apps/build-theater.html?v=317f2c43 → ui://views/ext-apps/build-theater.html?v=34c6d210 security
    • Resource “list_my_sites” now points somewhere else: ui://views/apps-sdk/site-picker.html?v=f9802318 → ui://views/ext-apps/site-picker.html?v=20fa5fa4 security
    • Resource “list_my_sites” now points somewhere else: ui://views/ext-apps/site-picker.html?v=f9802318 → ui://views/ext-apps/site-picker.html?v=20fa5fa4 security
    • Resource “list_pages” now points somewhere else: ui://views/apps-sdk/page-picker.html?v=f80b1d11 → ui://views/ext-apps/page-picker.html?v=3fce7297 security
    • Resource “list_pages” now points somewhere else: ui://views/ext-apps/page-picker.html?v=f80b1d11 → ui://views/ext-apps/page-picker.html?v=3fce7297 security
    • Resource “edit_page” now points somewhere else: ui://views/apps-sdk/page-canvas.html?v=bfd4da19 → ui://views/ext-apps/page-canvas.html?v=bfd4da19 security
    • Resource “get_site_build_progress” now points somewhere else: ui://views/apps-sdk/build-theater.html?v=317f2c43 → ui://views/ext-apps/build-theater.html?v=317f2c43 security
    • Resource “list_my_sites” now points somewhere else: ui://views/apps-sdk/site-picker.html?v=f9802318 → ui://views/ext-apps/site-picker.html?v=f9802318 security
    • Resource “list_pages” now points somewhere else: ui://views/apps-sdk/page-picker.html?v=f80b1d11 → ui://views/ext-apps/page-picker.html?v=f80b1d11 security
    • Tool “report_bug” rewrote its description, which is the text the model reads security
    • Server version: 0.8.5 → 0.8.6 functional
    • Server version: 0.8.4 → 0.8.5 functional
    • “get_analytics” reworded the description of “include” cosmetic
    • “report_bug” reworded the description of “kind” cosmetic
  • 2 Nov 26 0

    We did not load change detail this far back for this component, so this day may have recorded more than is shown.

    • Stability: 0.83 → fail ▼ security
    • Tool “approve_suggestion” was removed ▼ security
    • Tool “decline_suggestion” was removed ▼ security
    • Tool “merge_suggestion” was removed ▼ security
    • Tool “support_inbox” was removed ▼ security
    • Tool “decompose_analyze” was removed ▼ security
    • The server rewrote its instructions, which are the text every model session reads security
    • The server changed its declared name: paige → dotsy security
    • Tool “claim_site” rewrote its description, which is the text the model reads security
    • Tool “get_report” rewrote its description, which is the text the model reads security
    • Tool “list_my_sites” rewrote its description, which is the text the model reads security
    • Tool “reply_to_report” rewrote its description, which is the text the model reads security
    • Tool “report_bug” rewrote its description, which is the text the model reads security
    • Tool “set_analytics_provider” rewrote its description, which is the text the model reads security
    • Tool “start_site” rewrote its description, which is the text the model reads security
    • Tool “update_site” rewrote its description, which is the text the model reads security
    • Tool “publish_site” rewrote its description, which is the text the model reads security
    • Tool “get_site_build_progress” rewrote its description, which is the text the model reads security
    • Tool “support_inbox” is now declared destructive security
    • Tool “restore_version” is now declared destructive security
    • Tool “graduate_site” is now declared destructive security
    • “get_skill” dropped the required parameter “context” ▼ functional
    • “start_site” dropped the required parameter “context” ▼ functional
    • “list_skills” dropped the required parameter “context” ▼ functional
    • Schema quality: 208 → 147 ▲ functional
    • Schema quality: 208 → 161 ▲ functional
    • Too many changes on this day to record them all, so 157 were dropped functional
    • Server version: 0.8.1 → 0.8.4 functional
    • Server version: 0.3.0 → 0.8.1 functional
    • New tool “moderate_suggestion” functional
    • “add_custom_domain” reworded the description of “context” cosmetic
    • “batch_patch_content” reworded the description of “context” cosmetic
    • “bulk_put_assets” reworded the description of “context” cosmetic
    • “create_site” reworded the description of “context” cosmetic
    • “delete_content” reworded the description of “context” cosmetic
    • “delete_draft_test” reworded the description of “context” cosmetic
    • “delete_route” reworded the description of “context” cosmetic
    • “delete_site” reworded the description of “context” cosmetic
    • “discard_drafts” reworded the description of “context” cosmetic
    • “estimate_test” reworded the description of “context” cosmetic
    • “find_replace” reworded the description of “context” cosmetic
    • “get_analytics” reworded the description of “context” cosmetic
    • “get_asset” reworded the description of “context” cosmetic
    • “get_board” reworded the description of “context” cosmetic
    • “get_collection_schema” reworded the description of “context” cosmetic
    • “get_custom_domain_connect” reworded the description of “context” cosmetic
    • “get_menu_doc” reworded the description of “context” cosmetic
    • “get_site” reworded the description of “context” cosmetic
    • “get_site_manifest” reworded the description of “context” cosmetic
    • “get_structure_status” reworded the description of “context” cosmetic
    • “graduate_site” reworded the description of “context” cosmetic
    • “list_assets” reworded the description of “context” cosmetic
    • “list_collections” reworded the description of “context” cosmetic
    • “list_content” reworded the description of “context” cosmetic
    • “list_ideas” reworded the description of “context” cosmetic
    • “list_notifications” reworded the description of “context” cosmetic
    • “patch_route” reworded the description of “context” cosmetic
    • “preflight_site” reworded the description of “context” cosmetic
    • “promote_experiment” reworded the description of “context” cosmetic
    • “publish_site” reworded the description of “context” cosmetic
    • “put_collection_schema” reworded the description of “context” cosmetic
    • “put_goals” reworded the description of “context” cosmetic
    • “put_menu_item” reworded the description of “context” cosmetic
    • “put_post” reworded the description of “context” cosmetic
    • “refresh_custom_domain” reworded the description of “context” cosmetic
    • “remove_votes” reworded the description of “context” cosmetic
    • “rename_content” reworded the description of “context” cosmetic
    • “rename_site” reworded the description of “context” cosmetic
    • “reorder_menu” reworded the description of “context” cosmetic
    • “report_bug” reworded the description of “context” cosmetic
    • “report_bug” reworded the description of “site” cosmetic
    • “review_changes” reworded the description of “context” cosmetic
    • “search_content” reworded the description of “context” cosmetic
    • “set_analytics_provider” reworded the description of “context” cosmetic
    • “set_custom_code” reworded the description of “context” cosmetic
    • “set_experiment_note” reworded the description of “context” cosmetic
    • “set_item_status” reworded the description of “context” cosmetic
    • “set_primary_custom_domain” reworded the description of “context” cosmetic
    • “share_section” reworded the description of “context” cosmetic
    • “start_edit_session” reworded the description of “context” cosmetic
    • “start_test” reworded the description of “handsOff” cosmetic
    • “structure_site_apply” reworded the description of “context” cosmetic
    • “update_site” reworded the description of “context” cosmetic
    • “update_site” reworded the description of “signature” cosmetic
    • “submit_feedback” reworded the description of “context” cosmetic
    • “decline_suggestion” reworded the description of “context” cosmetic
    • “get_report” reworded the description of “context” cosmetic
    • “claim_site” reworded the description of “guestToken” cosmetic
    • “list_form_submissions” reworded the description of “context” cosmetic
    • “revert_change” reworded the description of “context” cosmetic
    • “import_site_from_url” reworded the description of “context” cosmetic
    • “list_votes” reworded the description of “context” cosmetic
    • “approve_suggestion” reworded the description of “context” cosmetic
    • “get_account_context” reworded the description of “workspace” cosmetic
    • “apply_changeset” reworded the description of “guestToken” cosmetic
    • “support_inbox” reworded the description of “context” cosmetic
    • “preview_page” reworded the description of “context” cosmetic
    • “bulk_put_content” reworded the description of “context” cosmetic
    • “reply_to_report” reworded the description of “context” cosmetic
    • “adapt_site_apply” reworded the description of “context” cosmetic
    • “list_versions” reworded the description of “context” cosmetic
    • “publish_site” reworded the description of “feedback” cosmetic
    • “list_goals” reworded the description of “context” cosmetic
    • “get_adapt_status” reworded the description of “context” cosmetic
    • “get_site_outline” reworded the description of “context” cosmetic
    • “get_content” reworded the description of “context” cosmetic
    • “reapply_custom_domain_oauth” reworded the description of “context” cosmetic
    • “get_form_submission” reworded the description of “context” cosmetic
    • “get_site” reworded the description of “guestToken” cosmetic
    • “list_content” reworded the description of “guestToken” cosmetic
    • “update_collection” reworded the description of “context” cosmetic
    • “structure_site_analyze” reworded the description of “context” cosmetic
    • “get_account_context” reworded the description of “context” cosmetic
    • “inspect_collection” reworded the description of “context” cosmetic
    • “get_menu” reworded the description of “context” cosmetic
    • “list_suggestions” reworded the description of “context” cosmetic
    • “wait_for_custom_domain” reworded the description of “context” cosmetic
    • “patch_route” dropped the optional parameter “nav” cosmetic
    • “patch_route” dropped the optional parameter “navLabel” cosmetic
    • “put_route” dropped the optional parameter “nav” cosmetic
    • “put_route” dropped the optional parameter “navLabel” cosmetic
    • “remove_votes” dropped the optional parameter “guestToken” cosmetic
    • “get_structure_status” dropped the optional parameter “guestToken” cosmetic
    • “graduate_site” dropped the optional parameter “guestToken” cosmetic
    • “get_collection_schema” dropped the optional parameter “guestToken” cosmetic
    • “get_adapt_status” dropped the optional parameter “guestToken” cosmetic
    • “put_collection_schema” dropped the optional parameter “guestToken” cosmetic
    • “delete_content” dropped the optional parameter “guestToken” cosmetic
    • “optimize_assets” dropped the optional parameter “guestToken” cosmetic
    • “structure_site_analyze” dropped the optional parameter “guestToken” cosmetic
    • “inspect_collection” dropped the optional parameter “guestToken” cosmetic
    • “set_custom_code” dropped the optional parameter “guestToken” cosmetic
    • “start_test” dropped the optional parameter “guestToken” cosmetic
    • “review_changes” dropped the optional parameter “guestToken” cosmetic
    • “list_ideas” dropped the optional parameter “guestToken” cosmetic
    • “list_assets” dropped the optional parameter “guestToken” cosmetic
    • “delete_asset” dropped the optional parameter “guestToken” cosmetic
    • “reindex_collection” made “context” optional cosmetic
    • “patch_route” made “context” optional cosmetic
    • “add_custom_domain” made “context” optional cosmetic
    • “list_ideas” made “context” optional cosmetic
    • “get_site_manifest” made “context” optional cosmetic
    • “inspect_collection” made “context” optional cosmetic
    • “rename_content” made “context” optional cosmetic
    • “get_site_outline” made “context” optional cosmetic
    • “promote_experiment” made “context” optional cosmetic
    • “update_collection” made “context” optional cosmetic
    • “refresh_custom_domain” made “context” optional cosmetic
    • “put_menu_doc” made “context” optional cosmetic
    • “verify_page” made “context” optional cosmetic
    • “preflight_site” made “context” optional cosmetic
    • “get_adapt_status” made “context” optional cosmetic
    • “start_test” made “context” optional cosmetic
    • “adapt_site_apply” made “context” optional cosmetic
    • “merge_suggestion” made “context” optional cosmetic
    • “add_idea” made “context” optional cosmetic
    • “put_menu_item” made “context” optional cosmetic
    • “put_post” made “context” optional cosmetic
    • “get_activity” made “context” optional cosmetic
    • “publish_site” made “context” optional cosmetic
    • “list_goals” made “context” optional cosmetic
    • “patch_content” made “context” optional cosmetic
    • “get_board” made “context” optional cosmetic
    • “search_content” made “context” optional cosmetic
    • “put_route” made “context” optional cosmetic
    • “decline_suggestion” made “context” optional cosmetic
  • 31 Oct 26 +1

    We did not load change detail this far back for this component, so this day may have recorded more than is shown.

  • 29 Oct 26 +1

    We did not load change detail this far back for this component, so this day may have recorded more than is shown.

  • 27 Oct 26 +1

    We did not load change detail this far back for this component, so this day may have recorded more than is shown.

  • 26 Oct 26 +5

    We did not load change detail this far back for this component, so this day may have recorded more than is shown.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Probed https://mcp.dotsy.ai/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=dotsy.ai CN=WE1,O=Google Trust Services,C=US 5 Oct 2026 3 Jan 2027 ECDSA 256 ECDSA-SHA256 62cefc9561d94387134b2a26d7b70486
SANs: dotsy.ai, *.dotsy.ai
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of mcp.dotsy.ai. — Not signed

Zone DS Keys Algorithms Outcome
. Trust anchor 20326, 38696 8, 8 Verified
ai. DS published 1814, 3799 8, 8 Verified
dotsy.ai. No DS Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://mcp.dotsy.ai/.well-known/oauth-protected-resource/mcp"

Bearer resource_metadata="https://mcp.dotsy.ai/.well-known/oauth-protected-resource/mcp"

Protected resource metadata

Document https://mcp.dotsy.ai/.well-known/oauth-protected-resource/mcp
Retrieved Yes
Resource https://mcp.dotsy.ai/mcp
Authorisation server https://app.dotsy.ai

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://mcp.dotsy.ai/mcp Verified 200
http (plaintext) http://mcp.dotsy.ai/mcp HTTPS enforced 301 https://mcp.dotsy.ai/mcp
MCP tools · 117 exposed · ~18,091 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
set_experiment_note ~90

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

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
experimentIdstringyes–
note–yesThe learning, in plain words (≤500 chars, multiline ok) — null clears it.
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

set_item_status ~188

Change a roadmap/board item status (stamps dates; on release drafts the changelog post and links both ways). Never hand-edit *At, daysToRelease, or votes.

NameTypeReqDescription
atstring–ISO date for the status stamp (backfill).
collectionstring–Board collection (default "roadmap").
contextstring–Why you're calling this (activity log).
draftChangelogboolean–Default true when the board defines a changelog collection.
keystringyesContent key, e.g. roadmap/my-feature.html
publishboolean–Publish the touched keys after staging.
replystring–Decline reply when moving to an archived state.
sitestringyesSite slug, e.g. acme-studio
statusstringyesOne of the board states from get_collection_schema.

No output schema declared.

No examples provided.

set_primary_custom_domain ~68

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

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
hoststringyesConnected hostname to make primary
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

share_section ~656

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, nothing written): share with keys, then again under the same name from a page that still has a copy; for every page then move with name + scope every_page + keys (max-1 pages a call; put all hide on the first) until all are moved. Always a draft (publish_site to go live; undo: revert_change).

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
dryRunboolean–Default true: report what would change and write nothing. false: stage the change as a draft (publish_site makes it live).
guestTokenstring–Guest token from start_site (pgg_…). Omit when signed in with OAuth.
hidearray–every_page: pages that should not show it (they keep their own copy). Send them with the first move, never later.
ifMatchstring–The page's content hash (analyze's sourceEtag). If the page changed since, nothing is written.
keepLayoutboolean–With selectors: wrapper gets style="display:contents" so a flex/grid parent lays the run out as before. Default true.
keysarray–Pages with an exact copy to share it on (analyze's matches.keys). Omit for every exact copy. The source page is always included.
namestring–With sourceKey + selector: the new section's name (default: proposed). Alone: the existing section to re-place.
scopestring–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.
selectorstring–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.
selectorsarray–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.
showarray–Pages that should show it again (removes their marker).
similararray–Pages with a similar copy (analyze's similar.keys) that take the shared version, losing their own wording. Default none.
sitestringyesSite slug, e.g. acme-studio
sourceKeystring–Content key of the page the element is on, e.g. 'about.html'.
wrapTagstring–With selectors: the wrapper. Default footer when the run ends the page content, else section.

No output schema declared.

No examples provided.

stage_content_chunk ~126

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.

NameTypeReqDescription
bodystringyes–
contentTypestring––
contextstring–Why you're calling this (activity log).
finalizeboolean––
seqintegeryes–
sitestringyesSite slug, e.g. acme-studio
stagingIdstring––

No output schema declared.

No examples provided.

start_edit_session ~83

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

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
pathstring––
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

start_site ~50

Start one draft site with no dotsy account. Returns slug + guestToken — pass guestToken on every later tool call until claim_site.

NameTypeReqDescription
purposestring––
titlestring––

No output schema declared.

No examples provided.

start_test ~220

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

NameTypeReqDescription
changeNotestring–One line on what the variant changes, shown on the test card (≤120 chars).
contextstring–Why you're calling this (activity log).
goalIdstringyes–
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, old page kept as a draft; or after 30…
hypothesisstring––
namestring––
pathstringyes–
sitestringyesSite slug, e.g. acme-studio
sourcestringyes–
weightsarray––

No output schema declared.

No examples provided.

structure_site_analyze ~172

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

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
fullboolean–Return the full manifest incl. per-page HTML samples (default: compacted — etag/action/counts kept, samples truncated — to fit the token budget).
persistboolean–First call: false (preview only). true only after user confirms editable/CMS mode.
profileIdstring––
refreshManifestboolean–Replace persisted manifest when true.
sampleLimitinteger––
scopestring–Default flat-only; analyze clusters flat keys only.
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

structure_site_apply ~212

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

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
ifMatchstringyesManifest etag from structure_site_analyze or get_structure_status.
keysarray–Required when scope is keys.
modestring–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 re…
overridesobject––
restructureboolean–Required true when scope all and site has structured pages.
scopestring––
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

submit_feedback ~113

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

NameTypeReqDescription
categorystringyesmissing_tool | blocking_error | extra_round_trips | confusing_response | workaround | other
contextstring–Why you're calling this (activity log).
descriptionstring––
findingsarray––
impactPercentintegeryes–
sitestringyesSite slug, e.g. acme-studio
suggestedImprovementstring––
titlestringyes–

No output schema declared.

No examples provided.

undo_publish ~164

Take back the last publish at once: restores the version before it for the pages that publish changed and publishes them, and the undone changes stay as unpublished changes (`restaged`). On a live-mode site nothing is kept (its next save would publish it again): the answer has `redo.version` — restore_version with that version and publish: true brings it back. publishVersion = the version publish_site returned. Fails with not_latest if another publish landed since. If its publish fails, the undo stays as unpublished changes — publish_site finishes it.

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
publishVersionintegeryesThe version the publish to undo returned.
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

update_brief ~546

Update `_intent/site.md` (site brief) or a page brief when `page` is set. See field descriptions for rules, notes, and head enums.

NameTypeReqDescription
appendHandoffstring–Append a hand-off log line — site brief only; ignored when page is set.
bodystring–Replace narrative body (site ≤50k chars; page ≤10k).
contextstring–Why you're calling this (activity log).
goalstring–Current goal (site ≤4k chars; page ≤2k).
guestTokenstring–Guest token from start_site (pgg_…). Omit when signed in with OAuth.
head––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 (st…
notes––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).
pagestring–Content key — targets that page's brief (`_intent/pages/<key>.md`). Omit for the site brief.
removeRulesarray–Ids of rules or guidelines to remove (site brief only).
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 Guideline). A supported check (title-max…
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

update_collection ~205

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.

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
keystringyesCollection key exactly as list_collections returned it, e.g. "posts" or "blog/" (a hand-typed key may 404 or get silently normalized).
name––Display name (≤80 chars). null resets to the derived name.
noun––Singular noun for one item, e.g. "post" (≤40 chars). null resets to the derived noun.
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

update_site ~593

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: pill|seal, side: right|left}); it is live immediately. trailingSlash (ignore|never|always) sets the page URL form: the other form 301s to it and canonicals/sitemap use it; live immediately. ownSeoFiles: true lets the next publish use the site's own robots.txt that blocks the whole site (Disallow: /) and its own static sitemap.xml (replaces the generated one, collection pages included); a robots.txt without Disallow: / is used anyway. aiTrain (true or false) says whether AI training crawlers may use the live site; false asks them not to, true allows them (the default). Live immediately.

NameTypeReqDescription
aiTrainboolean–Whether AI training crawlers may use the live site. true (the default) allows them. false asks them not to. Live immediately, no publish needed. Same callers who can set trailingSlash can set this.
contextstring–Why you're calling this (activity log).
editingModestring–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…
keyConventionstring––
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, which replaces the generated one (collec…
signatureobject–"Made with dotsy" signature badge. Takes effect on the live site immediately, no publish needed.
sitestringyesSite slug, e.g. acme-studio
titlestring––
trailingSlashstring–Page URL form. 'ignore' (default): /blog and /blog/ both serve the page. 'never': /blog/ 301s to /blog. 'always': /blog 301s to /blog/. The canonical tag and sitemap use the same form. Live immediate…

No output schema declared.

No examples provided.

verify_page ~210

Pre-publish lint (tags, assets, layout, SEO, speed and accessibility). Summary first: health issues grouped by code, each with fix:{tool,args,fill?} — supply the fill args, then call. health.summary counts are whole-site (groups/codes filter only issues and assets). Pair with preview_page — see get_skill('verify').

NameTypeReqDescription
codesarray–Only these health codes, e.g. perf_image_heavy.
contextstring–Why you're calling this (activity log).
detailstring–summary (default): grouped by code, clean pages counted. full: per-page lists.
groupsarray–Only these groups: speed = perf_*, a11y = a11y_*, links = link_* + content_*. Omit for all.
pathsarray–Routes to check; omit to verify every route on the site.
sitestringyesSite slug, e.g. acme-studio

No output schema declared.

No examples provided.

wait_for_custom_domain ~116

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

NameTypeReqDescription
contextstring–Why you're calling this (activity log).
hoststringyesHostname to wait for, e.g. www.example.com
intervalSecinteger–Seconds between polls (default 30, min 10, max 60).
sitestringyesSite slug, e.g. acme-studio
timeoutSecinteger–Max seconds to wait (default 300, max 600).

No output schema declared.

No examples provided.

Install

How do I install the dotsy MCP server?

dotsy is a hosted endpoint at https://mcp.dotsy.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · mcp.dotsy.ai

# add to Claude Code
claude mcp add --transport http ai-dotsy-mcp 'https://mcp.dotsy.ai/mcp'
Common questions

What is the dotsy MCP server?

dotsy is an MCP server listed in the public MCP registry as ai.dotsy/mcp. Build and publish static sites on dotsy with draft-first MCP tools, OAuth Connect, and API keys. This page covers its hosted endpoint (https://mcp.dotsy.ai/mcp).

Is the dotsy MCP server safe to use?

dotsy scores 90 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the dotsy MCP server expose?

dotsy exposes 117 tools: create_site, get_site, update_brief, get_plan, get_analytics, and 112 more. Their descriptions and schemas cost roughly 18,091 tokens of context every time the server is loaded.

Does the dotsy MCP server require authentication?

Yes. dotsy asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the dotsy MCP server still maintained?

dotsy is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What did VerifyMCP test on the dotsy MCP server?

VerifyMCP ran 14 checks on dotsy, covering TLS certificate, Authorization, HTTPS, HSTS header and 10 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.