> For the complete documentation index, see [llms.txt](https://ce-docs.keywordrush.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ce-docs.keywordrush.com/ai-agents/advanced.md).

# For advanced users

Everything else in this section is beginner-friendly. This page is the one place for the technical details, if you want them.

### Your site's links

Three links appear on **Content Egg → AI Agents** (with your real domain in place of `your-site.com`):

* **OpenAPI** — `https://your-site.com/wp-json/content-egg/v1/openapi` — a machine-readable description of everything the assistant can do. Import this into ChatGPT actions, HTTP clients, and code generators.
* **Agent guide** — `https://your-site.com/wp-json/content-egg/v1/agent-guide` — a short, plain-language playbook of workflows and block-choice rules. Paste it into your assistant's instructions.
* **MCP endpoint** — `https://your-site.com/wp-json/content-egg/mcp` — for the Claude Desktop app and other MCP clients. Only present when the WordPress MCP Adapter plugin is active. (Optional: Claude, Claude Code, Cursor and other assistants can connect over plain REST instead.)

Under the hood it's all the standard **WordPress Abilities API** (`/wp-json/wp-abilities/v1/`), authenticated with a WordPress application password over HTTPS — so anything that speaks that API works too.

### The installable skill

There's a ready-made Content Egg skill for compatible AI clients. Install it with:

```bash
npx skills add keywordr/agent-skills --skill content-egg
```

It packages the workflows and rules so your assistant is good at Content Egg out of the box. Source and details: [github.com/keywordr/agent-skills](https://github.com/keywordr/agent-skills).

### What agents can do

A quick map of the available abilities. Each still requires the matching WordPress capability for the connected user.

**Read:** plugin status, list modules, module settings, plugin settings, product search, a post's products, feed status, and the Egg Blocks catalog.

**Write:** add / update / remove / reorder products on a post, refresh a post's products, activate / deactivate modules, update module and plugin settings, and create a product feed.

**Page building:** validate and preview a block layout, read a post's existing blocks, insert blocks into a post, and create a whole post from a block layout.

For the exact inputs and outputs of each, use the **OpenAPI** and **agent guide** links above — they're always in sync with what your site actually exposes.

### Calling an ability yourself

Writing your own script? Every ability runs as a single POST, signed in with your application password:

```bash
curl -u 'USERNAME:APPLICATION PASSWORD' \
  -H 'Content-Type: application/json' \
  -d '{"input":{}}' \
  https://your-site.com/wp-json/content-egg/v1/abilities/content-egg/list-modules/run
```

Swap `content-egg/list-modules` for any ability name and put its parameters inside `input`. The **OpenAPI** link above lists every ability and exactly what it accepts.

### Going beyond Content Egg

Your assistant isn't limited to Content Egg. The username and application password you created already unlock **all** of WordPress's own REST API — there's nothing extra to switch on or connect. So a capable assistant can also handle plain-WordPress tasks Content Egg doesn't cover: assigning categories and tags, editing the excerpt, or changing a post's slug.

Whether it *can* depends on your assistant, not on your site:

* **Agent and coding tools** (Claude Code, Cursor) and **MCP clients** can use WordPress's REST API directly with the same login — no extra setup.
* A **ChatGPT Custom GPT** only knows the Content Egg actions it imported from your OpenAPI link. To let it do more, add the WordPress REST endpoints (`/wp-json/wp/v2/…`) to its Action as well.

Either way it still acts as your connected WordPress user and can never exceed that user's permissions — see [**What your assistant can and can't do**](/ai-agents/safety-and-permissions.md).

### What the messages mean

If your assistant reports one of these, here's the plain-language version:

| Message                  | What it means                                                            | What to do                                                                    |
| ------------------------ | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------- |
| `cegg_validation_failed` | Something in the request wasn't right.                                   | The message says what — usually the assistant fixes it and retries by itself. |
| `cegg_conflict`          | The post changed since the assistant last read it (maybe you edited it). | Ask it to re-read the post and try again.                                     |
| Rate limited             | Too many requests too quickly (often product searches).                  | Wait a moment and retry; search less aggressively.                            |
| Feed still importing     | A feed you just created is still loading in the background.              | Wait a bit; the assistant can check the feed status and continue.             |

### If the assistant gets stale or wrong data

Content Egg already tells the common page caches (LiteSpeed, WP Rocket, W3TC…) not to store the agent API, so you normally don't need to configure anything. But a cache **above** WordPress — a CDN like Cloudflare, Varnish, or a server-level reverse proxy — can't hear that.

If your assistant returns errors, or clearly stale or wrong data (for example, a module list that doesn't match your site), your CDN or server cache may be caching the API. Exclude these two paths from it and purge:

* `/wp-json/wp-abilities/`
* `/wp-json/content-egg/`

Why it happens: the assistant signs in with an application password, which carries no login cookie, so a cache can mistake an authenticated request for an anonymous, cacheable one. Excluding those paths keeps every response fresh and private.

### If writes fail but reads work

If your assistant can search and read fine but **saving** fails — adding coupons or products errors out, sometimes as a plain "tool execution failed" or a `403` — your host's security firewall (a WAF) may be blocking it. The tell is that only writes fail: a write saves the product's affiliate URL into your page, and some firewalls treat an affiliate redirect link (like `redirectingat.com`) in a request as suspicious. It's a false positive — it's your own content being saved.

Allow the same two paths through the firewall that you'd exclude from a cache: `/wp-json/content-egg/` and `/wp-json/wp-abilities/`. On **Cloudflare**, add a WAF rule that *skips* the managed rules for those paths; in a **security plugin** (Wordfence and similar), allowlist them; on **managed hosting** (Hostinger, SiteGround…) you usually can't edit rules yourself, so ask support to whitelist those two paths.

{% hint style="info" %}
To confirm it's the firewall, briefly turn the WAF off and retry the save — if it works, add the exception above rather than leaving it off. Repeated blocked requests can also trip a host's bot protection into a temporary CAPTCHA or IP block; the exception stops that at the source.
{% endhint %}

### MCP note

MCP is optional — everything on this page works over plain REST without it. MCP support needs the free **WordPress MCP Adapter** plugin. It isn't on the WordPress.org directory yet, so you download it from its [GitHub releases page](https://github.com/WordPress/mcp-adapter/releases) and upload the zip under **Plugins → Add New Plugin → Upload Plugin** — see [**Connect Claude**](/ai-agents/connect-claude.md) for the step-by-step. Once it's active, your MCP endpoint is served at `…/wp-json/content-egg/mcp` for the **Claude Desktop** app and other MCP clients.

You don't need it for everything, though: **Claude Code**, **Cursor**, and other agent/coding tools talk to your site over plain REST with the same application password — no adapter, no MCP setup. Everything on this page works over plain REST without it.
