Developers

Nanopage Developer Resources

Everything machine-readable and agent-facing that Nanopage publishes: the REST API and its OpenAPI spec, the MCP server, llms.txt, sitemap, and markdown content negotiation.

https://api.nanopage.site/mcpStreamable HTTP · JSON-RPC 2.0 · bearer-token auth
https://api.nanopage.site/v1JSON over HTTPS · bearer-token auth · tokens with API access

Nanopage MCP server

Nanopage exposes its publishing API as a Model Context Protocol server, so Claude Code, Claude Desktop, Cursor, Codex, and other AI agents can build and publish hosted websites natively.

https://api.nanopage.site/mcp

Streamable HTTP · JSON-RPC 2.0 · bearer-token auth

publish_website

Create a new site from a file bundle

publish_version

Add a version to an existing site

create_upload

Upload URLs for images and other binaries

list_websites

List every website in the account

get_website

Full details for one website

list_versions

All versions, newest first

get_job_status

Look up a publish job

suggest_slug

Slug validity + availability

list_entries

Read a collection's entries

upsert_entries

Create or update entries by slug

delete_entry

Delete one entry

The MCP server page covers the connection flow, tools, and hosting contract in full. Grab client config snippets on the MCP interface page, and create tokens on the API tokens page. Read the announcement post for a walkthrough.

Nanopage REST API

Publishing and content management as plain HTTPS + JSON, for scripts and for agents that speak REST instead of MCP: create sites and versions, and read and write the entries of a site's collections. The full surface is described by an OpenAPI 3.1 spec at nanopage.site/openapi.json (also served at api.nanopage.site/openapi.json).

https://api.nanopage.site/v1

JSON over HTTPS · bearer-token auth · tokens with API access

listWebsites

GET /v1/websites

createWebsite

POST /v1/websites

getWebsite

GET /v1/websites/{websiteId}

listWebsiteVersions

GET /v1/websites/{websiteId}/versions

createWebsiteVersion

POST /v1/websites/{websiteId}/versions

createUploads

POST /v1/uploads

getJob

GET /v1/jobs/{jobId}

suggestSlug

GET /v1/slugs/suggest?value=…

listCollections

GET /v1/websites/{websiteId}/collections

createCollection

POST /v1/websites/{websiteId}/collections

getCollection

GET …/collections/{collection}

updateCollection

PATCH …/collections/{collection}

listEntries

GET …/collections/{collection}/entries

upsertEntries

POST …/collections/{collection}/entries/batch

getEntry

GET …/entries/{entry}

putEntry

PUT …/entries/{slug}

deleteEntry

DELETE …/entries/{entry}

importAsset

POST /v1/websites/{websiteId}/assets

Tokens: create personal access tokens on the API tokens page and choose what each one reaches: the REST API, the MCP server, or both. No token ever reaches the dashboard, billing, domains, or admin. OAuth sign-ins from MCP clients reach both. The OAuth scope is published machine-readably as RFC 9728 protected-resource metadata at api.nanopage.site/.well-known/oauth-protected-resource, and the API's 401 responses point at it via WWW-Authenticate: Bearer resource_metadata="…".

Move your content in

Coming from WordPress, Ghost, Webflow, Squarespace or a spreadsheet? Send your posts, products or events to a collection and they appear on your site as if they had been written in the editor.

  • The slug is the identity. Sending an entry whose slug exists updates it, so you can run the same import again after fixing something. Keep your old slugs (up to 80 characters) and the URLs stay the same, at /{collection}-{slug}.
  • Dates come along. publishedAt and createdAt keep your archive in order.
  • HTML and Markdown work. A rich-text field takes { "html": "…" } or { "markdown": "…" } and ends up exactly as if you had pasted it into the editor: headings, lists, quotes, links, images with captions.
  • Images by URL. Image fields and <img> tags in the HTML are downloaded into the collection's library, once per URL. baseUrl resolves relative paths.
  • Nothing is all-or-nothing. Up to 100 entries per request, each with its own result. A collection can hold any number of entries, and every change is live on the next page view.
curl -X POST https://api.nanopage.site/v1/websites/$SITE/collections/blog/entries/batch \
  -H "Authorization: Bearer $NANOPAGE_TOKEN" -H "content-type: application/json" \
  -d '{
    "baseUrl": "https://old-blog.example.com/",
    "entries": [{
      "slug": "how-we-roast-our-coffee",
      "publishedAt": "2021-03-04T10:00:00Z",
      "data": {
        "title": "How we roast our coffee",
        "cover": "https://old-blog.example.com/uploads/roast.jpg",
        "body": { "html": "<h2>Beans</h2><p>We start early…</p>" }
      }
    }]
  }'

AI agents can do the same through the MCP tool upsert_entries: ask Claude to move your WordPress blog into Nanopage and point it at the export.

Machine-readable site

openapi.json

OpenAPI 3.1 spec for the Nanopage REST API — every operation with typed schemas and operation IDs.

llms.txt

Compact navigation index of the product and site, written for LLMs and agents.

llms-full.txt

Complete annotated index: every use-case page, template, and blog post with descriptions.

sitemap.xml

Every indexable page with last-modified dates.

robots.txt

AI crawlers (GPTBot, ClaudeBot, Google-Extended, PerplexityBot…) are explicitly allowed.

Markdown content negotiation

Core pages serve text/markdown via the Accept header (with Vary: Accept), and at explicit .md URLs. 404s return a short markdown body pointing agents at the sitemap and llms.txt.

curl -H "Accept: text/markdown" https://nanopage.site/

Questions about the MCP server or agent access?

Email hello@nanopage.site — every email is read.