WordPressの公式プラグイン「MCP Adapter」を使うと、ClaudeなどのAIからWordPressの機能を呼び出せるようになります。ただし、WordPress本体に最初から用意されている機能は、サイト情報の取得など一部だけです。

では、自分のプラグインの機能をAIから使えるようにするにはどうすればいいのか。その答えが、WordPress 6.9で本体に加わった「Abilities API」です。

本記事では、Abilities APIの仕組みと、最新記事の一覧を返す簡単なプラグインを作ってAIから呼び出すまでの手順を、TCDの検証サイトで試した結果とあわせて解説します。


WordPressで記事販売ができる「YOMERU」
記事を、そのまま収益に。
WordPressサイトで記事の有料販売ができる
無料のプラグイン「YOMERU」。

Abilities APIとは

Abilities API(アビリティAPI)は、WordPressで「できること」を、決まった形式で登録して呼び出せるようにする仕組みです。WordPress 6.9で本体に加わりました。

登録した「できること」は「アビリティ」と呼ばれます。アビリティは一度登録すれば、REST API、MCP Adapterを通したAI、PHPやJavaScriptのプログラムなど、どこからでも同じ方法で呼び出せます。

Abilities APIのしくみ

AIから使うときに役立つ理由

AIがWordPressの機能を使うには、「どんな機能があるか」「どんな値を渡せばいいか」「何が返ってくるか」が分からなければなりません。

アビリティには、名前や説明に加えて、受け取る値と返す値の形式(JSON Schema)、実行できるユーザーの権限チェックがセットで登録されます。AIはこれを読んで、何ができるかを自分で理解し、正しい値で呼び出せるようになります。

最初から用意されているアビリティ

WordPress本体には、次の3つのアビリティが最初から登録されています。どれも情報を読み取るだけのものです。

  • core/get-site-info(サイト情報を取得する)
  • core/get-user-info(ユーザー情報を取得する)
  • core/get-environment-info(環境情報を取得する)

これ以外の機能をAIから使えるようにするには、プラグインやテーマでアビリティを登録します。MCP Adapterの仕組みや使い方は、こちらの記事で解説しています。

アビリティを登録する前に知っておくこと

  • 必要なバージョン: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」が表示されれば準備完了です。

有効化した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テーマ集
WordPressテーマ「ISSUE」
WordPressテーマ「ISSUE」
人材不足を解決する求人採用サイトを。
WordPressテーマ「SEEED」
WordPressテーマ「SEEED」
Webサービスを販売するLP型テーマ。
WordPressテーマ「GENESIS」
WordPressテーマ「GENESIS」
スタイリッシュな企業サイトの決定版。
WordPressテーマ「SOLARIS」
WordPressテーマ「SOLARIS」
一流の企業のための一流の企業サイトを。