Ghost CMS
name: ghost-cms-skill
by chrisagiddings · published 2026-03-22
$ claw add gh:chrisagiddings/chrisagiddings-ghost-cms---
name: ghost-cms-skill
description: Comprehensive Ghost CMS integration for creating, publishing, scheduling, and managing blog content, newsletters, members, and analytics. Use when working with Ghost blogs for content creation (drafts, publishing, scheduling), member/subscriber management (tiers, newsletters), comment moderation, or analytics (popular posts, subscriber growth). Supports all Ghost Admin API operations.
author: Chris Giddings
homepage: https://github.com/chrisagiddings/moltbot-ghost-skill
repository: https://github.com/chrisagiddings/moltbot-ghost-skill
metadata: {"openclaw":{"disable-model-invocation":true,"capabilities":["content-management","member-management","subscription-management","comment-management","user-management","media-management","destructive-operations","public-publishing"],"requires":{"env":["GHOST_ADMIN_KEY","GHOST_API_URL"],"bins":["node","npm"]},"primaryEnv":"GHOST_ADMIN_KEY","install":{"type":"npm","directory":"scripts","command":"npm install","dependencies":["form-data@^4.0.5","jsonwebtoken@^9.0.3"]},"credentials":{"types":[{"type":"file","locations":["~/.config/ghost/api_key","~/.config/ghost/api_url"],"description":"Ghost Admin API credentials"},{"type":"env","variables":[{"name":"GHOST_ADMIN_KEY","description":"Ghost Admin API key (JWT)","required":true},{"name":"GHOST_API_URL","description":"Ghost site URL (Ghost Pro OR self-hosted, include :PORT if needed)","required":true}]}]}}}
---
# Ghost CMS
Manage Ghost blog content, members, analytics, and newsletters through the Ghost Admin API.
⚠️ Security Warning
**Ghost Admin API keys provide FULL access to your Ghost site:**
**Published content is IMMEDIATELY PUBLIC** - be extra careful with publish operations.
**Security Best Practices:**
**Admin API Key Scope:**
Ghost Admin API keys have **no scoping options** - they provide full access to everything. There are no read-only keys.
**Operation Types:**
**Read-Only Operations** (✅ Safe):
**Destructive Operations** (⚠️ Modify or delete data, may be public):
For detailed operation documentation, see [api-reference.md](references/api-reference.md).
Quick Setup
1. **Get your Ghost Admin API credentials:**
- Ghost dashboard → Settings → Integrations
- Create a new "Custom Integration"
- Copy the **Admin API Key** and **API URL**
2. **Store credentials securely:**
**Option A: Environment Variables (Recommended)**
```bash
# Add to your shell profile (~/.zshrc, ~/.bashrc)
export GHOST_ADMIN_KEY="YOUR_ADMIN_API_KEY"
export GHOST_API_URL="YOUR_GHOST_URL"
```
**API URL Examples (works with ALL hosting types):**
```bash
# Ghost(Pro) hosted
export GHOST_API_URL="https://yourblog.ghost.io"
# Self-hosted with reverse proxy (production)
export GHOST_API_URL="https://blog.yourdomain.com"
# Self-hosted development (Ghost default port 2368)
export GHOST_API_URL="http://localhost:2368"
# Self-hosted with custom port
export GHOST_API_URL="https://ghost.example.com:8080"
```
**Important:**
- Always include protocol (`http://` or `https://`)
- Include `:PORT` if Ghost runs on non-standard port
- Do NOT include trailing slash
- Do NOT include `/ghost/api/admin` (added automatically)
**Option B: Config Files**
```bash
mkdir -p ~/.config/ghost
echo "YOUR_ADMIN_API_KEY" > ~/.config/ghost/api_key
echo "YOUR_GHOST_URL" > ~/.config/ghost/api_url
# Secure the files (owner read-only)
chmod 600 ~/.config/ghost/api_key
chmod 600 ~/.config/ghost/api_url
```
**Option C: 1Password CLI (Most Secure)**
```bash
# Store key in 1Password
op item create --category=API_CREDENTIAL \
--title="Ghost Admin API" \
admin_key[password]="YOUR_ADMIN_API_KEY" \
api_url[text]="YOUR_GHOST_URL"
# Use in commands
export GHOST_ADMIN_KEY=$(op read "op://Private/Ghost Admin API/admin_key")
export GHOST_API_URL=$(op read "op://Private/Ghost Admin API/api_url")
```
**Security Notes:**
- Keys provide **full site access** - protect them like passwords
- Rotate keys every 90 days (create new integration, revoke old)
- Never commit to git or share keys publicly
- Consider separate keys for production vs. staging
- **HTTPS recommended:** Use HTTPS for production (HTTP acceptable for localhost only)
3. **Install dependencies:**
```bash
cd ghost-cms-skill/scripts
npm install
```
**Dependencies installed:**
- `form-data` (^4.0.5) - Multipart file uploads (theme ZIP files)
- `jsonwebtoken` (^9.0.3) - JWT token generation for Ghost Admin API authentication
**Optional dependencies** (install manually if needed):
- `gscan` (^5.2.4) - Official Ghost theme validator (from TryGhost)
- Only needed for theme validation feature
- Install with: `cd scripts && npm install gscan`
**All dependencies from public npm registry. No custom downloads.**
4. **Test connection:**
See [setup.md](references/setup.md) for detailed authentication and troubleshooting.
Tools & Utilities
Snippet Extractor
**Purpose:** Migrate existing Ghost snippets to local library for programmatic use.
**Why needed:** Ghost Admin API blocks snippet access (403 Forbidden) for integration tokens. This tool works around that limitation.
**Usage:**
# Extract snippets from a specially-formatted draft post
node scripts/snippet-extractor.js my-snippets-post
# Validate format before extracting
node scripts/snippet-extractor.js my-snippets-post --validate
# Preview without saving
node scripts/snippet-extractor.js my-snippets-post --dry-run
# Custom marker prefix
node scripts/snippet-extractor.js my-snippets-post --marker "This is:"
# Full help
node scripts/snippet-extractor.js --help**Workflow:**
1. Create draft post in Ghost
2. For each snippet: add paragraph marker (e.g., "SNIPPET: name" or "This is: name")
3. Insert the snippet content below each marker
4. Run extractor → all snippets saved to `snippets/library/`
**Features:**
**Example:**
# User has 12 snippets in Ghost
# Creates "My Snippets" draft with markers
# Runs: node scripts/snippet-extractor.js my-snippets --marker "This is:"
# Result: All 12 snippets in library/ ready for useSee `snippets/README.md` for complete documentation.
Theme Manager
**Purpose:** Upload, activate, switch, and manage Ghost themes programmatically.
**Why needed:** Automate theme deployments, switch themes, manage theme versions.
**Usage:**
cd scripts
# List all installed themes
node theme-manager.js list
# Upload theme ZIP
node theme-manager.js upload /path/to/theme.zip
# Upload and activate immediately
node theme-manager.js upload /path/to/theme.zip --activate
# Activate existing theme
node theme-manager.js activate theme-name
# Download theme backup
node theme-manager.js download theme-name backup.zip
# Delete theme (cannot delete active theme)
node theme-manager.js delete old-theme
# Show current active theme
node theme-manager.js active**Features:**
**⚠️ Important:**
**Workflow:**
# Safe theme switching with rollback
node theme-manager.js active # Note current theme
node theme-manager.js activate new-theme # Switch to new theme
# Test site in browser
node theme-manager.js activate old-theme # Rollback if neededSee `references/themes.md` for complete theme management documentation and best practices.
Theme Validator
**Purpose:** Validate Ghost themes before uploading using official gscan validator.
**⚠️ Optional Feature:** Requires `gscan` package. Install with:
cd scripts
npm install gscan**Why needed:** Catch errors early - missing files, invalid syntax, deprecated helpers, version incompatibility.
**Usage:**
cd scripts
# Validate theme directory
node theme-validator.js ~/themes/my-theme/
# Validate ZIP file
node theme-validator.js theme.zip
# Target specific Ghost version
node theme-validator.js theme.zip --version v6
# JSON output for CI/CD
node theme-validator.js theme.zip --json
# Show only errors (hide warnings)
node theme-validator.js theme.zip --errors-only**Features:**
**Validation levels:**
**Safe deployment workflow:**
# 1. Validate before upload
node theme-validator.js my-theme.zip
# 2. Fix any errors
# 3. Re-validate
node theme-validator.js my-theme.zip
# 4. Upload when clean
node theme-manager.js upload my-theme.zip**CI/CD integration:**
node theme-validator.js theme.zip --json
if [ $? -eq 0 ]; then
node theme-manager.js upload theme.zip --activate
fi**Exit codes:** 0 = valid, 1 = errors found, 2 = invalid arguments
See `references/themes.md` for complete validation documentation and common error fixes.
---
Core Operations
This skill covers all major Ghost operations. Navigate to the relevant reference for detailed guidance:
Content Management
**When to use:** Creating drafts, publishing posts, scheduling content, managing pages
See **[content.md](references/content.md)** for:
See **[lexical-cards.md](references/lexical-cards.md)** for:
**⚠️ Ghost Snippets Limitation:**
Ghost's native snippet feature (reusable content blocks saved in the editor) **cannot be accessed via the Admin API** with integration tokens (403 Forbidden). This means:
**Solution: Automated Snippet Extraction**
The skill includes a **snippet extractor tool** that migrates Ghost snippets to local files:
1. **Create extraction post** in Ghost with all snippets (one-time setup)
2. **Run extractor:** `node scripts/snippet-extractor.js post-slug`
3. **Done!** All snippets saved to `snippets/library/` for programmatic use
**Commands:**
# Extract snippets (auto-detects credentials from ~/.config/ghost/)
node scripts/snippet-extractor.js my-snippets-post
# Validate format before extracting
node scripts/snippet-extractor.js my-snippets-post --validate
# Preview without saving
node scripts/snippet-extractor.js my-snippets-post --dry-run
# Custom marker format
node scripts/snippet-extractor.js my-snippets-post --marker "This is:"
# Full help
node scripts/snippet-extractor.js --help**Benefits:**
See `snippets/README.md` for complete documentation on extraction workflow and local snippet usage.
Analytics & Insights
**When to use:** Checking subscriber counts, popular content, traffic trends
See **[analytics.md](references/analytics.md)** for:
Comments & Engagement
**When to use:** Responding to comments, moderating discussions
See **[comments.md](references/comments.md)** for:
Members & Subscribers
**When to use:** Managing subscriber tiers, member access, premium content
See **[members.md](references/members.md)** for:
Newsletters
**When to use:** Managing newsletter settings, email campaigns
See **[newsletters.md](references/newsletters.md)** for:
API Reference
For advanced operations or endpoint details, see **[api-reference.md](references/api-reference.md)**.
Common Workflows
**Draft → Notion → Ghost:**
1. Draft content collaboratively in Notion
2. Finalize content
3. Use this skill to copy to Ghost as draft
4. Review in Ghost admin
5. Schedule or publish
**Weekly content series:**
1. "Navi, write and publish a unique weekly post about [topic from our discussions this week]"
2. Skill creates post, sets author to "Navi", publishes automatically
**Comment management:**
1. "Are there any pending comments?"
2. Review list of comments with post titles
3. "Respond to comment #123 with [response]"
**Analytics check:**
1. "What tags have been most popular in the past 6 months?"
2. "How many new subscribers this month?"
3. "When was my last subscriber-exclusive post?"
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...