CMSKite

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.

DashboardStart freeNo card. Your blog is live in a minute.
The API keys page for a website: a Keys table with each key’s name, masked key, created and last-used dates and status, and a Create key button.
Project keys are read-only and see published posts of one website.

What there is

PieceWhat it is
REST APIhttps://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.
SDKcmskite on npm. TypeScript types, no dependencies, ESM and CommonJS, plus a view tracker for the browser and React.
MCP serverhttps://api.cmskite.com/mcp. Lets Claude, ChatGPT, Cursor and other MCP clients read and write your content after you sign in. Nothing to install.
WebhooksA signed POST to your URL when a post is published, updated, unpublished or deleted.
Your own infrastructureContent 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 keyConnected AI tool
Looks likecsk_live_…Nothing you see: the tool signs in and keeps its own credential
ForYour website, your build step, the view trackerClaude, ChatGPT, Cursor or another MCP client
CanRead 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 inWebsite → API keys → Create keyYour 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

bash
npm install cmskite
A Next.js blog post page, in essence · ts
import { 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:

bash
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 Code (CLI) · bash
claude mcp add --transport http cmskite https://api.cmskite.com/mcp
Codex CLI (OpenAI) · bash
codex mcp add cmskite --url https://api.cmskite.com/mcp
Cursor · ~/.cursor/mcp.json · json
{
  "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.

  1. 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.

  2. Migrate

    Existing content is copied across and the counts verified. It can be resumed, and nothing is removed from our side.

  3. 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.

FreeStarterTeam
PriceFree forever₹799 / $9 a month₹2,499 / $29 a month
API requests10K / mo100K / mo500K / mo
Websites115
Image storage100 MB1 GB20 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.

Checked