このサイトは非公式の日本語訳です。Cloudflare・EmDashプロジェクトが運営するサイトではありません。

このページで分かること

  • /_emdash/api/mcp の認証(Bearerトークン、スコープ、必要なロール)と通信方式(ステートレスなStreamable HTTP、JSON-RPC 2.0)
  • ツールの一覧(コンテンツ、バイライン、スキーマ、メディア、検索、タクソノミー、メニュー、リビジョン、設定)と、ツールのスキーマの使い方
  • コンテンツの更新と _rev、翻訳、スキーマ・メディア・タクソノミー・メニューの注意点、プラグインのツール、OAuthの検出、エラーの形式
難易度
上級
読む時間
9分
前提知識
AIツール連携
このページの目次

EmDashは、Model Context Protocol(MCP)のサーバーを /_emdash/api/mcp に組み込みで提供しています。MCPクライアントは、このサーバーを使って、コンテンツ、バイライン、スキーマ、メディア、タクソノミー、メニュー、リビジョン、設定を読み込み、管理します。

認証

MCPのエンドポイントにはBearerトークンが必要です。EmDashは次のトークンの取得方法に対応しています。

方法 用途
PKCE(Proof Key for Code Exchange)付きのOAuth 2.1認可コード 対話型のMCPクライアント。ユーザーは、要求されたスコープをブラウザーで承認します。
個人用アクセストークン クライアントや自動化のための長期間有効なアクセス。トークンには ec_pat_ の接頭辞が付き、管理画面で作成します。
OAuth 2.0デバイス認可グラント ブラウザーでコードを承認するようユーザーに求める、コマンドラインのクライアント。emdash login はこの方式を使います。

セッションのCookieでは、MCPのエンドポイントの認証はできません。

スコープ

OAuthのトークンと個人用アクセストークンは、クライアントが呼び出せるツールを制限します。ユーザーのロールは別に確認されるため、スコープによって、ユーザーが持っていない権限が与えられることはありません。

スコープ アクセスできる範囲
content:read コンテンツ、バイライン、タクソノミー、ターム、メニュー、リビジョンの読み取りと検索。下書きに類するコンテンツには、ユーザーの content:read_drafts 権限も必要です。
content:write コンテンツ、バイライン、リビジョンの作成と変更。既存のトークンとの互換性のため、taxonomies:managemenus:manage も与えられます。
media:read メディアのレコードの読み取り。
media:write メディアのアップロード、登録、更新、削除。
schema:read コレクションとフィールドの読み取り。
schema:write コレクションとフィールドの作成、更新、削除。
taxonomies:manage タクソノミーの定義とタームの作成、更新、削除。
menus:manage メニューとメニュー項目の作成、更新、削除。
settings:read サイトの設定の読み取り。
settings:manage サイトの設定の更新。
mcp:tools 有効になっているすべてのプラグインが公開するMCPのツールの呼び出し。
mcp:tools:<pluginId> 有効になっている1つのプラグインが公開するMCPのツールの呼び出し。
admin すべてのコアのツールの呼び出し。プラグインのツールには、引き続き mcp:tools またはプラグイン固有のスコープが必要です。

認可コードの同意画面では、ユーザーは要求されたスコープを外せます。EmDashは、要求されたスコープを、クライアントに登録されたスコープとユーザーのロールとも照らし合わせて絞り込み、何も許可されない結果になった場合は拒否します。

必要なロール

次の表は、大まかな操作ごとに必要な最小のロールを示しています。ユーザーが別のユーザーのコンテンツを操作する場合は、所有者の確認によって、より上位のロールが必要になることがあります。

操作 最小のロール
公開済みのコンテンツ、メディア、タクソノミー、ターム、メニューの読み取り 閲覧者
下書き、予約公開のコンテンツ、ゴミ箱、比較、リビジョンの読み取り 寄稿者
コンテンツの作成、メディアのアップロード 寄稿者
自分のコンテンツの編集・公開、メディアの登録 投稿者
バイライン、タクソノミー、メニュー、全ユーザーのコンテンツの管理 編集者
スキーマ・設定の読み取り 編集者
スキーマ・設定の変更、コンテンツの完全削除、メディアの使用状況の修復 管理者

ロールの定義全体については、ユーザーのロールを参照してください。

通信方式

このサーバーは、ステートレスなStreamable HTTPを使います。各リクエストは独立しており、サーバーはMCPのセッションもServer-Sent Eventsの接続も保持しません。

メソッド エンドポイント 動作
POST /_emdash/api/mcp JSON-RPCの初期化、ツールの一覧の取得、ツールの呼び出しを受け付けます。
GET /_emdash/api/mcp 405 Method Not Allowed を返します。
DELETE /_emdash/api/mcp 405 Method Not Allowed を返します。

レスポンスにはJSON-RPC 2.0を使います。ツールのリクエストを組み立てる前に、tools/list を呼び出して、現在の入力スキーマとMCPのアノテーションを取得します。

ツールの一覧

次の一覧は、tools/list が返す静的なツールと一致しています。クライアントによってはツール名の代わりに登録タイトルを表示するため、登録タイトルも載せています。

コンテンツのツール

ツール 登録タイトル 必要なスコープ
content_list List Content content:read
content_get Get Content content:read
content_create Create Content content:write
content_update Update Content content:write
content_delete Delete Content (Trash) content:write
content_restore Restore Content content:write
content_permanent_delete Permanently Delete Content content:write
content_publish Publish Content content:write
content_unpublish Unpublish Content content:write
content_schedule Schedule Content content:write
content_unschedule Cancel Scheduled Publication content:write
content_compare Compare Live vs Draft content:read
content_discard_draft Discard Draft content:write
content_list_trashed List Trashed Content content:read
content_duplicate Duplicate Content content:write
content_translations Get Content Translations content:read

バイラインのツール

ツール 登録タイトル 必要なスコープ
byline_list List Bylines content:read
byline_get Get Byline content:read
byline_create Create Byline content:write
byline_update Update Byline content:write
byline_delete Delete Byline content:write
byline_translations List Byline Translations content:read

スキーマのツール

ツール 登録タイトル 必要なスコープ
schema_list_collections List Collections schema:read
schema_get_collection Get Collection Schema schema:read
schema_create_collection Create Collection schema:write
schema_delete_collection Delete Collection schema:write
schema_update_collection Update Collection schema:write
schema_create_field Add Field to Collection schema:write
schema_delete_field Remove Field from Collection schema:write
schema_update_field Update Field schema:write

メディアのツール

ツール 登録タイトル 必要なスコープ
media_list List Media media:read
media_create Register Uploaded Media media:write
media_upload Upload Media media:write
media_get Get Media Item media:read
media_update Update Media Metadata media:write
media_delete Delete Media media:write
media_usage_repair Repair Media Usage Index admin

検索のツール

ツール 登録タイトル 必要なスコープ
search Search Content content:read

タクソノミーのツール

ツール 登録タイトル 必要なスコープ
taxonomy_list List Taxonomies content:read
taxonomy_get Get Taxonomy Definition content:read
taxonomy_create Create Taxonomy Definition taxonomies:manage
taxonomy_update Update Taxonomy Definition taxonomies:manage
taxonomy_delete Delete Taxonomy Definition taxonomies:manage
taxonomy_list_terms List Taxonomy Terms content:read
taxonomy_create_term Create Taxonomy Term taxonomies:manage
taxonomy_update_term Update Taxonomy Term taxonomies:manage
taxonomy_delete_term Delete Taxonomy Term taxonomies:manage
taxonomy_term_translations List Term Translations content:read
ツール 登録タイトル 必要なスコープ
menu_list List Menus content:read
menu_get Get Menu with Items content:read
menu_translations List Menu Translations content:read
menu_create Create Menu menus:manage
menu_update Update Menu menus:manage
menu_delete Delete Menu menus:manage
menu_set_items Set Menu Items menus:manage

リビジョンのツール

ツール 登録タイトル 必要なスコープ
revision_list List Revisions content:read
revision_restore Restore Revision content:write

設定のツール

ツール 登録タイトル 必要なスコープ
settings_get Get Site Settings settings:read
settings_update Update Site Settings settings:manage

ツールのスキーマの使い方

tools/list は、各ツールの説明、JSONの入力スキーマ、アノテーションを返します。呼び出しを組み立てる前にこのメタデータを読み、インストールされているEmDashのバージョンが対応するフィールド、使える値、制限をクライアントが使うようにします。

たとえば、記事を更新するクライアントは、まず content_get を呼び出し、返された _rev を保持します。そのうえで、次のJSON-RPCのリクエストを送れます。

{
	"jsonrpc": "2.0",
	"id": 2,
	"method": "tools/call",
	"params": {
		"name": "content_update",
		"arguments": {
			"collection": "articles",
			"id": "01JARTICLE0000000000000000",
			"data": { "title": "Updated title" },
			"_rev": "opaque-revision-token"
		}
	}
}

結果は、最初のコンテンツブロックにJSONのテキストとして返されます。出力スキーマを持つツールは、同じ値を structuredContent にも入れて返す場合があります。

コンテンツのライフサイクルとバイライン

content_get は、中身を解釈しない _rev の値を返します。この値を content_updatecontent_publishcontent_unpublishcontent_discard_draft に渡します。古い値を渡すと競合が返されるため、再試行する前にエントリーを読み込み直します。

content_update は部分的な更新です。指定しなかったフィールドは現在の値のままです。公開済みのエントリーを更新すると、公開中の版はそのままで、下書きが用意されます。content_compare で公開中の値と下書きの値を確認し、content_publish を呼び出して下書きを公開するか、content_discard_draft を呼び出して下書きを削除します。content_delete はエントリーをゴミ箱に移します。ゴミ箱のエントリーを完全に削除するのは content_permanent_delete だけです。

バイラインは、再利用できる執筆者や協力者のクレジットです。byline_create は、ゲストのクレジットを作成することも、バイラインをCMSのユーザーに結び付けることもできます。返されたバイラインのIDを、content_createcontent_update が受け取る入力 bylines に渡します。バイラインを削除すると、そのクレジットはコンテンツから外れ、主なバイラインに設定されていた場合はその設定も解除されます。

MCPでの書き込みは、管理画面のエントリーの編集ロックの対象になりません。_rev の確認は、それを受け取る操作を保護しますが、ほかの書き込みツールは、編集者がエントリーを開いている間でもエントリーを変更できます。

翻訳

コンテンツ、バイライン、タクソノミーのターム、メニューの翻訳のツールは、該当する翻訳グループのすべてのロケールの版を返します。作成のツールのスキーマに translationOf の入力がある場合は、それを使います。必須のフィールドは tools/list が正です。

content_translations は、コレクションと、コンテンツのIDまたはスラッグを受け取ります。バイライン、タクソノミーのターム、メニューの翻訳のツールは、1件のレコードのIDか、共有の翻訳グループのIDのどちらかを受け取ります。下書きにアクセスできないユーザーには、公開済みのコンテンツの翻訳だけが表示されます。

スキーマ、メディア、タクソノミー、メニュー

スキーマのツールは、データベースの構造を変更します。コンテンツを作成したりフィールドを変更したりする前に、schema_get_collection を使います。このツールは、使えるフィールド名、型、制約、検証ルールを返します。コレクションとフィールドを削除すると、保存されたコンテンツやフィールドの値も削除され、元に戻せません。

base64でエンコードしたバイト列を送る場合や、公開されたHTTPまたはHTTPSのURLから取得する場合は、media_upload を使います。URLからのアップロードでは、プライベートネットワークの宛先は拒否され、リダイレクトも改めて確認されます。media_create は、指定したストレージキーにファイルがすでにあり、そのメタデータを登録する必要がある場合にだけ使います。アップロードには設定されたサイズとMIMEタイプの制限が適用されます。同じバイト列の場合は、既存のメディアが deduplicated: true 付きで返されることがあります。

タクソノミーの定義は、分類と、その分類を適用するコレクションを記述します。タームは、コンテンツに割り当てる個々の値です。階層を持つタームは parentId を使えますが、親は同じタクソノミーに属している必要があり、循環を作ることはできません。子を持つタームを削除する前に、その子を削除するか移動する必要があります。

menu_set_items は、メニューの項目のリスト全体を、1回の不可分な操作で置き換えます。配列の順序がメニューの順序になります。入れ子になった項目の parentIndex は、同じ配列の中の前にある項目を指すため、すべての親をその子より前に置きます。

media_usage_repair は、1つのコレクションまたはすべてのコレクションを処理でき、大きなサイトでは長時間かかる場合があります。completepartialfailedstale のステータスは、いずれもツールの成功のレスポンスです。isError に頼らず、返されたステータスと件数を確認します。認証、検証、予期しない実行時の失敗では isError: true が設定されます。

プラグインのツール

各プラグインのMCPの機能は、管理者が有効にする必要があります。有効にしたツールは、tools/list<pluginId>__<localName> として表示され、トークンで認証した呼び出しには mcp:tools または mcp:tools:<pluginId> が必要です。EmDashは、プラグインのルートが宣言している権限も確認し、プラグイン、ツール、ルート、実行者を監査ログに記録します。

プラグインのツールはインストールごとに異なるため、上の静的な一覧には含まれていません。

OAuthの検出

MCPクライアントは、保護対象リソースのメタデータから認可サーバーを検出します。

GET /.well-known/oauth-protected-resource

レスポンスは、/_emdash/api/mcp を保護対象のリソースとして示し、認可サーバーへのリンクを含みます。クライアントは次に、そのメタデータを次の場所から読み込みます。

GET /.well-known/oauth-authorization-server/_emdash

このドキュメントは、現在の認可、トークン、登録、デバイス認可の各エンドポイントと、対応するスコープ、グラントの種類、PKCEの方式 S256 を提供します。OAuthのプロトコルのルートをハードコードせず、検出した値を使います。

認証されていないMCPのリクエストには、検出用のURLを含む 401 のレスポンスが返されます。

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://example.com/.well-known/oauth-protected-resource"

エラー

ツールが失敗すると isError: true になります。最初のテキストブロックは変わらないコードで始まり、構造化されたメタデータを読むクライアントのために、_meta.code にも同じコードが入ります。

{
	"content": [{ "type": "text", "text": "[NOT_FOUND] Collection 'articles' not found" }],
	"isError": true,
	"_meta": { "code": "NOT_FOUND" }
}

認証の失敗には、INSUFFICIENT_SCOPEINSUFFICIENT_PERMISSIONS などのコードが使われます。通信の失敗にはJSON-RPCの内部エラーのコード -32603 が使われ、内部で発生した例外の内容は公開されません。