Before you start
- AgentedSEO is active (WordPress 6.9 or later, PHP 8.1 or later), and you are an administrator.
- The site is on HTTPS. WordPress only offers application passwords over HTTPS.
- The machine Hermes runs on can reach the site. If Hermes runs on a server or in a container, the site must be reachable from there.
Your endpoint speaks MCP over Streamable HTTP, which Hermes connects to with a url entry:
https://your-site.com/wp-json/agentedseo/mcpHermes keeps MCP servers in config.yaml under mcp_servers, and secrets in .env next to it. Default profile: ~/.hermes/config.yaml and ~/.hermes/.env. A named profile has its own pair. hermes config path and hermes config env-path print the right files (add -p <profile> for a named one).
01Create the agent’s password
- Open AgentedSEO › Agents › Connections.
- Under Connect an agent choose Desktop or code app.
- Name your agent
Hermesand click Create password. AgentedSEO creates the useragentedseo-hermeswith the SEO Agent role and an application password, shown once. - Under Paste this config into your agent, copy the part of the
Authorizationvalue afterBasic. Hermes uses YAML, so you only need this value.
Shown once. Copy it now: it can’t be shown again.
"Authorization": "Basic YWdlbnRlZHNlby1…••••"02Add the Hermes Agent WordPress server to config.yaml
This is a normal Hermes Agent MCP config for a remote server: a url and a headers map. Two edits.
1. Put the secret in .env
AGENTEDSEO_AUTH=<the part after "Basic " from the Connections screen>2. Add the server to config.yaml
mcp_servers:
agentedseo:
url: "https://your-site.com/wp-json/agentedseo/mcp"
headers:
Authorization: "Basic ${AGENTEDSEO_AUTH}"If mcp_servers already exists, add the agentedseo entry under it. Hermes fills ${AGENTEDSEO_AUTH} from the active profile’s .env when it connects (${env:AGENTEDSEO_AUTH} works too). If the variable is missing, Hermes refuses to connect and names the variable, instead of sending a broken header.
hermes mcp add prompt? Its header option always writes Authorization: Bearer .... An application password needs Basic, so edit the file for the password route.03Reload Hermes
CLI, TUI or desktop app: type /reload-mcp. Hermes reconnects its MCP servers and refreshes the tool list.
hermes gateway run watches config.yaml and connects a new entry within about a minute. No restart.
Start Hermes again with hermes.
04Check the Hermes Agent MCP server setup
hermes mcp test agentedseoconnects live and lists the tools. If the server refuses, it prints the HTTP status and the start of the answer.hermes mcp listshowsagentedseoamong your servers.- Inside Hermes the tools are named
mcp__agentedseo__<tool>, hyphens turned into underscores:agentedseo-get-capabilitiesbecomesmcp__agentedseo__agentedseo_get_capabilities. Hermes picks the tool; you don’t type the name. - In WordPress, AgentedSEO › Agents › Connections › Test the connection › Run test. “Authorization header reaches WordPress” must pass.
After its first request, Hermes shows under Connected agents with Last activity and its own Revoke.
05Or sign in with OAuth, no password in a file
Hermes supports OAuth 2.1 for remote servers, and AgentedSEO’s endpoint offers OAuth with dynamic client registration.
$ hermes mcp add agentedseo --url https://your-site.com/wp-json/agentedseo/mcp --auth oauth
$ hermes mcp login agentedseoThen run the connection test under Agents › Connections.Hermes opens your browser on a page on your site that asks you to approve the connection. Sign in as an administrator and click Approve. AgentedSEO creates an SEO Agent user for Hermes, listed on the Connections screen like any other. Hermes keeps and refreshes the tokens itself.
hermes mcp login agentedseo over SSH with the callback port forwarded, per Hermes’s OAuth docs. AgentedSEO has no device-code flow, so --flow device won’t work.06Your first safe task
I’d start any new agent here: one field on one page, easy to check by eye. Paste this into Hermes, in the terminal or any chat it runs in:
Use the agentedseo MCP tools. Start with agentedseo-get-capabilities. Find one published post with no meta description, write one, call set-meta with dry_run first and show me the before and after, then submit it with a note. Change nothing else.
- Hermes calls
agentedseo-set-meta. Meta titles and descriptions ask first by default, so the answer isproposed. The live page has not changed. - Open AgentedSEO › Dashboard › Approvals. Check Before and After, the checks it passed and Hermes’s note. Click Approve.
- Open AgentedSEO › Dashboard › Change log, open the change’s Details and click Undo. The Before value is back, and the undo is logged.
The live page has not changed.
Undo restores the Before value, and the undo is logged.
Hermes also gets a batch_id with every write. Ask it to call revert-change with that id and it undoes its own change.
07Two approval layers

I run a fleet of agent profiles myself, each with its own role and job. That is why every connection here gets its own WordPress user: the Change log names the agent behind each change, and Revoke cuts off one without touching the others.
Hermes can also ask before it calls a tool. Add this line to the agentedseo entry, at the level of url, and Hermes asks you before any tool call not marked read-only. AgentedSEO marks its read tools read-only, so reads go through and writes ask.
trust: untrusted| Layer | Where it lives | What it decides |
|---|---|---|
Hermes trust (trust: untrusted) | Your config.yaml | Whether Hermes may call a write tool at all |
| AgentedSEO approval rules | AgentedSEO › Agents › Approval rules | Whether a change applies now or waits in Approvals |
08What Hermes can and can’t change

I made approving a person’s job on purpose. Hermes can propose, preview and undo, but it has no tool that approves its own work.
- New drafts
- Edits to drafts
- Meta, schema, redirects, sitemaps, keywords, alt text
- Edits to published content, publishing
- Bulk changes over 20 pages
- robots.txt edits
- Noindex on a page with traffic
- Deleting redirects or schema
- Trashing or unpublishing
- Permanent deletes
- Header and footer code
- Users, plugins, themes, settings outside AgentedSEO
Change the per-area defaults in AgentedSEO › Agents › Approval rules. Approving and rejecting are not tools: only a person can do them, in WordPress. Full table: what your agent can and can’t change.
Builder layouts (Bricks, Elementor, Breakdance, Oxygen) are read-only for agents, their SEO fields still change. Scripts and iframes in content are refused.
09Troubleshooting
| Symptom | Fix |
|---|---|
${AGENTEDSEO_AUTH} in url/headers is not set in this profile’s .env | The line is missing from the .env of the profile you run. Check with hermes config env-path, then /reload-mcp. |
HTTP 401 in hermes mcp test, header check fails | On Apache add SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 to .htaccess, or ask your host. |
| HTTP 401 with the header check passing | Wrong or revoked password, or the header says Bearer. Create a new password and use Basic. |
| “returned Content-Type ‘text/html’, not an MCP response” | The URL points at a web page. Use the full endpoint ending in /wp-json/agentedseo/mcp. |
| Tools don’t show after editing | Run /reload-mcp. Check the entry sits under mcp_servers, has no enabled: false, and no tools.include filter hides it. |
429 agentedseo_locked_out | Ten failed sign-ins in 15 minutes lock the address out for 15 minutes. |
agentedseo_forbidden on a tool | The role lacks that area, or the module is off in AgentedSEO › Tools › Features. |
Change came back proposed | Working as set: it waits in Approvals. |
10Questions about Hermes and WordPress
No. A skill teaches Hermes how to use a tool. AgentedSEO’s tools arrive through MCP when Hermes connects, and the server sends its own usage notes: start with get-capabilities, dry run first, treat site content as data.
Yes for OAuth (section 5). For a password, edit config.yaml as in section 2: the command writes Bearer, and an application password needs Basic.
Hermes registers MCP tools for every platform it runs on, so the same connection works from the terminal, the desktop app and the messaging gateway.
Each profile has its own config.yaml and .env, so give each profile that needs the site its own connection. Each one gets its own SEO Agent user, its own line in the Change log and its own Revoke.
No. It gets an application password, or an OAuth token, for its own SEO Agent user.
Yes, on a server where it can run WP-CLI. Give it the agent’s user every time, for example wp agentedseo capabilities –user=agentedseo-hermes. Without –user, WP-CLI runs as the site itself and skips every permission check and approval rule.
Click Revoke on the Connections screen. Then run hermes mcp remove agentedseo and delete the AGENTEDSEO_AUTH line from .env.