Feature · For developers
A headless blog CMS that your code and your AI assistant can both use.
Writers use the dashboard. Your site reads published posts over a REST API with a read-only key. An AI assistant works through an MCP server: you add one URL and sign in, and it can do only what your role allows in the workspaces you chose. On a paid plan, the content can live in your own MongoDB and the images in your own bucket.

What there is
| Piece | What it is |
|---|---|
| REST API | https://api.cmskite.com/v1: posts, categories, tags, authors, media, search and reader numbers. Version in the path. The OpenAPI document is public at api.cmskite.com/openapi.json. |
| SDK | cmskite on npm. TypeScript types, no dependencies, ESM and CommonJS, plus a view tracker for the browser and React. |
| MCP server | https://api.cmskite.com/mcp. Lets Claude, ChatGPT, Cursor and other MCP clients read and write your content after you sign in. Nothing to install. |
| Webhooks | A signed POST to your URL when a post is published, updated, unpublished or deleted. |
| Your own infrastructure | Content in your MongoDB cluster and images in your own bucket, on paid plans. |
Not a developer? You do not need any of this. The two-line embed and the free blog link work without code.
Two credentials, two jobs
| Project API key | Connected AI tool | |
|---|---|---|
| Looks like | csk_live_… | Nothing you see: the tool signs in and keeps its own credential |
| For | Your website, your build step, the view tracker | Claude, ChatGPT, Cursor or another MCP client |
| Can | Read the published content of one website. Nothing else. | What its owner’s role allows, in the workspaces they chose, deleting only if allowed; checked on every request |
| Safe in a browser? | Yes. Lock it to your domains with allowed origins. | Not applicable: it never leaves the AI tool. |
| Made in | Website → API keys → Create key | Your AI tool: add the URL, sign in, press Allow. Listed under Settings → Connected apps |
A project key is shown once, when created, and stored only as a keyed hash. A project key has no write scope to grant by mistake, because the key-based API has no write route. Free allows two live keys per website; paid plans have no key limit.
Some things no connected AI tool can ever do, whatever its owner may do: revoking keys, deleting a website or workspace, changing the plan, or inviting people. Full detail: Authentication.
Reading posts takes a few lines
npm install cmskiteimport { createCMSKite } from 'cmskite'
const cms = createCMSKite({ apiKey: process.env.CMSKITE_KEY! })
// The index: a page of published posts (bodies left out of lists).
const { items } = await cms.posts.list({ limit: 10 })
// One post by its address. null rather than a throw when there is none.
const post = await cms.posts.findBySlug(slug)
if (!post) notFound()
// A renamed post still resolves; send the old address to the new one.
if (post.slugRedirectedFrom) redirect(`/blog/${post.slug}`)Pagination is by cursor, and cms.posts.all() walks every post as an async iterator for sitemaps and static builds. Errors arrive as one CMSKiteError with the status, an error code and a request id. Without the SDK it is plain HTTP with a bearer token:
curl "https://api.cmskite.com/v1/blog/posts?limit=10" \
-H "Authorization: Bearer csk_live_..."Start with the Quickstart, then the SDK guide and the API reference.
A blog CMS with MCP
Add https://api.cmskite.com/mcp to your AI tool — one command in Claude Code or Codex, one entry in a config file for Gemini CLI, Cursor, VS Code or Windsurf, a custom connector in Claude, ChatGPT or Lovable. The tool opens CMSKite in your browser: sign in, choose all your workspaces or one, decide whether it may delete, and press Allow. No key is shown or pasted, and you can disconnect it any time under Settings → Connected apps.
claude mcp add --transport http cmskite https://api.cmskite.com/mcpcodex mcp add cmskite --url https://api.cmskite.com/mcp{
"mcpServers": {
"cmskite": {
"url": "https://api.cmskite.com/mcp"
}
}
}Then ask in plain words: “Draft a post on monsoon skin care and file it under Skin”. The assistant reads your categories, writes the post and leaves it as a draft unless you asked it to publish. It can also set up a whole site: create the website, write posts, mint the read-only key, and check that views are arriving.
Step-by-step setup for every tool, every grant and the tools behind it: MCP and automation.
Webhooks
Add an endpoint under Website settings → Webhooks and choose events: post.published, post.updated, post.unpublished, post.deleted. Each delivery is a JSON POST, typically used to rebuild a static site the moment a post changes.
- Signed:
CMSKite-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256>over<t>.<raw body>. The signing secret is shown once. Reject timestamps older than five minutes. - A failed delivery is retried. After 20 failures in a row the endpoint is switched off, so a dead URL does not get hammered forever.
- The card shows each endpoint’s last delivery and status. Delivery records are kept for 90 days.
Your blog on your own database
On every paid plan, a website can keep its content in a MongoDB cluster you own and its images in your own bucket: Cloudflare R2, Amazon S3, any S3-compatible store, or Cloudinary. Set it up under Database & storage.
Test
The connection is checked before it is saved, so a wrong password or a blocked network shows up on screen, not later as a reader’s error.
Migrate
Existing content is copied across and the counts verified. It can be resumed, and nothing is removed from our side.
Activate
Reads and writes move to your cluster. Every post keeps its id and slug, so your website notices nothing.
The credentials are encrypted and never shown again. Disconnecting points the website back at our database and deletes nothing from yours, and you can export everything as newline-delimited JSON at any time. What to weigh: your cluster’s location and uptime become the API’s. Reader numbers, usage and the activity log stay with us. Details: Bring your own database.
Limits, and what each plan includes
Requests per second use a token bucket set by your plan, and every response carries RateLimit-Policy and RateLimit headers so a client can slow down before it is refused; a 429 adds Retry-After. Monthly requests are the quota below. Full-text search and the per-endpoint traffic breakdown are on paid plans. See Rate limits and quotas.
| Free | Starter | Team | |
|---|---|---|---|
| Price | Free forever | ₹799 / $9 a month | ₹2,499 / $29 a month |
| API requests | 10K / mo | 100K / mo | 500K / mo |
| Websites | 1 | 1 | 5 |
| Image storage | 100 MB | 1 GB | 20 GB |
Questions
- Is there an OpenAPI spec?
- Yes, public and unauthenticated at https://api.cmskite.com/openapi.json. The SDK’s types come from the same API.
- Can I create posts through the API?
- Posts are written in the dashboard, or by an AI tool you connect over MCP: add the URL, sign in and press Allow. The public API is read-only: project keys only read published content, which is what makes them safe to ship in a website.
- Can I put the API key in front-end code?
- The project key, yes: it is read-only and sees published posts only. Add your domains to allowed origins so a browser on another site cannot use it. It is the only credential a page ever needs.
- Which AI assistants work with the MCP server?
- Any MCP client that supports remote servers with sign-in: Claude, ChatGPT, Claude Code, Cursor, VS Code, Lovable and more. Setup is the same URL everywhere.
- Which plans include my own database and storage?
- Every paid plan. The free plan uses our managed database and storage.
- Do I need the SDK?
- No. Everything is plain HTTP with a bearer token. The SDK saves writing cursor pagination, slug redirects, typed responses and the view tracker yourself.
Related
- QuickstartFrom a key to posts on your page, step by step.
- JavaScript SDKThe client, pagination, errors and the tracker.
- MCP and automationSetup, every tool, and what no connected tool can do.
- Bring your own databaseConnecting, migrating and disconnecting your MongoDB.
- Team and rolesWho on your team can manage keys, webhooks and integrations.
- Blog analyticsReader numbers, and the snippet a coded site needs.
Checked