deed.page

page.deed/deed-page · v1.9.0 · cloud-and-infra

deed.page is healthy: it completed an MCP handshake in 2001 ms and exposes 23 tools.

Publish permanent static sites via MCP/REST. 23 tools. No account or claim link.

Endpoint: https://deed.page/mcp (streamable-http)

No repository listed · Website · JSON · Add to my inventory

Facts

Users (last 30 days)0
HandshakeHealthy
Auth neededNone
Tool count23
Latency2001 ms
Last checked (UTC)2026-10-15T13:10:18.008Z

Health history

Checked (UTC)StatusLatencyError
2026-10-15T13:10:18.008ZHealthy2001

Tools (23)

publish_siteUse this when the user wants something put online, shared as a link, or hosted. Publishes files to a live permanent URL at the chosen slug. Paths are stored exactly. Returns {url, path_url, slug, version, token?}. On deed.page, url and path_url are both https://{slug}.deed.page/. The token appears o
update_siteUse this to replace (or with merge=true, add to) the files of a slug you already own. Requires the token from the first publish. To undo, call restore_version. Returns the same shape as publish_site with a bumped version. Pass expected_version (the live vN) so a stale write returns version_conflict
get_siteUse this to check whether a slug is live and read its URL, version, size, and timestamps. Public; no token needed.
list_sitesUse this to list every live site owned by your token, with URLs and versions.
delete_siteUse this only when the user explicitly asks to take a site down. Permanently removes the slug you own and detaches its custom hostnames. The slug becomes free.
rotate_tokenUse this after a leak, or to retire a token an agent should stop using. Issues a new token for the same principal. Every site carries over. The previous token stops working immediately unless overlap_seconds is set (0 to 300). During that window both tokens work. After it, the previous token returns
revoke_tokenUse this when a token has leaked and you do not want a replacement yet. scope "current" (default) revokes the token you sent. scope "all" revokes every token for that principal, including any overlap window. A later call with a revoked token returns 401 token_revoked, not 403 suspended. Sites stay o
whoamiUse this to read your plan, limits, how many sites your token owns, and how many custom hostnames it has attached.
get_upgrade_linkUse this only when the user asks for higher limits. Returns a Stripe Checkout URL for Hobby ($3/mo) or Pro ($15/mo) tied to your token. A human must open it and pay; nothing is charged by this call.
list_versionsUse this to see every retained version of a slug you own, newest first. Each entry has version, created_at, file_count, bytes, kind (publish, merge, or restore), restored_from, and a public permalink. Free keeps 10, Hobby 50, Pro unlimited.
restore_versionUse this to undo a publish. Creates a new version whose files equal the retained version, without re-uploading. Pass expected_version (the live vN). A mismatch returns version_conflict and does not write. The old permalink keeps serving until retention drops it.
add_domainUse this when the user wants their own hostname on a site they own. Adds the hostname to the project and returns dns_records to create: a CNAME for a subdomain, an A record or an ALIAS record for an apex (create one, not both), and every TXT record. Status starts at pending_dns until DNS and the cer
list_domainsUse this to list custom hostnames on one slug, or on every site your token owns when slug is omitted. Status is the last checked value. Call domain_status to refresh it.
remove_domainUse this when the user wants a hostname detached. Removes it from the project so requests to that host no longer serve the site.
domain_statusUse this after add_domain, once DNS might have propagated. Refreshes verification, DNS config, and certificate state. status is pending_dns, verifying, issuing_cert, active, or error. dns_records are the records to create. An error includes the reason.
plan_uploadUse this when the site is larger than about 4 MB, or when you already know each file's sha256. Send a manifest of {path, sha256, size, content_type?}. Returns which hashes are already stored and a direct upload URL for each missing hash. Upload those bytes, then call finalize_upload with the session
finalize_uploadUse this after plan_upload, once every missing blob has been uploaded. Checks hashes, screens the new bytes, and commits one version under the slug lock. A stale expected version returns version_conflict and writes nothing. A bad hash returns hash_mismatch. An expired session returns session_expired
get_manifestPublic. Returns the canonical manifest (paths, sha256, sizes, version, slug, created_at) and an Ed25519 signature, or signature null when the server has no signing key. Omit version for the live site. Verify with the keys at /.well-known/deed-signing-keys.json, then hash the files served at site_url
site_analyticsOwner-only cookieless counts for a slug: views per UTC day, top paths, top referrer hosts, and AI crawler counts by user-agent family. from and to are YYYY-MM-DD (default last 7 days, max 90). The accuracy field describes under-counting. No raw IP or full user agent is stored.
set_site_accessHobby and Pro only. Sets a password (8 to 200 characters) or clears it when password is null. The hash is scrypt. Visitors get a host-only HttpOnly Secure cookie. Version permalinks and custom domains of the site are gated too. Free returns plan_required. Clearing is allowed on every plan.
create_webhookRegisters an http(s) URL for site.published, site.version_restored, site.deleted, site.taken_down, domain.active, and report.received. The HMAC secret is returned once. Free 1, Hobby 5, Pro 20. Private, internal, and localhost targets are rejected. Delivery is best-effort: 3 attempts, then stop.
list_webhooksLists webhook URLs for your token. Secrets are not included.
delete_webhookDeletes one webhook by id from list_webhooks or create_webhook.