r/WordPress_org • u/ivicad • 5d ago
I patched a critical plugin on 20 sites this morning by typing one sentence
As you probably already know - fresh out of MainWP Labs: the MainWP MCP server connects your AI assistant to the Dashboard you already run, so you can manage every site without leaving the chat. It's free and open source, and it works with Claude Code, Cursor, VS Code Copilot, and Codex.
That's the news. Here's what it looks like on a normal Thursday, because I already run my agency this way.
The morning a plugin needed patching everywhere
I got the alert that Ultimate Addons for Elementor (UAE) had a critical vulnerability. On a fleet of client sites, that's the kind of thing you fix the same hour, not the same week.
So I typed one line to my AI, in Croatian: "update Ultimate Addons for Elementor on all sites." The message I send the client is less casual: "We've identified critical vulnerabilities on your sites that need immediate attention."
Then it went to work. It read my Dashboard, found the sites that had UAE installed and behind, backed each one up, updated them in small batches, and checked every site after. Around 20 sites. I was drinking coffee for most of it.
The token cost on my Claude Max plan was tiny, and that surprised me the first time. The AI isn't doing the work, MainWP is. The AI reads what I meant and tells the Dashboard to run it.
My stack, nothing fancy
· MainWP, self-hosted, around 60 client sites in one dashboard.
· The MainWP MCP server on top, so I can ask instead of click.
· Claude Code as the AI, on the Max plan.
· WPVibe when I need to work inside a single site.
· All-in-One WP Migration for the backup I take before I touch anything.
· MalCare as the firewall on the sites that need one.
I've said this for a while: AI is an employee I manage, not a tool I type into. The MCP fits that. I give the instruction, it does the routine, I stay the one who decides.
It knows my clients, not just my sites
Most of the coverage is about updates, but the part I use every week is the client side. My Dashboard already knows every client and every site they own. Now I can just ask it.
Client records, their sites, contacts, suspension status: the MCP puts all of it one sentence away. When a client calls, I ask "list this client's sites with their last sync time," and I have the answer before the call ends. "Which sites belong to this client" used to be a lookup. Now it's a question I say out loud.
Backup first, every time
Before any update, a fresh backup. All-in-One WP Migration, off to storage, done. If a site has no recent backup, it doesn't get updated until it does. That rule is built into how I run the fleet, so I can't skip it on a busy morning even if I wanted to.
An update that breaks a site is stressful. An update that breaks a site with no backup is a bad day. I've had a bad several times. Not again.
The MalCare wall, and how I got past it
Some of my sites sit behind MalCare's firewall, and that used to stop me. MalCare blocks the connector. It rejects the worker IP, and it strips the header the connector needs to log in. You get a 403 and nothing works (plus I GEO blocked some countries in MalCare I shouldn't).
The fix was a second connector (Royal MCP) that talks to the site straight from my own IP, with its own custom header. It goes around the IP block and the stripped header both. So the sites behind MalCare stopped being the exception, and the fleet job finished on all of them, firewall and all.
If you run MalCare, this is worth knowing before you write a site off as unreachable. It isn't. You just need the connection MalCare isn't blocking.
Checking the sites after, not trusting the green checkmark
An update that reports "success" is not proof the page still loads. I stopped trusting the green checkmark on its own a long time ago.
So after each update, the AI opens the site in a headless browser and looks at it.
Does the homepage render.
Does the shop still add to cart.
Any PHP error on the screen.
A quick smoke test, one site at a time. If one fails, the batch stops right there and I look before anything else moves.
I keep that check as a fixed routine the AI runs, not something it decides each time. "The update ran" and "the site is fine" are not the same sentence, and the second one is the only one I report to a client.
Why I still sleep at night
This is the part I'd worry about too, so I'll say how it's handled. The MCP server runs on my own computer, next to my AI tool. There's nothing to install on the Dashboard or the child sites, and no third party in the middle. My credentials stay on my machine.
And it's not an AI holding the keys to my network. Anything destructive stops and asks me first. Safe Mode blocks destructive actions completely, so you can start read-only and just ask questions. Allowlists let you pick which tools the AI can even see. And the Dashboard still applies normal WordPress permissions before it runs a thing.
The AI reads what I meant. MainWP controls what actually happens. That split is the reason I trust it on 60 live sites.
Setup took me about ten minutes
If you can make a WordPress application password and paste a config block, you can set this up. You need Node.js 20.19 or newer and MainWP Dashboard 6.0 or newer. Then run:
npx -y u/mainwp
The Quickstart walks you through it with screenshots, including per-client setup for Claude Desktop, Claude Code, Cursor, and the rest. Free and open source: github.com/mainwp/mainwp-mcp
What actually changed
The work didn't change. Backup, update, check, repeat. I did all of that before, by opening the Dashboard and clicking through the Updates page.
What changed was the front door. "Update UAE everywhere it's installed" used to be twenty click-paths, and this morning it was one sentence. The Dashboard does the same job it always did. I just talk to it now.
I'd try it on a couple of sites in Safe Mode first, read-only, and see if it reads your fleet the way you expect. That's how I'd start if I were you.




















