EmDash には、/_emdash/api/mcp に組み込まれた Model Context Protocol(MCP)サーバーがあり、コンテンツ管理操作を AI アシスタント向けのツールとして公開します。
本ページでは、認証、トランスポート、ツール仕様、OAuth ディスカバリー、エラー処理などのプロトコル詳細を説明します。
認証
MCP サーバーは次の 3 つの認証方式をサポートします。
| 方式 | 動作 |
|---|---|
| OAuth 2.1 認可コード + PKCE | MCP クライアント向けの標準フロー。ユーザーがブラウザでスコープを承認します。 |
| パーソナルアクセストークン(PAT) | 管理画面で作成される長期 ec_pat_* トークン。 |
| デバイスフロー | ブラウザでコードを承認する CLI 風フロー。emdash login で使用。 |
管理 UI からのセッションクッキーでも利用できますが、外部 MCP クライアントには実用的ではありません。
スコープ
トークンはスコープにより実行可能な操作が制限されます。スコープは OAuth 認可時に要求され、すべてのツール呼び出しで強制されます。
| スコープ | 付与される操作 |
|---|---|
content:read | コンテンツの一覧・取得・比較・検索。タクソノミー・ターム・メニューの一覧。 |
content:write | コンテンツの作成・更新・削除・公開・非公開・予約・予約解除・複製・復元。後述のスコープが存在する前に発行されたトークンとの互換のため、暗黙的に taxonomies:manage と menus:manage も付与されます。 |
media:read | メディアアイテムの一覧・取得。 |
media:write | メディアメタデータの登録(作成)・更新・削除。 |
schema:read | コレクションの一覧とコレクションスキーマの取得。 |
schema:write | コレクションとフィールドの作成・削除。 |
taxonomies:manage | タクソノミータームの作成・更新・削除。 |
menus:manage | ナビゲーションメニューとその項目の作成・更新・削除。 |
settings:read | サイト全体設定の読み取り。 |
settings:manage | サイト全体設定の更新。 |
admin | すべての操作へのフルアクセス。 |
admin スコープはすべてにアクセスできます。トークンなしのセッション認証も、ユーザーのロールに応じてフルアクセスになり得ます。
content:write は、スコープ分割前に発行された PAT が再発行なしで動き続けるよう、暗黙的に taxonomies:manage と menus: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
任意のフィルタとページネーションでコレクション内のコンテンツアイテムを一覧します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ(例 posts、pages) |
status | string | いいえ | フィルタ:draft、published、scheduled |
limit | integer | いいえ | 最大件数(1〜100、既定 50) |
cursor | string | いいえ | 前回レスポンスのページネーションカーソル |
orderBy | string | いいえ | ソートフィールド(例 created_at、updated_at) |
order | string | いいえ | asc または desc(既定 desc) |
locale | string | いいえ | ロケールでフィルタ(例 en、fr)。i18n 利用時のみ意味があります。 |
スコープ: content:read | 読み取り専用: はい
content_get
ID またはスラッグで 1 件のコンテンツを取得します。全フィールド値、メタデータ、楽観的ロック用の _rev トークンを返します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID(ULID)またはスラッグ |
locale | string | いいえ | スラッグ解決用ロケール。ID はグローバルに一意です。 |
スコープ: content:read | 読み取り専用: はい
content_create
新しいコンテンツアイテムを作成します。data オブジェクトはコレクションスキーマに沿ったフィールド値にしてください。利用可能なフィールドは schema_get_collection で確認できます。既定では draft で作成されます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
data | object | はい | キーと値のフィールド |
slug | string | いいえ | URL スラッグ(省略時はタイトルから自動生成) |
status | string | いいえ | 初期状態:draft または published(既定 draft) |
locale | string | いいえ | このコンテンツのロケール(既定はサイト既定) |
translationOf | string | いいえ | 翻訳元アイテムの ID |
スコープ: content:write
content_update
既存のコンテンツを更新します。変更するフィールドだけを含めます。未指定のフィールドはそのままです。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
data | object | いいえ | 更新するフィールド値 |
slug | string | いいえ | 新しい URL スラッグ |
status | string | いいえ | 新しい状態:draft または published |
_rev | string | いいえ | 競合検出用。content_get のリビジョントークン |
スコープ: content:write
content_delete
コンテンツをゴミ箱へ移動するソフトデリートです。元に戻すには content_restore、完全削除は content_permanent_delete を使います。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:write | 破壊的: はい
content_restore
ゴミ箱からソフトデリートされたアイテムを復元します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:write
content_permanent_delete
ゴミ箱内のアイテムを恒久的に削除します。取り消し不可。事前にゴミ箱にある必要があります。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:write | 破壊的: はい
content_publish
コンテンツを公開しサイトに反映します。現在の下書きから公開リビジョンを作成します。以降の編集は新しい下書きとなり、再公開まで本番版に影響しません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:write
content_unpublish
公開済みアイテムを下書きに戻します。本番サイトでは非表示になりますが内容は保持されます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:write
content_schedule
指定日時に自動公開するよう予約します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
scheduledAt | string | はい | ISO 8601 日時(例 2026-06-01T09:00:00Z) |
スコープ: content:write
content_unschedule
予約公開を取り消します。アイテムの状態は維持され、scheduledAt のみクリアされます。べき等です。非予約に対して呼んでも何もしません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:write
content_compare
公開(本番)版と現在の下書きを比較します。両版と変更の有無を返します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:read | 読み取り専用: はい
content_discard_draft
現在の下書きを破棄し、直近の公開版に戻します。少なくとも 1 度は公開されている必要があります。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:write | 破壊的: はい
content_list_trashed
コレクションのゴミ箱にあるソフトデリート済みアイテムを一覧します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
limit | integer | いいえ | 最大件数(1〜100、既定 50) |
cursor | string | いいえ | ページネーションカーソル |
スコープ: content:read | 読み取り専用: はい
content_duplicate
既存アイテムのコピーを作成します。複製は下書きで、タイトルに「(Copy)」が付き、スラッグは自動生成されます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | 複製元の ID またはスラッグ |
スコープ: content:write
content_translations
1 アイテムの全ロケール版を取得します。翻訳グループと各ロケール版の概要を返します。i18n 有効時のみ意味があります。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
スコープ: content:read | 読み取り専用: はい
スキーマツール
schema_list_collections
CMS で定義されたすべてのコンテンツコレクションを一覧します。スラッグ、ラベル、サポート機能、タイムスタンプを返します。
パラメータなし。
スコープ: schema:read | 最低ロール: 編集者 | 読み取り専用: はい
schema_get_collection
コレクションの詳細と全フィールド定義を取得します。フィールドは名前・型・制約・検証ルールを表します。content_create / content_update の入力確認に使います。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
slug | string | はい | コレクションスラッグ(例 posts) |
スコープ: schema:read | 最低ロール: 編集者 | 読み取り専用: はい
schema_create_collection
新しいコンテンツコレクションを作成します。データベーステーブルとスキーマ定義が作られます。スラッグは英小文字・数字・アンダースコアで、先頭は文字である必要があります。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
slug | string | はい | 一意識別子(/^[a-z][a-z0-9_]*$/) |
label | string | はい | 表示名(複数形、例「Blog Posts」) |
labelSingular | string | いいえ | 単数形の表示名 |
description | string | いいえ | コレクションの説明 |
icon | string | いいえ | 管理 UI のアイコン名 |
supports | string[] | いいえ | 機能:drafts、revisions、preview、scheduling、search(既定 ['drafts', 'revisions']) |
スコープ: schema:write | 最低ロール: 管理者
schema_delete_collection
コレクションとそのテーブルを削除します。取り消し不可で、コレクション内の全コンテンツが削除されます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
slug | string | はい | 削除するコレクションスラッグ |
force | boolean | いいえ | コンテンツがあっても強制削除 |
スコープ: schema:write | 最低ロール: 管理者 | 破壊的: はい
schema_create_field
コレクションスキーマにフィールドを追加します。テーブルに列が追加されます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
slug | string | はい | フィールド識別子(/^[a-z][a-z0-9_]*$/) |
label | string | はい | 表示ラベル |
type | string | はい | データ型(下記参照) |
required | boolean | いいえ | 必須かどうか |
unique | boolean | いいえ | 値の一意制約 |
defaultValue | any | いいえ | 新規アイテムの既定値 |
validation | object | いいえ | 制約:min、max、minLength、maxLength、pattern、options |
options | object | いいえ | ウィジェット設定:collection(参照)、rows(textarea) |
searchable | boolean | いいえ | 全文検索インデックスに含めるか |
translatable | boolean | いいえ | 翻訳可能フィールドか(既定 true) |
フィールド型:string、text、number、integer、boolean、datetime、select、multiSelect、portableText、image、file、reference、json、slug。
select / multiSelect では許可値を validation.options に指定します。
スコープ: schema:write | 最低ロール: 管理者
schema_delete_field
コレクションからフィールドを削除します。列とその列の全データが削除されます。取り消し不可。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
fieldSlug | string | はい | 削除するフィールドスラッグ |
スコープ: schema:write | 最低ロール: 管理者 | 破壊的: はい
メディアツール
media_list
アップロード済みメディアを MIME タイプの任意プレフィックスでフィルタし、ページネーション付きで一覧します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
mimeType | string | いいえ | MIME プレフィックス(例 image/、application/pdf) |
limit | integer | いいえ | 最大件数(1〜100、既定 50) |
cursor | string | いいえ | ページネーションカーソル |
スコープ: media:read | 読み取り専用: はい
media_create
ストレージへ既にアップロード済みのメディアファイルを登録します。呼び出し側が storageKey にファイルを置く責任があります(通常は管理 UI や別 API の署名付き URL)。このツールがメタデータレコードを保存し、media_list / media_get で見つけ、コンテンツから参照できます。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
filename | string | はい | 元のファイル名(例 logo.png) |
mimeType | string | はい | MIME タイプ(例 image/png) |
storageKey | string | はい | アップロード先のストレージパス/キー |
size | integer | いいえ | バイトサイズ |
width | integer | いいえ | 画像幅(ピクセル) |
height | integer | いいえ | 画像高さ(ピクセル) |
contentHash | string | いいえ | 内容ハッシュ(重複排除) |
blurhash | string | いいえ | プレースホルダ用 Blurhash |
dominantColor | string | いいえ | 支配色(16 進) |
スコープ: media:write | 最低ロール: 著者
media_get
ID で 1 件のメディア詳細を取得します。ファイル名、MIME、サイズ、寸法、代替テキスト、URL などのメタデータを返します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | はい | メディア ID |
スコープ: media:read | 読み取り専用: はい
media_update
アップロード済みメディアのメタデータを更新します。ファイル本体は変更できません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | はい | メディア ID |
alt | string | いいえ | 代替テキスト(アクセシビリティ) |
caption | string | いいえ | キャプション |
width | integer | いいえ | 幅(ピクセル) |
height | integer | いいえ | 高さ(ピクセル) |
スコープ: media:write
media_delete
メディアを恒久的に削除します。DB レコードとストレージ上のファイルを削除します。参照しているコンテンツはリンク切れになります。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | はい | メディア ID |
スコープ: media:write | 破壊的: はい
検索ツール
search
コンテンツコレクションの全文検索。コレクションの supports に search が必要で、フィールドは searchable である必要があります。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
query | string | はい | 検索クエリ文字列 |
collections | string[] | いいえ | 特定のコレクションスラッグに限定 |
locale | string | いいえ | ロケールで結果を絞り込み |
limit | integer | いいえ | 最大件数(1〜50、既定 20) |
スコープ: content:read | 読み取り専用: はい
タクソノミーツール
taxonomy_list
すべてのタクソノミー定義(例:カテゴリ、タグ)を一覧します。名前、ラベル、階層の有無、関連コレクションを返します。
パラメータなし。
スコープ: content:read | 読み取り専用: はい
taxonomy_list_terms
タクソノミー内のタームをページネーション付きで一覧します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
taxonomy | string | はい | タクソノミー名(例 categories、tags) |
limit | integer | いいえ | 最大件数(1〜100、既定 50) |
cursor | string | いいえ | ページネーションカーソル |
スコープ: content:read | 読み取り専用: はい
taxonomy_create_term
タクソノミーに新しいタームを作成します。階層型では parentId で子タームを指定。親の先祖チェーンは 100 レベルを超えてはいけません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
taxonomy | string | はい | タクソノミー名 |
slug | string | はい | URL 安全な識別子 |
label | string | はい | 表示名 |
parentId | string | いいえ | 親ターム ID(階層型) |
description | string | いいえ | タームの説明 |
スコープ: taxonomies:manage | 最低ロール: 編集者
taxonomy_update_term
既存タームを更新します。省略したフィールドは変更されません。スラッグ変更が同一タクソノミー内の他タームと衝突してはいけません。parentId を null にすると親から切り離します。新しい親は存在し、同一タクソノミーに属し、循環を作ってはいけません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
taxonomy | string | はい | タクソノミー名 |
termSlug | string | はい | 更新対象の現在のスラッグ |
slug | string | いいえ | 新スラッグ(タクソノミー内で一意) |
label | string | いいえ | 新しい表示名 |
parentId | string | null | いいえ | 新しい親 ID。切り離しは null |
description | string | いいえ | 新しい説明 |
スコープ: taxonomies:manage | 最低ロール: 編集者
taxonomy_delete_term
タームを恒久的に削除します。タグ付けされたコンテンツは関連を失います。子があるタームは削除できません。先に子を削除してください。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
taxonomy | string | はい | タクソノミー名 |
termSlug | string | はい | 削除するタームのスラッグ |
スコープ: taxonomies:manage | 最低ロール: 編集者 | 破壊的: はい
メニューツール
menu_list
すべてのナビゲーションメニューを一覧します。名前、ラベル、タイムスタンプを返します。
パラメータなし。
スコープ: content:read | 読み取り専用: はい
menu_get
名前でメニューを取得し、順序付きの全項目を返します。項目にはラベル、URL、型、ネスト用の任意の親があります。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | メニュー名(例 main、footer) |
スコープ: content:read | 読み取り専用: はい
menu_create
新しいナビゲーションメニューを作成します。name はサイトテンプレートが使う安定 ID、label は管理画面の表示名です。項目は後から menu_set_items で追加します。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | 安定識別子(/^[a-z][a-z0-9_]*$/) |
label | string | はい | 管理画面の表示名 |
スコープ: menus:manage | 最低ロール: 編集者
menu_update
メニューのラベルを更新します。name(安定 ID)は変更できません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | 更新するメニュー名 |
label | string | はい | 新しい表示ラベル |
スコープ: menus:manage | 最低ロール: 編集者
menu_delete
メニューと全項目を削除します。元に戻せません。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | 削除するメニュー名 |
スコープ: menus:manage | 最低ロール: 編集者 | 破壊的: はい
menu_set_items
1 回の呼び出しでメニューの項目リスト全体を置き換えます。原子的:既存項目を削除し、指定順で新リストを挿入します。1 件ずつの追加/削除より、順序と親子関係が明確になります。
位置は配列インデックスで決まります。ネストは parentIndex で表します。parentIndex: 0 はインデックス 0 の項目の子です。親はリスト内で先に現れる必要があります。parentIndex なしはトップレベルです。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | 更新するメニュー名 |
items | MenuItem[] | はい | 順序付き項目リスト(下記) |
各 MenuItem のフィールド:
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
label | string | はい | 表示テキスト |
type | string | はい | custom、page、post、taxonomy、collection のいずれか |
customUrl | string | いいえ | type: "custom" の URL(他では無視) |
referenceCollection | string | いいえ | コンテンツ参照の対象コレクションスラッグ |
referenceId | string | いいえ | 対象コンテンツ/ターム ID |
titleAttr | string | いいえ | HTML title 属性 |
target | string | いいえ | HTML target(例 _blank) |
cssClasses | string | いいえ | 空白区切りの CSS クラス |
parentIndex | integer | いいえ | 親項目の配列インデックス。トップレベルは省略。 |
スコープ: menus:manage | 最低ロール: 編集者
リビジョンツール
revision_list
コンテンツアイテムのリビジョン履歴を新しい順に一覧します。コレクションは revisions をサポートしている必要があります。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
collection | string | はい | コレクションスラッグ |
id | string | はい | コンテンツ ID またはスラッグ |
limit | integer | いいえ | 最大件数(1〜50、既定 20) |
スコープ: content:read | 読み取り専用: はい
revision_restore
コンテンツを過去のリビジョンに戻します。現在の下書きを指定リビジョンのデータで置き換えます。自動公開はされません。必要なら後で content_publish を使います。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
revisionId | string | はい | 復元するリビジョン ID |
スコープ: content:write
設定ツール
サイト全体の設定 — タイトル、タグライン、ロゴ、ファビコン、正規 URL、既定ページサイズ、日時書式、SNS ハンドル、SEO 既定値。
settings_get
サイト全体設定をすべて取得します。メディア参照(logo、favicon、seo.defaultOgImage)は解決済み URL と mediaId の両方を含みます。未設定の値はレスポンスに含まれません。
パラメータなし。
スコープ: settings:read | 最低ロール: 編集者 | 読み取り専用: はい
settings_update
1 つ以上のサイト設定を更新します。部分更新:指定したフィールドのみ変更、省略は据え置き。更新後の完全な設定オブジェクトを返します。
メディア参照(logo、favicon、seo.defaultOgImage)には mediaId(任意で alt)を含むオブジェクトを渡します。メディアは既に存在している必要があります。先に media_create を使ってください。
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
title | string | いいえ | サイトタイトル |
tagline | string | いいえ | タイトル横の短い説明 |
logo | MediaRef | いいえ | ロゴ参照({ mediaId, alt? }) |
favicon | MediaRef | いいえ | ファビコン参照 |
url | string | いいえ | 正規サイト URL(http または https)。空文字でクリア。 |
postsPerPage | integer | いいえ | リストの既定ページサイズ(1〜100) |
dateFormat | string | いいえ | 日付形式トークン文字列 |
timezone | string | いいえ | IANA タイムゾーン ID |
social | object | いいえ | SNS — twitter、github、facebook、instagram、linkedin、youtube |
seo | object | いいえ | SEO 既定(下記) |
seo オブジェクトのフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
titleSeparator | string | ページタイトルとサイトタイトルの区切り(例:縦棒は " | ") |
defaultOgImage | MediaRef | コンテンツに OG 画像がないときの既定 Open Graph 画像 |
robotsTxt | string | カスタム robots.txt 本文。省略時は EmDash 既定。 |
googleVerification | string | Google Search Console 検証トークン |
bingVerification | string | Bing 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(内部エラー)を返します。