<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: GoBuildWP</title>
    <description>The latest articles on DEV Community by GoBuildWP (@gobuildwp).</description>
    <link>https://dev.to/gobuildwp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4146044%2F03f1ce8c-72b3-41b5-9ebf-0798df884a77.png</url>
      <title>DEV Community: GoBuildWP</title>
      <link>https://dev.to/gobuildwp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gobuildwp"/>
    <language>en</language>
    <item>
      <title>How to Rewrite WooCommerce Product Descriptions in Bulk with Claude or ChatGPT (in Small, Reviewed Batches)</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Tue, 06 Oct 2026 03:59:57 +0000</pubDate>
      <link>https://dev.to/gobuildwp/how-to-rewrite-woocommerce-product-descriptions-in-bulk-with-claude-or-chatgpt-in-small-reviewed-2a3d</link>
      <guid>https://dev.to/gobuildwp/how-to-rewrite-woocommerce-product-descriptions-in-bulk-with-claude-or-chatgpt-in-small-reviewed-2a3d</guid>
      <description>&lt;p&gt;Most WooCommerce catalogues have the same problem hiding in them. The first fifty products got real descriptions because someone cared at launch. The next few hundred got the supplier's two lines, a copy of the product title, or nothing at all. Nobody plans to fix them, because opening products one by one in wp-admin is a week of tabs.&lt;/p&gt;

&lt;p&gt;AI looks like the obvious answer, and store owners are trying it. In one r/woocommerce thread, &lt;a href="https://www.reddit.com/r/woocommerce/comments/1qocjfd/looking_to_ai_optimize_4k_product_descriptions/" rel="noopener noreferrer"&gt;an owner with about 4,000 products to improve&lt;/a&gt; said they were throttled after roughly 50 products. Replies pointed to process rather than a new tool: work in batches (one mentioned MCP with Claude Projects), and another suggested batches of around 50 to 100 with retries and logging. In &lt;a href="https://www.reddit.com/r/woocommerce/comments/1qvu2pb/tooladdon_for_editing_product_descriptions_with/" rel="noopener noreferrer"&gt;another thread&lt;/a&gt;, a store owner described more than 10,000 old products with poor descriptions they wanted to redo.&lt;/p&gt;

&lt;p&gt;Batching is good advice, but it's only half the job. It keeps the AI from stalling. It doesn't tell you which products need work, whether the new copy is accurate, or how to get the old text back when a batch goes wrong.&lt;/p&gt;

&lt;p&gt;This tutorial covers the full loop: &lt;strong&gt;measure, batch, review, save, verify, undo&lt;/strong&gt;. I'll use Claude and ChatGPT connected to WordPress over MCP through &lt;a href="https://gobuildwp.com/mcp-for-woocommerce" rel="noopener noreferrer"&gt;GoBuildWP (formerly WPPilot)'s WooCommerce MCP&lt;/a&gt;, and I'll say which steps work on the free plugin and which need Pro.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on GoBuildWP. Everything below was checked against the live docs on 5 October 2026.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not export a CSV and paste it into ChatGPT?
&lt;/h2&gt;

&lt;p&gt;For 30 products, that's fine. At a few hundred it breaks down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The CSV carries every column, so the re-import can quietly overwrite prices, stock or categories you never meant to touch.&lt;/li&gt;
&lt;li&gt;You lose the link between what the AI read and what it wrote. If a description says the jacket is waterproof, you can't easily tell whether that came from the product data or from the model.&lt;/li&gt;
&lt;li&gt;The only undo is re-importing yesterday's file, which also reverts every legitimate change made since.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Working over MCP changes the unit of work. The AI reads one product record, proposes one description, and saves one field. In the &lt;a href="https://gobuildwp.com/docs/reference/woocommerce" rel="noopener noreferrer"&gt;WooCommerce ability reference&lt;/a&gt;, the free product editor (&lt;code&gt;woocommerce-edit-product&lt;/code&gt;) is described with "PATCH semantics: only the fields given change." If the call contains only &lt;code&gt;description&lt;/code&gt;, prices and stock aren't part of the write.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WordPress 6.9+ with PHP 8.0+, and WooCommerce 9.0 or newer (GoBuildWP's store abilities don't register below that).&lt;/li&gt;
&lt;li&gt;GoBuildWP Free, installed and connected. Pro is optional.&lt;/li&gt;
&lt;li&gt;Claude (desktop, web or Claude Code) or ChatGPT (web, with Developer mode).&lt;/li&gt;
&lt;li&gt;A recent backup. The GoBuildWP ledger docs are blunt: "Take a backup before a large batch, regardless."&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Free vs Pro for this job
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;List products and read full product records&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rewrite a product's long description&lt;/td&gt;
&lt;td&gt;Yes, one product per call&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rewrite the short description&lt;/td&gt;
&lt;td&gt;Not in the free editor's field list&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rewrite variation descriptions&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Undo an edit from the change ledger&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes, except on stock-managed products (see Step 7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Save your writing rules as a reusable skill&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hold every write until a person approves it&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, the approval queue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On a variable product, the free editor can only change the name and description, because prices and stock live on the variations. For a description rewrite that's all you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Connect in Read Only, as a dedicated user
&lt;/h2&gt;

&lt;p&gt;Give the AI its own WordPress login rather than connecting as yourself. Every change in the ledger then names that user and the agent behind it, and you can switch it off without touching your own login. Check the role requirement first: the &lt;a href="https://gobuildwp.com/use-cases/manage-woocommerce-products-with-chatgpt" rel="noopener noreferrer"&gt;WooCommerce products use case&lt;/a&gt; says the connection identity needs &lt;code&gt;manage_options&lt;/code&gt; on a single site, and that "a plain Shop manager does not meet the connection prerequisite."&lt;/p&gt;

&lt;p&gt;Before connecting, go to &lt;strong&gt;GoBuildWP â†’ Settings â†’ Agent access â†’ Safety profile&lt;/strong&gt;, choose &lt;strong&gt;Read Only&lt;/strong&gt; and save. A fresh install starts on Production Safe, so this is a deliberate change. Under Read Only, write abilities are hidden from the AI's tool list entirely, so nothing can be saved while you measure.&lt;/p&gt;

&lt;p&gt;To connect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; GoBuildWP's Connect screen gives you a command like &lt;code&gt;claude mcp add wppilot-your-site-com --transport http https://your-site.com/wp-json/mcp/wppilot-oauth&lt;/code&gt;. Run &lt;code&gt;/mcp&lt;/code&gt; inside Claude Code and sign in through the browser as the AI's WordPress user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT:&lt;/strong&gt; turn on Developer mode under Settings â†’ Security and login, create an app with your site's &lt;code&gt;/wp-json/mcp/wppilot-oauth&lt;/code&gt; URL and OAuth, then choose the app from the plus menu in each new chat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test with something harmless: "Run woocommerce-check-setup and tell me the WooCommerce version and currency."&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Measure before you write anything
&lt;/h2&gt;

&lt;p&gt;Most bulk rewrites skip this, and it's the step that saves the most time. If you don't know how many products are actually thin, you can't size batches, and you'll spend AI time rewriting descriptions that were fine.&lt;/p&gt;

&lt;p&gt;One technical wrinkle: &lt;code&gt;woocommerce-list-products&lt;/code&gt; returns a compact row per product (ID, name, SKU, status, type, stock fields, prices, permalink, date modified). The description isn't in it. So measuring takes two reads: list IDs page by page, up to 200 per page, then open each product with &lt;code&gt;woocommerce-get-product&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Audit my WooCommerce product descriptions. Read only, change nothing.

1. Run woocommerce-check-setup.
2. Page through woocommerce-list-products with status "publish" and limit 200.
   Collect ID, name, SKU, type and manage_stock for every product.
3. Read each product with woocommerce-get-product. Strip HTML from the
   description and count the words. Note whether a short description exists.
4. Flag a product as THIN if the description is empty, has fewer than
   40 words, only repeats the product name, or is identical to another
   product's description.
5. Show THIN products only: ID, name, SKU, type, word count, short
   description yes/no, manage_stock yes/no, and the reason it was flagged.
6. End with totals: products checked, products flagged, count per reason.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adjust the 40-word threshold to your catalogue. It's plenty for a washer and far too little for skincare.&lt;/p&gt;

&lt;p&gt;Two columns matter later. &lt;strong&gt;Short description yes/no&lt;/strong&gt;, because that field needs Pro. &lt;strong&gt;manage_stock yes/no&lt;/strong&gt;, because it changes what can be undone when Pro is active. Save the table as your baseline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Write the rules down once, as a skill
&lt;/h2&gt;

&lt;p&gt;Re-explaining your style in every chat is how tone drifts. Batch 1 gets a careful brief, batch 6 gets "same as before", and by batch 12 the copy reads like three different writers.&lt;/p&gt;

&lt;p&gt;GoBuildWP Free includes &lt;a href="https://gobuildwp.com/docs/reference/skills" rel="noopener noreferrer"&gt;Skills&lt;/a&gt;: Markdown instructions stored on your WordPress site that an agent loads by name when a task matches. They're saved as a private post type with no public URL. Because the skill lives on the site rather than in the client, Claude and ChatGPT read the same rules. Ask the AI to create one with &lt;code&gt;skill-write&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a user skill titled "Product description rules" with this body:

Use only facts in the product record: name, attributes, categories,
dimensions, weight, existing description and short description.
Never invent materials, certifications, health or safety claims,
compatibility, warranty terms, shipping times or prices. If a fact is
missing, leave it out and add the product to a "needs info" list.
Length: 80 to 150 words.
Structure: a short opening paragraph on what it is and who it's for,
3 to 5 bullets from the attributes, then a care or use line only if
the record supports it.
Tone: plain and specific. No "elevate", no "unleash", no exclamation marks.
Keep any existing size chart, HTML table or shortcode exactly as it is.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "never invent" line matters most. GoBuildWP's own WooCommerce automation guide says: "Do not infer regulated claims, prices, stock, tax treatment, or shipping facts from incomplete context." A product description is a promise to a customer. A model filling a gap with "BPA-free" or "fits all standard models" turns a copywriting job into a returns problem.&lt;/p&gt;

&lt;p&gt;Edit the skill as you go. If batch 2 overuses a phrase, ban it in the skill and every later batch follows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Pick a batch size you can actually read
&lt;/h2&gt;

&lt;p&gt;The 50-to-100 advice from Reddit is about keeping the AI client from stalling. In this workflow the real limit is the reviewer. GoBuildWP paces writes at 120 per minute per credential, so the site isn't the bottleneck. You are.&lt;/p&gt;

&lt;p&gt;What I'd do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;First batch: 5 to 10 products.&lt;/strong&gt; Mix a simple product, a variable product, one with an HTML table and one with almost no data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then 25 per batch&lt;/strong&gt; while you're still tuning the rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Then 50&lt;/strong&gt;, once three batches in a row need no corrections.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Group the thin list by category. Twenty-five phone cases in a row are quick to review, and the odd one stands out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Draft the batch and review it before saving
&lt;/h2&gt;

&lt;p&gt;Switch the safety profile to &lt;strong&gt;Production Safe&lt;/strong&gt;, since the next steps write. Then ask for drafts only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Load the "Product description rules" skill.
Take the next 25 products from my THIN list, in category order.
Read each with woocommerce-get-product and draft a new description.
Do not save anything.

Show a review table: ID, name, current description (first 30 words),
proposed description in full, and the facts from the record you used.
List any product you skipped and why. Then stop and wait.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "facts used" column is your accuracy check. If a description mentions merino wool and the facts column doesn't, that line was invented.&lt;/p&gt;

&lt;p&gt;Be clear about what kind of preview this is. GoBuildWP has a formal preview-before-write feature with a field-by-field diff and a wp-admin screen to apply or discard it, but the docs scope it to edits of posts, pages and media, plus settings changes and deletions. Product edits aren't on that list, so for products the review happens in this chat table.&lt;/p&gt;

&lt;p&gt;If a second person has to sign off on store copy, use GoBuildWP Pro's approval queue with its policy set to hold writes. Each product edit then waits until someone approves it. The docs add a fair warning: "a hold is not a rendered diff." The approver sees the held request and its arguments, so keep the chat table as the readable version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep your own draft ledger
&lt;/h3&gt;

&lt;p&gt;Before approving, ask for the batch as a CSV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;batch, product_id, sku, old_description, new_description, approved_by, approved_at
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it outside WordPress. This isn't redundant. The &lt;a href="https://gobuildwp.com/docs/change-ledger-and-rollback" rel="noopener noreferrer"&gt;change ledger docs&lt;/a&gt; say the ledger holds at most the latest 10,000 changes or 90 days of history, whichever limit is hit first, and "drops large before-images once a change is 30 days old, at which point that change can no longer be undone." Ledger exports leave before-images out too. Long descriptions are exactly the kind of large field that ages out, and your CSV is the copy that doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Save only the description, then read it back
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Approved, except products 2213 and 2240 (skip those).
For each approved product, call woocommerce-edit-product with only id and
description. Send no other field.
After each save, re-read the product and compare the saved description
with the approved text. Report any mismatch or error.
Finish with the GoBuildWP change ID for each product.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Practical notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Only id and description.&lt;/strong&gt; With partial updates, everything you leave out stays untouched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backslashes.&lt;/strong&gt; The reference warns that "WordPress strips single backslash characters from description on save". Use double backslashes if your copy contains code or file paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change IDs.&lt;/strong&gt; Add them to your CSV. If someone questions a description next month, you can go straight to its entry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then open three products from the batch in a private window. Check that bullets render, size charts survived and mobile looks right. If you run a page cache or CDN, the old copy may show until it's purged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Undo, and know exactly what can be undone
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;On GoBuildWP Free&lt;/strong&gt;, the basic product editor keeps a before-image of only the fields it changed and writes them back through WooCommerce on rollback. Three ways to use it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask the AI to call &lt;code&gt;rollback-change&lt;/code&gt; with the change ID. The call won't run without explicit confirmation, and it compares what it wrote back with the saved before-image rather than assuming it worked.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;GoBuildWP â†’ Changes&lt;/strong&gt; in wp-admin, filter by the agent and the batch's time window, and undo one change or everything the filter shows, as many as 200 at once. No AI involved.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;undo-session&lt;/code&gt; to revert everything one agent session changed, newest first. It refuses without changing anything if something else edited one of those products in the meantime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;With GoBuildWP Pro active&lt;/strong&gt;, Pro's fuller product editor answers under the same ability name, and it has one exception. GoBuildWP's WooCommerce docs explain that on a product that manages stock, Pro's edit is recorded without a before-image, because restoring it would also write back the old stock level and erase every sale since. Those entries say they can't be undone. Products that don't manage stock roll back normally.&lt;/p&gt;

&lt;p&gt;That's what the &lt;code&gt;manage_stock&lt;/code&gt; column was for. On Pro, for a stock-managed product, your CSV is the way back: have the AI write &lt;code&gt;old_description&lt;/code&gt; back with another &lt;code&gt;woocommerce-edit-product&lt;/code&gt; call.&lt;/p&gt;

&lt;p&gt;For everyone: rollback isn't a backup. It only knows about GoBuildWP's own writes, so a manual edit between the AI's save and your undo can produce a result nobody predicted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Repeat, then re-measure
&lt;/h2&gt;

&lt;p&gt;Every batch is the same short loop: draft, review table, CSV, save, read back, spot-check. Every few batches, tighten the skill based on what you corrected, and look at the &lt;strong&gt;needs info&lt;/strong&gt; list. A product with no attributes and no text can't be described honestly by an AI. Someone has to add the facts first.&lt;/p&gt;

&lt;p&gt;When the list is done, run the Step 2 audit again and compare the flagged count with your baseline. That number is what you can prove. Whether better descriptions lift sales or search traffic is something to check in your analytics over the following weeks, not something to assume.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short descriptions and variations
&lt;/h2&gt;

&lt;p&gt;On many themes the short description sits next to the price and the Add to cart button, so it can matter more than the long one. With Pro, the same workflow works with &lt;code&gt;short_description&lt;/code&gt; in the edit call. Keep it to two or three lines and give it its own rule in the skill.&lt;/p&gt;

&lt;p&gt;Variation descriptions are a separate field on each variation, edited with Pro's &lt;code&gt;woocommerce-edit-product-variation&lt;/code&gt;. Most stores can leave them until the parent descriptions are done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Connect Claude or ChatGPT in &lt;strong&gt;Read Only&lt;/strong&gt; as a dedicated user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure&lt;/strong&gt; thin descriptions and save the baseline.&lt;/li&gt;
&lt;li&gt;Put your writing rules in a &lt;strong&gt;skill&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Start with &lt;strong&gt;5 to 10 products&lt;/strong&gt;, then 25, then 50.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review&lt;/strong&gt; a before/after table with the facts used, and keep your own &lt;strong&gt;CSV&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Save &lt;strong&gt;only the description&lt;/strong&gt;, read it back, check the storefront.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undo&lt;/strong&gt; from the ledger when needed. On Pro, stock-managed products need your CSV instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-measure&lt;/strong&gt; at the end.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The free plugin covers the whole loop for long descriptions. Pro adds short descriptions, variations and an approval queue. The &lt;a href="https://gobuildwp.com/free-vs-pro" rel="noopener noreferrer"&gt;Free vs Pro comparison&lt;/a&gt; lists everything else.&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>wordpress</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Find and Fix Missing Meta Descriptions in WordPress with Claude or ChatGPT</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:25:40 +0000</pubDate>
      <link>https://dev.to/gobuildwp/how-to-find-and-fix-missing-meta-descriptions-in-wordpress-with-claude-or-chatgpt-40hk</link>
      <guid>https://dev.to/gobuildwp/how-to-find-and-fix-missing-meta-descriptions-in-wordpress-with-claude-or-chatgpt-40hk</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical Yoast and Rank Math workflow: audit first, write from the page, check what the site actually serves, and keep a way back.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Many WordPress sites share the same quiet SEO gap. The homepage and the handful of pages someone cared about at launch have hand-written meta descriptions. Most posts published after that have an empty description field, so the SEO plugin falls back to a template and Google picks its own snippet.&lt;/p&gt;

&lt;p&gt;People ask about this all the time. A recent r/Wordpress thread asked how to bulk edit Yoast meta descriptions for post categories, because Yoast's bulk editor didn't show them. Whole plugins exist just to find posts with no description and fill them. Meow Apps even lists it as a typical weekly request to an AI agent: "List every post without a meta description, write one for each in my tone, and show me before saving."&lt;/p&gt;

&lt;p&gt;The writing part is easy now. Claude or ChatGPT can write a decent 150 character summary in seconds. The hard parts are the boring ones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Knowing &lt;strong&gt;which&lt;/strong&gt; posts are actually missing a description.&lt;/li&gt;
&lt;li&gt;Making sure the AI writes from &lt;strong&gt;what the page says&lt;/strong&gt;, not from a keyword and its imagination.&lt;/li&gt;
&lt;li&gt;Saving into the &lt;strong&gt;right field&lt;/strong&gt; of the SEO plugin you run, and nothing else.&lt;/li&gt;
&lt;li&gt;Being able to &lt;strong&gt;undo&lt;/strong&gt; it when a description turns out wrong.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This tutorial walks through that loop with an AI client connected to WordPress over MCP through &lt;a href="https://gobuildwp.com/wordpress-ai-seo-automation" rel="noopener noreferrer"&gt;GoBuildWP (formerly WPPilot)&lt;/a&gt;. I'll be clear about what the free plugin does, where Pro starts, and where you still need a human.&lt;/p&gt;

&lt;h2&gt;
  
  
  A reality check on meta descriptions
&lt;/h2&gt;

&lt;p&gt;Google's documentation says snippets are "primarily created from the page content itself", and that Google "sometimes uses the meta description HTML element if it might give users a more accurate description of the page than content taken directly from the page." So a description is a strong suggestion, not a guarantee.&lt;/p&gt;

&lt;p&gt;The same page gives three rules that matter once AI writes the copy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unique per page.&lt;/strong&gt; "Identical or similar descriptions on every page of a site aren't helpful."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritise.&lt;/strong&gt; If you can't do every page, "at the very least, create a description for the critical URLs like your home page and popular pages."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generated is fine if it's good.&lt;/strong&gt; Programmatic descriptions "can be appropriate and are encouraged. Good descriptions are human-readable and diverse." Strings of keywords "are less likely to be displayed as a snippet."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the green light for AI, if every description is readable, specific and different.&lt;/p&gt;

&lt;p&gt;And a saved description is not a ranking result. GoBuildWP's SEO page says a successful write "proves the operation returned successfully". Measure clicks in Search Console a few weeks later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WordPress 6.9 or newer and PHP 8.0+.&lt;/li&gt;
&lt;li&gt;One supported SEO plugin active. GoBuildWP Free reads and sets one post's SEO title, meta description and robots in seven: Yoast SEO, Rank Math, AIOSEO, SEOPress, The SEO Framework, Slim SEO and SmartCrawl. The reference pages list minimum versions, for example Yoast SEO 21.0+ and Rank Math 1.0.200+.&lt;/li&gt;
&lt;li&gt;An MCP client. I'll use Claude and ChatGPT as examples.&lt;/li&gt;
&lt;li&gt;GoBuildWP Free. Pro is optional; I'll point out exactly where it helps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have two SEO plugins active (common mid-migration), the plugin-neutral SEO calls refuse to guess. They return &lt;code&gt;wppilot_seo_provider_ambiguous&lt;/code&gt; and ask you to name the one the front end actually uses. Decide which plugin is live before writing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Connect with a dedicated user, in Read Only
&lt;/h2&gt;

&lt;p&gt;Create a separate WordPress user for the AI. GoBuildWP's SEO use case recommends this "so the ledger names it rather than your administrator account." Free's per-post SEO calls check &lt;code&gt;edit_posts&lt;/code&gt; plus the right to edit that post, according to the Yoast and Rank Math references. Pro's full modules check &lt;code&gt;manage_options&lt;/code&gt;, so Pro work needs an administrator-level user.&lt;/p&gt;

&lt;p&gt;Then set the GoBuildWP safety profile to &lt;strong&gt;Read Only&lt;/strong&gt; for the first session. The docs call Read Only "the correct starting point for audits, discovery, reporting, and connection tests," and it hides writes rather than just refusing them: "An ability the active profile does not allow is withheld from discovery." During the audit, the write tools simply aren't there.&lt;/p&gt;

&lt;p&gt;Connecting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude (web):&lt;/strong&gt; Customize, then Connectors, then Add custom connector. Paste the MCP URL from GoBuildWP's Connect screen and approve through OAuth as the dedicated user. claude.ai connects from Anthropic's side, so the site needs public HTTPS. For a local or staging site, Claude Desktop can reach it instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT:&lt;/strong&gt; on ChatGPT web, open Settings, then Security and login, and turn on Developer mode (GoBuildWP's guide notes OpenAI documents it for Plus, Pro, Business, Enterprise and Education accounts). Create the app from ChatGPT Plugins with the OAuth URL your Connect screen generates. Apps are enabled per conversation from the plus menu, which explains most "it's connected but ChatGPT ignores it" reports.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test with a harmless question: which SEO plugin is active?&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Find the posts that are actually missing descriptions
&lt;/h2&gt;

&lt;p&gt;You need the list first.&lt;/p&gt;

&lt;p&gt;GoBuildWP Free includes &lt;code&gt;audit-content&lt;/code&gt;, a content audit that changes nothing. Its &lt;code&gt;seo_meta&lt;/code&gt; check reports a missing meta description or SEO title, read through the active SEO plugin, and "the source used is reported." By default it runs as a background job over published posts and pages and returns a &lt;code&gt;job_id&lt;/code&gt;; &lt;code&gt;audit-content-status&lt;/code&gt; pages through the findings worst first. Findings are kept for seven days after the job ends.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run a content audit with only the seo_meta check, as a background job.
When it finishes, give me a table: post ID, title, URL, post type, and
whether the title, the description, or both are missing. Tell me which
SEO plugin the audit read from. Change nothing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;"Missing" means no override was set.&lt;/strong&gt; The Free Yoast reference says an empty description "means Yoast uses the post type template," and Rank Math works the same way. A post on the list may still output a template-built description. That's usually what you want to replace, but the page isn't blank in search.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The audit sees stored content.&lt;/strong&gt; The platform reference warns that stored-content audits "can omit runtime templates, dynamic output and external content." If your theme prints its own meta tags, the audit won't see them. Step 5 covers that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On Pro&lt;/strong&gt;, &lt;code&gt;seo-bulk-get-meta&lt;/code&gt; reads SEO title, description, canonical, robots and Open Graph fields for many posts in one shape across all supported plugins, with filters for &lt;code&gt;missing_description&lt;/code&gt;, &lt;code&gt;missing_title&lt;/code&gt; and &lt;code&gt;duplicate_titles&lt;/code&gt;. A filtered read inspects at most 1,000 posts and reports &lt;code&gt;truncated=true&lt;/code&gt; when there were more, so page by post type on big sites. Use the duplicate filter too; GoBuildWP's own rules say "fix duplicates before rewriting unique ones."&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Pick the order, don't do everything
&lt;/h2&gt;

&lt;p&gt;GoBuildWP's SEO page is blunt: "Bulk-rewriting every title on a site is the least useful thing WordPress AI SEO automation can do." Google says to prioritise critical and popular URLs. A sensible order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pages that make money: services, key category pages, booking or contact.&lt;/li&gt;
&lt;li&gt;Posts that already get impressions in Search Console.&lt;/li&gt;
&lt;li&gt;Evergreen guides you still link to.&lt;/li&gt;
&lt;li&gt;Everything else, later, in batches. Some old posts need a merge or a noindex more than a description, and that's a separate decision.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Give the AI your Search Console data instead of letting it guess. On Pro with Site Kit by Google connected, &lt;code&gt;site-kit-search-pages&lt;/code&gt; lists pages with many impressions but a click-through rate under half the site average. Every Site Kit ability only reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Write from the page, one post at a time (Free)
&lt;/h2&gt;

&lt;p&gt;Switch the profile from Read Only to &lt;strong&gt;Production Safe&lt;/strong&gt; for writing, then start a fresh client session so the AI picks up the new tool list.&lt;/p&gt;

&lt;p&gt;On Free the loop is one post at a time. That's fine for the first 20 or 30 important pages and keeps every change easy to review. For Yoast the calls are &lt;code&gt;yoast-get-post-seo&lt;/code&gt; and &lt;code&gt;yoast-edit-post-seo&lt;/code&gt;; for Rank Math, &lt;code&gt;rank-math-get-post-seo&lt;/code&gt; and &lt;code&gt;rank-math-edit-post-seo&lt;/code&gt;. The other five plugins have equivalents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For post 318:
1. Read its current SEO title, description and robots. Show them to me.
2. Read the post content and summarise in two lines what the page offers,
   using the service, product and place names the page itself uses.
3. Propose one meta description of about 140-155 characters:
   - describe only what is on the page
   - no prices, guarantees, awards or response times unless the page states them
   - no keyword lists, no "Welcome to"
   - different wording from every description you wrote earlier in this chat
4. Wait for my approval. Then write ONLY meta_description. Do not touch
   the SEO title, canonical or robots.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this is safe rather than lucky:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's a partial merge.&lt;/strong&gt; The edit call changes only the fields you send. The Yoast reference says "send only the fields to change," and "everything is validated before anything is written." Send only &lt;code&gt;meta_description&lt;/code&gt; and the title, canonical and robots stay as they were.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plugin variables still work.&lt;/strong&gt; Yoast variables such as &lt;code&gt;%%title%%&lt;/code&gt;, &lt;code&gt;%%sep%%&lt;/code&gt; and &lt;code&gt;%%sitename%%&lt;/code&gt; work, and Rank Math keeps variables such as &lt;code&gt;%title%&lt;/code&gt; and &lt;code&gt;%sep%&lt;/code&gt;. An empty string clears the override so the post type template applies again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No invented facts.&lt;/strong&gt; This is the rule not to relax. GoBuildWP's guidance: "prices, guarantees, awards and response times come from the page or the owner, never from the model." Language models like adding "fast", "affordable" or "trusted". Read every draft against the page before you approve it.&lt;/p&gt;

&lt;p&gt;Here's the target shape, from GoBuildWP's documented Yoast example (placeholder business, real field names):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"post_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"meta_description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Book a boiler service in Leeds. See what the service includes, the areas covered and how to request an appointment."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Every write is recorded.&lt;/strong&gt; Free's Yoast and Rank Math edits go into the change log with a before-image of just the SEO keys they wrote, and &lt;code&gt;wppilot/rollback-change&lt;/code&gt; restores them. AIOSEO is the special case: Free's per-post AIOSEO edit keeps its own before-image and can be undone, but Pro's AIOSEO writes are marked irreversible, so read the old values first on AIOSEO sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Check what the site actually serves
&lt;/h2&gt;

&lt;p&gt;A saved field isn't a served tag. Page caches hold old HTML, themes override things, and a forgotten second SEO plugin can print its own tags.&lt;/p&gt;

&lt;p&gt;GoBuildWP Free's &lt;code&gt;verify-rendered-page&lt;/code&gt; "fetches the page as a visitor gets it and reports what was served." After each write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Re-read post 318's SEO fields, then run verify-rendered-page on it.
Confirm the served meta description matches what we saved. If not,
tell me what was served instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the saved value is right and the served one isn't, purge the page cache first. GoBuildWP's use case notes "a cached page can keep serving the old title until the page cache is purged." Still wrong? Check the theme header or a leftover SEO plugin before blaming the AI. A WordPress.org Rank Math support thread about missing descriptions ended the same way: clear the cache and check the page source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Scale up carefully (Pro)
&lt;/h2&gt;

&lt;p&gt;One at a time gets slow on a site with hundreds of posts. This is where Pro earns its place.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;seo-bulk-update-meta&lt;/code&gt; sets SEO fields on &lt;strong&gt;up to 100 posts per call&lt;/strong&gt; through the active plugin's own per-post writer. Without &lt;code&gt;dry_run&lt;/code&gt; or &lt;code&gt;confirm&lt;/code&gt; it is refused with &lt;code&gt;wppilot_confirmation_required&lt;/code&gt; and told how many posts it would overwrite. &lt;code&gt;dry_run=true&lt;/code&gt; returns each post's before and after and writes nothing; &lt;code&gt;confirm=true&lt;/code&gt; writes. Results are per post (updated, unchanged or error), and one failing post never stops the rest. A field the plugin doesn't store fails that post with &lt;code&gt;wppilot_seo_field_unsupported&lt;/code&gt; instead of pretending it saved.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Take the next 25 posts from the audit list that are missing a description.
Draft a description for each with the same rules as before. Run
seo-bulk-update-meta with dry_run=true, one item per post. Show me the
before and after as a table. Do not confirm until I reply with the post
IDs I approve.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why 25, not 100? Because you should actually read the dry run, and 25 rows is a table you'll check properly. Advice in r/woocommerce threads about rewriting thousands of product descriptions points the same way: smaller batches with retries and logging are more reliable.&lt;/p&gt;

&lt;p&gt;Modest batches also matter for undo: the ledger docs say a single bulk call keeps before-images for its first megabyte of changes only.&lt;/p&gt;

&lt;p&gt;Each written post gets its own ledger row. Yoast SEO, Rank Math, SEOPress, The SEO Framework, Slim SEO and SmartCrawl rows restore with &lt;code&gt;wppilot/rollback-change&lt;/code&gt;. AIOSEO rows are irreversible; to undo them, rerun the write with the before values from the batch.&lt;/p&gt;

&lt;p&gt;Pro also covers the case from that Reddit thread: &lt;strong&gt;category and tag archive descriptions&lt;/strong&gt;. In Yoast that's &lt;code&gt;yoast-edit-term-seo&lt;/code&gt;. Term SEO is available for Yoast, Rank Math, AIOSEO and SEOPress, not the three smaller plugins. And Pro's &lt;code&gt;content-fix-plan&lt;/code&gt; can turn a finished audit into reviewable items, including "adding a missing description through the SEO plugin," which &lt;code&gt;content-fix-apply&lt;/code&gt; applies only for the items a person picked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Undo when you need to
&lt;/h2&gt;

&lt;p&gt;You'll write a few descriptions you regret. Every change shows up in wp-admin under &lt;strong&gt;GoBuildWP &amp;gt; Changes&lt;/strong&gt;, which "undoes one change, one bulk batch, or every undoable change a filter shows, up to 200 at a time, without involving the agent that made them." Bulk writes are grouped, so you can undo a whole batch or just the posts that came out wrong.&lt;/p&gt;

&lt;p&gt;Two limits from the same page: "Rollback is never universal," and history ages out. The ledger keeps the newest 10,000 changes or 90 days, and drops large before-images after 30 days. Review new descriptions within the month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Stop the gap from coming back
&lt;/h2&gt;

&lt;p&gt;New posts keep going out with empty descriptions. GoBuildWP Free's &lt;strong&gt;scheduled routines&lt;/strong&gt; are read-only audits the server runs on WP-Cron with no agent connected. A routine can run &lt;code&gt;audit-content&lt;/code&gt; with &lt;code&gt;checks&lt;/code&gt; set to &lt;code&gt;["seo_meta"]&lt;/code&gt; daily or weekly at an hour you choose, compare each run with the last, and email a summary to administrators you pick by user ID. Routines can only run read-only audits, so they never change a page.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a weekly routine for Monday at 7:00 site time that runs
audit-content with the seo_meta check and emails the report to user 1.
Show me the routine before saving it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each week you get the new gaps to close with the Step 4 prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistakes worth avoiding
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Letting copy work touch canonicals and robots.&lt;/strong&gt; GoBuildWP's rules say to leave them "out of copy work"; they decide which URL search engines see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping the served-page check.&lt;/strong&gt; Caches and themes will happily show the old tag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating length as law.&lt;/strong&gt; Google says there's no limit on description length; the snippet is truncated to fit the device. Around 140 to 160 characters keeps the important part visible, but a good 170 character description is still good.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Free vs Pro for this job
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://gobuildwp.com/free-vs-pro" rel="noopener noreferrer"&gt;Free vs Pro comparison&lt;/a&gt; has the full list. For missing meta descriptions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GoBuildWP Free&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;audit-content&lt;/code&gt; with the &lt;code&gt;seo_meta&lt;/code&gt; check&lt;/li&gt;
&lt;li&gt;Read and set one post's SEO title, description and robots in all seven SEO plugins, with undo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;verify-rendered-page&lt;/code&gt; for the served HTML&lt;/li&gt;
&lt;li&gt;Scheduled routines that re-run the audit and email results&lt;/li&gt;
&lt;li&gt;The change ledger and the GoBuildWP &amp;gt; Changes undo screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GoBuildWP Pro adds&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;seo-bulk-get-meta&lt;/code&gt; with missing description, missing title and duplicate title filters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;seo-bulk-update-meta&lt;/code&gt;, up to 100 posts per call, dry run first&lt;/li&gt;
&lt;li&gt;Category and tag archive SEO in the four larger suites&lt;/li&gt;
&lt;li&gt;Canonicals, keyphrases, social fields, schema and redirects where the suite supports them (Yoast redirects also need Yoast Premium)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;content-fix-plan&lt;/code&gt; / &lt;code&gt;content-fix-apply&lt;/code&gt;, and Site Kit reads to choose pages by click-through rate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a few dozen important pages, Free covers the whole job. Pro matters when the list runs into the hundreds or you need archive pages. Global SEO plugin settings stay read-only in both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The audit-first version with Claude, including its ability list: &lt;a href="https://gobuildwp.com/use-cases/fix-wordpress-seo-with-claude" rel="noopener noreferrer"&gt;Fix WordPress SEO with Claude&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bulk calls, filters and confirmation rules: &lt;a href="https://gobuildwp.com/docs/reference/seo" rel="noopener noreferrer"&gt;Supported SEO plugins ability reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The weekly check: &lt;a href="https://gobuildwp.com/use-cases/scheduled-site-audits" rel="noopener noreferrer"&gt;Scheduled WordPress audits&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;What undo covers and what it can't: &lt;a href="https://gobuildwp.com/docs/change-ledger-and-rollback" rel="noopener noreferrer"&gt;Change ledger and rollback&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole workflow in one line: audit in Read Only, pick the pages that matter, write from the page with no invented claims, save only the description, check what's served, and let a weekly routine flag new gaps. The AI does the typing. You still decide what's true.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>seo</category>
      <category>ai</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>How to Manage All Your WordPress Sites from One ChatGPT or Claude Chat</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:38:07 +0000</pubDate>
      <link>https://dev.to/gobuildwp/how-to-manage-all-your-wordpress-sites-from-one-chatgpt-or-claude-chat-283e</link>
      <guid>https://dev.to/gobuildwp/how-to-manage-all-your-wordpress-sites-from-one-chatgpt-or-claude-chat-283e</guid>
      <description>&lt;p&gt;GoBuildWP (formerly WPPilot) wrote this.&lt;/p&gt;

&lt;p&gt;If you look after more than one WordPress site, the boring part is not the writing. It is the doors. Open the shop, check it, open the brochure site, open the client's blog, and try to remember which login is which. Use an AI app as well and you do that job a second time: add this site, sign in, add the next site, sign in again. Two sites and two apps is four connections. Ten sites is an afternoon.&lt;/p&gt;

&lt;p&gt;There is an optional way around the pairs. Connect each WordPress site once to a &lt;a href="https://gobuildwp.com/cloud" rel="noopener noreferrer"&gt;GoBuildWP Cloud&lt;/a&gt; account, then add one link to ChatGPT, Claude, or another app you already use. After that you talk to those sites from that chat. The site still decides what is allowed. Cloud only passes the call on.&lt;/p&gt;

&lt;p&gt;This is the setup as the site described it on 4 October 2026. It is not a claim that a chat will run a portfolio while you are away. The first job below is a read. Check the answer before you let anything write.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a connection per site gets old
&lt;/h2&gt;

&lt;p&gt;A direct connection is still the right idea for one site. The free plugin makes that site its own server. The app talks to it. There is no relay and no GoBuildWP account. If you have one blog and one app, stop there. The &lt;a href="https://gobuildwp.com/wordpress-mcp/chatgpt" rel="noopener noreferrer"&gt;direct ChatGPT guide&lt;/a&gt; is the shorter path.&lt;/p&gt;

&lt;p&gt;The mess is the pairs. Each new site needs a connection in each app, and each new app needs a connection on each site. Miss one and you will sit in a chat that sounds sure of itself and is not looking at the site you mean.&lt;/p&gt;

&lt;p&gt;Cloud flips that. Each site connects once to your account. Each app connects once to Cloud. Adding a site is one step. Adding an app is one step. The docs say it the plain way: without Cloud, every AI app needs its own connection to every site, which is fine for one site and tedious for ten.&lt;/p&gt;

&lt;p&gt;The rules do not move off the site. A call still ends there, under that site's safety profile, confirmations, and change ledger. Undo stays there too. Cloud cannot do more than the site granted when you connected it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you are connecting
&lt;/h2&gt;

&lt;p&gt;The account is at app.gobuildwp.com. Every app uses the same link, &lt;code&gt;https://app.gobuildwp.com/mcp&lt;/code&gt;. You paste it once per app and sign in with OAuth. You do not keep a different URL for the shop and another for the blog.&lt;/p&gt;

&lt;p&gt;On each site, install GoBuildWP Free 1.17 or newer. The free release named on the site is 1.17.0. Pro, where a site has it, is 1.11.0. WordPress has to be 6.9 or newer, and PHP 8.0 or newer. The site needs HTTPS, except a local development environment. PHP needs the sodium extension, because the site creates a signing key for Cloud. If sodium is missing, the host has to enable it.&lt;/p&gt;

&lt;p&gt;Switch AI abilities on under GoBuildWP, then Settings, before you open Connect. Cloud tests the connection before it finishes. A site with abilities off refuses to start and tells you to turn them on.&lt;/p&gt;

&lt;p&gt;Be signed in to wp-admin as the WordPress user you want the AI to act as. The confirmation names that user, and later calls run as that user, with that user's capabilities, under the access you picked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect the first site in Read Only
&lt;/h2&gt;

&lt;p&gt;Create the account at app.gobuildwp.com. Cloud is free for up to three connected sites, with every single-site feature. There is no separate Cloud price.&lt;/p&gt;

&lt;p&gt;On the first site, open GoBuildWP, then Connect, then GoBuildWP Cloud, and select Connect to GoBuildWP Cloud. A browser tab opens. Sign in.&lt;/p&gt;

&lt;p&gt;Choose Read Only. The access you pick is the most Cloud can ever use on that site. Connecting every site as Production Safe because it is quicker means every AI app you later allow in can write to all of them. Connect in Read Only, prove a read, then reconnect only the sites that need writes.&lt;/p&gt;

&lt;p&gt;Read the confirmation. It spells the grant out in one sentence: this site, your Cloud account with the email masked, the access level, and the WordPress user the connection will act as. Cancel leaves the site untouched.&lt;/p&gt;

&lt;p&gt;You never see the key and you never copy it. The browser only carries a one-time code. The site creates an access token and sends it server to server. Cloud stores it encrypted, then calls the site back to check the connection. The panel should say the site is connected, with the account and a Site ID. In the Cloud account it appears under Sites, with a heartbeat, a last-check time, the name, the URL, the GoBuildWP versions, and health.&lt;/p&gt;

&lt;p&gt;Do the second site the same way, still Read Only, and leave the third slot until those two answer. Three is the free cap. One site links to one Cloud account. If it is already connected, disconnect first. A request lasts about ten minutes and belongs to the admin who started it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add the one link to the app you use
&lt;/h2&gt;

&lt;p&gt;Once per app, not once per site.&lt;/p&gt;

&lt;p&gt;In ChatGPT on the web, open Settings, then Security and login, and turn on Developer mode. Open Plugins, select the plus button, and paste &lt;code&gt;https://app.gobuildwp.com/mcp&lt;/code&gt;. Authentication is OAuth. Sign in to the Cloud account when asked. A GoBuildWP plugin for ChatGPT, with a sites panel, an @-mention for a site, settings inside the chat, and approval forms, is coming to the plugin directory. It is not listed yet. Until it is, Developer mode is the route, and it works through the Cloud account.&lt;/p&gt;

&lt;p&gt;In Claude, add a custom connector with the same link on claude.ai. It is then available on desktop and mobile too. In Claude Code the documented command is &lt;code&gt;claude mcp add --transport http wppilot-cloud&lt;/code&gt; followed by the link. In Cursor, add the link as a remote MCP server and sign in when Cursor asks.&lt;/p&gt;

&lt;p&gt;The same once-per-app sign-in covers Claude Code, VS Code Copilot, Codex, Gemini CLI, Antigravity, Windsurf, Zed, Kiro, and JetBrains Junie. Cline, scripts, and CI jobs cannot use a browser sign-in. For those, create a personal access token, limit it to the sites that job needs, set an expiry, and revoke it when the job ends.&lt;/p&gt;

&lt;p&gt;After the app signs in, pick the sites it may reach. You can make that connection read-only even on a Production Safe site, and a read-only connection stays read-only. Revoke the app from the account when you want it gone. Attach one app first. If three apps answer strangely on the same afternoon, you will not know which sign-in failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask for one job you can check
&lt;/h2&gt;

&lt;p&gt;Do not start with "update every plugin" or "rewrite every homepage." Start with a question you can check yourself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List the WordPress sites you can reach through GoBuildWP Cloud.
For each one, give me the name, the URL, and the health you can see.
Do not change anything. If a site is missing, say so. Do not guess.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get the sites you allowed that app to reach. If the reply names a site you did not connect, or invents a plugin list without looking, stop. The app is not on the Cloud link yet.&lt;/p&gt;

&lt;p&gt;The gateway tools behind a normal request are dull, which is what you want. &lt;code&gt;sites_list&lt;/code&gt; finds the sites the app may reach. &lt;code&gt;site_tools&lt;/code&gt; reads one site's tool list and schemas. &lt;code&gt;run&lt;/code&gt; calls one tool on one site. The app has to name the site on each call. It does not see every site's abilities as if they all lived in the chat. If a tool list comes back empty, open that site under Sites and use Check now. The gateway caches what the site reported at its last check.&lt;/p&gt;

&lt;p&gt;When the list matches, ask for a second read on one site only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;On [the site name you just saw], show the recent changes in the change log.
Do not undo anything. If you cannot see a log, say that and stop.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those reads are &lt;code&gt;changes&lt;/code&gt; and &lt;code&gt;change_detail&lt;/code&gt;. Undo is a separate tool, and the site may ask you to confirm it. Do not use it on this pass. Open wp-admin and see whether the log in the chat is the log on the site. That is the test. A chat that names your sites and shows a change you recognise is connected. A chat that writes a smooth status report with no site names is not.&lt;/p&gt;

&lt;p&gt;Only after that read checks out should you move a site to Production Safe, and only a site that needs a write. Disconnect it and connect again. You cannot edit the Cloud token's limits on the Connect screen, because Cloud keeps what was agreed at connect time. Revoking the token from the list does the same as Disconnect.&lt;/p&gt;

&lt;p&gt;If most apps should only read and one should edit, connect the site as Production Safe and mark the other apps read-only. That applies at once. You do not reconnect the site for it.&lt;/p&gt;

&lt;p&gt;ChatGPT can show an approval pop-up before a risky action. Treat it as a pause. The action still runs on the site, under that site's profile and confirmations, and it lands in that site's change ledger. If you need it back, undo is on the site. The &lt;a href="https://gobuildwp.com/wordpress-mcp/undo-rollback" rel="noopener noreferrer"&gt;undo and rollback&lt;/a&gt; page is the longer account of what a restore can put back. Read it before you undo a client site from a chat window.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stays on each site
&lt;/h2&gt;

&lt;p&gt;"All your sites in one chat" sounds like one big site. It is not.&lt;/p&gt;

&lt;p&gt;Each site keeps its own safety profile. Read Only on the brochure site does not loosen because the shop is Production Safe. Production Safe still blocks raw PHP, WP-CLI, filesystem and database access, plugin and theme installation, and temporary administrator access. Developer Full Access is a different profile, for deliberate development or staging. The Cloud choice the docs describe is Read Only or Production Safe. It is not a switch that turns those blocks off.&lt;/p&gt;

&lt;p&gt;Confirmations stay on the site. So does the change ledger, and so does undo. Disconnect from the Cloud account or from GoBuildWP, then Connect, in wp-admin, and the key stops working from either side.&lt;/p&gt;

&lt;p&gt;Cloud does keep a few things, and the Cloud page lists them: your email and a hashed password; each site's URL, name, versions, and health; the encrypted key; which apps may reach which sites; a gateway log of tool name, site, outcome, time, and any error, kept 90 days. Bulk runs, if you use them later, keep the tool, the arguments, and each site's result for 30 days. Sign-in sessions store a browser name and a hashed IP address. Cloud does not store WordPress passwords, and it does not keep pages, posts, or products, except what a bulk run returns, which is deleted after 30 days.&lt;/p&gt;

&lt;p&gt;You can tell ChatGPT what to do when a site's state changes. The events named on the page are a site going down, coming back, a key revoked, a site connected, and a bulk run finishing. An action started by an event still goes through that site's safety profile and confirmations, and it still lands in the ledger. "Tell me if the shop goes down" is a fair first instruction. "If anything looks wrong, change the settings" is how you get a surprise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three sites on the free account, and what Pro adds
&lt;/h2&gt;

&lt;p&gt;Cloud has no price of its own. Free covers three connected sites. A Pro licence linked to the account raises the limit and unlocks bulk actions. The same email links automatically. A different email can be proved from the Cloud account.&lt;/p&gt;

&lt;p&gt;The figures on the Cloud page are the Pro plugin prices, in USD before tax. Solo is $39 a year or $59.99 once. It licences Pro on one site and keeps Cloud's three, with bulk actions. Crew is $59.99 a year or $79.99 once, for 10 Pro sites and 10 Cloud sites. Fleet is $79.99 a year or $119.99 once, for 100 and 100. Command is $99.99 a year or $199.99 once, unlimited on both. Pro includes priority support, meaning a faster first reply. Check the &lt;a href="https://gobuildwp.com/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; before you pay.&lt;/p&gt;

&lt;p&gt;Bulk is the part people mean by "do this on all of them," and it is not on the free Cloud account. On every Pro plan you can run one tool, with the same arguments, on many sites, in the background. &lt;code&gt;bulk_status&lt;/code&gt; reports each site. The app needs bulk permission on its connection. Start with a dry run, which shows what would happen before anything does. The Bulk actions screen lists recent runs and can start one by hand. When a run finishes, an event can summarise what changed and what failed. Read it. A dry run you skip is a slower way to make the same mistake on every site.&lt;/p&gt;

&lt;p&gt;Pro tools appear in Cloud only where Pro is installed. Putting ten sites on the account does not install Pro on ten sites. On Solo, the other Cloud sites stay on what Free can do unless they are licensed another way. If you are sorting client work, the &lt;a href="https://gobuildwp.com/for/agencies" rel="noopener noreferrer"&gt;agencies page&lt;/a&gt; is the page written for a portfolio. Use the Cloud page for the site counts. Do not assume a chat can call a Pro tool on a site that only has Free.&lt;/p&gt;

&lt;h2&gt;
  
  
  If it refuses to connect
&lt;/h2&gt;

&lt;p&gt;A failed connect leaves the site as it was, unless the message says the token was revoked.&lt;/p&gt;

&lt;p&gt;No HTTPS, and Cloud cannot be used from the site. No sodium, and the site cannot create the signing key. If the site could not reach Cloud, try again, then check the host's outbound firewall. If Cloud revoked the token, it could not reach the site: a login wall, an IP allowlist, or a private network. "Connection cancelled" means you backed out before Confirm.&lt;/p&gt;

&lt;h2&gt;
  
  
  After the first read works
&lt;/h2&gt;

&lt;p&gt;Ask one more read on one site, something you already know: the active plugins, or the title of the front page. Compare it with wp-admin. If you need a write, reconnect that one site as Production Safe and ask for one change you can undo.&lt;/p&gt;

&lt;p&gt;Add a second app only after the first one has done that, and a third site only after the first two show a heartbeat you trust. Leave a direct connection, with no Cloud account, on any site you do not want on the shared link. The free plugin still works without Cloud.&lt;/p&gt;

&lt;p&gt;Keep the &lt;a href="https://gobuildwp.com/docs/gobuildwp-cloud" rel="noopener noreferrer"&gt;connect guide&lt;/a&gt; open while you click through. If a label on the screen disagrees with this article, believe the screen and that guide. Menus and plans can move. The installed plugin and the live site are the record.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>wordpress</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Speed Up WordPress with ChatGPT, Claude, or Any AI</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Sun, 04 Oct 2026 15:28:17 +0000</pubDate>
      <link>https://dev.to/gobuildwp/speed-up-wordpress-with-chatgpt-by-measuring-the-page-first-2a5h</link>
      <guid>https://dev.to/gobuildwp/speed-up-wordpress-with-chatgpt-by-measuring-the-page-first-2a5h</guid>
      <description>&lt;p&gt;GoBuildWP (formerly WPPilot) wrote this.&lt;/p&gt;

&lt;p&gt;Ask ChatGPT how to raise WordPress speed and you get a familiar list. Turn on a page cache. Cut the image size. Lazy load whatever sits below the fold. Serve WebP. Watch Core Web Vitals. None of that is a measurement. The model cannot see your server, so it cannot tell you whether the last request was served from cache or built by PHP, and it cannot see the width and height attributes on the images in the HTML.&lt;/p&gt;

&lt;p&gt;Do the smaller job. Connect the site, look at what is actually installed, time two URLs, change one setting, time them again, and put the settings back if the page got worse. If you want a PageSpeed number, open PageSpeed in a browser. Do not let the chat invent it.&lt;/p&gt;

&lt;p&gt;GoBuildWP is how ChatGPT, Claude, or Cursor run that loop on a site you administer. The writes that change WordPress speed are Pro. Free can look, and it can edit one image. It cannot tune the cache.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need connected before the prompt is worth pasting
&lt;/h2&gt;

&lt;p&gt;You need three things in place. If any one of them is missing, the model will still answer, and the answer will be the generic list above.&lt;/p&gt;

&lt;p&gt;WordPress has to be running GoBuildWP, and the AI client has to be connected to that site. "Connected" is not a mood. It means the client can call the site and get a result back from an ability, not a paragraph from memory. The easiest test is to ask which site it is attached to and to ask it to run a read before it gives advice. If it starts recommending plugins you did not ask about, it is not looking at the site yet.&lt;/p&gt;

&lt;p&gt;The client can be ChatGPT, Claude, or Cursor. The steps are the same. What changes is where the calls come from. On ChatGPT the site must be public HTTPS. Those calls come from OpenAI's servers, so localhost will not answer, and a password-protected staging site will not answer either. Developer mode is documented for Plus, Pro, Business, Enterprise, and Education on the ChatGPT site. A workspace policy can disable it. If the app does not show up in the picker, fix that before you touch a cache setting. You will otherwise spend an hour judging advice that never left the chat.&lt;/p&gt;

&lt;p&gt;A cache or optimisation plugin has to be installed and active already. GoBuildWP does not bring its own page cache. The cache module loads only while a supported cache or optimisation plugin is active. If none is active, the module does not load, and there is nothing for the prompt to tune. LiteSpeed Cache, WP Rocket, WP Fastest Cache, SiteGround Speed Optimizer, and WP-Optimize are among the plugins whose settings share one vocabulary. Ten drivers share that vocabulary. Of 26 layers, Autoptimize, Perfmatters, and Converter for Media are the three that sit under assets and images. The rest are detected by native option names, a purge callback, or read-only evidence. You install and activate the cache plugin in wp-admin. The prompt does not do that for you.&lt;/p&gt;

&lt;p&gt;Free and Pro are different tools, and it saves a lot of confusion to know which one you are holding. Free includes a performance audit. That audit is a set of bounded server checks, and it does not make a synthetic speed claim. Free also includes system status for WordPress, PHP, the database, cron, cache, and the plugin runtime. Status will show you whether caching looks present. It will not change LiteSpeed Cache, WP Rocket, SiteGround Speed Optimizer, or any other plugin. The cache module is Pro. Its 14 abilities register only while the licence is active, and the module is on every Pro plan. Pricing stays on the site, so this walk-through does not repeat it. Check the &lt;a href="https://gobuildwp.com/docs/reference/platform" rel="noopener noreferrer"&gt;platform reference&lt;/a&gt; and the &lt;a href="https://gobuildwp.com/features" rel="noopener noreferrer"&gt;feature list&lt;/a&gt; if you want the current split. On 4 October 2026 those pages listed Free 1.16.0 and Pro 1.10.0.&lt;/p&gt;

&lt;p&gt;Two modes matter once you are on Pro. Read Only lists layers, reads settings, and measures. Production Safe is for writes. Stay on Read Only until you have a baseline you have actually read. A baseline you skipped is how people "optimise" a page that was already fine, or break one that was not.&lt;/p&gt;

&lt;p&gt;Pick two URLs and write them down before you open the chat. The home page, and one heavier URL. A shop or a checkout is a fair second page if you sell anything. Warming later accepts up to ten URLs. Two is enough for a before-and-after that you can hold in your head. Ten pages times three repeats is a spreadsheet, and you will not compare it honestly.&lt;/p&gt;

&lt;p&gt;Have a note open as well. You are going to copy four things out of the first measure: HIT or MISS on each repeat, the time to first byte, the count of images missing width, height, or a loading attribute, and the names of any render-blocking stylesheets or head scripts. Those four lines are the whole decision. Everything else in a long reply is commentary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paste this prompt, then read what each step returns
&lt;/h2&gt;

&lt;p&gt;Paste this into ChatGPT with the app selected, or follow the same order in Claude or Cursor. Change the two URLs. Do not add a sentence that asks for a Core Web Vitals score. If you add it, you are asking the model to guess, and it will.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Audit the speed of https://your-site.com/ and https://your-site.com/shop/.
1. Run cache-check-setup and list every layer you find, including edge layers you cannot purge.
2. Start a cache experiment before changing anything.
3. Measure both URLs three times. Give me TTFB, HIT or MISS, HTML size, and render-blocking files as a baseline. Also say how many images lack width, height, or a loading attribute.
4. Propose the single lowest-risk change and wait for my OK. Prefer an images.* key such as lazy-load or missing sizes before any CSS or JS combine, defer, or delay.
5. Apply only that change, purge, warm both URLs, and measure again.
6. Run cache-verify-in-browser and give me the browser checks and PageSpeed links. Do not claim a score you did not open.
7. If anything got worse or a check fails, revert the experiment.
Never enable combine, defer, delay, critical CSS, or logged-in caching without asking me first.
Do not say you recompressed image files. If next-gen images need a converter, say which plugin screen I still have to run.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A useful reply is dull. It names what it called, it shows what came back, and it stops when the prompt says to wait. A bad reply sounds finished. It announces an LCP, it says the library was converted to WebP, or it says Cloudflare is clear. Those are not results this plugin can produce. If you see them, stop the run and tell it to stick to the prompt. Then make it repeat the step from the tool output, not from a summary it wrote on top.&lt;/p&gt;

&lt;p&gt;Here is what each step should hand you, and what you should type back.&lt;/p&gt;

&lt;p&gt;Step 1 runs cache-check-setup and lists every layer, including edge layers it cannot purge. You want names. A page cache. An asset optimiser. An object cache. An edge layer, if one is in front, such as Cloudflare or a host cache. The edge line is the one people skip, and it is the one that makes a later purge look like it failed. If the reply says no supported plugin is active, stop. There is no cache module to drive. Activate the plugin you already installed, then start again. Do not let the model suggest a new plugin and turn it on in the same breath.&lt;/p&gt;

&lt;p&gt;What you type if the list looks real: "Snapshot that. Do not change anything yet." What you type if it is vague: "Name each layer and say which ones you can purge. Do not recommend a setting until you have."&lt;/p&gt;

&lt;p&gt;Step 2 starts a cache experiment before any write. The snapshot covers the page cache, the asset optimiser, the object cache, and any edge layer. Taking the snapshot writes nothing. Only the newest five experiments are kept, so a sixth start drops the oldest. You want this snapshot even when you are sure the change is harmless. Revert later restores every layer in that snapshot. It cannot restore a plugin you never included, and one rollback cannot span two plugins. If you have been clicking around in the cache plugin's own screens during the chat, say so, and start a fresh experiment after you stop clicking. A snapshot of a moving target is not a way back.&lt;/p&gt;

&lt;p&gt;Step 3 measures both URLs three times. Pro fetches one URL from the server on each repeat. You should see time to first byte, HIT or MISS, HTML weight, whether the response was compressed, render-blocking stylesheets and scripts in the head, a count of images missing width, height, or a loading attribute, and any font preload. Three repeats are there because one fetch is often a cold outlier, especially the first request after a quiet period. This is server-side delivery. The &lt;a href="https://gobuildwp.com/docs/reference/cache" rel="noopener noreferrer"&gt;cache reference&lt;/a&gt; calls it that on purpose. It is not a Lighthouse score and it is not Core Web Vitals. LCP, CLS, and INP exist only after a browser paints the page. GoBuildWP does not run a browser, and it does not produce a PageSpeed score. If the reply contains those three numbers, it invented them. Tell it to delete them and send the delivery fields again.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://gobuildwp.com/use-cases/speed-up-wordpress-with-chatgpt" rel="noopener noreferrer"&gt;guide to speeding up WordPress with ChatGPT&lt;/a&gt; and the &lt;a href="https://gobuildwp.com/wordpress-ai-speed-optimization" rel="noopener noreferrer"&gt;speed workflow&lt;/a&gt; put the same limit in public. Measure delivery, hand over the links, and do not pretend a score was computed. If the model cites those pages and then offers you a score anyway, believe the pages.&lt;/p&gt;

&lt;p&gt;Step 4 is a proposal. It is not a write. The lowest-risk change is an images key: lazy load, missing sizes, or the WebP flag, and only when an optimiser is already active and exposes that key. It is not CSS or JavaScript combine, defer, or delay. Those wait. The model has to stop and wait for your OK. If it applies the change in the same message as the proposal, tell it to revert and to start the experiment again. You cannot review a change that already happened, and "I already did the safe one" is how a second, less safe key sneaks in.&lt;/p&gt;

&lt;p&gt;What you type when you agree: "Apply only that one key. Then purge, warm both URLs, and measure again. Do not add another setting." What you type when the proposal is a JavaScript delay: "No. Propose an images key or say you cannot map one."&lt;/p&gt;

&lt;p&gt;Step 5 applies that single mapped setting. The write stores the old values and purges that layer. Then it warms the URLs you named, up to ten, and measures again. Right after a purge you are timing WordPress, not the page cache. That is why the warm sits between the purge and the second measure. A second measure taken on a MISS tells you how slow the origin is. It does not tell you whether the page cache helps. If the model skips the warm, say so and make it warm before you compare anything.&lt;/p&gt;

&lt;p&gt;Step 6 runs cache-verify-in-browser. The name sounds like a browser. It is not. It is a second read of HTML that was already sent. It can flag a lazy-loaded image above the fold, a missing intrinsic size, or an http image on an https page. Then it returns checks you run yourself, and PageSpeed Insights links for both form factors. You open the links. The plugin will not call the keyless PageSpeed API and invent a number that quota-fails most of the day. A quota error is not a grade, and a made-up grade is worse than no grade.&lt;/p&gt;

&lt;p&gt;Step 7 reverts if anything got worse or a check fails. Worse means the delivery numbers you wrote down, or a failed HTML check. It does not mean a PageSpeed badge you have not opened. Open the link if you want that badge. Decide the revert from the measurement you have.&lt;/p&gt;

&lt;p&gt;The last two lines of the prompt are there because models volunteer extra help. Combine, defer, delay, critical CSS, and logged-in caching stay off until you ask in a later message. And the model is not allowed to claim it recompressed image files. If next-gen images need a converter, the reply should name the plugin screen you still have to run yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read HIT, MISS, TTFB, and the image attributes
&lt;/h2&gt;

&lt;p&gt;Read HIT and MISS before you read anything about image size.&lt;/p&gt;

&lt;p&gt;HIT means a page cache served the HTML. PHP did not build the page for that request. MISS means WordPress built it. Neither word is a grade. A HIT can still be a heavy document. A MISS can be the correct result on a cart or a checkout, which often should not be cached for a logged-in shopper. On a public page, what you want after a warm is a HIT, with a time to first byte that stays in a similar range across the three runs.&lt;/p&gt;

&lt;p&gt;Time to first byte is how long the server took to start the response. It is not LCP, and it says nothing about when the largest element painted in a browser. It is still the timing this plugin can take, because the fetch happens from the server. Compare repeats of the same URL. One slow run immediately after a purge is normal. Three slow runs on a warm HIT are a different problem. An image setting will not fix a host that is slow to start sending bytes. Write that down so you do not "solve" it with a WebP flag.&lt;/p&gt;

&lt;p&gt;HTML weight is the size of the document. Compression tells you whether that document was sent compressed. A render-blocking stylesheet, or a script in the head, is listed because the browser has to handle it before paint. Seeing the file name is not a reason to defer it. Defer and delay are on the confirm list because they break things that are not visible in a server fetch, like a menu that waits on a click. Read the names. Leave the switches alone on this pass.&lt;/p&gt;

&lt;p&gt;Images show up as a count of missing attributes. No width, no height, or no loading attribute. A missing width and height is how layout shift starts, but the plugin is reporting the attribute, not a CLS score. CLS still has to be measured in a browser, which is what the PageSpeed link is for. A missing loading attribute means nothing has marked that image for lazy load. The opposite problem is a loading attribute of lazy on an image above the fold, and the HTML check is allowed to flag that. You do not want the hero to wait. An http image on an https page is mixed content. It is not really a speed finding, but it arrives in the same read, and you should not ship it because you were looking at cache.&lt;/p&gt;

&lt;p&gt;Font preload is reported when one is present. Treat it as a note. Do not add preload tags because the paragraph mentioned fonts. Preload is easy to get wrong, and this pass is one setting, not a font project.&lt;/p&gt;

&lt;p&gt;This shape is a reading exercise. It is not a result from a site, and it is not a PageSpeed report.&lt;/p&gt;

&lt;p&gt;Say the home page comes back MISS, then MISS, then HIT, and the shop comes back HIT three times. You do not average that into a win. The home page was built by WordPress twice. Warm it and measure again before you change a setting. Say instead that both URLs come back HIT three times, and thirty-odd images have no width or height. That is a reason to consider missing sizes. It is not a reason to delay JavaScript. Say both URLs are HIT and the image attributes are already present. Then you may not have an images change worth making. Stopping is a valid result. The prompt is allowed to end at step 4 with "no change."&lt;/p&gt;

&lt;p&gt;When you do open the PageSpeed links, treat them as a second instrument. Mobile and desktop are different runs. A steady server time to first byte can sit next to a weak largest-paint figure if the hero file is enormous. That gap is the useful part. It tells you the next job might be the file itself, which is not the same job as a cache setting. The server measure will not fill the gap in with a number of its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Change one setting, then warm and measure again
&lt;/h2&gt;

&lt;p&gt;Pick one of three, and only if step 1 showed an optimiser that already exposes it.&lt;/p&gt;

&lt;p&gt;Lazy load, if the baseline shows images with no loading attribute and the hero is not the thing you are trying to delay. On LiteSpeed Cache, lazy load maps to media-lazy. Iframes have their own switch, so do not assume the image switch covers embedded video or maps. Turning lazy load on marks images to load later. It does not shrink them on disk, and it does not change their pixel dimensions. If the HTML check later flags the hero as lazy, that setting was the wrong one for that theme, or it needs an exclusion you set in the cache plugin. Do not add a second GoBuildWP write to paper over it.&lt;/p&gt;

&lt;p&gt;Missing sizes, if the loud line in the baseline is images without width and height. On LiteSpeed Cache that maps to media-add_missing_sizes. The point of the change is the attribute the measure counted. It is the one I would try first in that case, because you can see the count move, or not move, on the next measure. If the count does not move, the setting did not do what the label suggested on this site. That happens. Revert, or accept that the markup is coming from somewhere the cache plugin does not rewrite.&lt;/p&gt;

&lt;p&gt;The WebP flag, if you specifically want next-gen responses and a converter is already in the stack. On LiteSpeed Cache the next-gen flag maps to img_optm-webp. The flag tells that plugin it may serve next-gen files. It does not create the files. GoBuildWP does not recompress images. It can change settings the optimiser exposes, and it can see Converter for Media, which is a plugin that creates the WebP and AVIF files. Start that conversion on Converter for Media's own screen. Then come back and measure. A flag with no files behind it does not change what a visitor downloads, and a chat that says "WebP is on" without that screen is describing a checkbox, not a file.&lt;/p&gt;

&lt;p&gt;The same words are what the other drivers should use. WP Rocket, WP Fastest Cache, SiteGround Speed Optimizer, and WP-Optimize sit in that shared vocabulary, so the proposal should say lazy load, missing sizes, or the next-gen flag, not a private key the model invented. If it cannot map the key on your plugin, it should say so and stop. Guessing an option name is how you write a row that nothing reads.&lt;/p&gt;

&lt;p&gt;One mapped write purges that layer and stores the old values. Then warm the same two URLs. Then measure both, three times each. Compare against the four lines you copied down. You want a HIT on the public page, a time to first byte you can set next to the baseline, and, if you changed an image setting, a count of missing attributes that went the right way. You do not want a new Core Web Vitals badge. There is no score badge to paste into a slide. Open the PageSpeed link if someone asks for the number.&lt;/p&gt;

&lt;p&gt;Run cache-verify-in-browser again after the second measure. If lazy load is now on and the check flags an above-the-fold image, that is a failed check. Revert, or exclude that image in the cache plugin's own screen, and measure once more. Do not stack another setting on a failed check to balance it. Two changes in one experiment means you will not know which one moved the time to first byte.&lt;/p&gt;

&lt;p&gt;A saved value can still do nothing on the wire. The HTML check reports that as blocked by the environment when there is no rewrite file, or when the edge is not caching HTML. If you see that note, the setting is stored and the visitor is not receiving it. Revert, or fix the rewrite or the edge outside this plugin, then measure again. Do not keep tuning keys that the check has already told you are not reaching the response.&lt;/p&gt;

&lt;p&gt;Image size, as a file on disk, is a separate job from these three keys. The keys change how an existing optimiser treats images. They do not run a compressor across the library. If one hero file is the actual problem, that is the Free edit described later, or a conversion you start in the image plugin. Do not describe either of those as the cache module recompressing the uploads folder. It does not.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to revert
&lt;/h2&gt;

&lt;p&gt;Revert when the second measure is worse, or when a check fails. Worse is specific. A higher time to first byte on a warm HIT. A public page that used to HIT and now stays on MISS. A larger HTML file you did not mean to grow. A new render-blocking file. A failed check includes a lazy hero, a size attribute that is still missing after a setting that claimed to add sizes, or mixed content that was not there before.&lt;/p&gt;

&lt;p&gt;Reverting the experiment puts every layer in the snapshot back. That is the page cache, the asset optimiser, the object cache, and the edge layer you recorded. It does not reach a second plugin you changed by hand in another tab. One rollback cannot span two plugins. If you touched two, you need a way back for each, and this experiment is only one of them.&lt;/p&gt;

&lt;p&gt;Revert writes option rows directly. A generated config may still need one re-save in that plugin's own screen before the response matches the option. If the HTML check still looks wrong after a revert, do that re-save, purge the WordPress layer, warm, and measure once more before you decide the revert failed. The option row and the file the server actually reads are not always the same thing, and the plugin tells you that rather than pretending the wire moved.&lt;/p&gt;

&lt;p&gt;Some keys are refused unless you confirm them: css.combine, css.critical, css.unused_css_removal, css.defer, js.combine, js.defer, js.delay, cdn.enabled, cdn.hosts, and page_cache.cache_logged_in. Leave them for another day, after an image setting has been measured and kept or reverted. If you do confirm one, open the menu and the cart in a browser before you keep it. Combined or delayed JavaScript is a common way to lose a mobile menu or a mini-cart. The server measure does not click those controls. You do.&lt;/p&gt;

&lt;p&gt;Purge is not revert, and it is not a full clear of the internet in front of your site. Purge clears WordPress layers for the whole site, for one URL, or for one post. It does not clear Cloudflare, a firewall, or a host edge. If step 1 listed an edge layer, assume that layer can still be holding the old HTML until its own lifetime ends or you purge it in that product's dashboard. People see a MISS inside WordPress and a stale page in the browser for exactly this reason. The browser is not lying. A different cache is answering it.&lt;/p&gt;

&lt;p&gt;A crawler, a preload, or a database clean that deletes rows needs confirmation, and it cannot be undone. The change ledger restores settings. It does not restore deleted revisions or comments. Do not confirm a database clean because a speed article on the internet said revisions slow sites down. That is a different project, with a backup, on a day you are not also changing the page cache.&lt;/p&gt;

&lt;p&gt;If you are unsure, revert. You lose the experiment and a few minutes. You do not lose the menu.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Free can do if you do not have Pro
&lt;/h2&gt;

&lt;p&gt;Without Pro you cannot run the cache experiment, and you should not ask the model to imitate it. The 14 cache abilities are not there unless the licence is active and a supported plugin is active. A confident paragraph about your page cache, written with no tool result under it, is the generic list again.&lt;/p&gt;

&lt;p&gt;On Free, run performance-audit and system-status before any write. The audit is bounded server-side performance checks without a synthetic speed claim. Status is the concise report of WordPress, PHP, the database, cron, cache, and the GoBuildWP runtime. Use them to see whether a cache looks present and whether the server is obviously short of memory, stuck on cron, or missing something basic. They do not replace the Pro measure of a URL, and they will not flip a switch in LiteSpeed Cache, WP Rocket, SiteGround Speed Optimizer, or any other plugin.&lt;/p&gt;

&lt;p&gt;Free can edit one image in the media library, using WordPress's own editor, in the order you pass the operations. You can resize, crop, rotate, or flip that one file. Resize stays inside a box and keeps the ratio, so you describe the box, not a stretched width. Angles are 90, 180, or 270. Copy is the default. Copy saves a new attachment, and pages that already use the old file keep using it until you change them. Replace writes a new file on the same attachment and keeps the old file as a backup, which means every page using that image changes. That is the one you want for a hero that is on the home page, and the one you should look at in a browser afterwards. Sides cap at 8000 pixels. Upscaling is refused unless you allow it. The formats are JPEG, PNG, GIF, WebP, and AVIF. Files are never deleted. Both modes undo from the change log.&lt;/p&gt;

&lt;p&gt;That is one file. It is not a bulk recompress, and it is not a library-wide WebP conversion. If the hero is a very wide JPEG shown much smaller, resizing that one attachment is a fair Free job. Name the attachment, name the box, and say copy or replace. Then look at the page. There is still no PageSpeed score inside the plugin. Open PageSpeed yourself if you want one.&lt;/p&gt;

&lt;p&gt;The rest of the loop, on Free, is yours to do in the cache plugin's screens. Read the status. Fix the one image that is actually huge. Turn on lazy load in that plugin if you are willing to check the hero afterwards. The model can tell you which screen to open. It should not claim it flipped the switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Time saved is not a score
&lt;/h2&gt;

&lt;p&gt;Jinny Klink left a 5-star review of GoBuildWP Pro on Freemius. It is not on gobuildwp.com yet, so you will not find this quote on the marketing site. She does not mention a score, a grade, or Core Web Vitals. I am including it once because she is talking about time, which is what this loop is for: less back-and-forth, one change you can undo, instead of a week of pasted advice. She is not proof that a measurement came back green.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Game changer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I was spending hours trying to speed up my website when I thought to myself, "I wonder if an AI agent can just do this?" I found WordPress Pilot, and suddenly I'd sped up my website, created new pages, built new forms, and set up new booking systemsâ€”all within a day. What I managed to get done in one day would previously have taken me about two weeks of going back and forth with ChatGPT and doing everything manually. AI was already a game changer for me. WordPress Pilot feels like a 10x multiplier on that game changer. Absolutely excellent. I genuinely can't believe how much time it has saved me.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read that as a day of work set against two weeks of copying steps out of a chat and doing them by hand. Do not read it as an LCP, and do not ask the model to produce a number that would make the review "complete." The review is complete as a note about time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this will not do
&lt;/h2&gt;

&lt;p&gt;It will not invent a Core Web Vitals number. LCP, CLS, and INP need a browser paint. You get PageSpeed links for mobile and desktop. You open them. If a client, a boss, or a report template demands a score, the score comes from that page, not from the chat transcript.&lt;/p&gt;

&lt;p&gt;It will not recompress images in bulk, and it will not quietly rewrite the library to WebP. One Free edit changes one file through WordPress's editor. A Pro image setting flips a switch in a plugin you already run. Next-gen files exist only after that image plugin creates them. Until you run that screen, there is nothing new to serve.&lt;/p&gt;

&lt;p&gt;It will not purge Cloudflare, a firewall, or a host edge. If one of those sits in front of WordPress, your HIT can be their HIT, and a purge here did not touch it. The check-setup list is how you see that before you celebrate.&lt;/p&gt;

&lt;p&gt;It will not fix slow hosting, a heavy theme, or an unindexed database. Those are not a checkbox. If three warm HITs are still slow, the next conversation is about the host or the theme, not about another image flag. Say that out loud in the chat so the model does not keep proposing keys.&lt;/p&gt;

&lt;p&gt;It will not cache logged-in users, combine CSS, defer or delay JavaScript, or turn on a CDN host unless you confirm those keys. Even then you owe yourself a look at the menu and the cart before you keep the change.&lt;/p&gt;

&lt;p&gt;On Free, run the audit and the status report before any write. On Pro, list the layers and measure WordPress speed first. Then one change. Then the same measure. Then the PageSpeed link, in a browser, which is the only place that number exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix
&lt;/h2&gt;

&lt;p&gt;Versions cited from the public pages on 4 October 2026: Free 1.16.0 and Pro 1.10.0. Confirm them on the feature list and the platform reference if you are reading this later. The refused keys, the 8000 pixel cap, the five-experiment limit, and the ten-URL warm cap are the limits this walk-through used. If a page on the site disagrees with a sentence here, the site wins.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>chatgpt</category>
      <category>performance</category>
    </item>
    <item>
      <title>Claude says "Couldn't reach the MCP server" on WordPress — usually it is not the plugin</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Sat, 03 Oct 2026 05:19:49 +0000</pubDate>
      <link>https://dev.to/gobuildwp/claude-says-couldnt-reach-the-mcp-server-on-wordpress-usually-it-is-not-the-plugin-4akh</link>
      <guid>https://dev.to/gobuildwp/claude-says-couldnt-reach-the-mcp-server-on-wordpress-usually-it-is-not-the-plugin-4akh</guid>
      <description>&lt;h2&gt;
  
  
  What GoBuildWP (formerly WPPilot) provides, honestly
&lt;/h2&gt;

&lt;p&gt;GoBuildWP is a self-hosted WordPress MCP plugin. The &lt;strong&gt;Free&lt;/strong&gt; version provides the MCP endpoints, OAuth and Application Password options, safety profiles, preview-before-write, a change ledger, and the core abilities needed for WordPress administration. Your site remains the server; there is no GoBuildWP relay or hosted chatbot in the request path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt; adds plugin modules and an approval queue, including integrations for areas such as page builders, WooCommerce, and SEO tools. Those additions do not change the basic debugging rule: establish reliable HTTPS reachability first, then authorize only what the connected user and safety profile should allow.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick decision tree
&lt;/h2&gt;

&lt;p&gt;If curl returns a CDN challenge or HTML, fix the proxy, firewall, or cache. If curl returns JSON but OAuth loops, verify the discovery URLs, redirect URI, clock, and callback handling. If OAuth completes but no tools appear, inspect the MCP route and server registration. If tools appear but writes fail, review the safety profile and WordPress capabilities. Treat each as a separate layer instead of rotating credentials at random.&lt;/p&gt;

&lt;p&gt;The useful question is not “Why is the plugin silent?” It is “Which layer stopped the request?” Reachability, authentication, authorization, and tool execution are observable in that order. Once you keep them separate, “Couldn’t reach the MCP server” becomes a short checklist rather than a mystery.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I work on &lt;a href="https://gobuildwp.com" rel="noopener noreferrer"&gt;GoBuildWP&lt;/a&gt;, a self-hosted WordPress MCP plugin. The examples above describe its capabilities and general troubleshooting patterns; always verify the routes and client requirements for your own deployment.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>wordpress</category>
      <category>woocommerce</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Change a published WordPress post's title and excerpt with Claude, but stage it so the live page stays put</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Tue, 29 Sep 2026 11:48:26 +0000</pubDate>
      <link>https://dev.to/gobuildwp/change-a-published-wordpress-posts-title-and-excerpt-with-claude-but-stage-it-so-the-live-page-3573</link>
      <guid>https://dev.to/gobuildwp/change-a-published-wordpress-posts-title-and-excerpt-with-claude-but-stage-it-so-the-live-page-3573</guid>
      <description>&lt;p&gt;A published post is already in Google, in the newsletter archive, and in someone's open tab. The edit you actually want is often small: the title is vague, the excerpt is the first sentence of the intro, and the body is fine. The risky way to hand that to an AI client is "update this post." The safe way is to make the client &lt;strong&gt;propose the edit, show you the diff, and write nothing until you apply it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This walkthrough does that one job with &lt;strong&gt;GoBuildWP (formerly WPPilot) Free&lt;/strong&gt;, a self-hosted WordPress plugin that turns your site into an MCP server. Your client (Claude, Cursor, VS Code, or another MCP client) brings its own model. There is no hosted relay in the middle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on &lt;a href="https://gobuildwp.com" rel="noopener noreferrer"&gt;GoBuildWP&lt;/a&gt;. The behaviour below is taken from the public &lt;a href="https://gobuildwp.com/docs/safety-profiles" rel="noopener noreferrer"&gt;safety profiles&lt;/a&gt; guide, the &lt;a href="https://gobuildwp.com/docs/change-ledger-and-rollback" rel="noopener noreferrer"&gt;change ledger&lt;/a&gt; guide, and the &lt;a href="https://gobuildwp.com/docs/reference/platform" rel="noopener noreferrer"&gt;platform ability reference&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What you are changing, and what you are not
&lt;/h2&gt;

&lt;p&gt;The job:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One &lt;strong&gt;already published&lt;/strong&gt; post.&lt;/li&gt;
&lt;li&gt;New title.&lt;/li&gt;
&lt;li&gt;New excerpt.&lt;/li&gt;
&lt;li&gt;Body, slug, status, author, and featured image stay as they are.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;update-post&lt;/code&gt; is a Free WordPress core ability with partial-update semantics. It accepts short field names (&lt;code&gt;title&lt;/code&gt;, &lt;code&gt;excerpt&lt;/code&gt;, and others) and only the fields you send are meant to change. That is why the prompt below names the two fields and forbids the rest. Do not let the agent "clean up the intro while it is there."&lt;/p&gt;

&lt;p&gt;This is an edit of a live post, not a new draft. Content &lt;em&gt;creation&lt;/em&gt; in GoBuildWP defaults to draft, including when a status is missing or malformed, but that default does not help you here. You are not creating anything. Preview is the control that keeps the published page unchanged until you say so.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three calls
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Call&lt;/th&gt;
&lt;th&gt;Kind&lt;/th&gt;
&lt;th&gt;What it does on this job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;preview-ability&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;Computes what &lt;code&gt;update-post&lt;/code&gt; would change. Returns a structured diff and a URL you open in wp-admin. &lt;strong&gt;Nothing is written.&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;apply-preview&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Destructive, needs confirmation&lt;/td&gt;
&lt;td&gt;Applies that exact diff, after checking the target has not changed since the preview. Refuses if it has.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;list-changes&lt;/code&gt; / &lt;code&gt;get-change&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;The redacted change ledger, newest first. There is no ledger screen in wp-admin.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Preview covers post, page, and media edits, site settings changes, and deletions. You can make preview mandatory for the site. That setting is &lt;strong&gt;off by default&lt;/strong&gt;, because turning it on changes the contract every connected agent is working to. Abilities GoBuildWP cannot preview are exempt rather than blocked: a write nobody can preview is not refused just because preview exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;You need WordPress 6.9+, PHP 8.0+, and HTTPS if the client connects from another machine.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;wppilot.zip&lt;/code&gt; from the &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp/releases/latest" rel="noopener noreferrer"&gt;latest GitHub release&lt;/a&gt;. It is not on WordPress.org. Upload it under &lt;em&gt;Plugins → Add New → Upload Plugin&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Leave the safety profile on &lt;strong&gt;Production Safe&lt;/strong&gt;, the install default. It allows ordinary content edits and blocks raw PHP, WP-CLI, filesystem and database access, and plugin or theme install and delete. A title change does not need any of those.&lt;/li&gt;
&lt;li&gt;Connect the client with an account that can already edit this post in wp-admin. MCP calls inherit that user's capabilities. A dedicated editor account is better than your own administrator login, because the ledger attributes the write to that credential.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With Claude Code over OAuth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http wppilot https://your-site.com/wp-json/mcp/wppilot-oauth
&lt;span class="c"&gt;# then /mcp and finish the browser sign-in&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other clients use the same site endpoint. Generated configs for the clients GoBuildWP documents live under &lt;a href="https://gobuildwp.com/wordpress-mcp" rel="noopener noreferrer"&gt;wordpress-mcp&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Read the post, change nothing
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Change nothing on the site.
Find the published post whose slug is "care-plans-explained".
Show me its id, title, slug, status, and excerpt, and the first 200 characters of the content so I know we have the right post.
Do not call update-post. Do not call preview-ability yet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the id against the URL in wp-admin before you continue. Preview is only as good as the target you point it at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Preview the title and excerpt only
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do not write anything yet.
Call preview-ability for update-post on post id POST_ID with only these fields:
- title: "WordPress care plans, explained without the jargon"
- excerpt: "What a care plan covers, what it does not, and how to tell a retainer from a one-off fix."
Do not send content, slug, status, author, or featured image.
Paste the field-by-field diff here, and give me the wp-admin review URL.
Stop after the preview.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;preview-ability&lt;/code&gt; is a read. The public reference says it returns a structured diff plus a URL a person can open in wp-admin to review, apply, or discard the proposal. Nothing is written by that call.&lt;/p&gt;

&lt;p&gt;Open the URL yourself. Read the diff, not just the agent's summary. Check the fields it did &lt;strong&gt;not&lt;/strong&gt; mention. The safety guide is explicit: apply from that screen, or with &lt;code&gt;apply-preview&lt;/code&gt;, rather than asking the agent to send &lt;code&gt;update-post&lt;/code&gt; again and hoping it matches what you approved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Apply only if the diff is the edit you wanted
&lt;/h2&gt;

&lt;p&gt;If the diff shows exactly two fields, title and excerpt, and the body is absent from it, apply it.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apply-preview&lt;/code&gt; is marked destructive, so it needs an explicit confirmation. It re-checks that the target has not moved since the preview. If someone edited the same fields while the proposal was waiting, it refuses and writes nothing, because the approval described a state that no longer exists. A change to fields &lt;strong&gt;outside&lt;/strong&gt; the diff is reported as a warning and the write proceeds. That is why you still want the diff to be narrow: an unrelated edit to the body is not what this refusal is for.&lt;/p&gt;

&lt;p&gt;If it refuses on drift, do not force the write. Re-run the preview and read the new diff.&lt;/p&gt;

&lt;p&gt;If the diff includes &lt;code&gt;content&lt;/code&gt;, a new slug, or &lt;code&gt;status: publish&lt;/code&gt; when you did not ask for those, discard it. Partial updates only help if the agent actually sends a partial payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Read the ledger entry for this session
&lt;/h2&gt;

&lt;p&gt;There is no change-ledger screen in wp-admin. Ask the agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Call list-changes with limit 5.
For the newest entry that is this update-post, call get-change.
Tell me: which credential acted, which ability ran, whether rollback is available, and whether any secret-looking value was stored.
Do not roll anything back.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;list-changes&lt;/code&gt; takes a limit and returns the newest records first. Each record includes the ability, the actor, risk, timing, rollback availability, and rollback state. The ledger keeps at most 500 records and is also capped by size. Values under keys that name a secret (passwords, tokens, API keys, cookies) are redacted before storage. Other inputs are kept, truncated, so the ledger can still hold site content such as the new title. Treat it as holding site content, not as an empty audit log.&lt;/p&gt;

&lt;p&gt;Attribution is the check people skip. The record names both the WordPress user and the agent credential: an OAuth client id, stored hashed, or an application-password UUID, plus the client name and version the agent introduced itself with. If you expected a dedicated editor and the entry is your own administrator account, the credential was created on the wrong user. Fix that before the next session. Writes that arrive from wp-admin, WP-CLI, or another plugin, outside an authenticated MCP request, are recorded as &lt;code&gt;direct&lt;/code&gt; rather than blamed on the last agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  If the new title is wrong
&lt;/h2&gt;

&lt;p&gt;Where rollback applies, &lt;code&gt;rollback-change&lt;/code&gt; restores the previous WordPress state for that record and marks the original entry as rolled back, with the time it happened. It does not add a separate ledger entry for the rollback. It succeeds only when the observed result matches the stored before-image fingerprint, and it never marks success when verification differs. It needs explicit confirmation.&lt;/p&gt;

&lt;p&gt;Rollback is not universal and it is not a backup. It does not restore a database, undo a change made outside GoBuildWP, or pull back an email, a webhook, or a cached copy that already left WordPress. A title change on a post is the sort of record the features documentation shows as rollback-available, but the ledger entry itself is what reports rollback availability for the write you just made. Read that field. Do not assume every ability works the same way. SEO metadata edits and some commerce edits are recorded with no rollback. Those are different jobs, and they are not this one.&lt;/p&gt;

&lt;p&gt;After a rollback, open the post logged out. Do not trust the tool response alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this workflow does not do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It does not make preview mandatory. You turned nothing on. The agent could still call &lt;code&gt;update-post&lt;/code&gt; directly unless you require preview in settings, or you refuse to continue when it skips the preview.&lt;/li&gt;
&lt;li&gt;It does not review writes GoBuildWP cannot preview. Those stay exempt, not blocked.&lt;/li&gt;
&lt;li&gt;It does not replace a backup before a large batch. One title and one excerpt do not need a heroic restore plan. Fifty posts do.&lt;/li&gt;
&lt;li&gt;The human approval queue, which holds every write until a person signs it off, is &lt;strong&gt;GoBuildWP Pro&lt;/strong&gt;. This article does not use it. Preview on Free is the control for a person who is in the session.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern is the same the next time the edit is a page title or a media field that preview supports: read the object, preview one ability with only the fields you mean, apply that diff, then read the ledger entry that names the credential. The live page should change once, in the shape you already saw.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gobuildwp.com/docs/safety-profiles" rel="noopener noreferrer"&gt;Safety profiles and preview before write&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gobuildwp.com/docs/change-ledger-and-rollback" rel="noopener noreferrer"&gt;Change ledger and rollback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gobuildwp.com/docs/reference/platform" rel="noopener noreferrer"&gt;Platform abilities: preview-ability, apply-preview, list-changes, get-change, rollback-change&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gobuildwp.com" rel="noopener noreferrer"&gt;GoBuildWP Free&lt;/a&gt; and the &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp/releases/latest" rel="noopener noreferrer"&gt;GitHub releases&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>wordpress</category>
      <category>ai</category>
      <category>mcp</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Rebuild a WordPress navigation menu with Claude without touching the live header until you're ready</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Tue, 29 Sep 2026 00:13:23 +0000</pubDate>
      <link>https://dev.to/gobuildwp/rebuild-a-wordpress-navigation-menu-with-claude-without-touching-the-live-header-until-youre-ready-216n</link>
      <guid>https://dev.to/gobuildwp/rebuild-a-wordpress-navigation-menu-with-claude-without-touching-the-live-header-until-youre-ready-216n</guid>
      <description>&lt;p&gt;Reorganising a site's main menu is one of those jobs that sounds small and isn't. A client wants "Services" split into three, the blog moved under "Resources", two dead links gone and the order changed. In wp-admin that's twenty minutes of dragging items around &lt;strong&gt;on the menu visitors are using right now&lt;/strong&gt;. One wrong drop and the header is broken until you notice.&lt;/p&gt;

&lt;p&gt;It's also a job people now ask an AI client to do. The risky way is to let the agent edit the live menu item by item. This post shows a safer pattern that works with any MCP client (Claude Code, Claude Desktop, Cursor, VS Code and others): &lt;strong&gt;build the new menu beside the old one, check it, swap the theme location, and keep the old menu as your way back.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything here uses &lt;strong&gt;GoBuildWP (formerly WPPilot) Free&lt;/strong&gt;, a self-hosted WordPress plugin that turns your site into an MCP server. Your AI client brings its own model; there's no relay in between.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on &lt;a href="https://gobuildwp.com" rel="noopener noreferrer"&gt;GoBuildWP&lt;/a&gt;. Ability names and behaviour below are taken from the public &lt;a href="https://gobuildwp.com/docs/reference/wordpress-core" rel="noopener noreferrer"&gt;WordPress core ability reference&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  One scope note first: classic menus
&lt;/h2&gt;

&lt;p&gt;The menu abilities in GoBuildWP work on &lt;strong&gt;classic navigation menus&lt;/strong&gt;: the ones you manage under &lt;em&gt;Appearance → Menus&lt;/em&gt; and assign to theme locations like "Primary" or "Footer". If your site runs a block theme whose header uses a Navigation block, this exact workflow doesn't apply. Check before you start: if &lt;em&gt;Appearance → Menus&lt;/em&gt; exists and your theme lists menu locations, you're good.&lt;/p&gt;

&lt;h2&gt;
  
  
  The abilities you'll use (all Free)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Ability&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Look&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list-menus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Classic menus and the theme locations they occupy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Look&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list-menu-locations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Locations the active theme registers, and what's in each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Look&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list-menu-items&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;One menu as an ordered list with parents, targets, URLs, labels, CSS classes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Look&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list-content&lt;/code&gt;, &lt;code&gt;search-content&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Find the page and post IDs the new items should point to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;&lt;code&gt;create-menu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creates an &lt;strong&gt;empty&lt;/strong&gt; classic menu and returns its ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;&lt;code&gt;upsert-menu-item&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Adds or partially updates an item (custom URL, page, post, taxonomy…)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build&lt;/td&gt;
&lt;td&gt;&lt;code&gt;reorder-menu-items&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sets order and nesting in one call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swap&lt;/td&gt;
&lt;td&gt;&lt;code&gt;assign-menu-location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Puts a menu into a location. The previous assignment is captured first, so this is &lt;strong&gt;reversible from the change ledger&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list-changes&lt;/code&gt;, &lt;code&gt;get-change&lt;/code&gt;, &lt;code&gt;rollback-change&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;The change ledger and rollback for supported operations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two abilities to keep away from in this job: &lt;code&gt;delete-menu&lt;/code&gt; (permanent, menus have no trash) and &lt;code&gt;delete-menu-item&lt;/code&gt; (permanent). Both need explicit confirmation anyway. The whole point of this pattern is that you never need them until the new menu has been live for a while.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup in five minutes
&lt;/h2&gt;

&lt;p&gt;You need self-hosted WordPress 6.9+, PHP 8.0+ and HTTPS if your client connects remotely.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download &lt;code&gt;wppilot.zip&lt;/code&gt; from the &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp/releases/latest" rel="noopener noreferrer"&gt;latest GitHub release&lt;/a&gt; (it isn't on WordPress.org) and upload it under &lt;em&gt;Plugins → Add New → Upload Plugin&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Leave the safety profile on &lt;strong&gt;Production Safe&lt;/strong&gt;, the install default. It blocks PHP execution, WP-CLI, filesystem and database access, and plugin/theme installs, none of which a menu job needs.&lt;/li&gt;
&lt;li&gt;Connect your client. With Claude Code over OAuth:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http wppilot https://your-site.com/wp-json/mcp/wppilot-oauth
&lt;span class="c"&gt;# then run /mcp and finish the browser sign-in&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a WordPress account that can already manage menus in wp-admin. Every MCP call inherits that user's permissions, so the agent can't do more than that account can.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Have the agent describe what's there
&lt;/h2&gt;

&lt;p&gt;Start with reads only. This prompt changes nothing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Change nothing on the site.
1. Run list-menu-locations and tell me which menu sits in each location.
2. For the menu in the primary header location, run list-menu-items and
   show it as an indented outline: label, target (page ID or URL), parent.
3. Flag items that point to a trashed or draft page, or to a custom URL
   on this domain that could be a page link instead.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have a written snapshot of the current menu. Save it next to your ticket. It's the plan's "before".&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Build the new menu beside the old one
&lt;/h2&gt;

&lt;p&gt;Give the agent the target structure in plain language and make it build a &lt;strong&gt;new&lt;/strong&gt; menu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a new classic menu called "Primary 2026-10 (staging)" with create-menu.
Do NOT modify or assign any existing menu.

Target structure:
- Home
- Services
  - Web design (page "Web Design")
  - Care plans (page "WordPress Care Plans")
  - Audits (page "Site Audit")
- Resources
  - Blog (posts page)
  - Guides (category "guides")
- About
- Contact

Use search-content or list-content to find the real page IDs and link items
to those objects, not to hard-coded URLs. If a page doesn't exist, stop and
list what's missing instead of creating pages.
When all items exist, use reorder-menu-items once to set the final order and
nesting, then show me list-menu-items for the new menu.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why link to objects instead of URLs? If someone later changes a page slug, an object-linked item follows it; a pasted URL silently breaks.&lt;/p&gt;

&lt;p&gt;The live header hasn't changed at this point. Visitors still see the old menu, because the new one isn't assigned to any location.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Review the new menu like a diff
&lt;/h2&gt;

&lt;p&gt;Ask for a side-by-side before you swap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compare the current primary menu and "Primary 2026-10 (staging)" as two
outlines. List: items added, items removed, items renamed, items moved.
Confirm every item in the new menu points at a published page, post or term.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the review step people skip when they drag items around by hand. Read it properly. If something's wrong, fix it with &lt;code&gt;upsert-menu-item&lt;/code&gt; or another &lt;code&gt;reorder-menu-items&lt;/code&gt; call on the &lt;strong&gt;staging&lt;/strong&gt; menu, which still isn't live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Swap the location (the only live change)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use assign-menu-location to put "Primary 2026-10 (staging)" into the primary
header location. Then run list-changes and show me the entry for that call,
including whether rollback is available.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one call is the entire live change. Because &lt;code&gt;assign-menu-location&lt;/code&gt; captures the previous assignment before writing, the ledger entry should show a rollback option. Load the site in a private window and click through the header on desktop and mobile.&lt;/p&gt;

&lt;p&gt;If your client can open a browser, &lt;code&gt;get-page-view-link&lt;/code&gt; gives it the URL to look at. If it can't, &lt;code&gt;capture-page&lt;/code&gt; asks the site to take a screenshot, though it only runs while someone has GoBuildWP's Visual Runtime tab open in wp-admin. &lt;code&gt;compare-captures&lt;/code&gt; then scores a before and after capture of the same width and points at the regions that changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: If anything looks wrong, swap back
&lt;/h2&gt;

&lt;p&gt;You have two ways back, and neither involves rebuilding anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ledger rollback:&lt;/strong&gt; ask the agent to run &lt;code&gt;rollback-change&lt;/code&gt; on the &lt;code&gt;assign-menu-location&lt;/code&gt; entry. It needs explicit confirmation and verifies the restored state against the stored before-image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plain re-assign:&lt;/strong&gt; put the old menu back into the location with another &lt;code&gt;assign-menu-location&lt;/code&gt; call. The old menu was never edited, so it comes back exactly as it was.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the new menu has been live for a week or two and nobody has complained, rename it with &lt;code&gt;update-menu&lt;/code&gt; and delete the old one by hand, or with &lt;code&gt;delete-menu&lt;/code&gt; and confirmation, knowing it's permanent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this pattern doesn't protect you from
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Creating and editing items isn't the reversible part.&lt;/strong&gt; The docs promise ledger rollback for the location assignment. They don't make that promise for &lt;code&gt;create-menu&lt;/code&gt; or &lt;code&gt;upsert-menu-item&lt;/code&gt;. That's why you build on a menu nobody sees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theme-specific extras.&lt;/strong&gt; Mega-menu settings, icons or CSS classes added by a theme or plugin may live outside what &lt;code&gt;list-menu-items&lt;/code&gt; returns. Check any menu that relies on them by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caching.&lt;/strong&gt; A page cache can keep serving the old header for a while after the swap. Purge it before you judge the result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's not a backup.&lt;/strong&gt; Take one before any live change, as always.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why bother with an agent at all?
&lt;/h2&gt;

&lt;p&gt;For a five-item menu, don't. Where this pays off is the messy one: 40 items, three levels, half of them custom URLs someone pasted in 2019. Having the agent map every item to a real object, flag dead targets and produce a before/after diff is the tedious part, and it's all reads. The only write that touches visitors is a single location swap you can undo.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GoBuildWP: &lt;a href="https://gobuildwp.com" rel="noopener noreferrer"&gt;https://gobuildwp.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;WordPress core ability reference (menus, content, ledger): &lt;a href="https://gobuildwp.com/docs/reference/wordpress-core" rel="noopener noreferrer"&gt;https://gobuildwp.com/docs/reference/wordpress-core&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Change ledger and rollback: &lt;a href="https://gobuildwp.com/docs/change-ledger-and-rollback" rel="noopener noreferrer"&gt;https://gobuildwp.com/docs/change-ledger-and-rollback&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Safety profiles: &lt;a href="https://gobuildwp.com/docs/safety-profiles" rel="noopener noreferrer"&gt;https://gobuildwp.com/docs/safety-profiles&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source and releases: &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp" rel="noopener noreferrer"&gt;https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's the worst menu you've inherited? Tell me in the comments.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>ai</category>
      <category>mcp</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to let Claude manage a WooCommerce store safely with a self-hosted MCP server</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Mon, 28 Sep 2026 09:13:42 +0000</pubDate>
      <link>https://dev.to/gobuildwp/how-to-let-claude-manage-a-woocommerce-store-safely-with-a-self-hosted-mcp-server-2ghk</link>
      <guid>https://dev.to/gobuildwp/how-to-let-claude-manage-a-woocommerce-store-safely-with-a-self-hosted-mcp-server-2ghk</guid>
      <description>&lt;p&gt;Giving an AI assistant access to a live store sounds like a great way to save an afternoon of catalogue work, right up until you picture it issuing a refund you didn't ask for. The honest answer to "can I let Claude run my WooCommerce admin?" is: yes, but only if the &lt;em&gt;site&lt;/em&gt; enforces the limits, not the prompt.&lt;/p&gt;

&lt;p&gt;This post walks through a setup I think is sane for a production store: a Model Context Protocol (MCP) server that runs inside WordPress itself, a least-privilege WordPress user for the agent, a server-side safety profile, and a change ledger you can roll back from. I'll use &lt;a href="https://gobuildwp.com" rel="noopener noreferrer"&gt;GoBuildWP (formerly WPPilot)&lt;/a&gt; as the concrete example because it is built around exactly this model, but the principles apply to any WordPress MCP setup.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Disclosure: the WooCommerce abilities described here are part of GoBuildWP Pro. The free plugin is a complete WordPress MCP server (posts, pages, media, menus, Elementor editing, safety profiles, ledger) but does not register WooCommerce abilities. I'll point out which parts are which.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why not just hand the agent a REST API key?
&lt;/h2&gt;

&lt;p&gt;WooCommerce already has a REST API, and you &lt;em&gt;could&lt;/em&gt; give an agent consumer keys and let it call endpoints. Three problems show up quickly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Keys are broad.&lt;/strong&gt; A read/write key can do anything the REST API allows. There is no notion of "edit products but never touch refunds".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Endpoints are not decisions.&lt;/strong&gt; The agent has to load a huge surface into context and guess which call is safe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is no memory of what happened.&lt;/strong&gt; If the agent changes 40 prices, you get 40 successful HTTP responses and no single place to review or undo them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An MCP server layered on WordPress lets you move those decisions onto the site: which abilities exist, which ones are allowed right now, which need confirmation, and what gets recorded.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture: the site is the server
&lt;/h2&gt;

&lt;p&gt;With GoBuildWP, your WordPress install &lt;em&gt;is&lt;/em&gt; the MCP server. There is no hosted relay in the middle: your AI client (Claude Code, Claude Desktop, ChatGPT, Cursor and so on) talks directly to an endpoint on your own domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-store.com/wp-json/mcp/wppilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OAuth clients use &lt;code&gt;/wp-json/mcp/wppilot-oauth&lt;/code&gt;. The plugin doesn't bundle an AI model and doesn't ask for your model provider key; the client brings its own model access.&lt;/p&gt;

&lt;p&gt;Instead of exposing hundreds of endpoints, the agent works through a compact interface: discover what abilities exist, inspect one schema, then execute one typed ability. That keeps context small and makes every call something the server can check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install and start in Read Only
&lt;/h2&gt;

&lt;p&gt;Install the free plugin from the &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp" rel="noopener noreferrer"&gt;GitHub releases&lt;/a&gt; (&lt;code&gt;wppilot.zip&lt;/code&gt;, uploaded through &lt;strong&gt;Plugins → Add New → Upload Plugin&lt;/strong&gt;). Requirements are WordPress 6.9+ and PHP 8.0+, and HTTPS for anything reachable remotely.&lt;/p&gt;

&lt;p&gt;Then go to &lt;strong&gt;GoBuildWP → Configuration&lt;/strong&gt;. There are three safety profiles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Profile&lt;/th&gt;
&lt;th&gt;What it allows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read Only&lt;/td&gt;
&lt;td&gt;Discovery and inspection only. Every state-changing ability is blocked.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production Safe&lt;/td&gt;
&lt;td&gt;Normal content, design, SEO, forms and commerce work. Blocks raw PHP, WP-CLI, filesystem, database, plugin/theme install and deletion, and temporary admin access.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer Full Access&lt;/td&gt;
&lt;td&gt;Every enabled ability, including privileged ones. Meant for staging and development.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the first connection to a store, pick &lt;strong&gt;Read Only&lt;/strong&gt;. You want to see what the agent can reach before it can change anything. The profile is enforced server-side on every call, so it holds whatever the model was told.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Create a dedicated WordPress user for the agent
&lt;/h2&gt;

&lt;p&gt;This is the most underrated step. Capability checks in GoBuildWP run against the connected WordPress user &lt;strong&gt;on every request&lt;/strong&gt;, not once at connection time. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a dedicated user like &lt;code&gt;agent-shop&lt;/code&gt; for the connection instead of using your own login. Check the role first: managing GoBuildWP Connect requires &lt;code&gt;manage_options&lt;/code&gt; on a single site (super admin on multisite), and the &lt;a href="https://gobuildwp.com/use-cases/manage-woocommerce-products-with-chatgpt" rel="noopener noreferrer"&gt;WooCommerce products use case&lt;/a&gt; says plainly that "a plain Shop manager does not meet the connection prerequisite."&lt;/li&gt;
&lt;li&gt;So don't expect the stock Shop Manager role to work on its own. Give the dedicated user what the connection needs plus the WooCommerce capabilities for the jobs you want, then narrow it with the Read Only profile, scoped credentials and per-ability controls.&lt;/li&gt;
&lt;li&gt;If you demote or delete that user, the agent's access closes at that moment, not at the next token refresh.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also makes your audit trail cleaner, though GoBuildWP goes further there (see below).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Connect Claude
&lt;/h2&gt;

&lt;p&gt;Open &lt;strong&gt;GoBuildWP → Connect&lt;/strong&gt;, pick your client, and follow the generated instructions. For Claude Code, the OAuth route is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http wppilot &lt;span class="se"&gt;\&lt;/span&gt;
  https://your-store.com/wp-json/mcp/wppilot-oauth
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OAuth 2.1 with PKCE is the recommended route wherever the client can open a browser. Access tokens last an hour, refresh tokens 14 days, and each authorization shows up under &lt;strong&gt;Connected Apps&lt;/strong&gt; so you can revoke one client without touching the others. For clients that can't run a browser flow there are Application Passwords, and for headless callers (cron, the Claude Messages API MCP connector) there are revocable access tokens stored only as a SHA-256 digest.&lt;/p&gt;

&lt;p&gt;Log in as the &lt;code&gt;agent-shop&lt;/code&gt; user when the OAuth screen appears.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Prove a read-only workflow
&lt;/h2&gt;

&lt;p&gt;With Read Only on, ask for something useful that changes nothing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"List variable products with any variation out of stock, and draft a short restock summary for me here in chat."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent discovers the WooCommerce abilities (with Pro active), inspects their schemas and reads the catalogue. If it tries anything that writes, the site refuses it. That refusal is the thing you're testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Move to Production Safe and understand confirmation gates
&lt;/h2&gt;

&lt;p&gt;Once reads look right, switch to &lt;strong&gt;Production Safe&lt;/strong&gt;. Now ordinary catalogue work is allowed: editing product descriptions, adjusting stock, creating a variable product with its attributes and variations, adding order notes.&lt;/p&gt;

&lt;p&gt;But anything touching money is classed &lt;strong&gt;destructive&lt;/strong&gt;. Order status changes, refunds and price writes require an explicit confirmation flag on the call. A refund request through the MCP adapter looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ability_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wppilot/woocommerce-create-refund"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"order_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"refund_payment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"confirm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;"confirm": true&lt;/code&gt; the call doesn't run. In practice that means the agent has to come back and ask you, and you get a chance to say no. Under Read Only it can't reach these abilities at all.&lt;/p&gt;

&lt;p&gt;Writes are also rate-limited per credential, so a looping agent can't hammer your store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Review the change ledger
&lt;/h2&gt;

&lt;p&gt;Every supported write lands in a redacted &lt;strong&gt;change ledger&lt;/strong&gt;. Two details matter for stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It records which agent made the change&lt;/strong&gt;, not just which user. If Claude Code and Cursor both connect as the same account, the ledger still distinguishes them by OAuth client id (stored hashed) or application-password UUID. Writes made from wp-admin or WP-CLI are recorded as &lt;code&gt;direct&lt;/code&gt; rather than blamed on the last agent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rollback is offered for reversible operations&lt;/strong&gt; and only succeeds when the observed state matches the expected fingerprint. Irreversible things, such as a real payment refund, are recorded as non-reversible and say so. The ledger doesn't pretend it can un-send money.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Secrets such as password, token, API key and cookie fields are redacted from the ledger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional: require a human for every write
&lt;/h2&gt;

&lt;p&gt;If you want a person in the loop no matter what, GoBuildWP Pro has an &lt;strong&gt;approval queue&lt;/strong&gt;. Switch it on and every write waits on the Approvals screen, with email notification, until someone signs it off. The agent gets a structured "pending" response instead of a false success, so it knows to wait. Reads still run.&lt;/p&gt;

&lt;p&gt;For a store, a reasonable progression is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read Only, dedicated agent user: audits and reports.&lt;/li&gt;
&lt;li&gt;Production Safe with the approval queue on: the agent proposes, you approve.&lt;/li&gt;
&lt;li&gt;Production Safe with the queue off for routine catalogue edits, keeping confirmation gates for money.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What this does &lt;em&gt;not&lt;/em&gt; protect you from
&lt;/h2&gt;

&lt;p&gt;It's worth being explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your model provider still sees what the agent reads.&lt;/strong&gt; The MCP server is self-hosted, but the AI client sends content to its model. Don't expose customer data to a provider whose retention terms you haven't checked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backups are still your job.&lt;/strong&gt; The ledger is bounded (at most 500 records) and covers supported operations. It isn't a backup system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment gateways are external.&lt;/strong&gt; A refund that reaches your gateway is an external side effect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A note on WooCommerce's own MCP work
&lt;/h2&gt;

&lt;p&gt;WooCommerce has native MCP support in developer preview, built on the WordPress Abilities API and the official MCP Adapter. If a read-only view of your store is all you need, a focused single-purpose server may be the simpler install. The case for a broader control layer like GoBuildWP is when you want one connection that covers the store, the pages that sell from it, the page builder they were made in, and the same governance on every write.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The pattern is the point: &lt;strong&gt;run the MCP server on the site, connect as a least-privilege user, enforce a safety profile server-side, gate anything involving money behind explicit confirmation, and keep a ledger you can roll back from.&lt;/strong&gt; Do that, and letting Claude handle the tedious parts of store admin becomes a reasonable decision rather than a leap of faith.&lt;/p&gt;

&lt;p&gt;If you want to try it, the free plugin and source are on &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; (GPL-2.0-or-later), and the docs for safety profiles and client setup are at &lt;a href="https://gobuildwp.com" rel="noopener noreferrer"&gt;gobuildwp.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>woocommerce</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>WordPress MCP for Beginners: 9 Real Jobs You Can Hand to Claude, Cursor or ChatGPT (Safely)</title>
      <dc:creator>GoBuildWP</dc:creator>
      <pubDate>Sun, 27 Sep 2026 21:56:43 +0000</pubDate>
      <link>https://dev.to/gobuildwp/wordpress-mcp-for-beginners-9-real-jobs-you-can-hand-to-claude-cursor-or-chatgpt-safely-20d0</link>
      <guid>https://dev.to/gobuildwp/wordpress-mcp-for-beginners-9-real-jobs-you-can-hand-to-claude-cursor-or-chatgpt-safely-20d0</guid>
      <description>&lt;p&gt;Read the WordPress and WooCommerce forums for a week and the same requests keep coming up. People want to rewrite thousands of stale product descriptions. They want every missing meta description written. They want an Elementor edit that doesn't wreck the layout, and a weekly check-up on the site. Alongside those requests you see the same fear: &lt;em&gt;"One of my clients asked me to install Claude MCP onto their WordPress site and I'm terrified."&lt;/em&gt; The usual advice in those threads is sensible: start read-only, use staging, keep credentials easy to revoke, and make sure you can undo things.&lt;/p&gt;

&lt;p&gt;This guide is built around those requests. We'll connect an AI client to WordPress through the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, set up the safety controls first, and then go through nine common jobs. For each job you get the exact tools the AI calls, a prompt to paste, what happens to your site, whether you can undo it, and whether it needs the free or the paid edition.&lt;/p&gt;

&lt;p&gt;The server we'll use is &lt;a href="https://gobuildwp.com" rel="noopener noreferrer"&gt;GoBuildWP (formerly WPPilot)&lt;/a&gt;, a GPL WordPress plugin (Free 1.13.0 and Pro 1.7.0 at the time of writing). Everything below was checked against its live docs and &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;. Jobs are labelled &lt;strong&gt;Free&lt;/strong&gt; or &lt;strong&gt;Pro&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP in 60 seconds
&lt;/h2&gt;

&lt;p&gt;MCP is a standard way for an AI app (the &lt;strong&gt;client&lt;/strong&gt;) to find and call tools that a &lt;strong&gt;server&lt;/strong&gt; exposes. Once they're connected, you write normal sentences and the client picks the tools itself.&lt;/p&gt;

&lt;p&gt;For WordPress this means two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The AI works on real WordPress data.&lt;/strong&gt; Drafts, menus and Elementor elements show up in wp-admin. You don't paste HTML around.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rules live on the server.&lt;/strong&gt; Telling the model "don't delete anything" is just a request. A server-side permission is enforced whatever the model decides.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GoBuildWP runs on your own site, with no relay service in between and no per-request fees. It doesn't bundle a model, because your client brings its own. It's built on the WordPress Abilities API and the official MCP Adapter. The client sees three tools (&lt;code&gt;discover-abilities&lt;/code&gt;, &lt;code&gt;get-ability-info&lt;/code&gt;, &lt;code&gt;execute-ability&lt;/code&gt;), and behind them sit typed "abilities" such as &lt;code&gt;wppilot/update-post&lt;/code&gt;. Free ships 141 of them. Pro adds plugin-specific ones for WooCommerce, SEO suites, page builders, forms and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install and connect (Free)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; self-hosted WordPress 6.9+, PHP 8.0+, HTTPS for anything outside your own machine, and a staging copy or backup.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download &lt;code&gt;wppilot.zip&lt;/code&gt; from the &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp/releases/latest" rel="noopener noreferrer"&gt;latest GitHub release&lt;/a&gt;. The plugin isn't on WordPress.org, and GitHub's "Source code (zip)" won't install because it has no &lt;code&gt;vendor/&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Plugins → Add New → Upload Plugin&lt;/strong&gt;, then activate it.&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;dedicated WordPress user&lt;/strong&gt; for the AI with the smallest role that works, for example Editor for content work. Every call inherits that user's capabilities.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;GoBuildWP → Connect&lt;/strong&gt;, turn on AI abilities, pick your client, and copy the config it generates. It already contains your real URL.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GoBuildWP serves two routes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-site.com/wp-json/mcp/wppilot-oauth   # OAuth 2.1 (preferred)
https://your-site.com/wp-json/mcp/wppilot         # Application Password or wpp_ access token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OAuth uses PKCE, one-hour access tokens and 14-day refresh tokens. Every app shows up under &lt;strong&gt;Connected Apps&lt;/strong&gt; and can be revoked there, which makes it the easy-to-revoke credential the forums ask for. Application Passwords never expire, so revoke them yourself when you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http wppilot https://your-site.com/wp-json/mcp/wppilot-oauth
&lt;span class="c"&gt;# then run /mcp inside Claude Code to finish the browser sign-in&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Claude Desktop / claude.ai:&lt;/strong&gt; go to Settings → Connectors → Add custom connector and paste the &lt;code&gt;wppilot-oauth&lt;/code&gt; URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; (&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"wppilot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-site.com/wp-json/mcp/wppilot-oauth"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;VS Code 1.101+&lt;/strong&gt; (&lt;code&gt;.vscode/mcp.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"wppilot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-site.com/wp-json/mcp/wppilot-oauth"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Codex CLI&lt;/strong&gt; (&lt;code&gt;~/.codex/config.toml&lt;/code&gt;, then &lt;code&gt;codex mcp login wppilot&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[mcp_servers.wppilot]&lt;/span&gt;
&lt;span class="py"&gt;url&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://your-site.com/wp-json/mcp/wppilot-oauth"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ChatGPT:&lt;/strong&gt; enable Developer mode on ChatGPT web, create an app with the OAuth URL, and switch it on in each chat. It connects from OpenAI's cloud, so your site needs public HTTPS.&lt;/p&gt;

&lt;p&gt;Clients such as Zed, Cline or Windsurf use the &lt;code&gt;mcp-remote&lt;/code&gt; bridge (&lt;code&gt;npx -y mcp-remote &amp;lt;oauth url&amp;gt;&lt;/code&gt;), which needs Node.js. Setup guides for all 27 supported clients are on &lt;a href="https://gobuildwp.com/wordpress-mcp" rel="noopener noreferrer"&gt;gobuildwp.com/wordpress-mcp&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If the connection fails:&lt;/strong&gt; most failures are network problems, not WordPress bugs. Your CDN, WAF or security plugin has to let &lt;code&gt;/wp-json/mcp/*&lt;/code&gt; and &lt;code&gt;/.well-known/oauth-*&lt;/code&gt; through without caching them, and the site must answer on a single canonical URL. If sign-in succeeds but calls are still unauthenticated, something is stripping the &lt;code&gt;Authorization&lt;/code&gt; header. &lt;strong&gt;GoBuildWP → Diagnostics&lt;/strong&gt; tests the connection the way a client would.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety setup (before any job)
&lt;/h2&gt;

&lt;p&gt;This part answers the "I'm terrified" thread. Everything in this section is Free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Pick a safety profile.&lt;/strong&gt; The server enforces it, not the prompt.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Profile&lt;/th&gt;
&lt;th&gt;What it allows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Read Only&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inspection only. Every write is blocked. Use it for your first connection and for audits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Production Safe&lt;/strong&gt; (installation default)&lt;/td&gt;
&lt;td&gt;Normal content, design and store work. Plugin activate, deactivate and update need confirmation. PHP, WP-CLI, filesystem, database access and plugin/theme install or delete are blocked.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Developer Full Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Everything that's enabled, including PHP and WP-CLI. Staging only.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2. Layers on top of the profile:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WordPress capability checks on every call&lt;/li&gt;
&lt;li&gt;per-ability switches under &lt;strong&gt;GoBuildWP → Abilities&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;per-credential write rate limits&lt;/li&gt;
&lt;li&gt;draft-first creation&lt;/li&gt;
&lt;li&gt;destructive calls that refuse to run without &lt;code&gt;"confirm": true&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Preview before write.&lt;/strong&gt; For post, page and media edits, settings changes and deletions, the agent can call &lt;code&gt;preview-ability&lt;/code&gt;. You get a field-by-field diff and nothing is written. Then &lt;code&gt;apply-preview&lt;/code&gt; runs it, but only after checking that nobody changed the same fields in the meantime. You can make previews mandatory for the whole site; that setting is off by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The change ledger and rollback.&lt;/strong&gt; Every write is logged with the credential, the ability and redacted inputs. You read the log with &lt;code&gt;list-changes&lt;/code&gt; and &lt;code&gt;get-change&lt;/code&gt;. &lt;code&gt;rollback-change&lt;/code&gt; reverses &lt;em&gt;supported&lt;/em&gt; operations. The docs are clear that "rollback is never universal", and it isn't a backup. Each job below says whether its changes can be undone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prove it with one read (Read Only):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the wppilot MCP server. Change nothing.
1. Report the active safety profile and the abilities you can see.
2. Call get-site-settings, then list-content for the five newest pages,
   then get-content on one of them.
3. Name every ability you called and every WordPress ID you read.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Job 1: Read-only site and security audit (Free)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abilities:&lt;/strong&gt; &lt;code&gt;security-audit&lt;/code&gt;, &lt;code&gt;list-extensions&lt;/code&gt;, &lt;code&gt;get-extension&lt;/code&gt;, &lt;code&gt;list-users&lt;/code&gt;, &lt;code&gt;get-site-settings&lt;/code&gt;, &lt;code&gt;list-changes&lt;/code&gt;, &lt;code&gt;agent-context&lt;/code&gt;, &lt;code&gt;system-status&lt;/code&gt;, &lt;code&gt;performance-audit&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do a read-only security review. Change nothing.
1. Run security-audit and explain each finding, most serious first.
2. List plugins and themes with updates; flag inactive ones that could go.
3. List administrator accounts and point out any that look unexpected.
4. Summarise list-changes for the last 30 days.
5. Finish with a numbered fix list and say which items need a developer.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; Only reads run, and Read Only stays on the whole time, so there's nothing to undo. Keep in mind that &lt;code&gt;security-audit&lt;/code&gt; reviews configuration. It is &lt;strong&gt;not&lt;/strong&gt; a malware scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job 2: Refresh old posts and draft new ones (Free)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abilities:&lt;/strong&gt; &lt;code&gt;search-content&lt;/code&gt;, &lt;code&gt;list-content&lt;/code&gt;, &lt;code&gt;get-content&lt;/code&gt;, &lt;code&gt;get-page-snapshot&lt;/code&gt;, &lt;code&gt;create-post&lt;/code&gt;, &lt;code&gt;update-post&lt;/code&gt;, &lt;code&gt;list-revisions&lt;/code&gt;, &lt;code&gt;restore-revision&lt;/code&gt;, &lt;code&gt;create-term&lt;/code&gt;, &lt;code&gt;assign-terms&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find posts mentioning "2024 pricing". For each, show the paragraph that
needs updating and propose new wording. Preview each update-post change
and wait for my OK. Then draft a new post from these bullet points: [...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; The agent searches, then previews each edit. You approve, and &lt;code&gt;apply-preview&lt;/code&gt; writes it. New posts are created as drafts. A post edit can be rolled back from the ledger, and WordPress revisions give you a second safety net.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job 3: Bulk image alt text (Free)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abilities:&lt;/strong&gt; &lt;code&gt;list-media&lt;/code&gt;, &lt;code&gt;update-media&lt;/code&gt;, &lt;code&gt;verify-rendered-page&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List images with empty alt text. For each, read its title, caption, filename
and parent post, and write alt text of 125 characters or fewer. If you can't
tell what it shows, add it to a "needs review" list instead of guessing.
Save with update-media, 25 per batch, and pause after each batch.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; Each &lt;code&gt;update-media&lt;/code&gt; call gets its own ledger entry, so one bad description can be &lt;strong&gt;rolled back&lt;/strong&gt; without touching the rest of the batch. One catch: posts that already embed an image keep the old alt text in their HTML. Fixing those means editing each post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job 4: Comment triage (Free)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abilities:&lt;/strong&gt; &lt;code&gt;list-comments&lt;/code&gt;, &lt;code&gt;get-comment&lt;/code&gt;, &lt;code&gt;moderate-comment&lt;/code&gt;, &lt;code&gt;create-comment&lt;/code&gt;, &lt;code&gt;update-comment&lt;/code&gt;, &lt;code&gt;delete-comment&lt;/code&gt; (needs confirmation).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sort held comments into spam, approve and needs-me, with reasons for needs-me.
Mark spam, approve the rest, never delete permanently. Draft replies to
questions and show me before posting any.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; The WordPress user needs &lt;code&gt;moderate_comments&lt;/code&gt;, which Editor has, so no admin rights are required. Moderation can be reversed with &lt;code&gt;rollback-change&lt;/code&gt;. A reply you've posted can be trashed, but anyone notified has already seen it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job 5: Plugin updates and weekly maintenance (Free)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abilities:&lt;/strong&gt; &lt;code&gt;list-extensions&lt;/code&gt;, &lt;code&gt;update-plugin&lt;/code&gt;, &lt;code&gt;activate-plugin&lt;/code&gt;, &lt;code&gt;deactivate-plugin&lt;/code&gt; (all writes need confirmation), plus &lt;code&gt;security-audit&lt;/code&gt; and &lt;code&gt;system-status&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List plugins with updates available, with current and new versions.
Recommend an order, lowest risk first. Update only the one I choose,
then re-check system-status and the home page with verify-rendered-page.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; Under Production Safe, each update asks for confirmation. Updates are recorded but &lt;strong&gt;can't be rolled back&lt;/strong&gt;, so take a backup or test on staging first. Installing or deleting plugins is only possible under Developer Full Access, because it writes code to your server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job 6: Edit Elementor pages and build landing pages (Free edits, Pro composes)
&lt;/h2&gt;

&lt;p&gt;Forum threads say generic AI edits "produce broken layouts on Elementor" and that Elementor "will silently drop malformed widgets". Typed, element-level abilities are the fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free abilities&lt;/strong&gt; (Elementor 3.6.0+, Elementor Pro not required): &lt;code&gt;elementor-check-setup&lt;/code&gt;, &lt;code&gt;elementor-get-content&lt;/code&gt; (a compact skeleton by default), &lt;code&gt;elementor-find-elements&lt;/code&gt;, &lt;code&gt;elementor-get-widget-params&lt;/code&gt;, &lt;code&gt;elementor-edit-element&lt;/code&gt;, &lt;code&gt;elementor-duplicate-element&lt;/code&gt;, &lt;code&gt;elementor-delete-element&lt;/code&gt; (needs confirmation), &lt;code&gt;elementor-set-content&lt;/code&gt; (needs confirmation), plus &lt;code&gt;get-active-design&lt;/code&gt;, &lt;code&gt;check-design&lt;/code&gt;, &lt;code&gt;verify-rendered-page&lt;/code&gt;, &lt;code&gt;get-page-view-link&lt;/code&gt; and &lt;code&gt;capture-page&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;On the Pricing page (draft): read it as a compact skeleton first.
Change every "Get started" button to "Book a demo", keep the links.
Make "Plans for every team" an H2. Change nothing else.
Give me a preview link and the element ids you changed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; Only the targeted elements change. Unknown controls abort the write instead of corrupting it, and &lt;code&gt;capture-page&lt;/code&gt; can attach a screenshot to the ledger entry. &lt;strong&gt;Rollback:&lt;/strong&gt; "On Free alone these edits are recorded without a way back". With Pro active, the ledger keeps a copy of the document so the edit can be rolled back. On Free, work on a draft or a duplicate.&lt;/p&gt;

&lt;p&gt;For a landing page, the agent can read your design, create a &lt;strong&gt;draft&lt;/strong&gt; with &lt;code&gt;create-post&lt;/code&gt;, write the layout with &lt;code&gt;elementor-set-content&lt;/code&gt; (or a Gutenberg batch, see below), then check it with &lt;code&gt;check-design&lt;/code&gt; and &lt;code&gt;verify-rendered-page&lt;/code&gt;. &lt;strong&gt;Pro&lt;/strong&gt; adds &lt;code&gt;elementor-build-page&lt;/code&gt; (whole-page composition), templates, popups, global classes and variables.&lt;/p&gt;

&lt;p&gt;On the block editor side, Gutenberg edits are staged with &lt;code&gt;gutenberg-create-pending-batch&lt;/code&gt; and finished by the editor itself from a Block Editor Queue tab, so live content isn't touched until then. That's Free too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job 7: Bulk SEO titles and meta descriptions (Pro)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abilities:&lt;/strong&gt; &lt;code&gt;yoast-get-post-seo&lt;/code&gt; / &lt;code&gt;yoast-edit-post-seo&lt;/code&gt;, &lt;code&gt;rank-math-get-post-seo&lt;/code&gt; / &lt;code&gt;rank-math-edit-post-seo&lt;/code&gt;, plus the AIOSEO and SEOPress equivalents, term-archive SEO, and the Free &lt;code&gt;list-content&lt;/code&gt; and &lt;code&gt;verify-rendered-page&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Check which SEO plugin is active. List published pages with their SEO
title, description, canonical and robots. Report duplicates, empty
descriptions and titles over 60 characters. Change nothing yet.
For the ten worst, propose a title and description from the page content.
After I approve, write only those two fields, then verify-rendered-page.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; Steps 1–3 run fine in Read Only. Switch to Production Safe for the writes. &lt;strong&gt;SEO edits are recorded but have no rollback&lt;/strong&gt;, which is why the prompt reads the old values first. Save that table. Redirect abilities depend on the SEO plugin's own paid tier (Yoast Premium, AIOSEO Pro, SEOPress Pro).&lt;/p&gt;

&lt;h2&gt;
  
  
  Job 8: WooCommerce catalogue edits (Pro)
&lt;/h2&gt;

&lt;p&gt;The "4k product descriptions" and "throttled after 50 products" threads keep ending with the same advice: small batches, logging, a human check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Abilities&lt;/strong&gt; (WooCommerce 9.0+): &lt;code&gt;woocommerce-check-setup&lt;/code&gt;, &lt;code&gt;woocommerce-list-products&lt;/code&gt;, &lt;code&gt;woocommerce-get-product&lt;/code&gt;, &lt;code&gt;woocommerce-edit-product&lt;/code&gt; (partial updates), &lt;code&gt;woocommerce-list-product-variations&lt;/code&gt;, &lt;code&gt;woocommerce-edit-product-variation&lt;/code&gt;, &lt;code&gt;woocommerce-sales-summary&lt;/code&gt;, and &lt;code&gt;woocommerce-delete-product&lt;/code&gt; (needs confirmation).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run woocommerce-check-setup. List published products in Jackets with SKU,
regular price, sale price and stock. Propose a sale price 20% below regular
for items with more than 5 in stock; show the table and wait. After I approve,
set only sale_price, on each variation for variable products.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same pattern works for descriptions: 25 products per batch, rewrite only &lt;code&gt;description&lt;/code&gt;, and pause between batches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; Store settings, gateways, tax and shipping zones stay read-only under every profile. &lt;strong&gt;Product and variation edits have no rollback&lt;/strong&gt;, so export or note the old values first. For store-wide changes, Pro's &lt;strong&gt;approval queue&lt;/strong&gt; holds every write until a person signs off, and it emails the admin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Job 9: Page speed and cache tuning (Pro)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abilities:&lt;/strong&gt; &lt;code&gt;cache-check-setup&lt;/code&gt;, &lt;code&gt;cache-begin-experiment&lt;/code&gt;, &lt;code&gt;cache-measure-page&lt;/code&gt;, &lt;code&gt;cache-set-settings&lt;/code&gt;, &lt;code&gt;cache-purge&lt;/code&gt;, &lt;code&gt;cache-warm&lt;/code&gt;, &lt;code&gt;cache-verify-in-browser&lt;/code&gt;, &lt;code&gt;cache-revert-experiment&lt;/code&gt;. They cover LiteSpeed, WP Rocket, W3 Total Cache and about two dozen other cache and optimisation plugins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Start a cache experiment. Measure / and /shop/ three times as a baseline.
Propose the single lowest-risk change and wait. Apply it, purge, warm,
re-measure. If anything got worse, revert the experiment.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt; This is one of the better-covered areas. Each settings change can be rolled back on its own, and &lt;code&gt;cache-revert-experiment&lt;/code&gt; restores every layer at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six mistakes that make AI + WordPress go wrong
&lt;/h2&gt;

&lt;p&gt;These come up again and again in forum threads, and each one has a simple fix.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Connecting as an administrator.&lt;/strong&gt; An Application Password isn't a separately scoped API key. It carries every capability of its user. Give the agent its own Editor-level account and raise it only when a job needs more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping the read-only pass.&lt;/strong&gt; Nearly every job above starts with a report. Let the agent show you what it found before it's allowed to change anything, and you'll catch wrong assumptions (the wrong SEO plugin, the wrong category, a variable product priced on its parent) while they still cost nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treating a successful tool call as a finished job.&lt;/strong&gt; A tool call that returns without error only means the request went through. Open the page in a browser, check mobile, and let &lt;code&gt;verify-rendered-page&lt;/code&gt; catch a cached or theme-overridden title.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assuming everything can be undone.&lt;/strong&gt; Alt text, post edits, comment moderation and cache settings can be rolled back. SEO metadata, WooCommerce product edits and plugin updates can't. Neither can Elementor element edits on Free alone. Plan the job around that, not the other way round.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Huge batches.&lt;/strong&gt; Store owners in the "4k product descriptions" thread hit throttling after about 50 items. Batches of around 25 with a pause and a summary are easier to review, keep the ledger readable, and are less likely to hit your host's rate limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixing a refused write by switching to Developer Full Access.&lt;/strong&gt; If a write is refused, a requirement is missing: the capability, the ability switch, the companion plugin or the licence. Fix that one thing. Keep the most permissive profile for staging.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Free vs Pro at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job / feature&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MCP server, OAuth / App Passwords, 27 client configs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safety profiles, confirmations, previews, ledger, rollback&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audits: &lt;code&gt;security-audit&lt;/code&gt;, &lt;code&gt;system-status&lt;/code&gt;, &lt;code&gt;performance-audit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Posts, pages, media / alt text, comments, menus, revisions&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin activate / update (with confirmation)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gutenberg staged edits, design checks, screenshots&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skills and site instructions&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elementor element editing (17 abilities)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elementor rollback, whole-page composition, templates, global classes&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yoast, Rank Math, AIOSEO, SEOPress&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WooCommerce products, variations, coupons, orders&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache and page-speed experiments&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forms, ACF/custom fields, WPML/Polylang/Weglot, other page builders&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page builder converter (new draft plus a loss report)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human approval queue with email, persistent memory, integration health&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pro is a second plugin that registers extra abilities on the &lt;strong&gt;same&lt;/strong&gt; connection, so nothing you set up on Free is wasted. Each module loads only when its plugin is active.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get each version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; download &lt;code&gt;wppilot.zip&lt;/code&gt; from the &lt;a href="https://github.com/gobuildwp/wordpress-mcp-ai-gobuildwp/releases/latest" rel="noopener noreferrer"&gt;GitHub releases&lt;/a&gt;. No account is needed and it's GPL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro:&lt;/strong&gt; choose a plan on the &lt;a href="https://gobuildwp.com/pricing" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt;. Plans differ only by the number of sites, and every tier has the same features. Keep Free installed, upload the Pro zip from the customer portal, and enter your licence key. Without an active licence, Pro modules stop loading and the site falls back to Free. Nothing is deleted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My advice: prove the workflow on Free (jobs 1–6) before paying for anything. Buy Pro only when the data you need lives in a plugin, such as WooCommerce, an SEO suite, forms or custom fields, or when you want an approval queue for agents that run unattended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The pattern that answers the fears in those threads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;staging first&lt;/li&gt;
&lt;li&gt;a dedicated user&lt;/li&gt;
&lt;li&gt;OAuth so the credential is revocable&lt;/li&gt;
&lt;li&gt;Read Only until one read works&lt;/li&gt;
&lt;li&gt;Production Safe for drafts&lt;/li&gt;
&lt;li&gt;previews for anything that matters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;list-changes&lt;/code&gt; after every session&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you rely on rollback for a job, check whether that job supports it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://gobuildwp.com/docs" rel="noopener noreferrer"&gt;GoBuildWP docs&lt;/a&gt; have the full ability reference and troubleshooting. Which job would you hand over first? Tell me in the comments.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>ai</category>
      <category>mcp</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
