Publish from any chat.
Connect once — then ask your AI to ship. A sentence in the conversation becomes a real site with a real URL, in seconds.
Connect in one minute.
Three steps — and the third one is just talking.
-
Mint a token
In Settings → Access tokens (sign in first). It’s shown once — copy it then.
kan_pat_YOUR_TOKENScoped to your account. Rotate anytime.
-
Paste the snippet
claude mcp add --transport http kan https://mcp.kan.fyi --header "Authorization: Bearer kan_pat_YOUR_TOKEN"
{ "mcpServers": { "kan": { "url": "https://mcp.kan.fyi", "headers": { "Authorization": "Bearer kan_pat_YOUR_TOKEN" } } } }{ "mcpServers": { "kan": { "url": "https://mcp.kan.fyi", "headers": { "Authorization": "Bearer kan_pat_YOUR_TOKEN" } } } }{ "mcp": { "kan": { "type": "remote", "url": "https://mcp.kan.fyi", "oauth": false, "headers": { "Authorization": "Bearer kan_pat_YOUR_TOKEN" } } } }Terminal — swap in your token from Settings → Access tokens.
claude_desktop_config.json — swap in your token from Settings → Access tokens.
.cursor/mcp.json — swap in your token from Settings → Access tokens.
opencode.json — project root, or global ~/.config/opencode/opencode.json. Swap in your token from Settings → Access tokens.
-
Say the thing
One call. One honest answer.
A publish blocks for a few seconds, then says what actually happened. Never a job id to poll.
Serving now. The answer comes with the URL — or, for a site set to private, a note pointing at the dashboard preview instead.
Queued for a human to look at — nothing more for you to do. New accounts start here: publishes are held until your first approval. That check is why kan stays clean.
With the actual reason: “quota exceeded: 27262976 bytes > 26214400 limit”
Not currently being served.
Still publishing. get_site has the fresh verdict.
Files travel through two doors.
The site your AI wrote in the chat goes one way. A real folder on your disk goes another.
Door one
Inline
For the site your AI just wrote in the chat.
Your AI writes the site in the conversation
the files ride along, as text in the call
Door two
Upload ticket
For real folders your AI never held.
A folder or zip on your disk — built by anything
returns a single-use URL, short-lived
Your shell or browser sends the zip there — no token attached. The ticket is the credential.
Six tools. No more.
Everything the server can do, in one screen of docs.
A new site with a fresh eight-character id.
New files to an id you already have.
One site: its URL and current verdict.
Every site on the account, at a glance.
A single-use upload URL for the zip door.
The files behind a site — any live public one, and your own whatever their visibility.
Honest limits.
Visibility is per site — public, link-only, or private.
Questions.
Is it free?
Free while in beta. No card.
Which clients work?
Any MCP client that speaks Streamable HTTP — Claude Code, Claude Desktop, Cursor, OpenCode, and the rest.
Can I pick my URL?
No — ids are minted by the server. Eight characters, like 9vt3bwzr.
What if my AI publishes something bad?
While an account is new, every publish is held for a human look before it serves; the first approval lifts that for good. That check is why kan stays clean.
Connect once. Publish from anywhere.
Sign in, mint a token, paste one snippet. Then it’s just talking.
Start free https://mcp.kan.fyi