Hermes Agent can run a live WordPress site: read it, write it, build pages in the site's own page builder, and undo anything it did. It needs one MCP server in its config to get there. This is the routine that comes after that.
Hermes Agent is the open-source CLI and desktop agent from Nous Research, MIT licensed. Respira is the MCP server that gives it structured access to WordPress: 320+ tools across posts, pages, media, menus, taxonomies, users, plugins, custom fields and 17 page builders, with a snapshot behind every write. The plugin runs on your own hosting. Nothing about this moves your site anywhere.
Everything below assumes the site is already connected. If it is not, the setup depth lives at Hermes Agent and WordPress and takes about three minutes.
Connect once, then forget about it
Hermes keeps its MCP servers in ~/.hermes/config.yaml under an
mcp_servers: key. There are two shapes, and the difference is worth one paragraph
because it decides how the rest of your week goes.
A remote entry points at the MCP endpoint your site already serves, at
https://your-site.com/wp-json/respira/v1/mcp, with auth: oauth under
it. Hermes runs the whole handshake itself and keeps the session refreshed, so there is no key
on disk. That endpoint belongs to the site, so this is one entry and one sign-in per site.
mcp_servers:
respira:
url: "https://your-site.com/wp-json/respira/v1/mcp"
auth: oauth Then, from a terminal you opened after saving the file:
hermes mcp login respira The fresh terminal is not superstition. Hermes watches the config and reloads it, but that reload has a 30 second timeout, so a login fired from a shell that was already open can race the reload and hang.
A local entry runs the Respira MCP package through npx and passes your whole
account registry in one environment variable. One server definition, every site you have
connected, no sign-in at all. This is the one to take if you look after more than a couple of
sites.
mcp_servers:
respira-wordpress:
command: "npx"
args:
- "-y"
- "@respira/wordpress-mcp-server"
env:
RESPIRA_CONFIG_B64: "<paste from your dashboard>"
RESPIRA_CONNECTION_SOURCE: "dashboard_export"
Both blocks, filled in with your real values, come from the setup page in
your dashboard, which also has an Add to Hermes button that
skips the file entirely. The desktop app catches the link and shows a confirmation dialog
first, so nothing is written until you accept it. And if Claude Code is already configured on
the same machine, hermes import-agent claude-code lifts the server block across
from ~/.claude.json and you are done.
Merge either block. Do not replace the file. Your models, tools and prompt settings live in it too.
Start every session with a read
The first message of a session should cost you nothing and buy you the vocabulary for everything after it. Ask what the site is.
what does this site run, which page builder,
and how many published pages does it have You get the WordPress and PHP versions, the active theme, the detected builder, the plugin list and the page count. That last part matters more than it looks: from then on you can say "the pricing page" instead of describing it, because the agent has the titles and the ids. The tools behind it are reads, so nothing can go wrong here.
One thing that surprises people: the tool list Hermes shows is smaller than the catalog total, and that is deliberate. Respira filters tools per site, so a block-theme site never sees Bricks tools and an Elementor site never sees Divi tools. Fewer wrong turns, shorter tool lists, and no builder tool pointed at a site that cannot run it.
Edit posts and pages
Content edits are the boring, high-volume case and they behave the way you would hope. Name the thing, say what you want.
on the about page, change the founded date from 2019 to 2018
and fix the two typos in the second paragraph
find every published post that still links to the old /features url
and point them at /features/overview instead
draft a post from these notes, set the category to Releases,
add the featured image called canopy-hero, and leave it as a draft Two habits make this better. First, ask for a draft when you are not sure. A draft costs one click to publish and nothing to abandon. Second, when you are changing many posts at once, ask for the list before the change: show me which posts match, then change them. It turns a silent bulk edit into a two-step you can stop halfway.
Custom post types work the same way. If the site has a Portfolio type or an Events type, they are readable and writable by name, and so are their taxonomies. Advanced Custom Fields is covered too, including repeaters, flexible content and options pages, so "set the price field on every product in the Autumn group to 49" is a real instruction rather than a wish.
Build a page in your page builder
This is the part most tools get wrong, so it is worth being precise about what happens.
Respira writes each builder in that builder's own native storage format. An Elementor page is written as Elementor data, a Bricks page as Bricks data, a Divi 5 page as Divi 5 JSON. The result opens in the builder afterwards and is editable there, element by element, the same as if a person had dragged it in. Nothing is flattened into a block of HTML and dropped into a code widget, which is the shortcut that makes a page unmaintainable the moment the agent walks away.
duplicate the homepage, then on the copy replace the hero with a
three-column feature section using the same heading styles,
and hold it for my approval
on the services page, find the pricing table element and change
the middle tier to 29 a month with a highlighted badge A structural build starts by duplicating the page rather than editing the live one. The live page keeps serving visitors the whole time. You look at the duplicate, and it becomes the live page only when you say so.
Coverage differs by builder, and the honest depth per builder is documented rather than implied: Elementor, Bricks, Divi 4 and Divi 5, Oxygen, Breakdance, Flatsome and Gutenberg each have their own page. If the site runs something else, ask the agent which builder it detected and it will tell you rather than guess.
One more path worth knowing: if you already have an HTML design, from a tool or from a designer, the agent can convert it into native builder elements rather than paste it. That is how a static mockup becomes an editable page instead of an embedded screenshot.
Running a WooCommerce store from the same chat
WooCommerce is a paid add-on rather than part of the core plans, and it is the largest single surface in the product: 105 tools covering products, variations, brands, coupons, customers, orders and refunds, each with a snapshot, a dry-run preview and an approval step. The details and the pricing are on the WooCommerce add-on page.
which products are out of stock, and which of those
had an order in the last 30 days
create a 15 percent coupon for the winter collection, valid for
two weeks, one use per customer, and show me the dry run first A rule i would give anyone doing this on a real store: keep money operations behind the dry run. Refunds, price changes across a catalog and coupon rules are the three that hurt when they go wrong, and the dry run is there so you can read what will happen before it does. Reads are free of that concern, and reads are most of what a store owner actually wants anyway.
The safety model, in three parts
This is the part that makes an agent on a production site reasonable instead of reckless, and it lives on the WordPress side, not the agent side. Hermes does not have to be trusted for it to hold.
Snapshots. Page and element writes take a snapshot of the previous state before touching anything. You can list them, compare two of them, and restore one, from chat or from wp-admin. "Undo that" is a real instruction with a real mechanism behind it.
Duplicate first. Structural page work is built on a copy. The live page is not touched while the agent is working, so a build that goes sideways at 2am is a bad duplicate rather than a broken homepage.
Approval in wp-admin. The Approvals and Undo screen under Respira in your WordPress admin is where a duplicate gets published or thrown away, and where snapshots get restored. It is a WordPress screen with your WordPress login in front of it, which means the final say never depends on the agent behaving.
Above all three sits the access level you picked when you connected: read-only, content, builder or full. Read-only is a genuine read-only, enforced at the write path rather than by asking the model nicely. If you are connecting a site you do not own, start narrower than you think you need. Widening later is one click. The other direction costs a restore. How safe changes work goes deeper on the mechanics.
Working across several sites
The split from the setup section shows up here as a practical difference.
With a local entry, every connected site is in one server, and you move between them by naming the one you mean: switch to the shop site, or on clientsite.com, list the draft posts. The agent carries the active site through the conversation, which means a long session on one site does not need the name repeated in every message.
With a remote entry, each site is its own server with its own sign-in, so the site is chosen by which server the agent calls. Cleaner separation, more setup. For two sites that is fine. For twenty it is twenty sign-ins, and the local entry exists for exactly that reason.
A habit worth forming with a fleet: say the site name in the first message of every session, even when you think it is obvious. The cheapest bug to avoid is the one where the right change lands on the wrong site. One account, every site covers how multi-site accounts and seats actually work.
One current limit
A remote entry needs a site reachable over HTTPS with
/wp-json/ not blocked, which rules out a local site on your own machine for that
route, though the local entry can still reach it.
Where to go next
- Hermes Agent and WordPress, for the setup detail, both config shapes and the troubleshooting list.
- Respira now supports Hermes Agent, for how the support came about.
- The WordPress MCP server, for what the tool surface actually contains.
- Pricing, if you are working out what this costs.
Join the conversation
0 comments · Respira accountNo comments yet. Be the first to weigh in.