HelperMCP Developer Documentation
Version 1.2.5 · by Helpblogger
Version 1.2.5 · by Helpblogger
HelperMCP turns a WordPress site into an MCP (Model Context Protocol) server. Connect Claude, ChatGPT or any MCP client and it can manage content, media, SEO, plugins, themes, site settings and menus, diagnose PHP errors and fix them in plugin and theme files, and drive any other plugin through its REST API. Developers can add their own tools with the Addon API.
This document covers installation, the security model, every built-in tool, and how to write addons.
Contents#
- Quick start
- How it works
- Safety model
- Settings reference
- SEO plugin support
- Instruction playbooks
- Troubleshooting and fixing errors
- Access control: scopes, OAuth, approvals, restore points
- Site care tools
- Tool reference
- Writing addons
- Hooks and filters reference
- MCP protocol reference
- Hardening checklist
- FAQ
- Changelog
1. Quick start#
Install#
- Upload
helpermcp-v1.2.5.zipunder Plugins > Add New > Upload Plugin, then activate. (The folder inside the zip ishelpermcp/, so updates replace the old version cleanly.) - Open HelperMCP > Connect.
- Click Generate New Token and copy it. It is shown once.
Your endpoint is:
https://YOUR-SITE.com/wp-json/helpermcp/v1/mcpConnect a client#
Claude (custom connector). Add a custom connector and paste the URL with the token as a query parameter:
https://YOUR-SITE.com/wp-json/helpermcp/v1/mcp?token=hmcp_xxxxxxxxClients that support headers (Claude Code, Cursor, many others) should send the token as a bearer header instead, which keeps it out of server logs:
Authorization: Bearer hmcp_xxxxxxxxExample for Claude Code:
claude mcp add --transport http helpermcp https://YOUR-SITE.com/wp-json/helpermcp/v1/mcp \
--header "Authorization: Bearer hmcp_xxxxxxxx"Verify with curl#
curl -s https://YOUR-SITE.com/wp-json/helpermcp/v1/mcp \
-H "Authorization: Bearer hmcp_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'You should get a JSON list of tools. A good first prompt for your AI is: "Call get_site_overview and tell me what you can do on this site."
What is on by default#
Reading, content writing, SEO, media, taxonomies, comments, menus, redirects, schema, security scanning, performance audits and diagnostics are on. Anything that installs, edits or removes code or configuration, or deletes data, starts switched off (plugin and theme management, site and plugin settings writes, file editing, the database tool, the REST bridge, users, image optimisation, database clean-up, core updates, quarantine). Turn them on, one by one if you like, under HelperMCP > Tools. To connect an app without a token, use OAuth (section 8.2).
2. How it works#
AI client ──JSON-RPC over HTTPS──▶ /wp-json/helpermcp/v1/mcp
│
├─ bearer token → WordPress user
├─ tool enabled? (Tools page)
├─ user has the capability? (edit_post, install_plugins ...)
├─ site setting allows it? (publishing, deleting ...)
└─ tool runs → result (or error) → activity log- Every token acts as one WordPress user. The tool runs as that user, so it can never do more than that person could do in wp-admin. A token belonging to an Editor cannot install plugins, no matter which tools are on.
- Tools are the only way in. There is no arbitrary code execution. The widest tools (
rest_request,db_query, file tools) are individually switchable and sandboxed as described in section 3. - Playbooks (Markdown files) are injected into the AI's instructions when it connects, so it follows your house style.
- Addons register extra tools through a small PHP API (section 11).
File locations#
| What | Where |
|---|---|
| Playbooks | wp-content/uploads/helpermcp/instructions/*.md |
| File-edit backups | wp-content/uploads/helpermcp/backups/<id>/ |
| Drop-in addons | wp-content/helpermcp-addons/ |
| Database backups | wp-content/uploads/helpermcp/dbbackups/ |
| Quarantined files | wp-content/uploads/helpermcp/quarantine/ |
| Original images (after optimising) | wp-content/uploads/helpermcp/image-backups/ |
| Tokens (hashed) | table {prefix}helpermcp_tokens |
| Activity log | table {prefix}helpermcp_log (last 1000 entries) |
| Approvals / restore points | tables {prefix}helpermcp_approvals, {prefix}helpermcp_snapshots |
| Redirects / 404 log | tables {prefix}helpermcp_redirects, {prefix}helpermcp_404 |
| Settings | option helpermcp_settings; tool switches: option helpermcp_tool_state |
Uploads folders are protected with .htaccess and an index.php. On Nginx, deny direct access to /wp-content/uploads/helpermcp/ in your server config.
3. Safety model#
Several independent layers sit between the AI and your site. All of them must allow an action.
- Authentication. Bearer tokens only; stored as SHA-256 hashes; revocable; the plaintext is shown once. Prefix
hmcp_. - User capabilities. Every tool checks the token owner's real WordPress capabilities (
edit_post,publish_posts,upload_files,install_plugins,manage_optionsand so on). Tools that declare a capability are refused up front. - Tool switches. Each tool can be turned off. Disabled tools are hidden from the AI and refused if called. High-impact tools start off.
- Site settings. Publishing, trashing, permanent deletion, media, custom fields, terms and site-wide search/replace each have their own switch (section 4).
- Confirmation flags. Destructive tools need an explicit flag such as
confirm: true. Site-wide replace defaults to a dry run. - Protected targets.
- HelperMCP will not deactivate, update, delete or edit itself through its own connection.
- Options such as
siteurl,home,admin_email,active_plugins, user roles, salts and everyhelpermcp_*option cannot be written. Option values that look like secrets are masked when read. wp-config.php,.env, key files, SQL dumps and.gitcan never be read or written.- The
sitefile root is read-only; onlyplugin:<folder>,theme:<folder>andmu-plugincan be written, and only for text file types. - The database tool is read-only and cannot touch password hashes, session tokens or HelperMCP tokens.
- The REST bridge cannot reach HelperMCP's own routes or the core plugin/theme routes.
- Automatic rollback. Activating a plugin, switching a theme, and every file write run a loopback health check before and after. If the site was healthy and then returns an error, the change is undone automatically.
- Backups. Every file change is backed up first and can be restored with
restore_backup. - Audit log. Every write is recorded under HelperMCP > Activity.
- Token limits. Scoped access levels, expiry, IP allowlists and rate limits (section 8.1).
- Approval gate. Optionally hold risky or all changes until you approve them (section 8.3).
- Restore points. Automatic snapshots before bulk and settings changes (section 8.4).
Rollback: what to know#
The health check requests your homepage from the server itself. It works on almost every host. If a host blocks loopback requests, the tool says so in its result (WARNING: the automatic site check could not run), and you should open the site to confirm it loads. After a write, HelperMCP calls opcache_invalidate so the check sees the new code.
4. Settings reference#
HelperMCP > Content & Safety
| Setting | Default | Effect |
|---|---|---|
| Post types | all public | Which post types the AI may manage (attachments are handled by the media tools). |
| Default status | draft | Status of new content when the AI does not say. |
| Default body format | html | markdown converts Markdown bodies to editor blocks. |
| Bulk limit | 25 | Maximum items per bulk call. |
| Allow publishing and scheduling | on | When off the AI can only save drafts and pending. |
| Allow moving content to trash | on | Recoverable. |
| Allow permanent deletion | off | Required for permanent delete of posts, media, terms, plugins and themes. Each also needs a confirm flag. |
| Allow media uploads and edits | on | URL/base64 upload, featured images, alt text, site logo/favicon. |
| Allow creating and editing terms | on | Categories, tags, custom taxonomies. |
| Allow editing custom fields | on | Keys starting with _ always stay protected. |
| Allow site-wide find and replace | on | Always a dry run first. |
| Allow sign-in with WordPress (OAuth) | on | Lets connectors sign in without a pasted token (section 8.2). |
| Approval gate | none | Hold high-impact or all changes for approval (section 8.3, Control tab). |
| Run HelperMCP redirect rules | on | Front-end redirect engine (section 9.4). |
| Record 404 URLs | on | Feeds list_404s and fix_404s. |
| Keep an activity log | on | Powers the Activity tab. |
| Extra rules for your AI | empty | Short standing rules appended to every session. |
HelperMCP > SEO Plugins: choose a specific SEO plugin or leave on Automatic; toggle built-in SEO output when no SEO plugin is active. HelperMCP > Addons: toggle loading of drop-in addon files. HelperMCP > Tools: the per-tool and per-group switches.
5. SEO plugin support#
The AI always uses the same normalized fields. HelperMCP translates them to whichever SEO plugin is active:
title, description, focus_keywords, canonical, noindex, nofollow, og_title, og_description, og_image, twitter_title, twitter_description, twitter_image
| Plugin | Storage used | Notes |
|---|---|---|
| Rank Math | rank_math_* post meta; robots array | Multiple focus keywords supported. |
| Yoast SEO | _yoast_wpseo_* post meta | One focus keyphrase (the first). Indexable is rebuilt after a write. Term SEO via wpseo_taxonomy_meta. |
| All in One SEO (v4+) | AIOSEO post model (Post::savePost) | Custom robots are enabled automatically when you set noindex/nofollow. |
| SEOPress | _seopress_* post meta | |
| The SEO Framework / Genesis SEO | _genesis_*, _open_graph_*, _twitter_* | No native focus keyword, kept in HelperMCP meta. |
| SmartCrawl | _wds_* post meta | Social fields kept in HelperMCP meta. |
| Slim SEO | slim_seo meta array | |
| HelperSEO | helperseo_* post meta | |
| Squirrly SEO | none (no public API) | Stored in HelperMCP meta; native output is disabled to avoid duplicate tags. |
| No SEO plugin | HelperMCP meta + built-in output | Renders title, description, canonical, robots, Open Graph and Twitter tags, and steps aside as soon as any SEO plugin is active. |
Any field a plugin cannot store is kept in HelperMCP's own meta (_helpermcp_seo_*) so nothing is lost, and set_seo tells you which fields went there (fallback_fields).
Category/tag SEO (get_term_seo, set_term_seo) supports Yoast, Rank Math, SEOPress and built-in storage.
Compatibility note. The Yoast and Rank Math mappings were verified by simulating their stored fields; test All in One SEO and the others on a staging site before relying on them in production. Use
get_seo_statusto see what HelperMCP detected.
6. Instruction playbooks#
Playbooks are Markdown files (HelperMCP > Instructions, or written by the AI itself with save_instruction / append_instruction). A pinned playbook is injected into the AI's instructions on every connection and its front matter sets defaults for new content.
---
default_status: draft
default_post_type: post
default_author: 2
default_category: News
default_tags: nigeria, tech
default_featured_image: 123
featured_image: required
content_format: markdown
alt_text: from_title
---
# House style
- Short paragraphs, plain English.
- Every article gets a featured image with alt text.| Key | Values | Effect |
|---|---|---|
default_status | draft, pending, publish | Status when none is given (publishing must be allowed). |
default_post_type | any managed type | Used by create_post. |
default_author | ID, login or email | Author for new content. |
default_category | name, slug or ID; comma separated | Applied to new posts with no categories. |
default_tags | comma separated | Applied to new posts with no tags. |
default_featured_image | media ID or URL | Used when the AI supplies no image. |
featured_image | none, optional, required | required blocks publishing without a featured image. |
content_format | html, markdown | Default body format. |
alt_text | from_title | Fills empty alt text on uploads from the post title. |
Later pinned files (alphabetical) override earlier ones. Files are capped at 200 KB; up to 30 KB of pinned text is injected per session. Only administrators can create, change, pin or delete playbooks.
7. Troubleshooting and fixing errors#
HelperMCP can find the exact file, line and cause of a PHP error and fix it.
Step 1: switch on logging (once)#
Add to wp-config.php above the "stop editing" line:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );Step 2: diagnose#
Ask your AI: "Something is broken, run diagnose_errors." The tool:
- reads the tail of the debug log and groups repeated errors;
- reads WordPress's own list of paused plugins and themes;
- for each error returns: type, message, file and line, whether it belongs to a plugin, theme or core (and which), the source code around the line, a plain-language likely cause and a suggested fix, plus the
rootandpathto use with the file tools.
Step 3: fix#
If the Plugin & theme files tools are enabled (they start off, enable them under HelperMCP > Tools), the AI continues with:
read_filearound the reported line.patch_filewith an exact find/replace. The edit is syntax-checked, backed up, written, and the site is health-checked. A change that breaks the site is rolled back automatically.diagnose_errorsagain to confirm the error stopped.
If something goes wrong: list_backups then restore_backup.
If the file tools stay off, the AI will explain the exact fix, or recommend deactivate_plugin for the offender.
Guardrails specific to file edits#
- Writable:
plugin:<folder>,theme:<folder>,mu-plugin. Read-only:site. - Never writable: HelperMCP itself, WordPress core,
wp-config.php. - Writable file types: php, js, css, json, html, htm, txt, md, xml, svg, twig, yml, yaml, ini, scss, less, pot, po, mjs. Maximum 1 MB per write.
- Respects
DISALLOW_FILE_EDITand theedit_plugins/edit_themescapabilities. If your host or wp-config disables the built-in editor, the file write tools are refused too.
Errors the finder recognizes#
Undefined function, class not found, memory exhausted, member function on null, undefined variable/key/property, syntax and parse errors, execution timeout, cannot redeclare, PHP 8 type errors, dynamic property deprecations, headers already sent, failed to open stream, too few arguments, division by zero, uncaught errors/exceptions. Anything else still gets file, line, code and a generic next step.
8. Access control: scopes, OAuth, approvals, restore points#
8.1 Token scopes, expiry, IP allowlist, rate limits#
Every token (HelperMCP > Connect) can be narrowed when you create it. Scopes only ever narrow access: a scoped token still needs the tool to be switched on and its WordPress user to hold the required capability.
| Option | What it does |
|---|---|
| Access level: Everything | Every tool that is switched on. |
| Access level: Content & SEO | Posts, pages, media, categories/tags, links, custom fields, search/replace, playbooks, comments, menus, redirects, schema and the Control tools. No plugin, theme, settings, file, database or security tools. |
| Access level: Read-only | Only tools that never change anything. |
| Access level: Custom | Exactly the tool groups you tick (plus the Control tools). |
| Expires | Never, or after 1, 7, 30 or 90 days. Expired tokens get HTTP 401. |
| Allowed IPs | Comma-separated exact IPs and IPv4 CIDR ranges (203.0.113.5, 10.0.0.0/8). Matched against REMOTE_ADDR. Behind a reverse proxy or CDN that address may be the proxy, so test before relying on it. Refused with HTTP 403. |
| Requests per minute | A fixed one-minute window per token. Over the limit: HTTP 429 with Retry-After: 60. |
A tool outside a token's scope is hidden from tools/list and refused if called, and the AI is told its access level when it connects. The control group (check_approval, restore points) is always reachable.
8.2 Sign in with WordPress (OAuth)#
Connectors that support OAuth (Claude's custom connectors and other MCP clients) can connect without pasting a token. Switch it on or off under Connect > Allow sign-in with WordPress (OAuth).
Flow. The client registers itself, opens a WordPress login and consent screen where you choose Content & SEO, Read-only, or (administrators only) Everything, then receives a short-lived access token and a rotating refresh token. Each issued token is an ordinary HelperMCP token owned by the person who approved, so all the usual checks apply.
| Piece | URL |
|---|---|
| Resource metadata | /.well-known/oauth-protected-resource (also /wp-json/helpermcp/v1/oauth/resource) |
| Authorization server metadata | /.well-known/oauth-authorization-server (also /wp-json/helpermcp/v1/oauth/metadata) |
| Dynamic client registration | POST /wp-json/helpermcp/v1/oauth/register |
| Authorization (login + consent) | /?helpermcp_oauth=authorize |
| Token (code and refresh grants) | POST /wp-json/helpermcp/v1/oauth/token |
Rules enforced: PKCE with S256 is required; authorization codes are single use and expire after 10 minutes; redirect URIs must be https (or http://localhost) and exactly match what the client registered; access tokens last 1 hour; refresh tokens last 60 days and rotate on every use (the old one is revoked); registrations are limited to 20 per hour per IP and 100 clients in total. Disconnect any app from Connect > Connected apps.
Requirements: pretty permalinks, and your web server must pass /.well-known/... to WordPress. Default Apache .htaccess rules and the usual Nginx try_files $uri $uri/ /index.php?$args do this. Some hosts, firewalls and CDNs intercept /.well-known/; if discovery fails, allow those two paths through. When a request has no valid token, HelperMCP answers 401 with a WWW-Authenticate header pointing at the resource metadata, as the MCP authorization spec requires.
Verified end to end with a scripted client (registration, login, consent, PKCE, code reuse, refresh rotation). Test it with your actual connector on a staging site first.
8.3 Approval gate#
Under HelperMCP > Control choose which actions need your approval:
| Mode | Held for approval |
|---|---|
| None (default) | Nothing. |
| High-impact | Tools flagged "high impact" plus every guarded (destructive) tool: installs, file edits, setting changes, deletes. |
| Every change | Every tool that changes anything. |
A held tool is not executed. It returns approval_required with an approval_id, and the AI is instructed to tell you and wait. You approve or deny in wp-admin (a count shows on the Control tab). On approval the tool runs exactly as the AI requested, as the user who asked, with all capability checks repeated; the AI collects the result with check_approval. Requests expire after 24 hours; each user can have at most 50 pending. Read-only tools and the Control tools are never held.
8.4 Restore points#
A restore point stores the previous state of posts (title, content, excerpt, status, slug, dates, author, terms, SEO fields, featured image, public custom fields) and/or options. HelperMCP takes one automatically before: bulk_update_posts, replace_in_content (when applied), update_site_settings, update_option_value, delete_option_value, set_theme_mod, convert_to_webp, block template edits and resets, and update_global_styles. Take one on demand with create_restore_point. The result of each of those tools includes restore_point_id.
Roll back from Control > Restore points or with restore_restore_point (needs confirm: true). The newest 150 are kept; a single restore point is capped at 8 MB.
Not covered: plugin and theme files (file edits have their own backups, section 7), media files, plugin installs, and database content outside posts and options. Take a database backup (create_db_backup) before anything bigger.
9. Site care tools#
These tools turn "check on my site" into prompts. They report and fix, with dry runs and backups wherever data could be lost.
9.1 Security scan#
security_scan reviews core integrity, PHP files in uploads, backdoor and obfuscation patterns (eval of decoded data, command execution from request input, known webshell signatures, very long encoded strings), administrator accounts, risky configuration (public debug.log, displayed errors, XML-RPC, file editor, wp-config.php permissions, HTTPS, PHP and WordPress versions) and plugin health (updates, inactive plugins, plugins unmaintained for over 2 years, plugins missing from WordPress.org). Add recent_changes for a list of recently modified PHP files.
- Findings are indicators, not verdicts. Legitimate security and cache plugins contain some of these patterns. Review with
read_file, and confirm WordPress.org plugins withverify_plugin_files. - There is no vulnerability database. For known-CVE checks use a service such as Wordfence Intelligence or Patchstack.
verify_core_filesandverify_plugin_filescompare against official checksums and need outbound access toapi.wordpress.org/downloads.wordpress.org. Premium plugins have no official checksums.- If you find a real backdoor:
quarantine_file(reversible), change all admin passwords, update everything, reinstall core, check for new admin users, and look for how it got in. A scanner cannot guarantee a site is clean.
9.2 Performance#
performance_audit: autoloaded options (with the plugin that owns the largest), expired transients, revisions, auto-drafts, trash, spam, orphaned custom fields, largest tables, cache and PHP configuration, overdue cron. It returns prioritised recommendations.measure_page: response time, size, compression, cache headers, script/CSS/image counts, render-blocking scripts, heaviest images (same-site URLs only).create_db_backup, thencleanup_databasewithdry_run(default) to preview, thendry_run: falseto apply (needs "Allow permanent deletion").set_option_autoloadto stop a big option loading on every request (the value is unchanged).
9.3 Images#
image_audit finds heavy and oversized images and estimates savings. optimize_images resizes (default max 2000 px) and recompresses in the same format, keeping URLs; originals are kept in uploads/helpermcp/image-backups/ and restore_image undoes it; dry_run defaults to true and each call handles up to 25 images. convert_to_webp converts one JPEG/PNG to WebP and rewrites the old URLs in post content and Elementor data (a restore point is taken first). Other page builders may store image URLs elsewhere, so spot-check and clear caches. bulk_fix_alt_text fills missing alt text from the parent post title or a cleaned file name (generic fallbacks, write real descriptions for important images).
9.4 Redirects, 404s and broken links#
HelperMCP runs its own redirect rules on the front end (types 301, 302, 307, 308 and 410; exact paths or regular expressions; targets can reference $1). If another redirect plugin handles a URL first, HelperMCP never sees it. Safeguards: duplicate sources, self-redirects, redirect loops and redirecting the homepage are refused; imports are validated with a dry run.
Visitors' 404s are logged (bot probes, .php and admin paths are ignored; the newest 5000 are kept). suggest_redirect finds the best matching page by slug and title similarity (and WordPress's record of previous slugs), and fix_404s creates 301s for confident matches (min_score default 0.8, dry_run default true). scan_broken_links checks every link in chosen or recent posts (40 distinct URLs per call) and returns link_index values for replace_link / remove_link. Links answering 401, 403 or 429 are not reported because many sites block automated checks.
9.5 Schema, robots.txt and sitemaps#
set_custom_schema adds JSON-LD (FAQPage, Product, Recipe, Event, LocalBusiness, HowTo, VideoObject, Article and others) to a post; it is printed in the page head and sanitised (URL fields must be http/https). Required properties are enforced locally; this is not Google's Rich Results Test. Run get_post_schema first: it shows what your SEO plugin already outputs and flags duplicate types. get_robots_txt / set_robots_txt manage the file crawlers receive (a physical file is backed up and edited; otherwise a virtual file overrides SEO plugin editors); a rule that blocks the whole site is refused unless allow_block_all is set. get_sitemap_info finds the sitemap, counts URLs and checks that robots.txt references it.
9.6 Block themes#
For block themes: list and edit templates and template parts, create patterns, read merged theme.json, and merge changes into Global Styles. Edits are stored as user customisations (the theme file is untouched), a restore point is taken first, and reset_block_template returns to the theme original. On a classic theme these tools explain that and point to the Customizer tools.
9.7 Backups and core updates#
create_db_backup writes a gzip SQL export of this site's tables to wp-content/uploads/helpermcp/dbbackups/ (protected folder; it contains password hashes, so treat it as sensitive and copy it off the server). It keeps the newest 5 and refuses databases over 1.5 GB. HelperMCP does not restore databases remotely; restore with gunzip < file.sql.gz | mysql -u USER -p DATABASE or phpMyAdmin. run_backup_plugin can start UpdraftPlus; other backup plugins are detected and reported. update_core refuses unless a HelperMCP database backup from the last 24 hours exists (or you pass backup_confirmed: true for a full backup elsewhere), health-checks the site afterwards, and WordPress finishes any database upgrade the next time wp-admin opens.
10. Tool reference#
HelperMCP ships with 165 tools (plus 8 hidden aliases that keep older HelperSEO prompts working). Tools marked off by default must be enabled under HelperMCP > Tools before the AI can see or use them.
Types: read never changes anything. write changes something. guarded is destructive and needs an explicit confirmation.
Posts, pages & custom post types#
20 tools, 20 on by default.
get_site_overview#
Site overview · read · on by default
Start here. Returns the site name and URL, WordPress version, the connected user, the SEO plugin HelperMCP is writing through, every post type you may manage with counts per status, taxonomies, what the settings allow (publishing, deleting, media), and the names of the instruction playbooks.
No parameters.
list_post_types#
List post types · read · on by default
Every post type you can manage (posts, pages and custom types), with labels, whether it is hierarchical, which taxonomies and features it supports, page templates, and counts per status.
No parameters.
list_authors#
List authors · read · on by default
Users who can write content, with ID, display name and login. Use an ID from here as author in create_post or update_post.
| Parameter | Type | Notes |
|---|---|---|
search | string | |
limit | integer | Default 20, max 100. |
list_posts#
Search and list posts · read · on by default
Search or browse any post type with filters. Returns compact rows (ID, title, slug, URL, status, dates, author, word count, whether it has a featured image). Use "missing" to find content that lacks an SEO title, SEO description, focus keyword, featured image or excerpt.
| Parameter | Type | Notes |
|---|---|---|
post_type | any | One type or an array of types. Defaults to every managed type. |
status | string | publish (default), draft, pending, private, future, trash, or any. |
search | string | Matches title, content and excerpt. |
author | integer | Author user ID. |
taxonomy | string | Filter by a taxonomy, used together with terms. |
terms | array | Term IDs or slugs for the taxonomy filter. |
date_after | string | YYYY-MM-DD |
date_before | string | YYYY-MM-DD |
orderby | string: date | modified | title | ID | menu_order | comment_count | |
order | string: ASC | DESC | |
meta_key | string | |
meta_value | string | |
missing | string: seo_title | seo_description | focus_keyword | featured_image | excerpt | Only return posts missing this. |
limit | integer | Default 20, max 100. |
page | integer | Page number, starting at 1. |
get_post#
Get a post · read · on by default
Everything about one post or page: fields, full body content, featured image, taxonomy terms, SEO fields (read through the active SEO plugin), custom fields, template and URLs. Call this before editing.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
include_content | boolean | Default true. Set false for a lighter response. |
get_post_content#
Get exact post content · read · on by default
The exact, complete body stored for a post. Use before update_post_content, since that tool replaces the whole body. For small edits prefer patch_post_content, which needs no full rewrite.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
find_post_by_url#
Find a post by URL · read · on by default
Resolve a public URL or path on this site to its post ID and details.
| Parameter | Type | Notes |
|---|---|---|
url | string | required. |
create_post#
Create a post, page or custom post type entry · write · on by default
Creates new content of any managed post type in one call: title, body, excerpt, slug, status, schedule date, author, parent, template, categories/tags/any taxonomy, featured image (by media ID or by URL, downloaded for you), SEO fields (through the active SEO plugin) and custom fields. Defaults to the site default status, normally draft, so nothing goes live unless you ask. Respects the defaults in any pinned instruction playbook (default category, author, featured image rule and so on).
| Parameter | Type | Notes |
|---|---|---|
post_type | string | Defaults to post. |
title | string | required. Post title. |
content | string | Full body content, HTML or Markdown (see content_format). |
content_format | string: html | markdown | html (default) stores content as given. markdown converts Markdown to HTML and, on block-editor post types, to proper Gutenberg blocks. |
excerpt | string | |
slug | string | URL slug. |
status | string: draft | pending | publish | private | future | Defaults to the site default (usually draft). publish/future/private require publishing to be allowed in HelperMCP settings. |
date | string | Publish date in the SITE timezone, e.g. 2026-11-02 09:30:00. A future date schedules the post. |
author | any | Author user ID, login or email. |
parent_id | integer | Hierarchical types like pages. 0 clears the parent. |
menu_order | integer | |
template | string | Page template file, e.g. templates/landing.php. Use "default" to reset. |
comment_status | string: open | closed | |
ping_status | string: open | closed | |
sticky | boolean | Stick to the front page (posts only). |
taxonomies | object | Map of taxonomy to terms, e.g. {"category":["News",12],"post_tag":["nigeria","tech"]}. Names that do not exist are created. Replaces the post's terms in that taxonomy. |
featured_image_id | integer | Media library attachment ID to use as the featured image. |
featured_image_url | string | Image URL to download into the media library and use as the featured image. |
featured_image_alt | string | Alt text for the featured image. |
seo | object | SEO fields, any subset of: title, description, focus_keywords (comma separated), canonical, noindex (bool), nofollow (bool), og_title, og_description, og_image (URL), twitter_title, twitter_description, twitter_image (URL). Written through whichever SEO plugin is active. |
meta | object | Custom fields to set, as {key: value}. Keys starting with an underscore are not allowed. |
update_post#
Update a post · write · on by default
Changes any fields of an existing post, page or custom post type entry. Only the fields you pass change. Can set the body (full replacement), taxonomies, featured image, SEO fields, custom fields, status, schedule date, author, parent, template and more in a single call.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
title | string | Post title. |
content | string | Full body content, HTML or Markdown (see content_format). |
content_format | string: html | markdown | html (default) stores content as given. markdown converts Markdown to HTML and, on block-editor post types, to proper Gutenberg blocks. |
excerpt | string | |
slug | string | URL slug. |
status | string: draft | pending | publish | private | future | Defaults to the site default (usually draft). publish/future/private require publishing to be allowed in HelperMCP settings. |
date | string | Publish date in the SITE timezone, e.g. 2026-11-02 09:30:00. A future date schedules the post. |
author | any | Author user ID, login or email. |
parent_id | integer | Hierarchical types like pages. 0 clears the parent. |
menu_order | integer | |
template | string | Page template file, e.g. templates/landing.php. Use "default" to reset. |
comment_status | string: open | closed | |
ping_status | string: open | closed | |
sticky | boolean | Stick to the front page (posts only). |
taxonomies | object | Map of taxonomy to terms, e.g. {"category":["News",12],"post_tag":["nigeria","tech"]}. Names that do not exist are created. Replaces the post's terms in that taxonomy. |
featured_image_id | integer | Media library attachment ID to use as the featured image. |
featured_image_url | string | Image URL to download into the media library and use as the featured image. |
featured_image_alt | string | Alt text for the featured image. |
seo | object | SEO fields, any subset of: title, description, focus_keywords (comma separated), canonical, noindex (bool), nofollow (bool), og_title, og_description, og_image (URL), twitter_title, twitter_description, twitter_image (URL). Written through whichever SEO plugin is active. |
meta | object | Custom fields to set, as {key: value}. Keys starting with an underscore are not allowed. |
change_summary | string |
update_post_content#
Replace post content · write · on by default
Replaces a post's ENTIRE body. Fetch the exact current text with get_post_content first, edit it, and pass the complete result back. For surgical edits use patch_post_content instead.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
new_content | string | required. |
content_format | string: html | markdown | html (default) stores content as given. markdown converts Markdown to HTML and, on block-editor post types, to proper Gutenberg blocks. |
change_summary | string |
patch_post_content#
Find and replace inside one post · write · on by default
Surgical edits to a post body without resending it. Each edit is an exact find string and its replacement. By default a find that matches more than once is refused, so you never change the wrong spot; set all true to replace every match, or use regex true for a pattern. Use dry_run true to preview.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
edits | array | required. |
dry_run | boolean |
insert_post_content#
Insert content into a post · write · on by default
Adds content at the start or end of a post, or immediately before or after a given piece of text or a heading, without touching the rest.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
content | string | required. |
content_format | string: html | markdown | html (default) stores content as given. markdown converts Markdown to HTML and, on block-editor post types, to proper Gutenberg blocks. |
position | string: end | start | after_text | before_text | after_heading | before_heading | Default end. |
anchor | string | The text (or heading text) to place the content next to. Required for the *_text and *_heading positions. |
change_post_status#
Change post status · write · on by default
Changes only the status (draft, pending, publish, private, future). For future, pass a date to schedule.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
status | string: draft | pending | publish | private | future | required. |
date | string |
schedule_post#
Schedule a post · write · on by default
Schedules a post to publish automatically at a future date and time (site timezone).
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
date | string | required. e.g. 2026-11-02 09:30:00 |
duplicate_post#
Duplicate a post · write · on by default
Copies a post with its taxonomies, featured image, custom fields and SEO meta into a new draft.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
title | string | Optional new title. |
trash_post#
Trash or delete a post · guarded · on by default
Moves content to the trash by default (recoverable). Permanent deletion needs permanent true AND confirm_permanent_delete true, and must be enabled in HelperMCP settings.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
permanent | boolean | |
confirm_permanent_delete | boolean |
restore_post#
Restore from trash · write · on by default
Brings a trashed post back (as a draft).
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
bulk_update_posts#
Bulk update posts · write · on by default
Applies update_post to many posts in one call. Each item is an object with post_id plus the same fields update_post accepts. Items run independently and the result lists success or error per item. Capped by the bulk limit in settings.
| Parameter | Type | Notes |
|---|---|---|
updates | array | required. |
list_revisions#
List revisions · read · on by default
Saved revisions of a post, newest first.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
limit | integer |
restore_revision#
Restore a revision · write · on by default
Rolls a post back to a saved revision.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
revision_id | integer | required. |
SEO#
7 tools, 7 on by default.
get_seo_status#
SEO plugin status · read · on by default
Which SEO plugin HelperMCP is reading and writing through (Yoast, Rank Math, All in One SEO, SEOPress, The SEO Framework, SmartCrawl, Slim SEO, HelperSEO or its own built-in output), and which SEO fields that plugin supports.
No parameters.
get_seo#
Get SEO fields · read · on by default
A post's SEO title, meta description, focus keywords, canonical, noindex/nofollow and social (Open Graph, Twitter) fields, read from the active SEO plugin.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
set_seo#
Set SEO fields · write · on by default
Writes any subset of SEO fields for a post through the active SEO plugin: title, description, focus_keywords, canonical, noindex, nofollow, og_title, og_description, og_image, twitter_title, twitter_description, twitter_image. Pass an empty string to clear a field.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
title | string | |
description | string | |
focus_keywords | string | |
canonical | string | |
noindex | boolean | |
nofollow | boolean | |
og_title | string | |
og_description | string | |
og_image | string | |
twitter_title | string | |
twitter_description | string | |
twitter_image | string |
analyze_post#
Analyze on-page SEO · read · on by default
Scores a post (or a draft you pass in directly) against an on-page checklist: title and description length, focus keyword placement and density, word count, headings, image alt text, internal and external links, and readability. Pass post_id for a saved post, or content/title/description/focus_keyword/slug for unsaved text.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | |
content | string | |
title | string | |
description | string | |
focus_keyword | string | |
slug | string |
seo_audit#
Site SEO audit · read · on by default
Scans the most recent published content and reports how many items are missing an SEO title, meta description, focus keyword, featured image or excerpt, are noindexed, have over-long titles or descriptions, or are thin, with example post IDs for each so you can fix them in bulk.
| Parameter | Type | Notes |
|---|---|---|
post_type | string | |
limit | integer | How many recent posts to scan. Default 100, max 300. |
get_term_seo#
Get category/tag SEO · read · on by default
SEO title, description, focus keywords, canonical and robots for a category, tag or other taxonomy term (Yoast, Rank Math, SEOPress and built-in storage).
| Parameter | Type | Notes |
|---|---|---|
term_id | integer | required. |
taxonomy | string |
set_term_seo#
Set category/tag SEO · write · on by default
Writes SEO fields for a category, tag or other taxonomy term. Only the fields you pass change.
| Parameter | Type | Notes |
|---|---|---|
term_id | integer | required. |
taxonomy | string | |
title | string | |
description | string | |
focus_keywords | string | |
canonical | string | |
noindex | boolean | |
nofollow | boolean |
Categories, tags & terms#
6 tools, 6 on by default.
list_taxonomies#
List taxonomies · read · on by default
Categories, tags and custom taxonomies for the post types you manage, with whether each is hierarchical.
| Parameter | Type | Notes |
|---|---|---|
post_type | string |
get_terms#
List terms · read · on by default
Terms of a taxonomy (default category) with ID, name, slug, parent and post count.
| Parameter | Type | Notes |
|---|---|---|
taxonomy | string | |
search | string | |
parent | integer | |
limit | integer | Default 50, max 200. |
create_term#
Create a term · write · on by default
Creates a category, tag or custom taxonomy term.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
taxonomy | string | |
slug | string | |
description | string | |
parent_id | integer |
update_term#
Edit a term · write · on by default
Renames, re-slugs, re-describes or re-parents a term. SEO fields are separate, use set_term_seo.
| Parameter | Type | Notes |
|---|---|---|
term_id | integer | required. |
taxonomy | string | |
name | string | |
slug | string | |
description | string | |
parent_id | integer |
delete_term#
Delete a term · guarded · on by default
Permanently deletes a term. Posts keep existing but lose that term. Needs confirm true.
| Parameter | Type | Notes |
|---|---|---|
term_id | integer | required. |
taxonomy | string | |
confirm | boolean | required. |
set_post_terms#
Set a post's terms · write · on by default
Sets (or with append true, adds to) a post's terms in one taxonomy. Terms can be IDs or names, missing names are created.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
taxonomy | string | required. |
terms | array | required. |
append | boolean |
Media#
8 tools, 8 on by default.
list_media#
List media · read · on by default
Browse the media library. Filter by search text, mime type (e.g. image) or unattached only.
| Parameter | Type | Notes |
|---|---|---|
search | string | |
mime_type | string | e.g. image, image/png, video, application/pdf |
unattached | boolean | |
limit | integer | Default 20, max 100. |
page | integer |
get_media#
Get a media item · read · on by default
Details of one media item: URL, sizes, mime type, alt text, caption, description and where it is attached.
| Parameter | Type | Notes |
|---|---|---|
attachment_id | integer | required. |
upload_media#
Upload media · write · on by default
Adds a file to the media library from a URL (downloaded for you) or from base64 data. Optionally sets title, alt text, caption, description, attaches it to a post, and sets it as that post's featured image.
| Parameter | Type | Notes |
|---|---|---|
url | string | |
base64 | string | |
filename | string | Required with base64, e.g. photo.jpg |
title | string | |
alt | string | |
caption | string | |
description | string | |
post_id | integer | |
set_as_featured | boolean |
update_media#
Edit a media item · write · on by default
Changes a media item's title, alt text, caption or description.
| Parameter | Type | Notes |
|---|---|---|
attachment_id | integer | required. |
title | string | |
alt | string | |
caption | string | |
description | string |
set_featured_image#
Set featured image · write · on by default
Sets a post's featured image from a media ID or an image URL (downloaded for you), or removes it with remove true.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
attachment_id | integer | |
url | string | |
alt | string | |
remove | boolean |
delete_media#
Delete media · guarded · on by default
Permanently deletes a media item and its files. Needs confirm true and permanent deletion enabled in settings.
| Parameter | Type | Notes |
|---|---|---|
attachment_id | integer | required. |
confirm | boolean | required. |
find_images_missing_alt#
Find images missing alt text · read · on by default
Lists images with no alt text, either inside one post's body (pass post_id) or across the media library.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | |
limit | integer |
fix_image_alt_text#
Fix image alt text · write · on by default
Sets alt text. Pass attachment_id with alt to write a specific description, or without alt to derive one from the parent post title. Pass post_id to fill every empty alt inside that post's body from the post title. Never overwrites existing alt text.
| Parameter | Type | Notes |
|---|---|---|
attachment_id | integer | |
post_id | integer | |
alt | string |
Links#
5 tools, 5 on by default.
get_post_links#
List links in a post · read · on by default
Every link in a post body, in order, each with a link_index for replace_link and remove_link. Call right before editing links.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
replace_link#
Replace a link · write · on by default
Changes an existing link's URL, anchor text and/or rel (e.g. nofollow sponsored). Pass expected_anchor_text from get_post_links as a safety check.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
link_index | integer | required. |
new_href | string | |
new_anchor_text | string | |
new_rel | string | |
expected_anchor_text | string |
remove_link#
Remove a link · write · on by default
Unlinks text and keeps the words (default). keep_text false plus confirm_delete_text true also deletes the words.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
link_index | integer | required. |
keep_text | boolean | |
confirm_delete_text | boolean | |
expected_anchor_text | string |
suggest_internal_links#
Suggest internal links · read · on by default
Finds natural sentences in other content that could link to a target post, matched on its focus keyword and title. Returns the exact sentence apply_internal_link needs.
| Parameter | Type | Notes |
|---|---|---|
target_post_id | integer | required. |
source_post_id | integer | |
limit | integer | Default 5, max 20. |
apply_internal_link#
Insert an internal link · write · on by default
Wraps an exact phrase of existing plain text in a source post with a link to a target post or URL.
| Parameter | Type | Notes |
|---|---|---|
source_post_id | integer | required. |
anchor_text | string | required. |
target_post_id | integer | |
target_url | string |
Custom fields#
3 tools, 3 on by default.
get_post_meta#
Get custom fields · read · on by default
A post's custom fields (keys not starting with an underscore). Pass key for one field.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
key | string |
set_post_meta#
Set a custom field · write · on by default
Creates or updates a custom field (uses ACF when present). Value can be text, number, boolean, array or object.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
key | string | required. |
value | any | required. Any JSON value. |
delete_post_meta#
Delete a custom field · guarded · on by default
Deletes a custom field from a post.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
key | string | required. |
Site-wide search & replace#
2 tools, 2 on by default.
search_content#
Search all content · read · on by default
Finds an exact string (or regex) inside post bodies across the managed post types and returns each match with a snippet and count.
| Parameter | Type | Notes |
|---|---|---|
query | string | required. |
regex | boolean | |
post_type | any | Type or array of types. |
status | string | Default publish. |
limit | integer | Default 20, max 100. |
replace_in_content#
Find and replace across the site · write · on by default
Replaces a string (or regex) inside post bodies across many posts. dry_run defaults to TRUE so you see exactly what would change first; set dry_run false to apply. Capped by the bulk limit.
| Parameter | Type | Notes |
|---|---|---|
find | string | required. |
replace | string | required. |
regex | boolean | |
post_type | any | Type or array of types. |
status | string | Default publish. |
dry_run | boolean | Default true. |
limit | integer |
Instruction playbooks#
6 tools, 6 on by default.
list_instructions#
List instruction playbooks · read · on by default
Markdown playbooks saved on this site (style guides, standing instructions, publishing checklists), with whether each is pinned. Pinned playbooks are already part of your instructions.
No parameters.
get_instruction#
Read a playbook · read · on by default
Full Markdown of one playbook.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
save_instruction#
Save a playbook · write · on by default
Creates or overwrites a Markdown playbook. Optional front matter at the top (between --- lines) sets defaults for new content: default_status, default_post_type, default_author, default_category, default_tags, default_featured_image (media ID or URL), featured_image (none, optional, required), content_format (html, markdown), alt_text (from_title). Pin it so every future session follows it automatically.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
content | string | required. |
pinned | boolean |
append_instruction#
Append to a playbook · write · on by default
Adds text to the end of a playbook (creating it if needed), for recording new standing rules without rewriting the file.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
text | string | required. |
pin_instruction#
Pin or unpin a playbook · write · on by default
Pinned playbooks are injected into the AI's instructions on every connection and their front-matter defaults apply to new content.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
pinned | boolean | required. |
delete_instruction#
Delete a playbook · guarded · on by default
Permanently deletes a playbook. There is no trash.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
Comments#
3 tools, 3 on by default.
list_comments#
List comments · read · on by default · requires moderate_comments
Comments with author, content, status and the post they belong to. Filter by status (hold, approve, spam, trash), post or search text.
| Parameter | Type | Notes |
|---|---|---|
status | string | |
post_id | integer | |
search | string | |
limit | integer |
set_comment_status#
Moderate a comment · write · on by default · requires moderate_comments
Approves, unapproves, marks as spam, trashes or restores a comment.
| Parameter | Type | Notes |
|---|---|---|
comment_id | integer | required. |
status | string: approve | hold | spam | trash | required. |
reply_to_comment#
Reply to a comment · write · on by default · requires moderate_comments
Posts a reply to a comment as the connected user.
| Parameter | Type | Notes |
|---|---|---|
comment_id | integer | required. |
content | string | required. |
Menus#
6 tools, 6 on by default.
list_menus#
List menus · read · on by default · requires edit_theme_options
Navigation menus, their item counts, and which theme locations they are assigned to.
No parameters.
get_menu_items#
Get menu items · read · on by default · requires edit_theme_options
Items of one menu (ID, name or slug) with parent, order and target.
| Parameter | Type | Notes |
|---|---|---|
menu | string or integer | required. |
create_menu#
Create a menu · write · on by default · requires edit_theme_options
Creates a navigation menu, optionally assigning it to a theme location.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
location | string |
add_menu_item#
Add a menu item · write · on by default · requires edit_theme_options
Adds an item to a menu: a custom link (url), or a post/page (post_id), or a term (term_id and taxonomy).
| Parameter | Type | Notes |
|---|---|---|
menu | string or integer | required. |
title | string | |
url | string | |
post_id | integer | |
term_id | integer | |
taxonomy | string | |
parent_item_id | integer | |
position | integer |
remove_menu_item#
Remove a menu item · guarded · on by default · requires edit_theme_options
Removes one item from a menu.
| Parameter | Type | Notes |
|---|---|---|
item_id | integer | required. |
set_menu_location#
Assign a menu to a location · write · on by default · requires edit_theme_options
Assigns a menu to a theme location (see list_menus for location names).
| Parameter | Type | Notes |
|---|---|---|
menu | string or integer | required. |
location | string | required. |
Users#
4 tools, 0 on by default.
list_users#
List users · read · off by default (high impact) · requires list_users
Users with ID, login, display name, email, roles and registration date.
| Parameter | Type | Notes |
|---|---|---|
role | string | |
search | string | |
limit | integer |
create_user#
Create a user · write · off by default (high impact) · requires create_users
Creates a user and emails them a password-setup link. Creating an administrator needs confirm_admin true.
| Parameter | Type | Notes |
|---|---|---|
login | string | required. |
email | string | required. |
role | string | |
display_name | string | |
confirm_admin | boolean |
set_user_role#
Change a user role · write · off by default (high impact) · requires promote_users
Changes a user's role. Granting administrator needs confirm_admin true. You cannot change your own role.
| Parameter | Type | Notes |
|---|---|---|
user_id | integer | required. |
role | string | required. |
confirm_admin | boolean |
send_password_reset#
Send a password reset · write · off by default (high impact) · requires edit_users
Emails a user a password reset link. Passwords are never set directly.
| Parameter | Type | Notes |
|---|---|---|
user_id | integer | required. |
Plugins#
9 tools, 3 on by default.
list_plugins#
List plugins · read · on by default · requires activate_plugins
Every installed plugin with name, version, active state, whether an update is available, auto-update state and whether WordPress has paused it because of an error.
| Parameter | Type | Notes |
|---|---|---|
status | string: all | active | inactive | update_available | paused |
search_plugin_directory#
Search the WordPress.org plugin directory · read · on by default · requires install_plugins
Searches WordPress.org for plugins to install. Returns slug, name, version, rating, active installs and a short description.
| Parameter | Type | Notes |
|---|---|---|
query | string | required. |
limit | integer | Default 10, max 30. |
install_plugin#
Install a plugin · write · off by default (high impact) · requires install_plugins
Installs a plugin from the WordPress.org directory (slug) or from a https zip URL. Optionally activates it, with an automatic safety check that deactivates it again if the site breaks.
| Parameter | Type | Notes |
|---|---|---|
slug | string | WordPress.org slug, e.g. woocommerce. |
url | string | https URL of a plugin zip. |
activate | boolean |
activate_plugin#
Activate a plugin · write · off by default (high impact) · requires activate_plugins
Activates an installed plugin. A loopback check runs afterwards and the plugin is deactivated again automatically if the site starts returning errors.
| Parameter | Type | Notes |
|---|---|---|
plugin | string | required. Plugin file (dir/file.php) or folder slug. |
deactivate_plugin#
Deactivate a plugin · write · off by default (high impact) · requires activate_plugins
Deactivates a plugin without deleting it. Use this first when a plugin is suspected of causing an error.
| Parameter | Type | Notes |
|---|---|---|
plugin | string | required. |
update_plugin#
Update plugins · write · off by default (high impact) · requires update_plugins
Updates one plugin, or every plugin with an update when plugin is "all".
| Parameter | Type | Notes |
|---|---|---|
plugin | string | required. Plugin file, folder slug, or "all". |
delete_plugin#
Delete a plugin · guarded · off by default (high impact) · requires delete_plugins
Permanently deletes an INACTIVE plugin and its files. Needs confirm true and permanent deletion enabled in settings.
| Parameter | Type | Notes |
|---|---|---|
plugin | string | required. |
confirm | boolean | required. |
set_auto_updates#
Set automatic updates · write · off by default (high impact) · requires update_plugins
Turns automatic background updates on or off for plugins or themes.
| Parameter | Type | Notes |
|---|---|---|
type | string: plugin | theme | required. |
items | array | required. Plugin files or theme folders. |
enabled | boolean | required. |
check_updates#
Check for updates · read · on by default · requires update_plugins
Refreshes and lists available updates for WordPress core, plugins and themes.
No parameters.
Themes#
5 tools, 1 on by default.
list_themes#
List themes · read · on by default · requires switch_themes
Every installed theme with version, which is active, parent theme, and update availability.
No parameters.
install_theme#
Install a theme · write · off by default (high impact) · requires install_themes
Installs a theme from WordPress.org (slug) or a https zip URL.
| Parameter | Type | Notes |
|---|---|---|
slug | string | |
url | string | |
activate | boolean |
activate_theme#
Activate a theme · write · off by default (high impact) · requires switch_themes
Switches the active theme. If the site breaks afterwards the previous theme is restored automatically.
| Parameter | Type | Notes |
|---|---|---|
theme | string | required. Theme folder name (stylesheet). |
update_theme#
Update themes · write · off by default (high impact) · requires update_themes
Updates one theme or all themes with an update ("all").
| Parameter | Type | Notes |
|---|---|---|
theme | string | required. |
delete_theme#
Delete a theme · guarded · off by default (high impact) · requires delete_themes
Permanently deletes an inactive theme. Needs confirm true and permanent deletion enabled in settings.
| Parameter | Type | Notes |
|---|---|---|
theme | string | required. |
confirm | boolean | required. |
Site & plugin settings#
8 tools, 4 on by default.
get_site_settings#
Get site settings · read · on by default · requires manage_options
Site name, tagline, logo, favicon (site icon), language, timezone, date and time format, front page, posts per page, permalinks, search engine visibility, comment and registration defaults.
No parameters.
update_site_settings#
Update site settings · write · off by default (high impact) · requires manage_options
Changes site-wide settings. Any subset of: site_title, tagline, timezone, date_format, time_format, start_of_week, language, posts_per_page, show_on_front (posts|page), front_page (page ID or slug), posts_page (ID or slug), search_engine_visibility (visible|hidden), permalink_structure, default_category, default_comment_status (open|closed), comment_moderation (bool), users_can_register (bool), default_role. Logo: logo_id or logo_url, remove_logo. Favicon: favicon_id or favicon_url, remove_favicon. The site URL and admin email are deliberately not changeable here.
| Parameter | Type | Notes |
|---|---|---|
site_title | string | |
tagline | string | |
timezone | string | e.g. Africa/Lagos |
date_format | string | |
time_format | string | |
start_of_week | integer | 0 Sunday to 6 Saturday |
language | string | Locale such as en_US |
posts_per_page | integer | |
show_on_front | string: posts | page | |
front_page | string or integer | |
posts_page | string or integer | |
search_engine_visibility | string: visible | hidden | |
permalink_structure | string | e.g. /%postname%/ |
default_category | string or integer | |
default_comment_status | string: open | closed | |
comment_moderation | boolean | |
users_can_register | boolean | |
default_role | string | |
logo_id | integer | |
logo_url | string | |
remove_logo | boolean | |
favicon_id | integer | |
favicon_url | string | Square image, 512x512 or larger is best. |
remove_favicon | boolean |
list_options#
List options · read · on by default · requires manage_options
Searches the wp_options table by name, so you can find the settings key of ANY plugin or theme (for example search "woocommerce" or "yoast"). Returns names and sizes only.
| Parameter | Type | Notes |
|---|---|---|
search | string | Part of the option name. |
limit | integer | Default 50, max 200. |
get_option_value#
Read an option · read · on by default · requires manage_options
Reads any option by exact name, which is how plugin and theme settings are stored. Values that look like secrets (keys, tokens, passwords) are masked unless reveal is true.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
reveal | boolean |
update_option_value#
Write an option · write · off by default (high impact) · requires manage_options
Writes a plugin or theme setting. Value can be text, number, boolean, array or object. With merge true an object is merged into the existing array option instead of replacing it. Site URL, active plugins, user roles and HelperMCP's own settings are protected.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
value | any | required. Any JSON value. |
merge | boolean |
delete_option_value#
Delete an option · guarded · off by default (high impact) · requires manage_options
Deletes an option. Protected options cannot be deleted.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
confirm | boolean | required. |
get_theme_mods#
Get theme settings · read · on by default · requires edit_theme_options
Customizer and theme settings (theme mods) of the active theme, or of another theme by folder name.
| Parameter | Type | Notes |
|---|---|---|
theme | string |
set_theme_mod#
Set a theme setting · write · off by default (high impact) · requires edit_theme_options
Sets one Customizer/theme setting. Use get_theme_mods first to see the keys.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
value | any | required. Any JSON value. |
theme | string |
Maintenance & cache#
4 tools, 3 on by default.
clear_cache#
Clear caches · write · on by default · requires manage_options
Flushes the object cache and expired transients and asks every common caching plugin (WP Rocket, LiteSpeed, W3 Total Cache, WP Super Cache, Autoptimize, WP Fastest Cache, SG Optimizer, Cloudflare) to purge itself.
No parameters.
flush_rewrite_rules#
Flush permalinks · write · on by default · requires manage_options
Regenerates rewrite rules. Fixes 404 errors on custom post types after a plugin change.
No parameters.
list_cron_events#
List scheduled tasks · read · on by default · requires manage_options
WP-Cron events with hook, next run time and recurrence. Helps spot stuck or missing jobs.
| Parameter | Type | Notes |
|---|---|---|
limit | integer |
run_cron_hook#
Run a scheduled task now · write · off by default (high impact) · requires manage_options
Runs a hook that is already scheduled in WP-Cron immediately, once.
| Parameter | Type | Notes |
|---|---|---|
hook | string | required. |
Diagnostics & error finder#
3 tools, 3 on by default.
diagnose_errors#
Find and explain PHP errors · read · on by default · requires manage_options
THE tool to start with when something is broken. Reads the WordPress debug log and WordPress's own list of paused plugins/themes, groups the errors, and for each one reports the type, message, the exact file and line, whether it belongs to a plugin, theme or core (and which), the surrounding source code, a plain-language likely cause and a suggested fix. If the debug log is missing it says how to switch it on. Follow up with read_file and patch_file to apply the fix.
| Parameter | Type | Notes |
|---|---|---|
limit | integer | Max distinct errors, default 15. |
include_notices | boolean | Also include notices and deprecations. Default false (fatal errors and warnings only). |
get_debug_log#
Read the debug log · read · on by default · requires manage_options
The tail of the WordPress debug log (wp-content/debug.log or the configured path), optionally filtered by a search string.
| Parameter | Type | Notes |
|---|---|---|
lines | integer | Default 80, max 400. |
search | string |
get_site_health#
Site health report · read · on by default · requires manage_options
PHP and WordPress versions, memory limit, key PHP extensions, debug constants, database version, writable folders, HTTPS, cron state, active theme and plugin counts, paused plugins and pending updates. Quick overview before troubleshooting.
No parameters.
Plugin & theme files (developer)#
8 tools, 0 on by default.
list_files#
List files · read · off by default (high impact) · requires manage_options
Lists files and folders inside a plugin, theme or the site (read-only).
| Parameter | Type | Notes |
|---|---|---|
root | string | required. Where to look: plugin:<folder> (e.g. plugin:woocommerce), theme:<folder>, mu-plugin, or site (read-only, whole WordPress install for reading core files). |
path | string | Sub-folder, default the root. |
depth | integer | Default 2, max 4. |
read_file#
Read a file · read · off by default (high impact) · requires manage_options
Reads a source file with line numbers. Use start_line and end_line to read just the part an error points at.
| Parameter | Type | Notes |
|---|---|---|
root | string | required. Where to look: plugin:<folder> (e.g. plugin:woocommerce), theme:<folder>, mu-plugin, or site (read-only, whole WordPress install for reading core files). |
path | string | required. |
start_line | integer | |
end_line | integer |
search_files#
Search inside files · read · off by default (high impact) · requires manage_options
Searches file contents in a plugin, theme or the site for a string or regex, returning file, line and text. Use it to find where a function, hook or option is defined or used.
| Parameter | Type | Notes |
|---|---|---|
root | string | required. Where to look: plugin:<folder> (e.g. plugin:woocommerce), theme:<folder>, mu-plugin, or site (read-only, whole WordPress install for reading core files). |
query | string | required. |
regex | boolean | |
extensions | array | e.g. ["php","js"]. Default php. |
include_vendor | boolean | |
limit | integer |
lint_file#
Check PHP syntax · read · off by default (high impact) · requires manage_options
Checks a PHP file for syntax errors and reports the line.
| Parameter | Type | Notes |
|---|---|---|
root | string | required. Where to look: plugin:<folder> (e.g. plugin:woocommerce), theme:<folder>, mu-plugin, or site (read-only, whole WordPress install for reading core files). |
path | string | required. |
patch_file#
Fix a file (find and replace) · write · off by default (high impact) · requires edit_plugins
Edits a plugin or theme file with exact find/replace edits, the safest way to apply a fix. PHP is syntax-checked first, the original is backed up, and the change is rolled back automatically if the site breaks. Use dry_run to preview. A find that matches more than once is refused unless all is true.
| Parameter | Type | Notes |
|---|---|---|
root | string | required. Where to look: plugin:<folder> (e.g. plugin:woocommerce), theme:<folder>, mu-plugin, or site (read-only, whole WordPress install for reading core files). |
path | string | required. |
edits | array | required. |
dry_run | boolean |
write_file#
Write or create a file · write · off by default (high impact) · requires edit_plugins
Replaces a file's full contents or creates a new one in a plugin or theme. Same protections as patch_file: syntax check, backup, automatic rollback. Prefer patch_file for fixes.
| Parameter | Type | Notes |
|---|---|---|
root | string | required. Where to look: plugin:<folder> (e.g. plugin:woocommerce), theme:<folder>, mu-plugin, or site (read-only, whole WordPress install for reading core files). |
path | string | required. |
content | string | required. |
create | boolean | Required true to create a file that does not exist yet. |
list_backups#
List file backups · read · off by default (high impact) · requires manage_options
Backups HelperMCP made before changing files, newest first.
| Parameter | Type | Notes |
|---|---|---|
limit | integer |
restore_backup#
Restore a file backup · write · off by default (high impact) · requires edit_plugins
Puts a file back exactly as it was before a change.
| Parameter | Type | Notes |
|---|---|---|
backup_id | string | required. |
REST API bridge (any plugin)#
2 tools, 0 on by default.
list_rest_routes#
Discover REST API routes · read · off by default (high impact) · requires edit_posts
Lists REST API routes registered by WordPress and by every active plugin (WooCommerce, ACF, forms, LMS, anything). Search by text or namespace to find the endpoint for a plugin, then call it with rest_request.
| Parameter | Type | Notes |
|---|---|---|
search | string | |
namespace | string | |
limit | integer |
rest_request#
Call any REST API route · write · off by default (high impact) · requires edit_posts
Calls any WordPress REST API route internally AS THE CONNECTED USER, so it works with every plugin that has a REST API, and always respects that plugin's own permission checks. For GET pass params as the query. For POST/PUT/PATCH/DELETE pass body fields in body.
| Parameter | Type | Notes |
|---|---|---|
method | string: GET | POST | PUT | PATCH | DELETE | required. |
route | string | required. e.g. /wc/v3/products or /wp/v2/posts/12 |
params | object | |
body | object |
Database (read-only)#
2 tools, 0 on by default.
list_db_tables#
List database tables · read · off by default (high impact) · requires manage_options
Tables in the WordPress database with row counts and size. Includes tables created by any plugin.
| Parameter | Type | Notes |
|---|---|---|
search | string |
db_query#
Run a read-only SQL query · read · off by default (high impact) · requires manage_options
Runs ONE read-only query (SELECT, SHOW, DESCRIBE, EXPLAIN). Use {prefix} for the table prefix, e.g. SELECT * FROM {prefix}posts WHERE post_status = 'draft'. Capped at 200 rows. Password hashes, session tokens and HelperMCP tokens cannot be queried.
| Parameter | Type | Notes |
|---|---|---|
sql | string | required. |
limit | integer | Max rows, default 50, max 200. |
Control: approvals & restore points#
6 tools, 6 on by default.
check_approval#
Check an approval request · read · on by default · requires edit_posts
When a tool answers "approval_required", the site owner must approve it in wp-admin. Call this with the approval_id to see whether it is pending, approved (with the tool's result), denied, expired or failed. Do not retry the original call, wait for the answer.
| Parameter | Type | Notes |
|---|---|---|
approval_id | integer | required. |
list_approvals#
List my approval requests · read · on by default · requires edit_posts
Your own recent approval requests and their status.
| Parameter | Type | Notes |
|---|---|---|
status | string: pending | approved | denied | expired | failed |
create_restore_point#
Create a restore point · write · on by default · requires edit_posts
Saves the CURRENT state of the listed posts and/or options so you can roll back after a risky change. Restore points are also taken automatically before bulk updates, site-wide replace and settings changes.
| Parameter | Type | Notes |
|---|---|---|
label | string | required. |
post_ids | array | |
options | array | Option names (a plugin's settings, for example). |
list_restore_points#
List restore points · read · on by default · requires edit_posts
Recent restore points with what they cover, newest first.
| Parameter | Type | Notes |
|---|---|---|
limit | integer |
restore_restore_point#
Roll back to a restore point · write · on by default · requires edit_posts
Puts the posts and options in a restore point back exactly as they were (content, title, status, terms, SEO fields, featured image, options). Needs confirm true.
| Parameter | Type | Notes |
|---|---|---|
restore_point_id | integer | required. |
confirm | boolean | required. |
delete_restore_point#
Delete a restore point · guarded · on by default · requires manage_options
Deletes a restore point permanently.
| Parameter | Type | Notes |
|---|---|---|
restore_point_id | integer | required. |
Security scan#
6 tools, 4 on by default.
security_scan#
Security scan · read · on by default · requires manage_options
Reviews the site for security problems and returns prioritised findings with fix hints. Checks (all except recent_changes by default, ask for that one explicitly): core_integrity (official checksums), uploads_php (PHP files in uploads), suspicious_code (backdoor and obfuscation patterns in plugins, themes, uploads), recent_changes (PHP files changed lately), users (administrator accounts), config (debug exposure, XML-RPC, file editor, permissions, PHP/WordPress versions), plugins (abandoned or outdated plugins). Findings are indicators to review, not proof of infection.
| Parameter | Type | Notes |
|---|---|---|
checks | array | |
days | integer | |
max_files | integer |
verify_core_files#
Verify WordPress core files · read · on by default · requires manage_options
Compares wp-admin and wp-includes against the official WordPress.org checksums for this version and lists modified, missing and unexpected files. Needs outbound access to api.wordpress.org.
No parameters.
verify_plugin_files#
Verify a plugin's files · read · on by default · requires manage_options
Compares an installed WordPress.org plugin with the official checksums for its exact version and lists modified, missing and added files. Does not work for premium or custom plugins.
| Parameter | Type | Notes |
|---|---|---|
plugin | string | required. |
quarantine_file#
Quarantine a suspicious file · write · off by default (high impact) · requires manage_options
Moves a file out of wp-content into a protected quarantine folder (reversible with restore_quarantined). Only files under wp-content can be quarantined, never core files, wp-config or HelperMCP. Needs confirm true.
| Parameter | Type | Notes |
|---|---|---|
path | string | required. Path relative to wp-content, e.g. uploads/2026/03/shell.php |
confirm | boolean | required. |
list_quarantine#
List quarantined files · read · on by default · requires manage_options
Files HelperMCP has quarantined.
No parameters.
restore_quarantined#
Restore a quarantined file · write · off by default (high impact) · requires manage_options
Moves a quarantined file back to its original location.
| Parameter | Type | Notes |
|---|---|---|
quarantine_id | string | required. |
Performance#
4 tools, 2 on by default.
performance_audit#
Performance audit · read · on by default · requires manage_options
Finds what is slowing the site down from the inside: autoloaded options bloat (with the plugin that owns the biggest ones), expired transients, post revisions, auto-drafts, trash, spam, orphaned custom fields, biggest database tables, cache and PHP configuration, overdue scheduled tasks. Returns prioritised recommendations. Follow with cleanup_database and set_option_autoload to fix.
No parameters.
measure_page#
Measure a page · read · on by default · requires manage_options
Requests a page on this site and reports response time, HTML size, compression, caching headers, how many scripts, stylesheets and images it loads, render-blocking scripts in the head, images missing dimensions or lazy-loading, and the heaviest images. Defaults to the homepage. Only this site's own URLs are allowed.
| Parameter | Type | Notes |
|---|---|---|
url | string |
cleanup_database#
Clean up the database · write · off by default (high impact) · requires manage_options
Removes clutter. actions: expired_transients, revisions (keeps the newest keep_revisions per post), auto_drafts (older than 7 days), trashed_posts (older than older_than_days), spam_comments, trashed_comments, orphan_postmeta, oembed_cache, optimize_tables. dry_run defaults to TRUE and just counts. Applying needs dry_run false and permanent deletion enabled in HelperMCP settings. Take a backup first (create_db_backup).
| Parameter | Type | Notes |
|---|---|---|
actions | array | required. |
dry_run | boolean | |
keep_revisions | integer | |
older_than_days | integer |
set_option_autoload#
Change an option's autoload · write · off by default (high impact) · requires manage_options
Stops a large option from loading on every page request (autoload false) or turns it back on. The standard fix for autoload bloat found by performance_audit. Does not change the option's value.
| Parameter | Type | Notes |
|---|---|---|
name | string | required. |
autoload | boolean | required. |
Image optimisation#
5 tools, 2 on by default.
image_audit#
Audit the image library · read · on by default · requires upload_files
Scans the media library for heavy images (over 500 KB), oversized dimensions (wider than 2560 px), missing alt text and format mix, with an estimate of how much could be saved. Run before optimize_images.
| Parameter | Type | Notes |
|---|---|---|
limit | integer |
optimize_images#
Compress and resize images · write · off by default (high impact) · requires upload_files
Resizes images wider than max_width and re-compresses JPEG/PNG/WebP, keeping the original format and URLs. Originals are backed up (restore_image undoes it). dry_run defaults to TRUE and reports the savings without changing anything. Processes up to 25 images per call.
| Parameter | Type | Notes |
|---|---|---|
attachment_ids | array | |
limit | integer | |
max_width | integer | |
quality | integer | |
min_kb | integer | |
dry_run | boolean | |
keep_originals | boolean |
restore_image#
Restore an original image · write · off by default (high impact) · requires upload_files
Puts back the original file saved before optimize_images or convert_to_webp.
| Parameter | Type | Notes |
|---|---|---|
attachment_id | integer | required. |
convert_to_webp#
Convert an image to WebP · write · off by default (high impact) · requires upload_files
Converts one JPEG/PNG attachment to WebP (smaller files, same quality) and optionally rewrites its URLs inside post content and Elementor data so nothing breaks. A restore point of the affected posts is taken first, and the original file is kept in a backup. dry_run defaults to TRUE and lists the posts that would be edited.
| Parameter | Type | Notes |
|---|---|---|
attachment_id | integer | required. |
quality | integer | |
replace_urls | boolean | |
dry_run | boolean |
bulk_fix_alt_text#
Fill missing alt text in bulk · write · on by default · requires upload_files
Finds library images with no alt text and fills them from the title of the post they are attached to, or a cleaned-up file name. Never overwrites existing alt text. dry_run defaults to TRUE.
| Parameter | Type | Notes |
|---|---|---|
limit | integer | |
dry_run | boolean |
Redirects, 404s & broken links#
11 tools, 11 on by default.
list_redirects#
List redirects · read · on by default · requires edit_posts
Redirect rules with source, target, type, hit count and last hit.
| Parameter | Type | Notes |
|---|---|---|
search | string | |
limit | integer | |
page | integer |
create_redirect#
Create a redirect · write · on by default · requires manage_options
Creates a redirect rule. source is a path on this site such as /old-page (or a regex when regex is true, e.g. ^/blog/(\d+)/ with target /news/$1). target is a path or full URL. Refuses duplicates, self-redirects and obvious loops.
| Parameter | Type | Notes |
|---|---|---|
source | string | required. |
target | string | |
type | integer: 301 | 302 | 307 | 308 | 410 | 301 permanent (default), 302 temporary, 307/308 method-preserving, 410 gone (no target needed). |
regex | boolean | |
note | string |
update_redirect#
Edit a redirect · write · on by default · requires manage_options
Changes a redirect's target, type, active state or note.
| Parameter | Type | Notes |
|---|---|---|
id | integer | required. |
target | string | |
type | integer: 301 | 302 | 307 | 308 | 410 | 301 permanent (default), 302 temporary, 307/308 method-preserving, 410 gone (no target needed). |
active | boolean | |
note | string |
delete_redirect#
Delete a redirect · guarded · on by default · requires manage_options
Deletes a redirect rule. Needs confirm true.
| Parameter | Type | Notes |
|---|---|---|
id | integer | required. |
confirm | boolean | required. |
import_redirects#
Import redirects · write · on by default · requires manage_options
Imports many rules from CSV text, one per line: source,target[,type[,regex]]. dry_run defaults to TRUE and validates without saving. Up to 500 lines.
| Parameter | Type | Notes |
|---|---|---|
csv | string | required. |
dry_run | boolean |
test_redirect#
Test where a URL goes · read · on by default · requires edit_posts
Shows which rule matches a path and follows the chain to the final destination, flagging loops and long chains.
| Parameter | Type | Notes |
|---|---|---|
path | string | required. |
list_404s#
List 404 errors · read · on by default · requires edit_posts
URLs visitors and bots requested that do not exist, most frequent first, with last referrer and whether a redirect already exists.
| Parameter | Type | Notes |
|---|---|---|
min_hits | integer | |
limit | integer |
suggest_redirect#
Suggest where a 404 should go · read · on by default · requires edit_posts
Finds the best existing page for a missing URL by slug and title similarity (and WordPress's record of previous slugs). Returns candidates with confidence scores.
| Parameter | Type | Notes |
|---|---|---|
path | string | required. |
fix_404s#
Auto-fix 404s with redirects · write · on by default · requires manage_options
For the most-hit 404 URLs, creates a 301 to the best matching page when the match confidence is at least min_score (0 to 1, default 0.8). dry_run defaults to TRUE and lists what it would create.
| Parameter | Type | Notes |
|---|---|---|
paths | array | |
min_score | number | |
limit | integer | |
dry_run | boolean |
clear_404_log#
Clear the 404 log · guarded · on by default · requires manage_options
Empties the 404 log.
| Parameter | Type | Notes |
|---|---|---|
confirm | boolean | required. |
scan_broken_links#
Scan posts for broken links · read · on by default · requires edit_posts
Checks every link in the given posts (or the most recent published ones) and reports broken links (404/410/5xx/timeouts) and redirected links, each with its link_index so replace_link or remove_link can fix it. Checks up to 40 distinct URLs per call.
| Parameter | Type | Notes |
|---|---|---|
post_ids | array | |
limit | integer | |
check_external | boolean |
Schema, robots.txt & sitemap#
8 tools, 6 on by default.
get_post_schema#
Get a page's structured data · read · on by default · requires edit_posts
Shows every JSON-LD block a published page outputs (from the SEO plugin, theme and HelperMCP) with the schema types found, plus HelperMCP's own custom schema for the post. Use it to see what is missing or duplicated.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
set_custom_schema#
Add structured data to a post · write · on by default · requires edit_posts
Adds JSON-LD schema (FAQPage, Product, Recipe, Event, LocalBusiness, HowTo, VideoObject, Article and more) to a post. It is printed in the page head. replace true overwrites existing custom schema, otherwise nodes are added. Run validate_schema first. Avoid adding a type the SEO plugin already outputs, check get_post_schema.
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
schema | any | required. A schema.org node object (must have @type), an array of nodes, or an object with @graph. |
replace | boolean |
remove_custom_schema#
Remove custom structured data · write · on by default · requires edit_posts
Removes HelperMCP custom schema from a post (all of it, or just one @type).
| Parameter | Type | Notes |
|---|---|---|
post_id | integer | required. |
type | string |
validate_schema#
Validate structured data · read · on by default · requires edit_posts
Checks JSON-LD for required and recommended properties for common types (Article, FAQPage, Product, Recipe, Event, LocalBusiness, Organization, HowTo, VideoObject, BreadcrumbList, WebSite, Person, JobPosting, Review). Pass schema directly, or post_id to check what is saved. This is a quick local check, not Google's Rich Results Test.
| Parameter | Type | Notes |
|---|---|---|
schema | any | A schema.org node object (must have @type), an array of nodes, or an object with @graph. |
post_id | integer |
get_robots_txt#
Read robots.txt · read · on by default · requires manage_options
The robots.txt crawlers actually receive, and where it comes from (a physical file, WordPress's virtual file, or an SEO plugin), plus warnings.
No parameters.
set_robots_txt#
Write robots.txt · write · off by default (high impact) · requires manage_options
Sets robots.txt. If a physical robots.txt file exists it is backed up and overwritten, otherwise the content is stored and served as the virtual robots.txt (overriding SEO plugin editors). Blocks a rule that would disallow the entire site unless allow_block_all is true.
| Parameter | Type | Notes |
|---|---|---|
content | string | required. |
allow_block_all | boolean |
reset_robots_txt#
Reset robots.txt · write · off by default (high impact) · requires manage_options
Removes HelperMCP's stored robots.txt so WordPress or your SEO plugin serves its default again.
No parameters.
get_sitemap_info#
Inspect the XML sitemap · read · on by default · requires edit_posts
Finds the sitemap (WordPress core, Yoast, Rank Math, AIOSEO, SEOPress, others), lists the child sitemaps with URL counts, and checks that robots.txt points to it.
No parameters.
Block theme (templates & styles)#
8 tools, 5 on by default.
list_block_templates#
List block templates · read · on by default · requires edit_theme_options
Templates or template parts of the active block theme (home, single, page, archive, header, footer ...), showing whether each is the theme's original or has been customised.
| Parameter | Type | Notes |
|---|---|---|
type | string: wp_template | wp_template_part | wp_template (page layouts) or wp_template_part (header, footer...). Default wp_template. |
get_block_template#
Read a block template · read · on by default · requires edit_theme_options
The block markup of one template or template part. id is theme//slug as shown by list_block_templates.
| Parameter | Type | Notes |
|---|---|---|
id | string | required. |
type | string: wp_template | wp_template_part | wp_template (page layouts) or wp_template_part (header, footer...). Default wp_template. |
update_block_template#
Edit a block template · write · off by default (high impact) · requires edit_theme_options
Saves new block markup for a template or template part as a user customisation (the theme file is untouched). A restore point is taken first. Pass the COMPLETE markup. Reverse it with reset_block_template.
| Parameter | Type | Notes |
|---|---|---|
id | string | required. |
type | string: wp_template | wp_template_part | wp_template (page layouts) or wp_template_part (header, footer...). Default wp_template. |
content | string | required. |
title | string |
reset_block_template#
Reset a template to the theme default · guarded · off by default (high impact) · requires edit_theme_options
Deletes the user customisation so the theme's original template is used again. For custom templates that have no theme file this deletes the template. Needs confirm true.
| Parameter | Type | Notes |
|---|---|---|
id | string | required. |
type | string: wp_template | wp_template_part | wp_template (page layouts) or wp_template_part (header, footer...). Default wp_template. |
confirm | boolean | required. |
list_block_patterns#
List block patterns · read · on by default · requires edit_posts
Registered patterns (theme, core and plugin) and the site's own saved patterns/reusable blocks.
| Parameter | Type | Notes |
|---|---|---|
search | string | |
limit | integer |
create_block_pattern#
Create a block pattern · write · on by default · requires edit_theme_options
Saves a reusable pattern from block markup. sync true makes it a synced pattern (edits update everywhere), default false (a copy is inserted).
| Parameter | Type | Notes |
|---|---|---|
title | string | required. |
content | string | required. |
sync | boolean |
get_theme_json#
Read theme.json (merged) · read · on by default · requires edit_theme_options
The merged theme.json settings and styles in effect (core defaults, theme, and user global styles): colour palette, typography, spacing, layout. Pass path to read one section, e.g. settings.color.palette.
| Parameter | Type | Notes |
|---|---|---|
path | string |
update_global_styles#
Change global styles · write · off by default (high impact) · requires edit_theme_options
Merges a patch into the user's Global Styles (what the Site Editor > Styles screen changes): colours, fonts, spacing, layout, per-block styles. Example patch: {"settings":{"color":{"palette":{"custom":[...]}}},"styles":{"color":{"background":"#fff"}}}. A restore point is taken first. Invalid values are dropped by WordPress.
| Parameter | Type | Notes |
|---|---|---|
patch | object | required. |
Backups & core updates#
6 tools, 3 on by default.
get_backup_status#
Backup status · read · on by default · requires manage_options
Whether a recent database backup exists (HelperMCP's own), and which backup plugins are installed (UpdraftPlus, BackWPup, Duplicator, WPvivid, Solid Backups, Jetpack, All-in-One WP Migration, BlogVault).
No parameters.
create_db_backup#
Back up the database · write · on by default · requires manage_options
Exports every table with this site's prefix to a gzip SQL file in a protected folder (wp-content/uploads/helpermcp/dbbackups). Fast and safe, and required before update_core. Keeps the newest 5. Does not include files or media.
| Parameter | Type | Notes |
|---|---|---|
label | string |
list_db_backups#
List database backups · read · on by default · requires manage_options
Backups HelperMCP has made, with size and date, and how to restore them.
No parameters.
delete_db_backup#
Delete a database backup · guarded · off by default (high impact) · requires manage_options
Deletes one backup file permanently.
| Parameter | Type | Notes |
|---|---|---|
backup_id | string | required. |
confirm | boolean | required. |
run_backup_plugin#
Run the backup plugin · write · off by default (high impact) · requires manage_options
Starts a full backup (files and database) with the installed backup plugin. Currently supported: UpdraftPlus. For other plugins it reports what is installed so you can run it from wp-admin.
No parameters.
update_core#
Update WordPress core · write · off by default (high impact) · requires manage_options
Updates WordPress to the latest (or a given) version. Refuses unless a HelperMCP database backup from the last 24 hours exists, or backup_confirmed is true (you have a full backup elsewhere). Health-checks the site afterwards. WordPress finishes the database upgrade the next time wp-admin is opened.
| Parameter | Type | Notes |
|---|---|---|
version | string | |
confirm | boolean | required. |
backup_confirmed | boolean |
11. Writing addons#
An addon is any PHP code that registers extra tools with HelperMCP. A connected AI then sees and uses your tools exactly like the built-in ones, and the site owner can switch each one on or off.
You can ship an addon as:
- A normal WordPress plugin (recommended): installable, updatable, can depend on its own code.
- A drop-in file in
wp-content/helpermcp-addons/(my-addon.phpormy-addon/addon.php) for quick site-specific tools. Loaded when the setting Load addon files from the drop-in folder is on.
Addons run as PHP with full access, exactly like any plugin. Only install code you trust.
11.1 Minimal addon (plugin)#
<?php
/**
* Plugin Name: My HelperMCP Addon
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) exit;
add_action( 'helpermcp_register_addons', function () {
helpermcp_register_addon( [
'slug' => 'my-addon',
'name' => 'My Addon',
'version' => '1.0.0',
'author' => 'You',
'description' => 'Lets the AI manage widgets.',
// Optional text added to the AI's briefing when it connects:
'instructions' => 'Use widgets_list before widgets_update. Widget names are unique.',
] );
helpermcp_register_tool( [
'addon' => 'my-addon',
'name' => 'widgets_list',
'title' => 'List widgets',
'description' => 'Lists every widget with its ID, name and status.',
'mode' => 'read',
'capability' => 'edit_posts',
'properties' => [
'status' => [ 'type' => 'string', 'enum' => [ 'active', 'archived' ], 'description' => 'Filter by status.' ],
],
'required' => [],
'callback' => function ( array $args ) {
$widgets = my_addon_query_widgets( $args['status'] ?? 'active' );
return [ 'widgets' => $widgets, 'count' => count( $widgets ) ];
},
] );
} );That is all. The tool appears on HelperMCP > Tools (group Addons) and in the Addons tab.
11.2 Tool definition reference#
Pass an array to helpermcp_register_tool():
| Key | Required | Description |
|---|---|---|
name | yes | Unique name matching ^[a-z][a-z0-9_]{2,63}$. Prefix with your addon, e.g. widgets_list. A tool cannot reuse a built-in name; collisions are ignored. |
callback | yes | Any PHP callable. Receives one array $args. |
description | yes (practically) | What the tool does and when to use it. This is what the AI reads, so be specific, say what it returns, and mention prerequisites. |
title | no | Human-readable name for the Tools page. |
mode | no | read (default for read-only), write (default), or destructive. Sent to the client as MCP annotations (readOnlyHint, destructiveHint). |
properties | no | JSON Schema properties object describing the arguments. |
required | no | Array of required property names. |
capability | no | WordPress capability the calling user must have. Default edit_posts. Use manage_options for admin-level tools. Set '' to skip (not recommended). |
risky | no | true makes the tool off by default until the site owner enables it. Use for anything that changes configuration, spends money, or deletes data. |
addon | no | Your addon slug, used to count tools per addon. |
11.3 Callback rules#
- The callback runs as the token's WordPress user (
get_current_user_id()is set). Capability checks likecurrent_user_can( 'edit_post', $id )work as normal. Always check object-level capabilities for the specific item, not only the globalcapability. - Return an array (becomes the JSON result), or any scalar (wrapped as
{"result": ...}). - Return a
WP_Erroror throw an exception to report a failure. The message is shown to the AI withisError: true. Write messages the AI can act on: say what was wrong and what to do instead. - Validate and sanitize every argument. Treat all input as untrusted.
- Keep responses reasonably small (a few KB to tens of KB). Paginate large lists with
limitandpagearguments. - Do not rely on globals set during page rendering; this is a REST request.
11.4 Writing good schemas#
- Use JSON Schema types:
string,integer,number,boolean,array,object. - Add
descriptionto every property, include formats ("YYYY-MM-DD") and units. - Use
enumfor fixed choices. - Accept IDs and human-friendly values where it helps ("category ID or name").
- Name destructive confirmations explicitly (
confirm), as the built-in tools do.
'properties' => [
'order_id' => [ 'type' => 'integer', 'description' => 'WooCommerce order ID.' ],
'status' => [ 'type' => 'string', 'enum' => [ 'processing', 'completed', 'cancelled' ] ],
'note' => [ 'type' => 'string', 'description' => 'Optional private note added to the order.' ],
],
'required' => [ 'order_id', 'status' ],11.5 Full example: WooCommerce order addon#
<?php
/**
* Plugin Name: HelperMCP for Orders
* Version: 1.0.0
*/
if ( ! defined( 'ABSPATH' ) ) exit;
add_action( 'helpermcp_register_addons', function () {
if ( ! function_exists( 'wc_get_order' ) ) return; // WooCommerce not active
helpermcp_register_addon( [
'slug' => 'orders', 'name' => 'Orders', 'version' => '1.0.0',
'instructions' => 'Confirm with the person before changing an order status.',
] );
helpermcp_register_tool( [
'addon' => 'orders', 'name' => 'orders_recent', 'title' => 'Recent orders', 'mode' => 'read',
'description' => 'Lists the most recent WooCommerce orders with total, status and customer name.',
'capability' => 'edit_shop_orders',
'properties' => [ 'limit' => [ 'type' => 'integer', 'description' => 'Default 10, max 50.' ] ],
'callback' => function ( $a ) {
$orders = wc_get_orders( [ 'limit' => min( 50, max( 1, (int) ( $a['limit'] ?? 10 ) ) ), 'orderby' => 'date', 'order' => 'DESC' ] );
return [ 'orders' => array_map( fn( $o ) => [
'id' => $o->get_id(), 'status' => $o->get_status(), 'total' => $o->get_total(),
'customer' => trim( $o->get_billing_first_name() . ' ' . $o->get_billing_last_name() ),
'date' => $o->get_date_created() ? $o->get_date_created()->date( 'Y-m-d H:i' ) : null,
], $orders ) ];
},
] );
helpermcp_register_tool( [
'addon' => 'orders', 'name' => 'orders_set_status', 'title' => 'Change order status', 'mode' => 'write', 'risky' => true,
'description' => 'Changes a WooCommerce order status and optionally adds a private note.',
'capability' => 'edit_shop_orders',
'properties' => [
'order_id' => [ 'type' => 'integer' ],
'status' => [ 'type' => 'string', 'enum' => [ 'processing', 'completed', 'cancelled', 'on-hold' ] ],
'note' => [ 'type' => 'string' ],
],
'required' => [ 'order_id', 'status' ],
'callback' => function ( $a ) {
$order = wc_get_order( (int) $a['order_id'] );
if ( ! $order ) return new WP_Error( 'not_found', 'Order not found. Use orders_recent to find valid IDs.' );
if ( ! current_user_can( 'edit_shop_order', $order->get_id() ) ) return new WP_Error( 'forbidden', 'Your user cannot edit this order.' );
$order->update_status( sanitize_key( $a['status'] ), sanitize_text_field( $a['note'] ?? '' ) );
return [ 'order_id' => $order->get_id(), 'status' => $order->get_status(), 'message' => 'Order status updated.' ];
},
] );
} );You may not need an addon at all.
list_rest_routesandrest_requestalready let the AI call any plugin's REST API (WooCommerce's/wc/v3/orders, for example) as the connected user, andlist_options/get_option_valueread any plugin's settings. Write an addon when you want a tighter, safer, better-described interface than raw REST, or when the plugin has no REST API.
11.6 Drop-in addons#
Create wp-content/helpermcp-addons/ and add a PHP file. It is loaded early (on plugins_loaded), so register on the same helpermcp_register_addons action:
<?php
// wp-content/helpermcp-addons/site-tools.php
add_action( 'helpermcp_register_addons', function () {
helpermcp_register_addon( [ 'slug' => 'site-tools', 'name' => 'Site Tools' ] );
helpermcp_register_tool( [
'addon' => 'site-tools', 'name' => 'sitetools_ping', 'mode' => 'read',
'description' => 'Returns pong and the server time.',
'callback' => fn() => [ 'pong' => true, 'time' => current_time( 'mysql' ) ],
] );
} );Loaded files are listed on HelperMCP > Addons. A file with a fatal error is reported there; a syntax error in a drop-in will still break the request like any plugin, so test it first. Turn the folder loading off with the Addons tab toggle.
11.7 Registration timing#
- Register inside the
helpermcp_register_addonsaction. It fires once per request, the first time the tool list is built. - Alternatively add to the
helpermcp_register_toolsfilter, which receives and returns the array of tool definitions. - Tools registered after the list has been built in the current request are not included.
11.8 Naming, versioning and distribution#
- Prefix tool names with a short unique addon prefix (
orders_,acme_). - Never rename a published tool; the AI's saved prompts and playbooks may reference it. Add a new tool and deprecate the old one in its
description. - Put
risky => trueon anything that spends money, sends email, changes configuration or deletes data. - Document every tool's arguments in its schema, not in a readme: the schema is what the AI reads.
- Declare
Requires Plugins: helpermcpin your plugin header (WordPress 6.5+) or checkfunction_exists( 'helpermcp_register_tool' )before registering.
11.9 Testing your addon#
List tools:
curl -s https://SITE/wp-json/helpermcp/v1/mcp -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Call your tool:
curl -s https://SITE/wp-json/helpermcp/v1/mcp -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"widgets_list","arguments":{"status":"active"}}}'Checklist:
- The tool appears under HelperMCP > Tools > Addons and is on (or off if
risky). - A token for a user without your
capabilityis refused. - Bad arguments return a clear message, not a PHP notice.
- Large results are paginated.
- Nothing in the result leaks secrets (API keys, password hashes).
11.10 Addon security checklist#
- Set the narrowest
capabilitythat makes sense, then check object-level capabilities inside the callback. - Sanitize input, escape output, use
$wpdb->prepare(). - Never accept raw PHP, SQL or shell commands from arguments.
- Never write outside the directories your plugin owns.
- Mark destructive or costly tools
riskyand require aconfirmargument. - Do not store tokens or keys in tool results.
12. Hooks and filters reference#
| Hook | Type | Arguments | Purpose |
|---|---|---|---|
helpermcp_register_addons | action | none | Register addons and tools. Fires once per request when the tool list is built. |
helpermcp_register_tools | filter | array $tools | Add or modify tool definitions (same shape as helpermcp_register_tool). |
helpermcp_tool_args | filter | array $args, string $tool | Modify arguments before any tool runs. |
helpermcp_before_tool | action | string $tool, array $args | Runs just before a tool executes and after it is enabled and permitted. |
helpermcp_tool_result | filter | mixed $result, string $tool, array $args | Modify or annotate a tool's result. |
helpermcp_after_tool | action | string $tool, array $args, mixed $result | Runs after a successful tool call. |
helpermcp_agent_instructions | filter | string $text | Edit the briefing the AI receives when it connects. |
Functions:
| Function | Purpose |
|---|---|
helpermcp_register_addon( array $addon ) | Register addon metadata: slug, name, version, author, description, url, instructions. |
helpermcp_register_tool( array $tool ) | Queue a tool definition (section 11.2). |
Example: log every tool call to your own system:
add_action( 'helpermcp_after_tool', function ( $tool, $args, $result ) {
error_log( sprintf( 'HelperMCP %s by user %d', $tool, get_current_user_id() ) );
}, 10, 3 );13. MCP protocol reference#
- Endpoint:
POST /wp-json/helpermcp/v1/mcp(Streamable HTTP, single JSON response per request). - Protocol version:
2025-06-18. - Auth:
Authorization: Bearer <token>or?token=<token>. Every method exceptpingandnotifications/*requires a valid token, includinginitialize(its briefing contains your pinned playbooks). - Capabilities:
toolsandresources. GET and DELETE return 405 (no server-initiated stream).
Methods#
| Method | Notes |
|---|---|
initialize | Requires a token. Returns server info and the AI briefing in instructions: how to use HelperMCP, which tool groups are enabled, SEO plugin in use, pinned playbooks and addon notes. |
ping | Empty result. |
tools/list | Enabled tools only, with JSON Schema and MCP annotations (readOnlyHint, destructiveHint, idempotentHint). |
tools/call | params: { name, arguments }. Result is content: [{ type: "text", text: "<JSON>" }] with isError. |
resources/list, resources/read | Playbooks exposed as helpermcp://instructions/<name> (text/markdown). |
Errors#
| Code | Meaning |
|---|---|
-32700 | Request was not valid JSON-RPC. |
-32601 | Unknown method. |
-32000 | MCP access disabled, or GET/DELETE used. |
-32001 | Missing, invalid or revoked token. |
-32002 | The token's user can no longer create or edit content. |
Authentication failures also set the HTTP status: 401 invalid, missing, revoked or expired token (with a WWW-Authenticate header pointing at the OAuth metadata when OAuth is on), 403 IP not allowed or user no longer permitted, 429 rate limit reached (with Retry-After). Everything else answers 200.
Tool failures are returned as a normal result with isError: true and a plain-language message, so the AI can read it and recover.
14. Hardening checklist#
- Serve the site over HTTPS only.
- Use a dedicated WordPress user for the connection, with the lowest role that does the job (Editor for content work). Reserve Administrator tokens for site-management work.
- Leave Allow permanent deletion off unless needed.
- Leave the files, database, REST bridge, plugins, themes, users tools off until you need them, then turn them off again.
- Give each app the narrowest access level, set an expiry, and add an IP allowlist and rate limit where you can (section 8.1).
- Consider the approval gate on "High-impact" while you build trust (section 8.3).
- Prefer OAuth or the
Authorizationheader over?token=; query strings can appear in server logs. - Revoke tokens you are not using (Connect tab). Tokens are hashed at rest.
- Add
define( 'DISALLOW_FILE_EDIT', true );if you never want file editing through any route. - Block direct web access to
/wp-content/uploads/helpermcp/on Nginx. - Review Activity regularly.
- Keep backups. HelperMCP backs up files it edits and can export the database, but it is not a full backup solution. Copy database backups off the server.
15. FAQ#
Does this replace my SEO plugin? No. It writes through it. Without an SEO plugin, HelperMCP outputs basic tags itself.
Will it publish things by itself? Not unless you allow it. New content is a draft by default, and the AI is instructed to publish only when you ask.
Can it break my site? It can change what you let it. High-impact tools start off, file edits are syntax-checked and rolled back if the site errors, and plugin/theme switches are health-checked. Keep your own backups regardless.
Why can't it update itself? Changing the plugin that serves the connection mid-request is risky. Update HelperMCP from wp-admin.
It says a tool is switched off. Enable it under HelperMCP > Tools.
Install or update says it needs FTP credentials. Your server cannot write files directly as the web user, or DISALLOW_FILE_MODS is set. WordPress itself cannot install plugins there either.
The health check says it could not run. Your host blocks loopback requests. Tools still work, but check the site manually after risky changes.
Does it work with WooCommerce, Elementor, ACF and so on? Yes through rest_request (any plugin with a REST API), list_options (any plugin's settings), custom field tools (ACF aware) and diagnose_errors for any plugin's PHP errors. Write an addon for a dedicated interface.
What has been tested? Every tool group was exercised against a real WordPress install, including live HTTP checks for redirects, 404 logging, robots.txt, schema output, the OAuth flow, token scopes, rate limits and automatic rollback. Not verifiable in the test environment, so try them on staging first: anything that needs WordPress.org (plugin and theme install, directory search, core and plugin checksums, core updates), the UpdraftPlus trigger, All in One SEO writes, SQL backup structure export on your MySQL/MariaDB version, and OAuth with your specific connector.
What can I undo? Posts and options changed by bulk or settings tools (restore points), files edited through HelperMCP (file backups), quarantined files, optimised images (originals kept) and block template edits. You cannot undo permanent deletions, database clean-up or plugin deletions, which is why those need confirmation and a backup first.
Is the security scan a real malware scanner? No. It surfaces suspicious patterns and risky settings for review. It is a good first pass and a way to catch obvious backdoors, not a replacement for a dedicated security service.
OAuth connect fails at the discovery step. Your server or CDN is probably not passing /.well-known/ to WordPress, or permalinks are plain. Open https://YOUR-SITE/.well-known/oauth-authorization-server in a browser, you should see JSON.
Multisite? Not specifically tested. Network-level plugin and theme management is not provided.
16. Changelog#
1.2.5#
- Access control: token scopes (Content & SEO, Read-only, Custom), expiry, IP allowlist, rate limits.
- OAuth sign-in for connectors with PKCE, dynamic client registration and rotating refresh tokens.
- Approval gate for high-impact or all changes; restore points with automatic snapshots; Control tab.
- Security scan, core and plugin checksum verification, file quarantine.
- Performance audit, page measurement, database clean-up, autoload fixes.
- Image audit, compression, WebP conversion with URL rewriting, bulk alt text.
- Redirect engine, 404 log with auto-fix suggestions, broken-link scanner.
- Structured data (JSON-LD) tools, robots.txt and sitemap tools.
- Block theme tools: templates, patterns, theme.json, global styles.
- Database backups, UpdraftPlus trigger, backup-gated core updates.
1.2.4#
- Plugin and theme management: list, search directory, install, activate, deactivate, update, delete, auto-updates, with health check and automatic rollback.
- Site settings: name, tagline, logo, favicon, language, timezone, formats, front page, permalinks, visibility, comments, registration. Any plugin's options (masked secrets) and theme settings.
- Developer tools: error finder, debug log, site health, file read/search/lint/patch/write with backups and rollback, read-only database, REST bridge.
- Menus, comments, users, cache and cron tools.
- Per-tool and per-group on/off switches; high-impact tools default off.
- Addon API with drop-in loader and developer hooks.
1.2.3#
- First standalone release, extracted from HelperSEO: posts, pages, custom post types, media, taxonomies, links, custom fields, site-wide replace, SEO through any SEO plugin, Markdown playbooks, tokens, activity log.