Ghost Writing
Quick Start
compose_post {
"title": "We shipped the editor",
"status": "draft",
"blocks": [
{ "type": "heading", "level": 2, "text": "What changed" },
{ "type": "paragraph", "text": "Prose with **bold** and [links](https://ghost.org)." },
{ "type": "callout", "emoji": "🚀", "color": "green", "text": "Live now" }
]
}
Critical Rules
- Never push raw HTML — compose posts from Koenig blocks via
compose_post. The html block is a last resort when no native block fits.
- Draft first — create with
status: "draft", report the post URL, publish only when asked.
- Long posts use
blockFile — write blocks JSON to an absolute path, validate with compose_lexical, pass the path to compose_post.
- Updates replace the whole body —
compose_post with id needs the current updated_at (via posts.read) and full blocks; keep the blockFile as source of truth when iterating.
- Don't guess block fields — run
koenig_help (list) or koenig_help { "block": "callout" } (fields + example) before composing.
Workflow
- Outline: one goal per post, working title, section list — see writing
- Pick blocks per section: prose vs cards — see blocks
- Compose:
compose_post with inline blocks, or blockFile for long posts
- Review: re-read for rhythm, set excerpt/tags/feature image
- Publish or schedule via
use_ghost_api — see workflows
References
- Blocks — every block type, its purpose, and how to choose between similar ones
- Writing — structure, rhythm, metadata, and voice practices for good posts
- Workflows — tool map and end-to-end recipes: create, edit, publish, newsletter, members-only
1---2name: ghost-writing3description: Use when writing, editing, or publishing Ghost blog posts with the ghost-mcp server. Covers compose_post vs use_ghost_api, the full Koenig block catalog, and blog-writing best practices.4---56# Ghost Writing78## Quick Start910 compose_post {11 "title": "We shipped the editor",12 "status": "draft",13 "blocks": [14 { "type": "heading", "level": 2, "text": "What changed" },15 { "type": "paragraph", "text": "Prose with **bold** and [links](https://ghost.org)." },16 { "type": "callout", "emoji": "🚀", "color": "green", "text": "Live now" }17 ]18 }1920## Critical Rules21221. **Never push raw HTML** — compose posts from Koenig blocks via `compose_post`. The `html` block is a last resort when no native block fits.232. **Draft first** — create with `status: "draft"`, report the post URL, publish only when asked.243. **Long posts use `blockFile`** — write blocks JSON to an absolute path, validate with `compose_lexical`, pass the path to `compose_post`.254. **Updates replace the whole body** — `compose_post` with `id` needs the current `updated_at` (via `posts.read`) and full blocks; keep the blockFile as source of truth when iterating.265. **Don't guess block fields** — run `koenig_help` (list) or `koenig_help { "block": "callout" }` (fields + example) before composing.2728## Workflow29301. Outline: one goal per post, working title, section list — see [writing](references/writing.md)312. Pick blocks per section: prose vs cards — see [blocks](references/blocks.md)323. Compose: `compose_post` with inline `blocks`, or `blockFile` for long posts334. Review: re-read for rhythm, set excerpt/tags/feature image345. Publish or schedule via `use_ghost_api` — see [workflows](references/workflows.md)3536## References3738- [Blocks](references/blocks.md) — every block type, its purpose, and how to choose between similar ones39- [Writing](references/writing.md) — structure, rhythm, metadata, and voice practices for good posts40- [Workflows](references/workflows.md) — tool map and end-to-end recipes: create, edit, publish, newsletter, members-only