リモート開発メインのソフトウェア開発企業のエンジニアブログです

WordPress に Ability を追加して MCP サーバーに機能追加する

以前以下の記事を書きましたが、それの続編です。

WordPress MCP を使う – もばらぶエンジニアブログ

この記事では MCP Adapter というプラグインを導入した上で、小さな mu-plugin を配置することで、WordPress 標準で用意されている3つの Core Abilities を MCP 経由で扱えるようにする方法を紹介しました。Abilities API や mu-plugin については、記事中で簡単に説明しています。

ただ、前回の方法だと MCP では標準の3つの Abilities しか扱えないため、ほぼ使い道がありません。今回は WordPress に Ability を追加することにより、MCP サーバーに機能を追加する方法を説明します。

WordPress MCP サーバーの仕組み

前回も少し説明しましたが、ここで WordPress MCP サーバーの仕組みについて少し説明します。

MCP Adapter と Abilities API

WordPress の MCP サーバーは MCP Adapter というプラグインにより実装されており、これは WordPress の Abilities API を薄くラップしたものになっています。

WordPress の Ability とは名前の通り解釈すれば WordPress が提供する「能力」です。もう少し詳しく説明するなら、Ability とは WordPress が他のプログラムなどに提供する能力・機能で、Abilities API という仕様によってインターフェースなどが決まっています。

WordPress MCP サーバーは、Abilities API によって提供されている WordPress の Ability を呼び出すことで実装されています。

WordPress MCP サーバー(MCP Adapter)が提供するツール

WordPress MCP サーバーが提供するツールとしては以下の3つです。

  • mcp-adapter-discover-abilities: Discover all available WordPress abilities in the system. Returns a list of all registered abilities with their basic information.
  • mcp-adapter-execute-ability: Execute a WordPress ability with the provided parameters. This is the primary execution layer that can run any registered ability.
  • mcp-adapter-get-ability-info: Get detailed information about a specific WordPress ability including its input/output schema, description, and usage examples.

一般的な MCP サーバーでは、新たな機能を追加する場合にはツールが追加されますが、WordPress の MCP サーバーの場合はツールは上の3つで固定で、その代わりに Ability を追加する事で MCP サーバーに機能を追加します。MCP クライアントは、 mcp-adapter-execute-ability ツール経由で Ability を呼び出します。

Ability の追加

やりたい事の概要

では、Ability を追加して MCP サーバーに機能を追加していきましょう。実用的な例が良いと思うので、私が実際にやった例を紹介します。

もばらぶの問い合わせフォームは、大昔に設置した WordPress のフォームで Contact Form 7 というプラグインを使っています。また、Contact Form 7 単体だとデータが DB に残らないため、Flamingo というプラグインも併用しています。

Flamingo はお問い合わせを WordPress のカスタム投稿タイプとして保存します。

今回は、Flamingo の問い合わせを複数件返す Ability を追加します。

プログラム

まずはプログラムを先に載せます。以下の内容で、wp-content/mu-plugins/ 配下に flamingo-ability.php というファイルを作成します。(ファイル名は任意のもので構いません。)

<?php
/**
 * Plugin Name: Flamingo Ability Bridge
 */

add_action( 'wp_abilities_api_init', 'myplugin_register_flamingo_abilities' );

function myplugin_register_flamingo_abilities() {

        wp_register_ability( 'myplugin/list-flamingo-messages', array(
                'label'              => 'Flamingo受信メッセージ一覧を取得',
                'description'        => 'Contact Form 7 経由でFlamingoに保存された問い合わせメッセージを検索・取得する',
                'category'           => 'site',
                'input_schema'       => array(
                        'type'       => 'object',
                        'properties' => array(
                                'search'        => array( 'type' => 'string' ),
                                'contact_form'  => array( 'type' => 'string' ), // フォーム名 or ID
                                'limit'         => array( 'type' => 'integer', 'default' => 20 ),
                        ),
                ),
                'output_schema'      => array(
                        'type'  => 'array',
                        'items' => array( 'type' => 'object' ),
                ),
                'permission_callback' => function () {
                        // Flamingo管理者相当の権限を要求
                        return current_user_can( 'manage_options' );
                },
                'execute_callback'    => function ( $input ) {
                        if ( ! class_exists( 'Flamingo_Inbound_Message' ) ) {
                                return new WP_Error( 'flamingo_missing', 'Flamingo プラグインが有効化されていません' );
                        }

                        // find() は投稿一覧を Flamingo_Inbound_Message オブジェクトの配列で返す
                        $messages = Flamingo_Inbound_Message::find( array(
                                'posts_per_page' => $input['limit'] ?? 20,
                                's'              => $input['search'] ?? '',
                                // 'post_status'    => 'any', // spam/inbox 両方含めたい場合。inboxのみなら省略
                                'orderby'        => 'date', // ID でも可
                                'order'          => 'DESC', // 新しい順
                        ) );

                        $results = array();

                        foreach ( $messages as $message ) {
                                $results[] = array(
                                        'id'      => $message->id,
                                        'subject' => $message->subject,
                                        'from'    => $message->from,       // "Name <email>" 形式
                                        'name'    => $message->from_name,
                                        'email'   => $message->from_email,
                                        'date'    => $message->date,
                                        'fields'  => $message->fields,      // フォーム入力項目の連想配列
                                        'meta'    => $message->meta,        // IP, referer など
                                );
                        }

                        return $results;
                },
                'meta' => array(
                        'mcp' => array(
                                'public' => true, // デフォルトMCPサーバーに公開する場合
                        ),
                ),
        ) );
}

これだけで、Ability が追加され、MCP クライアントから問い合わせが取得出来ます。

確認

前回と同じように、以下のコマンドで今回追加した Ability myplugin/list-flamingo-messages が表示されるか確認します。

SESSION=$(curl -s -D - -u "WordPressのユーザー名:アプリケーションパスワード" \
  -X POST https://WordPressサイト/wp-json/mcp/mcp-adapter-default-server \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}' \
  | grep -i "mcp-session-id" | awk '{print $2}' | tr -d '\r')

curl -u "WordPressのユーザー名:アプリケーションパスワード" \
  -X POST https://WordPressサイト/wp-json/mcp/mcp-adapter-default-server \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Mcp-Session-Id: $SESSION" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"mcp-adapter-discover-abilities","arguments":{}}}'

問題無い事を確認した後は、AI エージェントに「WordPress MCP サーバーを使って、 Flamingo 受信メッセージを10件取得して」などと言えば結果が返ってくるはずです。

Moba Pro

解説・補足

プログラムの注意点

Ability の追加方法は以下のドキュメントが参考になります。

mcp-adapter/docs/guides/creating-abilities.md at trunk · WordPress/mcp-adapter

注意点はそれほどありませんが、

  • category は必須パラメーターなので指定する。指定しないと特にエラーは出ないが Ability は追加されない。
  • Flamingo がインストールされていることが前提の内容なので Flamingo_Inbound_Message の存在確認をする。

くらいでしょうか。

まとめ

WordPress はプラグインを使うことでウェブサイトに多種多様な機能を持たせる事が出来ます。そうした機能を Ability として登録する事で、WordPress MCP サーバーなどの外部にその機能を提供することが出来ます(REST API との違いなどは前回の記事を参照してください)。

WordPress の豊富な機能・情報に MCP サーバー経由で AI エージェントがアクセス出来るようになると、業務で出来る事が格段に広がります。是非、活用してみてください。

宣伝

WordPress のカスタマイズ、あるいは MCP サーバーを活用した業務改善などにお困りの際には、以下のお問い合わせフォームよりお気軽にお問い合わせください。なお、こちらの問い合わせフォームが、本文中でも紹介した Contact Form 7 + Flamingo で実装されているものです。

お問い合わせ – もばらぶん

← 前の投稿

herdr remote 越しで macOS を操作してると gh auth がたまに使えなくなる原因を調べた

次の投稿 →

コメントを残す