Connect your LLM to Just Publish.
Any MCP-capable LLM can publish a folder of static files to a live URL with a
single call to Just Publish. It is an MCP (Model Context Protocol) server: add the
connector below, sign in once, and it serves five tools: deploy,
get_site_files, update_site_file, list_sites and
get_site_domain_status.
Every address asks for the same free sign-in the first time, and every site is filed under your account.
No git, no CLI, no build step.
Which endpoint
Three addresses, one server, one sign-in. Each address has its own OAuth token, because a 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. A client that cannot sign in at all can use the bridge below.
| Endpoint | Sign-in | Tools | Use it when |
|---|---|---|---|
| https://mcp.justpublish.ai/ | OAuth 2.1 | 4 | Cursor, VS Code, ChatGPT developer mode, or any MCP client you add by hand. The client opens a sign-in window the first time. |
| https://mcp.justpublish.ai/claude | OAuth 2.1 | 4 | The Claude connector, on the web, desktop, mobile and in Claude Code. Step-by-step: Connect Just Publish to Claude. |
| https://mcp.justpublish.ai/chatgpt | OAuth 2.1 | 4 | 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, sign in, then ask the model to publish your files. Each tab below uses the endpoint from the table above. 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, then sign in when Cursor asks.
{
"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/chatgpt
Authentication: OAuth
Step by step: Connect Just Publish to ChatGPT.
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. The site belongs to your account, so the assistant can find it again with list_sites and edit it without a token.
The sign-in, in detail
https://mcp.justpublish.ai/, https://mcp.justpublish.ai/claude and
https://mcp.justpublish.ai/chatgpt are one server behind OAuth 2.1, the same free sign-in as the
website. A site published through any of them 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.
The discovery documents are https://mcp.justpublish.ai/.well-known/oauth-protected-resource,
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 gets its own audience-bound token, and each advertises the contract its
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, every endpoint serves 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. get_site_files and
update_site_file 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.
Clients that cannot sign in
Every endpoint needs a sign-in, so there is no open address. A client that cannot run an OAuth sign-in itself can use the mcp-remote bridge: it runs on your computer as a local MCP server, opens the browser for the sign-in once, and passes your requests to Just Publish.
{
"mcpServers": {
"just-publish": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.justpublish.ai/"]
}
}
}
Tool reference - deploy
Publishes a static site under the signed-in account. First call (no site_id) creates a new site. Later calls with the same site_id update that site in place. The schema below is the one served at https://mcp.justpublish.ai/ and /claude; on /chatgpt, deploy creates a new site only.
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. |
| 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. Not needed for a site your account owns. |
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; optional for your own sites
"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
Authorization: Bearer <access token from the sign-in>
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "deploy",
"arguments": {
"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": {
"site_id": "xK3p9wnA2b",
"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-account 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).
Your sites & the edit token
Every site is filed under the account that signed in. list_sites returns them, and get_site_files, update_site_file and deploy work on them with just the site_id. The dashboard lists the same sites.
deploy still returns an edit_token when it creates a site. It is a second key to that one site, for a client that keeps it; the server stores only a hash, and you do not need it for your own sites.
Developer FAQ
How do I update a site I deployed?
Ask the assistant to change it. It calls update_site_file with the site_id to change only some files, or deploy with the site_id to replace the whole site - paths not included are removed. No token is needed for your own sites.
I lost my edit_token - what now?
Nothing is lost. Sites you publish while signed in belong to your account: the assistant finds them with list_sites and edits them without a token, and the dashboard lists them too.
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/ with the access token from a sign-in.
How is content moderated and rate-limited?
Per-account rate limits cap site creation and deploys per rolling hour. Each deploy is scanned for known phishing signatures. A web application firewall handles broader bot and abuse mitigation upstream. Repeated abuse can lead to slug bans.