deed.page
by deed.page · remote · no sign-in to list tools · v1.9.9 · published by page.deed
Publish permanent static sites via MCP/REST. 24 tools. No account or claim link.
24 tools: 12 can delete or cancel things, 2 change things and 10 only read.
Scanned Oct 22, 2026
- Deletes or cancels12Claude Code: deny: see these tools
- Can't be undone0Claude Code: ask
- Changes things2Claude Code: ask: see these tools
- Only reads10Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http deed-page https://deed.page/mcpFindings
Matches of fixed checks, with the text they matched.
- Infopublish_site
The description mentions "credential".
What this check looks forMatched text
description: "...cted_version. Malware, executables, and credential-harvesting pages return content_rejecte..."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
24 tools
Deletes or cancels 12Claude Code: deny
add_domainAttaches a hostname to a slug owned by the token and returns the DNS records to create: a CNAME for a subdomain, an A record or an ALIAS record for an apex (one of those, not both)…No findings
Why it is in this group
- The name "add_domain" says "add": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Attaches a hostname to a slug owned by the token and returns the DNS records to create: a CNAME for a subdomain, an A record or an ALIAS record for an apex (one of those, not both), and every TXT record. Inputs: slug, domain, and token. Status starts at pending_dns until DNS and the certificate are ready. Free allows 1 hostname, Hobby 3, Pro 20. deed.page names are rejected.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
- title: Attach a custom domain
create_webhookRegisters an http or https URL for the events site.published, site.version_restored, site.deleted, site.taken_down, domain.active, and report.received.No findings
Why it is in this group
- The name "create_webhook" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Registers an http or https URL for the events site.published, site.version_restored, site.deleted, site.taken_down, domain.active, and report.received. Inputs: url, optional events, and token. Returns the webhook id and an HMAC secret once. Free allows 1 webhook, Hobby 5, Pro 20. Private, internal, and localhost targets are rejected. Delivery is best-effort, with up to 3 attempts. API documentation: https://deed.page/docs.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
- title: Register a webhook
delete_sitePermanently removes a slug owned by the token and detaches its custom hostnames.No findings
Why it is in this group
- The name "delete_site" says "delete": a word for removing or ending something.
- The description says "Permanently removes".
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Permanently removes a slug owned by the token and detaches its custom hostnames. The slug becomes available again. Inputs: slug and token.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Delete a site
delete_webhookDeletes one webhook.No findings
Why it is in this group
- The name "delete_webhook" says "delete": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Deletes one webhook. Inputs: id (whk_...) and token.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Delete a webhook
finalize_uploadChecks uploaded hashes, screens the new bytes, and commits one version under the slug lock.No findings
Why it is in this group
- The name "finalize_upload" says "finalize": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Checks uploaded hashes, screens the new bytes, and commits one version under the slug lock. Inputs: session (upl_...), optional expected_version, via, and token. A stale expected_version returns version_conflict and writes nothing. A bad hash returns hash_mismatch. An expired session returns session_expired.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
- title: Finalize a large upload
publish_sitePublishes files to a live permanent URL at a slug.1 finding
Why it is in this group
- The name "publish_site" says "publish": a word for a change that another call does not undo.
- The server marks it destructive (destructiveHint: true).
Findings
- Info
The description mentions "credential".
What this check looks forMatched text
description: "...cted_version. Malware, executables, and credential-harvesting pages return content_rejecte..."
Description, as the server wrote it Publishes files to a live permanent URL at a slug. Inputs: files (required), and optional slug, spa, ttl_seconds, merge, expected_version, via, token, listed, category, tags, title, and description. Paths are stored exactly. Returns url, path_url, slug, version, listing, and token on the first anonymous publish. On deed.page, url and path_url are both https://{slug}.deed.page/. A lost token has no recovery unless an optional recovery email was attached. When expected_version does not match the live version, the result is version_conflict and nothing is written. A racing publish of the same slug returns version_conflict even without expected_version. Malware, executables, and credential-harvesting pages return content_rejected and are not stored. .bin is blocked by file type (it often has no MZ or ELF header). A raw octet-stream body is screened as one file. listed defaults to false, so the slug stays out of the public gallery unless listed is true. Password-protected sites cannot be listed.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
- title: Publish a site
remove_domainRemoves a hostname so requests to that host no longer serve the site.No findings
Why it is in this group
- The name "remove_domain" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Removes a hostname so requests to that host no longer serve the site. Inputs: domain, optional slug, and token. When slug is set, the hostname must already be attached to that slug.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
- title: Remove a custom domain
restore_versionCreates a new version whose files equal a retained version, without uploading those files again.No findings
Why it is in this group
- The description's first verb is "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Creates a new version whose files equal a retained version, without uploading those files again. Inputs: slug, version, optional expected_version, and token. When expected_version does not match the live version, the result is version_conflict and nothing is written. The previous permalink keeps serving until retention drops it.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: true
- title: Restore a retained version
revoke_tokenRevokes owner tokens.No findings
Why it is in this group
- The name "revoke_token" says "revoke": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Revokes owner tokens. Inputs: token, and optional scope. Scope "current" (the default) revokes the token that was sent. Scope "all" revokes every token for that principal, including any overlap window. A later request with a revoked token returns 401 token_revoked, which is distinct from 403 suspended. Sites stay online. Without a recovery email, a revoked token cannot update them.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Revoke an owner token
rotate_tokenIssues a new token for the same principal.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Issues a new token for the same principal. Every site carries over. Inputs: token, and optional overlap_seconds from 0 to 300. The previous token stops working immediately when overlap_seconds is omitted or 0. During a non-zero overlap window both tokens work. After that window the previous token returns 401 token_revoked. The new token is returned once.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: false
- openWorldHint: false
- title: Rotate the owner token
set_site_accessChanges the access setting stored for a slug on deed.page.No findings
Why it is in this group
- The name "set_site_access" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Changes the access setting stored for a slug on deed.page. Inputs: slug, password, and token. password is 8 to 200 characters, or null to clear the password. The call writes a scrypt hash into the site record on deed.page, or removes that hash, and contacts no outside system. Setting a password is available on Hobby and Pro; Free returns plan_required. Clearing is allowed on every plan.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: false
- title: Set or clear a site password
update_siteReplaces the files of a slug owned by the token, or, when merge is true, adds and overwrites only the paths sent.No findings
Why it is in this group
- The name "update_site" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).
Description, as the server wrote it Replaces the files of a slug owned by the token, or, when merge is true, adds and overwrites only the paths sent. Inputs: slug, files, and optional spa, merge, expected_version, via, token, listed, category, tags, title, and description. Returns url, path_url, slug, listing, and a new version. When expected_version does not match the live version, the result is version_conflict and nothing is written. Two racing updates return version_conflict even without expected_version. listed defaults to false. Password-protected sites cannot be listed. A new version of a listed slug runs the gallery checks again.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: true
- idempotentHint: true
- openWorldHint: true
- title: Update a site
Changes things 2Claude Code: ask
plan_uploadAccepts a file manifest and returns which hashes are already stored, a direct upload URL for each missing hash, and a session id.No findings
Why it is in this group
- The name "plan_upload" says "upload": a word for a change.
Description, as the server wrote it Accepts a file manifest and returns which hashes are already stored, a direct upload URL for each missing hash, and a session id. Inputs: files as {path, sha256, size, content_type?}, and optional slug, spa, merge, ttl_seconds, expected_version, via, and token. Applies when the files are larger than about 4 MB, or when each sha256 is already known. Does not publish by itself. Per-site size limits are unchanged.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: false
- openWorldHint: true
- title: Plan a large upload
set_listingSets or clears the public gallery listing for a slug.No findings
Why it is in this group
- The name "set_listing" says "set": a word for a change.
Description, as the server wrote it Sets or clears the public gallery listing for a slug. Inputs: slug, listed, and when listed is true a category, title, description, and optional tags (at most 5), plus token. Returns listed, status, category, tags, title, and description. listed false removes the slug from the gallery immediately. Password-protected sites cannot be listed. A new version of the site runs the gallery checks again. Text is checked on deed.page, and also with the OpenAI moderation API when OPENAI_API_KEY is set.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
- title: Set gallery listing
Only reads 10Claude Code: allow
domain_statusReturns the verification status of a custom domain and refreshes verification, DNS config, and certificate state.No findings
Why it is in this group
- The name "domain_status" says "status": a word for reading.
Description, as the server wrote it Returns the verification status of a custom domain and refreshes verification, DNS config, and certificate state. Inputs: slug, domain, and token. status is pending_dns, verifying, issuing_cert, active, or error. dns_records are the records to create. An error includes the reason.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
- title: Check custom domain status
get_manifestReturns the canonical manifest for a site version: paths, sha256, sizes, version, slug, and created_at, plus an Ed25519 signature.No findings
Why it is in this group
- The name "get_manifest" says "get": a word for reading.
Description, as the server wrote it Returns the canonical manifest for a site version: paths, sha256, sizes, version, slug, and created_at, plus an Ed25519 signature. signature is null when the server has no signing key. Inputs: slug, and optional version. When version is omitted, the result is the live site. Public keys are published at /.well-known/deed-signing-keys.json. No token is required.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Get a signed version manifest
get_siteReturns whether a slug is live, plus its URL, version, size, and timestamps.No findings
Why it is in this group
- The name "get_site" says "get": a word for reading.
Description, as the server wrote it Returns whether a slug is live, plus its URL, version, size, and timestamps. Input: slug. No token is required.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
- title: Get site info
get_upgrade_linkReturns a Stripe Checkout URL for the Hobby plan ($3/mo) or the Pro plan ($15/mo), tied to the token.No findings
Why it is in this group
- The name "get_upgrade_link" says "get": a word for reading.
Description, as the server wrote it Returns a Stripe Checkout URL for the Hobby plan ($3/mo) or the Pro plan ($15/mo), tied to the token. Inputs: plan (hobby or pro), token, optional how_heard (at most 200 characters, stored on the owner), and optional upgrade_trigger (custom_domain_limit when this follows a custom-domain plan limit, otherwise manual). The call does not charge; payment happens on the returned Checkout page.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: true
- title: Get a paid-plan checkout link
list_domainsReturns custom hostnames on one slug, or on every site the token owns when slug is omitted.No findings
Why it is in this group
- The name "list_domains" says "list": a word for reading.
Description, as the server wrote it Returns custom hostnames on one slug, or on every site the token owns when slug is omitted. Inputs: token, and optional slug. Status is the last checked value.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: List custom domains
list_sitesReturns every live site owned by the token, with URLs and versions.No findings
Why it is in this group
- The name "list_sites" says "list": a word for reading.
Description, as the server wrote it Returns every live site owned by the token, with URLs and versions. Input: token, or an Authorization bearer header.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
- title: List my sites
list_versionsReturns every retained version of a slug owned by the token, newest first.No findings
Why it is in this group
- The name "list_versions" says "list": a word for reading.
Description, as the server wrote it Returns every retained version of a slug owned by the token, newest first. Inputs: slug and token. Each entry includes version, created_at, file_count, bytes, kind (publish, merge, or restore), restored_from, and a public permalink. Free keeps 10 versions, Hobby 50, Pro unlimited.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: List retained versions
list_webhooksReturns the webhook URLs registered for the token.No findings
Why it is in this group
- The name "list_webhooks" says "list": a word for reading.
Description, as the server wrote it Returns the webhook URLs registered for the token. Secrets are not included. Input: token.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: List webhooks
site_analyticsReturns owner-only cookieless counts for a slug: views per UTC day, top paths, top referrer hosts, and AI crawler counts by user-agent family.No findings
Why it is in this group
- The description's first verb is "return": a word for reading.
Description, as the server wrote it Returns owner-only cookieless counts for a slug: views per UTC day, top paths, top referrer hosts, and AI crawler counts by user-agent family. Inputs: slug, optional from and to as YYYY-MM-DD (default the last 7 days, maximum 90), and token. The accuracy field describes under-counting. No raw IP or full user agent is stored.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
- title: Site analytics
whoamiReturns the plan, limits, the number of sites the token owns, and the number of custom hostnames attached.No findings
Why it is in this group
- The name "whoami" says "whoami": a word for reading.
Description, as the server wrote it Returns the plan, limits, the number of sites the token owns, and the number of custom hostnames attached. Input: token.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
- title: Show plan and quota
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.9.9. Values in angle brackets are yours to fill in.
claude mcp add --transport http deed-page https://deed.page/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__deed-page__get_site",
"mcp__deed-page__list_sites",
"mcp__deed-page__whoami",
"mcp__deed-page__get_upgrade_link",
"mcp__deed-page__list_versions",
"mcp__deed-page__list_domains",
"mcp__deed-page__domain_status",
"mcp__deed-page__get_manifest",
"mcp__deed-page__site_analytics",
"mcp__deed-page__list_webhooks"
],
"ask": [
"mcp__deed-page__plan_upload",
"mcp__deed-page__set_listing"
],
"deny": [
"mcp__deed-page__publish_site",
"mcp__deed-page__update_site",
"mcp__deed-page__delete_site",
"mcp__deed-page__rotate_token",
"mcp__deed-page__revoke_token",
"mcp__deed-page__restore_version",
"mcp__deed-page__add_domain",
"mcp__deed-page__remove_domain",
"mcp__deed-page__finalize_upload",
"mcp__deed-page__set_site_access",
"mcp__deed-page__create_webhook",
"mcp__deed-page__delete_webhook"
]
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as deed-page. Review it before you use it.