Build shapes pages from any AI agent.
One MCP server, one small REST API, no keys. An agent creates a private draft, shows the person a preview, keeps revising it with an edit token, and hands it over with a claim link. Only the person can publish.
Plain-text versions for models: /llms.txt and /llms-full.txt. OpenAPI: /openapi.json. Server card: /.well-known/mcp.json.
MCP server.
Streamable HTTP, stateless, no authentication.
https://shapes.bio/mcpConnect a client.
- Claude
- In Settings, open Connectors and add a custom connector with the MCP URL. No authentication. In Claude Code: claude mcp add --transport http shapes https://shapes.bio/mcp.
- ChatGPT
- Turn on developer mode in the advanced Apps settings, then create an app (connector) with the MCP URL and no authentication. The draft preview can appear inline in the chat.
- Muse
- Ask Muse to add a connector for an MCP server and give it the MCP URL. Muse sets up the connection and asks you to approve it.
- Cursor
- Add to .cursor/mcp.json: {"mcpServers":{"shapes":{"url":"https://shapes.bio/mcp"}}}.
- VS Code
- Run “MCP: Add Server”, choose HTTP and paste the MCP URL, or add {"servers":{"shapes":{"type":"http","url":"https://shapes.bio/mcp"}}} to .vscode/mcp.json.
- Anything else
- Any client that speaks MCP over Streamable HTTP. No authentication is needed.
How a draft works.
create_page_draft (or POST /api/agent/v1/drafts) validates the page with the same rules as the editor and returns a draftId, an editToken, a previewUrl and a claimUrl. The draft is private, noindex, and deleted after 7 days unless claimed.
Show the person the preview and the claim link. Keep the editToken to yourself: it is what lets you change the draft. Use update_page_draft (PATCH /drafts/{id}) with operations to revise it. When the person signs in through the claim link, the draft becomes their own private page and can no longer be changed with the token.
MCP tools.
The server is stateless Streamable HTTP. Its instructions and tool descriptions tell the model when to use shapes and what to tell the person.
- get_page_guide: design rules, every block type with its fields, and the operations. Read once.
- list_looks: the six curated looks.
- check_handle: whether name.shapes.bio is free. It does not reserve the address.
- create_page_draft: build the page from a name, bio, look, socials, links and blocks (or a whole document).
- update_page_draft: change the draft with operations, all or nothing, with an optional baseRevision.
- get_page_draft: read the document, including block ids.
An inline preview in the chat.
create_page_draft and update_page_draft declare an MCP Apps view (also readable by the ChatGPT Apps SDK). Hosts that support it show the page in a phone frame inside the conversation, with a “Make it mine” button that opens the claim link. Other hosts get the same links as text.
REST API.
Every MCP tool has a REST twin under /api/agent/v1, described in /openapi.json. Errors are JSON with a sentence that says what to fix, and an opIndex when an operation was rejected.
- POST /drafts — create (no auth).
- GET /drafts/{id} and PATCH /drafts/{id} — Authorization: Bearer <editToken>.
- GET /schema, /looks, /guide and /handles/{handle}.
Limits and rules.
Up to 300 blocks, folders two levels deep, and 12 images from other websites per draft. 20 new drafts an hour from one address and 120 changes an hour per draft. Links must be https, mailto or tel.
Do not invent links, prices, customers or testimonials. Do not tell the person their page is live: a draft is never published until they publish it themselves.
Quickstart.
curl -s https://shapes.bio/api/agent/v1/drafts \
-H 'Content-Type: application/json' \
-d '{
"name": "Ada Rivers",
"bio": "Ceramics, made slowly.",
"preset": "clay",
"socials": [{"platform": "instagram", "url": "https://instagram.com/ada"}],
"links": [
{"title": "Shop the new batch", "url": "https://ada.example/shop", "layout": "featured"},
{"title": "Commissions", "url": "mailto:[email protected]"}
]
}'Then change it:
curl -s -X PATCH https://shapes.bio/api/agent/v1/drafts/$DRAFT_ID \
-H "Authorization: Bearer $EDIT_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"ops": [{"op": "applyPreset", "preset": "midnight"}], "baseRevision": 1}'