MCP サーバーリファレンス

このページ

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

本ページでは、認証、トランスポート、ツール仕様、OAuth ディスカバリー、エラー処理などのプロトコル詳細を説明します。

認証

MCP サーバーは次の 3 つの認証方式をサポートします。

方式動作
OAuth 2.1 認可コード + PKCEMCP クライアント向けの標準フロー。ユーザーがブラウザでスコープを承認します。
パーソナルアクセストークン(PAT)管理画面で作成される長期 ec_pat_* トークン。
デバイスフローブラウザでコードを承認する CLI 風フロー。emdash login で使用。

管理 UI からのセッションクッキーでも利用できますが、外部 MCP クライアントには実用的ではありません。

スコープ

トークンはスコープにより実行可能な操作が制限されます。スコープは OAuth 認可時に要求され、すべてのツール呼び出しで強制されます。

スコープ付与される操作
content:readコンテンツの一覧・取得・比較・検索。タクソノミー・ターム・メニューの一覧。
content:writeコンテンツの作成・更新・削除・公開・非公開・予約・予約解除・複製・復元。後述のスコープが存在する前に発行されたトークンとの互換のため、暗黙的に taxonomies:managemenus:manage も付与されます。
media:readメディアアイテムの一覧・取得。
media:writeメディアメタデータの登録(作成)・更新・削除。
schema:readコレクションの一覧とコレクションスキーマの取得。
schema:writeコレクションとフィールドの作成・削除。
taxonomies:manageタクソノミータームの作成・更新・削除。
menus:manageナビゲーションメニューとその項目の作成・更新・削除。
settings:readサイト全体設定の読み取り。
settings:manageサイト全体設定の更新。
adminすべての操作へのフルアクセス。

admin スコープはすべてにアクセスできます。トークンなしのセッション認証も、ユーザーのロールに応じてフルアクセスになり得ます。

content:write は、スコープ分割前に発行された PAT が再発行なしで動き続けるよう、暗黙的に taxonomies:managemenus:manage を付与します。新規トークンは粒度の細かいスコープを要求してください。

ロール要件

スコープに加え、一部のツールは最低 RBAC ロールを要求します。両方を満たす必要があります。スコープが正しくても、呼び出しユーザーのロールが低いと失敗します。

操作最低ロール
コンテンツ読取公開アイテムは購読者(10)。下書き・予約・ゴミ箱・リビジョンは投稿者(20)
コンテンツ作成/自分の編集/自分の削除著者(30)
コンテンツ公開自分のものは著者(30)。他人のものは編集者(40)
スキーマ読取編集者(40)
スキーマ書込管理者(50)
タクソノミー管理編集者(40)
メニュー管理編集者(40)
設定読取編集者(40)
設定管理管理者(50)
メディアアップロード(media_create著者(30)

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

トランスポート

サーバーはステートレスモードで 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 固有のコードが使われます。

ツール

サーバーはコンテンツ・スキーマ・メディア・検索・タクソノミー・メニュー・リビジョン・設定の 8 領域に合計 43のツールを公開します。各ツールは JSON テキストとして結果を返すか、失敗時は isError: true 付きのメッセージを返します。

コンテンツツール

content_list

任意のフィルタとページネーションでコレクション内のコンテンツアイテムを一覧します。

パラメータ必須説明
collectionstringはいコレクションスラッグ(例 postspages
statusstringいいえフィルタ:draftpublishedscheduled
limitintegerいいえ最大件数(1〜100、既定 50)
cursorstringいいえ前回レスポンスのページネーションカーソル
orderBystringいいえソートフィールド(例 created_atupdated_at
orderstringいいえasc または desc(既定 desc
localestringいいえロケールでフィルタ(例 enfr)。i18n 利用時のみ意味があります。

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

content_get

ID またはスラッグで 1 件のコンテンツを取得します。全フィールド値、メタデータ、楽観的ロック用の _rev トークンを返します。

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

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

content_create

新しいコンテンツアイテムを作成します。data オブジェクトはコレクションスキーマに沿ったフィールド値にしてください。利用可能なフィールドは schema_get_collection で確認できます。既定では draft で作成されます。

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

スコープ: content:write

content_update

既存のコンテンツを更新します。変更するフィールドだけを含めます。未指定のフィールドはそのままです。

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

スコープ: content:write

content_delete

コンテンツをゴミ箱へ移動するソフトデリートです。元に戻すには content_restore、完全削除は content_permanent_delete を使います。

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

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

content_restore

ゴミ箱からソフトデリートされたアイテムを復元します。

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

スコープ: content:write

content_permanent_delete

ゴミ箱内のアイテムを恒久的に削除します。取り消し不可。事前にゴミ箱にある必要があります。

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

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

content_publish

コンテンツを公開しサイトに反映します。現在の下書きから公開リビジョンを作成します。以降の編集は新しい下書きとなり、再公開まで本番版に影響しません。

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

スコープ: content:write

content_unpublish

公開済みアイテムを下書きに戻します。本番サイトでは非表示になりますが内容は保持されます。

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

スコープ: content:write

content_schedule

指定日時に自動公開するよう予約します。

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

スコープ: content:write

content_unschedule

予約公開を取り消します。アイテムの状態は維持され、scheduledAt のみクリアされます。べき等です。非予約に対して呼んでも何もしません。

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

スコープ: content:write

content_compare

公開(本番)版と現在の下書きを比較します。両版と変更の有無を返します。

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

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

content_discard_draft

現在の下書きを破棄し、直近の公開版に戻します。少なくとも 1 度は公開されている必要があります。

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

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

content_list_trashed

コレクションのゴミ箱にあるソフトデリート済みアイテムを一覧します。

パラメータ必須説明
collectionstringはいコレクションスラッグ
limitintegerいいえ最大件数(1〜100、既定 50)
cursorstringいいえページネーションカーソル

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

content_duplicate

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

パラメータ必須説明
collectionstringはいコレクションスラッグ
idstringはい複製元の ID またはスラッグ

スコープ: content:write

content_translations

1 アイテムの全ロケール版を取得します。翻訳グループと各ロケール版の概要を返します。i18n 有効時のみ意味があります。

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

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

スキーマツール

schema_list_collections

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

パラメータなし。

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

schema_get_collection

コレクションの詳細と全フィールド定義を取得します。フィールドは名前・型・制約・検証ルールを表します。content_create / content_update の入力確認に使います。

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

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

schema_create_collection

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

パラメータ必須説明
slugstringはい一意識別子(/^[a-z][a-z0-9_]*$/
labelstringはい表示名(複数形、例「Blog Posts」)
labelSingularstringいいえ単数形の表示名
descriptionstringいいえコレクションの説明
iconstringいいえ管理 UI のアイコン名
supportsstring[]いいえ機能:draftsrevisionspreviewschedulingsearch(既定 ['drafts', 'revisions']

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

schema_delete_collection

コレクションとそのテーブルを削除します。取り消し不可で、コレクション内の全コンテンツが削除されます。

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

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

schema_create_field

コレクションスキーマにフィールドを追加します。テーブルに列が追加されます。

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

フィールド型:stringtextnumberintegerbooleandatetimeselectmultiSelectportableTextimagefilereferencejsonslug

select / multiSelect では許可値を validation.options に指定します。

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

schema_delete_field

コレクションからフィールドを削除します。列とその列の全データが削除されます。取り消し不可。

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

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

メディアツール

media_list

アップロード済みメディアを MIME タイプの任意プレフィックスでフィルタし、ページネーション付きで一覧します。

パラメータ必須説明
mimeTypestringいいえMIME プレフィックス(例 image/application/pdf
limitintegerいいえ最大件数(1〜100、既定 50)
cursorstringいいえページネーションカーソル

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

media_create

ストレージへ既にアップロード済みのメディアファイルを登録します。呼び出し側が storageKey にファイルを置く責任があります(通常は管理 UI や別 API の署名付き URL)。このツールがメタデータレコードを保存し、media_list / media_get で見つけ、コンテンツから参照できます。

パラメータ必須説明
filenamestringはい元のファイル名(例 logo.png
mimeTypestringはいMIME タイプ(例 image/png
storageKeystringはいアップロード先のストレージパス/キー
sizeintegerいいえバイトサイズ
widthintegerいいえ画像幅(ピクセル)
heightintegerいいえ画像高さ(ピクセル)
contentHashstringいいえ内容ハッシュ(重複排除)
blurhashstringいいえプレースホルダ用 Blurhash
dominantColorstringいいえ支配色(16 進)

スコープ: media:write | 最低ロール: 著者

media_get

ID で 1 件のメディア詳細を取得します。ファイル名、MIME、サイズ、寸法、代替テキスト、URL などのメタデータを返します。

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

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

media_update

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

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

スコープ: media:write

media_delete

メディアを恒久的に削除します。DB レコードとストレージ上のファイルを削除します。参照しているコンテンツはリンク切れになります。

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

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

検索ツール

コンテンツコレクションの全文検索。コレクションの supportssearch が必要で、フィールドは searchable である必要があります。

パラメータ必須説明
querystringはい検索クエリ文字列
collectionsstring[]いいえ特定のコレクションスラッグに限定
localestringいいえロケールで結果を絞り込み
limitintegerいいえ最大件数(1〜50、既定 20)

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

タクソノミーツール

taxonomy_list

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

パラメータなし。

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

taxonomy_list_terms

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

パラメータ必須説明
taxonomystringはいタクソノミー名(例 categoriestags
limitintegerいいえ最大件数(1〜100、既定 50)
cursorstringいいえページネーションカーソル

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

taxonomy_create_term

タクソノミーに新しいタームを作成します。階層型では parentId で子タームを指定。親の先祖チェーンは 100 レベルを超えてはいけません。

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

スコープ: taxonomies:manage | 最低ロール: 編集者

taxonomy_update_term

既存タームを更新します。省略したフィールドは変更されません。スラッグ変更が同一タクソノミー内の他タームと衝突してはいけません。parentIdnull にすると親から切り離します。新しい親は存在し、同一タクソノミーに属し、循環を作ってはいけません。

パラメータ必須説明
taxonomystringはいタクソノミー名
termSlugstringはい更新対象の現在のスラッグ
slugstringいいえ新スラッグ(タクソノミー内で一意)
labelstringいいえ新しい表示名
parentIdstring | nullいいえ新しい親 ID。切り離しは null
descriptionstringいいえ新しい説明

スコープ: taxonomies:manage | 最低ロール: 編集者

taxonomy_delete_term

タームを恒久的に削除します。タグ付けされたコンテンツは関連を失います。子があるタームは削除できません。先に子を削除してください。

パラメータ必須説明
taxonomystringはいタクソノミー名
termSlugstringはい削除するタームのスラッグ

スコープ: taxonomies:manage | 最低ロール: 編集者 | 破壊的: はい

メニューツール

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

パラメータなし。

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

名前でメニューを取得し、順序付きの全項目を返します。項目にはラベル、URL、型、ネスト用の任意の親があります。

パラメータ必須説明
namestringはいメニュー名(例 mainfooter

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

新しいナビゲーションメニューを作成します。name はサイトテンプレートが使う安定 ID、label は管理画面の表示名です。項目は後から menu_set_items で追加します。

パラメータ必須説明
namestringはい安定識別子(/^[a-z][a-z0-9_]*$/
labelstringはい管理画面の表示名

スコープ: menus:manage | 最低ロール: 編集者

メニューのラベルを更新します。name(安定 ID)は変更できません。

パラメータ必須説明
namestringはい更新するメニュー名
labelstringはい新しい表示ラベル

スコープ: menus:manage | 最低ロール: 編集者

メニューと全項目を削除します。元に戻せません。

パラメータ必須説明
namestringはい削除するメニュー名

スコープ: menus:manage | 最低ロール: 編集者 | 破壊的: はい

1 回の呼び出しでメニューの項目リスト全体を置き換えます。原子的:既存項目を削除し、指定順で新リストを挿入します。1 件ずつの追加/削除より、順序と親子関係が明確になります。

位置は配列インデックスで決まります。ネストは parentIndex で表します。parentIndex: 0 はインデックス 0 の項目の子です。親はリスト内で先に現れる必要があります。parentIndex なしはトップレベルです。

パラメータ必須説明
namestringはい更新するメニュー名
itemsMenuItem[]はい順序付き項目リスト(下記)

MenuItem のフィールド:

フィールド必須説明
labelstringはい表示テキスト
typestringはいcustompageposttaxonomycollection のいずれか
customUrlstringいいえtype: "custom" の URL(他では無視)
referenceCollectionstringいいえコンテンツ参照の対象コレクションスラッグ
referenceIdstringいいえ対象コンテンツ/ターム ID
titleAttrstringいいえHTML title 属性
targetstringいいえHTML target(例 _blank
cssClassesstringいいえ空白区切りの CSS クラス
parentIndexintegerいいえ親項目の配列インデックス。トップレベルは省略。

スコープ: menus:manage | 最低ロール: 編集者

リビジョンツール

revision_list

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

パラメータ必須説明
collectionstringはいコレクションスラッグ
idstringはいコンテンツ ID またはスラッグ
limitintegerいいえ最大件数(1〜50、既定 20)

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

revision_restore

コンテンツを過去のリビジョンに戻します。現在の下書きを指定リビジョンのデータで置き換えます。自動公開はされません。必要なら後で content_publish を使います。

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

スコープ: content:write

設定ツール

サイト全体の設定 — タイトル、タグライン、ロゴ、ファビコン、正規 URL、既定ページサイズ、日時書式、SNS ハンドル、SEO 既定値。

settings_get

サイト全体設定をすべて取得します。メディア参照(logofaviconseo.defaultOgImage)は解決済み URL と mediaId の両方を含みます。未設定の値はレスポンスに含まれません。

パラメータなし。

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

settings_update

1 つ以上のサイト設定を更新します。部分更新:指定したフィールドのみ変更、省略は据え置き。更新後の完全な設定オブジェクトを返します。

メディア参照(logofaviconseo.defaultOgImage)には mediaId(任意で alt)を含むオブジェクトを渡します。メディアは既に存在している必要があります。先に media_create を使ってください。

パラメータ必須説明
titlestringいいえサイトタイトル
taglinestringいいえタイトル横の短い説明
logoMediaRefいいえロゴ参照({ mediaId, alt? }
faviconMediaRefいいえファビコン参照
urlstringいいえ正規サイト URL(http または https)。空文字でクリア。
postsPerPageintegerいいえリストの既定ページサイズ(1〜100)
dateFormatstringいいえ日付形式トークン文字列
timezonestringいいえIANA タイムゾーン ID
socialobjectいいえSNS — twittergithubfacebookinstagramlinkedinyoutube
seoobjectいいえSEO 既定(下記)

seo オブジェクトのフィールド:

フィールド説明
titleSeparatorstringページタイトルとサイトタイトルの区切り(例:縦棒は " | "
defaultOgImageMediaRefコンテンツに OG 画像がないときの既定 Open Graph 画像
robotsTxtstringカスタム robots.txt 本文。省略時は EmDash 既定。
googleVerificationstringGoogle Search Console 検証トークン
bingVerificationstringBing Webmaster Tools 検証トークン

スコープ: settings:manage | 最低ロール: 管理者

OAuth ディスカバリー

OAuth 2.1 に対応した MCP クライアントは、認証方法を自動検出できます。サーバーは 2 種類のメタデータを公開します。

保護リソースメタデータ

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"
}

未認証のリクエストが 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(内部エラー)を返します。