NiranzWP releasesself-updates
MCP server for WordPress. Purpose-built abilities for SEO, content, blocks, the database and files — every write is previewed, snapshotted, and reverted automatically if the site breaks.
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/niranz-dev/niranzwp-wp/releases/download/v5.3.27/niranzwp-wp-5.3.27.zipShips its own WordPress updater (built-in updater), so new versions show up under Dashboard → Updates.
Readme
NiranzWP
An MCP server for WordPress that an agent can be trusted with.
Sixty-five purpose-built abilities instead of a shell and a hope. Every write previews before it runs, is snapshotted first, and puts itself back if it takes the site down.
npm install -g niranzwp
niranzwp auth login https://your-site.com
Open this page and enter the code:
https://your-site.com/wp-admin/admin.php?page=niranzwp-connect&code=BFME-6QUV
code: BFME-6QUV
Waiting...
Connected "your-site" -> https://your-site.com via OAuth
Tokens stored in macOS Keychain; they refresh automatically.
Type the code into wp-admin, approve, done. No password is copied anywhere, and nothing is stored on the site that the site could hand back.
The problem this exists for
Most tools in this space hand an agent one very sharp instrument: run arbitrary PHP, write arbitrary files. It works beautifully until it doesn't, and then the site is down at three in the morning and nobody is sure which of the last forty commands did it.
The usual answer is to lock the agent into a sandbox directory, which solves the problem by making the tool useless on a real site.
NiranzWP takes the third position. Give the agent abilities that know what they are for, so the dangerous operation is not the default one — and make every write reversible so being wrong is survivable.
Four things that are always true
A write is checked before it lands. A PHP file that does not parse is never written. A block whose markup would not survive a round trip through the editor is refused rather than saved and regretted. An upload only moves into place once its declared size and SHA-256 match what actually arrived.
A write leaves a checkpoint.
Every change records what was there before. checkpoint-restore puts it back.
A write that breaks the site undoes itself. A must-use plugin watches the next request. If the site has stopped answering, the change is reverted — without anyone being awake to notice.
The dangerous switches are off out of the box. Filesystem access and PHP execution are opt-in, on a screen that says plainly what they mean.
evaluate is still there for what nothing else covers. It just isn't the first
thing reached for, and its own description tells the agent so.
What it can do
| SEO | Audit titles and descriptions · find what is missing · rank what to fix first · write meta · schema audit · llms.txt · internal link suggestions · redirects · GEO checks |
| Content | List, audit and refresh posts · set image alt text · find thin and stale pages |
| Elementor | The live widget catalogue · write, move and edit layouts · page settings · the site kit, global colours and fonts · headers, footers, popups and the conditions that place them |
| Gutenberg | Read the block tree · find, update and move one block by its path · write without corrupting the markup · inspect registered block types |
| Files | Read (paged) · list (recursive, globbed) · write · edit · delete · disable or re-enable a file without deleting it |
| Database | Size and bloat report · transient and revision cleanup · autoloaded options report |
| Operations | Site info · plugin list · cache purge · WP-CLI · snapshots · uploads of any size |
| Skills | Store reusable instructions on the site itself, so every client that connects reads the same brief |
niranzwp discover # everything this site exposes
niranzwp run niranzwp/seo-audit # and run any of it
Documentation
| Connecting a client | The CLI, an MCP client, a browser connector |
| Designing pages | Elementor and Gutenberg, end to end |
| Ability reference | All 65, by group |
| When a write goes wrong | Snapshots, self-recovery, the switches that are off |
Moving files
create-upload-link mints a single-use bearer token and takes the bytes as the
body of one request. Use it for anything large or binary — a plugin ZIP, a
theme, media, a generated file.
The alternative most tools are left with is base64 inside a PHP payload: a third larger than the file, and shaped exactly like an attack to every firewall in front of it.
Measured on an 803 KB archive against a production host behind a WAF:
| chunked base64 | create-upload-link |
|
|---|---|---|
| requests | 19 | 1 |
| on the wire | ~1.1 MB | 822 KB |
| result | failed twice, never completed | HTTP 201 in 3.9s |
Security
Access is granted by a person clicking a button in wp-admin. There is no other path in.
| Standards | OAuth 2.0 device grant (RFC 8628), dynamic client registration (RFC 7591), authorization server metadata (RFC 8414) |
| Storage | Device codes and both token types kept as SHA-256. The site cannot hand back a credential it does not have |
| Rotation | Refresh tokens rotate, with a two-minute grace window so a client that lost a response is not locked out. After that window, presenting a spent token revokes every token descended from the same approval |
| The off switch | Turning abilities off stops issued tokens authenticating, not merely the abilities — and covers a domain lock, so a database restored elsewhere does not arrive with working credentials |
| Transport | No credential is issued over plain HTTP. Loopback and .local / .test are allowed so development still works |
| Framing | Every admin screen sends X-Frame-Options: DENY and frame-ancestors 'none'. A nonce does not stop clickjacking — it borrows a real request from a real user — and an approval button is exactly what is worth borrowing |
| Metering | The endpoints that must be open to strangers are rate-limited per address |
| Registration | A stranger cannot evict a working client to make room for themselves |
Found something? Open an issue, or write to security@niranz.dev.
Requirements
WordPress 6.9+ (for the Abilities API) · PHP 8.0+
Install
- Download the latest
niranzwp-wp-*.zipfrom Releases - Plugins → Add New Plugin → Upload Plugin
- NiranzWP → Configuration — turn on the abilities you want
Updates appear in wp-admin like any other plugin from then on.
The CLI
npm install -g niranzwp
auth login <url> |
Connect, via the device flow or a browser |
discover |
Every ability this site exposes |
run <ability> |
Run one |
file read/list/write/edit/delete |
Work with files directly |
auth list / auth logout |
Manage connections |
Credentials go to the macOS Keychain, Windows DPAPI, or secret-tool on Linux —
never a plaintext file, and never a command-line argument.
Uninstalling
Deleting the plugin removes what belongs to the plugin: its settings, the domain lock, and the recovery guard.
It does not remove what you wrote — the site brief, design notes, skills, and every checkpoint, which are the only record of what a write replaced. Those go only if you ask, and it asks at the click on Deactivate, where a person is still present, rather than leaving the decision buried in a settings screen.
Contributing
Issues and pull requests welcome. The CLI lives in its own repository and ships with 104 end-to-end tests that run against a real WordPress install — please keep them passing.
Licence
MIT.
Built by NiranjanRead the full README on GitHub →
Releases
| Tag | Published | Asset | Downloads |
|---|---|---|---|
| v5.3.27 | Aug 21, 2026 | niranzwp-wp-5.3.27.zip | 1 |
| v5.3.27 | Aug 21, 2026 | plugin.json | 39 |
| v5.3.26 | Aug 21, 2026 | plugin.json | 1 |
| v5.3.26 | Aug 21, 2026 | niranzwp-wp-5.3.26.zip | 1 |
| v5.3.25 | Aug 21, 2026 | niranzwp-wp-5.3.25.zip | 1 |
| v5.3.25 | Aug 21, 2026 | plugin.json | 2 |
| v5.3.24 | Aug 21, 2026 | plugin.json | 1 |
| v5.3.24 | Aug 21, 2026 | niranzwp-wp-5.3.24.zip | 1 |
| v5.3.23 | Aug 21, 2026 | plugin.json | 3 |
| v5.3.23 | Aug 21, 2026 | niranzwp-wp-5.3.23.zip | 2 |
| v5.3.22 | Aug 20, 2026 | plugin.json | 1 |
| v5.3.22 | Aug 20, 2026 | niranzwp-wp-5.3.22.zip | 1 |
| v5.3.21 | Aug 20, 2026 | niranzwp-wp-5.3.21.zip | 1 |
| v5.3.21 | Aug 20, 2026 | plugin.json | 1 |
| v5.3.20 | Aug 20, 2026 | niranzwp-wp-5.3.20.zip | 0 |
| v5.3.20 | Aug 20, 2026 | plugin.json | 1 |
| v5.3.19 | Aug 20, 2026 | niranzwp-wp-5.3.19.zip | 0 |
| v5.3.19 | Aug 20, 2026 | plugin.json | 2 |
| v5.3.18 | Aug 20, 2026 | niranzwp-wp-5.3.18.zip | 0 |
| v5.3.18 | Aug 20, 2026 | plugin.json | 0 |
| v5.3.17 | Aug 20, 2026 | niranzwp-wp-5.3.17.zip | 1 |
| v5.3.17 | Aug 20, 2026 | plugin.json | 2 |
| v5.3.16 | Aug 20, 2026 | niranzwp-wp-5.3.16.zip | 1 |
| v5.3.16 | Aug 20, 2026 | plugin.json | 1 |
| v5.3.15 | Aug 20, 2026 | niranzwp-wp-5.3.15.zip | 1 |