Connect your LLM to Just Publish.
Just Publish is an MCP (Model Context Protocol) server. Any MCP-capable LLM can
publish a folder of static files to a live URL with a single call. Add the
connector below, sign in once, and it serves four tools: deploy,
get_site_files, update_site_file and list_sites.
For manually configured clients there is a second address, further down.
No git, no CLI, no build step.
Which endpoint
Two connectors, one per assistant, because an OAuth token is bound to the endpoint that issued it. Pick by which assistant you are connecting, not by what you want to publish - the publishing behaviour is identical. Adding the server by hand, in a client that does not do OAuth? That endpoint is below Quick start.
| Endpoint | Sign-in | Tools | Use it when |
|---|---|---|---|
| https://mcp.justpublish.ai/claude | OAuth 2.1 | 4 | Your client requires an authenticated connector, or you want every site filed under your own account so an assistant can list and edit them later. This is the endpoint the Claude connector uses. Step-by-step: Connect Just Publish to Claude. |
| https://mcp.justpublish.ai/chatgpt | OAuth 2.1 | 4 | The same signed-in endpoint for the ChatGPT connector. Separate URL because an OAuth token is bound to the exact endpoint that issued it. |
Quick start
Add the endpoint your client needs, then ask the model to publish your files. Each tab below uses the endpoint from the table above; the tool reference and the JSON-RPC examples further down document the open one. Want click-by-click connect steps instead of the raw schema? See Connect your AI assistant.
Claude on the web, desktop and mobile adds a remote server as a connector: Customize > Connectors > + Add custom connector. Paste the URL, leave the advanced OAuth settings empty, choose Add, then sign in.
Server URL: https://mcp.justpublish.ai/claude
Authentication: OAuth 2.1 - Just Publish registers itself, so there is
no client ID or client secret to fill in
In Claude Code: claude mcp add --transport http just-publish https://mcp.justpublish.ai/claude, then /mcp to finish the sign-in. Full walkthrough, every Claude surface: Connect Just Publish to Claude.
Cursor → Settings → MCP → Add new server. Paste the JSON below or enter the URL directly.
{
"mcpServers": {
"just-publish": {
"url": "https://mcp.justpublish.ai/"
}
}
}
Add a custom connector. Available on plans that support remote MCP servers (currently Team / Enterprise / Pro tiers).
Server URL: https://mcp.justpublish.ai/
Authentication: None
ChatGPT also has a signed-in endpoint at https://mcp.justpublish.ai/chatgpt (OAuth 2.1), for connectors that require authentication. Same server, same publishing behaviour, plus list_sites.
Once connected, ask the model something like: "Publish this HTML to Just Publish and give me the URL." The model calls deploy and hands back the live URL. On the open endpoint it also returns a site_id and an edit_token, and the token is the only way to update that exact site later. On a signed-in endpoint the site belongs to the account, so the assistant can find and edit it again without a token.
The signed-in endpoints, in detail
https://mcp.justpublish.ai/claude and https://mcp.justpublish.ai/chatgpt run the same server as the open
endpoint, behind OAuth 2.1, for clients that require an authenticated connector. A site published there is filed under the
signed-in person's account: deploy takes no email parameter, and the site is live immediately with
nothing to prove afterwards. On the open endpoint at https://mcp.justpublish.ai/, which the steps above configure
for a hand-added client, the email argument carries that accountability instead.
The signed-in discovery documents are https://mcp.justpublish.ai/.well-known/oauth-protected-resource/claude
and https://mcp.justpublish.ai/.well-known/oauth-protected-resource/chatgpt.
They are separate endpoints so each connector gets its own audience-bound token, and each advertises the contract
that directory's rules require: on /chatgpt, deploy creates a new site only and no tool
takes an edit_token.
Because it knows who is asking, a signed-in endpoint serves a fourth tool the open one cannot: list_sites,
which takes no parameters and returns the websites that person has already published - live URL, site_id,
whether each is live or archived, when it was last updated, and any connected custom domain.
It is how an assistant finds a site whose edit_token was lost. On those endpoints
get_site_files and update_site_file also work without an edit_token on that person's own sites.
Setting up the Claude connector, step by step and for every Claude surface: Connect Just Publish to Claude.
Adding the server by hand
A client that does not do OAuth adds the open endpoint instead. Same server, same publishing behaviour, three tools rather than four.
| Endpoint | Sign-in | Tools | Use it when |
|---|---|---|---|
| https://mcp.justpublish.ai/ | None | 3 | You are adding the server by hand in a client that does not need an authenticated connector. deploy takes an email here, and the returned edit_token is the only way back to the site. This is the endpoint the rest of this page documents. |
Tool reference - deploy
Publishes a static site. First call (no site_id) creates a new site and returns its credentials. Later calls with the same site_id + edit_token update the site in place. The schema below is the one served at https://mcp.justpublish.ai/; on a signed-in endpoint deploy takes no email and edit_token is optional on your own sites.
Parameters
| Name | Type | Req. | Description |
|---|---|---|---|
| files | Array<File> | required | Files to publish. Each item: { path, content, encoding? }. Must include an index.html at the root. On update, the array fully replaces the prior site - paths you omit are removed. |
| string | required | Open endpoint only - a signed-in endpoint has no email parameter, because the identity arrives in the access token. Here the address is the site's accountability handle. Just Publish emails a 6-digit code to it for dashboard access, and a site whose address is still unproved one hour after it was published is taken offline automatically; proving the address restores it. Proof is also what connecting a custom domain and recovering a lost edit_token require. |
|
| site_id | string | optional | Existing site id to update. Omit to create a new site. |
| edit_token | string | optional | Edit token returned at create time. Required iff site_id is given. |
File object
| Name | Type | Req. | Description |
|---|---|---|---|
| path | string | required | Path under the site root, e.g. index.html, assets/logo.png. No leading /, no .., no backslashes, no null bytes. |
| content | string | required | File body. Text by default; binary must be base64. |
| encoding | "utf-8" | "base64" | optional | Defaults to utf-8 for text extensions, base64 otherwise. |
Response (success)
{
"url": "https://xK3p9wnA2b.justpublish.site/",
"site_id": "xK3p9wnA2b",
"edit_token": "...", // only on create
"created": true, // false on update
"files_uploaded": 4,
"total_bytes": 12842
}
Errors
Errors come back as a tool-call result with isError: true and a human-readable message - not as a JSON-RPC error. The model surfaces the message to the user.
JSON-RPC examples
Create a new site
POST https://mcp.justpublish.ai/
Accept: application/json, text/event-stream
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "deploy",
"arguments": {
"email": "you@example.com",
"files": [
{ "path": "index.html", "content": "<h1>hello world</h1>" }
]
}
}
}
Update an existing site
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "deploy",
"arguments": {
"email": "you@example.com",
"site_id": "xK3p9wnA2b",
"edit_token": "the token you saved at create time",
"files": [
{ "path": "index.html", "content": "<h1>hello v2</h1>" }
]
}
}
}
Constraints
index.htmlat the root of the file map is required. A site without it is rejected at deploy.- Max site size: 50 MB. Max single file: 5 MB. Max 500 files per site.
- Path rules: no
.., no leading/, no backslash, no null bytes. The deploy is rejected at validation time, not silently truncated. - Per-IP rate limits on both site creation and deploys per rolling hour.
- Static files only. No server-side execution, no build step, no environment-variable injection.
- Sites with no traffic for an extended period may be archived (TTL policy).
Edit token & persistence
The edit_token is the only credential needed to update a site over MCP. It's returned once, at create time, and never again - the server stores only a hash. Store it alongside the site_id in your LLM's conversation context, in a saved note, or wherever your client keeps state across sessions.
Losing the token orphans the site from MCP updates. Recovery: sign in at /login with the email you used at deploy time. The dashboard lists your sites and uses session-authenticated HTTP endpoints (not the edit_token) to update or delete them.
Developer FAQ
How do I update a site I deployed?
Call deploy again with the same site_id and edit_token you got from the first deploy. The files array replaces the previous deploy in place - paths not included are removed.
I lost my edit_token - what now?
The token cannot be recovered (we only store its hash). Sign in to the dashboard with the email you used at deploy time. You'll see the site listed and can update or delete it via the session-authenticated HTTP API, which doesn't require the edit_token.
Can I host a Next.js, SvelteKit, or SPA build?
Yes if the framework produces a fully static export - Next.js export, Astro, Eleventy, Hugo, Vite static builds, SvelteKit static adapter, or a SPA with client-side routing. Deploy the build output, not the source. No if the framework requires a Node runtime for SSR or API routes - there is no server-side execution.
Is there a CLI?
No standalone CLI. The MCP server is the deploy interface - your LLM client (Claude Desktop, Cursor, ChatGPT) is the CLI. If you want to deploy from a script without an LLM, send a JSON-RPC tools/call POST to https://mcp.justpublish.ai/ directly.
How is content moderated and rate-limited?
Per-IP rate limits cap site creation and deploys per rolling hour. Each deploy is scanned for known phishing signatures. Cloudflare WAF handles broader bot and abuse mitigation upstream. Repeated abuse can lead to slug bans.