MCP サーバー
Claude や Devin から SupaCMS を直接操作する
SupaCMS の MCP サーバーを使うと、Claude や Devin などの AI ツールから直接コンテンツを管理できます。
OAuth でサインインするだけで使えます。API キーは不要です。
接続 URL
https://cms.supa.ai/api/mcpREST API と同じレート制限(10 秒あたり 100 リクエスト)がかかります。超えると HTTP 429 が返ります。
登録方法
Claude.ai(Web 版)
claude.ai を開き、左サイドバーの Customize をクリック
設定モーダルの Connectors(Customize セクション)を選択
右上の Add → Add custom connector をクリック
以下を入力して Add をクリック
項目 | 値 |
|---|---|
Name | supacms(任意) |
Remote MCP server URL |
|
追加されたコネクターの Connect をクリックし、SupaCMS のアカウントでサインイン
Devin
Devin の Settings → MCP Servers を開く
Add MCP Server をクリック
以下を入力
項目 | 値 |
|---|---|
URL |
|
Authentication | OAuth |
初回セッション時に OAuth フローが起動するので、SupaCMS のアカウントでサインイン
Claude Code(CLI)
ターミナルで 1 コマンド実行するだけです:
claude mcp add --transport http supacms "https://cms.supa.ai/api/mcp"追加後、Claude Code を再起動するとブラウザで OAuth サインイン画面が開きます。SupaCMS のアカウントでログインして連携完了です。
使えるツール
ツール | 操作 |
|---|---|
| 所属している組織の一覧を取得する |
| 組織内のプロジェクト一覧を取得する |
| コンテンツタイプの一覧を取得する |
| コンテンツタイプを新規作成する |
| コンテンツタイプの名前・プレビューURLを更新する |
| コンテンツタイプのフィールド一覧を取得する |
| コンテンツタイプにフィールドを追加する |
| フィールドの名前・フィールドID・設定を更新する |
| エントリの一覧を取得する(省略時・最大 100 件。 |
| 新しいエントリを作成する(常に非公開) |
| エントリの内容を更新する(公開中なら下書きに保存し、配信内容は変えない) |
| 最新の編集内容を実際のサイトで確認できるプレビューURLを取得する |
| 未反映の下書きを破棄して公開版だけ残す |
| エントリのシステム項目を更新する( |
| エントリを非公開に戻す(配信 API から外れる) |
| エントリを削除する |
| アップロード済みメディアの一覧を取得する |
| microCMS の API からコンテンツを取得する(読み取り専用) |
| 外部 URL のファイルを SupaCMS media にアップロードする( |
| HTML を SupaCMS の rich_text 用 Tiptap JSON に変換する |
権限
MCP から実行できる操作は、管理画面と同じロール(オーナー・管理者・メンバー)の権限の範囲内です。たとえばメンバーは管理画面でコンテンツタイプを作れないので、MCP からも作れません。
そのうえで、組織設定の MCP タブから、メンバーごとに MCP で許可する操作を選べます。「Aさんは管理画面ではエントリを削除できるが、MCP からは project:list と entry:list だけ」のように、管理画面の権限はそのままで MCP だけを制限できます。
個別に選んでいないメンバーは、ロールの権限どおりに MCP から操作できます。
個別に選んだメンバーは、選んだ操作だけに固定されます。あとでロールが変わっても選び直されません。ただしロールの権限を超えることはありません。
変更できるのはオーナーと管理者です。オーナーの設定を変更できるのはオーナーだけです。
設定は組織ごとです。複数の組織に所属しているメンバーは、組織ごとに設定されます。
権限 | 対象のツール |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
list_orgs / microcms_fetch / html_to_tiptap は組織のデータを読み書きしないため、権限の対象外です。権限のない操作を呼ぶと、ツールは Permission denied のエラーを返します。
MCP から公開はできません
MCP からはエントリを公開できません。作成・編集・下書きの保存まではできますが、公開・予約公開・下書きの公開版や予約への反映は管理画面から行います。
公開を塞いでいるのは MCP だけです。API キーを発行すれば、CLI の entry publish / entry create --publish と、REST API の POST /projects/:projectSlug/content-types/:ctApiId/entries/:entryId/publish からは公開できます。
非公開に戻す操作は MCP からできます。
unpublish_entryは公開中のエントリを下書きに戻すので、配信 API はそのエントリを返さなくなります。配信を止める方向の操作には、管理画面の確認が挟まりません。
公開中のエントリを update_entry で編集すると、内容は下書きとして保存され、配信 API はこれまでの内容を返し続けます。管理画面で公開して初めて配信に反映されます。
ツール | 保存先 | 配信内容 |
|---|---|---|
| 下書き | 変わらない |
| 下書きを削除 | 変わらない |
非公開のエントリには下書きの層が無いので、update_entry はエントリ本体を直接更新します。どちらの場合でも、レスポンスに saved_to と published_content_changed が入るため、配信内容が変わったかどうかを取り違えずに判断できます。
{
"saved_to": "draft",
"published_content_changed": false,
"message": "Saved to this entry's draft. ...",
"next_steps": ["get_preview_url", "discard_draft"],
"entry": { "...": "下書きの内容" }
}見た目の確認(プレビュー)
get_preview_url は、下書きを含む最新の編集内容を実際のサイトで開くURLを返します。AI エージェントは編集のあとにこのURLを案内し、公開前に見た目を確認してもらえます。
{
"configured": true,
"preview_url": "https://example.com/preview?id=...&draftKey=...",
"expires_at": "2026-10-17T05:00:00.000Z"
}URLは
expires_atまで有効で、知っている人なら誰でも開けます。有効なURLがあるあいだは同じURLを返しますコンテンツにプレビューURLが設定されていないときは
configured: falseを返します。管理画面のコンテンツ設計、またはupdate_content_typeのpreview_url_templateで設定してください共有したURLを止める(再発行する)操作は管理画面から行います
予約公開待ちのエントリを
update_entryで編集した場合、下書きは予約時刻になっても自動では反映されません。予約配信に含めるには、管理画面の「予約へ反映する」を使ってください。またupdate_entry_systemで予約中のエントリのpublished_atを現在や過去の日時に変えることはできません(即時公開になるため)。
update_entryのdataは渡したフィールドだけを書き換えます。省略したフィールドは現在の値のまま残ります。
reference フィールド
add_field / update_field の type に reference を指定すると、他の ContentType のエントリへの参照(リレーション)を定義できます。参照先の ContentType ID が必須です。
add_field の例:
type:referenceref_content_type_id: 参照先 ContentType の UUID(list_content_typesのid)multiple: 複数参照にする場合はtrue(省略時はfalse)
extra_config でも渡せます: { "contentTypeId": "<uuid>", "multiple": false }
エントリの data には展開オブジェクトではなく ID を渡します。
単一参照(
multiple: false):{ "author": "<entryId>" }複数参照(
multiple: true):{ "tags": ["<id1>", "<id2>"] }
list_entries / create_entry / update_entry のレスポンスでは、reference フィールドは参照先エントリオブジェクトに展開されます。絞り込みは filters を使います(テキスト: slug[equals]hello-world、単一参照: author[equals]<entryId>、複数参照: tags[contains]<entryId>)。list_entries はコンテンツタイプの件数 totalCount も返すので、ページネーションに全件取得は不要です。
select フィールド
add_field / update_field の type に select を指定すると、定義済みの選択肢から値を選ぶフィールドになります。extra_config.options が必須です。
add_field の例:
type:selectextra_config:{ "options": ["news", "blog"] }multiple: 複数選択にする場合はtrue(省略時はfalse)
エントリの data には選択肢の文字列を渡します。
単一選択(
multiple: false):{ "category": "news" }複数選択(
multiple: true):{ "tags": ["news", "blog"] }
使用例
設定が完了すると、Claude や Devin に話しかけるだけでコンテンツを管理できます。
「ブログで非公開のもの一覧を見せて」
「新しいお知らせを作成して。タイトルは『夏季休業のご案内』で、本文は…」
「ID が xxx のエントリの本文を直して」
microCMS からの移行
microcms_fetch / upload_media_from_url / html_to_tiptap を使うと、既存の microCMS の内容を Claude に読み取らせて SupaCMS に移行できます。microCMS の API キーはツール呼び出しの都度渡すだけで、SupaCMS 側には保存されません。
「microCMS のサービス ID は
xxx、API キーはxxxです。newsAPI の内容を全部読んで、SupaCMS のblogプロジェクトに移行して」
Claude はおおよそ次の手順で進めます。
microcms_fetchで対象 API の内容を取得する(offsetを進めながら全件取得)取得した内容の構造から
create_content_type/add_fieldでコンテンツタイプを設計する画像フィールドやリッチテキスト内の画像は
upload_media_from_urlで SupaCMS media に取り込むリッチテキスト(HTML)は
html_to_tiptapで Tiptap JSON に変換する(image_url_mapに手順 3 で取得した新しい URL を渡すと、本文内の画像 URL も差し替えられる。表および表セル内の画像も保持される)create_entryでエントリを作成する(非公開のまま作られる)。公開は管理画面で行う。移行元の公開日時(過去の日時)を残す場合は、管理画面で公開したあとにupdate_entry_systemへpublished_at(ISO 8601)を渡す