
Bulk AI CLI Connector: Edit Pages, SEO and Schema with Claude, ChatGPT and MCP Agents
by puneetindersingh
Bulk AI CLI Connector connects AI agents and command-line tools to a WordPress site. Claude, Claude Code, ChatGPT, an MCP client or a plain script can read and rewrite SEO titles, meta descriptions, JSON-LD schema, redirects, image alt text and the visible copy of a page, in bulk, over an authenticated REST API. Every page content edit is backed up first and can be undone.
There is no AI inside the plugin and it sends nothing anywhere: it makes no requests of its own to any service and needs no AI account. It gives the agent you already use a safe way into the site. Each call signs in as a WordPress user and can only do what that user could do in wp-admin.
See what is live, where you work
New in 2.3: an SEO item in the admin bar on every page you can edit. It opens a panel over the page with what the page really sends to search engines (title, description, robots, canonical, social tags, headings, every JSON-LD block), read from the page itself, so it is true whichever plugin printed it. Problems are marked, the title and description can be changed in place, custom schema can be added, and a history lists every SEO change on the page with who made it and how: in the editor, through an API key, or from the panel. The block editor and the classic editor get the same live view beside the post.
What you can do with it
- Connect Claude or ChatGPT to WordPress: Claude Code and other command-line agents call the REST routes directly. Claude Desktop connects through the bundled MCP server. Anything else that can send an authenticated HTTP request works the same way, including n8n, Zapier and Make.
- Bulk edit Yoast SEO and Rank Math meta: SEO titles, meta descriptions, focus keywords, canonical URLs, robots directives, Open Graph and Twitter fields on up to 100 posts, pages, products or term archives in one call. Works on the free editions.
- Edit Elementor and Beaver Builder pages with an AI agent: read the headings, paragraphs, button labels and list items of a page as a list, change only the ones you name, and leave the layout exactly as it was. SiteOrigin Page Builder, Advanced Custom Fields text fields, Gutenberg, the classic editor, Divi and WPBakery pages are covered too.
- Add JSON-LD schema: FAQPage, HowTo, Service or any other type, per post or per category, merged into the Yoast or Rank Math schema graph.
- Add redirects: 301, 302, 307 and 410 rules, saved into Rank Math’s Redirections where that is in use.
- Bulk update image alt text: up to 200 media library images per call, matched by image URL.
- Work in a spreadsheet: export every SEO title and description as CSV, edit in Excel or Google Sheets, import it back.
- Undo: every page content write stores the previous version first. Dry runs show what would change and write nothing.
Works with
- SEO plugins: Yoast SEO and Rank Math, free and paid editions. The active one is detected automatically
- Page builders and editors: Elementor (including Elementor 4 atomic widgets), Beaver Builder, SiteOrigin Page Builder, Advanced Custom Fields, Gutenberg, the classic editor, Divi, WPBakery
- WooCommerce: products, product categories and product tags, plus return policy and shipping details on Product schema
- Agents and tools: Claude Code, Claude Desktop, ChatGPT, MCP clients, n8n, Zapier, Make, cURL, Python and Node scripts, headless front ends
Why it exists
WordPress does not expose Yoast SEO or Rank Math fields over the REST API, and page builders keep a page in post meta where the core REST API cannot reach it. Editing a meta title or an Elementor heading programmatically normally means WP-CLI with server access, a custom plugin, or a premium tier. This plugin adds a clean, authenticated REST surface instead.
It auto-detects which SEO plugin is active and exposes plugin-neutral field aliases (title, description, focus_kw, …) so you don’t need to memorise Yoast vs Rank Math meta keys.
This plugin was called Bulk SEO Meta Editor for AI Agents up to version 1.9.1. Same plugin, same address, same REST routes, new name: it now edits page content as well as SEO fields.
New in 2.0: page copy, redirects and API keys
Version 2.0 goes past SEO fields. The same REST API can now read and change the visible text of a page, wherever the site keeps it:
- Page builders: Elementor (including Elementor 4 atomic widgets), Beaver Builder, SiteOrigin Page Builder, and text fields in Advanced Custom Fields. These keep a page in post meta, where the core REST API cannot reach it. The plugin lists every piece of text as a node and changes only the ones you name. Layout, styling and widgets it does not know are written back exactly as they were read. In Advanced Custom Fields it can also add a row to a repeater or flexible content field (an FAQ item, a product tab), and edit the ACF fields of a category or any other taxonomy term.
- Gutenberg, classic editor, Divi and WPBakery: read and replace the post content, or run a literal find and replace across it.
- Term descriptions: category and product category introductions keep their headings, lists and tables.
- Undo for every edit: each write stores the previous version first.
GET /content/backupslists what can be restored andPOST /content/revertputs it back. The newest ten are kept per page. - Dry run and conflict check:
dry_runshows what would change and writes nothing.base_hashrefuses a write when the page changed since it was read. - Redirects:
POST /redirectadds a 301, 302, 307 or 410 rule. On a site that uses Rank Math’s Redirections the rule goes into Rank Math itself. Elsewhere the plugin serves it. - Copy a page:
POST /clonecopies a page with its template, design meta and featured image into a new draft. - Merchant listing fields: fills in return policy, shipping details and brand on WooCommerce Product schema from one stored policy.
- API keys: for sites where a security plugin or the host blocks application passwords. Made on Settings > AI CLI Connector, shown once, stored only as a hash.
What’s included
- REST endpoints: read and write SEO meta on any post, page or custom post type via the standard
/wp/v2/posts/{id}route (reads need?context=edit) or the namespaced helpers - Taxonomy term archives: edit SEO meta on category/tag/custom-taxonomy archive pages too, not just posts (Yoast and Rank Math both supported)
- Bulk update: apply changes to up to 100 posts or terms in a single call
- Bulk image alt text: update
_wp_attachment_image_alton up to 200 media-library attachments per call by image URL. Resolves CDN paths and-WIDTHxHEIGHTthumbnail suffixes back to the parent attachment automatically (v1.5.0+) - CSV import / export: round-trip your SEO meta through Excel or Google Sheets, posts and terms in one file
- MCP server: bundled Node.js companion (
bulk-seo-meta-editor-mcpon npm) so Claude Desktop and Claude Code can drive the plugin natively - Auto-detection: works with Yoast SEO or Rank Math, picks the active one automatically
- Per-object permission checks: Contributors and Authors can only edit posts, media and terms they could edit in wp-admin; site-wide archive and global settings require an administrator
- Allowlist enforcement: only meta keys belonging to the active SEO plugin are accepted; arbitrary postmeta writes are rejected
- Custom JSON-LD schema (v1.6.0+): store structured data (FAQPage, HowTo, Service, or any type) per post, and since 1.9.0 per category, tag or custom taxonomy term; it is injected into Yoast’s or Rank Math’s existing schema graph rather than as a duplicate block. When no SEO plugin schema graph is printed on the page (no Yoast or Rank Math, or their schema output switched off), the plugin prints the stored schema as its own JSON-LD block (v1.9.0+)
- Post titles (v1.9.0+): send
post_titlein a/bulkitem to rename a post; the slug is never touched - Sitemap refresh (v1.9.0+):
POST /sitemap/flushclears the Yoast or Rank Math sitemap cache after REST edits - Invalid Product schema guard (v1.9.0+): drops
Productnodes that carry nooffers,revieworaggregateRating, the ones Search Console reports as invalid on quote-only WooCommerce catalogues. Disable withadd_filter('bulkseme_drop_invalid_product_schema', '__return_false') - Page content (v2.0.0+): read and edit the text of Elementor, Beaver Builder, SiteOrigin, ACF, Gutenberg, classic, Divi and WPBakery pages and of term descriptions, with a backup before every write. From v2.1.0: add rows to ACF repeaters and flexible content, and edit ACF fields on terms. From v2.2.0: Elementor dropdowns and switches, and adding a widget by copying an existing one
- Redirects, page copies and merchant listing fields (v2.0.0+): see “New in 2.0” above
- API keys (v2.0.0+): a second way to sign in, next to application passwords
REST endpoints
All endpoints live under /wp-json/seo-meta-bridge/v1/ (or ?rest_route=/seo-meta-bridge/v1/... on plain-permalink installs):
GET /status: detect the active SEO plugin and list available fieldsPOST /bulk: update SEO meta on up to 100 posts/terms in one callPOST /bulk-alts: update image alt text on up to 200 media-library attachments by URLGET /export: export all posts’ SEO meta as CSV, returned in the JSON response bodyPOST /import: apply updates from a CSV upload or JSON rows arrayGET /schema(v1.6.0+): read back the custom JSON-LD schema stored on a post; addkind=term&taxonomy=<slug>for a term (v1.9.0+)POST /sitemap/flush(v1.9.0+): clear the Yoast or Rank Math sitemap cache so the next sitemap request rebuilds from live dataGET /content?id=N(v2.0.0+): which builder owns the page and its text as nodes; addkind=term&taxonomy=<slug>for a term descriptionPOST /content(v2.0.0+): change nodes withupdates: [{el, setting, value}], or sendpost_contentfor a page that keeps its text therePOST /content/replace(v2.0.0+): literal find and replace across the page’s textGET /content/backupsandPOST /content/revert(v2.0.0+): list and restore earlier versionsPOST /clone(v2.0.0+): copy a page or post into a new draftGET,POST,DELETE /redirect(v2.0.0+): list, add or remove redirect rulesGET,POST,DELETE /merchant-policy(v2.0.0+): the return policy and shipping details added to WooCommerce Product schemaPOST /register-key(v2.0.0+): store the hash of an API key from your own signed-in browser sessionGET,POST /update(v2.0.2+): see which version is installed and which one WordPress.org offers, and install the offered version without opening wp-admin
The standard WordPress REST route also works: POST /wp/v2/posts/{id} with a meta payload containing Yoast or Rank Math keys.
Field aliases
Alias
Yoast meta key
Rank Math meta key
title
_yoast_wpseo_title
rank_math_title
description
_yoast_wpseo_metadesc
rank_math_description
focus_kw
_yoast_wpseo_focuskw
rank_math_focus_keyword
canonical
_yoast_wpseo_canonical
rank_math_canonical_url
og_title
_yoast_wpseo_opengraph-title
rank_math_facebook_title
og_image
_yoast_wpseo_opengraph-image
rank_math_facebook_image
tw_title
_yoast_wpseo_twitter-title
rank_math_twitter_title
Plus robots, OG/Twitter description fields, and Rank Math primary-taxonomy keys.
MCP server for Claude Desktop and Claude Code
A Node.js MCP server is bundled at https://github.com/puneetindersingh/bulk-ai-cli-connector/tree/main/mcp-server and published to npm as bulk-seo-meta-editor-mcp. Add to Claude Desktop / Claude Code with one command and Claude can read, edit, bulk-update, and CSV-roundtrip SEO meta on any of your sites.
The MCP server has ten tools, for SEO meta and schema. Page content, redirects and the other routes added in 2.0 are REST routes: an agent that can send HTTP requests, Claude Code for example, calls them directly.
Security
- Application Passwords (Basic Auth), HTTPS required in production. API keys (v2.0.0+) work over the REST API only, over HTTPS only, on this plugin’s routes only unless made with the wider scope, and are stored as SHA-256 hashes
- Per-post
edit_postcapability check on every read and write,edit_termfor terms,manage_optionsfor redirects and site-wide settings - The SEO plugin’s and the page builder’s own rules for who may edit are followed as well: Yoast and Rank Math role settings, Elementor’s excluded roles, Beaver Builder’s Builder Access setting
- Page copy is always cleaned with the post content allowlist (
wp_kses_post), whoever sends it. Scripts and event handlers are never stored - Meta keys are allowlisted to the active plugin’s known fields
- URL-shaped fields (canonical, og_image, twitter_image, link URLs, redirect destinations) sanitised through
esc_url_raw - One admin screen, Settings > AI CLI Connector, and only administrators can open it
Trademarks
Yoast SEO is a trademark of Yoast BV. Rank Math is a trademark of RankMath. Claude is a trademark of Anthropic PBC. ChatGPT is a trademark of OpenAI OpCo. WordPress is a trademark of the WordPress Foundation. All other product names, logos, and brands are property of their respective owners. This plugin is an independent integration and is not affiliated with, endorsed by, or sponsored by any of them. Trademarks are referenced only to describe interoperability with the listed products.