Skip to main content
Glama
nao9net

WordPress MCP Server

by nao9net
README.md
# WordPress MCP Server(セルフホスト・マルチサイト対応版)

自前運営の複数WordPressサイトを、WordPress標準のREST API (`wp-json/wp/v2`) 経由で
1つのMCPサーバーからまとめて操作するためのローカルサーバーです。

各ツール呼び出し時に `site` パラメータ(エイリアス)でどのサイトを操作するか指定します。
投稿の一覧・作成・更新・削除、カテゴリ/タグ管理、メディアアップロード、コメント承認などができます。

---

## 1. WordPress側の準備:サイトごとにアプリケーションパスワードを発行する

**管理するサイトそれぞれ**で以下を行います。WordPress 5.6以降なら追加プラグイン不要です。

1. 各WordPressサイトの管理画面にログイン
2. `ユーザー` → `プロフィール` を開く
3. ページ下部の「アプリケーションパスワード」欄に任意の名前(例: `claude-mcp`)を入力し、
   「新規追加」をクリック
4. 表示される `xxxx xxxx xxxx xxxx xxxx xxxx` 形式のパスワードをコピーしておく
   (**この画面を閉じると二度と表示されません**)

> ⚠️ サイトが `http://` の場合、多くの環境でアプリケーションパスワード機能が無効化されます。
> 常時HTTPS化(SSL)されているサイトで利用してください。

> ⚠️ セキュリティプラグイン(Wordfenceなど)やレンタルサーバーのWAFが
> REST APIやBasic認証をブロックしている場合、事前に許可設定が必要です。

## 2. このサーバーのセットアップ

```bash
cd wordpress-mcp
npm install
```

`sites.json.example` を `sites.json` にコピーして、管理する全サイトの情報を書きます
(**このファイルには全サイトの認証情報が入るので、絶対に公開・共有・Gitコミットしないでください**。
`.gitignore` に含めています)。

```bash
cp sites.json.example sites.json
```

```json
{
  "blog-a": {
    "url": "https://blog-a.example.com",
    "username": "user-a",
    "app_password": "xxxx xxxx xxxx xxxx xxxx xxxx"
  },
  "blog-b": {
    "url": "https://blog-b.example.com",
    "username": "user-b",
    "app_password": "yyyy yyyy yyyy yyyy yyyy yyyy"
  },
  "blog-c": {
    "url": "https://blog-c.example.com",
    "username": "user-c",
    "app_password": "zzzz zzzz zzzz zzzz zzzz zzzz"
  }
}
```

キー(`blog-a`など)が、会話中でサイトを指定するときの**エイリアス名**になります。好きな名前を付けてOKです。
サイトを増やしたいときは、このファイルにエントリを追加するだけです(コードの変更は不要)。

## 3. Claude Desktop / Claude Code に登録する

このサーバーは純粋なNode.js製で、OS依存のコードは使っていないため **macでもWindowsでも同じように動作**します。
唯一の前提条件は **Node.js 18以降がインストールされていること**です(`node --version` で確認)。

マルチサイト対応版は**サーバー登録は1つだけ**で済みます(サイトの切り替えはツール呼び出し時の`site`パラメータで行うため)。

設定ファイルの場所はOSによって異なります。

- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
  (Claude Desktopの `設定 → Developer → Edit Config` から開くのが確実です)

**macOSの場合の例:**

```json
{
  "mcpServers": {
    "wordpress-multisite": {
      "command": "node",
      "args": ["/Users/あなたの名前/wordpress-mcp/index.js"],
      "env": {
        "SITES_CONFIG_PATH": "/Users/あなたの名前/wordpress-mcp/sites.json"
      }
    }
  }
}
```

**Windowsの場合の例**(パス区切りは `\\` でエスケープするか `/` を使う):

```json
{
  "mcpServers": {
    "wordpress-multisite": {
      "command": "node",
      "args": ["C:\\Users\\あなたの名前\\wordpress-mcp\\index.js"],
      "env": {
        "SITES_CONFIG_PATH": "C:\\Users\\あなたの名前\\wordpress-mcp\\sites.json"
      }
    }
  }
}
```

`SITES_CONFIG_PATH` を省略した場合は、`index.js`と同じフォルダにある `sites.json` を自動的に探しに行きます。

> Windows版Claude Desktop(ストア/MSIXインストール)では、「Edit Config」ボタンが開くファイルと
> 実際に読み込まれるファイルが異なる既知の不具合が報告されています。設定してもツールが表示されない場合は、
> `%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json`
> も確認してください。

Claude Codeの場合は `claude mcp add` コマンド、もしくは同様の設定を
プロジェクトの `.mcp.json` に追加してください(こちらはmac/Windows/Linuxで共通の仕組みです)。

設定後、Claude Desktop/Claude Codeを再起動すると `wp_list_posts` などのツールが使えるようになります。

## 4. 使い方

まず `wp_list_sites` で設定済みサイトのエイリアス一覧を確認し、以降のツール呼び出しで
`site: "blog-a"` のように指定します。

例:「blog-bの下書き一覧を見せて」「blog-cに新しい記事を下書きで作成して」

## 5. 使えるツール一覧

| ツール名 | 説明 |
|---|---|
| `wp_list_sites` | 設定済みサイトのエイリアスとURL一覧を取得(**最初に確認推奨**) |
| `wp_list_posts` | 記事の一覧・検索(ステータス、カテゴリ等で絞り込み可) |
| `wp_get_post` | 記事詳細(本文含む)を取得 |
| `wp_create_post` | 記事を新規作成(既定は下書き) |
| `wp_update_post` | 既存記事を更新 |
| `wp_delete_post` | 記事を削除(既定はゴミ箱、`force`で完全削除) |
| `wp_list_pages` | 固定ページの一覧・検索(ステータス、親ページ等で絞り込み可) |
| `wp_get_page` | 固定ページ詳細(本文含む)を取得 |
| `wp_create_page` | 固定ページを新規作成(既定は下書き) |
| `wp_update_page` | 既存の固定ページを更新 |
| `wp_delete_page` | 固定ページを削除(既定はゴミ箱、`force`で完全削除) |
| `wp_list_categories` | カテゴリ一覧 |
| `wp_create_category` | カテゴリ作成 |
| `wp_list_tags` | タグ一覧 |
| `wp_upload_media_from_url` | URL指定で画像をメディアライブラリにアップロード |
| `wp_list_media` | メディア一覧 |
| `wp_list_comments` | コメント一覧(承認待ちの確認など) |
| `wp_moderate_comment` | コメントの承認/非承認/スパム/ゴミ箱操作 |

(`wp_list_sites` 以外は全て第一引数に `site` エイリアスが必要です)

## 6. 動作確認

```bash
SITES_CONFIG_PATH=/絶対パス/sites.json node index.js
```

「WordPress MCP server (multisite) がstdioで起動しました。登録サイト: ...」と表示され、
設定した全エイリアスが列挙されれば起動成功です。

## 7. 注意事項

- `wp_delete_post` に `force: true` を渡すと完全削除され復元できません。実行前に必ず確認してください。
- アプリケーションパスワードはユーザーの権限をそのまま引き継ぎます。専用の投稿者/編集者アカウントを
  作って、そのアプリケーションパスワードを使うことをおすすめします。
- 記事本文(`content`)はHTML(またはGutenbergブロックHTML)として扱われます。Markdownをそのまま
  渡すとタグとして表示されてしまうので注意してください。
- `sites.json` には全サイトの認証情報がまとまって入るため、ファイルのアクセス権限やバックアップの
  取り扱いに注意してください。