addrbookFor publishers
← The evidence ledger

Evidence row 306258

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint 9b010986-6900-4e20-be40-a8b119857238
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
661ea21b18ec38e3611bdedaa93eb309203d8084f15907b8f5b99b8521041e2c
Leaf
0xe76b1c4f6ffb2a7fd8cd8463eb03448607d4c1dedee405a1818734a3d00bb237

What was observed

{
  "count": 26,
  "tools": [
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "domain": {
            "description": "Hostname to attach, such as docs.example.com or example.com. No scheme or path.",
            "type": "string"
          },
          "slug": {
            "description": "Slug you own.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "domain"
        ],
        "type": "object"
      },
      "name": "add_domain"
    },
    {
      "description": "Free plan only, once per token. If the user posted publicly about deed.page on X or Reddit, pass that post's URL. The server checks that the post is public, mentions deed.page or links to a deed.page site, is from the last 30 days, and was not claimed before, then raises this token's Free limits by 25 sites and to 50 MB per site. Never post on the user's behalf; only send a URL the user gives you. Hobby ($3/mo) is still the bigger upgrade: show the returned user_message, which includes the Hobby link. Inputs: url and token.",
      "inputSchema": {
        "properties": {
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          },
          "url": {
            "description": "Public post URL: https://x.com/{user}/status/{id} or https://www.reddit.com/r/{sub}/comments/{id}/...",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "claim_share_credit"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "events": {
            "description": "Events to send. Omit for all of them.",
            "items": {
              "enum": [
                "site.published",
                "site.version_restored",
                "site.deleted",
                "site.taken_down",
                "domain.active",
                "report.received"
              ],
              "type": "string"
            },
            "type": "array"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          },
          "url": {
            "description": "Public http or https URL on port 80 or 443.",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "create_webhook"
    },
    {
      "description": "Permanently removes a slug owned by the token and detaches its custom hostnames. The slug becomes available again. Inputs: slug and token.",
      "inputSchema": {
        "properties": {
          "slug": {
            "description": "Slug you own.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "type": "object"
      },
      "name": "delete_site"
    },
    {
      "description": "Deletes one webhook. Inputs: id (whk_...) and token.",
      "inputSchema": {
        "properties": {
          "id": {
            "description": "Webhook id (whk_...).",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "delete_webhook"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "domain": {
            "description": "Hostname to check.",
            "type": "string"
          },
          "slug": {
            "description": "Slug the hostname is attached to.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "domain"
        ],
        "type": "object"
      },
      "name": "domain_status"
    },
    {
      "description": "Checks uploaded hashes, screens the new bytes, and commits one version under the slug lock. Inputs: session (upl_...), optional expected_version, via, heard_from, and token. A stale expected_version returns version_conflict and writes nothing. A bad hash returns hash_mismatch. An expired session returns session_expired.",
      "inputSchema": {
        "properties": {
          "expected_version": {
            "type": "string"
          },
          "heard_from": {
            "description": "Optional. Where you or your user found deed.page, such as a skill repo, a directory, a blog post, X, or a friend. Free text, at most 200 characters. An email address, IP address, or phone number is stored as [redacted]. A URL or hostname is kept. Omit it and signup continues.",
            "type": "string"
          },
          "session": {
            "description": "Upload session id (upl_...).",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          },
          "via": {
            "description": "Optional label stored with the publish. At most 80 characters. An IP address, a URL, or an email address is not stored. A non-empty value replaces the X-Via header.",
            "type": "string"
          }
        },
        "required": [
          "session"
        ],
        "type": "object"
      },
      "name": "finalize_upload"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "slug": {
            "type": "string"
          },
          "version": {
            "description": "Optional retained version, such as \"v2\". Omit for the live version.",
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "type": "object"
      },
      "name": "get_manifest"
    },
    {
      "description": "Returns whether a slug is live, plus its URL, version, size, and timestamps. Input: slug. No token is required.",
      "inputSchema": {
        "properties": {
          "slug": {
            "description": "Slug to look up.",
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "type": "object"
      },
      "name": "get_site"
    },
    {
      "description": "Creates a Stripe Checkout URL that upgrades this token's owner to Hobby ($3/mo) or Pro ($15/mo). Call it when the user asks to upgrade, or right after a tool error that has upgrade_url / user_message (a plan limit). Show the returned checkout_url (or user_message) and the price to the user; normally the human opens it and pays. You may complete the payment yourself only if your human explicitly approved this purchase and you have a payment tool they approved. Never pay without that approval. When payment completes the same token gets the higher limits automatically, and the token's plan (plan.id) then reads hobby or pro. Inputs: plan (hobby or pro; omitted means the next plan up), token, optional how_heard (at most 200 characters, stored on the owner), and optional upgrade_trigger (the limit field from the error, custom_domain_limit, or manual). A token already on a paid plan gets portal_url instead. The call itself does not charge.",
      "inputSchema": {
        "properties": {
          "how_heard": {
            "description": "Optional note, at most 200 characters. Stored on the owner.",
            "type": "string"
          },
          "plan": {
            "description": "Plan to buy. Omit for the next plan above the current one (Free -> hobby, Hobby -> pro).",
            "enum": [
              "hobby",
              "pro"
            ],
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          },
          "upgrade_trigger": {
            "description": "The limit field of the plan-limit error that sent you here (for example publish_rate or quota_sites), custom_domain_limit, or manual.",
            "enum": [
              "manual",
              "custom_domain_limit",
              "quota_sites",
              "quota_bytes",
              "publish_rate",
              "quota_domains",
              "webhook_limit",
              "plan_required",
              "share_credit",
              "size_warning"
            ],
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "get_upgrade_link"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "slug": {
            "description": "Optional slug you own. Omit to list every hostname on this token.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_domains"
    },
    {
      "description": "Returns every live site owned by the token, with URLs and versions. Input: token, or an Authorization bearer header.",
      "inputSchema": {
        "properties": {
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_sites"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "slug": {
            "description": "Slug you own.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "type": "object"
      },
      "name": "list_versions"
    },
    {
      "description": "Returns the webhook URLs registered for the token. Secrets are not included. Input: token.",
      "inputSchema": {
        "properties": {
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_webhooks"
    },
    {
      "description": "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, heard_from, 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.",
      "inputSchema": {
        "properties": {
          "expected_version": {
            "description": "Live version this upload must match, such as \"v3\".",
            "type": "string"
          },
          "files": {
            "description": "Manifest entries. sha256 is 64 lowercase hex characters. size is the byte length.",
            "items": {
              "properties": {
                "content_type": {
                  "type": "string"
                },
                "path": {
                  "type": "string"
                },
                "sha256": {
                  "type": "string"
                },
                "size": {
                  "type": "integer"
                }
              },
              "required": [
                "path",
                "sha256",
                "size"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "heard_from": {
            "description": "Optional. Where you or your user found deed.page, such as a skill repo, a directory, a blog post, X, or a friend. Free text, at most 200 characters. An email address, IP address, or phone number is stored as [redacted]. A URL or hostname is kept. Omit it and signup continues.",
            "type": "string"
          },
          "merge": {
            "description": "Overlay these paths on the live site.",
            "type": "boolean"
          },
          "slug": {
            "description": "Exact slug, or omit for a random one.",
            "type": "string"
          },
          "spa": {
            "type": "boolean"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          },
          "ttl_seconds": {
            "type": "integer"
          },
          "via": {
            "description": "Optional label stored with the publish. At most 80 characters. An IP address, a URL, or an email address is not stored. A non-empty value replaces the X-Via header.",
            "type": "string"
          }
        },
        "required": [
          "files"
        ],
        "type": "object"
      },
      "name": "plan_upload"
    },
    {
      "description": "Publishes files to a live permanent URL at a slug. Inputs: files (required), and optional slug, spa, ttl_seconds, merge, expected_version, via, heard_from, 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.",
      "inputSchema": {
        "properties": {
          "category": {
            "description": "Gallery category. Required when listed is true.",
            "enum": [
              "Apps & tools",
              "Games",
              "Business",
              "Portfolio",
              "Docs & guides",
              "Education",
              "Events",
              "Other"
            ],
            "type": "string"
          },
          "description": {
            "description": "Gallery description, at most 300 characters. Required when listed is true.",
            "maxLength": 300,
            "type": "string"
          },
          "expected_version": {
            "description": "Live version this write is based on, such as \"v3\". If the slug is no longer at that version, the result is version_conflict and nothing is written. A racing publish of the same slug returns version_conflict even when this is omitted.",
            "type": "string"
          },
          "files": {
            "additionalProperties": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "properties": {
                    "base64": {
                      "type": "string"
                    },
                    "content": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              ]
            },
            "description": "Path map, or an array of {path, content} or {path, base64}. Paths are stored exactly as given (a single top-level directory is not removed). Text as a string, binary as {\"base64\":\"...\"}. Example: {\"index.html\":\"<!doctype html><h1>Hi</h1>\",\"img/logo.png\":{\"base64\":\"iVBOR...\"}}. Any other array is rejected.",
            "type": "object"
          },
          "heard_from": {
            "description": "Optional. Where you or your user found deed.page, such as a skill repo, a directory, a blog post, X, or a friend. Free text, at most 200 characters. An email address, IP address, or phone number is stored as [redacted]. A URL or hostname is kept. Omit it and signup continues.",
            "type": "string"
          },
          "listed": {
            "description": "Opt into the public gallery. Default false. false removes the slug immediately. Password-protected sites cannot be listed.",
            "type": "boolean"
          },
          "merge": {
            "description": "Add or overwrite only these exact paths on the existing site. Paths omitted from this call are left unchanged. Nothing is moved to the site root.",
            "type": "boolean"
          },
          "slug": {
            "description": "Exact slug matching ^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$ (lowercase letters, digits, hyphens, 1-63, no leading or trailing hyphen). Invalid slugs return slug_invalid and are not rewritten. Reserved names (hello, my-page, www, api, docs, admin, mcp, blog, app, status, and other docs examples) return slug_reserved on a new claim. A token that already owns one can still update it. Omit for a random slug.",
            "type": "string"
          },
          "spa": {
            "description": "Serve index.html for unknown paths (single-page apps).",
            "type": "boolean"
          },
          "tags": {
            "description": "Up to 5 tags. Each tag is lowercase letters, digits, and hyphens, at most 32 characters.",
            "items": {
              "type": "string"
            },
            "maxItems": 5,
            "type": "array"
          },
          "title": {
            "description": "Gallery title, at most 80 characters. Required when listed is true.",
            "maxLength": 80,
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          },
          "ttl_seconds": {
            "description": "Opt-in expiry in seconds. Omit for a permanent site.",
            "type": "integer"
          },
          "via": {
            "description": "Optional label stored with the publish. At most 80 characters. An IP address, a URL, or an email address is not stored. A non-empty value replaces the X-Via header.",
            "type": "string"
          }
        },
        "required": [
          "files"
        ],
        "type": "object"
      },
      "name": "publish_site"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "domain": {
            "description": "Hostname to remove.",
            "type": "string"
          },
          "slug": {
            "description": "Optional slug. When set, the hostname must be attached to that slug.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "domain"
        ],
        "type": "object"
      },
      "name": "remove_domain"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "expected_version": {
            "description": "Live version this restore is based on, such as \"v4\". A mismatch returns version_conflict.",
            "type": "string"
          },
          "slug": {
            "description": "Slug you own.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          },
          "version": {
            "description": "Version to copy forward, such as \"v2\".",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "version"
        ],
        "type": "object"
      },
      "name": "restore_version"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "scope": {
            "description": "current revokes only this token. all revokes every token for the principal. Default current.",
            "enum": [
              "current",
              "all"
            ],
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "revoke_token"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "overlap_seconds": {
            "description": "Seconds the previous token keeps working so an in-flight deploy can finish. Omit or 0 to invalidate it immediately. Maximum 300.",
            "maximum": 300,
            "minimum": 0,
            "type": "integer"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "rotate_token"
    },
    {
      "description": "Free-plan sites show a small 'Published with deed.page' link in the bottom-right corner; Hobby and Pro never show it. Inputs: show (boolean), optional slug, and token. With slug, the setting applies to that site; without slug, it applies to every site of the token. Only a paid plan removes the badge: on Free, show false returns plan_required with the Hobby price and a signed upgrade_url in message and user_message (show user_message to your human, do not retry), except where the badge was already off before 2026-10-25 (kept); on Hobby and Pro it changes nothing because those plans never show it. show true shows it again. Returns the stored setting and whether the badge is shown. Writes only the setting on deed.page and contacts no outside system.",
      "inputSchema": {
        "properties": {
          "show": {
            "description": "true shows the badge again. false is refused on Free (paid-plan perk) and is a no-op on Hobby and Pro.",
            "type": "boolean"
          },
          "slug": {
            "description": "Slug you own. Omit to apply to every site of this token.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "show"
        ],
        "type": "object"
      },
      "name": "set_badge"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "category": {
            "description": "Gallery category. Required when listed is true.",
            "enum": [
              "Apps & tools",
              "Games",
              "Business",
              "Portfolio",
              "Docs & guides",
              "Education",
              "Events",
              "Other"
            ],
            "type": "string"
          },
          "description": {
            "description": "Gallery description, at most 300 characters. Required when listed is true.",
            "maxLength": 300,
            "type": "string"
          },
          "listed": {
            "description": "Opt into the public gallery. Default false. false removes the slug immediately. Password-protected sites cannot be listed.",
            "type": "boolean"
          },
          "slug": {
            "description": "Slug you own.",
            "type": "string"
          },
          "tags": {
            "description": "Up to 5 tags. Each tag is lowercase letters, digits, and hyphens, at most 32 characters.",
            "items": {
              "type": "string"
            },
            "maxItems": 5,
            "type": "array"
          },
          "title": {
            "description": "Gallery title, at most 80 characters. Required when listed is true.",
            "maxLength": 80,
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "listed"
        ],
        "type": "object"
      },
      "name": "set_listing"
    },
    {
      "description": "Changes the access setting stored for a slug on deed.page. Inputs: slug, password, and token. password is 8 to 200 characters, or an empty string (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.",
      "inputSchema": {
        "properties": {
          "password": {
            "description": "New password, 8 to 200 characters. Pass an empty string (or null) to clear the password and make the site public.",
            "type": "string"
          },
          "slug": {
            "description": "Slug you own.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "password"
        ],
        "type": "object"
      },
      "name": "set_site_access"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "from": {
            "description": "First UTC day, YYYY-MM-DD. Default is 6 days before to.",
            "type": "string"
          },
          "slug": {
            "description": "Slug you own.",
            "type": "string"
          },
          "to": {
            "description": "Last UTC day, YYYY-MM-DD. Default is today.",
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "type": "object"
      },
      "name": "site_analytics"
    },
    {
      "description": "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.",
      "inputSchema": {
        "properties": {
          "category": {
            "description": "Gallery category. Required when listed is true.",
            "enum": [
              "Apps & tools",
              "Games",
              "Business",
              "Portfolio",
              "Docs & guides",
              "Education",
              "Events",
              "Other"
            ],
            "type": "string"
          },
          "description": {
            "description": "Gallery description, at most 300 characters. Required when listed is true.",
            "maxLength": 300,
            "type": "string"
          },
          "expected_version": {
            "description": "Live version this update is based on, such as \"v3\". If the site has moved on, the call returns version_conflict with no write. Omit it and a concurrent update still returns version_conflict rather than dropping files.",
            "type": "string"
          },
          "files": {
            "additionalProperties": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "properties": {
                    "base64": {
                      "type": "string"
                    },
                    "content": {
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              ]
            },
            "description": "Path map, or an array of {path, content} or {path, base64}. Paths are stored exactly as given (a single top-level directory is not removed). Text as a string, binary as {\"base64\":\"...\"}. Example: {\"index.html\":\"<!doctype html><h1>Hi</h1>\",\"img/logo.png\":{\"base64\":\"iVBOR...\"}}. Any other array is rejected.",
            "type": "object"
          },
          "listed": {
            "description": "Opt into the public gallery. Default false. false removes the slug immediately. Password-protected sites cannot be listed.",
            "type": "boolean"
          },
          "merge": {
            "description": "Keep every path you do not send, and add or overwrite only these exact paths.",
            "type": "boolean"
          },
          "slug": {
            "description": "Slug you own. Must match ^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$. Not rewritten. Reserved slugs are rejected.",
            "type": "string"
          },
          "spa": {
            "description": "Serve index.html for unknown paths.",
            "type": "boolean"
          },
          "tags": {
            "description": "Up to 5 tags. Each tag is lowercase letters, digits, and hyphens, at most 32 characters.",
            "items": {
              "type": "string"
            },
            "maxItems": 5,
            "type": "array"
          },
          "title": {
            "description": "Gallery title, at most 80 characters. Required when listed is true.",
            "maxLength": 80,
            "type": "string"
          },
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          },
          "via": {
            "description": "Optional label stored with the publish. At most 80 characters. An IP address, a URL, or an email address is not stored. A non-empty value replaces the X-Via header.",
            "type": "string"
          }
        },
        "required": [
          "slug",
          "files"
        ],
        "type": "object"
      },
      "name": "update_site"
    },
    {
      "description": "Returns the plan (plan.id is free, hobby, or pro), limits, the number of sites the token owns, and the number of custom hostnames attached. Use it to confirm a plan change after payment. Input: token.",
      "inputSchema": {
        "properties": {
          "token": {
            "description": "Bearer token returned by your first publish (deed_tok_...). Optional if the MCP client sends Authorization: Bearer.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "whoami"
    }
  ]
}

What the leaf hashes

{"body":"661ea21b18ec38e3611bdedaa93eb309203d8084f15907b8f5b99b8521041e2c","id":306258,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793056898406611,"prev":null,"subject":"9b010986-6900-4e20-be40-a8b119857238","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).

  1. 0xe76ba8b22464e6f70c03d99e39fb6ccc1239cc2ce6bdcf8c6c039d78efcd2808
  2. 0x0c74eca7ac4f60a30f9eb888d44a958e5812c8bb18379d36f783ba679fbddfa2
  3. 0x8a6cea5c508c41d2b1720a730383ba895b31030c808243baa416461791f8d890
  4. 0xf4ddebafac87b49e0a880a70bf4a6eef5ee93ba5875eefe72f1b80539c07b1fb
  5. 0xb12c95fa6f7fe89faa209813ad4ce62369d9f673eb3abaf080c3e49c9901d900
  6. 0x6bff9032c862f55bf703c2e89b9d805b28bbd21b1a7abf458a4eef882b7738a3
  7. 0xd4b353dd928ee309cf01f6daf2505c57608aa6655710fb5b75a29f41f1e6d506
  8. 0x7b7e45ae128b251899c7caff5d6e8bd37e4505c57345cfb202fc381061121c13
  9. 0xf0b16cf000c2bdd4864f7023295de00ab114d2e9edaacc06233aa643b2e5c17e
  10. 0x7deeb175e21dc795de5c6a6747c18815aec2ac086521557682cc9d301183bd2e
  11. 0x59e039ae04bb13d1c4f6760e5371456ed0590ed6a27668ea3df8a519b5fd4655
  12. 0xb866b513dd861c870688f5d1a8e434b170eaa2fafb0961d6a674d452b8e58381
  13. 0xafcc1fe54cfe00a3a1de33df127340075f22433bb89848bbc81499cd7aca5b2b
  14. 0x9bc5fc98278b9f6dc18c66c6e162aefd5244be03170d41bc5161f58ad11beed7
  15. 0x95657a7d540ed6cac0bde9995782333b2562a9a6641853269ac95148827410f0
  16. 0x5fb5dda563336cd1bc1b9f44c52b76237ae72ed2145cb9290f39f304ca7dd678
  17. 0x74a0a08e4e7ab9aa5bfbead33dec7e1c7e8e364cff69a63720d764bbe987aadc
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON