YOOtheme MCP — documentation
YOOtheme MCP · WordPress & Joomla · Documentation
YOOtheme MCP / CLI / Skill — documentation
Manage YOOtheme Pro 5.x layouts, the Style Customizer, custom CSS/JS, the cookie consent manager and saved element presets on your WordPress and Joomla 4/5 sites — from a terminal or an AI assistant. It talks to each site over its standard REST API: no plugins, no MU-plugins, no SSH, no file access on the server. Just an Application Password (WordPress) or an API Token (Joomla).
On this page — What it is · Requirements · Install · Credentials · Configure sites.json · WordPress layout visibility · What you can do · Customizer & settings by key · Safety · Run as an MCP server · Licence & updates · Troubleshooting · FAQ
What it is
One package, three front-ends over the same REST code:
- CLI —
yootheme …, the recommended entry point for daily ops, scripts and CI. - MCP server —
yootheme-mcp/python -m yootheme_mcp, the same logic exposed to Claude Desktop or Cursor so an agent can manage your sites in chat. - Skill
yootheme-remote— an agent playbook that knows the tools and the safe order to use them in.
Requirements
- Python 3.10+ on your machine (Windows, macOS or Linux). The CLI works on its own; the MCP needs a chat client that speaks MCP.
- Sites running YOOtheme Pro 5.x on WordPress or Joomla 4/5.
- A WordPress Application Password, or a Joomla API Token, per site. Nothing is installed on the server.
Install
cd yootheme-mcp
python -m venv .venv
.venv\Scripts\Activate.ps1 # PowerShell (Linux/macOS: source .venv/bin/activate)
pip install -e .
yootheme --version
After install you have the yootheme CLI and the yootheme-mcp server entry point. On Windows there is also a one-shot INSTALL.ps1.
Site credentials
WordPress — Application Password
- WP Admin → Users → your profile → scroll to Application Passwords.
- Name it
yootheme-cli→ Add New Application Password. - Copy the value (
xxxx xxxx xxxx xxxx xxxx xxxx) — shown once, keep the spaces.
Joomla — API Token
- Enable the plugins API Authentication – Web Services Joomla Token and User – Joomla API Token.
- Edit a Super User profile → Joomla API Token tab → Generate.
- Copy the token as displayed (already base64-encoded).
Configure sites.json
A single file lists every site. On Windows it lives at %APPDATA%\yootheme-mcp\sites.json (Linux/macOS: ~/.config/yootheme-mcp/sites.json), or point YOOTHEME_MCP_CONFIG anywhere.
{
"sites": {
"tiserve": {
"platform": "wordpress",
"url": "https://tiserve.it",
"wp_username": "admin33",
"wp_app_password": "xxxx xxxx xxxx xxxx xxxx xxxx"
},
"loquehay": {
"platform": "joomla",
"url": "https://loquehay.es",
"joomla_token": "base64TokenFromUserProfile"
}
}
}
yootheme sites # list configured sites
yootheme ping tiserve # verify auth + reachability
yootheme list tiserve --limit 50 --only-with-layout
WordPress layout visibility (optional)
On many WordPress installs YOOtheme does not register _yootheme_page with show_in_rest. The symptom: yootheme list shows your pages but reports LAYOUT=no on every row, because the layout meta is hidden from REST. Three ways to handle it, best first:
- Use the YOOtheme REST namespace — if the site exposes
/wp-json/yootheme/v1/*(most 5.x installs do), the CLI/MCP falls back to it automatically for the customizer and settings. - Optional MU-plugin
extras/mu-yootheme-rest.php(about 30 lines) registers the meta withshow_in_rest=trueplus a capability check. Drop it inwp-content/mu-plugins/to unlock per-page layout read/write. - Use the builder UI for per-page layouts and the CLI for everything else — customizer, settings, cookie consent, presets, bulk find/replace.
What you can do
| Feature | Command |
|---|---|
| Page layouts (sections / rows / columns) | yootheme get / set / list / duplicate |
| Copy a layout to another site (cross-CMS) | yootheme duplicate src 32 dst 17 --source-type page --target-type article |
| Element Presets (“My Presets”) | yootheme presets list / export / import |
| Style Customizer | yootheme customizer get / set |
| Custom CSS / Less | yootheme settings ... --key custom_less |
| Custom JavaScript | yootheme settings ... --key scripts |
| Cookie Consent Manager (v5.0) | yootheme settings ... --key consent |
| Favicon / touch icon | yootheme settings ... --key favicon |
| Bulk find/replace across every layout | yootheme bulk-replace site OLD NEW (dry-run) → --apply |
| Joomla article CRUD | yootheme article create / update / publish / delete |
| Joomla media manager | yootheme media list / upload / delete |
| Joomla menus & menu items | yootheme menu types / items / get / set |
| Joomla template styles + assignment | yootheme templates |
Customizer & settings by key
YOOtheme Pro serialises the whole Customizer into one config blob (Joomla: the template style's params.config; WordPress: /wp-json/yootheme/v1/style + settings). Read or write any value by its dotted key:
yootheme settings get tiserve --key style # active style, e.g. "fuse"
yootheme settings get tiserve --key header.layout # any Layout panel
yootheme settings get tiserve --key custom_less -o custom.less
yootheme settings set tiserve custom_less new-custom.less
yootheme customizer get tiserve -o customizer-backup.json
Safety — the destructive paths
Most write commands prompt for confirmation (pass --yes to skip). A few are irreversible on the remote side, so they are guarded:
- A Joomla article's builder layout IS its body. Writing a layout onto an article that already has text would replace that text with no version to restore.
set,importandduplicaterefuse unless you pass--replace-body(CLI) /replace_body: true(MCP); the replaced text is handed back to you asreplaced_bodyand written beside the layout — nowhere else. - Delete trashes, destroy is explicit.
article deletesends the article to Joomla's trash (recoverable); only--permanentdestroys it, and its prompt says so. - A scripts write cannot silently drop entries. Writing the Scripts / External-Services list refuses to remove entries you omitted, naming them in
would_remove;allow_removals: trueaccepts the loss and returns the removed descriptors. Adding needs no flag. bulk-replace --applyrewrites every matching layout on the site. It does not prompt — always read the dry-run report first.
Run as an MCP server
To let Claude Desktop / Cursor call these tools in chat, add:
{
"mcpServers": {
"yootheme": {
"command": "yootheme-mcp",
"env": {
"YOOTHEME_MCP_CONFIG": "C:/Users/you/AppData/Roaming/yootheme-mcp/sites.json"
}
}
}
}
Then ask, e.g. "list configured yootheme sites and ping them" or "copy the layout of page 32 on tiserve to article 17 on loquehay".
Licence & updates
Sold through GMC Licenses with a soft licence check. Put your Download Key in %APPDATA%\yootheme-mcp\license.key (one line) or the YOOTHEME_MCP_LICENSE_KEY environment variable. The client code is MIT licensed.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
list shows LAYOUT=no on built WordPress pages | _yootheme_page not in REST | Install extras/mu-yootheme-rest.php into wp-content/mu-plugins/ — the yootheme/v1 fallback covers the customizer and settings, not per-page layouts |
401 on WordPress | Wrong Application Password or missing spaces | Regenerate the App Password; keep the spaces; the normal login password will not work |
401 / 403 on Joomla | Token plugins disabled or non-Super-User token | Enable both Joomla API Token plugins; generate the token on a Super User |
A settings shortcut reads {} on WordPress | The key lives in the customizer store, not settings | Compare settings get --key … with customizer get; write via the store that actually holds it |
FAQ
- Do I have to install anything on the site?
No. It works entirely over the site's standard REST API with an Application Password (WordPress) or API Token (Joomla). The only optional server-side file is a small WordPress MU-plugin that makes per-page layouts visible to REST — and even that is a convenience, not a requirement.
- WordPress and Joomla at the same time?
Yes. List both in
sites.jsonwith theirplatform. You can evenduplicatea layout from a WordPress page to a Joomla article — the builder JSON is the same on both. - Can it overwrite an article's text?
Only if you tell it to. Because a Joomla article's builder layout is its whole body, writing a layout onto an article that has text is refused unless you pass
--replace-body, and the replaced text is handed back to you so you can keep it. - Is there a visual editor?
No — you keep using YOOtheme's own builder for drag-and-drop. This is a headless toolkit for scripted, repeatable and AI-driven changes: bulk find/replace, customizer edits, presets, cross-site copies and CI.
- Which YOOtheme version does it target?
YOOtheme Pro 5.x, tested against 5.0.37. The v5.0 features — Cookie Consent Manager, scroll animations, Display Conditions and the rest — are edited through the same layout JSON and settings keys.


