ClaudeとContentfulを連携する方法 — エントリ・コンテンツタイプ・環境の操作範囲
Contentful MCPコネクタでClaudeが触れるエントリ・コンテンツタイプ・環境の範囲と、接続手順、権限を3層で絞る方法をまとめます。
ClaudeとContentfulの連携とは — 何が操作できるか
Contentful MCPコネクタは、ヘッドレスCMSのContentfulに保存したコンテンツをClaudeの会話から読み書きできるようにするConnectorです。開発元はContentful Inc.で、Connectorsディレクトリではクリエイティブ・開発者ツール・生産性・営業とマーケティングの4カテゴリに載っています。Anthropic verifiedの表示があり、追加時期は2026年7月、サインインが必須です。接続先は https://mcp.contentful.com/mcp です。
操作できる対象は、エントリ(コンテンツ本体)だけではありません。Contentfulの公式ドキュメントは、コンテンツモデルの管理、アセット、AI Actionsの呼び出しまで含めて、同じ仕組みで扱えると説明しています。読むだけのコネクタではなく、モデル定義や環境そのものを変えられるコネクタです。
- エントリ: 検索・取得・作成・更新・公開・アーカイブ・削除
- コンテンツタイプ: 一覧・取得・作成・更新・公開・削除、フィールド単位の無効化
- 環境: 一覧・作成・削除
- アセット、リリース、ロケール、タグ、タクソノミー、AI Actions
このため、記事の下書きを整える程度の使い方と、コンテンツモデルを組み替える使い方では、必要な権限がまるで違います。どこまで許すかを先に決めておくのが、連携の出発点です。
何ができるか — ツールを領域別に見る
Contentfulの公式ドキュメントは、ツールを12の領域に分けて載せています。ディレクトリの掲載ページの表示は「70 tools」、ドキュメントの領域表は12領域に82個のツール名を並べていて、数は一致しません。ここでは領域表から、読み取り系と書き込み・削除系に分けて抜粋します。
| 領域 | 読み取り系の例 | 書き込み・破壊系の例 |
|---|---|---|
| エントリ | 読み取り系の例search_entries get_entry semantic_search | 書き込み・破壊系の例create_entry publish_entry archive_entry delete_entry |
| コンテンツタイプ | 読み取り系の例list_content_types get_content_type | 書き込み・破壊系の例create_content_type delete_content_type delete_content_type_field |
| 環境 | 読み取り系の例list_environments get_space | 書き込み・破壊系の例create_environment delete_environment |
| アセット | 読み取り系の例list_assets get_asset | 書き込み・破壊系の例upload_asset archive_asset delete_asset |
| AI Actions | 読み取り系の例get_ai_action list_ai_actions | 書き込み・破壊系の例create_ai_action invoke_ai_action delete_ai_action |
エントリの領域には、履歴を見る get_entry_snapshot と、参照先をたどる resolve_entry_references もあります。リリースの領域には、複数のエントリとアセットをまとめて公開できる publish_release や、公開を予約する schedule_publish_release が含まれます。
注意したいのは、公開系のツールです。publish_entry は、下書きを公開状態にするためのツールです。書き込みを許可するときは、公開まで許すかどうかを別に判断できます。
接続の手順 — 3つの入口
Claudeのアプリから接続する
ClaudeのウェブアプリとClaude Desktopでは、ディレクトリのContentful MCPを選んで接続します。手順の骨格はほかのコネクタと同じで、Connectorsの追加方法にまとめています。Team・Enterpriseプランでは、先にOwnerまたはPrimary Ownerが組織単位でコネクタを有効にする必要があります。有効にしても利用者に権限が付くわけではなく、各自がContentfulで認証します。
Contentful側の前提が一つあります。Contentful MCPアプリを、使いたい環境にインストールしておくことです。アプリ単体では何も動かず、リモートサーバーも、アプリが入っていない環境では使えません。管理者がテナント設定の画面を完了すると、アプリは自動で入ります。
Claude Codeから接続する
Claude Codeでは、リモートサーバーをHTTPトランスポートで登録します。
claude mcp add --transport http \
contentful https://mcp.contentful.com/mcp登録後にClaude Code内で /mcp を開くと、ブラウザが立ち上がります。Contentfulにサインインし、Claudeに触らせるスペースと環境を選び、OAuthを完了する流れです。EU地域の組織は、エンドポイントを https://mcp.eu.contentful.com/mcp に置き換えます。リージョンは接続先のURLで決まり、セッション中に切り替える機能はありません。
ローカルサーバーで動かす
もう一つの選択肢が、オープンソースのローカルサーバーです。npx -y @contentful/mcp-server で起動し、トークンと既定の接続先を4つの環境変数で渡します。OAuthは使わず、すべての呼び出しがトークン所有者の権限で走ります。
| 環境変数 | 役割 |
|---|---|
CONTENTFUL_MANAGEMENT_ACCESS_TOKEN | 役割Contentful Management APIの個人アクセストークン |
SPACE_ID | 役割既定のスペースID(省略可) |
ENVIRONMENT_ID | 役割既定の環境ID(省略可。公式の例は master) |
CONTENTFUL_HOST | 役割Management APIのホスト(グローバルは api.contentful.com、EUのAPIは api.eu.contentful.com) |
SPACE_ID と ENVIRONMENT_ID は、エージェントが文脈として使う既定値で、get_initial_context を通じて伝わります。範囲の制限ではありません。ツールの呼び出しは毎回 spaceId と environmentId を受け取るため、同じプロセスのままトークンが届く別のスペースや環境も対象にできます。
Claude Codeには、.mcp.json に次の形で登録できます。値はプレースホルダーです。
{
"mcpServers": {
"contentful-local": {
"command": "npx",
"args": ["-y", "@contentful/mcp-server"],
"env": {
"CONTENTFUL_MANAGEMENT_ACCESS_TOKEN": "<YOUR_CMA_PAT>",
"SPACE_ID": "<YOUR_SPACE_ID>",
"ENVIRONMENT_ID": "master",
"CONTENTFUL_HOST": "api.contentful.com"
}
}
}
}リモートとローカルの違い
リモート
認証はOAuth 2.1で、利用者ごとのContentful IDで動きます。日常利用や、管理者がツールを絞りたい組織に向きます。
ローカル
認証は個人アクセストークンだけです。MCPアプリの許可リストは使わないので、絞り込みはトークンの権限で行います。ローカル開発・スクリプト・CI、OAuthが使えない環境に向き、公式は最小権限のトークンを勧めています。
権限は3層で絞る
Contentful連携の安全性は、三つの層の重なりで決まります。上の層ほど、Claudeの側から手が出せません。
| 層 | 誰が設定するか | 何を制御するか |
|---|---|---|
| Contentfulの利用者権限 | 誰が設定するかContentfulの管理者 | 何を制御するか接続した本人が元々できること |
| Contentful MCPアプリ | 誰が設定するかスペースの管理者 | 何を制御するか環境ごとに、ツールの領域を読み取り専用か読み書きかで許可 |
| Claudeのツール権限 | 誰が設定するか組織のOwnerと利用者本人 | 何を制御するかツールごとに、常に許可・承認を求める・ブロック |
Contentful MCPアプリの許可リスト
アプリの設定画面では、環境ごとに領域(エントリ、アセット、コンテンツタイプ、環境、AI Actionsなど)を選び、それぞれを読み取り専用か読み書きかに設定します。許可されていないツールは、クライアントが直接呼んでも拒否されます。同じ環境に接続する全員が同じ許可リストを共有しつつ、各自のContentful権限は別に効きます。
マーケティング担当の監査には読み取り専用、エージェント型のパイプラインを組む開発者には書き込み付き、という切り分けが、ディレクトリの掲載ページでも例として挙がっています。
Claude側のツール権限
ClaudeのTeam・Enterpriseプランでは、Ownerがコネクタのツールを読み取り系と書き込み・削除系に分けて確認できます。それぞれ「Always allow」「Needs approval」「Blocked」から選べます。設定は組織全体に効き、個人は上書きできません。Claudeで書き込みを許しても、Contentful側で本人に権限がなければ変更は通りません。この設定は権限を足すのでなく、絞るためのものです。
Claude Codeは、組織のツール設定を起動時に読み込んで、手元で適用します。ask のツールは、Your organization requires approval for this tool という理由つきで呼び出しのたびに承認を求められます。bypassPermissions モードでも省かれず、選択を記憶させる選択肢も出ません。blocked のツールはClaudeに渡る前に除かれます。Claude Desktopのローカル・SSHセッションでは blocked だけが効き、ask はClaude Codeに届かないため、通常の権限ルールが適用されます。Claude Codeが自分でコネクタを取得するセッションでは、/mcp の一覧に disabled by your organization と表示されます。
個人の設定側では、拒否ルールと確認ルールをツール名のパターンで書けます。claude mcp add で登録した名前が contentful なら、ツール名は mcp__contentful__ に続く形になります。Claude Codeが自分でコネクタを取得するセッションでは、名前が mcp__claude_ai_<server>__<tool> の形になります。<server> の表記は /mcp で確かめます。
{
"permissions": {
"deny": [
"mcp__contentful__delete_*"
],
"ask": [
"mcp__contentful__publish_*",
"mcp__contentful__create_environment",
"mcp__contentful__create_content_type"
]
}
}これは設定の一例です。削除系をまとめて拒否し、公開・環境作成・モデル作成は毎回確認に回す構成にしています。ルールを書く前に、/mcp で実際のツール名を確かめます。
安全な使い方の順番
公式の注意書きは、リモートサーバーでは可能なら人間の確認を有効にし、MCPアプリでは読み取り専用から始めて、その後で書き込みを開けるよう勧めています。この順番をそのまま運用の手順にできます。
許可を広げる順番
- 1
読み取り専用で始める
最初の環境は読み取り専用で許可し、
search_entriesなどで現状を読ませます。接続時に選ぶ環境には、本番にあたるものを入れません。 - 2
エントリだけ読み書きにする
下書き作成が必要になった段階で、エントリの領域だけを広げます。
- 3
モデルの領域は作業中だけ開ける
コンテンツタイプと環境の領域は、モデルを変える作業の間だけ書き込みにし、終わったら戻します。
環境は接続のたびに選び直します。すでにアプリが入っている環境でも、新しい接続ごとに設定画面で対象を選ぶ必要があり、選び直してもアプリが再設定されることはありません。作業用の環境だけを選んだセッションなら、Claudeの手が届く範囲もそこまでです。
コンテンツモデルの変更は、エントリの編集と性質が違います。フィールドの削除や環境の削除は、エントリの編集より影響が広い操作です。Claudeに任せるなら、変更前に get_content_type の結果を保存させ、変更後に同じツールで差分を読ませる手順を挟めます。
よくあるつまずき
- ツールが「not allowed」で拒否される: 領域がMCPアプリの許可リストに入っていません。アプリの設定を直し、接続をやり直します
Failed to fetch app installation: Forbidden: 環境エイリアスを指定している可能性があります。エイリアスは未対応なので、実体の環境IDで接続します- 認証が通らない・ブラウザが開かない: クライアントに古いトークンが残っていることがあります。サーバー登録を一度削除して、OAuthを最初からやり直します
- EU組織で呼び出しが失敗する: 全クライアントの設定を
mcp.eu.contentful.comに揃えます - セッションに対象がない: 接続のたびにスペースと環境の選択が要ります。飛ばすと、操作対象が空のままになります
- Claude Codeにclaude.aiのコネクタが出てこない: claude.aiのコネクタは、claude.aiのサブスクリプションログインで認証しているときだけ取得されます。
ANTHROPIC_API_KEY・ANTHROPIC_AUTH_TOKEN・apiKeyHelperのいずれかが有効だと読み込まれないので、/statusで認証方式を確かめます。claude mcp addで直接登録する方法もあります
画像・ファイルの取り込みは2段階
ツール呼び出しはJSONなので、バイナリを直接は送れません。アセットのアップロードは、ファイルの受け渡しとアセットの作成に分かれます。
アセットを取り込む3ステップ
- 1
セッションを作る
create_upload_sessionを引数なしで呼びます。uploadHandle・uploadUrl・expiresAtが返ります。 - 2
ファイルをPUTする
返ってきた
uploadUrlに、Content-Lengthヘッダー付きでファイルの中身をPUTします。 - 3
アセットを作る
upload_assetに、spaceId・environmentIdと、uploadHandle・fileName・contentTypeを含むfileを渡します。
2段階目の呼び出しは、公式ドキュメントの例ではこの形です。
curl -X PUT "https://mcp.contentful.com/uploads/<HANDLE>" \
--data-binary @image.png \
-H "Content-Length: $(wc -c < image.png)"このURLは認証なしで受け付けるため、ハンドル自体が秘密の鍵になります。セッションは作成から1時間で失効し、一度使うと再利用できないので、アップロードのたびに作り直します。EUのエンドポイントでも同じ手順で、返される uploadUrl は絶対URLでホストも合っているため、自分で組み立てずそのまま使います。ChatGPTから接続する場合だけは、会話に添付したファイルを渡して upload_asset を直接呼べます。
環境ごとの制限はContentful側、組織の共通ルールはClaude側に置く
Contentful連携は、他のコネクタと比べて「何を触れるか」の幅が広い部類です。たとえばMixpanelも書き込みができるコネクタですが、扱うのは分析側のメタデータでした。Contentfulでは、コンテンツそのものに加えて、コンテンツタイプという設計図や環境まで対象に入ります。
設定を変えた記録をどこまで追えるかは、コネクタ権限と監査ログで扱っています。ほかのコネクタで起きた権限まわりの失敗例は権限設定のよくある失敗にあります。
まとめ
共有アカウントでCIを回すなら、ローカルサーバーに最小権限のトークンを組み合わせる構成が合います。複数人のチームで使うなら、リモートに環境別の許可リストを置く構成が向きます。