/install ghost
Ghost CMS Admin API
Manage your Ghost blog posts programmatically through the Admin API.
Features
- 📝 Create/Update/Delete posts - Full CRUD operations
- 🖼️ Upload images - Upload images to Ghost and get URL
- 🎨 Feature images - Set cover images for posts
- 📊 List posts - View recent posts with status
- 🏷️ Tags support - Add tags to posts
Prerequisites
1. Get Admin API Key
- Log in to your Ghost Admin panel (
https://your-blog.com/ghost/) - Go to Settings → Integrations
- Click "Add custom integration"
- Copy the Admin API Key (format:
id:secret)
2. Create Configuration File
唯一调用方式:自定义配置文件路径(项目隔离)
Create a JSON config file for your site:
Example: /Users/ethan/.openclaw/workspace/projects/fuye/ghost-admin.config.json
{
"api_url": "https://fu-ye.com/ghost/api/admin",
"admin_api_key": "your-id:your-secret"
}
CLI Usage
Method: Custom Config Path (唯一方式)
python3 scripts/ghost.py list --config "../../projects/fuye/ghost-admin.config.json"
python3 scripts/ghost.py create "Title" "Content" --config "../../projects/fuye/ghost-admin.config.json"
python3 scripts/ghost.py upload image.png --config "../../projects/fuye/ghost-admin.config.json"
Python API Usage
Method: Custom Config Path (唯一方式)
import sys
import os
sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts"))
import ghost
# 唯一方式:通过配置文件路径获取配置
config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json")
# Create post
result = ghost.create_post(
config=config,
title="My Article Title",
content="\x3Ch1>Title\x3C/h1>\x3Cp>Content...\x3C/p>",
status="published",
tags=["tech", "news"]
)
3. Install Dependencies
pip3 install requests pyjwt --user
Python API Usage
Create a Post
import sys
import os
sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts"))
import ghost
# 通过配置文件路径获取配置(唯一方式)
config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json")
# Create post with HTML content
result = ghost.create_post(
config=config,
title="My Article Title",
content="\x3Ch1>Title\x3C/h1>\x3Cp>Content...\x3C/p>", # HTML format
status="published", # or "draft"
tags=["tech", "news"]
)
Upload Image
# Upload image and get URL
image_url = ghost.upload_image(config, "/path/to/image.jpg")
print(f"Image URL: {image_url}")
Create Post with Feature Image
# Upload cover image first
cover_image_url = ghost.upload_image(config, "cover.jpg")
# Create post with feature image
result = ghost.create_post(
config=config,
title="Article with Cover",
content="\x3Cp>Article content...\x3C/p>",
status="published",
feature_image=cover_image_url, # Set cover image
tags=["featured"]
)
List Posts
posts = ghost.list_posts(config, limit=20)
for post in posts:
print(f"{post['title']} - {post['status']}")
Update Post
ghost.update_post(
config=config,
post_id="post-id-here",
title="New Title",
status="published"
)
CLI Usage
Setup
# Install dependencies
pip3 install requests pyjwt --user
Create a Post
As draft (default):
python3 scripts/ghost.py create "My Article Title" "\x3Cp>Article content in HTML\x3C/p>" --config "../../projects/fuye/ghost-admin.config.json"
Publish immediately:
python3 scripts/ghost.py create "Breaking News" "\x3Cp>Content here\x3C/p>" --status published --config "../../projects/fuye/ghost-admin.config.json"
With tags:
python3 scripts/ghost.py create "Tech News" "\x3Cp>Content\x3C/p>" --status published --tags "tech,news,ai" --config "../../projects/fuye/ghost-admin.config.json"
Upload Image
python3 scripts/ghost.py upload cover.png --config "../../projects/fuye/ghost-admin.config.json"
Update a Post
# Update title
python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --title "New Title" --config "../../projects/fuye/ghost-admin.config.json"
# Update content
python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --content "\x3Cp>New content\x3C/p>" --config "../../projects/fuye/ghost-admin.config.json"
# Publish a draft
python3 scripts/ghost.py update 5f8c3c2e8c3d2e1f3a4b5c6d --status published --config "../../projects/fuye/ghost-admin.config.json"
Delete a Post
python3 scripts/ghost.py delete 5f8c3c2e8c3d2e1f3a4b5c6d --config "../../projects/fuye/ghost-admin.config.json"
List Posts
# List 10 most recent posts (default)
python3 scripts/ghost.py list --config "../../projects/fuye/ghost-admin.config.json"
# List 20 posts
python3 scripts/ghost.py list 20 --config "../../projects/fuye/ghost-admin.config.json"
Common Workflows
Publish with Cover Image
import sys
import os
sys.path.insert(0, os.path.expanduser("~/.openclaw/workspace/skills/ghost/scripts"))
import ghost
# 唯一方式:通过配置文件路径获取配置
config = ghost.get_config(config_path="../../projects/fuye/ghost-admin.config.json")
# Upload cover image
image_url = ghost.upload_image(config, "/path/to/cover.jpg")
# Create post with cover
result = ghost.create_post(
config=config,
title="Featured Article",
content="\x3Cp>Article content...\x3C/p>",
status="published",
feature_image=image_url,
tags=["featured", "tech"]
)
print(f"Published: {result['url']}")
Batch Operations
# List all drafts
python3 scripts/ghost.py list 100 --config "../../projects/fuye/ghost-admin.config.json" | grep "🟡"
# Update specific post
python3 scripts/ghost.py update \x3Cid> --tags "featured" --config "../../projects/fuye/ghost-admin.config.json"
API Reference
ghost.get_config(config_path)
唯一方式获取配置。
Parameters:
config_path- Path to JSON configuration file (e.g.,"../../projects/fuye/ghost-admin.config.json")
Returns: Config dict with api_url and admin_api_key
ghost.create_post(config, title, content, status='draft', tags=None, feature_image=None)
Create a new post.
Parameters:
config- Configuration dict fromget_config(config_path)title- Post titlecontent- HTML contentstatus- 'draft' or 'published'tags- List of tag namesfeature_image- URL of cover image (optional)
Returns: Post dict with id, url, status
ghost.upload_image(config, image_path)
Upload an image to Ghost.
Parameters:
config- Configuration dictimage_path- Local path to image file
Returns: Image URL string
ghost.list_posts(config, limit=10)
List recent posts.
Returns: List of post dicts
ghost.update_post(config, post_id, **kwargs)
Update existing post.
Parameters:
post_id- Post ID to updatetitle- New title (optional)content- New content (optional)status- New status (optional)tags- New tags (optional)
ghost.delete_post(config, post_id)
Delete a post.
Troubleshooting
Error: No module named 'jwt'
→ Install: pip3 install pyjwt --user
Error: 401 Unauthorized → Check your Admin API Key is correct and not expired
Error: 404 Not Found
→ Verify api_url in config file ends with /ghost/api/admin
Error: Config file not found → Ensure config_path is correct relative to your working directory
Image upload fails → Check image file exists and is under 10MB → Supported formats: JPG, PNG, GIF
References
- API Documentation: references/api.md
- Ghost Official Docs: https://ghost.org/docs/admin-api/
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install ghost - 安装完成后,直接呼叫该 Skill 的名称或使用
/ghost触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
ghost cms 是什么?
Manage Ghost CMS blog posts via Admin API. Supports creating, updating, deleting, and listing posts. Use when the user needs to programmatically manage Ghost... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 1696 次。
如何安装 ghost cms?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install ghost」即可一键安装,无需额外配置。
ghost cms 是免费的吗?
是的,ghost cms 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。
ghost cms 支持哪些平台?
ghost cms 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。
谁开发了 ghost cms?
由 manifold(@manifoldor)开发并维护,当前版本 v1.0.5。