mcp-rs は、AI エージェントから WordPress を操作するための、Rust 製 MCP(Model Context Protocol)サーバーです。Claude などの AI に話しかけるだけで、記事の下書きからメディアの登録、カテゴリーの整理、サイト設定の変更までを任せられます。
最新版は、2026年11月8日に公開した v0.18.4 です。11月6日の v0.18.0 でセキュリティを強化し、v0.18.1 でファイルを指定したメディアのアップロードや認証情報を暗号化するコマンドを、v0.18.2 で WordPress への書き込みの確実性を高め、v0.18.3 でプラグイン機能と投稿のスラッグ指定を加え、v0.18.4 で HTTP 接続でもすべての機能を使えるようにしました。この記事では、mcp-rs でできることと、v0.18 系の更新内容を紹介します。
mcp-rs で WordPress にできること
WordPress の主な操作を、32種類のツールとして AI から利用できます。v0.18.3 からは、プラグインを追加して、WordPress 以外のツールも同じ mcp-rs から使えるようになりました。
| 対象 | できること | 主なツール |
|---|---|---|
| 投稿・固定ページ | 作成、取得、更新、削除、下書き・予約投稿、スラッグの指定 | create_post、create_advanced_post、get_posts、get_pages、get_post、update_post、delete_post |
| カテゴリー・タグ付きの投稿 | 分類を指定した作成、分類の付け替え | create_post_with_categories_tags、update_post_categories_tags |
| 埋め込み・アイキャッチ | YouTube などを含む投稿の作成、アイキャッチ付きの投稿の作成と設定 | create_post_with_embeds、create_post_with_featured_image、set_featured_image |
| メディア | アップロード(データまたはファイルを指定)、取得、更新、削除 | upload_media、get_media、get_media_item、update_media、delete_media |
| カテゴリー | 取得、作成、更新、削除 | get_categories、create_category、update_category、delete_category |
| タグ | 取得、作成、更新、削除 | get_tags、create_tag、update_tag、delete_tag |
| コメント | 取得 | get_comments |
| サイト設定 | 設定の取得・更新、フロントページの切り替え | get_settings、update_settings、set_front_page、set_front_page_to_posts |
| サイト全体の確認 | コンテンツの一括取得、接続状態の確認 | get_all_content、wordpress_health_check |
AI に任せても安心な仕組み
- 新しい投稿は下書きで保存:投稿を作成するツールは、公開状態を指定しない限りすべて下書きとして保存します。AI が作った記事を、内容を確かめてから公開できます
- 編集前に原文を全文取得:
get_postは、ブロックの区切りを含む編集用の原文を、文字数を省略せずに返します。AI が現在の本文を確かめてから更新するので、WordPress 上で手直しした内容を上書きしにくくなります - 操作の結果を AI 自身が確認:
get_postはスラッグとアイキャッチ画像の設定も表示します。AI が設定したあとに、反映されたかを自分で確かめられます - 同じ操作を重ねない:投稿やメディアの作成・削除は、WordPress 側で処理された可能性があるときには送り直しません。作成の重複や、削除済みのものへの削除を防ぎます
- 権限に応じた取得:編集権限のないアカウントでは表示用の HTML に切り替え、閲覧パスワード付きの投稿では本文が伏せられていることを AI に伝えます
redring.jp が実績です
今ご覧の redring.jp は、Claude Code から mcp-rs を通じて作成・更新しています。カテゴリーやタグの設計、記事の投稿、固定ページの管理までを実際のサイトで使い続け、そこで得た知見を mcp-rs の開発に反映してきました。この記事も mcp-rs で投稿したものです。
Claude Code と mcp-rs の組み合わせで、実際に公開サイトを運用できる。そのことを、このサイト自体が示しています。
v0.18.4 の更新内容
v0.18.4 では、HTTP 接続でも、STDIO 接続と同じように MCP のリクエストに応答するようにしました。
- HTTP 接続でも同じ処理:HTTP 接続でも、STDIO 接続と同じ仕組みでツールの呼び出しなどに応答します。
/mcpへの POST で使え、WebSocket を有効にしていれば/wsでも使えます。API キー認証などのチェックは、これまでどおりかかります - 複数のクライアントに対応:複数のクライアントが同じリクエスト ID を使っても応答が入れ替わらないよう、リクエストごとに処理します
- プラグインも HTTP で:v0.18.3 で加えたプラグインも、HTTP 接続で使えるようになりました
- 接続方式の既定:設定の
[transport] typeがstdio・http以外の場合や、指定が無い場合は、STDIO 接続で動きます
HTTP の待ち受けに届く人は、誰でも WordPress やプラグインのツールを呼べます。自分のパソコン以外から届く場所で待ち受ける場合は、v0.18.0 で加えた API キー認証を必ず有効にしてください。
v0.18.3 の更新内容
v0.18.3 では、mcp-rs にプラグイン機能を加え、投稿のスラッグを AI から指定できるようにしました。
プラグイン(段階1)
別の MCP サーバーをプラグインとして mcp-rs から起動し、そのツールを WordPress のツールと並べて使えるようになりました。プラグインは、標準入出力で MCP を話すプログラムであれば、どの言語で作られていてもかまいません。設定ファイルに、プラグインごとに [[plugins]] を追加します。
[[plugins]]
name = "example" # ツール名は example__<ツール名> になる
command = "C:/tools/example-mcp.exe" # 起動するプログラム
args = ["--stdio"]
env = { EXAMPLE_API_KEY = "${EXAMPLE_API_KEY}" }Code language: PHP (php)
- ツールの見え方:プラグインのツールは
<プラグイン名>__<ツール名>の名前で並び、説明の先頭に[plugin: <プラグイン名>]が付きます - 認証情報を渡さない:プラグインには、mcp-rs 本体の環境変数を渡しません。
envで指定したものだけを渡すので、WordPress の認証情報はプラグインに届きません - 本体と同じ守り:プラグインのツール呼び出しにも、レート制限、監査ログ、タイムアウト(既定30秒)、応答サイズの上限(既定1MB)をかけます
- 止まっても本体は動く:起動できないプラグインは警告をログに残して飛ばし、mcp-rs と WordPress のツールはそのまま使えます
- 対応する接続方式:STDIO 接続(Claude Code や Claude Desktop)と、v0.18.4 からは HTTP 接続でも使えます。プラグインをコンテナで隔離する仕組みは、今後の段階で取り組みます
プラグインは、あなたのユーザー権限でそのまま動くので、信頼できるものだけを追加してください。Node.js で動くプラグインは、command に node を、args にスクリプトを指定します。詳しくは プラグインのドキュメントをご覧ください。
スラッグの指定
投稿・固定ページを作成・更新するツールで、slug を指定できるようになりました。日本語のタイトルの記事にも、AI から英語のスラッグを付けられます。これまでのように、管理画面で1件ずつスラッグを直す必要はありません。
- 対象のツール:
create_post、create_advanced_post、create_post_with_featured_image、create_post_with_categories_tags、create_post_with_embeds、update_post - 実際のスラッグを表示:既に使われているスラッグを指定すると、WordPress が
-2などを付けます。結果には実際に付いたスラッグを表示するので、AI がそのまま確かめられます - 省略した場合:これまでどおり、WordPress がタイトルからスラッグを作ります
この記事のスラッグも、mcp-rs の update_post で設定しました。
v0.18.2 の更新内容
v0.18.2 では、WordPress への書き込みの確実性を高め、あわせてコードを整理しました。
- 作成・削除をより確実に:タイムアウトやサーバーエラーが起きたとき、作成(POST)と削除(DELETE)のリクエストは送り直さないようにしました。WordPress 側で処理済みだった場合に、メディアが重複したり、削除できているのにエラーと報告されたりすることを防ぎます。送り直さなかった場合は、結果を確かめてから再実行するよう、エラーメッセージで AI に伝えます
- 取得・更新は従来どおり:取得(GET)と更新(PUT)は、これまでどおり自動で再送します。接続できなかった場合と、リクエストが多すぎるとき(429)は、処理されていないことが確かなので、どの操作でも再送します
- コードの整理:本体とつながっていなかった以前のプラグイン実装、Kubernetes 連携の一部、対話式のセットアップ機能を削除しました。依存クレートも減り、mcp-rs が実際に提供している機能が、コードからも分かりやすくなりました。プラグイン機構は、v0.18.3 で新しい方式として作り直しています
v0.18.1 の更新内容
v0.18.1 では、redring.jp での運用で見えてきた使い勝手を中心に改善しました。
| 分野 | 改善した内容 |
|---|---|
| メディア | 許可したフォルダのファイルを指定してアップロード |
| 認証情報 | 暗号化した認証情報を生成するコマンド |
| 投稿の取得 | 本文の全文取得と、アイキャッチ画像の表示 |
| 投稿の作成 | すべての作成ツールで下書きを既定に統一、アイキャッチ付き投稿の公開状態を指定可能に |
| 安定性 | 削除結果の報告、通知の扱い、設定ファイルの読み込みを改善 |
ファイルを指定してアップロード
upload_media で、mcp-rs が動いているパソコン上のファイルを指定してアップロードできるようになりました。これまでは画像を Base64 の文字列にして渡す必要があり、AI がその長い文字列を書き出していました。ファイルを指定するだけで済むので、大きな画像も確実に送れます。
この機能は既定では無効です。読み込んでよいフォルダを、設定ファイルで明示的に許可します。
[handlers.wordpress]
upload_allowed_dirs = ["C:/Users/me/Pictures/blog"]Code language: JavaScript (javascript)
読み込めるのは、許可したフォルダの中のファイルだけです。パスは .. やシンボリックリンクを解決してから判定するので、許可したフォルダの外には出られません。ファイルの中身は、Base64 で渡した場合と同じ検証を通ります。
認証情報の暗号化コマンド
設定ファイルに貼り付ける暗号化済みの認証情報を、コマンド1つで生成できるようになりました。ユーザー名、アプリケーションパスワード、マスターパスワードを順に入力すると、[handlers.wordpress.encrypted_credentials] のセクションが出力されます。
mcp-rs encrypt-wordpress-credentials
パスワードは入力中も画面に表示されず、コマンドライン引数でも受け付けないので、シェルの履歴に残りません。出力する前に、生成した値を復号して入力と一致することも確かめます。
投稿の取得と作成
- 本文の全文取得:
get_postが、ブロックの区切りを含む編集用の原文を全文返すようになりました。表示用の HTML や、整形したテキストで受け取ることもできます - アイキャッチ画像の表示:
get_postの結果に、アイキャッチ画像のメディア ID と URL を表示します - 下書きを既定に統一:
create_advanced_postとcreate_post_with_embedsも、公開状態を指定しない場合は下書きで保存します - アイキャッチ付きの投稿:
create_post_with_featured_imageで、タイトル・本文・アイキャッチをまとめて設定した投稿を作成でき、公開状態も指定できます
安定性の向上
- 削除結果の報告:
delete_mediaで完全削除したときに、削除の成功を正しく AI に伝えます - リクエストの送り方:WordPress が処理を終えたリクエストは送り直さないようにして、同じ操作が重なることを防ぎます
- MCP の通知:STDIO と HTTP の両方で、MCP の仕様どおりに通知を扱います
- 設定ファイルの読み込み:
--configを省略した場合も、~/.config/mcp-rs/config.tomlなどの設定ファイルを読み込めます
v0.18.0 のセキュリティ強化
v0.18.0 では、セキュリティ機能の導線を整理し、実際のリクエストが通る経路で確実に働くようにしました。あわせて、依存関係も更新しています。
| 分野 | 強化した内容 |
|---|---|
| 認証 | HTTP/WebSocket 接続の API キー認証 |
| レート制限 | WordPress ツール呼び出しの回数制限 |
| 監査ログ | 変更系ツールの呼び出しを追記で記録 |
| 認証情報 | 暗号化した認証情報の保存と利用 |
| メディア | upload_media の入力検証 |
| 依存関係 | 依存クレートの更新と cargo audit の日次実行 |
API キー認証
HTTP/WebSocket 接続で API キー認証を使えるようになりました。キーは Authorization: Bearer <key> または X-Api-Key ヘッダーで送り、無効・失効・期限切れのキーは HTTP 401 で拒否します。キーはメモリ上でハッシュ化され、ログには出力されません。
[transport.http]
auth_enabled = true
[[transport.http.api_keys]]
key = "replace-with-a-long-random-key"
name = "claude-desktop"
user_id = "user-1"Code language: JavaScript (javascript)
auth_enabled の既定は無効で、STDIO 接続は対象外です。ループバック以外で待ち受ける場合は、有効にしてください。${VAR} の展開は対象外のため、key には値をそのまま書きます。
レート制限
WordPress ツールの呼び出しに、サイト接続単位のレート制限を適用します。既定は毎秒10件、バースト20件です。AI が短時間に大量の操作を行っても、サイトへの負荷を抑えられます。
監査ログ
WordPress の変更系ツール(create_*、update_*、delete_*、upload_*、set_*)の呼び出しを、成功・失敗を問わず記録します。入力検証やレート制限で拒否された呼び出しも対象で、ログはファイルに追記されます。AI が何を行ったかを、あとから追跡できます。
認証情報の暗号化保存
WordPress のアプリケーションパスワードを、暗号化して設定ファイルに保存できます。起動時、--config 指定時、動的リロードの3つの読み込み経路すべてに対応しています。復号鍵のマスターパスワードは WORDPRESS_MASTER_PASSWORD 環境変数からのみ読み込みます。Debug 出力でもパスワードを伏せます。設定に書く値は、v0.18.1 で加えた encrypt-wordpress-credentials コマンドで生成できます。
[handlers.wordpress]
url = "https://your-wordpress-site.com"
enabled = true
[handlers.wordpress.encrypted_credentials]
username = "your_username"
encrypted_password = "..."
nonce = "..."
salt = "..."Code language: JavaScript (javascript)
メディアアップロードの検証
upload_media に、MIME の許可リスト、拡張子と MIME の一致、マジックナンバーによる内容の検証、ファイル名の検証、サイズ上限を追加しました。ファイルの種類を多重に確かめることで、格納型 XSS を防ぎます。
依存関係の監査
TLS の証明書検証に関わる rustls-webpki と webpki-roots をはじめ、依存クレートを更新して既知の脆弱性10件のうち9件に対応しました。修正版が提供されていない残り1件(RUSTSEC-2026-0387)は、理由を明記して管理しています。さらに cargo audit が毎日 develop と main を監査し、検知すると Issue を自動で作成します。
以前のバージョンから更新する場合
v0.17 系や v0.18.0〜v0.18.3 をお使いの方には、v0.18.4 への更新をおすすめします。HTTP/WebSocket 接続で運用している場合は、API キー認証もあわせて有効にしてください。更新の際は、次の点をご確認ください。
- 投稿の既定の公開状態:
create_advanced_postとcreate_post_with_embedsも、公開状態を指定しない場合は下書きで保存します。すぐに公開したい場合は、statusにpublishを指定してください upload_mediaの対応形式:許可リストにある画像・PDF・動画・音声を受け付けます。SVG、テキスト、Office 文書(docx など)、mov は対象外です。Base64 で渡す場合のサイズは、10 MiB を上限に、メッセージサイズの設定(既定 1 MiB)に応じて決まります。大きなファイルは、ファイルを指定する方法が便利です- WordPress の認証情報:
enabled = trueの場合は、username/passwordまたはencrypted_credentialsの設定が必要です。無い場合は起動時にエラーでお知らせします - 設定ファイルの準備:設定ファイルは、
configs/production/の設定例をもとに用意します。--setup-configなどのセットアップ用オプションはありません - プラグインを追加する場合:v0.18.1 以前の設定例から作った設定ファイルには、古い
[plugins]が残っていることがあります。[[plugins]]と同じファイルには書けないので、先に削除してください。編集するのは、Claude Code や Claude Desktop の設定で--configに指定しているファイルです - HTTP 接続で使う場合:v0.18.4 から、HTTP 接続でも WordPress とプラグインのツールを使えます。自分のパソコン以外から届く場所で待ち受ける場合は、API キー認証を有効にしてください
- Rust のライブラリとして使っている場合:v0.18.2 でプラグイン関連などの公開モジュールを削除し、v0.18.3 で投稿の作成・更新のパラメーターに
slugを、v0.18.4 で HTTP のリクエスト処理の API を追加しました。詳しくは CHANGELOG をご確認ください
mcp-rs をはじめる
必要なのは、Rust の環境と、アプリケーションパスワードを発行した WordPress サイトです。まず、ソースを取得してビルドします。
git clone --branch v0.18.4 https://github.com/n-takatsu/mcp-rs.git
cd mcp-rs
cargo build --releaseCode language: PHP (php)
すぐに使える設定ファイルが、configs/production/ に用意されています。Claude Code や Claude Desktop から使う場合は、claude-desktop.toml を指定して起動します。WordPress の接続情報は、環境変数 WORDPRESS_URL、WORDPRESS_USERNAME、WORDPRESS_PASSWORD から読み込みます。
./target/release/mcp-rs --config configs/production/claude-desktop.toml
パスワードを設定ファイルや環境変数に平文で置きたくない場合は、encrypt-wordpress-credentials コマンドで暗号化した認証情報を使えます。
Claude Code から使う
redring.jp と同じ構成です。ビルドした mcp-rs を、絶対パスで Claude Code に登録します。-- より後ろが mcp-rs の起動コマンドです。
claude mcp add mcp-rs --scope user \
-e WORDPRESS_URL=https://your-wordpress-site.com \
-e WORDPRESS_USERNAME=your_username \
-e WORDPRESS_PASSWORD="your application password" \
-- /path/to/mcp-rs/target/release/mcp-rs --config /path/to/mcp-rs/configs/production/claude-desktop.tomlCode language: JavaScript (javascript)
接続は claude mcp list、または Claude Code の中で /mcp を実行して確認できます。-e で渡した値は Claude Code の設定に保存されるため、実際の認証情報を共有用の .mcp.json に書き込む --scope project は使わないでください。詳しくは Claude Code 統合ガイドをご覧ください。
Claude Desktop から使う
Claude Desktop から使う場合の設定は、Claude Desktop 連携ガイドをご覧ください。
さいごに
ライセンスは MIT と Apache-2.0 のデュアルライセンスです。変更の全体は CHANGELOG にまとめています。
ご自身の WordPress サイトでも、ぜひ試してみてください。感想や不具合の報告は GitHub Issues でお待ちしています。