mcpField
W
WordPress MCP

WordPress MCP

リモート
github.comビジネス・マーケティング25 日前に更新
リポジトリ公式サイト

WordPress MCP について

WordPress MCP は、サイトのコンテンツや管理機能を MCP クライアントに公開する WordPress プラグインです。コンテンツ、SEO、WooCommerce、ページビルダー、パフォーマンスを扱い、変更は記録され、取り消せます。

主な機能

  1. 01165 個の型付きサイト管理ツール
  2. 02コンテンツ、SEO、メディア操作
  3. 03WooCommerce ストア管理
  4. 04ページビルダーに対応した編集
  5. 05取り消し可能な変更記録
  6. 06認証付き Streamable HTTP エンドポイント

活用シーン

  1. 01サイトの SEO 監査と更新
  2. 02ページビルダーのページ編集
  3. 03商品、価格、在庫の管理
  4. 04サイト変更の確認と取り消し

MCP 対応

認証付き Streamable HTTP MCP エンドポイントを通じて、WordPress のツール、プロンプト、リソースを公開します。接続ごとに機能グループを絞り込め、任意で OAuth ログインも利用できます。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://{site}/wp-json/wp-mcp/v1/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

すべてのエンドポイント
Streamable HTTPhttps://{site}/wp-json/wp-mcp/v1/mcp認証が必要

ツール

詳細

WordPress MCP:MCP 対応 AI 向けの単一エンドポイント

WordPress MCP

あらゆる WordPress サイトをリモート MCP サーバーに変え、どの AI アシスタントからも直接読み取り、確認し、操作できるようにします。元に戻すボタン付きです。 エンジンに依存しない SEO(Yoast / Rank Math) · AEO/GEO(JSON-LD、llms.txt、robots、リダイレクト、IndexNow) · WooCommerce ストアの全操作 · ページビルダーに対応した編集 · サイト速度の監査と最適化 · Search Console / GA4 / PageSpeed のライブデータを、すべて単一の認証済みエンドポイント経由で利用できます。


あらゆる MCP クライアントに対応 バージョン ライセンス

WordPress PHP MCP ツール 元に戻す エージェンシー向け安全設計


MCP に対応するすべての AI クライアントで利用できます

Claude
Claude
ChatGPT
ChatGPT
Codex
Codex
Gemini CLI
Gemini CLI
Cursor
Cursor
VS Code
VS Code
Windsurf
Windsurf
Zed
Zed
Cline
Cline
任意の MCP クライアント
任意の MCP クライアント

🔌 ひとつのエンドポイントで、あらゆる AI クライアントに接続

WordPress MCP は、標準の Streamable HTTP を使用してオープンな Model Context Protocol に対応します。特定の AI ベンダーに縛られません。クライアントのサイトにインストールすれば、あなたやチームが使うアシスタント(Claude、ChatGPT、Codex、Gemini、Cursor、Copilot など)や、そのすべてを一度に接続できます。設定画面では、それぞれのクライアントですぐに貼り付けて使える設定を生成します。これにより、エージェントは実際のサイトを 確認 し、自ら変更を 実装 できます。コピー&ペーストも、2つ目の OAuth も、クライアントがどの SEO プラグインを使っているか推測する必要もありません。


目次


できること

1 つのプラグイン、1 つのエンドポイント、型付きツール 165 個に、すぐに使えるプロンプトと閲覧可能なリソースを備えています。どの MCP クライアントもサイトごとに 1 回接続すれば、作業を説明するだけでなく、実際にすべて実行できます。

📊 実際のサイトを把握する公開済みのコンテンツ、稼働中の SEO エンジン、存在するスキーマ、Search Console の実際のレポート、遅い箇所、在庫切れの商品を確認できます。
👁️ 画像を見るget_image_bytes はファイル名ではなく画像を返すため、写真の内容に基づいて alt テキストや商品説明を作成できます。
✍️ 稼働中のサイトに書き込むクライアントが使用している SEO プラグイン経由のメタデータ、JSON-LD、投稿、商品、価格、在庫、メニュー、ウィジェット、テーマファイルを書き込めます。
🧩 ビルダーページを安全に編集するElementor、Gutenberg、Divi、WPBakery のページは、post_content を平坦化せず、それぞれ固有のデータ構造で編集します。
🛒 ストアを運用するカタログ、バリエーション、画像、一括価格改定、セールのスケジュール設定、在庫、クーポンを管理できます。注文と顧客データには、それぞれ専用の切り替え設定があります。
🚀 サイトを高速化する監査を実施し、元に戻せるフロントエンドの修正を適用して、実際の Core Web Vitals で変更の効果を検証できます。
↩️ すべて元に戻す書き込みは記録されます。変更ごとに operation_id が返され、1 回の呼び出しで元に戻せます。

クイックスタート

  1. ReleasesからZIPをダウンロードし、プラグイン → 新規プラグインを追加 → プラグインをアップロードからアップロードするか、フォルダーをwp-content/plugins/wordpress-mcp/にコピーします。
  2. WordPress MCPを有効化します。
  3. 管理メニューでWordPress MCPを開きます。AI クライアントを接続からクライアントを選び、設定スニペットをコピーします。サイトの実際のエンドポイントとキーは、すでに入力されています。ClaudeとChatGPTではURLだけで十分です。サインインを求められたら、WordPressでサインインします。
  4. 接続をテストをクリックし、AI クライアントが接続できることを確認します。ヘッダーの削除、ファイアウォール、キャッシュなどの問題も検出できます。
  5. 必要な機能グループを切り替えます。デフォルト設定は安全です。ほかの人にアクセス権を付与するには、自分のキーを共有する代わりに、プリセットを使って接続キーを作成します。

実際に使ってみましょう。

「このサイトのSEOを監査して、最も問題のあるページを10件表示し、欠落しているメタディスクリプションを修正してください。」

**WordPress 5.6+およびPHP 7.4+**が必要です。WooCommerceとGoogle Site Kitは任意です。これらのプラグインが有効な場合にのみ、それぞれのツールが表示されます。


AI クライアントを接続する

クライアント接続方法プロンプトリソース備考
README の画像 Claude Codeclaude mcp add + Bearerヘッダー✅ /mcp__…✅ @開発作業に最適。ファイルとビルダーに対応
README の画像 Claude Webとデスクトップカスタムコネクター:WordPressでサインイン、または?key=付きURL✅✅OAuthサインインに対応
README の画像 ChatGPT開発者モード:OAuthサインイン、または?key=付きURLいいえいいえ書き込みツールでは確認を求められます。search/fetchは組み込み
README の画像 OpenAI Codexcodex mcp add/config.tomlいいえいいえCLIとIDE拡張機能で設定を共有
README の画像 Gemini CLIgemini mcp add/httpUrl✅ スラッシュコマンドいいえurlではなくhttpUrlを使用
README の画像 Cursormcp.json✅✅
README の画像 VS Code/Copilot.vscode/mcp.json✅✅キーはVS Codeのシークレットストレージに保存
README の画像 Windsurfmcp_config.jsonいいえいいえ100ツールの上限あり。?groups=を使用
README の画像 Zed · README の画像 Cline · Continue · LM Studio設定ファイルクライアントによるクライアントによる
README の画像 その他Streamable HTTP、またはstdio向けのmcp-remoteクライアントによるクライアントによる仕様に準拠する任意のクライアント

プロンプトとリソースのサポート状況はクライアントによって異なり、頻繁に変わります。上記のすべてのクライアントでツールを使用できます。

すべてのクライアントは同じエンドポイントに接続します。

https://client.example.com/wp-json/wp-mcp/v1/mcp

クライアントには、次のいずれかの方法でキーを渡せます。

方法使用する場面
Authorization: Bearer <key>ヘッダーヘッダーフィールドに対応するすべてのクライアント。URLやログにキーが残らないため、この方法を推奨します。
X-API-Key: <key>ヘッダーUIに「APIキーのヘッダー」欄があるクライアント。
URLに?key=<key>を追加URLのみを受け付けるクライアント:Claude Web/デスクトップコネクター、ChatGPT開発者モード、Continue。
WordPressでサインイン(OAuth)MCPサインインに対応するクライアント(Claude、ChatGPTなど)。キーを付けずに通常のURLを貼り付けます。以下を参照してください。

以下のスニペットではmy-siteとYOUR_KEYを使用しています。設定画面では、実際の値を使ってスニペットが生成されます。

README の画像  Claude Code
claude mcp add --transport http my-site https://client.example.com/wp-json/wp-mcp/v1/mcp \
  --header "Authorization: Bearer YOUR_KEY"
README の画像  Claude(claude.ai WebおよびClaude Desktop) **設定 → コネクター → カスタムコネクターを追加**に移動し、エンドポイントの URL をそのまま貼り付けて、**接続**をクリックします。Claude がサイトに移動するので、[サインインして承認](#sign-in-with-wordpress-oauth)してください。
https://client.example.com/wp-json/wp-mcp/v1/mcp

サインインを省略するには、キーを含む URL を貼り付けます:…/wp-json/wp-mcp/v1/mcp?key=YOUR_KEY。

README の画像  ChatGPT(開発者モード)
  1. 設定 → アプリとコネクター → 詳細設定に移動し、開発者モードをオンにします。
  2. 作成をクリックし、エンドポイントの URL をそのまま貼り付けて、OAuthを選択します。ChatGPT がサイトに移動するので、サインインして承認してください。
https://client.example.com/wp-json/wp-mcp/v1/mcp

または、認証なしを選択し、キーを含む URL を貼り付けます:…/wp-json/wp-mcp/v1/mcp?key=YOUR_KEY。

書き込みを行うツールを使う前に、ChatGPT は確認を求めます。読み取り専用ツールにはreadOnlyHintが付いているため、ChatGPT は確認なしで実行します。searchツールとfetchツールは、ChatGPT のディープリサーチが想定する形式に従っています。

README の画像  OpenAI Codex(CLI と IDE 拡張機能)
codex mcp add my-site --url https://client.example.com/wp-json/wp-mcp/v1/mcp \
  --bearer-token-env-var WPMCP_MY_SITE_KEY
export WPMCP_MY_SITE_KEY="YOUR_KEY"        # PowerShell: $env:WPMCP_MY_SITE_KEY="YOUR_KEY"

~/.codex/config.tomlに直接記述することもできます。このファイルは CLI と IDE 拡張機能で共有されます。

[mcp_servers.my-site]
url = "https://client.example.com/wp-json/wp-mcp/v1/mcp"
http_headers = { "Authorization" = "Bearer YOUR_KEY" }
tool_timeout_sec = 120
README の画像  Gemini CLI
gemini mcp add --transport http --header "Authorization: Bearer YOUR_KEY" \
  my-site https://client.example.com/wp-json/wp-mcp/v1/mcp

または、~/.gemini/settings.jsonに記述します。urlは以前の SSE トランスポートを選択するため、httpUrlを使用してください。

{ "mcpServers": { "my-site": {
    "httpUrl": "https://client.example.com/wp-json/wp-mcp/v1/mcp",
    "headers": { "Authorization": "Bearer YOUR_KEY" },
    "timeout": 120000
} } }

このサイトのプロンプトは、たとえば/seo_auditのようなスラッシュコマンドとして Gemini CLI に表示されます。

README の画像  Cursor

すべてのプロジェクトに適用する場合は~/.cursor/mcp.jsonに、1つのプロジェクトだけに適用する場合は.cursor/mcp.jsonに追加します。

{ "mcpServers": { "my-site": {
    "url": "https://client.example.com/wp-json/wp-mcp/v1/mcp",
    "headers": { "Authorization": "Bearer YOUR_KEY" }
} } }
README の画像  VS Code(GitHub Copilot エージェントモード)

.vscode/mcp.jsonに追加します。VS Code はキーを一度だけ要求し、安全に保存します。

{
  "inputs": [{ "type": "promptString", "id": "wpmcp-key", "description": "WordPress MCP key", "password": true }],
  "servers": { "my-site": {
    "type": "http",
    "url": "https://client.example.com/wp-json/wp-mcp/v1/mcp",
    "headers": { "Authorization": "Bearer ${input:wpmcp-key}" }
  } }
}
README の画像  Windsurf

Windsurf が読み込むツールは、すべてのサーバーを合わせて最大100個です。そのため、?groups=でカタログを絞り込みます(下記参照)。

{ "mcpServers": { "my-site": {
    "serverUrl": "https://client.example.com/wp-json/wp-mcp/v1/mcp?groups=content,woocommerce",
    "headers": { "Authorization": "Bearer YOUR_KEY" }
} } }
README の画像  Zed · Cline / Roo Code · Continue · LM Studio
// Zed: settings.json
{ "context_servers": { "my-site": { "url": "https://…/wp-json/wp-mcp/v1/mcp", "headers": { "Authorization": "Bearer YOUR_KEY" } } } }

// Cline / Roo Code: cline_mcp_settings.json
{ "mcpServers": { "my-site": { "type": "streamableHttp", "url": "https://…/wp-json/wp-mcp/v1/mcp", "headers": { "Authorization": "Bearer YOUR_KEY" } } } }

// LM Studio: mcp.json
{ "mcpServers": { "my-site": { "url": "https://…/wp-json/wp-mcp/v1/mcp", "headers": { "Authorization": "Bearer YOUR_KEY" } } } }
# Continue: .continue/mcpServers/my-site.yaml (agent mode)
mcpServers:
  - name: my-site
    type: streamable-http
    url: https://…/wp-json/wp-mcp/v1/mcp?key=${{ secrets.WPMCP_KEY }}
README の画像  その他(stdio 専用クライアントを含む)

リモートの Streamable HTTP MCP サーバーに対応するクライアントであれば、どれでも動作します。エンドポイントを指定し、Bearer ヘッダーを送信してください。ローカル(stdio)サーバーしか起動できないクライアントの場合は、mcp-remoteでブリッジします。

{ "mcpServers": { "my-site": {
    "command": "npx",
    "args": ["-y", "mcp-remote", "https://…/wp-json/wp-mcp/v1/mcp",
             "--header", "Authorization:${WPMCP_AUTH}", "--transport", "http-only"],
    "env": { "WPMCP_AUTH": "Bearer YOUR_KEY" }
} } }
接続ごとに使用するツールを減らす:?groups=

モデルは短いリストからのほうが、より確実にツールを選択できます。また、読み込めるツール数に上限があるクライアントもあります。接続で公開する機能グループを限定するには、エンドポイント URL に?groups=を追加するか、X-WPMCP-Groupsヘッダーを送信します。

https://client.example.com/wp-json/wp-mcp/v1/mcp?groups=content,woocommerce

グループキーはcontent、woocommerce、wc_orders、performance、builders、appearance、sitekit、diagnostics、site_mgmt、filesystem、databaseです。エージェントが状況を把握できるよう、診断機能は常に対象に含まれます。

?groups=でできるのは、公開する機能を絞り込むことだけです。設定で無効になっているグループを有効にすることはできません。実用的な設定例として、同じサイトへの接続を2つ用意し、コンテンツ作成者には?groups=contentを、開発者にはすべてのグループを設定できます。

HTTPS。 キーを URL に含める場合は、転送中にキーが暗号化されるよう、サイトを HTTPS で配信してください。URL を共有してしまった場合は、キーを再生成してください。ヘッダー認証を使えば、キーを URL に含めずに済みます。


プロンプト、リソース、検索、取得

MCP にはツール以外の機能もあり、クライアントはそれぞれを異なる方法で使用します。このサーバーは、役立つ機能を実装しています。

プロンプト:すぐに使えるワークフローです。 クライアントではコマンドとして表示されます。たとえば、Claude Code では /mcp__my-site__seo_audit、Gemini CLI では /seo_audit、VS Code と Cursor では / メニューから利用できます。マーケターはツール一覧を知らなくても、作業工程を丸ごと実行できます。各プロンプトは、必要なツールがサイトで有効になっている場合にのみ利用できます。

プロンプト機能
site_briefing技術スタック、サイトの健全性、SEO エンジン、機能を確認し、主な機会を上位 5 件提示します。何も変更しません。
seo_audit1 ページ、投稿タイプ、またはサイト全体を監査し、具体的なタイトルと説明を提案します。承認後にのみ適用します
write_seo_article既存の掲載内容を調査し、構成を作成して記事を執筆し、SEO フィールド、内部リンク、スキーマを含む下書きを保存します
ai_search_readinessllms.txt、AI クローラーのルール、スキーマの網羅状況、サイトマップの健全性を対象とする GEO/AEO スコアカードです
speed_checkup監査、画像レポート、PageSpeed を実行し、最適化計画をプレビューします
fix_broken_linksサイト全体のリンク切れを検査し、置き換え先または 301 リダイレクトを提案します
product_seo_sweepWooCommerce:監査と画像の確認を行い、商品 SEO とスキーマの修正案をプレビューします
search_performance_reportSite Kit:上位ページと検索クエリ、変化した項目、すぐに成果を期待できるキーワードを提示します

リソース:添付できるコンテンツです。 Claude Desktop、VS Code、Cursor、Zed などのクライアントでは、サイトコンテンツに直接 @ メンションしたり、添付したりできます。wordpress://site/overview では技術スタックと機能を確認できます。wordpress://content/{id} では、任意の投稿、ページ、商品を整形されたテキストで取得できます。閲覧できるように、最近更新された項目も一覧表示されます。

search と fetch:汎用的な情報取得機能です。 search は {results: [{id, title, url, text}]} を返し、fetch はサイト上の ID または URL に対して {id, title, text, url, metadata} を返します。これは ChatGPT のディープリサーチや企業ナレッジのコネクターが求める形式です。また、エージェントが負荷の大きい list_content / get_content を使う前に、手軽に情報を見つけて読み取る方法にもなります。


WordPress でサインイン(OAuth)

Claude や ChatGPT など、MCP サインインに対応したクライアントでは、キーは必要ありません。エンドポイントの URL をそのまま追加すれば、「Google でログイン」のように接続できます。

  1. クライアントが、このサイトのサインイン情報を自動的に検出します(MCP 認証、RFC 9728、RFC 8414)。
  2. サイト上に同意ページが開きます。通常どおり WordPress にログインします。承認できるのは管理者のみです。
  3. 接続に許可する操作を選択します。プリセット、読み取り専用、または「変更のたびに承認を求める」から選択し、Approve をクリックします。
  4. クライアントは 1 時間有効なアクセストークンと、使用するたびにローテーションするリフレッシュトークンを受け取ります。

承認されたサインインはそれぞれ、クライアント名とともに Connection keys に表示されます。たとえば「ChatGPT(priya がサインイン)」のように表示されます。監査ログには各呼び出しのクライアント名が記録され、Revoke をクリックすると直ちにアクセスが遮断されます。

セキュリティPKCE(S256)が必須です。コードは 1 回のみ使用でき、10 分後に期限切れになります。リダイレクト先アドレスは、https、ループバックアドレス、またはアプリスキームを使用し、クライアントの登録内容と完全に一致する必要があります。同意ページはフレーム内に表示できません。リフレッシュトークンはローテーションされるため、盗まれたトークンは正規のクライアントがリフレッシュした後に使用できなくなります。
クライアント登録動的クライアント登録(RFC 7591)とクライアント ID メタデータドキュメントの両方に対応しています。
要件エンドポイントにクエリー文字列が含まれないよう、パーマリンクを有効にしてください。WordPress がサブフォルダーにインストールされている場合も動作します。
無効にする方法Capabilities → Sign in with WordPress。どちらの場合も、キーは引き続き機能します。

チーム、クライアント、承認

このプラグインは、個人が自分のサイトを運営する場合と、代理店が複数のクライアントサイトを運営する場合の、2つの状況を想定して作られています。どちらの場合も、要点は同じです。誰が何をでき、誰が確認するのか?

接続キー

所有者キー(設定画面に表示されます)は、すべての機能にアクセスできます。それ以外の人や用途には、接続キー → 新しいキーから接続キーを作成します。

設定内容
ラベル使用する人や用途を示します(例:「Priya、ChatGPT」や「Acme Ltd のスタッフ」)。監査ログの各呼び出しにはキー名が記録されます。
プリセット機能グループをまとめた既定のセット(下表)、または自分で選んだグループを指定します。
読み取り専用読み取りツールのみを使用できます。サイト上のデータは変更されません。
承認が必要変更のたびに管理者の承認を待ちます(下記参照)。
有効期限日数を指定するか、無期限に設定します。

キーは一度だけ表示され、その後はハッシュとしてのみ保存されます。キーを1つ失効させても、ほかのキーには影響しません。

プリセット
プリセットグループ典型的な用途
full設定で有効になっているすべての機能自分のサイトで使う場合
writerコンテンツと SEOコピーライターやクライアントのスタッフ
seoコンテンツ、Site Kit、ページビルダー、パフォーマンスSEO スペシャリスト
storeコンテンツ、WooCommerce のカタログ、注文、Site Kitストアマネージャー
developerファイル、データベース、サイト管理を含むすべての機能(有効にした場合)作業期間中の開発者
readonlyコンテンツ、WooCommerce、パフォーマンス、ビルダー、外観、Site Kit。読み取りツールのみ。読み取ることで認証情報が漏れるおそれがあるため、ファイル、データベースの生データ、サイト管理は含まれません。監査、レポート、試用中の新しい AI ツール

キーを作成せずに、単一の接続にもプリセットを適用できます。エンドポイント URL に ?preset=writer を追加するか、AI クライアントを接続 → ツールのプリセットから選択してください。プリセット、キーのグループ、?groups= は、互いに適用範囲を狭めることしかできません。batch 内のステップも含め、すべての呼び出しで適用されます。

承認

クライアントのチームには、承認が必要をオンにしたキーを発行します。そのチームの AI は、すべての情報を読み取り、変更をプレビューできます(dry_run=true)。サイトに変更を加える操作はすべて変更リクエストとして保存され、エージェントには承認待ちであることが通知されます。

update_content id=812 title="Summer Sale: 20% off all hoodies"
  → { "queued_for_approval": true, "request_id": "260924123533fb4f9c", … }

WordPress MCP → 承認でリクエストを確認できます。コンテンツと SEO の編集内容は、差分を並べて表示します。メモを添えて承認または却下してください。承認すると、リクエストされたとおりに変更が実行され、記録されるため、undo_operation で元に戻すこともできます。エージェントは list_change_requests で結果を確認します。ターミナルからは、wp mcp approvals list と wp mcp approvals approve <id> を使用します。

代理店での一般的な設定
Client site A
  ├─ Owner key ............. agency lead, full access (Claude Code)
  ├─ "Agency SEO team" ..... preset seo, expires in 90 days
  ├─ "Acme staff" .......... preset writer, needs approval
  └─ "ChatGPT (signed in by acme-admin)" ... read-only, via OAuth

ヘルスチェックと接続テスト

接続に失敗しても、ほとんどの場合はバグではありません。よくある原因は、ホストが Authorization ヘッダーを削除すること、ファイアウォールが HTML のブロックページを返すこと、キャッシュが古いレスポンスを再生すること、サイトで HTTPS が使われていないことです。次の3つのツールで問題を特定し、それぞれの修正方法を確認できます。

  • 設定画面の接続をテストでは、AI クライアントと同じ方法で、ブラウザーからエンドポイントを呼び出します。Bearer ヘッダー、X-API-Key、URL 内のキー、tools/list、GET を試した後、サーバー側のチェックを実行します。
  • ツール → サイトヘルスに、WordPress MCP のチェック項目として、設定とエンドポイントへの到達性が追加されます。
  • **wp mcp doctor**を実行すると、ターミナルから同じチェックを行えます。

HTTPS の問題、プレーンパーマリンク、ホストによって削除された Authorization ヘッダー(修正用の .htaccess の正確な行を表示)、ファイアウォールや WAF のブロックページ、MCP リクエストに応答する CDN やページキャッシュ、応答の遅延、有効なままになっている高リスクグループ、未使用または期限切れのキー、承認待ちのリクエスト、短い PHP の実行時間制限、ツール内で最近発生した PHP クラッシュを検出します。


WP-CLI

設定画面にあるすべての機能は、wp mcp コマンドでも利用できます。WP-CLI エイリアスを使えば、エージェンシーは1つのターミナルから、すべてのクライアントサイトでコマンドを実行できます。

wp mcp status                                    # endpoint, version, groups, keys, pending approvals
wp mcp key create "Acme staff" --preset=writer --approval --expires=90
wp mcp key list
wp mcp key revoke ab12cd34
wp mcp groups disable filesystem database site_mgmt
wp mcp approvals list
wp mcp approvals approve 260924123533fb4f9c --note="Looks good"
wp mcp doctor                                    # connection health checks
wp mcp tools --group=woocommerce
wp mcp connect codex                             # print the Codex config for this site

# Onboard every client site in one go
for site in @client-a @client-b @client-c; do
  wp $site plugin install wordpress-mcp --activate
  wp $site mcp key create "Agency SEO team" --preset=seo --expires=90
done

構造化出力とライブ進捗

構造化出力。 安定した結果形式を持つツールはoutputSchemaを宣言し、型付きのstructuredContentとしても結果を返します。これにより、クライアントはテーブルを表示したり、テキストからJSONを解析せずにデータをそのままコードに渡したりできます。対象となるツールはsearch、fetch、site_info、seo_status、get_seo、list_content、list_operations、list_change_requests、mcp_statusです。

ライブ進捗。 seo_audit、find_broken_links、product_seo_fix、regenerate_thumbnailsなどの時間のかかる処理では、クライアントが要求すれば、作業中に進捗通知を送信します。クライアントはprogressTokenを送信し、text/event-streamを受け入れることで要求します。これらの呼び出しには短いイベントストリームで応答し、それ以外の呼び出しはすべて通常のJSONのままです。要求しないクライアントでも、2つ目の接続からget_progressをポーリングできます。


MCP Registry

このプラグインは、公式のMCP Registry向けにserver.jsonで記述されています。Registryに対応したクライアントやディレクトリに掲載でき、サイトのドメインと、必要に応じてキーを入力するだけで設定できます。GitHub Actionsワークフロー(.github/workflows/publish-mcp-registry.yml)は、Actionsタブから実行するとプラグインを公開します。また、記載されたバージョンがプラグインと一致することを事前に確認します。


対象ユーザー

あなたは…得られるもの…
複数のWordPressクライアントを担当するSEOエージェンシー/フリーランサークライアントごとにプラグインを1つ導入し、それぞれのサイトをチームが利用するAIに接続できます。監査、計画、SEO/AEO/GEO施策をエージェンシー規模で実施でき、すべての変更に取り消し用のジャーナルが残ります。
ChatGPT、Claude、Geminiを日常的に使うデジタルマーケター自然な英語で依頼すると、Search Consoleを読み込み、手軽に実施できる改善点を見つけ、メタ情報を作成し、投稿を公開します。
開発者/パワーユーザーCodex、Claude Code、Gemini CLI、Cursor、Copilot向けの標準準拠MCPサーバーを利用できます。型付きツール165個、ファイルシステムと生SQLへのアクセス(制限付き)、バッチ処理、独自ツールを追加する2段階の方法を備えています。
WooCommerceストアのオーナーエージェントが商品説明、画像、価格、在庫、カテゴリー、Merchant品質の商品スキーマを扱います。

コンテンツとSEOには、強力な機能を標準で提供します。危険を伴う操作は、設定によって安全に制御できます。


開発の背景

WordPressを利用する複数のクライアントのSEOを管理しているとします。問題は、AIアシスタントがクライアントのサイトの状態(公開済みの内容、存在するスキーマ、商品写真に実際に写っているもの、Search Consoleのレポート)を確認できず、ツール間でデータをやり取りしなければ操作もできないことです。

WordPress MCPはこの課題を解決します。各クライアントサイトをリモートMCPサーバーに変えます。サイトごとに1回、単一のコマンドまたは貼り付けた設定でAIクライアントに接続すれば、以降はエージェントがコンテンツの一覧表示、SEO監査、画像の確認、クライアントが利用するSEOプラグインへのメタ情報の書き込み、スキーマの生成、最適化した投稿や商品の公開、llms.txt/robots/リダイレクト/サイトマップの制御、Googleの最新データの取得を、すべて1つの認証済みエンドポイント経由で実行できます。

設計方針: SEOとコンテンツの中核的な作業は常に利用でき、安全に委任できます。危険性の高い機能(ファイルシステム、生SQL、ユーザーとプラグインの管理)も備えていますが、明示的な機能切り替えの背後にあり、初期状態ではオフです。また、書き込みを伴う操作は、事前にプレビューでき、実行後に取り消せます。


他との違い

WordPressとやり取りできるツールはたくさんあります。重要なのは、エージェントにクライアントの稼働中のサイトを実際に任せたとき、何が起きるかです。

0. すでに使っている AI で利用できます

ベンダーロックインはなく、アシスタントごとのプラグインも必要ありません。標準に準拠した単一の MCP エンドポイントで、Claude、ChatGPT、Codex、Gemini、Cursor、Copilot など、プロトコルに対応するあらゆるものを利用できます。チーム内で異なるアシスタントを使うメンバーが、同じサイトに同時にアクセスできます。→ AI クライアントを接続する

1. クライアントがすでに使っている SEO プラグインに書き込みます

Yoast と Rank Math のどちらを使っているか、エージェントに伝える必要はありません。正規化されたフィールドセットが適切なメタキーに対応します。多くの連携で正しく処理されないソーシャル画像のペアも含まれます。→ エンジンに依存しない SEO レイヤー

2. ビルダーページを壊さずに編集します

Elementor または Divi のページで post_content を上書きしても、何も起きないか、レイアウトが壊れてしまいます。これらのツールはページをアドレス指定可能なツリーとして読み取り、ビルダー独自のデータ内にある要素を一つだけ書き換えます。→ ページビルダーの編集

3. すべての書き込みを元に戻せます

一括での価格変更、サイト全体の検索と置換、SEO の一括確認は、ほとんどのツールでは元に戻せません。ここでは、計測対象となる書き込みのたびに上書き前の値が記録され、undo_operation で元に戻せます。→ 安全性:ドライラン、取り消し、監査

4. エージェントが画像を確認できます

ファイル名から作成する代替テキストは推測にすぎません。get_image_bytes を使うと、モデルが実際の画像を確認できるため、代替テキスト、キャプション、商品説明を画像の内容に沿って作成できます。正しい写真が正しい商品に紐付いているかどうかも確認できます。→ メディアと画像

5. エラーから復旧できます。報告されるだけではありません

すべてのエラーには、安定した code、人が読める message、実行可能な hint、構造化された details が含まれます。エージェントは推測するのではなく、自分で呼び出しを修正します。→ エラー処理

6. 長時間のジョブも完了します

3,000 件の商品監査も、PHP の実行時間制限で中断されません。一括処理は早めに停止し、再開オフセットを返して、実行中は別の接続に進行状況を報告します。→ 安全性:ドライラン、取り消し、監査

7. 200 件の編集を一度のリクエストで実行します

batch は最大 50 件のツール呼び出しを一往復で実行します。それぞれに結果またはエラーが返され、まとめて取り消せます。

8. 危険な操作は、サイトごと、案件ごとに明示的な許可が必要です

ファイルシステム、未加工の SQL、サイト管理、顧客データは、それぞれ個別のスイッチで管理され、サーバー側で適用されます。コンテンツ関連の案件では、ユーザーのメールアドレスを読み取れません。→ 機能モデル


アーキテクチャ

単一のブートストラップファイルが、役割を絞った単一目的のクラスを結び付けます。グローバルなのは定数と1つのアクセサーだけです。

wordpress-mcp.php                 Bootstrap: constants, requires, register wpmcp(), activation hook
│
└── includes/
    ├── class-wpmcp-plugin.php      Singleton orchestrator: builds collaborators, registers hooks
    ├── class-wpmcp-settings.php    Single option row: API key + capability-group flags
    ├── class-wpmcp-rest.php        Streamable HTTP transport: dual-era JSON-RPC routing, auth, throttle
    ├── class-wpmcp-tools.php       Registry: catalogue, capability gate, validation, dispatch, wire shaping
    ├── class-wpmcp-prompts.php     MCP prompts: ready-made workflows surfaced as client commands
    ├── class-wpmcp-resources.php   MCP resources: site overview and content by wordpress:// URI
    ├── class-wpmcp-clients.php     Ready-to-paste connection recipes for each MCP client
    ├── class-wpmcp-keys.php        Connection keys, presets, OAuth tokens (hashed)
    ├── class-wpmcp-oauth.php       OAuth 2.1 sign-in: metadata, client registration, consent, tokens
    ├── class-wpmcp-approvals.php   Change requests held for an administrator's approval
    ├── class-wpmcp-health.php      Site Health checks, connection test, wp mcp doctor
    ├── class-wpmcp-cli.php         wp mcp … commands
    ├── class-wpmcp-error.php       Typed tool exception, error codes, rolling log, fatal guard
    ├── class-wpmcp-validator.php   Argument validation and coercion against each inputSchema
    ├── class-wpmcp-journal.php     Undo journal: records what each write overwrites
    ├── class-wpmcp-audit.php       Rolling log of every tool call, arguments redacted
    ├── class-wpmcp-progress.php    Progress heartbeat + the execution-time budget
    ├── class-wpmcp-util.php        Multibyte counting, value coercion, PHP syntax checking
    ├── class-wpmcp-media.php       Shared image ingest: sources, dedup, SEO filenames, processing
    ├── class-wpmcp-seo.php         Engine-agnostic Yoast / Rank Math normalised read+write
    ├── class-wpmcp-schema.php      Product / ProductGroup structured data builder
    ├── class-wpmcp-sitekit.php     Read-only Google Site Kit data bridge (runs as connected admin)
    ├── class-wpmcp-performance.php Front-end speed flags + measurement helpers
    ├── class-wpmcp-frontend.php    Public output: JSON-LD, /llms.txt, robots.txt, redirects, IndexNow key
    ├── class-wpmcp-admin.php       Material-3 settings screen: key, toggles, status, error log
    │
    └── tools/                      One trait per capability group: definitions + handlers
        ├── trait-wpmcp-content.php      38 tools  content, SEO, terms, meta, revisions, comments
        ├── trait-wpmcp-search.php        2 tools  search + fetch (universal retrieval shape)
        ├── trait-wpmcp-woocommerce.php  29 tools  products, variations, images, inventory, coupons
        ├── trait-wpmcp-sitemgmt.php     16 tools  plugins, themes, users, options, cron, permalinks
        ├── trait-wpmcp-filesystem.php   13 tools  read/write/search/backup/restore, child themes
        ├── trait-wpmcp-integrations.php 13 tools  Site Kit data + diagnostics + self-check
        ├── trait-wpmcp-appearance.php    9 tools  menus, widgets, customizer, site identity
        ├── trait-wpmcp-orders.php        8 tools  orders, refunds, customers (own group, off by default)
        ├── trait-wpmcp-performance.php   8 tools  audit, optimise, cleanup, cache, images
        ├── trait-wpmcp-builders.php      8 tools  Elementor/Gutenberg/Divi/WPBakery layout editing
        ├── trait-wpmcp-media.php         7 tools  view, optimise, regenerate, dedupe, orphans, alt text
        ├── trait-wpmcp-ops.php           6 tools  batch, undo, restore points, progress, audit log
        ├── trait-wpmcp-seotech.php       4 tools  broken links, sitemaps, IndexNow
        └── trait-wpmcp-database.php      3 tools  guarded raw SQL + schema inspection

ツールは、1か所にある2つの要素で構成されます。defs_*()メソッドに追加する定義と、その隣に置くtool_<name>( $args )ハンドラーです。registry()は慣例に従って両者を対応付けるため、ツールを追加しても中央部分を変更する必要はありません。

責務の対応表

レイヤークラス担当
トランスポートWPMCP_RESTHTTPルート、認証、ブルートフォース対策のスロットリング、プロトコルバージョンのネゴシエーション、JSON-RPCエンベロープ、MCPルーティング、コンテンツブロック
ディスパッチWPMCP_Toolsツールカタログ、機能ゲート、接続ごとのスコープ、検証、dispatch()からハンドラーへの振り分け、クライアント間のスキーマ整形とアノテーション
ツール以外WPMCP_Prompts, WPMCP_Resourcesワークフロープロンプト、添付可能なサイトコンテンツ
導入WPMCP_ClientsClaude、ChatGPT、Codex、Gemini、Cursor、VS Code、Windsurf、Zed、Cline、mcp-remote向けの接続設定スニペット
エラー対応WPMCP_Errors, WPMCP_Validatorコードとヒントを含む型付きエラー、引数チェック、ローテーションログ
可逆性WPMCP_Journal各書き込みで上書きされた内容を記録し、元に戻す際に逆順で再適用
説明責任WPMCP_Auditすべての呼び出しについて、ツール、編集済み引数、ステータス、所要時間、IP、元に戻すためのハンドルを記録
実行ペースWPMCP_Progress長時間の実行に対するハートビート、実行を正常に停止するための時間制限
ドメインWPMCP_SEO, WPMCP_Schema, WPMCP_Media, WPMCP_SiteKit, WPMCP_PerformanceSEOフィールドのマッピング、製品の構造化データ、画像の取り込みと処理、Googleデータ、速度に関するフラグ
永続化/設定WPMCP_SettingsAPIキー、機能フラグ(1つのwp_options行)
公開インターフェースWPMCP_Frontend<head>内のJSON-LD、/llms.txt、robots.txtのルール、リダイレクト、IndexNowキーファイル
コントロールプレーンWPMCP_Admin設定UIとフォームハンドラー
配線WPMCP_Plugin適切なフックで全要素を構築し、登録

リクエストのライフサイクル(通信)

すべてのやり取りは、MCPのStreamable HTTPトランスポート上でJSON-RPC 2.0を使用する単一エンドポイントへの1つのPOSTです。レスポンスはプレーンなapplication/jsonです。これはすべてのプロトコル改訂でトランスポートが許可しており、すべてのクライアントがサポートしています。

MCP client                      WordPress MCP                         WordPress core
─────────────────────────────────────────────────────────────────────────────────────
POST /wp-json/wp-mcp/v1/mcp
Authorization: Bearer <key>  ─► WPMCP_REST::check_auth()
{ "jsonrpc":"2.0",              │   brute-force lockout?  ── 429 if IP over limit
  "method":"tools/call",        │   hash_equals( key ) over header / X-API-Key / ?key  ── 401 on mismatch
  "params":{                    ▼
    "name":"set_seo",        WPMCP_REST::handle()  ── routes by JSON-RPC method
    "arguments":{...} } }        │
                                 ├─ initialize          → negotiated version + capabilities + instructions
                                 ├─ server/discover     → same, for stateless (2026-07-28) clients
                                 ├─ tools/list          → WPMCP_Tools::exposed_definitions()
                                 │                          (enabled groups ∩ ?groups scope, deps present,
                                 │                           titles + annotations, schema shaped for every model)
                                 ├─ prompts/list|get    → WPMCP_Prompts
                                 ├─ resources/list|read → WPMCP_Resources
                                 └─ tools/call          → WPMCP_Tools::dispatch(name,args)
                                                            │
                                                            ├─ registry lookup (unknown → did-you-mean)
                                                            ├─ WPMCP_Settings::can(group)?  ── disabled → error
                                                            ├─ WPMCP_Validator::check(schema,args)
                                                            ├─ WPMCP_Progress::boot()    time budget starts
                                                            ├─ WPMCP_Journal::open()     writes only
                                                            ├─ tool_<name>($args) ──────────► WP_Query / wp_insert_post
                                                            │                                 update_post_meta / $wpdb …
                                                            ├─ WPMCP_Journal::close()    → operation_id
                                                            └─ WPMCP_Audit::record()     → audit log
                                 ◄─ { result:{ content:[{type:"text",text:"<json>"}] } }
                                    (images add {type:"image",data,mimeType} blocks)
                                    (errors → { result:{ isError:true, content:[…] } })

実装済みのMCPメソッド: initialize、server/discover、ping、logging/setLevel、tools/list、tools/call、prompts/list、prompts/get、resources/list、resources/templates/list、resources/read。通知には202で応答します。プロトコル準拠を参照してください。

すべてのtools/callに適用される2つのゲート:

  1. トランスポート認証:有効なキー(定時間比較)とブルートフォース対策のスロットリングが必要です。満たさない場合は401/429を返します。
  2. 機能ゲート:設定でツールのグループが有効になっている必要があります。無効の場合はツールエラーになります。無効なグループに属するツールはtools/listからも非表示になるため、エージェントに表示されることはありません。

接続時の概要通知。 initializeは、このサイトについて説明するinstructions文字列を返します。内容は、サイト名、検出されたSEOエンジン、WooCommerceが有効かどうか、有効なグループ、書き込みがジャーナルに記録され元に戻せること、batchが利用可能であることです。エージェントは調査から始めるのではなく、最初から状況を把握できます。


安全性:ドライラン、元に戻す、監査

各層で異なる問題が起きるため、独立した3つの層を用意しています。「それはしないで」、「元に戻して」、*「先週の火曜日に何をしたのか?」*にそれぞれ対応します。

プレビュー:dry_run

広範囲に書き込みを行う操作は、デフォルトでdry_run=trueになり、変更する内容を正確に返します。対象は、bulk_update_products、bulk_update_content、search_replace_content、bulk_set_seo、bulk_set_image_alt、product_seo_fix、bulk_assign_variation_images、optimize_site、optimize_image、database_cleanup、indexnow_submit、およびカテゴリー全体を対象とするupdate_inventoryです。変更を適用するには、dry_run=falseで再実行してください。

Reverse:取り消しジャーナル

すべての書き込みは、上書きする値のスナップショットを記録するジャーナルを通じて行われます。ツールが何も変更しなければ何も保存されないため、読み取り呼び出しにはコストがかかりません。

update_product id=4821 regular_price="24.00"
   → { "success": true, …, "operation_id": "260824182233a91f",
       "undo_with": "undo_operation id=260824182233a91f" }

undo_operation id=260824182233a91f
   → { "restored": 1, "success": true }
記録対象投稿メタデータ、タームメタデータ、投稿カラム、オプション、正規化された SEO フィールドセット、各自のセッターを通じた WooCommerce フィールド
対象範囲一括価格変更、在庫、検索と置換、一括コンテンツおよび SEO の書き込み、スキーマ、代替テキスト、商品画像、復元ポイント、バッチ全体
list_operations直近 40 件の書き込み操作:ツール、時刻、変更されたレコード、すでに取り消されているかどうか
create_restore_pointリスクの高い実行の前に、投稿タイプ全体の SEO、スキーマ、必要に応じてコンテンツをスナップショットします。1 つの ID で全体を復元できます
ガード対象ごとに最初の書き込みを優先するため、ループ内でキーを 2 回変更しても、開始時の状態に戻ります。二重の取り消しは拒否されます。操作全体を記録するには大きすぎる場合は未完了としてマークされ、force=true が必要です。取り消し自体はジャーナルに記録されません。

すべてが取り消し可能なわけではなく、プラグインもその点を偽りません。database_cleanup は行を完全に削除します。また、ファイルの書き込みはジャーナルではなく、専用のバックアップシステム(list_backups / restore_file)で管理されます。

Account:監査ログ

get_audit_log は、サーバーが処理したすべての呼び出しを返します。ツール、秘密情報を伏せた引数、成功または失敗、所要時間、リクエスト元 IP、結果の概要、そして取り消しに使用する operation_id が含まれます。ツール、writes_only、errors_only、または since で絞り込めます。エラーログには何が壊れたかが記録されますが、このログには何が 行われたか が記録されます。

Finish:進捗と時間予算

カタログ全体のスキャンは、以前は max_execution_time を超えるかどうか運任せでした。現在は次のとおりです。

  • get_progress:実行中の処理を確認するには、2 つ目の接続から呼び出します。ツール、完了した項目数と合計数、経過秒数、現在の項目を確認できます。
  • 予算:サーバーの実行制限の 70% に達すると、長時間のスキャンを停止し、next_offset を含む stopped_early を返して、再開方法を示します。対象は seo_audit、product_seo_audit、product_seo_fix、find_broken_links、sitemap_audit、optimize_image、regenerate_thumbnails、find_unused_media、create_restore_point、batch です。
ラウンドトリップを削減:batch
{ "tool": "batch", "arguments": { "operations": [
    { "id": "a", "tool": "set_seo",        "args": { "id": 12, "fields": { "title": "…" } } },
    { "id": "b", "tool": "update_product", "args": { "id": 44, "regular_price": "24.00" } }
] } }

最大 50 ステップです。各ステップは個別の結果または型付きエラーを返すため、1 つの失敗で残りの結果が失われることはありません。バッチ全体を 1 つの 操作として取り消せます。バッチにバッチを含めることはできません。


エラー処理

エージェントが復旧できるのは、理解できる障害だけです。そのため、ワイヤーを通過するすべてのエラーは文章ではなく、構造化されています。

{
  "error": true,
  "tool": "update_product",
  "code": "not_found",
  "message": "Product 4821 was not found.",
  "hint": "Use list_products to find the right ID, or pass sku to get_product.",
  "details": { "id": 4821 }
}

code は安定した機械可読の値です。invalid_argument、missing_argument、not_found、capability_disabled、dependency_missing、permission_denied、conflict、io_failed、upstream_failed、unknown_tool、tool_failed、fatal_error があります。

5 つのレイヤー(外側から順に)

レイヤー捕捉する内容
トランスポート不正な JSON、未知のメソッド(裸の 500 を返さず、有効な JSON-RPC として応答します)
事前チェック未知のツール(もしかしての候補を提示)、無効なグループ、不足している依存関係、不正な引数
検証型の不一致。妥当な場合は型を変換し("42" → 42、"a,b" → ["a","b"])、そうでない場合は正確なメッセージとともに拒否します
ハンドラーWooCommerce/WordPress の拒否を、修正方法を含む型付きエラーに変換します
致命的エラーガードハンドラー内でクラッシュが発生しても、シャットダウンフックを介して読み取り可能な JSON-RPC エラーを返します

報告だけにとどまりません。 呼び出し中に発生した PHP の警告は捕捉され、成功した結果とともに _warnings に返されるため、テーマフック内の非推奨機能も見逃されません。警告の捕捉は再入可能なので、batch 内で実行されるツールが外側の呼び出しの状態を消去することはありません。すべてのエラーは、get_error_log で読み取り可能な直近 30 件の循環ログに記録され、設定画面にも表示されます。mcp_status は、プラグイン自身の状態(有効なグループ、公開済みと定義済みのツール数、依存関係の状態、メモリ、最近のエラー)を報告します。

書き込みに失敗しても、元に戻せます。 一括実行の途中でハンドラーが例外をスローした場合、ジャーナルは破棄されずに保持されます。途中まで完了した変更こそ、元に戻したい変更だからです。

取り返しのつかない事態を防止します。 稼働中のサイトに壊れた PHP を書き込むと、サイトとこのエンドポイントの両方が停止します。修正のための 2 回目の呼び出しはできません。そのため、すべての書き込みの前に PHP を解析し、コンパイルできない場合は拒否します。また、上書きや削除の際には毎回タイムスタンプ付きのバックアップを保存し、restore_file でロールバックできるようにします。


機能グループ

各ツールには、機能グループが1つだけ割り当てられています。ツールを公開または実行可能にするには、グループを有効にする必要があります。この制御はUI上で非表示にするだけでなく、サーバー側のdispatch()で適用されます。デフォルト設定はエージェンシーに配慮しており、破壊的なグループはオフになっています。

グループデフォルト対象範囲リスク
コンテンツとSEOオン(ロック済み)投稿/ページ/あらゆるCPT、ターム、メタデータ、メディアライブラリ、リビジョン、コメント、JSON-LD、llms.txt、robots、リダイレクト、サイトマップ、リンク切れ、IndexNow、Yoast/Rank Mathのフィールドに加え、一括処理、取り消し、復元ポイントコア機能。安心して委任できます。
WooCommerceカタログオン*商品、バリエーション、属性、カテゴリー、画像、一括価格変更、在庫、クーポン、ストア設定、商品スキーマ、売上レポート商用データの書き込み
WooCommerceの注文と顧客オフ注文、注文メモ、返金、顧客レコード高(個人データ+金銭)
パフォーマンスオン速度監査、フロントエンド最適化フラグ、データベースのクリーンアップ、キャッシュの消去、画像レポート中(変更は元に戻せます)
ページビルダーオンElementor/Gutenberg/Divi/WPBakery/Beaverのレイアウト読み取りと要素単位の編集、グローバルスタイル中(実際のページレイアウトを編集します)
外観オンメニュー、ウィジェット、カスタマイザーのテーマ変更、サイトのアイデンティティ低(表示に影響しますが、元に戻せます)
Google Site Kitオン*読み取り専用のSearch Console/GA4/PageSpeed/キーワードの機会読み取り専用
診断オンサイトヘルス、環境、プラグイン/テーマの一覧、MCPのセルフチェック、エラーログ、リアルタイムの進捗、監査ログ読み取り専用
サイト管理オフプラグインとテーマのインストール/更新/削除、ユーザー、オプション、cron、パーマリンク高(サイトの制御)
ファイルシステムオフファイルの読み取り/検索/書き込み/編集/コピー/移動/削除、子テーマのひな形作成重大(PHPの書き込み=RCE)
生データベースオフ生のSELECT+制限付き書き込みSQL+スキーマの調査重大(取り消し不可)

* WooCommerceとSite Kitのツールは、切り替え設定に関係なく、依存するプラグインが有効でない場合は自動的に非表示になります。

コンテンツとSEOグループはロックされており、常にオンです。これはプラグインの存在理由であり、ほかのすべてが依存する取り消しツールも含まれています。ユーザーメタデータへのアクセス(メールアドレス、権限)は意図的にこのグループに含めていません。アクセスにはサイト管理が必要なため、「コンテンツのみ」の接続ではユーザーのメールアドレスを読み取ったり、権限を昇格させたりできません。


ツール一覧(165)

コンテンツとSEO(56):search、fetch、batch、list_change_requests、list_operations、undo_operation、create_restore_point、find_broken_links、get_sitemap、sitemap_audit、indexnow_submit、get_image_bytes、list_content、get_content、publish_content、update_content、delete_content、duplicate_content、bulk_update_content、search_replace_content、get_seo、set_seo、bulk_set_seo、serp_preview、set_schema、get_schema、generate_schema、analyze_content、internal_link_opportunities、manage_llms_txt、manage_robots_txt、manage_redirects、seo_audit、list_post_types、list_taxonomies、list_terms、save_term、delete_term、get_meta、set_meta、delete_meta、upload_media、list_media、delete_media、set_image_alt、bulk_set_image_alt、set_featured_image、optimize_image、restore_image、regenerate_thumbnails、find_duplicate_media、find_unused_media、list_revisions、restore_revision、list_comments、moderate_comment

PSEOEWPが有効な場合(さらに4つ):ai_readiness_audit、set_short_answer、ai_visibility_report、pseoewp_settings。PSEOEWPを参照してください。 WooCommerce カタログ(29):list_products、get_product、create_product、update_product、delete_product、duplicate_product、bulk_update_products、list_product_variations、save_product_variation、delete_product_variation、generate_product_variations、bulk_assign_variation_images、list_product_attributes、save_product_attribute、list_product_categories、save_product_category、delete_product_category、manage_product_images、update_inventory、inventory_report、product_seo_audit、product_seo_fix、generate_product_schema、list_coupons、save_coupon、delete_coupon、store_report、get_store_settings、update_store_settings

WooCommerce の注文と顧客(8):list_orders、get_order、update_order、add_order_note、refund_order、list_customers、get_customer、customer_insights

パフォーマンス(8):performance_audit、optimize_site、performance_settings、database_cleanup、clear_cache、image_optimization_report、analyze_page_speed、list_autoloaded_options

ページビルダー(8):detect_page_builder、get_page_structure、edit_page_element、insert_page_section、delete_page_element、list_builder_templates、manage_global_styles、render_page_preview

外観(9):list_menus、list_menu_items、save_menu、delete_menu、manage_menu_items、list_widgets、save_widget、theme_customizer、manage_site_identity

Google Site Kit(6):sitekit_status、sitekit_search_analytics、sitekit_analytics_report、sitekit_pagespeed、sitekit_keyword_opportunities、sitekit_get

診断(9):get_progress、get_audit_log、site_info、site_health、seo_status、list_plugins、list_themes、mcp_status、get_error_log

サイト管理(16):install_plugin、activate_plugin、deactivate_plugin、update_plugin、delete_plugin、install_theme、switch_theme、delete_theme、get_option、update_option、delete_option、list_users、save_user、delete_user、manage_cron、manage_permalinks

ファイルシステム(13):list_files、read_file、write_file、edit_file、search_files、copy_file、move_file、make_dir、delete_file、file_info、list_backups、restore_file、create_child_theme

生データベース(3):sql_query、sql_execute、describe_tables

各ツールには、JSON Schema の inputSchema、表示用の title、および動作アノテーション(readOnlyHint、destructiveHint、idempotentHint、openWorldHint)が付属します。クライアントはこれらのアノテーションを使用して、ユーザーの確認が必要な操作を判断します。ハンドラーの実行前にサーバーが引数を検証して型を変換するため、型が間違っている場合、PHP のエラーが呼び出し履歴の深いところで発生するのではなく、id must be an integer, got string というエラーになります。

スキーマは、主要なモデルプロバイダーがすべて受け入れるサブセット内に収まります。すべてのプロパティは型を1つだけ持ち、すべての配列で項目を宣言し、anyOf、$ref、型のユニオンは使用しません。そのため、同じカタログを変更せずに Claude、ChatGPT/Codex(OpenAI の関数呼び出し)、Gemini で読み込めます。set_meta/update_option などの自由形式の値は、構造化データを渡す場合、value_format=json を指定して文字列として送信します。


メディアと画像

メディアライブラリへのすべての経路(upload_media、商品画像、バリエーション画像、一括ツール)は、単一の取り込みエンジンを経由するため、どれも同じように動作します。

manage_product_images product_id=812
  main:    { url: "https://supplier.example/IMG_2831.JPG", alt: "…" }
  gallery: [ { base64: "…", filename: "back.jpg" },
             { path: "wp-content/uploads/import/side.jpg" },
             1422 ]
  mode: "replace"   max_dimension: 2000   convert: "webp"

  → downloaded / decoded / copied, de-duplicated by content hash,
    renamed black-cotton-hoodie.jpg, -2, -3 …,
    downscaled and converted before they become attachments,
    alt text filled, gallery ordered exactly as sent,
    and any single bad source reported without losing the rest
4 つのソース、1 つの形式既存の添付ファイル id、サーバーがダウンロードする url、生の base64(データ URI も使用できます)、またはサーバー上にすでにあるファイルの path(Filesystem 機能が有効な場合に限ります)
SEO に適したファイル名IMG_2831.JPG は black-cotton-hoodie.jpg として取り込まれ、ギャラリー内で連番が付けられます。これは、以前のサイドロードでは制御できなかった、実際に画像の順位に影響するシグナルです
重複排除取り込み時にバイト列をハッシュ化します。1 枚の写真を 20 個の商品に再インポートしても、添付ファイルは 1 つだけ再利用されます
保存前に処理max_dimension、convert(WebP/AVIF)、quality は、ファイルが添付ファイルになる前に適用されるため、ライブラリに 5 MB の元画像と 8 種類の生成サイズが保存されることはありません
編集可能なギャラリーmode(replace / append / prepend)、remove_ids、reorder、detach_main、画像ごとのタイトル、キャプション、説明
一部の失敗から復旧可能各ソースはそれぞれのエラーを報告し、ほかのデータはすべて保存されます

画像の確認。 get_image_bytes は、ID、投稿(アイキャッチ画像)、または商品(メイン画像とギャラリー)を指定して、添付ファイルを実際のインライン画像として返します。転送用に縮小して再エンコードしますが、元画像には手を加えません。これにより、代替テキスト、キャプション、商品説明でファイル名ではなく写真の内容を説明でき、*「正しい画像が正しい商品に設定されていますか?」*と尋ねて回答を得られます。

ライブラリのメンテナンス。 optimize_image は、すでに保存されている画像を縮小、変換、再エンコードします。復元可能な元画像を保持し、ファイルをより大きなものに置き換えることはありません。また、変換で URL が変わった場合は、投稿コンテンツや Elementor データ内の古い URL を任意で書き換えられます。restore_image を使えば元に戻せます。ライブラリツールには、regenerate_thumbnails(バッチ処理、再開可能)、find_duplicate_media(バイト列が同一のグループを検出し、実際に使用中のコピーを特定)、find_unused_media(アイキャッチ画像、商品ギャラリー、投稿コンテンツ、ビルダーレイアウトを横断して、どこからも参照されていないメディアを確認)、bulk_set_image_alt(ライブラリ全体にテンプレートを適用)も含まれています。


ページビルダーの編集

WordPress のページが「post_content 内の HTML」にすぎないのは、クラシックサイトの場合だけです。Elementor は投稿メタに JSON ツリーを保持し、Gutenberg はコンテンツ内にブロックコメントを保持し、Divi と WPBakery はネストされたショートコードを保持し、Beaver Builder はシリアライズされたオブジェクトを保持します。これらのいずれかで post_content を上書きすると、何も起きないか、レイアウトが壊れます。ビルダーは独自のデータから再描画するためです。

そのため、これらのツールはページを実際に構築したものを検出し、そのビルダー固有の構造で編集します。

detect_page_builder id=42     → "elementor", write_support: full,
                                 safe_to_overwrite_post_content: false

get_page_structure id=42      → every section, column, widget and block as a flat,
                                 addressable tree:
                                 [ { element_id: "a1b2c3d", type: "heading",
                                     text: "Our Services", level: 3 },
                                   { element_id: "e4f5g6h", type: "button",
                                     text: "Get a quote", link: "/contact" }, … ]

edit_page_element id=42 element_id="a1b2c3d" text="What We Do"
                              → rewrites that one widget, regenerates the builder's
                                 CSS cache, leaves everything else untouched

render_page_preview id=42     → fetches the live page and returns the rendered
                                 headings, text, images and links: what the visitor
                                 actually sees, not what the data says
ビルダー検出方法サポート
Elementor_elementor_edit_mode + _elementor_data完全:読み取り、編集、挿入、削除に対応。保存時に CSS キャッシュを再生成
Gutenberg ブロックhas_blocks()完全:解析して再シリアライズするため、ブロック属性とラッパーが保持されます
Divi_et_pb_use_builder、[et_pb_section]テキストと属性(子モジュールを含むコンテナーの書き換えは拒否します)
WPBakery_wpb_vc_js_status、[vc_row]テキストと属性
Beaver Builder_fl_builder_enabled読み取り(シリアライズされたオブジェクトは壊れやすく、内容を確認せずに書き換えるのは危険です)
Oxygen / Bricks / Breakdance / SiteOrigin独自のメタキー読み取り
クラシック HTMLフォールバック完全:ブロック単位で指定可能

ここには、insert_page_section(見出し、段落、画像、ボタン、スペーサー、またはビルダーの生データを、先頭、末尾、または既存の要素の隣に配置し、そのページのビルダーに適した形式で生成します)、delete_page_element、list_builder_templates(Elementor ライブラリ、再利用可能なブロック、ブロックパターン、Divi および Beaver のレイアウト)、そして Elementor キットの色やフォント、またはブロックテーマの theme.json パレットを管理する manage_global_styles もあります。ページごとではなく、サイト全体のスタイルを一度に変更できます。

読み取り専用のビルダーでは、レイアウトを黙って破損させるのではなく、明確なエラーを返します。エラーにはビルダー名、サポートされている操作、利用可能なツールが記載されます。


コマース操作

WooCommerce の機能は、ストアの説明だけでなく、ストアの運営に使えるように構築されています。

DISCOVER   list_products (search, category, type, stock, price band, on-sale, SKU)
           get_product   → every field, including variations, attributes, downloads, ratings
           inventory_report / store_report / product_seo_audit

RANK       product_seo_fix         bulk-repair missing titles, descriptions, alt text, schema
           generate_product_schema Product / ProductGroup JSON-LD with gtin, brand, shipping,
                                   returns, price validity and variants

BUILD      create_product          simple | variable | grouped | external
           save_product_attribute  global attribute + its terms in one call
           generate_product_variations
                                   builds every missing attribute combination, skips existing
           manage_product_images   main image + gallery from attachment IDs, URLs, base64 or a
                                   server path; SEO filenames, de-duplication, downscale/WebP,
                                   gallery reorder and removal, per-image error reporting
           bulk_assign_variation_images
                                   attribute value → image, applied across every variation

MERCHANDISE
           bulk_update_products    reprice by %/fixed/set across a filtered set
                                   start and end sales on a schedule
                                   move stock status, categories, visibility, featured
           save_coupon             percent / fixed cart / fixed product, limits, restrictions
           update_inventory        per-item lists, or a whole category; absolute or relative

OPERATE    (wc_orders group, off by default)
           list_orders / get_order / update_order / add_order_note
           refund_order            manual by default; via_gateway=true to move real money
           list_customers / get_customer / customer_insights

Merchant Center が受け入れる商品構造化データ。 単純な Product と Offer の組み合わせは検証に通るだけで、何の成果も得られません。generate_product_schema は、WooCommerce がすでに把握している情報と、販売者だけが提供できる少数のポリシー情報を使って、オブジェクト全体を構築します。情報には、gtin / mpn / sku、brand(5 つのブランドタクソノミーを確認)、priceValidUntil、shippingDetails、hasMerchantReturnPolicy、itemCondition、色/サイズ/素材、重量、評価、埋め込みレビューが含まれます。バリエーションのある商品は、すべてのバリエーションを hasVariant オファーとして含む ProductGroup になります。配送ポリシーと返品ポリシーは save_defaults で一度保存してカタログ全体で再利用できます。また、このツールは不完全なオブジェクトを黙って出力するのではなく、まだ不足している情報を報告します。

実店舗で重要なガード機能:bulk_update_products とカテゴリー全体に適用する update_inventory は、書き込み前にプレビューを表示し、実行後に元に戻せます。refund_order は返金可能な残高を超える返金を拒否し、ゲートウェイを呼び出すよう明示的に指示されない限り、手動返金を記録します。update_store_settings は許可リストにあるキーだけを受け付けるため、決済認証情報に至る経路はありません。在庫数量を設定すると、在庫状況も自動的に整合性が保たれます。


エンジンに依存しない SEO レイヤー

エージェントに、クライアントがどの SEO プラグインを使っているかを伝える必要はありません。WPMCP_SEO が有効なエンジンを検出し、1 つの 正規化されたフィールドセット を適切なメタキーにマッピングします。

normalised field          Yoast key                         Rank Math key
──────────────────────────────────────────────────────────────────────────────
title                  →  _yoast_wpseo_title             →  rank_math_title
description            →  _yoast_wpseo_metadesc          →  rank_math_description
focus_keyword          →  _yoast_wpseo_focuskw           →  rank_math_focus_keyword
canonical              →  _yoast_wpseo_canonical         →  rank_math_canonical_url
og_title / og_desc     →  _yoast_wpseo_opengraph-*       →  rank_math_facebook_*
og_image               →  _yoast_wpseo_opengraph-image   →  rank_math_facebook_image
                          (+ …-image-id)                    (+ …_image_id)
twitter_title / _desc  →  _yoast_wpseo_twitter-*         →  rank_math_twitter_*
twitter_image          →  _yoast_wpseo_twitter-image     →  rank_math_twitter_image
                          (+ …-image-id)                    (+ …_image_id)
noindex / nofollow     →  _yoast_wpseo_meta-robots-*     →  rank_math_robots[]
  • Yoast は WPSEO_VERSION / WPSEO_Options で検出します。
  • Rank Math は RankMath / RANK_MATH_VERSION で検出します。
  • どちらも使用されていない場合 → 値は標準の投稿メタとして保存され、対応エンジンが有効になると表示されます。

すべての書き込みは sanitize_text_field を通過します。同じ正規化処理は ターム(カテゴリー/タグの SEO)と WooCommerce 製品にも適用され、すべての SEO 書き込みがジャーナルに記録されるため、問題のある一括処理も 1 回の呼び出しで元に戻せます。

画像フィールドには添付ファイル ID と URL のどちらも指定でき、常に URL と添付ファイル ID の両方が書き込まれます。ソーシャル画像の片方だけが設定されていることが、プレビューが表示されない主な原因です。

大規模な運用の場合。 bulk_set_seo はテンプレート({title}、{category}、{brand}、{sku}、{price}、{site}、{separator})を投稿タイプ全体に適用します。product_seo_fix は product_seo_audit が報告した問題を、製品自体の情報を使って修正します。どちらも結果を文字数ではなく 実際にレンダリングされたピクセル幅で確認します。serp_preview を使えば、その重要性がわかります。Illinois と MMMMMMMM はどちらも 8 文字ですが、幅は 3 倍も違います。


テクニカル SEO:リンク、サイトマップ、IndexNow

find_broken_links post_type=post
   → internal links resolved against the database first (exact, free),
     the rest requested over HTTP with redirects followed
   → broken URLs grouped, each naming every post that links to it
   → redirects reported separately: something to update, not something broken
   → results cached 6h; the crawl resumes where the execution budget stopped it

get_sitemap        → detects core / Yoast / Rank Math, follows an index into its
                     children, reports URL counts, newest lastmod and samples

sitemap_audit      → noindexed URLs sitting in the sitemap
                     published content missing from it
                     URLs that 404 or redirect (sampled over HTTP)
                     stale lastmod dates
                     (the check that explains "Google indexed the wrong pages")

indexnow_submit    → pushes URLs to Bing, Yandex, Naver and Seznam
                     verification key generated and served at /<key>.txt automatically
                     send explicit URLs, post IDs, or everything changed in N days

AEO / GEO レイヤー

PSEOEWP と連携します。 PSEOEWP は、同じ開発者によるオープンソースの SEO、AEO、GEO プラグインです。有効にすると、WordPress MCP は PSEOEWP の API を通じて SEO フィールド、リダイレクト、llms.txt、IndexNow を書き込みます。また、回答エンジン向けのページ監査、引用可能な短い回答の設定、AI アシスタントやクローラーからの訪問状況の報告を行うツールが追加されます。次のように依頼できます。「最新の投稿 10 件を AI 対応の観点から監査し、可能な範囲で修正してください。」

エージェントが管理し、WPMCP_Frontend がレンダリングする、回答エンジンおよび生成エンジン向けの最適化です。

  • JSON-LD スキーマ:投稿ごとに _wpmcp_jsonld に保存され、書き込み時に検証され、単一投稿の表示時に wp_head で出力されます。出力は 16 進数エスケープ(JSON_HEX_TAG|HEX_AMP|HEX_QUOT|HEX_APOS)されるため、文字列値が <script> 要素の外に抜け出すことはありません。generate_schema は投稿データから Article/FAQPage/HowTo/BreadcrumbList/Product の JSON-LD を直接生成します。実際の WooCommerce 製品の場合は、WPMCP_Schema に処理を引き継ぎ、完全な Product / ProductGroup オブジェクトを生成します。
  • llms.txt:manage_llms_txt で管理する、サイト全体で 1 つのドキュメントを、書き換えルール経由で /llms.txt(text/plain)に提供します。サイトの内容と利用方法を生成エンジンに伝えます。
  • robots.txt の制御:manage_robots_txt は、AI クローラー(GPTBot、ClaudeBot、Google-Extended、PerplexityBot、CCBot、…)に対する明示的な許可/拒否を含む、管理対象のディレクティブを仮想 robots.txt に追加します。これは GEO のクロール制御を担います。
  • リダイレクト:manage_redirects は 301/302/307/308 のルールを保存し、template_redirect の早い段階で wp_safe_redirect 経由により提供します。これにより、コンテンツを再編成してもリンク評価を維持できます。
  • 即時インデックス登録:対応するエンジンには indexnow_submit を使います。Google は引き続きサイトマップ経由で変更を検出し、sitemap_audit がサイトマップの正確性を保ちます。

パフォーマンスレイヤー

「ウェブサイトを高速化して」という依頼は、3 回の呼び出しで行う処理に変換されます。

1. performance_audit            read-only. Measures the live page (response time, HTML weight,
                                render-blocking scripts, compression, cache headers, lazy-loading),
                                inspects the platform (PHP version, object cache, OPcache, caching
                                plugin, plugin count), and the database (autoload bloat, revisions,
                                transients, orphaned meta).
                                → ranked issues, each with a concrete fix, and a score out of 100.

2. optimize_site                dry run by default; shows every planned change with its risk first.
   preset=safe                  emoji script, oEmbed script, wp_head cleanup, self-pingbacks,
                                Heartbeat throttle, revision limit, expired transients
   preset=aggressive            + Dashicons, jQuery Migrate, XML-RPC, WooCommerce cart fragments,
                                revision purge, database cleanup, cache purge

3. analyze_page_speed           re-measure, with real Core Web Vitals from PageSpeed Insights
                                when Site Kit is connected. Prove the change.

フロントエンドの調整はすべて保存されるフラグで、公開側にのみ適用されます。performance_settings でリスクレベルとともに一覧表示でき、いつでも元に戻せます。テーマファイルを編集したり、別のプラグインをインストールしたりすることはありません。対応ツール:database_cleanup、clear_cache(オブジェクトキャッシュ、書き換えルール、OPcache、および 11 種類のキャッシュプラグイン)、image_optimization_report、list_autoloaded_options。

レポートで通常最も大きな割合を占めるのは画像の容量で、実際に容量を減らすツールが optimize_image です(メディアと画像を参照してください)。


コーディングエージェントからの WordPress の編集

プラグインを接続すると、Claude Code、Codex、Gemini CLI、Cursor、Copilot などのコーディングエージェントは、リポジトリで作業するときと同じようにサイトを操作できます。

したいことツール
何かが定義されている場所を探すsearch_files(インストール全体を grep で検索)、file_info
テーマやプラグインのコードを編集するread_file、edit_file(完全一致で置換、追記、先頭に追加)、write_file(PHP 構文チェック済み、バックアップあり)
問題のある編集を元に戻すlist_backups、restore_file
問題のある データ 変更を元に戻すlist_operations、undo_operation
テーマを適切にカスタマイズするcreate_child_theme でひな形を作成し、copy_file でテンプレートをコピーして上書き
Elementor/Divi/WPBakery/ブロックで構築されたページを編集するdetect_page_builder、get_page_structure、edit_page_element、insert_page_section、render_page_preview
サイト全体のスタイルを変更するmanage_global_styles
ナビゲーションを再構成するlist_menus、save_menu、manage_menu_items
サイドバーを変更するlist_widgets、save_widget
ブランドを変更するmanage_site_identity、theme_customizer
コンテンツを大規模に修正するsearch_replace_content(ドライラン)、bulk_update_content、batch
ページをロールバックするlist_revisions、restore_revision
スタックを管理するupdate_plugin、install_theme、save_user、manage_cron、manage_permalinks
デバッグするmcp_status、get_error_log、get_audit_log、site_health、describe_tables

ファイルシステムとサイト管理のグループは、デフォルトでは無効です。作業中は有効にし、終わったら再び無効にしてください。


Google Site Kit ブリッジ

クライアントで Google Site Kit がすでに実行され、接続されている場合、このプラグインはその OAuth を再利用するため、二度目の認証は不要で、Google の認証情報を独自に保存することもありません。WPMCP_SiteKit は接続済みの管理者に一時的に切り替わり、Site Kit 独自の REST ルートに対して内部 GET を発行した後、finally ブロックで以前のユーザーに戻します。

sitekit_search_analytics      ─► request('search-console','searchanalytics', …)
sitekit_keyword_opportunities ─► search-console queries, filtered to positions 5 to 20
sitekit_analytics_report      ─► request('analytics-4','report', …)
sitekit_pagespeed             ─► request('pagespeed-insights','pagespeed', …)
sitekit_get                   ─► request(<module>,<datapoint>, …)   // GET passthrough, read-only

Site Kit へのアクセスはすべて読み取り専用です(GET データエンドポイントのみ)。


セキュリティモデル

脅威モデル。 エンドポイントの認証には 1 つの API キーを使用します。有効化された機能グループ内では、このキーに操作が許可されるため、API キーは最重要資産です。この設計では、デフォルト の攻撃対象領域を小さく保ち、危険な機能は明示的なスイッチの背後に配置します。

実装済みの制御

  • 一定時間の認証処理。 提示されたすべての認証情報(Bearer ヘッダー、X-API-Key/X-WP-MCP-Key、?key=)に対して hash_equals() を使い、途中で処理を終了しません。キーは48文字で、URLセーフです。設定から再生成すると、古いキーは即座に無効になります。

  • ほかの認証プラグインと併用可能。 JWTなどのプラグインはサイト全体のすべての Bearer ヘッダーを取得し、このエンドポイントにリクエストが届く前に拒否します。このルートに限り、有効なMCPキーを含むリクエストは、これらのプラグインによるエラーを解除します。それ以外のRESTルートでは、引き続き保護が適用されます。また、ヘッダーを取り除くApache CGI/FastCGIホストでは、REDIRECT_HTTP_AUTHORIZATION から Authorization ヘッダーを復元します。

  • 明確な認証エラー。 キーがない場合や誤っている場合は、JSON-RPCボディと、OAuthメタデータを含まないシンプルな WWW-Authenticate: Bearer チャレンジを付けて 401 を返します。これにより、クライアントは成功しないOAuth検出を開始せず、「キーが必要」と報告します。

  • オリジン検証(厳格モードはオプトイン)。 このエンドポイントはCookieを一切受け付けないため、別のオリジンにあるブラウザページはキーなしでは何もできず、デフォルトではすべてのオリジンが許可されます。wpmcp_allowed_origins フィルターからリストを返すと、それ以外のすべてのオリジンを 403 で拒否します。

  • ブルートフォース攻撃時のロックアウト。 IPごとに失敗回数を記録(一時データ)し、失敗が10回に達すると、エンドポイントは15分間 429 を返します。認証に成功するとカウンターがリセットされます。多くの公開クライアントサイトで使われるキーを保護します。

  • Cookie/CSRFの攻撃対象領域なし。 このエンドポイントはAPIキーのみで認証し、WordPressのログインCookieを受け付けないため、クロスサイトリクエストが管理者セッションを悪用することはできません。

  • サーバー側の権限チェック。 tools/list から隠すだけでなく、dispatch() で強制されます。無効化されたグループのツールにはアクセスできません。

  • デフォルトで安全なグループ。 新規インストールでは、Filesystem、Raw Database、Site Managementはオフです。

  • メディア取り込みの強化。 すべてのアップロード経路(URL、base64、サーバーパス)で、ファイル名を get_allowed_mime_types() に照合して検証し、スクリプト/実行可能ファイルの拡張子(php、phtml、phar、svg、htmlなど)を拒否します。また、書き込んだデータを wp_check_filetype_and_ext で再検証し、「shell.php を /uploads にアップロードする」RCE経路を塞ぎます。サーバーの path から画像を読み込む場合は、Filesystem機能も必要であり、realpath によりWordPressルート内に制限されます。

  • 外部リクエストを検証。 wp_remote_* に渡されるURL(外部からの取り込み、リンクチェック、サイトマップの取得、ページ測定)は wp_http_validate_url() を通るため、サーバーを使って localhost やプライベートIP範囲を調べることはできません。

  • パスの包含制御。 safe_path() は .. セグメントとNULバイトを拒否し、realpath で解決したうえで、末尾のセパレーターを含めて比較し、結果がWPルートそのものか、その配下に実際に含まれるパスであることを確認します(そのため、/var/www/htmlX のような兄弟ディレクトリが /var/www/html の配下を装うことはできません)。新しいネストされたパスは、最も近い既存の親ディレクトリを基準に解決されます。

  • 「読み取り専用」のSQLは読み取り専用です。 sql_query では、先頭が SELECT/SHOW/DESCRIBE/EXPLAIN であることを必須とし、さらに INTO OUTFILE、INTO DUMPFILE、LOAD_FILE() をブロックします。

  • 書き込みSQLの保護。 sql_execute は DROP、TRUNCATE、および WHERE 句のない DELETE/UPDATE を、confirm=true が渡されない限り拒否します。また、両方のSQLツールでSQLレベルのファイル入出力をブロックするため、データベースグループを使ってファイルシステムの権限制御を迂回することはできません。

  • 保存型XSSへの対策。 JSON-LDの出力は16進エスケープされます。llms.txt、robots.txt のルール、IndexNowのキーファイルはプレーンテキストとして配信されます。

  • ユーザーデータのアクセス範囲。 ユーザーメタ(メールアドレス、wp_capabilities)の読み書きには、Site Management機能が必要です。

  • 個人データは独立したスイッチで管理。 注文、返金、顧客レコードは wc_orders に含まれ、デフォルトではオフです。そのため、カタログやSEOの作業で名前、メールアドレス、住所へのアクセスが許可されることはありません。

  • ログにシークレットは残りません。 監査ログと取り消しジャーナルでは、保存前に content、base64、password、api_key、key、secret、token 引数をマスキングします。

  • PHPは書き込む前に解析されます。 コンパイルできないファイルの書き込みは拒否されます。テーマファイルの致命的エラーはサイトとこのエンドポイントの両方を停止させ、復旧する手段がなくなるためです。

  • 自動バックアップと復元。 上書きまたは削除のたびに、以前のバージョンがuploads内の保護されたディレクトリ(.htaccessによる拒否+index.php)にコピーされます。restore_file で復元でき、最大100件まで保存されます。

  • ストア設定は許可リストで管理。 update_store_settings が受け付けるのは、固定リストにあるWooCommerceオプションのみです。この機能を経由して決済ゲートウェイの認証情報にアクセスすることはできません。

  • 返金はデフォルトで手動です。 refund_order は via_gateway=true が指定されない限り決済ゲートウェイを呼び出さずに返金を記録し、返金可能な残額を超えることもありません。

  • 自己保護。 プラグイン自身の無効化や削除、および自身のAPIキーを保持するオプションの削除を拒否します。これらの操作によって、セッション中に接続が通知なく切断されるのを防ぎます。

  • HTTPSの注意喚起。 キーはすべてのリクエストで送信されるため、エンドポイントがHTTPSでない場合は設定画面で警告します。

  • エラーからパス情報が漏れません。 エラーペイロード内のファイルパスは、絶対パスではなくWordPressルートからの相対パスで報告されます。 接続とキー

  • すべての制限は、呼び出しごとに適用されます。 キーのプリセット、グループ、読み取り専用フラグは、batch の各ステップや各リソースの読み取りも含め、呼び出しごとにディスパッチャーで確認されます。tools/list から非表示にするだけではありません。別のグループのデータにアクセスするツールは、そのグループの権限も確認します。ユーザーメタ情報の読み取りには接続の Site Management 権限が必要です。また、サーバーパスから画像を読み取るには接続の Filesystem 権限が必要です。

  • 承認によってキーの権限が拡大することはありません。 キューに入れられた batch の各ステップは、キューに入れる際にリクエスト元のキーに対して確認されます。承認後も変更はリクエスト元のキーとして、そのスコープ内で実行され、レビュアーの権限は使われません。キューに入れた後で無効化されたキーからのリクエストは承認できません。キューを経由しないのは、dry_run=true で実際にプレビューを行うツールだけです。

  • ツールは実際のユーザーとして実行され、制限付きキーでは HTML フィルタリングが適用されます。 オーナーキーは管理者として動作します。それ以外のキーは、そのキーを作成または承認した管理者として動作するため、投稿には作成者が設定されますが、WordPress の HTML フィルタリング(kses)は有効のままです。制限付きキーでは、訪問者や管理者が読み込むコンテンツにスクリプトを保存できません。ユーザーの選択には wpmcp_owner_user_id フィルターを使用します。

  • 元に戻す履歴はキーごとに管理されます。 接続から一覧表示および元に戻せるのは、その接続自身の操作のみです。オーナーキーからはすべての操作を確認できます。

  • キーはハッシュとして保存されます。 接続キーと OAuth トークンは SHA-256 でハッシュ化され、一度だけ表示されます。リフレッシュトークンはローテーションされ、各クライアントに紐付けられます。

  • ロックアウトを悪用されることはありません。 有効なキーであれば、ロックアウトされたアドレスからでも必ずアクセスできます。期限切れのトークンや無効化されたキーは推測回数に数えられないため、共有プロキシを多くのユーザーが利用していても、全員がロックアウトされることはありません。

エージェントが変更できないデータ

  • 保護されたメタキー。 汎用メタツールでは、添付ファイルのパスやメタデータ、ページテンプレート、ユーザー権限、セッショントークンなど、WordPress が信頼された内部状態として扱うキーや、このプラグイン独自の _wpmcp_* キーは使用できません。それぞれに、専用の検証済みツールがあります。
  • ファイル操作は uploads 内に限定されます。 画像の最適化、復元、サムネイルのクリーンアップで変更されるのは、ファイルが uploads フォルダー内にある添付ファイルだけです。
  • シークレットは保護されます。 read_file、search_files、copy_file では、wp-config.php、.env ファイル、秘密鍵、プラグインのバックアップを使用できません。オプションツールでは、このプラグインのオプションと WordPress のソルトを使用できません。サイト所有者は wpmcp_allow_secret_file フィルターで特定のファイルを許可できます。
  • 非公開の投稿タイプにはアクセスできません。 コンテンツツールでは、WooCommerce の注文、プライバシー関連のリクエスト、その他の内部タイプを使用できません。注文には独自のグループがあり、デフォルトでは無効です。
  • フェッチツール経由でリクエストフォージェリはできません。 URL を取得するツールでは WordPress の安全な HTTP 関数を使用します。この関数はリダイレクト後も含め、プライベートアドレスやループバックアドレスへのアクセスを拒否します。メディアのダウンロードと base64 アップロードは 25 MB 以下に制限されます。
  • バックアップは非公開です。 ファイルのバックアップは、ランダムな名前のフォルダーにランダムなファイル名で保存され、Apache と IIS の拒否ルールが設定されます。そのため、.htaccess を無視するサーバーでも推測してアクセスすることはできません。
  • バックスラッシュは保持されます。 エージェントの入力から書き込まれるデータはすべて、WordPress が想定する形式でスラッシュ処理されるため、ブロックのマークアップ(\u003c)、Windows パス、メタ内の JSON はバイト単位でそのまま読み戻せます。

サインイン(OAuth)

  • ログインしていない訪問者に対しては何も起こりません。同意ページで先にログインするため、オープンリダイレクトとして悪用したり、サイトに任意の URL を取得させたりすることはできません。
  • 同意ページではすべてのアプリケーションを未検証として表示し、リダイレクト先のアドレス全体を示し、読み取り専用アクセスをあらかじめ選択します。
  • キーが作成されるのはサインイン完了時のみで、再度サインインした場合は同じキーが再利用されます。登録にはサイズ上限があり、アドレスごとにレート制限が適用されます。

運用ガイダンス

  • クライアントごとに別々のキーを使用し、決して使い回さないでください。
  • Filesystem/Raw Database/Site Management は必要な期間だけ有効にし、その後は無効に戻してください。
  • パブリックインターネット経由で接続する前に、クライアントサイトをHTTPSで提供してください。
  • 無人実行後に get_audit_log を確認してください。これはエージェントが実際に行った操作の記録です。
  • キーは管理者パスワードと同じように扱ってください。キーを持つ人は、有効になっているグループで許可された操作をすべて実行できます。

ワークフロー:代理店での利用方法

1. ONBOARD a client
   └─ Install + activate the plugin on their WP site
   └─ Copy endpoint + key from the WordPress MCP screen
   └─ Paste the snippet for your AI client (Claude, ChatGPT, Codex, Gemini, Cursor, Copilot …)
   └─ Run the site_briefing prompt

2. ORIENT (read-only, default-safe)
   └─ site_info / mcp_status / seo_status     → stack, engine, what is enabled
   └─ detect_page_builder <id>                → what actually builds their pages
   └─ seo_audit / product_seo_audit           → missing meta, thin content, dupes, missing alt
   └─ sitemap_audit / find_broken_links       → what Google is being told, and what is dead
   └─ performance_audit                       → ranked speed issues and a score
   └─ sitekit_keyword_opportunities           → striking-distance quick wins (pos 5-20)

3. PLAN
   └─ analyze_content <id>                    → per-page keyword placement, structure, AEO gaps
   └─ internal_link_opportunities <id>        → where inbound links should come from
   └─ inventory_report / store_report         → what is out of stock, what actually sells

4. SNAPSHOT before anything risky
   └─ create_restore_point post_type=product  → one ID that puts the whole set back

5. IMPLEMENT
   └─ get_image_bytes                         → look at the photo before writing about it
   └─ set_seo / bulk_set_seo / product_seo_fix → meta written to the live engine, dry run first
   └─ generate_product_schema apply=true      → Merchant-grade JSON-LD
   └─ publish_content / update_content        → ship optimised posts and pages
   └─ edit_page_element                       → change builder pages without breaking layout
   └─ bulk_update_products                    → copy, pricing, sales, stock (preview first)
   └─ batch                                   → fifty edits in one request
   └─ manage_llms_txt / manage_robots_txt     → AEO/GEO crawl signals
   └─ manage_redirects / indexnow_submit      → 301 old URLs, then tell the engines

6. SPEED UP
   └─ optimize_site preset=safe dry_run=true  → review the plan
   └─ optimize_site preset=safe dry_run=false → apply
   └─ optimize_image / database_cleanup       → cut page weight, clear the junk

7. VERIFY
   └─ render_page_preview / analyze_content   → confirm what actually landed
   └─ analyze_page_speed                      → prove the speed change
   └─ get_audit_log / get_error_log           → what was done, and whether anything failed quietly
   └─ undo_operation <id>                     → if the client hates it, take it back

8. (optional) DEEP OPS: enable a powerful group only when needed
   └─ read_file / edit_file / create_child_theme   → filesystem
   └─ update_plugin / save_user / manage_cron      → site_mgmt
   └─ sql_query / describe_tables                  → database
   …then switch the group back off.

最初から最後まで実行できるプロンプト

「ウェブサイトを高速化してください。」 → performance_audit → optimize_site(プレビューしてから適用) → optimize_image → analyze_page_speed で変更前後を表示します。

「すべての商品写真に適切な代替テキストを書いてください。」 → get_image_bytes → 確認 → manage_product_images または bulk_set_image_alt。

「サービスページのヒーロー見出しを変更してください。」 → detect_page_builder → get_page_structure → edit_page_element → render_page_preview。

「Winter カテゴリーの商品をすべて、31日まで20%オフにしてください。」 → bulk_update_products で price_adjust と sale_to を指定します。まずドライランを実行し、クライアントが変更を希望した場合は undo_operation を実行します。

「新しいページが Google にインデックスされないのはなぜですか?」 → sitemap_audit → set_seo で noindex を修正 → indexnow_submit。

「検索で不利になっている商品はどれですか?」 → product_seo_audit → sitekit_search_analytics → product_seo_fix。


拡張

ツールを追加するには、そのグループのトレイト(includes/tools/trait-wpmcp-*.php)内で、次の2つの手順を行います。

  1. そのトレイトの defs_*() メソッドに、定義(group、name、description、inputSchema)を追加します。
  2. その隣に tool_<name>( $args ) ハンドラーを追加し、シリアライズ可能な配列を返します。

registry() は慣例に従って name → tool_<name> を対応付けるため、中央のコードを変更する必要はありません。引数の検証、ケイパビリティゲート、エラーの型付け、アンドゥジャーナル、監査ログ、JSON-RPC エンベロープはすべて自動的に適用されます。

適切なエラー処理。 単なる文字列ではなく、コードとヒントを付けてスローしてください。そうすることで、エージェントが自力で復旧できるようになります。

WPMCP_Errors::fail(
    WPMCP_Errors::NOT_FOUND,
    sprintf( 'Product %d was not found.', $id ),
    'Use list_products to find the right ID, or pass sku to get_product.',
    [ 'id' => $id ]
);

WPMCP_Errors::from_wp_error( $wp_error, $code, $hint ) は WP_Error を変換し、そのデータを保持します。ハンドラーがそれ以外のものをスローした場合も、捕捉され、型付けされ、ログに記録されたうえで tool_failed として返されるため、バグが発生しても500エラーではなく、内容を把握できる応答が返されます。

書き込み操作を取り消し可能にする。 上書きする前にスナップショットを取得してください。ハンドラーの実行中は、すでにジャーナルが開かれています。

WPMCP_Journal::post_meta( $post_id, '_my_meta_key' );   // or ::post_seo(), ::option(),
update_post_meta( $post_id, '_my_meta_key', $value );   // ::post_fields(), ::product()

これだけで完了です。dispatch() がジャーナルを閉じ、結果に operation_id を返し、undo_operation がその内容を再実行します。

長時間の実行でも適切に動作させる。 ツールが大規模なセットを処理する場合は、進捗を報告し、予算を守ってください。

WPMCP_Progress::start( 'my_tool', count( $items ) );
foreach ( $items as $i => $item ) {
    if ( WPMCP_Progress::should_stop() ) {
        return WPMCP_Progress::stopped_early( $offset + $i, $total, 'my_tool' );
    }
    WPMCP_Progress::tick();
    …
}

守るべき規約

  • サイト全体に書き込みを行うものには dry_run を指定し、デフォルト値は true にします。
  • 非ラテン文字のサイトを正確に計測できるよう、str_word_count()/strlen() ではなく WPMCP_Util::word_count()/::len() を使用します。
  • success、影響を受けた id、および呼び出し元が2回目の呼び出しなしで確認できるだけの状態を返します。
  • 次の手順が想定される結果には next_step を追加します。これにより、ツールがワークフローになります。

ケイパビリティグループ全体を追加するには、WPMCP_Settings::groups() に追加し、includes/tools/trait-wpmcp-<group>.php を作成してから、class-wpmcp-tools.php で require_once と use を追加し、その defs_*() を definitions() に加えます。


リリース履歴

すべてのバージョンの詳細な変更内容:リリース。

バージョン概要ツール
2.1.0同じ開発者によるオープンソースの SEO、AEO、GEO プラグインである PSEOEWP と連携します。有効にすると、SEO ツールは PSEOEWP のフィールドを読み書きし、manage_redirects に 410 と正規表現のルールが追加され、llms.txt と IndexNow の情報源が一元化されます。また、4 つの新しいツール ai_readiness_audit、set_short_answer、ai_visibility_report、pseoewp_settings が利用可能になります。PSEOEWP がなければ変更はありません。165 + 4
2.0.0すべての MCP クライアントで動作し、チームがサイトを安全に共有できます。プリセット、読み取り専用アクセス、有効期限、承認キューに対応した接続キー。WordPress でサインイン(OAuth 2.1)。接続テストと Site Health チェック。wp mcp WP-CLI コマンド。構造化出力とリアルタイムの進捗表示。MCP Registry への掲載、新しいロゴ、公式クライアントのロゴ。プロトコルサポート:プロトコルバージョン 2024-11-05 から 2026-07-28 までに対応する、仕様準拠の Streamable HTTP。ステートレスな server/discover も含みます。ツールスキーマが Claude、OpenAI、Gemini で読み込まれ、set_meta / update_option が拒否される問題が解消されます。ツールのアノテーションとタイトル、すぐに使えるプロンプト、wordpress:// リソース、search / fetch、接続ごとの ?groups= スコープ設定、X-API-Key 認証、JWT 形式の認証プラグインとの互換性、11 クライアント向けの接続スニペットが追加されます。取り消し機能が search_replace_content、update_content、set_meta、update_option にも対応します。165
1.4.0エージェントが画像を確認できるようになり、すべての書き込みを元に戻せるほか、リクエストごとに 50 回の呼び出しが可能です。メディア取り込みエンジン(URL / base64 / サーバーパス、SEO 向けファイル名、重複排除、WebP)、取り消しジャーナルと復元ポイント、batch、リンク切れチェック、サイトマップ監査、IndexNow、Merchant 品質の商品スキーマ、ソーシャル画像の SEO フィールド、監査ログ、リアルタイムの進捗表示、長時間実行向けの時間制限を備えています。162
1.3.0ページビルダー対応の編集(Elementor、Gutenberg、Divi、WPBakery)、注文と返金を含む WooCommerce ストアの全操作、サイト速度の監査と最適化、メニューとウィジェット、構文チェック付きのファイル書き込みと自動バックアップを備えた構造化エラー処理に対応します。140
1.2.0高度な SEO/AEO/GEO:コンテンツ分析、スキーマ生成、内部リンク検索、AI クローラー向け robots.txt 制御、リダイレクト管理、Search Console のキーワード機会、ファイルの直接編集、ブルートフォース認証保護。55
1.1.0URL のみを使用するコネクター向けの URL 内キー対応と、Site Kit のユーザー解決の修正。46
1.0.0初回リリース:JSON-RPC MCP エンドポイント、エンジンに依存しない SEO、WooCommerce、Site Kit、JSON-LD、llms.txt、機能グループ。46

プロトコルへの準拠

MCP 仕様に基づいて構築されています。公式の TypeScript および Python SDK クライアント、Claude Code を使用してエンドツーエンドでテストされており、Gemini CLI との接続も確認済みです。

領域動作
トランスポートStreamable HTTP、単一エンドポイントです。POST は application/json を返します。サーバーから開始するストリームがなく、終了するセッションもないため、GET と DELETE は Allow: POST を付けて 405 を返します。
バージョンハンドシェイク方式の 2024-11-05、2025-03-26、2025-06-18、2025-11-25 では、initialize はサポートされているバージョンをエコーし、それ以外の場合は 2025-11-25 を提示します。ステートレス方式の 2026-07-28 では、_meta["io.modelcontextprotocol/protocolVersion"] を含むリクエストに対して、server/discover、resultType、リストの ttlMs / cacheScope、および Mcp-Method / Mcp-Name ヘッダーのチェックを行います。
ヘッダーサポートされていない MCP-Protocol-Version は 400 を返します。レスポンスではネゴシエートされたバージョンをエコーします。CORS はブラウザベースのクライアント向けに MCP ヘッダーの送信を許可し、公開します。
メッセージ通知とクライアントからのレスポンスは、本文なしで 202 を返します。バッチ(2025-03-26 の改訂版で許可されました)にも応答します。解析エラーは -32700、不明なメソッドは -32601 を返します。
セッションステートレスです。Mcp-Session-Id は発行されず、クライアントから送信された場合も無視されます。
認証静的 API キー(MCP 認証は任意)です。401 には、OAuth リソースのメタデータを含まないプレーンな Bearer チャレンジが付属します。
ツールtitle、annotations、ポータブルな inputSchema を備えています。エラーは、機械可読な code と hint を含む isError 結果として返されます。画像はネイティブの image コンテンツブロックです。

ライセンス

GPL-2.0-or-later。LICENSE をご覧ください。

クライアントのロゴは、それぞれの企業のブランドキットに含まれる公式マークです。Gemini のアイコンは Simple Icons(CC0)から取得しています。Google のブランドキットにはパートナーのログインが必要なためです。すべてのロゴは各所有者の商標であり、互換性を示す目的でのみ掲載されています。提携または推奨を意味するものではありません。出典と使用条件:assets/clients/。

作者

Konko Maji が作成しました(LinkedIn)。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。