Stacktree

by stevysmith

224 downloads
Not rated
GitHub

About

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

Details

Author
stevysmith
Downloads
224
Categories
Other

- 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

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Stacktree
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

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.

publish_html

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.

update_site

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.

delete_site

Hard delete a site.

set_password

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.

create_share_link

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.

list_share_links

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.

revoke_share_link

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

set_expiry

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.

set_agentation

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.

set_email_gate

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

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_client_spaces

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).

get_design_guide

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.

set_client

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_client_space

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.

update_client_space

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_client_space

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.

get_site

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_wallet

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 }.

list_feedback

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.

resolve_feedback

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

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

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

McpServers

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

stacktree-mcp

MCP server for stacktr.ee. Publish HTML artifacts from any MCP client (Claude Desktop, Claude Code, Cursor, Continue, etc).

Install

Add to your MCP client config:

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

Generate an API key at <https://app.stacktr.ee>.

Tools

| Tool | What it does |
| ---------------- | ------------------------------------------------------------- |
| publish_html | Publish HTML; returns { url, id, expires_at, ... }. |
| update_site | Replace HTML of an existing site in place; URL is preserved. |
| delete_site | Hard delete a site. |
| set_password | Add or clear a basic-auth password. |
| set_expiry | Set hours-from-now expiry, or null for never. |
| set_agentation | Toggle the on-page Agentation feedback toolbar. |
| list_sites | List sites owned by this API key. |

Privacy defaults

Every site gets an unguessable https://stacktr.ee/p/{token}/ URL. Pass public_slug to opt into https://{slug}.stacktr.ee/.

pii_check defaults to warn — common secrets and PII shapes (emails, SSNs, credit cards, OpenAI/GitHub/Stripe API key prefixes) are flagged in the response. Pass block to refuse uploads that match.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.