wordpress
wordpress.
What this WordPress site is and what this connection can do there —
setup & usage
⚠ a WordPress site on HTTPS, an account that can write
http:// address is refused (the password would travel in clear), unless it is an internal destination declared by the platform operator.⚙ two ways, same result
▸ write, publish, manage
wordpress_site() (role, content types, taxonomies, detected SEO plugins)wordpress_article(title=…, markdown=…, categories=["Guides"], tags=["seo"], featured_image="https://…/cover.jpg", seo_description=…) — always as a draftwordpress_publish(id=…) / wordpress_publish(id=…, at="2026-10-05T09:00:00")wordpress_publish(id=…, op="unpublish")wordpress_content(op="list", status="draft")wordpress_content(op="update", type="pages", id=…, data={…}, dry_run=True) then without dry_runwordpress_content(type="<type given by wordpress_site>", …)wordpress_media(op="upload", source="https://…", alt_text="…")· what to know
wordpress_article and wordpress_content refuse status=publish. only wordpress_publish puts it live. ⚠️ however, editing a post that is ALREADY published changes the site right away — dry_run=True shows the diff first.source_url).<script>, <iframe>…) becomes a "Custom HTML" block, kept as is if the account has the unfiltered_html capability (administrator, editor on a single site) — wordpress_site() says so. never paste in the HTML of a page you don't control.incorrect_password / invalid_username). if they are right, the host or a security plugin strips the Authorization header. known fixes: on Apache, add to .htaccess SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1; in Wordfence / iThemes / a Cloudflare firewall, allow the REST API for authenticated users.wordpress_site() says how it stands on this site. if it is not the case (older version, Rank Math), add this snippet (child theme or "Code Snippets" plugin):```php
add_action('init', function () {
$keys = ['_yoast_wpseo_title', '_yoast_wpseo_metadesc', '_yoast_wpseo_focuskw',
'rank_math_title', 'rank_math_description', 'rank_math_focus_keyword'];
foreach (['post', 'page'] as $type) {
foreach ($keys as $key) {
register_post_meta($type, $key, [
'show_in_rest' => true, 'single' => true, 'type' => 'string',
'auth_callback' => fn() => current_user_can('edit_posts'),
]);
}
}
});
```
without it, the post is still created and the response says the SEO was not written.
force=true deletes permanently. categories, tags and media have no trash: deleting them is permanent.wordpress_content(op="list", status="publish", orderby="date")) is enough.⚙ multiple sites
this connector accepts multiple sites: each stored credential becomes a named account (one name per site), at your level, your team's or your org's.
_account="<name>" on the tool; list them: oto_identity(op='list', connector='wordpress') (scope='org' or scope='group' for the org's or team's)oto_identity(op='set', connector='wordpress', identity_id='<name>'); rename: op='rename' with new_name_account) and adding upoutils
chargement…
utilisation
claude code — installe le plugin oto —
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.cli —
pipx install oto-cli puis oto wordpress …