
Lightcms
io.github.jonradoff由 GitHub 帳號 jonradoff 發布v7.3.4更新於 Oct 26, 2026
AI-native, open-source CMS (Go) with 128 MCP tools: content, agent sandbox, SEO & AI.
發布方自己的服務:LLM Optimizer
概覽
LightCMS 這套開源 Go 內容管理系統的 MCP 伺服器,透過約 130 個工具讓助理管理內容、分支、匯入、搜尋與發佈。
- 可以做什麼
- 建立、讀取、更新、發佈、取消發佈與軟刪除內容頁面,支援版本歷程與還原
- 執行批次操作:批次更新、欄位操作、批次發佈、匯出與限定範圍的搜尋取代
- 匯入 Markdown、ZIP、CSV 與 RSS/Atom 訂閱來源,並查看匯入工作狀態
- 管理內容分支:建立暫存工作區、分叉頁面、含衝突偵測的合併、封存或清除
- 管理範本、標籤、片段、資料夾、重新導向、Webhook 與資源檔案
- 搜尋內容並執行站台層級查詢,供代理式網站管理使用
- 適用情境
- 適合讓助理在 LightCMS 站台上撰寫、批次編輯、匯入或發佈內容,或先在分支中暫存變更再合併上線。它著重於代理式內容維運,而非一般網頁瀏覽。
- 執行需求
- 需要一個可透過 LIGHTCMS_URL 存取的執行中 LightCMS 實例,以及在管理面板 Settings → API Keys 建立、填入 LIGHTCMS_API_KEY 的 API 金鑰。伺服器以本機桌面套件(stdio)方式執行。CMS 本身需要 Go 與 MongoDB Atlas 帳號。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Lightcms,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
LightCMS
[CI] [codecov] [Go Report Card] [lightcms MCP server]
LightCMS is a Go-powered content management system built for the AI era. It's simultaneously AI-native (semantic search, built-in Claude-powered chat widget, MCP server for agent control), agentically controllable (Claude Code and any MCP client can read, write, publish, and bulk-import content via 130 MCP tools), and agentically updatable (the codebase is clean, well-structured Go — coding agents can safely extend it). For teams that want a CMS that works with AI rather than around it.
What's New in v7.3 — SEO & AI
What's New in v7.2
What's New in v7.1
What's New in v7.0
What's New in v6.0
What's New in v5.0
What's New in v4.5
Why LightCMS?
Lightweight: A clean, focused codebase that's easy to understand, modify, and extend. No bloated frameworks or complex abstractions.
AI-Native: Built from the ground up for the AI era:
- MCP Integration: Full Model Context Protocol server with 130 tools and 3 prompt resources for website management. Supports both local stdio and HTTP streamable transports — connect from Claude Code, Claude Desktop, or any MCP-compatible client.
- OAuth 2.1 for Remote Agents: Sandboxed desktop apps like Claude's Cowork can securely connect over HTTP using OAuth 2.1 with PKCE. No embedded passwords — just authorize once and the agent manages your site.
- Fork-Friendly: Designed to be forked and customized by Claude Code. Ask Claude to add new content types, modify templates, or build custom features — the codebase is structured for AI-assisted development.
- Natural Language Website Management: Skip the admin UI entirely. Create pages, manage assets, customize themes, and publish content through conversation.
Features
Content Management
- Template System: Define reusable content structures with custom fields (text, richtext, image, date, select, markdown)
- Static Page Generation: Fast page loads from pre-rendered HTML — no runtime templating overhead
- Content Versioning: Full version history with diff comparison and one-click revert
- Soft Delete: Recover deleted content with undelete functionality
- Content Tagging: Tag any content item with one or more freeform labels, then query by tag across your site
- Snippets: Named HTML template fragments used as reusable rendering units in dynamic queries
lc:queryDirectives: Embed live content queries directly in template layouts — at publish time they expand into rendered lists of matching pages- Content Collections: Auto-generated paginated listing pages filtered by category
- Folders & URL Organization: Hierarchical content organization with clean URL paths
- Rich Text Editor: Quill 2 for visual content editing (vendored in
static/admin/quill/, served from the site itself) - Regex Search & Replace: Site-wide or scoped search-and-replace with RE2 regex support, capture groups, and mandatory preview step
- Bulk Operations: Update or apply field operations across up to 100 pages in a single API call; export/transform/re-import pipelines
- Scheduled Publishing (v4.5+): Set a future
publish_attimestamp; a background scheduler auto-publishes at the right time - Content Locking (v4.5+): Advisory lock while editing (30-min expiry); warning banner if another user holds the lock; admins can force-unlock
- Incremental Static Regeneration (v4.5+): Template layout changes regenerate pages in 20-page batches to prevent server overload on large sites
Import Pipeline (v5.0+)
- RSS/Atom Feed Sources: Configure recurring import sources with configurable schedule (hourly/daily/weekly), template mapping, folder targeting, and auto-publish. Manage sources and run history from
/cm/imports. Feed URLs must be publicly reachable (private and loopback addresses are refused, v7.4.3). - Markdown + ZIP Import: Upload
.mdfiles or.ziparchives of Markdown. YAML frontmatter in each file controls title, slug, folder, template, tags, and scheduled publish time. Supports Notion exports, Obsidian vaults, Hugo/Jekyll site migrations, and AI-generated content. - CSV Bulk Import: Upload a CSV and specify which column is the title; all other columns are stored as content fields automatically.
- Real-time SSE Job Status: Live log stream at
/cm/imports/{jobID}— watch imports happen line-by-line or review full history after the fact. - MCP-first Design:
import_markdownis specifically designed for AI agents to generate and import large content batches in a single call, replacing dozens ofcreate_contentcalls with oneimport_markdown+ oneget_import_job. See MCP.md for workflow examples.
Content Forks (v4.0+)
- Fork Workspaces: Create named staging workspaces where sets of page edits can be authored, previewed, and reviewed before going live
- Sparse Model: Only edited pages live in a fork — unmodified pages fall through to live content automatically
- Fork Preview Mode: Activate via a floating bar injected into the live site; a cookie routes all page requests through the fork so you see exactly how the site will look after merge
- Merge with Conflict Detection: Admins merge forks into live content; if a live page was changed after the fork was created, the conflict is recorded (fork wins). New pages created in the fork are inserted into live on merge, keeping the publish state they had in the fork (normally draft) unless the merge is run with
publish_new - Merges Clean Up (v7.4+): A merge deletes the fork's page copies and keeps the fork record, with created/updated counts, as history. Forks merged before v7.4 can be cleaned with
purge_fork_copies - Fork Copies Stay Out of the Way (v7.4+): Fork copies are left out of content listings and search unless
include_forksis set, and can never be published directly or in bulk — only merged - Hold Flag (v7.4+): Mark any draft
holdto block every way of publishing it (publish, bulk publish, scheduled publish, approval, fork merge) until the flag is cleared - Full MCP Toolset: 9 dedicated fork tools —
list_forks,create_fork,get_fork,fork_page,remove_fork_page,merge_fork,archive_fork,delete_fork,purge_fork_copies
Batch & Parallel Operations
Designed for agents that prefer parallelized, high-throughput workflows over sequential single-item calls:
bulk_update_content: Update up to 100 pages in a single API call. Each item uses merge semantics — only the fields you specify are touched. Supportsdry_runvalidation before committing, andauto_republishto re-publish all previously-published pages in the same call, eliminating a separate publish stepbulk_field_operation: Apply a single operation (set,clear,prepend,append,wrap) to a field across every matching page in one call. Scope by template, folder, category, or explicit ID list. Ideal for adding disclaimers, updating metadata, or clearing stale fields across a content typepublish_multiple: Publish a list of IDs — or all drafts at once withpublish_all_drafts: true— in a single request instead of looping overpublish_contentexport_content: Dump full field data for a scoped set of pages as a structured JSON array. Designed for export → transform → re-import pipelines; pair withbulk_update_contentfor large-scale content migrations- Scoped Search & Replace: Both
scoped_search_replace_previewandscoped_search_replace_executeaccept scope filters (folder, template, category, IDs) so agents can target precise subsets rather than running site-wide operations - Parallel-Safe Read API:
list_contentwithinclude_data: truereturns full field values in one fetch; agents can fan out reads across multiplelist_content/get_contentcalls concurrently and then batch-write withbulk_update_content
Recommended agent pattern for large updates: list_content → transform in parallel → bulk_update_content (up to 50/call) → publish_multiple.
AI Chat Widget (v4.2+)
- Embeddable Widget: Add a floating AI chat bubble to any page with a single
<script>tag — self-contained, no build step required - Two-Phase Pipeline: Each visitor query runs hybrid semantic+fulltext search to retrieve relevant content excerpts, then streams those excerpts through Claude Haiku for a conversational synthesized answer
- SSE Streaming: Haiku's token-by-token output is forwarded live to the browser via Server-Sent Events; falls back to plain JSON for non-SSE clients
- AI-Optional: Without an Anthropic API key, the widget works as a search-in-chat experience returning ranked excerpts — no API cost
- Fully Configurable: Admin "Chat Widget" page controls title, welcome message, placeholder text, primary color, position (bottom-left/right), max results, and editable system/user prompt templates
- Dedicated Rate Limiting: Separate per-IP (5/min) and global (30/min) limiters independent from the search and API limiters
- Source Attribution: Every response includes the content pages whose excerpts were used, with titles and paths
Multi-User Access Control & Approvals (v2.0+, v6.0+)
- Role-Based Access Control (RBAC): Four roles — admin, editor, contributor, viewer — with granular permission enforcement on all admin UI pages and REST API endpoints
- Contributor Role (v6.0+): Create content, upload assets, post comments, and submit for editorial approval — without publish rights
- Approval Workflows (v6.0+): Configurable trigger-based workflows (by role, folder, template, or tag). Sequential or concurrent mode. Default (no workflow): any editor or admin can approve
- Content Approvals Dashboard (v6.0+): My Queue, Other Pending, and Workflow Config at
/cm/approvals. Sidebar badge shows pending count - Content Discussion (v6.0+): Inline threaded comments on every content edit page. @mention autocomplete, admin delete, live count badge
- User Management: Admin panel for creating users, assigning roles, disabling accounts, and resetting passwords
- Audit Log: Persistent, searchable log of all mutations (who did what, when) with 365-day retention
- Rate Limit Dashboard (v4.5+): New tab on the audit log page showing locked IPs, attempt counts, and a clear button
- User-Scoped API Keys: API keys inherit the permissions of their owning user
- Force Password Change: Temporary passwords trigger a mandatory change on first login
Smart End-User Search
- Hybrid Search: Combines full-text exact matching with semantic vector search (Voyage AI embeddings), merged via reciprocal rank fusion
- Configurable Ranking: All ranking weights editable in the admin panel — nav boost, title boost, boosted templates, demoted path prefixes, and penalty scores
- Intelligent Defaults: Nav-linked pages surface first, concept-template pages rank above generic content, video transcripts are deprioritised
- Title Boost: Pages where the query appears in the title always rank above body-only matches
- Typeahead Suggestions: Fast prefix-matching suggestions — pages for direct navigation, keywords for full search — with the same structural ranking
- Works Without Embeddings: Falls back to full-text search if no Voyage API key is configured
- Rate Limiting: Per-IP and global rate limiting for DDoS protection
Developer & Integration
- REST API: Full
/api/v1/JSON API with API key and OAuth token authentication, RBAC-enforced - MCP Server: 130 tools + 3 prompt resources for agentic website management (stdio + HTTP streamable)
- OAuth 2.1: Authorization code flow with PKCE for remote MCP clients — no embedded passwords
- CLI Tool: Command-line interface for all content management operations
- URL Redirects: 301/302 redirect rules managed from the admin panel
- Webhooks (v4.5+): HMAC-SHA256 signed event delivery for 6 event types (
content.create,content.update,content.publish,content.unpublish,content.delete, and more); per-webhook secrets; delivery history with retry visibility; admin UI at/cm/webhooks. Webhook URLs must be publicly reachable: a URL that resolves to a loopback, private or link-local address is refused and logged as "blocked" (v7.4.3) - Cloudflare Integration (v4.5+): Auto-purge Cloudflare cache on publish/unpublish via Zone ID + API Token
- Edge Caching Headers (v4.5+): ETag, Cache-Control, Last-Modified, Vary, and 304 Not Modified on all public pages
- Structured JSON Logging (v4.5+): All server logs emit structured JSON with timestamp, level, message, and context fields
Site Customization
- Theme Customization: Colors, fonts, border radius, custom CSS — all editable in the admin panel with version history
- Header/Footer HTML: Full HTML control over site chrome injected around all pages
- Asset Management: Upload and manage images, documents, and other files with path-based serving
Prerequisites
- Go 1.24 or later
- MongoDB Atlas account (free tier works great)
Quick Start
- Clone the repository
- Copy
config.dev.json.exampletoconfig.dev.json - Edit
config.dev.jsonwith your MongoDB connection string - Run
go run cmd/server/main.go - Visit http://localhost:8082/cm and log in with your email and password
- On first run, an admin account is created — set
LIGHTCMS_ADMIN_EMAILto use your email, or it defaults toadmin@localhost
MongoDB Atlas Setup
Step 1: Create an Atlas Account
- Go to MongoDB Atlas
- Sign up for a free account (no credit card required)
Step 2: Create a Cluster
- Click "Build a Database"
- Select "M0 FREE" (Shared) tier
- Choose your preferred cloud provider and region (closest to you)
- Click "Create Deployment"
Step 3: Set Up Database Access
-
Create a database user:
- Username:
lightcms(or your choice) - Password: Generate a secure password (save this!)
- Click "Create User"
- Username:
-
Add your IP address:
- Click "Add My Current IP Address"
- Or add
0.0.0.0/0to allow access from anywhere (less secure, but convenient for development) - Click "Finish and Close"
Step 4: Get Your Connection String
- Click "Connect" on your cluster
- Select "Drivers"
- Copy the connection string, it looks like:
- Replace
<password>with your actual password
Step 5: Create Your Config File
For development, copy the example and fill in your values:
Edit config.dev.json:
For production, use config.prod.json:
Edit with production values (use openssl rand -hex 32 for session_secret).
Installation
Or use the run script:
Configuration
LightCMS uses JSON config files. Create either:
config.dev.json- for developmentconfig.prod.json- for production (takes precedence if both exist)
When MONGO_URI is set, configuration comes from environment variables instead (MONGO_URI, SESSION_SECRET, BASE_URL, PORT, ENV, SECURE_COOKIES).
Database name. The server and the cmd/ tools use the database lightcms unless told otherwise. Set the DATABASE_NAME environment variable (it wins over database_name in the config file) to point an instance at another database on the same cluster, for example a staging or test copy. The server logs the database it connected to at startup.
Plain HTTP in development. With secure_cookies: false the admin works over http://localhost: cookies are not marked Secure and the CSRF origin check compares against http://. With secure_cookies: true (the production default) the admin must be reached over HTTPS; the CSRF check rejects plain-HTTP origins.
Note: Config files contain secrets and are excluded from git via .gitignore.
Usage
Accessing the Site
- Public site: http://localhost:8082
- Admin panel: http://localhost:8082/cm
First Login
Log in at /cm/login with your email and password. On first startup with an empty database, LightCMS creates an admin account from the LIGHTCMS_ADMIN_EMAIL environment variable (defaults to admin@localhost with password admin123). Change your password immediately after logging in.
To reset a password from the command line:
Creating Content
- Log in to the admin panel at
/cm - Go to Content → New Content
- Select a template (Blog Post, Press Release, Explanatory Page, etc.)
- Fill in the fields
- Check "Published" and save
Managing Users (Admin Only)
- Go to Users in the left sidebar (visible to admins only)
- Create users with email, display name, and role (admin / editor / viewer)
- Users receive a temporary password and are prompted to change it on first login
- Disable accounts or reset passwords from the edit page
- View a full audit trail of all user actions at Audit Log
Creating Custom Templates
- Go to Templates → New Template
- Define your fields (text, textarea, richtext, date, image, select)
- Create an HTML layout using
{{.field_name}}placeholders - Save the template
Available placeholders:
{{.title}}- Content title{{.slug}}- URL slug{{.published_at}}- Publication date{{.your_field_name}}- Any custom field you define
Dynamic Index Pages: Tags, Snippets, and lc:query
LightCMS includes a system for building dynamic index pages that automatically update as you publish content. Three features work together: tags label individual pages, snippets define how each result is rendered, and lc:query directives embed live queries directly inside template layouts.
Tags
Tags are freeform string labels you attach to any content item. A page can have zero or many tags. They're the primary way to group content for querying.
Setting tags in the admin UI:
- Open any content item in the editor
- Find the Tags field (below the main fields)
- Type a tag name and press Enter — repeat for multiple tags
- Save the content item
Setting tags via the API:
Tags are exact-match strings. Capitalization and spaces are preserved — "AI & Machine Intelligence" and "ai & machine intelligence" are treated as different tags.
Snippets
A snippet is a named HTML template fragment stored in the CMS. When lc:query runs, it renders each matching content item through a snippet and concatenates the results.
Creating a snippet:
- Go to Settings → Snippets in the admin panel
- Click New Snippet, give it a name (e.g.
glossary-pill) - Write HTML using Go template variables:
Available variables inside a snippet:
Example snippets:
A pill-style link (for glossary / tag cloud layouts):
A card with description:
A simple list item:
lc:query Directives
An lc:query directive is an HTML comment you embed in a template layout. At page generation time — before the page is rendered — the CMS finds all matching content items, renders each one through the named snippet, and replaces the comment with the combined HTML.
Syntax:
Attributes:
Example in a template layout:
After the page is published, the directive is replaced with the rendered output of every published page tagged AI & Machine Intelligence, each passed through the glossary-pill snippet:
Important: lc:query directives must be placed in the template's HTML layout field, not inside content data fields. The CMS processes them during page generation before Go's template engine runs (which would otherwise strip HTML comments).
Automatic Regeneration
Index pages that use lc:query are automatically regenerated whenever:
- A tagged content item is published or updated
- The template layout is changed
- The snippet is updated
- Regenerate All is triggered manually from the admin panel
This means you never need to manually rebuild your index pages — publish a new concept page tagged "Games & Interactive Experiences" and it appears in every index that queries for that tag within seconds.
Complete Walkthrough: Building a Tagging-Powered Index
Here's how to build a concepts glossary that automatically stays up to date.
Step 1: Tag your concept pages
For each concept page, add the appropriate tag in the content editor. You can use as many tags as you like, and the same content item can appear in multiple index sections.
Step 2: Create a snippet
In Settings → Snippets, create a snippet named glossary-pill:
Step 3: Create a template with lc:query sections
Create a new template (e.g. "Concepts Index") with this HTML layout:
Note that {{.title}} is the Go template variable for the content item's title. Template variables use Go's {{.field}} syntax and are resolved after lc:query directives are expanded.
Step 4: Create and publish an index page
Create a new content item using your "Concepts Index" template. Give it a title and slug (e.g. /glossary). Publish it — the static page is generated with all the current tagged content already in place.
Step 5: Keep publishing
From now on, every time you create and publish a new concept page with a matching tag, all index pages that query for that tag are automatically regenerated and updated.
Template Variables
Beyond content data fields, templates have access to a few built-in variables:
Custom fields defined on your template are available directly by key. If you define a field with key intro, it's available as {{.intro}} in the layout. Richtext fields are automatically marked safe — their HTML is rendered as-is without escaping.
Content Authoring: Pre-Processing & Markup Features
LightCMS processes content field values before rendering them into your template. Authors can use the following markup features in any text or richtext data field.
Wikilinks
Link between pages using double-bracket syntax. Wikilinks are resolved at publish time and automatically kept up to date when a page's title or path changes.
Broken links (no matching page found) render as <span class="broken-link">Page Title</span> so they are easy to identify and fix.
Snippet Includes
Embed a named snippet inline inside any content field:
The snippet-name must exactly match the Name field of a snippet in Settings → Snippets. Snippet includes are useful for reusable content blocks such as callouts, disclaimers, and calls to action that appear on many pages.
Table of Contents
Place {{.lc_toc}} anywhere in your template's HTML layout to inject an auto-generated table of contents at that position:
At page generation time, LightCMS scans all headings in the final rendered HTML and outputs a <nav class="lc-toc"> block with anchor links to each one. Headings automatically receive id= attributes derived from their text content (see Heading IDs below), so the TOC links work without any extra setup.
Heading IDs
All headings (<h1> through <h6>) in rendered page output automatically receive id= attributes derived from their text. This enables deep-linking to specific sections.
Example:
The id is generated by lowercasing the text and replacing spaces and punctuation with hyphens. If two headings produce the same id, a numeric suffix is appended (getting-started-2, etc.).
Markdown Field Type
Template fields can be given the type markdown instead of text or richtext. Markdown fields support GitHub Flavored Markdown (GFM) including tables, strikethrough, task lists, and autolinks. The field value is converted to HTML at page generation time.
Markdown fields are a good choice for structured content that benefits from simple markup without a WYSIWYG editor — documentation pages, changelogs, FAQs, and similar content.
To create a Markdown field, set the field type to markdown when defining the template:
Inline Tag Detection
Mention #tagname anywhere in a content field to automatically tag the page with that label. The tag is added to the page's tag list and participates in lc:query index pages just like manually applied tags.
Tag rules:
- Must start with a letter
- May contain letters, numbers, underscores, or hyphens
- Example:
This article covers #machine-learning and #aiadds both tags
This is a convenient alternative to editing the Tags field separately — useful when writing content in Markdown fields or richtext where you want to tag inline.
Creating Collections
Collections display grouped content (like a blog listing page).
- Go to Collections → New Collection
- Set the category filter to match your content's category
- Define item and page templates
- The collection will be available at
/collection-slug
Customizing the Theme
- Go to Theme in the admin panel
- Adjust colors, fonts, and border radius
- Add custom CSS if needed
- Save to apply changes site-wide
End-User Search
LightCMS exposes a public search API at /api/search that your site's frontend can call.
Search API
match_type is exact, semantic, or both.
Typeahead Suggest API
Returns two lists for building a live typeahead dropdown:
- keywords — extracted from published content; clicking one triggers a full search
- pages — direct-navigation results, ranked by: nav-linked → boosted-template → title-starts-with → title-contains → demoted paths
JavaScript Example
Ranking Configuration
Ranking weights are configurable in the admin panel under Tools → End User Search → Search Ranking. Defaults: title-match boost 0.20, nav-page boost 0.15, concept-template boost 0.05, video-path penalty −0.05. Configure your Voyage AI key under Configuration to enable semantic search.
Project Structure
Default Templates
Blog Post
Fields: title, excerpt, featured_image, content, author, tags
Press Release
Fields: headline, subheadline, dateline, release_date, body, boilerplate, contact_info
Explanatory Page
Fields: title, subtitle, hero_image, intro, main_content, sidebar, cta_text, cta_link
Concept Page
Fields: title, definition, topic_links — ideal for wiki-style knowledge base entries
Standard Page, Blank Page, Homepage
General-purpose layouts for flexible content.
Multi-User Access Control
LightCMS v2.0+ supports multiple users with role-based permissions.
Roles
Audit Log
Every mutation (content create/update/delete/publish, user management, settings changes, logins) is logged with the acting user's email, timestamp, and relevant details. Logs are retained for 365 days and accessible at /cm/audit.
API Key Permissions
API keys created by a user inherit that user's role. A key created by an editor cannot perform admin-only operations even if its token is shared. Admins can manage all keys; non-admins can only manage their own.
First-Time Migration
On first startup with an empty users collection, LightCMS automatically creates an admin user from the existing password hash in the database. Set the LIGHTCMS_ADMIN_EMAIL environment variable to specify which email address to use (defaults to admin@localhost).
API Keys
API keys are required for the REST API, MCP server, and CLI tool. Create them from the admin panel.
- Log in at
/cm - Go to Settings → API Keys
- Click Create New Key, give it a name and description
- Copy the key immediately — it's only shown once
Keys use the format lc_ followed by 32 hex characters. They're stored as SHA-256 hashes and inherit the permissions of the creating user.
OAuth 2.1 Authorization
LightCMS implements OAuth 2.1 so that remote MCP clients (like Claude's Cowork) can securely connect without embedding passwords or API keys. This follows the standard authorization code flow with PKCE.
Endpoints
Security
- PKCE (S256) required for all authorization requests
- Token rotation: refresh tokens are single-use; a new pair is issued each time
- Short-lived access tokens: 1-hour TTL
- Refresh tokens: 30-day TTL, revocable
- Rate limiting: failed login attempts trigger progressive lockouts (1 min → 5 min → 15 min)
- All tokens stored as SHA-256 hashes in the database
How Clients Connect
- Client fetches
/.well-known/oauth-authorization-serverto discover endpoints - Client calls
POST /oauth/registerwith its name and redirect URI - Client redirects admin to
/oauth/authorizewith PKCE challenge - Admin enters password and approves access
- Client exchanges the authorization code for access + refresh tokens
- Client uses the access token as a Bearer token on
/mcpor/api/v1/endpoints
This is all handled automatically by MCP-compatible clients — you just provide your LightCMS URL and approve the connection.
REST API
LightCMS provides a full REST API at /api/v1/ authenticated with API keys or OAuth tokens. All endpoints enforce RBAC — the permissions of the authenticated user (or key owner) determine what's allowed.
Authentication
Include an API key or OAuth access token in the Authorization header:
Endpoints
All endpoints return JSON. PUT endpoints support partial updates (only include fields you want to change).
CLI Tool
The lightcms CLI provides command-line access to all content management operations.
Installation
Configuration
Or use flags: --url and --api-key.
Commands
Run lightcms --help for full usage.
MCP Server (AI-Powered Content Management)
LightCMS includes a full MCP (Model Context Protocol) server with 130 tools and 3 prompt resources for managing your entire website through AI agents. It supports two transport modes:
- Stdio — for local tools like Claude Code
- HTTP Streamable — for remote/sandboxed clients like Claude's Cowork, Claude Desktop, or any MCP-compatible app
Option A: Local Setup (Claude Code via Stdio)
Best for developers using Claude Code directly on the same machine.
- Create an API key in the admin panel at
/cm→ Settings → API Keys - Run the setup script:
Or register manually:
Restart Claude Code and run /mcp to verify.
Option B: Remote Setup (Cowork / Claude Desktop via HTTP + OAuth)
Best for sandboxed desktop apps that can't run local binaries. The HTTP MCP endpoint at /mcp supports OAuth 2.1 authorization — no API keys or passwords need to be embedded in the client.
How it works:
- The client discovers your LightCMS instance via well-known endpoints
- It registers as an OAuth client (one-time, automatic)
- You authorize the client by entering your admin password in the browser
- The client receives short-lived access tokens and refreshes them automatically
To connect from a remote MCP client, just provide your LightCMS URL (e.g., https://yoursite.example.com). The client handles the rest using standard OAuth 2.1 discovery.
Discovery endpoints:
Authentication
The MCP HTTP endpoint accepts both authentication methods:
- API keys (
lc_prefix) — long-lived, created in admin panel - OAuth 2.1 tokens — short-lived, obtained through the authorization flow
Both methods enforce RBAC based on the authenticated user's role.
Available Tools (130 total) + 3 Prompt Resources
- Content (19): list, read, create, update, update by path, delete, restore, publish, unpublish, publish multiple, preview, versions (list + get), revert, bulk create, bulk update, bulk field operation, export, backlinks
- Templates (5): create, read, update, delete, list
- Snippets (5): create, read, update, delete, list
- Assets (6): upload, upload from URL, read, delete, list files and folders
- Search (7): full-text search, end-user search, search-and-replace (global + scoped, preview + execute), reindex embeddings
- Settings (23): theme CRUD + versioning + pinning, site config, redirects, folders, collections, regenerate all content
- Forks (9): list, create, get, fork page, remove page, merge, archive, delete, purge copies
- Import (10, v5.0+): list/create/update/delete/trigger import sources, import markdown, import CSV, list/get/cancel import jobs
- Webhooks (6, v4.5+): list, create, update, delete webhooks; regenerate secret; list deliveries
- Content Locking (4, v4.5+): get lock, acquire lock, release lock, force-unlock
- Scheduled Publishing (3, v4.5+): schedule publish, list scheduled, cancel scheduled
- Audit & Link Check (3, v4.5+): list audit logs, start link check, get link check results
- Comments (3, v6.0+): list comments, post comment, delete comment
- Approvals (11, v6.0+): list/get/create/update/delete approval workflows; list/get/submit/approve/reject/cancel approval requests
- Agent Sandbox & Governance (10, v7.0+): start/get/end agent sandbox, fork diff, agent session changes, session rollback, maintenance report, run maintenance scan, backfill published dates, repair fork damage
- IndexNow (3, v7.2.3+): get status, enable/disable, submit
- SEO & AI (3, v7.3+): get/update SEO settings, AI traffic
- Prompt Resources (3, v4.5+):
lightcms://site/structure,lightcms://content/recent,lightcms://theme/config
For detailed API documentation, see MCP.md.
Environment Variables (Stdio Mode)
LIGHTCMS_URL— Server URL (default:http://localhost:8082)LIGHTCMS_API_KEY— API key (required for stdio mode)
MCP Examples
These examples show how the MCP tools work together to manage a website through natural language. Each example lists the user prompt and the exact MCP tool calls that execute behind the scenes.
Example 1: Create and Publish a Blog Post
Prompt: "Create a blog post about AI agents and publish it"
Tool calls:
list_templates— finds the Blog Post template and its IDcreate_content— creates the post with template ID, title, slug, and field data:publish_content— makes it live; a static HTML page is generated at/rise-of-ai-agents
Example 2: Update the Site Theme
Prompt: "Change the site colors to a dark theme with blue accents"
Tool calls:
get_theme— reads current theme settings (colors, fonts, header/footer HTML)update_theme— applies the new palette: All published pages are automatically regenerated with the new theme.
Example 3: Search and Replace Across the Entire Site
Prompt: "Replace 'Acme Corp' with 'Acme Industries' everywhere on the site"
Tool calls:
search_replace_preview— shows affected pages without making changes: Returns a list of content items, matched fields, and match counts.search_replace_execute— applies the replacement after user confirmation. Each affected content item gets a new version for rollback capability.
Example 4: Create a Custom Template
Prompt: "Create a template for team member profiles with name, role, bio, and photo"
Tool calls:
create_template— defines the structure and HTML layout: The template is immediately available for creating content.
Example 5: Upload an Image and Use It in Content
Prompt: "Upload this logo and add it to the about page"
Tool calls:
upload_asset— uploads the file as base64 with a serve path: The image is now accessible at/images/logo.png.get_content— retrieves the about page by path to get its current dataupdate_content— adds the image reference to the page's content field
Example 6: Set Up URL Redirects
Prompt: "The old blog moved from /news to /blog — set up redirects for the old URLs"
Tool calls:
create_redirect— creates a permanent redirect: Visitors to/newsare automatically redirected to/blog. Multiple redirects can be created in sequence for different paths.
Example 7: Content Versioning and Rollback
Prompt: "Show me the version history for the homepage, then revert to version 2"
Tool calls:
get_content— retrieves the homepage by path (/) to get its IDget_content_versions— returns the full version history with timestamps and comments:revert_to_version— rolls back to version 2, creating a new version 6 with the old data. The published page is regenerated immediately.
Example 8: Organize Content with Folders
Prompt: "Create a /docs section and move the API reference page into it"
Tool calls:
create_folder— creates the URL path segment:get_content— retrieves the API reference page to get its IDupdate_content— moves it into the new folder: The page is now accessible at/docs/api-referenceinstead of/api-reference.
Example 9: Build a Content Collection (Blog Index)
Prompt: "Create a blog listing page that shows all blog posts sorted by newest first"
Tool calls:
create_collection— defines the collection with category filter, sorting, and display templates: A paginated blog listing is now live at/blog, automatically including any content with category "blog".
Example 10: Build a Dynamic Tagged Index Page
Prompt: "Create a glossary index that automatically lists all my concept pages grouped by category, and keep it updated as I add new pages"
Tool calls:
-
create_snippet— creates a reusable rendering template for each result: -
create_template— creates the index page template withlc:querydirectives embedded: -
create_content— creates the index page using the new template: -
update_content— tags several existing concept pages (each call): -
publish_content— publishes the index page; thelc:querydirectives are resolved at this moment and the page is generated with all currently-tagged content already populated.
From now on, every time a new concept page is published with a matching tag, the index page at /glossary is automatically regenerated — no further action needed.
Example 11: Full-Text Search and Content Audit
Prompt: "Find all pages that mention 'pricing' and show me which ones are still in draft"
Tool calls:
search_content— performs a full-text search across all content fields: Returns matching content items with their publish status, paths, and which fields matched: The two draft items can then be reviewed, edited, and published as needed.
Example 12: Bulk Content Migration
Prompt: "Add a 'last_reviewed' field to every page in our /docs section and publish them all"
Tool calls:
-
list_content— fetches all content under/docswith full field data in one call:Returns IDs, titles, current field values, and publish status for all 34 pages.
-
(parallel) Agent fans out into batches of 50 and calls
bulk_update_contentconcurrently:auto_republish: truere-publishes every previously-published page immediately — no separate publish step needed.
All 34 pages are updated and live in two parallel calls instead of 34 sequential ones.
Example 13: Fork-Based Staged Redesign
Prompt: "Redesign the homepage and /about page in a staging area so I can preview before publishing"
Tool calls:
-
create_fork— creates a named staging workspace:Returns a fork ID. The live site is completely unaffected.
-
fork_page— copies the homepage into the fork and applies edits: -
fork_page— does the same for/about:A floating preview bar is injected into the live site — visiting it with the fork cookie active shows both pages exactly as they'll look after merge.
-
merge_fork— after approval, merges both fork pages into live content and regenerates their static HTML:Returns a summary of merged pages (counts plus
created_idsandupdated_ids) and any conflicts detected. Pages the fork adds are created as drafts unless you pass"publish_new": true; pages on hold always stay drafts. The fork's page copies are deleted once the merge succeeds.
Example 14: Site-Wide Notice with Auto-Republish
Prompt: "Prepend a deprecation notice to all pages in our /v1 docs section and republish them"
Tool calls:
bulk_field_operation— appends the notice to a specific field across the entire folder in one call: Returns counts of updated and republished pages. The live site reflects the change immediately.
If the notice ever needs to be removed, a single scoped_search_replace_execute with the exact notice HTML reverts all pages in one call.
Working with Snippets
Content Tagging & Index Pages
Bulk Operations
Regex Search & Replace
Wikilinks
Content Versioning
Development
Security Notes
For production:
- Use a strong
session_secret— minimum 32 characters (generate withopenssl rand -hex 32). The server hard-fails on startup if this requirement isn't met in production. - Set
LIGHTCMS_ADMIN_EMAILso the initial admin account uses your real email - Change the default admin password immediately after first login
- Use HTTPS (put behind a reverse proxy like nginx or caddy)
- Restrict MongoDB Atlas IP whitelist to your server IPs
- API keys inherit the permissions of their owning user — keep admin keys secure
- Review the audit log regularly at
/cm/audit - Regularly backup your MongoDB database
- Configure
max_upload_bytesin site settings to cap file upload size for your use case
Security features built in:
- CSRF protection on all
/cmroutes - Admin Content-Security-Policy: scripts and stylesheets load from the site itself only (the editor's Quill files are vendored, not fetched from a CDN)
- RBAC permission checks on all admin handlers and REST API endpoints
- Session cookies: SameSite=Strict, 24-hour expiry, Secure in production
- File uploads: extension whitelist + MIME validation + configurable size cap
- API request body cap: 10 MiB enforced on all
/api/v1/endpoints - Login rate limiting: escalating lockouts (1 min → 5 min → 15 min)
- Per-endpoint rate limiters: regenerate (2/min), search-replace execute (10/min), bulk-update (5/min), export (5/min), reindex (1/min)
- Passwords: bcrypt with cost=12
- Audit logging on all mutations with 365-day retention
- Fly.io deployments:
Fly-Client-IPheader used for real client IP (unspoofable, unlikeX-Forwarded-For) - Chat widget prompt injection defense: user input wrapped in XML delimiters,
</sequences escaped
Privacy Policy
LightCMS is self-hosted software — you control your database, your hosting, and your data. The MCP server and CLI tool connect to your LightCMS instance via the REST API — no data is transmitted to Metavert LLC or any third party.
For the full privacy policy, see: https://www.metavert.io/lightcms-privacy-policy
License
MIT
來源:README.md,提交 8170787
工具
0版本歷史
2- v7.3.4最新Oct 5, 2026
- v1.1.0Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分