MCP.so
Sign In
S

Stacktree

@stevysmith

About Stacktree

Publish HTML to a private, unguessable URL from any MCP client. Gate by password or email domain; replace in place.

Config

Add this server to your MCP-compatible client using the configuration below.

{
  "mcpServers": {
    "stacktree": {
      "command": "npx",
      "args": [
        "-y",
        "stacktree-mcp"
      ],
      "env": {
        "STACKTREE_API_KEY": "stk_live_..."
      }
    }
  }
}

Tools

21

Publish HTML to stacktr.ee. Returns { url, id, expires_at, ... }. Privacy-first defaults: unlisted token URL, plan-aware expiry (permanent on paid plans, 7 days on free — its ceiling), PII scan in block mode, strict CSP, X-Robots-Tag: noai. Pass expires_in_hours: "never" for a permanent link, which paid plans honour and a free key clamps back to 7 days; pii_check: "warn" publishes despite detected sensitive data. A free key allows 3 pages in total and deleting one does not free the slot, so past the third this returns 402 plan_lifetime_limit_exceeded; report that to the user rather than retrying.

Replace the HTML of an existing site in place. The URL stays the same. The PII pre-flight scan runs on the new content too (MCP default: block; pass pii_check: "warn" to override). A 409 managed_portal means this page is a generated client portal: it rebuilds itself from its space, so direct edits would be overwritten — the owner can "customize" it from the space settings in the dashboard, which stops regeneration for good.

Hard delete a site.

Set or clear (null) a passcode on a site. Passcodes are a paid feature: on a free key, setting one returns 402 plan_password_not_available. Clearing one always works.

Mint a share link addressed to one person. Put their name in label and every open through that link comes back attributed to it, in the dashboard and in the read-receipt email. The link skips the page passcode and can be revoked on its own. One per recipient after publish_html; for a whole mail-merge append ?to={{name}} to the page URL instead.

Share links on a page with attributed opens and last-opened time. opens counts human page opens through that link; use_count is the raw max_uses counter, not a read metric. opens is null on a plan without viewer numbers.

Kill one share link. The page and every other link keep working — cut off one recipient without re-issuing to the rest.

Set hours-from-now expiry, or null for never. The value is clamped to the plan ceiling rather than refused, so on a free key null and any value above 168 both land at 7 days from now. Check expires_at in the response.

Toggle the on-page Agentation feedback toolbar. When on, viewer annotations are collected — read them with list_feedback, fix the page with update_site, then resolve_feedback.

Restrict viewer access to a specific email domain (strict-equal match). Viewers must verify via a one-time magic link. Mutually exclusive with set_password. Pass domain: null to clear. Email gates are a paid feature: on a free key, setting one returns 402 plan_viewer_gate_not_available.

List sites owned by this API key. Viewer numbers are plan-gated: when metrics_locked is true, view_count, unique_viewers and last_viewed_at are null and only the boolean opened is meaningful. Report "someone opened this" in that case; do not guess or infer a count. Each site carries its client space (or null); filter with the client argument. Paged: when has_more is true, call again passing next_before and next_before_id as before and before_id, and repeat until has_more is false.

List the client spaces on this account: slug, name, page_count, last activity, hostname (the space’s own address, e.g. acme.theiragency.com, when one is connected) and portal_enabled (whether the space serves a generated client portal at that address). Spaces group published pages per client ("file this under Acme"). publish_html auto-creates spaces, so an empty list just means nothing has been filed yet — publish with a client to start one. Connecting an address and enabling the portal are done in the dashboard (DNS is involved).

Fetch the Stacktree house design guide for improving a published page. Call this BEFORE any request to make a page look better, more polished, more professional, or "beautiful" — it contains the assess-first workflow (including when NOT to restyle a page that already has a deliberate design), the quality floor, and the CSP constraints published pages run under. Then follow it: get_site → assess → rebuild or elevate → update_site.

File an existing site under a client space (by name or slug, auto-created), or pass client: null to detach it to a floating page. Mirrors set_password: one site, one call.

Create a client space before anything is published into it. Rarely needed: publish_html with a client argument auto-creates the space under the same casing and slug rules, so use this only when the user is setting a client up ahead of the work. Idempotent with that auto-create — an existing space matching the name or slug, in any casing, comes back instead of a duplicate. The returned slug is the space’s permanent address segment; a later rename changes the display name only.

Rename a client space, archive or unarchive it, or set the viewer gate that covers every page in the space. Omit a field to leave it untouched. A rename changes the display name only — the slug is a permanent addressing contract and never moves. Archiving keeps everything serving (pages, portal, connected address) and frees the space’s plan slot; unarchiving takes a slot back and returns 402 when the plan is full. password and allowed_email_domain gate the whole space and are inherited by pages already filed under it as well as ones published later; pass null to remove either. Setting a gate is a paid feature: on a free key it returns 402 plan_password_not_available or plan_viewer_gate_not_available. Clearing a gate, or changing one the space already carries, always works. A 409 name_taken means another active space already answers to that name — report that rather than retrying with a variation, which would leave the user with two spaces for one client.

Delete a client space. The pages filed under it are NOT deleted: they detach to floating pages and keep working on their existing URLs, so delivered work stays reachable. The space itself goes, and with it the generated portal page and any address connected to it, which stop resolving. A space-level viewer gate goes with the space too: a page that was protected only by the space passcode or email domain, and carries no gate of its own, becomes reachable by anyone holding its link. Warn the user, and set_password on the pages that have to stay private before deleting. When the user means a client is simply finished, prefer update_client_space with archived: true — archiving keeps the portal and the address live, frees the plan slot, and can be undone.

Read the current HTML source of a site you own, so you can edit it and update_site in place. Returns the exact stored index.html (not rendered or text-stripped), preserving CSS and inline charts.

Link your wallet to a Stacktree account so the pages you publish are owned there — and adopt the ones you already published. Get a LINK-XXXX code from your human (generated at stacktr.ee/wallets). First call with just { code } to get the exact message to sign; sign it with your wallet (personal_sign / EIP-191); then call again with { code, wallet, signature }.

Read viewer feedback left on a site via the Agentation toolbar. Each item has a comment plus the annotated element, selected text, intent and severity; unresolved items first. The loop: list_feedback → get_site/update_site → resolve_feedback.

Mark a feedback item as addressed after fixing the page. Optionally include a note describing the change.

Overview

What is Stacktree?

Stacktree is an MCP server for stacktr.ee that lets you publish HTML artifacts directly from any MCP client, including Claude Desktop, Claude Code, Cursor, and Continue.

How to use Stacktree?

Add the server to your MCP client configuration with the command npx -y stacktree-mcp and set the STACKTREE_API_KEY environment variable. Generate an API key at https://app.stacktr.ee. Once configured, use the server’s tools to publish, update, delete, password‑protect, set expiry, toggle a feedback toolbar, and list your sites.

Key features of Stacktree

  • Publish HTML artifacts to a unique URL
  • Update an existing site’s HTML while preserving its URL
  • Delete a site permanently
  • Add or remove basic‑auth passwords
  • Set an expiration time (or never expire)
  • Toggle the Agentation feedback toolbar on the page
  • List all sites owned by the API key
  • PII check warns (or blocks) on common secrets and PII

Use cases of Stacktree

  • Deploy AI‑generated HTML quickly from your MCP client
  • Host prototypes or demos with automatically expiring URLs
  • Share password‑protected HTML pages with collaborators
  • Manage a collection of HTML artifacts programmatically from any MCP environment

FAQ from Stacktree

How do I publish HTML?

Use the publish_html tool. It returns the site’s URL, ID, expiration time, and other metadata.

How do I update an existing site?

Use the update_site tool to replace the HTML of a site in place; the URL stays the same.

Can I password protect my sites?

Yes, the set_password tool lets you add or clear a basic‑auth password for any site.

How is privacy handled?

Every site gets an unguessable URL. The pii_check parameter defaults to warn, flagging secrets and PII in the response; you can pass block to refuse such uploads.

How do I get an API key?

Generate an API key at https://app.stacktr.ee and set it as the STACKTREE_API_KEY environment variable.

Frequently asked questions

How do I publish HTML?

Use the `publish_html` tool. It returns the site’s URL, ID, expiration time, and other metadata.

How do I update an existing site?

Use the `update_site` tool to replace the HTML of a site in place; the URL stays the same.

Can I password protect my sites?

Yes, the `set_password` tool lets you add or clear a basic‑auth password for any site.

How is privacy handled?

Every site gets an unguessable URL. The `pii_check` parameter defaults to `warn`, flagging secrets and PII in the response; you can pass `block` to refuse such uploads.

How do I get an API key?

Generate an API key at https://app.stacktr.ee and set it as the `STACKTREE_API_KEY` environment variable.

Comments

More Other MCP servers