ghst is a CLI tool for managing Ghost instances from the terminal. Anything you can do with the Ghost Admin API, you can do with ghst. (And a bit more)
- CRUD for Ghost resources
- Full Admin API support
- JSON-first scripting support (
--json,--jq) - Built-in MCP server mode for editor/agent integration
- Utility functions for development
Important
This tool is pre-1.0 and not yet stable. Use with caution, and back up critical data.
- Install
- Quick Start
- Authentication and Site Selection
- Command Reference
- Global Options
- Common Workflows
- Configuration and Environment Variables
- Output, Automation, and Exit Codes
- MCP Server Mode
- Troubleshooting
- Development
- License & trademark
Install globally with npm:
npm install -g @tryghost/ghstor run instantly without global install:
npx @tryghost/ghstOther package managers:
pnpm add -g @tryghost/ghstyarn global add @tryghost/ghst- Authenticate:
ghst auth login- Verify active auth:
ghst auth status- Fetch content:
ghst post list --limit 5- Create content:
ghst post create --title "Launch" --markdown-file ./launch.md- Get help:
ghst --help
ghst <resource> --help
ghst <resource> <action> --helpInteractive auth flow:
- Run
ghst auth login. - Open Ghost Admin when prompted.
- Create or copy a staff access token from your user profile.
- Paste
Ghost API URLandGhost Staff Access Token.
Non-interactive auth for CI/scripts:
ghst auth login \
--non-interactive \
--url https://myblog.ghost.io \
--staff-token "{id}:{secret}" \
--jsonSite/profile management:
ghst auth list
ghst auth switch <site-alias>
ghst auth link --site <site-alias>
ghst auth link --site <site-alias> --yes
ghst auth logout --yes
ghst auth tokenghst auth token prints a short-lived staff JWT. Treat the output as sensitive.
ghst auth logout requires confirmation when removing all configured sites; use --yes in non-interactive scripts.
ghst auth link requires confirmation before replacing an existing project link; use --yes in non-interactive scripts.
Interactive destructive confirmations also emit GHST_AGENT_NOTICE: lines on stderr instructing cooperative agents to ask the user for approval before continuing.
| Resource | Actions |
|---|---|
auth |
login, status, list, switch, logout, link, token |
comment |
list, get, thread, replies, likes, reports, hide, show, delete |
post |
list, get, create, update, delete, publish, schedule, unschedule, copy, bulk |
page |
list, get, create, update, delete, copy, bulk |
tag |
list, get, create, update, delete, bulk |
member |
list, get, create, update, delete, import, export, bulk |
newsletter |
list, get, create, update, bulk |
tier |
list, get, create, update, bulk |
offer |
list, get, create, update, bulk |
label |
list, get, create, update, delete, bulk |
webhook |
create, update, delete, events, listen |
user |
list, get, me |
image |
upload |
theme |
list, upload, activate, validate, dev |
site |
info |
socialweb |
status, enable, disable, profile, profile-update, search, notes, reader, notifications, notifications-count, posts, likes, followers, following, post, thread, follow, unfollow, like, unlike, repost, derepost, delete, note, reply, blocked-accounts, blocked-domains, block, unblock, block-domain, unblock-domain, upload |
stats |
overview, web (content, sources, locations, devices, utm-sources, utm-mediums, utm-campaigns, utm-contents, utm-terms), growth, posts, email (clicks, subscribers), post <id> (web, growth, newsletter, referrers) |
setting |
list, get, set |
migrate |
wordpress, medium, substack, csv, json, export |
config |
show, path, list, get, set |
api |
raw Ghost request command (ghst api [endpointPath]) |
mcp |
stdio, http |
completion |
bash, zsh, fish, or powershell |
| Flag | Purpose |
|---|---|
--json |
Emit JSON output for automation |
--jq <filter> |
Apply jq-style extraction to JSON output |
--site <alias> |
Use configured site alias |
--url <url> + --staff-token <token> |
Use direct credentials for this invocation |
--debug [level] |
Enable debug output |
--no-color |
Disable color output |
Create and publish:
ghst post create --title "Launch" --markdown-file ./launch.md --newsletter weekly --email-segment all
ghst post publish <post-id>Bulk updates:
ghst post bulk --filter "status:draft" --update --add-tag release-notes --authors editor@example.com
ghst member bulk --update --filter "status:free" --labels "trial,needs-follow-up"
ghst label bulk --filter "name:'legacy'" --action delete --yesComment moderation:
ghst comment list --filter "status:hidden"
ghst comment thread <comment-id>
ghst comment replies <comment-id>
ghst comment hide <comment-id>
ghst comment show <comment-id>
ghst comment delete <comment-id> --yesScheduling:
ghst post schedule <post-id> --at 2026-03-01T10:00:00Z --newsletter weekly --email-only --email-segment status:paid
ghst post unschedule <post-id>Theme development:
ghst theme validate ./theme-dir
ghst theme dev ./theme-dir --watch --activateWebhook relay for local development:
ghst webhook listen \
--public-url https://hooks.example.com/ghost \
--forward-to http://localhost:3000/webhooksDirect API calls:
ghst api /posts/ --paginate --include-headers
ghst api /settings/ -X PUT -f settings[0].key=title -f settings[0].value="New title"Analytics reporting:
ghst stats overview
ghst stats web
ghst stats web sources --range 90d --csv
ghst stats growth
ghst stats posts --range 30d --csv
ghst stats email subscribers --csv
ghst stats post <post-id> referrers --csv --output ./referrers.csvSocial web / ActivityPub:
ghst socialweb status
ghst socialweb profile
ghst socialweb notes --json
ghst socialweb follow @alice@example.com
ghst socialweb delete https://example.com/.ghost/activitypub/note/1 --yes
ghst socialweb note --content "Hello fediverse"
ghst socialweb reply https://example.com/users/alice/statuses/1 --content "Replying from ghst"Social web auth note:
ghst socialwebbootstraps a short-lived identity JWT from/ghost/api/admin/identities/.- That bridge requires an Owner or Administrator staff access token.
ghst socialweb deleterequires confirmation; use--yesin non-interactive scripts.- Public Ghost post publishing still lives under
ghst post;ghst socialwebis for notes, interactions, profile, feed, and moderation flows.
Ghost analytics filter semantics:
sourceandutm_*filters are session-scoped.- post and member-status filters are hit-scoped.
Ghost range semantics:
stats growthclips member, MRR, and subscription histories client-side when Ghost only exposes broader source data.stats post ... growthclips Ghost's lifetime post-growth history to the selected window.
File output safety:
ghst member export --output,ghst stats ... --csv --output, andghst migrate export --outputrefuse to overwrite an existing file.
endpointPath must stay within the selected Ghost API root. Use resource paths such as /posts/
or canonical Ghost API paths such as /ghost/api/admin/posts/.
Connection resolution order:
--site--url+--staff-tokenGHOST_URL+GHOST_STAFF_ACCESS_TOKEN- project link file
.ghst/config.json - active site in user config
Primary config/state files:
| Path | Purpose |
|---|---|
~/.config/ghst/config.json |
User config (saved sites, active site) |
.ghst/config.json |
Project-level linked site |
.env.example |
Example environment configuration |
Environment variables:
| Variable | Purpose |
|---|---|
GHOST_URL |
Ghost site URL override |
GHOST_STAFF_ACCESS_TOKEN |
Ghost staff access token ({id}:{secret}) |
GHOST_API_VERSION |
Admin API version override (default v6.0) |
GHOST_SITE |
Site alias fallback lookup in user config |
GHOST_CONTENT_API_KEY |
Required when using ghst api --content-api |
GHST_CONFIG_DIR |
Override user config directory path |
GHST_OUTPUT |
Force JSON output when set to json |
GHST_FORCE_TTY |
Force TTY behavior for non-interactive environments |
GHST_NO_COLOR / NO_COLOR |
Disable colorized output |
JSON + jq-style extraction:
ghst post list --json
ghst post list --json --jq '.posts[].title'Common machine-safe practices:
- Use
--jsonfor scripts. - Use
--non-interactivefor CI where prompts are invalid. - Pass explicit auth (
--urland--staff-token) or set env vars.
Exit code mapping:
| Code | Meaning |
|---|---|
0 |
Success |
1 |
General error |
2 |
Usage/argument error |
3 |
Authentication/authorization error |
4 |
Operation cancelled |
5 |
Not found |
6 |
Conflict |
7 |
Validation error |
8 |
Rate limited |
Run MCP over stdio or HTTP:
ghst mcp stdio --tools all
ghst mcp http --host 127.0.0.1 --port 3100 --tools posts,tags,site --auth-token token-123Notes:
ghst mcp httpbinds to loopback by default. Binding to a non-loopback host requires--unsafe-public-bind.--cors-originaccepts a single exact origin only, for examplehttps://app.example.com.
Supported tool groups:
postspagestagsmemberscommentssitesettingsusersapisearchsocialwebstats
The stats MCP tools mirror the CLI analytics surface, including ghst stats overview,
ghst stats web, ghst stats growth, ghst stats posts, ghst stats email subscribers,
and ghst stats post <post-id> referrers. The same Ghost analytics filter and range semantics
shown above apply to both the CLI and MCP stats tooling.
The socialweb MCP tools mirror the ghst socialweb CLI surface for status, profile,
feeds, interactions, moderation, and uploads. They use the same Owner/Admin auth flow as
the CLI.
- Keep
ghst mcp httpon loopback unless you explicitly intend to expose Ghost admin automation. - Treat
ghst apiand MCPghost_api_requestas privileged admin access. - Avoid sharing terminal output that contains
ghst auth tokenoutput or values revealed withconfig --show-secrets.
No site configuration found:
- Run
ghst auth login, or - Provide
--urland--staff-token, or - Set
GHOST_URLandGHOST_STAFF_ACCESS_TOKEN.
GHOST_CONTENT_API_KEY is required for --content-api requests:
- Export
GHOST_CONTENT_API_KEYbeforeghst api --content-api.
Use --non-interactive when combining auth login with --json:
- Re-run auth with
--non-interactiveand explicit credentials.
Commands and flags drift:
- Re-check current command docs with
ghst <resource> --help.
For cloning, testing, and developing the repository from source, see CONTRIBUTING.md.
Copyright (c) 2013-2026 Ghost Foundation - Released under the MIT license. Ghost and the Ghost Logo are trademarks of Ghost Foundation Ltd. Please see our trademark policy for info on acceptable usage.