ghost-mcp-server について
ghost-mcp-serverは、Ghost Admin APIを通じてGhost CMSを管理するTypeScript製MCPサーバーです。MCPクライアントからコンテンツやSEO、メンバーを操作でき、専用ツールのないAPIルートも検索・呼び出せます。
主な機能
- 01投稿やページの作成・編集・削除
- 02タグ、メンバー、ニュースレターの管理
- 03投稿とページのSEOメタデータ設定
- 04画像とテーマのアップロード
- 05ルート検索と汎用APIリクエスト
活用シーン
- 01Ghostの投稿やページの下書き・更新
- 02SEO項目や投稿タグの調整
- 03メンバーとニュースレター設定の管理
- 04専用ツールのないAdmin APIルートの検索・呼び出し
MCP 対応
stdioでMCPクライアントをGhost Admin APIに接続し、コンテンツ管理ツール、ルート検索、汎用リクエストツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Ghost MCP Server:Claude、Cursor、その他のAIクライアントからGhost CMSを管理
Ghost MCP Serverは、TypeScriptで書かれたGhost CMS向けのオープンソースModel Context Protocolサーバーです。Claude Desktop、Claude Code、CursorなどのMCPクライアントを、stdio経由でGhost Admin APIに接続します。これにより、AIアシスタントは投稿やページの作成・編集、SEOメタデータの設定、タグ・メンバー・ニュースレターの管理、画像やテーマのアップロード、コンテンツのエクスポートを行えます。
60個のツールを提供します。内訳は、API専用ツール55個、SEOとタグ向けのショートカット3個、ルート検索ツール1個、汎用リクエストツール1個です。組み込みカタログには、固定されたGhostのソーススナップショットから取得した253個のAdmin APIルートが含まれています。サイトで利用できる機能は、認証情報、Ghostのバージョン、機能フラグによって異なります。ルートとソースについてはGHOST_API.listをご覧ください。

クイックスタート
Node.js 20以降と、Admin APIにアクセスできるGhostサイトが必要です。
- Ghost AdminでSettings → Integrations → Add custom integrationを開き、Admin API Key(
id:secret)をコピーします。Content APIキーは使用しないでください。 - クライアントの設定にサーバーを追加します。Claude DesktopまたはCursorの場合:
{
"mcpServers": {
"ghost": {
"command": "npx",
"args": ["-y", "@proars/ghost-mcp-server"],
"env": {
"GHOST_API_URL": "https://your-blog.com",
"GHOST_ADMIN_API_KEY": "64f1a2b3c4d5e6f7a8b9c0d1:3e5f7a9b1c2d4e6f8a0b2c4d6e8f0a1b3c5d7e9f1a2b4c6d8e0f2a3b5c7d9e1f"
}
}
}
}
上記のキーは実際の形式に合わせた架空の例です。24個の16進数文字、コロン、続けて64個の16進数文字で構成されています。両方の値をご自身のものに置き換えてください。
npxでサーバーを実行する場合は、例のようにenv経由で設定を渡します。.envファイルが読み込まれるのは、ソースをチェックアウトした場合(下記参照)、またはGHOST_MCP_ENV_FILEで指定したパスからのみです。
- クライアントを再起動して、「SEOタイトル付きで最新の投稿を一覧表示して」のように依頼します。
GHOST_API_URLは、サイトのサブディレクトリがある場合はそれを含めた正規のAdminドメインです。/ghost/api/adminは含めません。ローカルサイトでは、http://localhost:2368のようなアドレスを使用します。
設定ファイルの場所:macOSのClaude Desktopでは~/Library/Application Support/Claude/claude_desktop_config.jsonを使用します。Cursorでは~/.cursor/mcp.json、またはプロジェクト内の.cursor/mcp.jsonを使用します。
Claude Code:
claude mcp add ghost --scope user \
-e GHOST_API_URL=https://your-blog.com \
-e GHOST_ADMIN_API_KEY=64f1a2b3c4d5e6f7a8b9c0d1:3e5f7a9b1c2d4e6f8a0b2c4d6e8f0a1b3c5d7e9f1a2b4c6d8e0f2a3b5c7d9e1f \
-- npx -y @proars/ghost-mcp-server
--scope userを指定すると、すべてのフォルダーでサーバーを利用できます。指定しない場合、サーバーはコマンドを実行したフォルダーにのみ登録されます。Claude Codeがサーバーを起動・停止するため、ターミナルを開いたままにする必要はありません。
claude mcp get ghostを実行して接続を確認します。Connectedと表示されるはずです。または、claudeセッション内で/mcpと入力してください。サーバーを削除するには、claude mcp remove ghost -s userを実行します。
その他のstdio MCPクライアントでも、同じコマンドnpx -y @proars/ghost-mcp-serverを2つの環境変数とともに実行できます。
更新: npxはキャッシュを使用するため、起動のたびにレジストリで@latestが確認されるとは限りません。コマンドの実行時に必ずレジストリの最新状態を確認するには、npx --prefer-online -y @proars/ghost-mcp-server@latestを使用します。JSON形式のクライアント設定では、argsを次のように設定します。
["--prefer-online", "-y", "@proars/ghost-mcp-server@latest"]
特定のバージョンを使い続けるには、たとえば@proars/[email protected]のようにバージョンを固定してください。各リリースの変更内容は変更履歴をご覧ください。
このリポジトリをクローンしたディレクトリ内からnpxを実行しないでください。npmが同じ名前のローカルのpackage.jsonを見つけ、ghost-mcp-server: command not foundエラーになります。別の任意のフォルダーから実行してください。
ソースからインストール
コードを変更する場合や、未公開バージョンを実行する場合に使用します。
git clone https://github.com/proars/ghost-mcp-server.git
cd ghost-mcp-server
npm install
npm run build
cp .env.example .env
.env の GHOST_API_URL と GHOST_ADMIN_API_KEY を設定し、クライアントからビルドを指定します。--silent はそのままにしてください。そうしないと、npm の起動バナーが MCP プロトコルストリームの stdout に出力されます。
{
"mcpServers": {
"ghost": {
"command": "npm",
"args": ["--silent", "--prefix", "/ABSOLUTE/PATH/ghost-mcp-server", "start"]
}
}
}
プロジェクトルートの .env ファイルは、クライアントがどのディレクトリからサーバーを起動しても読み込まれます。すでに設定されている変数が優先され、必須の変数が両方とも設定されている場合、ファイルは読み込まれません。GHOST_MCP_ENV_FILE で別の env ファイルを指定でき、GHOST_MCP_SKIP_DOTENV=1 でファイルの読み込みを無効にできます。
サーバーでできること
| リソース | ツール |
|---|---|
| 投稿 | get_posts, get_post, get_post_by_slug, create_post, update_post, delete_post, copy_post |
| ページ | get_pages, get_page, get_page_by_slug, create_page, update_page, delete_page, copy_page |
| タグ | get_tags, get_tag, get_tag_by_slug, create_tag, update_tag, delete_tag |
| ティア | get_tiers, get_tier, create_tier, update_tier |
| ニュースレター | get_newsletters, get_newsletter, create_newsletter, update_newsletter |
| オファー | get_offers, get_offer, create_offer, update_offer |
| メンバー | get_members, get_member, create_member, update_member, delete_member |
| ラベル | get_labels, create_label, update_label, delete_label |
| スタッフ | get_users, get_user, update_user, delete_user, get_roles, invite_user |
| 画像とテーマ | upload_image, upload_theme, activate_theme |
| Webhook | create_webhook, update_webhook, delete_webhook |
| サイト | get_site, get_settings |
| ショートカット | update_post_seo, update_page_seo, update_post_tags |
| 検出と汎用呼び出し | ghost_list_endpoints, ghost_api_request |
Ghost にはティア、ニュースレター、オファーの削除エンドポイントがないため、これらのリソースには delete_* ツールがありません。
警告:このサーバーは、破壊的な操作を含む、サポート対象のすべての機能を公開します。
delete_post、delete_page、delete_tag、delete_member、delete_user、activate_theme、upload_theme、ghost_api_requestは、コンテンツ、購読者、サイト設定を完全に削除または上書きする可能性があります。削除したレコードは通常復元できません。このサーバー専用のインテグレーションキーを作成し、一括操作の前に Ghost Admin からコンテンツのバックアップをエクスポートして、クライアントでupdate_*、delete_*、汎用呼び出しすべてに手動承認を有効にしてください。
ツールの呼び出し方法
- 作成と更新: レコードのフィールドを
dataに入れ、レコードのidを別の引数として渡します。投稿とページの更新では、最新の読み取りで取得したdata.updated_atが必要です。SEO ショートカット(update_post_seo、update_page_seo)とタグのショートカットでは、updated_atを直接指定します。 - 一覧:
limit、page、filter、order、include、fieldsを使用します。投稿とページは、デフォルトで簡潔なフィールドとタグを含めて返されます。単一レコードの読み取りでは、レコード全体が返されます。 - SEO:
update_post_seoとupdate_page_seoは、meta_title、meta_description、og_title、og_descriptionを1回の呼び出しで設定します。id、現在のupdated_at、およびこれらのフィールドのうち少なくとも1つを渡します。省略したフィールドは変更されません。 - タグ: タグを設定すると、既存のセット全体が置き換えられます。まだ存在しないタグは作成され、空の配列を指定するとすべてのタグが削除されます。
- 公開:
data.status="published"を指定するか、未来のdata.published_atと"scheduled"を指定してupdate_postを呼び出します。メールで投稿を送信するには、newsletter(スラッグ)と、必要に応じてemail_segmentを追加します。 - 画像:
upload_imageでは、file_path、省略可能なpurpose(image、profile_image、iconのいずれか)、およびrefを指定します。
専用ツールのないルートにはどうアクセスすればよいですか?
ghost_list_endpointsを使って、group、method、accessまたはsearchで検索します。without_dedicated_tool=trueを設定すると、残りの198個のルートを一覧表示できます。各項目には、アクセス要件、機能フラグ、アップロードフィールドが表示されます。
ghost_api_requestを使って任意のルートを呼び出します。pathは/ghost/api/adminからの相対パスで、実際のIDまたはスラッグを含み、クエリ文字列は含みません。
ghost_api_request method=GET path=/labels/slug/vip/
ghost_api_request method=POST path=/members/upload/ files={membersfile: "/Users/me/members.csv"}
ghost_api_request method=GET path=/posts/export/ save_to="/Users/me/posts.csv"
Ghostが想定する構造で、JSONペイロードをbodyに送信します。クエリパラメーターはqueryに指定します。マルチパートファイルはfiles={formField: "/absolute/path"}で送信し、必要に応じてテキストのfieldsを指定します。
ダウンロードの場合、save_toには、書き込み可能な既存のフォルダー内にある新しいファイルを指定する必要があります。末尾の区切り文字は拒否され、既存のファイルが上書きされることはありません。POST、PUT、DELETEがファイルを返す場合、変更リクエストを繰り返すと効果も繰り返される可能性があるため、最初の呼び出しでsave_toを設定してください。
必要なGhostの権限は何ですか?
| クラス | ルート | 要件 |
|---|---|---|
I / PUBLIC | 125 | インテグレーションキーの許可リスト、またはパブリックアクセスです。ハンドラーの権限も適用されます。 |
U | 116 | 必要なロールを持つスタッフユーザーのアクセストークン、またはユーザーセッションです。 |
SESSION | 3 | ユーザークッキーセッションです。インテグレーションキーとスタッフのトークンはブロックされます。 |
FLOW | 9 | 独自の認証を持つログイン、リカバリー、セットアップのフローです。 |
スタッフのトークンを使うには、ユーザーのGhost AdminプロフィールにあるトークンをGHOST_ADMIN_API_KEYに設定します。権限はユーザーのロールに従います。スタッフのトークンでは、DELETE /db/、PUT /users/owner/、POST /authentication/reset/を呼び出せません。
このサーバーは、クッキーセッション、ログイン、2FAを実装していません。これらのルートは、検出専用としてカタログに含まれています。
リクエストではAccept-Version: v5.0を送信します。カタログはGhostのmainブランチのスナップショットなので、新しいルートや実験的なルートが含まれており、インストール環境では404が返される場合があります。パブリックContent APIは含まれていません。
AIクライアントにサイトへのアクセスを許可しても安全ですか?
ブログへの書き込み権限を持つアカウントと同様に扱い、人間が必ず確認するようにしてください。
- キーはクライアントの環境、または
.envに保管し、決してコミットしないでください。破壊的なツール(すべてのupdate_*およびdelete_*ツール、activate_theme、upload_theme、ghost_api_request)では手動承認を有効にしてください。 - 変更リクエストの送信後に失敗した場合は、Ghostで確認してから再試行してください。処理が完了している可能性があります。応答が途中で切れている場合は、読み取りツールを使って結果を確認してください。
- リダイレクトは常に追跡されません。正規のAdmin URLを設定し、変更リクエストでリダイレクトを受け取った場合は、別のリクエストを送信する前に結果を確認してください。
- ローカルファイルのパスは絶対パスである必要があります。隠しパスコンポーネントは、指定されたとおりのパスでも、シンボリックリンク解決後でも拒否されます。アップロードできるのは通常ファイルのみで、ダウンロード先のファイルはリクエスト前に所有者のみの権限で確保されます。
- ファイルチェックはサンドボックスではありません。名前が表示される機密ファイルは保護されず、呼び出し中にローカルプロセスがディレクトリを書き換えることも防げません。サイトのコンテンツは信頼できないものとして扱い、アップロードリクエストを確認してください。
- アップロードとダウンロードはメモリにバッファーされます。HTTPリクエストは120秒でタイムアウトし、100,000文字を超えるツールの応答は途中で切り詰められます。
開発
npm run typecheck # tsc --noEmit
npm test # regression tests with synthetic credentials and a local fake Ghost server
npm run catalog # regenerate src/catalog.ts from GHOST_API.list
npm run build # compile to dist/
npm start # run the build over stdio (requires configuration)
ルート一覧はGHOST_API.listにあります。scripts/generate-catalog.mjsによってsrc/catalog.tsが生成されるため、手動で編集しないでください。ルートを変更するには、一覧を編集してnpm run catalogを実行し、その後テストを実行してください。標準出力はMCPメッセージ用に確保されているため、ログは標準エラー出力に書き込まれます。
GitHub Actionsは、mainへのすべてのプッシュとすべてのプルリクエストで、Node 20および22を使って型チェック、ビルド、テストを実行します。
テストでは、カタログとツールの整合性、リクエストの構築、ファイルの安全性、リダイレクト、再試行に関するガイダンス、設定の分離を確認します。実際に稼働しているGhostインスタンスとの互換性を証明するものではありません。
よくある質問
セルフホストの Ghost と Ghost(Pro) で動作しますか?
はい。Admin API にアクセスでき、キーを持っていれば動作します。GHOST_API_URL に、Ghost Admin のカスタムインテグレーションページに表示されている API URL を設定してください。これは Ghost(Pro) やカスタムドメインを使用しているサイトで特に重要です。サーバーはリダイレクトを追跡しないため、別のアドレスにリダイレクトされるアドレスでは失敗します。
どのクライアントに対応していますか? Claude Desktop、Claude Code、Cursor など、stdio サーバーを起動できる MCP クライアントに対応しています。
Admin キーがなくても公開コンテンツを読み取れますか? いいえ。Admin API のみを使用します。公開 Content API には対応していません。
コンテンツを削除できますか?
はい。delete_post、delete_page などのツールによる削除は取り消せません。クライアントで手動承認を必須にしてください。
ライセンス
MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。