EmDashには/_emdash/api/mcpに組み込みのModel Context Protocol(MCP)サーバーが含まれており、コンテンツ管理操作をAIアシスタントのツールとして公開します。
このページではプロトコルの詳細を説明します:認証、トランスポート、ツール仕様、OAuthディスカバリ、エラー処理。
認証
MCPサーバーは3つの認証方法をサポートしています:
| 方法 | 仕組み |
|---|---|
| OAuth 2.1 Authorization Code + PKCE | MCPクライアント向けの標準フロー。ユーザーがブラウザでスコープを承認します。 |
| Personal Access Token(PAT) | 管理パネルで作成される長期有効なec_pat_*トークン。 |
| Device Flow | ブラウザでコードを承認するCLIスタイルのフロー。emdash loginで使用されます。 |
スコープ
| スコープ | アクセス権限 |
|---|---|
content:read | コンテンツの一覧、取得、比較、検索。タクソノミー、タームおよびメニューの一覧。 |
content:write | コンテンツの作成、更新、削除、公開、非公開化、スケジュール、スケジュール解除、複製、復元。taxonomies:manageとmenus:manageを暗黙的に付与。 |
media:read | メディアアイテムの一覧と取得。 |
media:write | メディアメタデータの登録(作成)、更新、削除。 |
schema:read | コレクション一覧とスキーマの取得。 |
schema:write | コレクションとフィールドの作成・削除。 |
taxonomies:manage | タクソノミータームの作成、更新、削除。 |
menus:manage | ナビゲーションメニューとそのアイテムの作成、更新、削除。 |
settings:read | サイト全体の設定の読み取り。 |
settings:manage | サイト全体の設定の更新。 |
mcp:tools | 任意のプラグインの明示的に有効化されたMCPツールの呼び出し。 |
mcp:tools:<pluginId> | 特定のプラグインの明示的に有効化されたMCPツールの呼び出し。 |
admin | すべての操作への完全アクセス。 |
ロール要件
| 操作 | 最小ロール |
|---|---|
| コンテンツ読み取り | Subscriber(10)公開済みアイテム; Contributor(20)下書き、スケジュール済み、ゴミ箱、リビジョン |
| コンテンツ作成 | Contributor(20) |
| 自身の編集/削除 | Author(30) |
| コンテンツ公開 | Author(30)自身; Editor(40)他者のアイテム |
| スキーマ読み取り | Editor(40) |
| スキーマ書き込み | Admin(50) |
| タクソノミー管理 | Editor(40) |
| メニュー管理 | Editor(40) |
| 設定読み取り | Editor(40) |
| 設定管理 | Admin(50) |
メディアアップロード(media_upload) | Contributor(20) |
メディア登録(media_create) | Author(30) |
| メディア使用修復 | Admin(50) |
認証ガイドでロール定義を参照してください。
トランスポート
サーバーはステートレスモードでStreamable HTTPトランスポートを使用します。各リクエストは独立しています。
POST /_emdash/api/mcp— JSON-RPCツールコールの送信GET /_emdash/api/mcp— 405を返すDELETE /_emdash/api/mcp— 405を返す
ツール
サーバーは8つのドメインにわたるツールを公開します:コンテンツ、スキーマ、メディア、検索、タクソノミー、メニュー、リビジョン、設定。
コンテンツツール
content_list
コレクション内のコンテンツアイテムをフィルタリングとページネーション付きで一覧表示。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
status | string | いいえ | フィルタ:draft、published、scheduled |
limit | integer | いいえ | 最大アイテム数(1-100、デフォルト50) |
cursor | string | いいえ | ページネーションカーソル |
orderBy | string | いいえ | ソートフィールド |
order | string | いいえ | ソート方向:ascまたはdesc |
locale | string | いいえ | ロケールでフィルタ |
スコープ: content:read | 読み取り専用: はい
content_get
IDまたはスラッグで単一のコンテンツアイテムを取得。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | アイテムID(ULID)またはスラッグ |
locale | string | いいえ | スラッグ検索用のロケール |
スコープ: content:read | 読み取り専用: はい
content_create
新しいコンテンツアイテムを作成。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
data | object | はい | フィールド値(キーバリューペア) |
slug | string | いいえ | URLスラッグ |
status | string | いいえ | 初期ステータス:draftまたはpublished |
locale | string | いいえ | ロケール |
translationOf | string | いいえ | 翻訳元のアイテムID |
スコープ: content:write
content_update
既存のコンテンツアイテムを更新。変更したいフィールドのみ含めます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | アイテムIDまたはスラッグ |
data | object | いいえ | 更新するフィールド値 |
slug | string | いいえ | 新しいURLスラッグ |
status | string | いいえ | 新しいステータス |
_rev | string | いいえ | 競合検出用リビジョントークン |
スコープ: content:write
content_delete
コンテンツアイテムをゴミ箱に移動して論理削除。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | アイテムIDまたはスラッグ |
スコープ: content:write | 破壊的: はい
content_restore
ゴミ箱からコンテンツアイテムを復元。
スコープ: content:write
content_permanent_delete
ゴミ箱のアイテムを完全かつ不可逆的に削除。
スコープ: content:write | 破壊的: はい
content_publish
コンテンツアイテムを公開し、サイトでライブにします。
スコープ: content:write
content_unpublish
公開済みアイテムを下書きステータスに戻します。
スコープ: content:write
content_schedule
コンテンツアイテムを将来の公開にスケジュール。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | アイテムIDまたはスラッグ |
scheduledAt | string | はい | ISO 8601日時 |
スコープ: content:write
content_unschedule
スケジュール済みの公開をキャンセル。
スコープ: content:write
content_compare
公開バージョンと現在の下書きを比較。
スコープ: content:read | 読み取り専用: はい
content_discard_draft
現在の下書きを破棄し、最後の公開バージョンに戻す。
スコープ: content:write | 破壊的: はい
content_list_trashed
コレクションのゴミ箱内のアイテムを一覧表示。
スコープ: content:read | 読み取り専用: はい
content_duplicate
既存のコンテンツアイテムのコピーを作成。
スコープ: content:write
content_translations
コンテンツアイテムのすべてのロケールバリアントを取得。
スコープ: content:read | 読み取り専用: はい
スキーマツール
schema_list_collections
すべてのコンテンツコレクションを一覧表示。
スコープ: schema:read | 最小ロール: Editor | 読み取り専用: はい
schema_get_collection
コレクションの詳細情報を取得。
スコープ: schema:read | 最小ロール: Editor | 読み取り専用: はい
schema_create_collection
新しいコンテンツコレクションを作成。
スコープ: schema:write | 最小ロール: Admin
schema_delete_collection
コレクションとそのテーブルを削除。不可逆。
スコープ: schema:write | 最小ロール: Admin | 破壊的: はい
schema_create_field
コレクションに新しいフィールドを追加。
フィールドタイプ:string、text、number、integer、boolean、datetime、select、multiSelect、portableText、image、file、reference、json、slug。
スコープ: schema:write | 最小ロール: Admin
schema_delete_field
コレクションからフィールドを削除。不可逆。
スコープ: schema:write | 最小ロール: Admin | 破壊的: はい
メディアツール
media_list
アップロード済みメディアファイルを一覧表示。
スコープ: media:read | 読み取り専用: はい
media_upload
base64エンコードデータまたは外部URLからメディアファイルをアップロード。
スコープ: media:write | 最小ロール: Contributor
media_create
すでにストレージにアップロード済みのメディアファイルを登録。
スコープ: media:write | 最小ロール: Author
media_get
IDでメディアファイルの詳細を取得。
スコープ: media:read | 読み取り専用: はい
media_update
メディアファイルのメタデータを更新。
スコープ: media:write
media_delete
メディアファイルを完全に削除。
スコープ: media:write | 破壊的: はい
media_usage_repair
コンテンツのメディア使用インデックスを修復。
スコープ: admin | 最小ロール: Admin
検索ツール
search
コンテンツコレクション全体のフルテキスト検索。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
query | string | はい | 検索クエリテキスト |
collections | string[] | いいえ | 特定のコレクションに限定 |
locale | string | いいえ | ロケールでフィルタ |
limit | integer | いいえ | 最大結果数(1-50、デフォルト20) |
スコープ: content:read | 読み取り専用: はい
タクソノミーツール
taxonomy_list
すべてのタクソノミー定義を一覧表示。
スコープ: content:read | 読み取り専用: はい
taxonomy_list_terms
タクソノミー内のタームを一覧表示。
スコープ: content:read | 読み取り専用: はい
taxonomy_create_term
新しいタームを作成。
スコープ: taxonomies:manage | 最小ロール: Editor
taxonomy_update_term
既存のタームを更新。
スコープ: taxonomies:manage | 最小ロール: Editor
taxonomy_delete_term
タームを完全に削除。
スコープ: taxonomies:manage | 最小ロール: Editor | 破壊的: はい
メニューツール
menu_list
ナビゲーションメニューを一覧表示。
スコープ: content:read | 読み取り専用: はい
menu_get
名前でメニューを取得。
スコープ: content:read | 読み取り専用: はい
menu_create
新しいナビゲーションメニューを作成。
スコープ: menus:manage | 最小ロール: Editor
menu_update
メニューのラベルを更新。
スコープ: menus:manage | 最小ロール: Editor
menu_delete
メニューとそのすべてのアイテムを削除。不可逆。
スコープ: menus:manage | 最小ロール: Editor | 破壊的: はい
menu_set_items
メニューのアイテムリスト全体を一度に置換。アトミック。
スコープ: menus:manage | 最小ロール: Editor
リビジョンツール
revision_list
コンテンツアイテムのリビジョン履歴を一覧表示。
スコープ: content:read | 読み取り専用: はい
revision_restore
コンテンツアイテムを以前のリビジョンに復元。
スコープ: content:write
設定ツール
settings_get
すべてのサイト全体の設定を取得。
スコープ: settings:read | 最小ロール: Editor | 読み取り専用: はい
settings_update
1つ以上のサイト全体の設定を更新。
スコープ: settings:manage | 最小ロール: Admin
OAuthディスカバリ
保護リソースメタデータ
GET /.well-known/oauth-protected-resource
{
"resource": "https://example.com/_emdash/api/mcp",
"authorization_servers": ["https://example.com/_emdash"],
"scopes_supported": [
"content:read", "content:write",
"media:read", "media:write",
"schema:read", "schema:write",
"taxonomies:manage", "menus:manage",
"settings:read", "settings:manage",
"admin"
],
"bearer_methods_supported": ["header"]
}
認可サーバーメタデータ
GET /.well-known/oauth-authorization-server/_emdash
{
"issuer": "https://example.com/_emdash",
"authorization_endpoint": "https://example.com/_emdash/oauth/authorize",
"token_endpoint": "https://example.com/_emdash/api/oauth/token",
"scopes_supported": ["content:read", "content:write", "..."],
"response_types_supported": ["code"],
"grant_types_supported": [
"authorization_code",
"refresh_token",
"urn:ietf:params:oauth:grant-type:device_code"
],
"code_challenge_methods_supported": ["S256"],
"token_endpoint_auth_methods_supported": ["none"],
"device_authorization_endpoint": "https://example.com/_emdash/api/oauth/device/code"
}
エラー処理
ツールエラーはisError: true付きのテキストコンテンツとして返されます:
{
"content": [{ "type": "text", "text": "[NOT_FOUND] Collection 'nonexistent' not found" }],
"isError": true,
"_meta": { "code": "NOT_FOUND" }
}
{
"content": [
{ "type": "text", "text": "[INSUFFICIENT_SCOPE] Insufficient scope: requires content:write" }
],
"isError": true,
"_meta": { "code": "INSUFFICIENT_SCOPE" }
}
トランスポートレベルのエラーはJSON-RPCエラーコード-32603(内部エラー)を返し、実装の詳細は公開しません。