Ghost CMS
by @chrisagiddings
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.
clawhub install ghost-cmsπ About This Skill
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.
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)
# 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):
# 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
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)
# 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:
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 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-postValidate format before extracting
node scripts/snippet-extractor.js my-snippets-post --validatePreview without saving
node scripts/snippet-extractor.js my-snippets-post --dry-runCustom 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:
~/.config/ghost/ or env varsExample:
# 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 use
See 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 scriptsList all installed themes
node theme-manager.js listUpload theme ZIP
node theme-manager.js upload /path/to/theme.zipUpload and activate immediately
node theme-manager.js upload /path/to/theme.zip --activateActivate existing theme
node theme-manager.js activate theme-nameDownload theme backup
node theme-manager.js download theme-name backup.zipDelete theme (cannot delete active theme)
node theme-manager.js delete old-themeShow 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 needed
See 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 scriptsValidate theme directory
node theme-validator.js ~/themes/my-theme/Validate ZIP file
node theme-validator.js theme.zipTarget specific Ghost version
node theme-validator.js theme.zip --version v6JSON output for CI/CD
node theme-validator.js theme.zip --jsonShow 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.zip2. Fix any errors
3. Re-validate
node theme-validator.js my-theme.zip4. 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 pagesSee content.md for:
See 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-postValidate format before extracting
node scripts/snippet-extractor.js my-snippets-post --validatePreview without saving
node scripts/snippet-extractor.js my-snippets-post --dry-runCustom 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 trendsSee analytics.md for:
Comments & Engagement
When to use: Responding to comments, moderating discussionsSee comments.md for:
Members & Subscribers
When to use: Managing subscriber tiers, member access, premium contentSee members.md for:
Newsletters
When to use: Managing newsletter settings, email campaignsSee newsletters.md for:
API Reference
For advanced operations or endpoint details, see 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?"