Bulk edit Yoast SEO and Rank Math meta on WordPress from Claude Code or Claude Desktop. MCP server for the Bulk SEO Meta Editor plugin: bulk update titles and descriptions, image alt text, JSON-LD schema, CSV import and export, taxonomy and CPT archives.
Strong tool naming (verb_noun pattern) and comprehensive schemas across 9 tools. Descriptions are detailed and actionable, averaging ~180 chars. All tools have input schemas with proper types and constraints. However, output schemas are not documented, LLMs cannot predict response structure. Parameter descriptions are thorough but some lack explicit format/range guidance. Error handling is minimal; no recovery guidance or per-item failure reporting for bulk operations. Security is well-handled (no secrets in params, auth via env vars). Composition is excellent, tools chain logically (status → get_post_meta → set_post_meta, list_posts → bulk_update). Bulk operations accept arrays with per-item metadata, reducing round-trips.
Update SEO meta on up to 100 resources in a single call. Item shapes by kind: post → { id, meta }; term → { id, kind: "term", taxonomy, meta } (v1.3.0+); cpt_archive → { kind: "cpt_archive", post_type, meta } for CPT archive pages like /challenges/ (v1.4.0+); singleton globals → { kind: "author_archive"|"date_archive"|"search"|"p404"|"home", meta } for site-wide SEO settings (v1.4.0+, requires manage_options). Returns per-item status.
Export posts, taxonomy term archives, and/or CPT archive pages with their SEO meta as CSV. Returns the CSV content as a string. Useful for bulk-editing in a spreadsheet. Includes title_chars and desc_chars helper columns by default; pass include_lengths=false to omit. Set include_terms=true (v1.3.0+) for term archive rows; include_archives=true (v1.4.0+) for CPT archive page rows.
Read SEO meta (title, description, focus keyword, canonical, OG/Twitter fields) for a single post or page by ID.
Import SEO meta updates from CSV rows. Each row must include id; other columns can be field aliases (title, description, focus_kw, canonical, og_title, ...) or raw meta keys. Round-trips with export_csv output.
Output schemas not documented. LLMs cannot predict response structure for any tool, forcing them to reason about unknown fields and risking context loss on unexpected data.
bulk_update and import_csv lack per-item error reporting. If 1 of 100 items fails, the LLM cannot determine which items succeeded and which need retry, forcing full re-submission.
No error recovery guidance. Error responses lack actionable next steps (e.g., 'WP 403: Check WP_USER and WP_APP_PASS' or 'Plugin not active, install Yoast or Rank Math first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
List posts/pages with their core fields (id, slug, title, status, link). Use this to find IDs before calling set_post_meta.
List taxonomy terms (categories, tags, or any custom taxonomy terms) with their core fields (id, slug, name, count, link). Use this to find term IDs and the taxonomy slug before calling bulk_update with kind=term.
Update SEO meta on a single post. Pass either field aliases (title, description, focus_kw, canonical, og_title, og_desc, og_image, tw_title, tw_desc, tw_image) or raw meta keys (_yoast_wpseo_title, rank_math_title, etc.). Call status first to know which plugin is active.
Attach custom JSON-LD structured data to a post or page (v1.6.0+). The schema is injected into the active SEO plugin's schema output.
Check which SEO plugin is active on the WordPress site (Yoast or Rank Math) and return the available field aliases. Always call this first to learn the field names.
import_csv rows parameter lacks item schema. Rows are 'array of objects' with no documented field names, types, or constraints. LLMs must guess valid row structure.
Numeric parameters (per_page, page, limit, offset) lack explicit min/max constraints in descriptions. LLMs may pass invalid values (e.g., per_page=999999).