WordPressの公式プラグイン「MCP Adapter」を使うと、ClaudeなどのAIからWordPressの機能を呼び出せるようになります。ただし、WordPress本体に最初から用意されている機能は、サイト情報の取得など一部だけです。
では、自分のプラグインの機能をAIから使えるようにするにはどうすればいいのか。その答えが、WordPress 6.9で本体に加わった「Abilities API」です。
本記事では、Abilities APIの仕組みと、最新記事の一覧を返す簡単なプラグインを作ってAIから呼び出すまでの手順を、TCDの検証サイトで試した結果とあわせて解説します。
Abilities APIとは
Abilities API(アビリティAPI)は、WordPressで「できること」を、決まった形式で登録して呼び出せるようにする仕組みです。WordPress 6.9で本体に加わりました。
登録した「できること」は「アビリティ」と呼ばれます。アビリティは一度登録すれば、REST API、MCP Adapterを通したAI、PHPやJavaScriptのプログラムなど、どこからでも同じ方法で呼び出せます。

AIから使うときに役立つ理由
AIがWordPressの機能を使うには、「どんな機能があるか」「どんな値を渡せばいいか」「何が返ってくるか」が分からなければなりません。
アビリティには、名前や説明に加えて、受け取る値と返す値の形式(JSON Schema)、実行できるユーザーの権限チェックがセットで登録されます。AIはこれを読んで、何ができるかを自分で理解し、正しい値で呼び出せるようになります。
最初から用意されているアビリティ
WordPress本体には、次の3つのアビリティが最初から登録されています。どれも情報を読み取るだけのものです。
- core/get-site-info(サイト情報を取得する)
- core/get-user-info(ユーザー情報を取得する)
- core/get-environment-info(環境情報を取得する)
これ以外の機能をAIから使えるようにするには、プラグインやテーマでアビリティを登録します。MCP Adapterの仕組みや使い方は、こちらの記事で解説しています。
ClaudeやChatGPTなどのAIに、WordPressのサイトを直接操作してもらう。そんな使い方が、WordPress公式の仕組みで実現しつつあります。 その中心となるのが、WordPress公式のプラグイン「MCP Adapter」です。2026年10月2日にバージョン0.7.0が公開...
アビリティを登録する前に知っておくこと
- 必要なバージョン:WordPress 6.9以上
- 登録は2段階:まず「カテゴリー」を登録し(wp_abilities_api_categories_init フック)、次に「アビリティ」を登録する(wp_abilities_api_init フック)。このフックの外で登録すると失敗する
- 名前のルール:「プラグイン名/動作」の形にする(例:my-first-abilities/get-recent-posts)。使えるのは半角の英小文字・数字・ハイフンだけ
サンプルプラグインを作ってみる
ここでは、公開済みの最新記事のタイトル・URL・公開日を返すアビリティを登録する、簡単なプラグインを作ります。
1. プラグインファイルを作る
「my-first-abilities」というフォルダを作り、その中に「my-first-abilities.php」というファイルを作って、次のコードを貼り付けます。
<?php
/**
* Plugin Name: My First Abilities
* Description: Abilities API のサンプル。最新記事の一覧を返すアビリティを登録します。
* Version: 1.0.1
* Requires at least: 6.9
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// 1. アビリティのカテゴリーを登録する
add_action( 'wp_abilities_api_categories_init', 'my_first_abilities_register_category' );
function my_first_abilities_register_category() {
wp_register_ability_category(
'my-content',
array(
'label' => '記事',
'description' => '記事の情報を扱うアビリティです。',
)
);
}
// 2. アビリティを登録する
add_action( 'wp_abilities_api_init', 'my_first_abilities_register_abilities' );
function my_first_abilities_register_abilities() {
wp_register_ability(
'my-first-abilities/get-recent-posts',
array(
'label' => '最新記事を取得する',
'description' => '公開済みの最新記事のタイトル・URL・公開日を、新しい順に返します。',
'category' => 'my-content',
'input_schema' => array(
'type' => 'object',
'properties' => array(
'count' => array(
'type' => 'integer',
'description' => '取得する件数(1〜10)',
'minimum' => 1,
'maximum' => 10,
'default' => 3,
),
),
'additionalProperties' => false,
'default' => array( 'count' => 3 ),
),
'output_schema' => array(
'type' => 'array',
'items' => array(
'type' => 'object',
'properties' => array(
'title' => array( 'type' => 'string' ),
'url' => array( 'type' => 'string' ),
'date' => array( 'type' => 'string' ),
),
),
),
'execute_callback' => 'my_first_abilities_get_recent_posts',
'permission_callback' => function () {
return current_user_can( 'read' );
},
'meta' => array(
'annotations' => array(
'readonly' => true,
'destructive' => false,
'idempotent' => true,
),
'public' => true,
),
)
);
}
// 3. アビリティが実行されたときの処理
function my_first_abilities_get_recent_posts( $input = null ) {
$count = isset( $input['count'] ) ? (int) $input['count'] : 3;
$posts = get_posts(
array(
'numberposts' => $count,
'post_status' => 'publish',
'has_password' => false,
)
);
$result = array();
foreach ( $posts as $post ) {
$result[] = array(
'title' => get_the_title( $post ),
'url' => get_permalink( $post ),
'date' => get_the_date( 'Y-m-d', $post ),
);
}
return $result;
}
2. コードの中身
コードは大きく3つの部分に分かれています。
① カテゴリーの登録
wp_register_ability_category() で、アビリティをまとめる「カテゴリー」を登録します。ここでは「my-content(記事)」というカテゴリーを作っています。
② アビリティの登録
wp_register_ability() で、アビリティの中身を登録します。主な項目は次の通りです。
- label・description:アビリティの名前と説明。AIはこの説明を読んで、何をするアビリティかを判断する
- category:①で登録したカテゴリー
- input_schema:受け取る値の形式。ここでは「count(取得する件数)」を1〜10の整数とし、省略したときは3件にしている
- output_schema:返す値の形式。タイトル・URL・公開日の一覧
- permission_callback:実行できるユーザーの条件。ここでは「ログインしていて、閲覧権限(read)があるユーザー」
- meta.annotations:アビリティの性質。readonly(読み取りだけ)、destructive(データを消すなど元に戻せない操作か)、idempotent(何度実行しても結果が同じか)を指定する
- meta.public:MCP AdapterなどのAI向けの窓口に公開するかどうか(WordPress 7.1で追加)
③ 実行したときの処理
アビリティが呼び出されたときに動く関数です。get_posts() で記事を取得し、タイトル・URL・公開日を配列にして返しています。パスワード保護された記事は、返さないように除外しています。
3. プラグインを有効化する
「my-first-abilities」フォルダをzipファイルにして、管理画面の「プラグインを追加」→「プラグインのアップロード」からアップロードし、有効化します。プラグイン一覧に「My First Abilities」が表示されれば準備完了です。

アビリティを呼び出してみる
REST APIから呼び出す
登録したアビリティは、REST APIから確認・実行できます。上から順に「アビリティの一覧」「アビリティの詳細」「アビリティの実行(2件取得)」のURLです。
https://example.com/wp-json/wp-abilities/v1/abilities
https://example.com/wp-json/wp-abilities/v1/abilities/my-first-abilities/get-recent-posts
https://example.com/wp-json/wp-abilities/v1/abilities/my-first-abilities/get-recent-posts/run?input[count]=2
REST APIを使うには、WordPressにログインしている必要があります。外部のツールから呼び出す場合は、アプリケーションパスワードで認証します。
検証サイトでアビリティを実行すると、次のような結果が返ってきました(URLは伏せています)。
[
{
"title": "見出し・囲み枠・アンダーライン・ボタンなどのデザインを登録する方法",
"url": "https://example.com/quick-tag/",
"date": "2024-10-10"
},
{
"title": "スマホフッターバーの設定方法",
"url": "https://example.com/mobile-footer-bar/",
"date": "2024-09-30"
}
]
今回のアビリティは読み取りだけ(readonly)なので、GETで呼び出します。試しにPOSTで呼び出すと「405(許可されていないメソッド)」になりました。readonlyの指定によって、呼び出し方が変わる点に注意しましょう。
また、件数に範囲外の値(11)を渡すと、input_schemaの指定どおりにエラーが返りました。入力チェックを自分で書かなくても、形式どおりかどうかをWordPressが確認してくれます。
{
"code": "ability_invalid_input",
"message": "アビリティ「my-first-abilities/get-recent-posts」の入力は無効です。理由: input[count] は1以上、10以下でなければなりません。"
}
ログインしていない状態で呼び出すと、「このアビリティを実行する権限がありません」(401エラー)として拒否されました。
AIから呼び出す(MCP Adapter)
MCP Adapterを有効化すると、meta.public を true にしたアビリティは、AIから見えるようになります。
検証サイトで、AIと同じ方法でMCP Adapterに問い合わせたところ、使えるアビリティの一覧に「my-first-abilities/get-recent-posts(最新記事を取得する)」が加わっていました。続けて、AIと同じように件数を指定して実行すると、記事の一覧が返ってきました。
{
"success": true,
"data": [
{
"title": "見出し・囲み枠・アンダーライン・ボタンなどのデザインを登録する方法",
"url": "https://example.com/quick-tag/",
"date": "2024-10-10"
}
]
}
AIに「このサイトの最新記事を教えて」と頼めば、このアビリティを見つけて呼び出し、結果をもとに答えてくれる、というわけです。
PHPから呼び出す
テーマや別のプラグインからは、wp_get_ability() でアビリティを取得して、execute() で実行できます。
$ability = wp_get_ability( 'my-first-abilities/get-recent-posts' );
if ( $ability ) {
$posts = $ability->execute( array( 'count' => 2 ) );
}
アビリティを作るときの注意点
- 権限は必要最小限にする:permission_callback で、実行できるユーザーを必ず絞る。誰でも実行できる設定(__return_true)は、情報を変更・削除するアビリティでは使わない
- 公開の設定は安全装置ではない:meta.public などの公開の設定は「見せるかどうか」を決めるだけ。実際に実行できるかどうかは permission_callback で決まる
- 返す情報に気を付ける:AIに渡してよい情報だけを返す。今回のサンプルでも、パスワード保護された記事は除外している
- 性質(annotations)を正しく指定する:データを書き換えるアビリティなら readonly を false に、元に戻せない操作なら destructive を true にする。AIが慎重に扱う目安になる
まとめ
Abilities APIを使えば、自分のプラグインの機能を「アビリティ」として登録し、REST API・AI・プログラムのどこからでも同じ方法で呼び出せるようになります。
- カテゴリー → アビリティの順に、決まったフックで登録する
- 受け取る値・返す値の形式と、実行できるユーザーをセットで登録する
- meta.public を true にすると、MCP Adapterを通してAIから使える
- 権限と返す情報には十分注意する
今回は読み取りだけの簡単な例でしたが、同じ仕組みで、記事の下書きを作る、問い合わせを集計するなど、さまざまな機能をAIに任せられます。まずは検証用のサイトで、小さなアビリティから試してみてください。
WordPressテーマ集











コメント