{
  "markdown": "# stacktree-mcp\n\nMCP server for [stacktr.ee](https://stacktr.ee). Publish HTML artifacts from any MCP client (Claude Desktop, Claude Code, Cursor, Continue, etc).\n\n## Set up with an agent\n\nIf you have a coding agent open, hand it this line and it does the rest —\ninstalls, verifies the connection, and learns the tool surface:\n\n```\nFetch and follow the setup instructions at https://stacktr.ee/prompt.md\n```\n\nWorks in any agent that can fetch a URL. The instructions are plain Markdown;\nread them first if you like.\n\n## Install\n\nAdd to your MCP client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"stacktree\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"stacktree-mcp\"],\n      \"env\": { \"STACKTREE_API_KEY\": \"stk_live_...\" }\n    }\n  }\n}\n```\n\nGenerate an API key at <https://app.stacktr.ee>.\n\n## Tools\n\n| Tool               | What it does                                                                |\n| ------------------ | --------------------------------------------------------------------------- |\n| `publish_html`     | Publish HTML; returns `{ url, id, expires_at, ... }`. Pass `client` to file it under a client space. |\n| `update_site`      | Replace the HTML of an existing site in place; URL is preserved.            |\n| `get_site`         | Read a site's current HTML source — edit it, then `update_site`.            |\n| `set_password`     | Add or clear a passcode gate. Paid plans only.                              |\n| `set_expiry`       | Set hours-from-now expiry, or `null` for never. Clamped to the plan ceiling.|\n| `set_email_gate`   | Restrict viewers to an email domain (one-time magic-link verify). Paid plans only. |\n| `set_agentation`   | Toggle the on-page Agentation feedback toolbar.                             |\n| `list_sites`       | List sites owned by this API key. Paged (`has_more` + cursor); filter with `client`. |\n| `delete_site`      | Hard delete a site.                                                         |\n| `link_wallet`      | Link your wallet so pages you publish are owned by your account.            |\n| `list_feedback`    | Read viewer annotations left via the Agentation toolbar; unresolved first.  |\n| `resolve_feedback` | Mark a feedback item addressed, with an optional note.                      |\n| `set_client`       | File a page under a client space by name or slug (auto-created), or `null` to detach. |\n| `list_client_spaces` | The client spaces on the account: page counts, bound hostname, portal state. |\n| `create_client_space` | Create a space up front. Rarely needed — publishing with `client` creates one. |\n| `update_client_space` | Rename, archive, or set the space-wide viewer gate every page under it inherits. |\n| `delete_client_space` | Remove a space. Its pages detach and keep their URLs.                  |\n| `get_design_guide` | The house design guide — read it before generating or restyling a page.     |\n\n## Linking a wallet\n\nIf your agent pays for publishes from its own wallet (x402 / MPP), link that wallet to your Stacktree account so every page it publishes — past and future — is owned there:\n\n1. Your human generates a link code at <https://app.stacktr.ee/wallets>.\n2. `link_wallet({ code })` → returns the exact message to sign.\n3. Sign it with your wallet (`personal_sign`).\n4. `link_wallet({ code, wallet, signature })` → links the wallet and adopts the pages it already published.\n\n## Reading feedback\n\nTurn on the on-page toolbar with `set_agentation` and viewers can annotate the page; their comments are stored with the site. `list_feedback` returns them, unresolved first (comment, annotated element, selected text, intent, severity). Fix the page in place with `update_site` (same URL), then `resolve_feedback` to mark each item addressed, with an optional note.\n\n## Privacy defaults\n\nEvery site gets an unguessable `https://stacktr.ee/p/{token}/` URL. Pass `public_slug` to opt into `https://{slug}.stacktr.ee/`.\n\n`pii_check` defaults to `block` — uploads matching common secrets and PII shapes (emails, SSNs, credit cards, OpenAI/GitHub/Stripe API-key prefixes) are refused. Pass `warn` to publish anyway (matches are flagged in the response), or `off` to skip the scan.\n\n## What the free plan gives you\n\nA key on the free plan publishes **3 pages in total**, and each one **expires 7 days** after it is published. The count is lifetime, not concurrent: deleting a page or letting it expire does not give the slot back. `expires_in_hours: \"never\"` is clamped to the 7-day ceiling rather than refused, so always read `expires_at` off the response.\n\nPasscodes (`set_password`), email gates (`set_email_gate`) and viewer numbers are on paid plans. Hitting a ceiling returns HTTP 402 with a stable `plan_*` code in `error`:\n\n| Code | Means |\n| --- | --- |\n| `plan_lifetime_limit_exceeded` | All 3 free pages used. Deleting one does not help. |\n| `plan_site_limit_exceeded` | Active-page cap reached. |\n| `plan_password_not_available` | Passcodes are not on this plan. |\n| `plan_viewer_gate_not_available` | Email gates are not on this plan. |\n| `plan_domain_not_available` | Custom domains are not on this plan. |\n\n`GET /me` returns the calling key's own `limits` object. Read caps from there rather than hard-coding them. Current plans and prices: <https://stacktr.ee/pricing.md>.\n",
  "bytes": 5279,
  "sha": "0e3c351b2360056d08d323df6e5f65154d72a6f95c51bd9c0ad3c8be4930adff",
  "repo_slug": "stevysmith/stacktree-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_ee_stacktr_publish_399231bd/readme"
}