コンテンツにスキップ

MCP サーバーリファレンス

EmDashには、AIアシスタント向けにコンテンツ管理操作をツールとして公開する組み込みのModel Context Protocol(MCP)サーバーが/_emdash/api/mcpに含まれています。

このページでは、プロトコルの詳細:認証、トランスポート、ツール仕様、OAuthディスカバリー、およびエラー処理について説明します。

MCPサーバーは3つの認証方法をサポートしています:

方法仕組み
OAuth 2.1 Authorization Code + PKCEMCPクライアント向けの標準フロー。ユーザーがブラウザでスコープを承認します。
Personal Access Token (PAT)管理パネルで作成された長寿命のec_pat_*トークン。
Device Flowブラウザでコードを承認するCLIスタイルのフロー。emdash loginで使用されます。

セッションCookie(管理UIからのもの)も機能しますが、外部MCPクライアントには実用的ではありません。

トークンは、クライアントが実行できる操作を制限するためにスコープが設定されています。スコープはOAuth認可中に要求され、すべてのツール呼び出しで強制されます。

スコープアクセス権限
content:readコンテンツの一覧表示、取得、比較、検索。タクソノミー用語とメニューの一覧表示。
content:writeコンテンツの作成、更新、削除、公開、非公開、スケジュール設定、複製、復元。タクソノミー用語の作成。
media:readメディアアイテムの一覧表示と取得。
media:writeメディアメタデータの更新と削除。
schema:readコレクションの一覧表示とコレクションスキーマの取得。
schema:writeコレクションとフィールドの作成と削除。
adminすべての操作へのフルアクセス。

adminスコープはすべてへのアクセス権を付与します。セッションベースの認証(トークンなし)も、ユーザーのロールに基づいてフルアクセス権を持ちます。

スコープに加えて、一部のツールには最小限のRBACロールが必要です:

操作最小ロール
コンテンツ操作最小要件なし(アクセスはスコープで制御)
スキーマ読み取りEditor (40)
スキーマ書き込みAdmin (50)

ロールの定義については、認証ガイドを参照してください。

サーバーはステートレスモードでStreamable HTTPトランスポートを使用します。各リクエストは独立しており、セッションや長寿命の接続はありません。

  • POST /_emdash/api/mcp — JSON-RPCツール呼び出しを送信
  • GET /_emdash/api/mcp — 405を返す(ステートレスモードではSSEなし)
  • DELETE /_emdash/api/mcp — 405を返す(閉じるセッションなし)

レスポンスはJSON-RPC 2.0形式に従います。エラーは標準のJSON-RPCエラーコードを使用し、スコープと権限の失敗にはMCP固有のコードが使用されます。

サーバーは7つのドメインにわたる33のツールを公開しています。各ツールは結果をJSONテキストコンテンツとして返すか、失敗時にはisError: trueを含むエラーメッセージを返します。

オプションのフィルタリングとページネーションを使用して、コレクション内のコンテンツアイテムを一覧表示します。

パラメータ型必須説明
collectionstringはいコレクションスラッグ(例:posts、pages)
statusstringいいえフィルター:draft、published、またはscheduled
limitintegerいいえ返す最大アイテム数(1-100、デフォルト50)
cursorstringいいえ前回のレスポンスからのページネーションカーソル
orderBystringいいえソートするフィールド(例:created_at、updated_at)
orderstringいいえソート方向:ascまたはdesc(デフォルトdesc)
localestringいいえロケールでフィルター(例:en、fr)。i18nに関連する場合のみ。

スコープ: content:read | 読み取り専用: はい

IDまたはスラッグで単一のコンテンツアイテムを取得します。すべてのフィールド値、メタデータ、および楽観的同時実行制御のための_revトークンを返します。

パラメータ型必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムID(ULID)またはスラッグ
localestringいいえスラッグ検索用のロケール。IDはグローバルに一意です。

スコープ: content:read | 読み取り専用: はい

新しいコンテンツアイテムを作成します。dataオブジェクトには、コレクションのスキーマに一致するフィールド値を含める必要があります。利用可能なフィールドを確認するにはschema_get_collectionを使用してください。アイテムはデフォルトでdraftとして作成されます。

パラメータ型必須説明
collectionstringはいコレクションスラッグ
dataobjectはいキーと値のペアとしてのフィールド値
slugstringいいえURLスラッグ(省略時はタイトルから自動生成)
statusstringいいえ初期ステータス:draftまたはpublished(デフォルトdraft)
localestringいいえこのコンテンツのロケール(デフォルトはサイトのデフォルト)
translationOfstringいいえこれが翻訳元であるアイテムのID

スコープ: content:write

既存のコンテンツアイテムを更新します。変更したいフィールドのみを含めてください。指定されていないフィールドは変更されません。

パラメータ型必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ
dataobjectいいえ更新するフィールド値
slugstringいいえ新しいURLスラッグ
statusstringいいえ新しいステータス:draftまたはpublished
_revstringいいえ競合検出のためのcontent_getからのリビジョントークン

スコープ: content:write

コンテンツアイテムをゴミ箱に移動してソフト削除します。元に戻すにはcontent_restoreを、完全に削除するにはcontent_permanent_deleteを使用してください。

パラメータ型必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ

スコープ: content:write | 破壊的: はい

ごみ箱からソフト削除されたコンテンツアイテムを復元します。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ

スコープ: content:write

ごみ箱内のコンテンツアイテムを完全かつ不可逆的に削除します。アイテムは事前にごみ箱に入っている必要があります。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ

スコープ: content:write | 破壊的: はい

コンテンツアイテムを公開し、サイト上でライブにします。現在の下書きから公開リビジョンを作成します。それ以降の編集は、再公開されるまでライブバージョンに影響を与えずに新しい下書きを作成します。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ

スコープ: content:write

公開済みアイテムを下書きステータスに戻します。ライブサイト上では表示されなくなりますが、そのコンテンツは保持されます。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ

スコープ: content:write

コンテンツアイテムを将来の公開のためにスケジュールします。指定された日時で自動的に公開されます。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ
scheduledAtstringはいISO 8601 日時形式 (例: 2026-06-01T09:00:00Z)

スコープ: content:write

コンテンツアイテムの公開済み(ライブ)バージョンと現在の下書きを比較します。両方のバージョンと、変更があるかどうかを示すフラグを返します。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ

スコープ: content:read | 読み取り専用: はい

現在の下書きを破棄し、最後に公開されたバージョンに戻します。少なくとも一度は公開されたアイテムでのみ機能します。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ

スコープ: content:write | 破壊的: はい

コレクションのごみ箱内にあるソフト削除されたコンテンツアイテムを一覧表示します。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
limitintegerいいえ最大アイテム数 (1-100, デフォルト 50)
cursorstringいいえページネーションカーソル

スコープ: content:read | 読み取り専用: はい

既存のコンテンツアイテムのコピーを作成します。複製は下書きとして作成され、タイトルには「(コピー)」が追加され、スラッグは自動生成されます。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはい複製するコンテンツアイテムIDまたはスラッグ

スコープ: content:write

コンテンツアイテムのすべてのロケールバリアントを取得します。翻訳グループと各ロケールバージョンの概要を返します。i18nが有効な場合にのみ関連します。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ

スコープ: content:read | 読み取り専用: はい

CMSで定義されているすべてのコンテンツコレクションを一覧表示します。スラッグ、ラベル、サポート機能、タイムスタンプを返します。

パラメータなし。

スコープ: schema:read | 最小ロール: 編集者 | 読み取り専用: はい

すべてのフィールド定義を含む、コレクションの詳細情報を取得します。フィールドはコンテンツモデルを記述します:名前、タイプ、制約、検証ルール。content_create と content_update が何を期待するかを理解するために使用します。

パラメータタイプ必須説明
slugstringはいコレクションスラッグ (例: posts)

スコープ: schema:read | 最小ロール: 編集者 | 読み取り専用: はい

新しいコンテンツコレクションを作成します。これにより、データベーステーブルとスキーマ定義が作成されます。スラッグは小文字の英数字とアンダースコアで、文字で始まる必要があります。

パラメータタイプ必須説明
slugstringはい一意の識別子 (/^[a-z][a-z0-9_]*$/)
labelstringはい表示名 (複数形, 例: “ブログ投稿”)
labelSingularstringいいえ単数形の表示名
descriptionstringいいえこのコレクションの説明
iconstringいいえ管理UI用のアイコン名
supportsstring[]いいえ機能: drafts, revisions, preview, scheduling, search (デフォルト: ['drafts', 'revisions'])

スコープ: schema:write | 最小ロール: 管理者

コレクションとそのデータベーステーブルを削除します。これは不可逆的で、コレクション内のすべてのコンテンツを削除します。

パラメータタイプ必須説明
slugstringはい削除するコレクションスラッグ
forcebooleanいいえコレクションにコンテンツがあっても強制削除

スコープ: schema:write | 最小ロール: 管理者 | 破壊的: はい

コレクションのスキーマに新しいフィールドを追加します。これにより、データベーステーブルに列が追加されます。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
slugstringはいフィールド識別子 (/^[a-z][a-z0-9_]*$/)
labelstringはい表示名
typestringはいデータ型 (下記参照)
requiredbooleanいいえフィールドが必須かどうか
uniquebooleanいいえ値が一意である必要があるか
defaultValueanyいいえ新規アイテムのデフォルト値
validationobjectいいえ制約: min, max, minLength, maxLength, pattern, options
optionsobjectいいえウィジェット設定: collection (参照用), rows (テキストエリア用)
searchablebooleanいいえ全文検索インデックスに含めるか
translatablebooleanいいえこのフィールドが翻訳可能か (デフォルトは true)

フィールドタイプ: string, text, number, integer, boolean, datetime, select, multiSelect, portableText, image, file, reference, json, slug.

select および multiSelect タイプの場合、validation.options に許可される値を指定してください。

スコープ: schema:write | 最小ロール: 管理者

コレクションからフィールドを削除します。この操作は列を削除し、そのフィールド内のすべてのデータを消去します。元に戻せません。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
fieldSlugstringはい削除するフィールドスラッグ

スコープ: schema:write | 最小ロール: 管理者 | 破壊的: はい

アップロードされたメディアファイルを一覧表示します。オプションでMIMEタイプによるフィルタリングとページネーションが可能です。

パラメータタイプ必須説明
mimeTypestringいいえMIMEタイププレフィックスによるフィルター (例: image/, application/pdf)
limitintegerいいえ最大アイテム数 (1-100, デフォルト 50)
cursorstringいいえページネーションカーソル

スコープ: media:read | 読み取り専用: はい

IDによる単一のメディアファイルの詳細を取得します。ファイル名、MIMEタイプ、サイズ、寸法、代替テキスト、URLを含むメタデータを返します。

パラメータタイプ必須説明
idstringはいメディアアイテムID

スコープ: media:read | 読み取り専用: はい

アップロードされたメディアファイルのメタデータを更新します。ファイル自体は変更できません。

パラメータタイプ必須説明
idstringはいメディアアイテムID
altstringいいえアクセシビリティのための代替テキスト
captionstringいいえキャプションテキスト
widthintegerいいえ画像の幅 (ピクセル単位)
heightintegerいいえ画像の高さ (ピクセル単位)

スコープ: media:write

メディアファイルを完全に削除します。データベースレコードとストレージからファイルを削除します。このメディアを参照しているコンテンツは参照が壊れます。

パラメータタイプ必須説明
idstringはいメディアアイテムID

スコープ: media:write | 破壊的: はい

コンテンツコレクション全体で全文検索を実行します。コレクションは supports リストに search を含み、フィールドは searchable としてマークされている必要があります。

パラメータタイプ必須説明
querystringはい検索クエリテキスト
collectionsstring[]いいえ特定のコレクションスラッグに検索を制限
localestringいいえロケールで結果をフィルター
limitintegerいいえ最大結果数 (1-50, デフォルト 20)

スコープ: content:read | 読み取り専用: はい

すべてのタクソノミー定義 (例: カテゴリ、タグ) を一覧表示します。名前、ラベル、階層構造かどうか、関連するコレクションを返します。

パラメータなし。

スコープ: content:read | 読み取り専用: はい

ページネーション付きでタクソノミー内の用語を一覧表示します。

パラメータタイプ必須説明
taxonomystringはいタクソノミー名 (例: categories, tags)
limitintegerいいえ最大アイテム数 (1-100, デフォルト 50)
cursorstringいいえページネーションカーソル

スコープ: content:read | 読み取り専用: はい

タクソノミー内に新しい用語を作成します。階層型タクソノミーの場合、parentId を指定して子用語を作成します。

パラメータタイプ必須説明
taxonomystringはいタクソノミー名
slugstringはいURLセーフな識別子
labelstringはい表示名
parentIdstringいいえ親用語ID (階層型タクソノミー用)
descriptionstringいいえ用語の説明

スコープ: content:write

すべてのナビゲーションメニューを一覧表示します。名前、ラベル、タイムスタンプを返します。

パラメータなし。

スコープ: content:read | 読み取り専用: はい

名前でメニューを取得し、そのすべてのアイテムを順序付きで含めます。アイテムにはラベル、URL、タイプ、およびネスト用のオプションの親があります。

パラメータタイプ必須説明
namestringはいメニュー名 (例: main, footer)

スコープ: content:read | 読み取り専用: はい

コンテンツアイテムのリビジョン履歴を新しい順に一覧表示します。コレクションが revisions をサポートしている必要があります。

パラメータタイプ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツアイテムIDまたはスラッグ
limitintegerいいえ最大リビジョン数 (1-50, デフォルト 20)

スコープ: content:read | 読み取り専用: はい

コンテンツアイテムを以前のリビジョンに復元します。現在の下書きを指定されたリビジョンのデータで置き換えます。自動的には公開されません — 必要に応じて後で content_publish を使用してください。

パラメータタイプ必須説明
revisionIdstringはい復元するリビジョンID

スコープ: content:write

OAuth 2.1をサポートするMCPクライアントは、認証方法を自動的に検出できます。サーバーは2つのメタデータ文書を公開します:

保護されたリソースメタデータ

Section titled “保護されたリソースメタデータ”
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",
"admin"
],
"bearer_methods_supported": ["header"]
}
GET /_emdash/.well-known/oauth-authorization-server
{
"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"
}

認証されていないリクエストがMCPエンドポイントに到達すると、サーバーは以下を返します:

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

これにより、標準的なMCPクライアント検出フローがトリガーされます。

ツールエラーは、isError: trueのテキストコンテンツとして返されます:

{
"content": [{ "type": "text", "text": "Collection 'nonexistent' not found" }],
"isError": true
}

スコープおよび権限エラーはMCPプロトコルエラーをスローします:

{
"jsonrpc": "2.0",
"error": {
"code": -32600,
"message": "Insufficient scope: requires content:write"
},
"id": 1
}

トランスポートレベルエラー(サーバー設定ミス、未処理例外)は、実装詳細を漏洩せずにJSON-RPCエラーコード-32603(内部エラー)を返します。