cf-cms
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cf-cmscreate a draft post titled 'Hello World' and tag it news"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
CF CMS
CF CMS is an open-source multilingual blog and CMS on Cloudflare’s free tier. 免费套餐即可上线:一条脚本部署,一句话把 Agent 接上。
The sample site shipped in this folder is named Field Notes. The product is CF CMS (cf-cms).
Why CF CMS
Zero cost on the Cloudflare free tier. Pages serves the site, D1 stores posts, R2 stores images, and Workers AI translates on publish. No server to rent.
One script to deploy. Bring a domain and a Cloudflare API token.
npm install && ./scripts/setup.shcreates the Pages project, D1 database, R2 bucket, secrets, and the first deployment.Agent-friendly. A native MCP server, plus one sentence you paste into Cursor, Claude, or another client.
Prefab themes. Two original layouts each for a personal tech blog, a lifestyle journal, a traditional business homepage, and a tech-company homepage.
One-click visual kit. Generate a logo SVG, favicon, and theme color that match the active template. Regenerate or edit them afterward.
Also included: multilingual SEO and GEO (Chinese, English, Japanese, Spanish, and Arabic, with Arabic right-to-left), an admin path hidden behind a secret safepath, and CMS screens for template, brand, layout, channels, meta, tags, and share links.
Browser
|
v
Cloudflare Pages Functions (SSR, /zh /en /ja /es /ar)
|-- D1 posts, translations, tags, channels, settings
|-- R2 images
|-- Workers AI optional translate on save
|
+-- /<ADMIN_SAFEPATH>/admin secret path, then password or Cloudflare Access
+-- /mcp JSON-RPC for agents (Bearer ADMIN_API_TOKEN)Related MCP server: Inkwell MCP Server
Quickstart
npm install && ./scripts/setup.shThe script asks for a Cloudflare API token and account id, creates D1, R2, and a Pages project, applies migrations, sets secrets, and deploys. Nothing is printed back. Add --dry-run to see the plan without calling Cloudflare.
Local preview, no Cloudflare login:
cp .dev.vars.example .dev.vars
# set ADMIN_PASSWORD, SESSION_SECRET (16+ chars), ADMIN_API_TOKEN (16+ chars)
npm run db:setup
npm run devOpen http://127.0.0.1:8791/en/. The CMS is http://127.0.0.1:8791/<ADMIN_SAFEPATH>/admin/. Set ADMIN_SAFEPATH in .dev.vars (openssl rand -hex 16). A request to /admin is a 404 and does not show the login form.
Agent onboarding
Paste one sentence into Cursor, Claude, or another MCP client. Replace $ADMIN_API_TOKEN with the secret from .dev.vars or the Pages secret, and point the client at this repo.
English:
CF CMS (package cf-cms) is an open-source multilingual blog and CMS on the Cloudflare free tier — Pages Functions, D1, R2, and Workers AI — with public routes for zh, en, ja, es, and ar (Arabic is RTL); the admin UI and admin APIs are only at /<ADMIN_SAFEPATH>/admin/ (ADMIN_SAFEPATH is a random secret created by setup, plain /admin returns 404, and the login session is still required on that path); connect its MCP server by posting JSON-RPC to /mcp with header Authorization: Bearer $ADMIN_API_TOKEN (local stdio proxy: npm run mcp with CF_CMS_URL) and use tools project_info, list_posts, get_post, create_post, update_post, publish_post, unpublish_post, delete_post, list_tags, upsert_tag, delete_tag, list_channels, upsert_channel, delete_channel, get_settings, update_template, update_layout, update_meta, update_share, update_brand, upload_logo, generate_visual_kit, list_media, upload_media, and delete_media to read the project and manage drafts, published posts, tags, channels, site and per-post meta, template, layout, share links, logo, favicon, theme color, visual kits, and R2 media.中文:
CF CMS(包名 cf-cms)是跑在 Cloudflare 免费套餐上的开源多语言博客与 CMS,使用 Pages Functions、D1、R2 和 Workers AI,公开路由为 zh、en、ja、es、ar(阿拉伯语从右到左);后台页面和后台接口只在 /<ADMIN_SAFEPATH>/admin/(ADMIN_SAFEPATH 由安装脚本随机生成,直接访问 /admin 会返回 404,到达该路径后仍要登录会话);把 MCP 连到 /mcp,请求头使用 Authorization: Bearer $ADMIN_API_TOKEN(本地 stdio 代理是设置 CF_CMS_URL 后执行 npm run mcp),并用 project_info、list_posts、get_post、create_post、update_post、publish_post、unpublish_post、delete_post、list_tags、upsert_tag、delete_tag、list_channels、upsert_channel、delete_channel、get_settings、update_template、update_layout、update_meta、update_share、update_brand、upload_logo、generate_visual_kit、list_media、upload_media、delete_media 阅读站点并管理草稿、发布、标签、栏目、站点与文章 meta、模板、版式、分享链接、标志、favicon、主题色、视觉套件和 R2 媒体。Cursor stdio config (token stays in your environment, not in git):
{
"mcpServers": {
"cf-cms": {
"command": "npm",
"args": ["run", "mcp"],
"env": {
"CF_CMS_URL": "http://127.0.0.1:8791",
"ADMIN_API_TOKEN": "paste-your-token"
}
}
}
}GET /mcp returns the same sentences and does not require the token. POST /mcp is JSON-RPC (initialize, tools/list, tools/call) and requires Authorization: Bearer <ADMIN_API_TOKEN>. The token must be at least 16 characters. It only authorizes content tools. It cannot deploy, read your Cloudflare account, or change Pages secrets.
Example prompts after the client connects:
Call
project_info, then summarize the drafts.Create a draft in Chinese with slug
edge-notes, channelnotes, and translate it.Set the template to
launch, then generate a visual kit.
translate: true on create_post or update_post calls Workers AI. Locally that binding is remote, so a machine that is not logged in to Cloudflare stores an unpublished fallback instead of a public translation.
Free-tier resources
Confirm current numbers in the Cloudflare dashboard. Typical free allotments:
Resource | What CF CMS uses | Typical free allotment |
Pages | Site and Functions | 500 builds/month, 100,000 Function requests/day |
D1 | Posts, settings | 5 GB, daily row read/write limits |
R2 | Uploaded images | 10 GB, limited Class A/B operations |
Workers AI | Translation on save | 10,000 Neurons/day |
API token scopes
Create a custom token for setup only. Do not give it to the writing agent.
Required:
Account · Cloudflare Pages · Edit
Account · D1 · Edit
Account · Workers R2 Storage · Edit
Account · Account Settings · Read
Custom domain on a zone in the same account:
Zone · Zone · Read
Zone · DNS · Edit
Workers AI does not need a token scope. The Pages project uses the AI binding at runtime.
Least privilege for the agent: generate ADMIN_API_TOKEN with openssl rand -hex 32, store it as a Pages secret, and keep the Cloudflare API token off the agent. Rotate the API token after setup if you want deploys to be a separate step.
Custom domain
Leave the zone on the same Cloudflare account.
Run setup with the domain, or in Pages → Custom domains add the hostname.
DNS is a CNAME to
<project>.pages.dev(apex domains use the CNAME Cloudflare shows).Set
SITE_URLinwrangler.tomltohttps://your.domainand deploy again so canonical URLs match.
Prefab templates
These are original layouts. The WordPress themes named below were popular references in the last year (install-share lists and 2026 roundups). Nothing is copied from them: no markup, CSS, images, or names used as our own.
Niche | Templates | Visual references only |
Personal tech blog | Dispatch, Signal | GeneratePress reading columns, still among the most installed themes; Color Blog Dark for developer journals |
Personal lifestyle blog | Atelier, Hearth | Blocksy lifestyle starters (a rising theme in 2026 install data) and airy personal journals such as Ashe; magazine rhythm associated with Soledad |
Traditional business homepage | Practice, Civic | Astra and Sydney business homepages, plus OceanWP and Kadence business starters |
Tech company homepage | Launch, Orbit | Kadence SaaS starters and Saasland product homepages; Astra SaaS and Blocksy technology layouts |
Paper, Ink, and Terminal are the original CF CMS layouts. In Template settings, picking another name applies its accent, type, and layout. Generate visual kit (on that screen or on Brand) writes an SVG logo and favicon, theme color, and layout for the active template. It does not replace the site description or title suffix, so the homepage keeps the language-specific line. Saving a new theme color recolors a generated kit logo. Replace the logo with your own SVG or a PNG. PNG files go to R2. SVG stays in D1 settings. The stylesheet link includes the active template and brand, so a normal refresh picks up a template change.
Day-2
Admin URL pattern:
/<ADMIN_SAFEPATH>/admin/. Setup writes a randomADMIN_SAFEPATHPages secret and prints the URL once./adminand/admin/loginreturn 404. After the secret path, the password or Cloudflare Access session is still required. Template, brand, layout, channels, meta, tags, and share links are separate screens. Per-post meta (noindex, canonical, keywords, Open Graph image) is on the post form.Rotate secrets with
npx wrangler pages secret put <NAME> --project-name <project>.Re-running
seed/seed.sqldeletes posts and translations. It does not remove your settings rows if you skip the settings tables; the shipped seed deletes posts, tags, and translations only.Workers AI quota resets daily. Translation runs when you save or when an agent sets
translate: true, not on every page view.
中文说明
CF CMS 是可独立开源发布的多语言博客与 CMS,包名 cf-cms。
Cloudflare 免费套餐:Pages、D1、R2、Workers AI,不必另租服务器。
一条脚本部署:准备域名和 Cloudflare API token,执行
./scripts/setup.sh。给 Agent 用:原生 MCP,把上面的中文句子贴进客户端即可。
预制主题:个人技术博客、生活方式、传统企业首页、科技公司首页,各两套。
一键视觉套件:按当前模板生成配套标志和主题色。
另外包含五种语言的 SEO / GEO(阿拉伯语从右到左)、隐藏的后台入口 /<ADMIN_SAFEPATH>/admin/(直接访问 /admin 为 404),以及模板、标志、版式、栏目、meta、标签和分享链接设置。示例站点名是 Field Notes。本地是 npm run db:setup && npm run dev,地址 http://127.0.0.1:8791。不要把 .dev.vars 或 Cloudflare API token 提交进仓库。
Publishing this folder
This directory is the public repository root for CF CMS. The npm package name is cf-cms. The public repository is github.com/jemkuo/cf-cms.
Public pages, the footer, About, JSON-LD, share cards, seed posts, and the examples in this file use a product or site name only (© <year> Field Notes on the sample site, CF CMS for the kit). Do not add a personal name, address, phone number, or email.
This server cannot be deployed
Maintenance
Related MCP Connectors
Instant blogs for AI agents: a publishing CMS with no dashboard. One signup call returns a blog, an API key and a live URL; then publish markdown posts and get public URLs back.
Publish to self-hosted WordPress from AI agents: markdown, images, SEO, and Notion sync.
Backend for AI agents: one batched tool over ~668 actions (hosting, storage, auth, payments).
Manage WordPress blogs and WooCommerce shops from Claude, ChatGPT, Cursor and other MCP apps.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables AI clients to manage Hexo blogs by providing tools for article CRUD operations, local previewing, and GitHub Pages deployment. It also supports site configuration access and automated Git backups to streamline the entire blogging workflow.121-
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to publish and manage content on Inkwell sites via 12 tools, including inbox publishing, content management, and site configuration.1-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage web production projects by providing tools for sitemap planning, content drafting, and review comment workflows.AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceLets AI assistants manage a self-hosted content hub: create, edit, publish, and update articles across nine platforms, refresh account article lists, and sync changes through natural language.MIT