Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
제작자가 쓴 설명(영어 원문)
Publish HTML to private, unguessable, replace-in-place URLs from any MCP-compatible AI agent.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
웹, 데스크톱, 모바일의 Claude에서 쓸 수 있어요:
https://api.stacktr.ee/mcpClaude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"publish": {
"command": "npx",
"args": [
"-y",
"stacktree-mcp"
]
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add --transport http publish https://api.stacktr.ee/mcpclaude mcp add publish -- npx -y stacktree-mcp프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"publish": {
"url": "https://api.stacktr.ee/mcp"
}
}
}프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"publish": {
"command": "npx",
"args": [
"-y",
"stacktree-mcp"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"publish": {
"type": "http",
"url": "https://api.stacktr.ee/mcp"
}
}
}프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"publish": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"stacktree-mcp"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요:
https://api.stacktr.ee/mcp메뉴 이름은 요금제나 시기에 따라 조금 다를 수 있어요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
아직 이 서버의 도구 목록을 읽지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 6일 점검
레지스트리 이름이 도메인 stacktr.ee 기준으로 확인되었어요(레지스트리가 도메인 소유를 확인해요)
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 점검하지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요
아직 점검하지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요
아직 점검하지 않았어요. 엔드포인트를 점검할 때 도구 목록을 읽어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
둘 다 가능해요. 내 컴퓨터에 설치해도 되고, 클라우드 버전에 연결해도 돼요.
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.8.3)은 15일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. URL로 연결되기 때문에, 원격 MCP 서버를 지원하는 앱(예: 개발자 모드의 ChatGPT)에서도 쓸 수 있어요.
같은 카테고리에는: Spec Driven Development, Remote Desktop Commander, Dechonet MCP
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
30 security tools for AI agents: phishing links, exposure maps, DNS, SSL, PQC, history, pivots.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
MCP server for stacktr.ee. Publish HTML artifacts from any MCP client (Claude Desktop, Claude Code, Cursor, Continue, etc).
If you have a coding agent open, hand it this line and it does the rest — installs, verifies the connection, and learns the tool surface:
Fetch and follow the setup instructions at https://stacktr.ee/prompt.md
Works in any agent that can fetch a URL. The instructions are plain Markdown; read them first if you like.
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.
This is the stdio bridge, for clients that cannot speak streamable HTTP. If yours can, connect straight to the hosted server at https://api.stacktr.ee/mcp, which exposes the same 42 tools and takes the same key:
curl -sS -X POST https://api.stacktr.ee/mcp \
-H "Authorization: Bearer $STACKTREE_API_KEY" \ -H 'accept: application/json, text/event-stream' \ -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
No browser and no OAuth flow is required to do that: an stk_live_ key is a valid credential on the MCP endpoint, exactly as it is on the REST API. OAuth 2.1 with Dynamic Client Registration is also accepted, for connectors acting on behalf of a signed-in human; session cookies are refused. Send one credential.
No key, and no human to ask? POST https://api.stacktr.ee/provision buys one over x402. A human nearby but no browser? POST https://api.stacktr.ee/api-keys/device-code, print the returned verification_url_complete for them, and poll /api-keys/device-code/poll until it returns the key (RFC 8628).
| Tool | What it does |
|---|---|
publish_html | Publish HTML; returns { url, id, expires_at, ... }. Pass client to file it under a client space. |
update_site | Replace the HTML of an existing site in place; URL is preserved. |
get_site | Read a site's current HTML source — edit it, then update_site. |
set_password | Add or clear a passcode gate. Works on every plan. |
set_expiry | Set hours-from-now expiry, or null for never. Clamped to the plan ceiling. |
set_email_gate | Restrict viewers to an email domain (one-time magic-link verify). Paid plans only. |
set_client_feedback | Let the people you send a page to comment on it (words, images, video) and react, with no account. |
set_agentation | Older developer mark-up toolbar. Prefer set_client_feedback. |
list_sites | List sites owned by this API key. Paged (has_more + cursor); filter with client. |
delete_site | Take a page down. The link dies at once; the content is kept 30 days, then destroyed. |
restore_site | Put a deleted or expired page back at the same URL, inside those 30 days. |
claim_site | Adopt a page published without an account, using its claim_token. Same URL; a claim counts as a publish. |
get_content | Read a page back as html (exact stored source, editable) or text (stripped, cheap to read). |
get_me | This key's account, plan, counts and enforced limits. Read limits from here, never from a description. |
link_wallet | Link your wallet so pages you publish are owned by your account. |
list_feedback | Read client comments, unresolved first, each with what it is on and whether it is still on the page. |
create_share_link | Mint a link addressed to one person — every open through it is attributed to that name. |
list_share_links | The links on a page, with attributed opens and when each was last opened. |
revoke_share_link | Kill one link; the page and every other link keep working. |
resolve_feedback | Mark a feedback item addressed, with an optional note. |
set_client | File a page under a client space by name or slug (auto-created), or null to detach. |
list_client_spaces | The client spaces on the account: page counts, bound hostname, portal state. |
create_client_space | Create a space up front. Rarely needed — publishing with client creates one. |
update_client_space | Rename, archive, or set the space-wide viewer gate every page under it inherits. |
delete_client_space | Remove a space. Its pages detach and keep their URLs. |
get_design_guide | The house design guide — read it before generating or restyling a page. |
get_passcode | Show the passcode on a page you own, to send it to the client again (passcodes set since 13 September 2026). |
list_versions | Earlier versions of a page, newest first: one snapshot per update. |
restore_version | Put an earlier version back at the same URL after a bad update. |
whos_it_for | Record who a page is for and get their own link. Sends nothing. |
unopened_pages | Pages, and named people, that have not opened what was sent an hour on. |
get_revision_brief | Everything that came back on a page, as the brief for its next version. |
publish_revision | Replace a page in place and resolve the comments it answers, in one step. |
resolve_comments | Resolve several comments at once, each with a note the reviewer sees. |
request_approval | Ask named people to approve a page; one private link each. |
get_approval_status | Who has approved the version that is live now, section by section. |
list_responses | What readers sent through the forms marked on a page. |
resolve_addressed_notes | Close the reviewers' notes an update answered, with one line each. |
open_html_file | Opens an .html file in ChatGPT desktop's file viewer. Here it only echoes the file back. |
stacktree_pages | Your 25 newest pages: ChatGPT's pages panel. Same data as list_sites. |
publish_card_status | Refreshes the publish card in ChatGPT and Claude. Here it returns the page's detail. |
publish_card_open | The publish card's Open button: a 15-minute owner preview link to a page. |
If 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:
link_wallet({ code }) → returns the exact message to sign.personal_sign).link_wallet({ code, wallet, signature }) → links the wallet and adopts the pages it already published.Turn comments on with set_client_feedback and whoever you sent the link to can select words, or click an image, video or section, and leave a comment only the owner sees. list_feedback returns them, unresolved first, each with a one-line target and on_page (still in the page, or gone since an edit). Fix the page in place with update_site (same URL): its response lists which open comments no longer match the new version. Then resolve_feedback each answered one with a short note, which the client sees next to their comment.
Full policy: https://stacktr.ee/privacy. In short:
https://api.stacktr.ee, authenticated with your Stacktree API key. It collects nothing from your machine beyond that and keeps no local data.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 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.
A 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 refused on a plan that caps page lifetime, not quietly shortened: 409 expiry_clamped, nothing published, and the body carries the date the page would have got. Pass accept_clamp: true to take the ceiling, or tell the user the plan cannot make the link permanent. A *number* longer than the ceiling is shortened rather than refused, with expiry_clamped: true in the response. Either way, read expires_at_iso off the response and quote that, never the value you asked for.
Passcodes (set_password) work on every plan, free included. 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:
| Code | Means |
|---|---|
plan_lifetime_limit_exceeded | All 3 free pages used. Deleting one does not help. |
plan_site_limit_exceeded | Active-page cap reached. |
plan_password_not_available | Passcodes are not on this plan (they are on Free; a plan can still be without them). |
plan_viewer_gate_not_available | Email gates are not on this plan. |
plan_domain_not_available | Custom domains are not on this plan. |
GET /me — or the get_me tool — 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.