WordPress MCP Server
by javeo2022
README.md
# WordPress MCP Server for Claude Code
Claude Code(Desktop)から WordPress を直接操作するための MCP サーバーです。
Python 製で、公式 `mcp` パッケージの FastMCP を使い、WordPress REST API(`/wp-json/wp/v2/`)をアプリケーションパスワード認証で叩きます。
サイトは `.env` に書いた分だけいくつでも登録でき、ツールの `site` 引数で切り替えられます。
- 作り方・使い方の解説記事:[Claude CodeでWordPress自動投稿【MCP活用】](https://javeo.jp/claude-code-wordpress-mcp-xserver/)
- このサーバー自体、Claude Code に「こういうサーバーを作って」と頼んで 1 ツールずつ育てたものです
- テーマ・SEO プラグイン・サーバー会社に依存する処理は入っていません(メタディスクリプションの書き込み先だけ環境変数で選びます。下記)
## できること(ツール 18 個)
| 種類 | ツール |
|---|---|
| 接続確認 | `check_connection`(登録済みサイトの一覧も返す) |
| 投稿(post) | `create_post` / `update_post` / `get_post` / `list_posts` / `delete_post` |
| 固定ページ(page) | `create_page` / `update_page` / `get_page` / `list_pages` / `delete_page` |
| カテゴリ・タグ | `list_categories` / `create_category` / `list_tags` / `create_tag` |
| Markdown 入稿 | `post_from_markdown_file`(frontmatter 付き md を 1 コマンドで投稿・更新)/ `markdown_to_html` |
| メディア | `upload_media`(ローカル画像をメディアライブラリへ、`alt_text` 付き) |
- `status` の既定値は **draft**(公開は明示したときだけ)
- カテゴリ・タグは名前でも ID でも渡せます(名前が無ければ新規作成)
- `featured_media` にメディア ID を渡すとアイキャッチも設定できます(投稿のみ)
- `meta` に任意の post meta を渡せます(キーは REST 公開されている必要があります)
## セットアップ
### 1. ライブラリのインストール
```bash
pip install -r requirements.txt
```
### 2. 認証情報(.env)
`.env.example` をコピーして `.env` を作り、値を埋めます。**`.env` は `.gitignore` 済みなのでコミットされません。**
```bash
cp .env.example .env
```
アプリケーションパスワードは WordPress 管理画面の「ユーザー → プロフィール → アプリケーションパスワード」で発行します。普段のログインパスワードは使いません。
発行するユーザーは管理者ではなく**編集者ロール**にしておくのがおすすめです(漏れたときの被害を記事の範囲に限定できます)。
サイトは `WP_<NAME>_BASE_URL` / `WP_<NAME>_USERNAME` / `WP_<NAME>_APP_PASSWORD` の 3 つを 1 組として登録します。`<NAME>` を小文字にしたものがサイト名になります(`WP_BLOG_*` → `site="blog"`)。何組書いても構いません。
| 環境変数 | 内容 |
|---|---|
| `WP_<NAME>_BASE_URL` | サイトの URL(例 `https://example.com`) |
| `WP_<NAME>_USERNAME` | WordPress のログインユーザー名 |
| `WP_<NAME>_APP_PASSWORD` | アプリケーションパスワード(スペース込みのままで可) |
| `WP_<NAME>_AUTHOR_ID` | 任意。新規作成する投稿・固定ページの著者ユーザー ID(更新には影響しない) |
| `WP_DEFAULT_SITE` | 任意。`site` を省略したときに使うサイト名(未設定なら `blog` があれば blog、無ければ最初に見つかったサイト) |
| `WP_META_DESCRIPTION_KEY` | 任意。frontmatter の `meta_description` を書き込む post meta のキー(既定 `ssp_meta_description` = SEO SIMPLE PACK。空にすると書き込まない)。サイト別に変えるなら `WP_<NAME>_META_DESCRIPTION_KEY` |
旧キー `WP_BASE_URL` / `WP_USERNAME` / `WP_APP_PASSWORD` は `blog` サイトの別名として今も認識します。
### 3. Claude Code への登録(.mcp.json)
作業フォルダ直下に `.mcp.json` を置くと、Claude Code(Desktop)がそのフォルダを開いたときに自動で検出します。パスはご自身の環境に合わせてください。
```json
{
"mcpServers": {
"wordpress": {
"command": "python",
"args": ["C:\\path\\to\\wp_mcp_server.py"],
"env": {}
}
}
}
```
チャット版の Claude Desktop で使う場合は、`claude_desktop_config.json`(Windows は `%APPDATA%\Claude\`)に同じ形で書きます。
### 4. メタディスクリプションを書き込みたい場合(任意)
SEO プラグインのメタ欄は、標準では REST API から書き込めません(WordPress 側で `register_post_meta(..., show_in_rest: true)` されている必要があります)。
- **SEO SIMPLE PACK(+ SWELL)の場合**:同梱の `mu-plugins/ssp-meta-rest.php` を `/wp-content/mu-plugins/` に置くと、`ssp_meta_description` と SWELL の投稿別 CSS(`swell_meta_css`)が REST 公開されます(フォルダが無ければ作成、置くだけで有効化)。JavaScript(`swell_meta_js`)はあえて公開していません。認証情報が漏れたときに任意のスクリプトを注入されるリスクがあるためです
- **ほかの SEO プラグインの場合**:そのプラグインのメタキーを REST 公開する小さな mu-plugin を用意し、`.env` の `WP_META_DESCRIPTION_KEY` にそのキー名を書きます(例 Yoast なら `_yoast_wpseo_metadesc`)。mu-plugin の書き方は同梱ファイルが雛形になります
- **メタを書かない場合**:`WP_META_DESCRIPTION_KEY=` と空にしておくと、`meta_description` があっても送りません
## 使い方
Claude Code のチャットで自然言語で頼めます。
```
WordPressの接続確認をして
```
```
articles/my-post.md を下書きとして投稿して
```
```
下書きの一覧を出して
```
```
thumbnail/my-post.png をアイキャッチ用にアップロードして、さっきの投稿に設定して
```
## Markdown frontmatter
`post_from_markdown_file` に渡す md ファイルの先頭に書きます。`id` があれば更新、無ければ新規作成して `id` を書き戻します。
```yaml
---
title: 記事タイトル # 必須
status: draft # draft / publish / future / pending / private
slug: my-article-slug
excerpt: 抜粋
meta_description: メタディスクリプション # WP_META_DESCRIPTION_KEY のキーに書き込む(要 REST 公開)
date: 2026-09-20T09:00:00 # 予約投稿用(status: future)
format: gutenberg # markdown(既定) / gutenberg / html(変換せずそのまま送る)
site: blog # .env で登録したサイト名(省略時は WP_DEFAULT_SITE)
post_type: post # post(既定) / page
categories: ["カテゴリ名"] # 名前 or ID
tags: ["タグ1", "タグ2"] # 名前 or ID
featured_media: 1234 # メディア ID(投稿のみ)
# 固定ページのみ
# parent: 10
# menu_order: 1
# meta: # 任意の post meta(キーは REST 公開されていること)
# some_meta_key: "value"
id: 5678 # 更新時。新規作成後に自動で書き戻される
---
```
未知のキー(例 `focus_keyword`)は WordPress に送らず無視します(ローカルのメモとして置けます)。
## 安全側の設計
- 投稿の既定は `draft`。公開は `status: publish` を明示したときだけ
- 認証情報は `.env` からのみ読む(コードに書かない・コミットしない)
- 触れる範囲は REST API の投稿・固定ページ・メディア・カテゴリ・タグと、REST 公開したメタだけ。サイト全体の設定やプラグイン設定には触れません
## 動作確認環境(2026-09 時点)
- Windows 11 / Python 3.13
- WordPress 6.9 以降(アプリケーションパスワードが使える 5.6 以降なら動く想定)/ SWELL + SEO SIMPLE PACK
- Claude Code Desktop
## 更新履歴
- 2026-09-20:汎用化。サイトを `.env` の `WP_<NAME>_*` から自動発見(名前・数の制限なし)、既定サイトを `WP_DEFAULT_SITE` で指定可、メタディスクリプションの書き込み先を `WP_META_DESCRIPTION_KEY` で変更可、docstring から特定サイト・テーマの前提を除去
- 2026-09-20:現行版に同期。`WP_<NAME>_AUTHOR_ID` による著者固定、`requirements.txt` を実際の import(`mcp`)に合わせて修正、補助プラグイン `mu-plugins/ssp-meta-rest.php` を同梱
- 2026-06-14:初版
## ライセンス
MIT
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues