wordpress-coreWordPress Core Abilities
Native WordPress management plus the analytics and SEO data tools: posts, pages, media, comments, taxonomies, options, users, site diagnostics, Search Console, GA4, and the third-party keyword and backlink providers.
activate_plugins 1switch_themes 2manage_options 61edit_theme_options 11moderate_comments 5manage_categories 8edit_pages 4edit_posts 18upload_files 6list_users 2read 20Available Tools (138)
wp_get_postsRead-onlyGet WordPress posts (supports custom post types)
Parameter Schema4 parameters
{
"type": "object",
"properties": {
"per_page": {
"type": "integer",
"description": "Number of posts (max 100)"
},
"search": {
"type": "string",
"description": "Search term"
},
"status": {
"type": "string",
"description": "Post status (publish, draft, etc)"
},
"post_type": {
"type": "string",
"description": "Post type slug (default: post). Use wp_get_post_types to discover available types"
}
}
}wp_get_postRead-onlyGet single post by ID (any post type)
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Post ID"
}
},
"required": [
"id"
]
}wp_create_postedit_postsCreate new post (supports custom post types). Combine status="future" with date to schedule. Excerpt may contain safe HTML (same allow-list as post content).
Parameter Schema9 parameters
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"content": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"publish",
"draft",
"future",
"pending",
"private"
]
},
"date": {
"type": "string",
"description": "ISO 8601 datetime in the site timezone (e.g. 2026-12-25T09:00:00). Combine with status=future to schedule. Past dates auto-publish with that timestamp."
},
"excerpt": {
"type": "string",
"description": "Optional excerpt. May contain safe HTML (same allow-list as post content)."
},
"categories": {
"type": "array",
"items": {
"type": "integer"
}
},
"post_type": {
"type": "string",
"description": "Post type slug (default: post)"
},
"featured_media": {
"type": "integer",
"description": "Attachment ID to set as featured image"
},
"post_author": {
"type": "integer",
"description": "User ID to assign as the post author. Defaults to the authenticated MCP user (admin). Use wp_get_users to discover available author IDs."
}
},
"required": [
"title",
"content"
]
}wp_update_postedit_postsUpdate existing post (any post type). Response includes saved_fields (actual stored values, read back from DB) so silent-drop / silent-modify by WordPress is surfaced rather than hidden. Pass date to reschedule or backdate.
Parameter Schema13 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "string"
},
"content": {
"type": "string"
},
"status": {
"type": "string"
},
"date": {
"type": "string",
"description": "ISO 8601 datetime in the site timezone (e.g. 2026-12-25T09:00:00). Combine with status=future to reschedule, or use alone to backdate."
},
"excerpt": {
"type": "string",
"description": "Optional excerpt. May contain safe HTML (same allow-list as post content)."
},
"featured_media": {
"type": "integer",
"description": "Attachment ID to set as featured image (pass 0 to remove)"
},
"post_author": {
"type": "integer",
"description": "User ID to reassign as the post author. Use wp_get_users to discover available author IDs."
},
"menu_order": {
"type": "integer",
"description": "Order among sibling posts/pages. Lower = earlier."
},
"post_parent": {
"type": "integer",
"description": "Parent post ID (0 = no parent). Useful for hierarchical CPTs. Throws if the ID does not exist."
},
"password": {
"type": "string",
"description": "Post password. Empty string removes protection."
},
"comment_status": {
"type": "string",
"enum": [
"open",
"closed"
],
"description": "Allow (open) or disallow (closed) new comments."
},
"ping_status": {
"type": "string",
"enum": [
"open",
"closed"
],
"description": "Allow (open) or disallow (closed) trackbacks / pingbacks."
}
},
"required": [
"id"
]
}wp_replace_in_postedit_postsFind/replace a literal string inside a post's content (any post type) without resending the full body. Use for surgical edits to large posts (page-builder content, embedded base64 payloads) where wp_update_post's full-content replacement is impractical. Case-sensitive literal match, no regex. All occurrences are replaced. Response includes occurrence count and read-after-write verification. Set dry_run=true to preview the match count without writing; set expected_count to abort unless exactly that many matches exist.
Parameter Schema5 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"find": {
"type": "string",
"minLength": 1,
"description": "Literal text to find in post_content (case-sensitive, no regex)."
},
"replace": {
"type": "string",
"description": "Literal replacement text. Empty string deletes the matched text."
},
"expected_count": {
"type": "integer",
"description": "Optional guard: abort without writing unless the number of occurrences equals this value."
},
"dry_run": {
"type": "boolean",
"description": "Report the occurrence count without writing. Default false."
}
},
"required": [
"id",
"find",
"replace"
]
}wp_get_post_typesRead-onlyGet all registered public post types (including custom post types)
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_delete_postDestructiveDelete post
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"force": {
"type": "boolean",
"description": "Skip trash and permanently delete"
}
},
"required": [
"id"
]
}wp_count_postsRead-onlyGet post counts by status
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"post_type": {
"type": "string",
"description": "Post type (post, page, etc)"
}
}
}wp_get_pagesRead-onlyList WordPress pages. Returns id, title, status, and URL for each. Filter by parent to walk the page hierarchy.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"per_page": {
"type": "integer",
"description": "Number of pages (default 10, max 100)"
},
"parent": {
"type": "integer",
"description": "Parent page ID. Returns only direct children of this page."
}
}
}wp_get_pageRead-onlyGet single page by ID
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Page ID"
}
},
"required": [
"id"
]
}wp_create_pageedit_pagesCreate new page. Combine status="future" with date to schedule. Excerpt (via wp_update_post_meta on _excerpt or via wp_create_post fallback) may contain safe HTML.
Parameter Schema5 parameters
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"content": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"publish",
"draft",
"future",
"pending",
"private"
]
},
"date": {
"type": "string",
"description": "ISO 8601 datetime in the site timezone (e.g. 2026-12-25T09:00:00). Combine with status=future to schedule."
},
"parent": {
"type": "integer",
"description": "Parent page ID"
}
},
"required": [
"title",
"content"
]
}wp_update_pageedit_pagesUpdate existing page. Response includes saved_fields (actual stored values, read back from DB) so silent-drop / silent-modify by WordPress is surfaced rather than hidden. Pass date to reschedule or backdate.
Parameter Schema10 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"title": {
"type": "string"
},
"content": {
"type": "string"
},
"status": {
"type": "string"
},
"date": {
"type": "string",
"description": "ISO 8601 datetime in the site timezone (e.g. 2026-12-25T09:00:00). Combine with status=future to reschedule, or use alone to backdate."
},
"excerpt": {
"type": "string",
"description": "Optional page excerpt. May contain safe HTML."
},
"post_author": {
"type": "integer",
"description": "User ID to reassign as page author."
},
"menu_order": {
"type": "integer",
"description": "Order among sibling pages. Lower = earlier in navigation."
},
"post_parent": {
"type": "integer",
"description": "Parent page ID (0 = top-level). Throws if the ID does not exist."
},
"password": {
"type": "string",
"description": "Page password. Empty string removes protection."
}
},
"required": [
"id"
]
}wp_replace_in_pageedit_pagesFind/replace a literal string inside a page's content without resending the full body. Page-typed variant of wp_replace_in_post, same semantics: case-sensitive literal match, all occurrences replaced, dry_run preview, expected_count guard, read-after-write verification.
Parameter Schema5 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"find": {
"type": "string",
"minLength": 1,
"description": "Literal text to find in the page content (case-sensitive, no regex)."
},
"replace": {
"type": "string",
"description": "Literal replacement text. Empty string deletes the matched text."
},
"expected_count": {
"type": "integer",
"description": "Optional guard: abort without writing unless the number of occurrences equals this value."
},
"dry_run": {
"type": "boolean",
"description": "Report the occurrence count without writing. Default false."
}
},
"required": [
"id",
"find",
"replace"
]
}wp_delete_pageDestructiveDelete page
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"force": {
"type": "boolean"
}
},
"required": [
"id"
]
}wp_get_mediaupload_filesList media library attachments, paginated. Returns {total, page, per_page, pages, returned, has_more, media[]}; each row has id, title, url, mime_type, date, and alt (also exposed as alt_text, same value, both keys present). Use has_more or total to know when to stop paging. Filter by mime_type to narrow to images / videos / audio / documents.
Parameter Schema3 parameters
{
"type": "object",
"properties": {
"per_page": {
"type": "integer",
"description": "Items per page (default 10, max 100)"
},
"page": {
"type": "integer",
"description": "Page number, 1-indexed. Default 1."
},
"mime_type": {
"type": "string",
"description": "Filter by mime type prefix or full type (image, video, audio, application/pdf)"
}
}
}wp_get_media_itemupload_filesGet single media item by ID
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"id": {
"type": "integer"
}
},
"required": [
"id"
]
}wp_upload_media_from_urlupload_filesDownload an image from a public HTTPS URL and add it to the WordPress media library. Use this when you have an image URL (Unsplash, Pexels, client asset, etc) that needs to become a library attachment, for example before setting it as a featured image. Returns the new attachment ID.
Parameter Schema5 parameters
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Public HTTPS URL of the image to download"
},
"filename": {
"type": "string",
"description": "Optional filename (with extension). Derived from URL if omitted."
},
"alt_text": {
"type": "string",
"description": "Alt text for accessibility and SEO"
},
"caption": {
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"url"
]
}wp_upload_mediaupload_filesUpload an image to the media library from base64-encoded bytes. Use this for AI-generated images or pasted screenshots where you have raw bytes rather than a URL. For images already hosted somewhere, prefer wp_upload_media_from_url.
Parameter Schema5 parameters
{
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "Filename with extension (e.g. hero.jpg)"
},
"content_base64": {
"type": "string",
"description": "Base64-encoded file bytes"
},
"alt_text": {
"type": "string"
},
"caption": {
"type": "string"
},
"title": {
"type": "string"
}
},
"required": [
"filename",
"content_base64"
]
}wp_set_featured_imageedit_postsSet or replace the featured image on a post or page. Accepts EITHER an existing media_id from wp_get_media, OR an image_url that will be downloaded into the library first. Pass media_id=0 to remove the featured image.
Parameter Schema4 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer",
"description": "Post or page ID"
},
"media_id": {
"type": "integer",
"description": "Existing attachment ID (use 0 to remove the featured image)"
},
"image_url": {
"type": "string",
"description": "Public HTTPS image URL to download and use instead of media_id"
},
"alt_text": {
"type": "string",
"description": "Alt text applied when image_url is provided"
}
},
"required": [
"post_id"
]
}wp_update_mediaedit_postsUpdate metadata on an existing media attachment: alt text, caption, title, description. Great for adding SEO-friendly alt text to images already in the library.
Parameter Schema5 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"alt_text": {
"type": "string"
},
"caption": {
"type": "string"
},
"title": {
"type": "string"
},
"description": {
"type": "string"
}
},
"required": [
"id"
]
}wp_process_imageupload_filesProcess an existing image attachment with WordPress's built-in image editor and save the result as a NEW attachment (the original is never modified or deleted). Supports resize (bounded to max width/height, aspect ratio preserved unless crop=true) and format conversion (webp, jpeg, png). Use to produce a web-optimized or correctly-sized copy of a library image without an external service or API key. Returns the new attachment id and url. Requires upload_files plus edit_post on the source attachment.
Parameter Schema8 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Source image attachment ID."
},
"max_width": {
"type": "integer",
"description": "Resize so width does not exceed this (px). Omit to keep width."
},
"max_height": {
"type": "integer",
"description": "Resize so height does not exceed this (px). Omit to keep height."
},
"crop": {
"type": "boolean",
"description": "When resizing with both dimensions, hard-crop to exactly max_width x max_height instead of fitting within. Default false (fit, preserve aspect ratio)."
},
"format": {
"type": "string",
"enum": [
"webp",
"jpeg",
"jpg",
"png"
],
"description": "Convert the output to this format. Omit to keep the source format."
},
"quality": {
"type": "integer",
"description": "Output quality 1-100 for lossy formats (webp/jpeg). Omit for WordPress default."
},
"title": {
"type": "string",
"description": "Title for the new attachment. Defaults to the source title with a suffix."
},
"alt_text": {
"type": "string",
"description": "Alt text for the new attachment. Defaults to the source alt text."
}
},
"required": [
"id"
]
}wp_delete_mediaDestructiveDelete media item
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"force": {
"type": "boolean"
}
},
"required": [
"id"
]
}wp_count_mediaupload_filesGet media counts by type
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_get_categoriesRead-onlyList blog categories (the `category` taxonomy). Returns id, name, slug, count, and parent for each. For custom taxonomies (product_cat, brand, etc.), use wp_get_terms instead.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"per_page": {
"type": "integer",
"description": "Number of categories (default 100, max 100)"
}
}
}wp_get_tagsRead-onlyList blog tags (the `post_tag` taxonomy). Returns id, name, slug, and count for each. For custom taxonomies, use wp_get_terms.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"per_page": {
"type": "integer",
"description": "Number of tags (default 100, max 100)"
}
}
}wp_create_termmanage_categoriesCreate a term in any registered taxonomy (category, post_tag, or any custom taxonomy). Description may contain inline HTML: WordPress permits <a>, <strong>, <em>, <blockquote>, <code>, <cite>, <abbr>, <acronym> in term descriptions; block-level tags (<p>, <h1>-<h6>, <ul>) are stripped by WP core. Use wp_get_taxonomies to discover available taxonomy slugs.
Parameter Schema5 parameters
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"taxonomy": {
"type": "string",
"description": "Taxonomy slug (e.g. category, post_tag, product_cat)"
},
"description": {
"type": "string",
"description": "Optional description. May contain inline HTML (<a>, <strong>, <em>, etc.); block-level tags are stripped by WP core."
},
"parent": {
"type": "integer",
"description": "Parent term ID (only applies to hierarchical taxonomies)"
},
"slug": {
"type": "string",
"description": "Optional URL-friendly slug. Auto-generated from name if omitted."
}
},
"required": [
"name",
"taxonomy"
]
}wp_update_termmanage_categoriesUpdate an existing term in any taxonomy. Use this to rename a tag/category, edit its description, or change its slug. Description may contain inline HTML (WP core strips block-level tags). Pair with wp_update_term_meta to edit SEO meta on tags (Yoast/Rank Math/AIOSEO store tag SEO data in wp_termmeta).
Parameter Schema6 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"taxonomy": {
"type": "string",
"description": "Taxonomy slug the term belongs to"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"description": {
"type": "string",
"description": "Optional description. May contain inline HTML."
},
"parent": {
"type": "integer",
"description": "Parent term ID (hierarchical taxonomies only)"
}
},
"required": [
"id",
"taxonomy"
]
}wp_delete_termDestructiveDelete a term from any registered taxonomy.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"taxonomy": {
"type": "string",
"description": "Taxonomy slug the term belongs to"
}
},
"required": [
"id",
"taxonomy"
]
}wp_add_post_termsedit_postsAdd or replace terms on a post in any taxonomy.
Parameter Schema3 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"terms": {
"type": "array",
"items": {
"type": "integer"
}
},
"taxonomy": {
"type": "string",
"description": "Taxonomy slug (e.g. category, post_tag, product_cat)"
}
},
"required": [
"post_id",
"terms",
"taxonomy"
]
}wp_get_termsedit_postsList terms in any registered taxonomy with paginated output. Returns id, name, slug, description, count, parent. Use to map term names to IDs before wp_add_post_terms, or to walk a taxonomy tree.
Parameter Schema6 parameters
{
"type": "object",
"properties": {
"taxonomy": {
"type": "string",
"description": "Taxonomy slug (e.g. category, post_tag, product_cat, any custom taxonomy)"
},
"search": {
"type": "string",
"description": "Optional name-substring filter (case-insensitive)."
},
"hide_empty": {
"type": "boolean",
"description": "Exclude terms with zero attached posts. Default false."
},
"parent": {
"type": "integer",
"description": "Return only children of this parent term ID (hierarchical taxonomies)."
},
"per_page": {
"type": "integer",
"description": "Results per page. Default 100, max 500."
},
"page": {
"type": "integer",
"description": "Page number, 1-indexed. Default 1."
}
},
"required": [
"taxonomy"
]
}wp_count_termsRead-onlyGet term counts in a taxonomy
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"taxonomy": {
"type": "string"
}
}
}wp_get_taxonomiesRead-onlyGet all registered public taxonomies (built-in plus custom taxonomies registered by themes/plugins like product_cat, brand, etc.). Returns the taxonomy slug, label, hierarchical flag, and which post types it applies to.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_get_term_metamanage_categoriesGet term meta data: the raw wp_termmeta table. For SEO fields, prefer wp_get_term_seo_meta: Yoast stores taxonomy SEO in the wpseo_taxonomy_meta option and All in One SEO in its own aioseo_terms table, so neither appears here. Rank Math and SEOPress do use term meta, so their keys are readable through this tool.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"term_id": {
"type": "integer"
},
"key": {
"type": "string",
"description": "Specific meta key. Omit to return all meta for the term."
}
},
"required": [
"term_id"
]
}wp_update_term_metamanage_categoriesUpdate term meta data: writes to the raw wp_termmeta table. For SEO fields, use wp_update_term_seo_meta instead. Two SEO plugins do NOT read term meta: Yoast keeps taxonomy SEO in the wpseo_taxonomy_meta option and All in One SEO in its aioseo_terms table, so a write here returns success, round-trips correctly on read, and changes nothing on the rendered archive (GitHub #6). Rank Math (rank_math_title / rank_math_description) and SEOPress do use term meta, so writing their keys here works. String values are stored verbatim for callers with the unfiltered_html capability (which the API-key auth path has); other callers get WordPress's post-content HTML allow-list, which strips script tags. Values holding JSON are safe either way: backslash escapes are preserved. Customize per key with the more_mcp_meta_value_sanitizer filter. Response includes saved_value_matches_sent plus a warnings array when the stored bytes differ from what was sent, so a sanitizer or filter that alters the value is surfaced rather than reported as a clean success.
Parameter Schema3 parameters
{
"type": "object",
"properties": {
"term_id": {
"type": "integer"
},
"key": {
"type": "string"
},
"value": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array"
},
{
"type": "object"
}
]
}
},
"required": [
"term_id",
"key",
"value"
]
}wp_delete_term_metaDestructiveDelete term meta data
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"term_id": {
"type": "integer"
},
"key": {
"type": "string"
}
},
"required": [
"term_id",
"key"
]
}wp_get_commentsRead-onlyList comments on the site or a specific post. Returns id, post_id, author, content, date, and status. Requires moderate_comments to list any status other than "approve".
Parameter Schema3 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer",
"description": "Limit to comments on this post ID"
},
"per_page": {
"type": "integer",
"description": "Number of comments (default 10, max 100)"
},
"status": {
"type": "string",
"enum": [
"approve",
"hold",
"spam",
"trash",
"all"
],
"description": "Comment status filter. \"approve\" is public; other values require moderate_comments."
}
}
}wp_create_commentedit_postsCreate a comment. Content may contain WordPress's standard comment HTML tags (<a>, <strong>, <em>, <blockquote>, <code>, <cite>, <abbr>, <acronym>), matching what the WP comment form permits. Other tags are stripped.
Parameter Schema4 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"content": {
"type": "string"
},
"author": {
"type": "string"
},
"author_email": {
"type": "string"
}
},
"required": [
"post_id",
"content"
]
}wp_delete_commentDestructiveDelete a comment
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"force": {
"type": "boolean"
}
},
"required": [
"id"
]
}wp_get_pending_commentsmoderate_commentsGet comments awaiting moderation (status=hold). Requires moderate_comments capability.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"limit": {
"type": "integer",
"description": "Max comments to return (default 20, max 100)"
}
}
}wp_approve_commentmoderate_commentsApprove a pending comment. Requires moderate_comments capability.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"comment_id": {
"type": "integer"
}
},
"required": [
"comment_id"
]
}wp_spam_commentDestructiveMark a comment as spam. Requires moderate_comments capability.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"comment_id": {
"type": "integer"
}
},
"required": [
"comment_id"
]
}wp_trash_commentDestructiveMove a comment to trash. Requires moderate_comments capability.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"comment_id": {
"type": "integer"
}
},
"required": [
"comment_id"
]
}wp_get_userslist_usersList site users. Returns id, display_name, role, and post_count. Emails and usernames are NOT exposed. Filter by role slug (administrator / editor / author / contributor / subscriber, or any custom role).
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"per_page": {
"type": "integer",
"description": "Number of users (default 10, max 100)"
},
"role": {
"type": "string",
"description": "Filter by role slug. Use wp_get_user on a specific ID for full profile data."
}
}
}wp_get_userlist_usersGet a single user by ID. Returns id, display_name, roles, and registration date. Emails and usernames are NOT exposed. Use wp_get_users to list and discover user IDs first.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "User ID."
}
},
"required": [
"id"
]
}wp_get_post_metaRead-onlyGet post meta data
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"key": {
"type": "string"
}
},
"required": [
"post_id"
]
}wp_update_post_metaedit_postsUpdate post meta. Value can be any JSON type (string, number, boolean, array, object). String values are stored verbatim for callers with the unfiltered_html capability (which the API-key auth path has); other callers get WordPress's post-content HTML allow-list, which strips script tags. Values holding JSON are safe either way: backslash escapes are preserved. Customize per key with the more_mcp_meta_value_sanitizer filter. Response includes saved_value_matches_sent plus a warnings array when the stored bytes differ from what was sent, so a sanitizer or filter that alters the value is surfaced rather than reported as a clean success. Arrays and objects are serialized by WordPress on write and returned as PHP arrays by wp_get_post_meta on read. Overwrites the existing row for this key (use wp_add_post_meta for multi-row keys).
Parameter Schema3 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"key": {
"type": "string"
},
"value": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array"
},
{
"type": "object"
}
],
"description": "Any JSON value. Do not pass PHP-serialized strings (a:1:{...}); pass the structured value directly."
}
},
"required": [
"post_id",
"key",
"value"
]
}wp_add_post_metaedit_postsAdd a meta row without overwriting existing values under the same key. Use for keys that store multiple rows (e.g. tag one post with several IDs under the same key). Value can be any JSON type. String values are stored verbatim for callers with the unfiltered_html capability (which the API-key auth path has); other callers get WordPress's post-content HTML allow-list, which strips script tags. Values holding JSON are safe either way: backslash escapes are preserved. Customize per key with the more_mcp_meta_value_sanitizer filter. Response includes saved_value_matches_sent plus a warnings array when the stored bytes differ from what was sent, so a sanitizer or filter that alters the value is surfaced rather than reported as a clean success. Arrays and objects are serialized by WordPress. If unique=true and a row with this key already exists, the call returns created=false.
Parameter Schema4 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"key": {
"type": "string"
},
"value": {
"oneOf": [
{
"type": "string"
},
{
"type": "integer"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "array"
},
{
"type": "object"
}
],
"description": "Any JSON value. Do not pass PHP-serialized strings."
},
"unique": {
"type": "boolean",
"description": "If true, fail (return created=false) when a row with this key already exists. Default false."
}
},
"required": [
"post_id",
"key",
"value"
]
}wp_delete_post_metaDestructiveDelete post meta data
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"key": {
"type": "string"
}
},
"required": [
"post_id",
"key"
]
}wp_get_site_infoRead-onlyGet user-facing site metadata (name, description, URL, language, timezone, WP version). For operator-facing environment (PHP/MySQL versions, plugin count, memory limits, disk free), use wp_get_site_status.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_get_site_statusmanage_optionsOne-shot site diagnostic. Returns WordPress version, PHP version, MySQL/MariaDB version, active plugin count, active theme details, memory limit, max upload size, timezone, WP_DEBUG_LOG state, disk free space, install age, and site/home URLs. Use this at the start of a debugging or environment-inspection conversation instead of piecing it together from wp_get_site_info + wp_get_plugins + wp_get_active_theme. Requires manage_options.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_get_error_log_tailmanage_optionsRead the tail of wp-content/debug.log. Returns the last N lines (default 100, max 1000), optionally filtered by a case-insensitive substring. Automatically caps file read at last 1MB to prevent memory blowup on huge logs (truncated=true when this happens). Returns status="disabled" with instructions when WP_DEBUG_LOG is not enabled in wp-config.php. Requires manage_options.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"lines": {
"type": "integer",
"description": "Number of lines to return from the tail (default 100, max 1000)."
},
"filter": {
"type": "string",
"description": "Optional case-insensitive substring filter applied before the last-N slice (e.g. \"Fatal error\", \"Deprecated\", a plugin slug)."
}
}
}wp_get_cron_schedulemanage_optionsEnumerate scheduled wp_cron events. Returns each event with hook name, next run (unix + ISO 8601), seconds until next run, is_overdue flag, recurrence (hourly / twicedaily / daily / custom + interval in seconds), and args. Sorted by next-run ascending so overdue events come first. Useful for diagnosing missed schedules, plugin cron conflicts, or unfired hooks. Requires manage_options.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}more_mcp_connection_healthRead-onlyDiagnostic probe for the current MCP connection. Returns MCP endpoint route, authentication method used by this request (api-key or oauth-bearer), OAuth access token time-to-live in seconds (null for api-key), current MCP session ID, active MCP capabilities negotiated at initialize, plus More MCP + WordPress + PHP version strings. No arguments. Call at connection start to confirm setup, or when diagnosing 401/403/404 issues. Any authenticated caller.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}more_mcp_undo_last_operationDestructiveReverse one prior operation using the token from its response. LIMITED SCOPE: only some tools emit undo tokens, and a tool that does not emit one cannot be undone through this. Currently covered: the Gutenberg block mutations (blocks_insert, blocks_update, blocks_delete, blocks_move), the template and reusable-block writes (blocks_update_template, blocks_revert_template, blocks_update_reusable, blocks_delete_reusable), wp_reorder_menu_items, the Elementor element writes (elementor_update_widget, elementor_delete_widget), and the Elementor kit write (elementor_update_kit), the FSE global styles write (blocks_update_global_styles), and the Elementor Pro font/icon writes (elementor_create_font, elementor_update_font, elementor_delete_font, elementor_delete_icon_set), and the Elementor Pro Custom Code writes (elementor_create_code, elementor_update_code, elementor_delete_code), and the Divi whole-node writes (divi_replace_module, divi_insert_module, divi_delete_module), and the forms entry writes (forms_update_entry_status, forms_trash_entry), and the Code Snippets writes (snippet_create, snippet_update). NOT covered, these write without any undo: wp_update_post, wp_update_option, wp_update_widget, wp_update_seo_meta, wp_update_term_seo_meta, wp_update_post_meta, the other elementor_* tools, and every wc_* tool. Check for an `undo` key in a response rather than assuming one exists. Tokens live 72 hours and are one-shot, consumed on a successful undo. The capability requirement matches the original operation and is re-checked at redemption, because a token may be presented by a different caller than the one who created it.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"token": {
"type": "string",
"description": "The undo token from a prior tool response (response.undo.token)."
}
},
"required": [
"token"
]
}wp_searchRead-onlySearch all content. Pass snippet>0 to receive a content excerpt around each match (saves tokens vs. fetching each result with wp_get_page).
Parameter Schema4 parameters
{
"type": "object",
"properties": {
"query": {
"type": "string"
},
"post_type": {
"type": "string"
},
"per_page": {
"type": "integer",
"description": "Number of results (default 20, max 100)"
},
"snippet": {
"type": "integer",
"description": "Snippet length in characters around the matched term (default 0 = off, recommended 160-240). When set, results include slug and snippet fields."
}
},
"required": [
"query"
]
}wp_get_optionmanage_optionsGet a single WordPress option value (allowlisted, sensitive keys redacted)
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"name": {
"type": "string"
}
},
"required": [
"name"
]
}wp_get_plugin_settingsmanage_optionsGet all options stored by a plugin, looked up by slug. Sensitive keys (api keys, secrets, tokens, passwords) are redacted before return.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"plugin_slug": {
"type": "string",
"description": "Plugin slug, e.g. woocommerce or rank-math"
}
},
"required": [
"plugin_slug"
]
}wp_update_optionDestructiveUpdate a WordPress option. Requires the "Allow AI to write WordPress options" admin toggle to be enabled, and the option name must be in the allowlist (extend via the more_mcp_writable_options filter). Sensitive option names are permanently denylisted.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"description": "New value (any JSON type). Full overwrite: read first, merge in your client, then write back."
}
},
"required": [
"name",
"value"
]
}wp_set_front_pagemanage_optionsSet the site's front page (Settings -> Reading). Pass page_id to serve a static page at "/" (sets show_on_front="page" + page_on_front=page_id atomically); the page must exist and be published. Optionally pass posts_page_id to set the blog/posts page. Pass show_posts=true instead to revert to the classic latest-posts front (show_on_front="posts"). This is the atomic, validated path for "make this page the homepage" - the front-page options are cross-validated (a page ID must resolve to a published page) rather than written blind. Requires manage_options.
Parameter Schema3 parameters
{
"type": "object",
"properties": {
"page_id": {
"type": "integer",
"description": "ID of a published page to serve as the static front page. Sets show_on_front=\"page\" and page_on_front. Mutually exclusive with show_posts."
},
"posts_page_id": {
"type": "integer",
"description": "Optional ID of a published page to use as the posts/blog page (page_for_posts). Must differ from page_id."
},
"show_posts": {
"type": "boolean",
"description": "Set true to revert to the latest-posts front page (show_on_front=\"posts\"). Mutually exclusive with page_id."
}
}
}wp_get_menusedit_theme_optionsList all registered navigation menus (nav_menu taxonomy). Returns id, name, slug, and item count for each. Use wp_get_menu_items to enumerate items within a specific menu.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_create_menuedit_theme_optionsCreate a new navigation menu (nav_menu term) and return its menu_id, so the item tools have something to populate - wp_create_menu_item requires a menu_id that must already exist, and a fresh site has none. Optionally assign the new menu to one or more registered theme locations (e.g. "primary", "footer") so it renders in the theme without a manual Appearance -> Menus step. Refuses a duplicate menu name (WordPress requires nav-menu names to be unique). Requires edit_theme_options capability.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Human-readable menu name (must be unique among existing menus)."
},
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional registered theme-location slugs to assign this menu to (from the active theme). Unknown slugs are reported back in unknown_locations and skipped, not fatal."
}
},
"required": [
"name"
]
}wp_get_menu_itemsedit_theme_optionsGet menu items
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"menu_id": {
"type": "integer"
}
},
"required": [
"menu_id"
]
}wp_create_menu_itemedit_theme_optionsCreate a menu item in a navigation menu. Requires edit_theme_options capability.
Parameter Schema8 parameters
{
"type": "object",
"properties": {
"menu_id": {
"type": "integer"
},
"title": {
"type": "string"
},
"url": {
"type": "string",
"description": "External URL (leave empty if linking to a post/page via object_id)"
},
"object_id": {
"type": "integer",
"description": "WordPress object ID (post, page, or term)"
},
"object_type": {
"type": "string",
"enum": [
"post",
"page",
"category",
"custom"
],
"description": "Type of object being linked (default: custom)"
},
"parent_id": {
"type": "integer",
"description": "Parent menu item ID for nested items (0 = top level)"
},
"position": {
"type": "integer",
"description": "Position in menu order (default: end)"
},
"target": {
"type": "string",
"enum": [
"_self",
"_blank"
],
"description": "Link target"
}
},
"required": [
"menu_id",
"title"
]
}wp_update_menu_itemedit_theme_optionsUpdate an existing menu item. Only the fields you pass will change; unspecified fields are preserved from the existing item. The tool will refuse explicit-empty values for title or url that would destroy a non-empty existing value: to intentionally clear those, use wp_delete_menu_item then wp_create_menu_item. Requires edit_theme_options capability.
Parameter Schema6 parameters
{
"type": "object",
"properties": {
"menu_item_id": {
"type": "integer"
},
"title": {
"type": "string"
},
"url": {
"type": "string"
},
"parent_id": {
"type": "integer"
},
"position": {
"type": "integer"
},
"target": {
"type": "string",
"enum": [
"_self",
"_blank"
]
}
},
"required": [
"menu_item_id"
]
}wp_delete_menu_itemDestructiveDelete a menu item. Requires edit_theme_options capability.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"menu_item_id": {
"type": "integer"
}
},
"required": [
"menu_item_id"
]
}wp_reorder_menu_itemsDestructiveReorder menu items by passing an array of menu_item_ids in the desired order. Existing titles, URLs, parents, and other fields are preserved on every item touched. Every response includes an "undo" envelope with a token that more_mcp_undo_last_operation can consume for 72 hours to restore the pre-op menu order. If the response includes a "skipped" array, those items could not be safely reordered (e.g. missing or recently deleted); the rest were reordered correctly. Requires edit_theme_options capability.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"menu_id": {
"type": "integer"
},
"item_order": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Array of menu_item_ids in the desired order"
}
},
"required": [
"menu_id",
"item_order"
]
}wp_get_pluginsactivate_pluginsList all installed plugins. Returns plugin file path, name, version, description, author, and active status for each. Useful for diagnosing plugin conflicts and building a compatibility picture at the start of a debugging conversation.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_get_themesswitch_themesList all installed themes. Returns theme slug, name, version, author, and active flag for each. Use wp_get_active_theme for details on the currently-active theme only.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_get_active_themeswitch_themesGet the active theme with name, version, parent (if child theme), and screenshot URL
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_get_theme_modsedit_theme_optionsGet all customizer settings (theme_mods) for the active theme
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_update_theme_modedit_theme_optionsUpdate a single theme customizer setting. Requires the "Allow AI to modify theme appearance" admin toggle AND the mod name must be in the allowlist (extend via the more_mcp_writable_theme_mods filter).
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"mod_name": {
"type": "string"
},
"value": {
"description": "New value (any JSON type compatible with set_theme_mod)"
}
},
"required": [
"mod_name",
"value"
]
}wp_get_custom_cssedit_theme_optionsGet the active theme's custom CSS
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"theme_slug": {
"type": "string",
"description": "Theme slug (defaults to active theme)"
}
}
}wp_update_custom_cssDestructiveUpdate the active theme's custom CSS. CSS is filtered through wp_kses (script tags stripped). Requires the "Allow AI to modify theme appearance" admin toggle and unfiltered_html capability.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"css": {
"type": "string"
},
"theme_slug": {
"type": "string",
"description": "Theme slug (defaults to active theme)"
}
},
"required": [
"css"
]
}wp_get_widgetsRead-onlyList widget instances. Uses the WordPress core /wp/v2/widgets REST endpoint so classic and block widgets are returned uniformly. Omit sidebar to return widgets across ALL sidebars including wp_inactive_widgets (orphaned widgets from prior themes, these have rendered:"" and produce no front-end output). Filter by a specific sidebar ID (discover IDs via wp_get_sidebars) to scope results; a non-existent sidebar ID returns an empty array, not an error.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"sidebar": {
"type": "string",
"description": "Optional sidebar ID to filter by. Omit to return widgets across all sidebars (includes wp_inactive_widgets)."
}
}
}wp_get_sidebarsRead-onlyList registered sidebars (widget areas) on the active theme with their IDs, names, description, and status. Use to discover sidebar IDs before calling wp_get_widgets or wp_update_widget.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_update_widgetDestructiveUpdate a widget instance by ID. Requires the "Allow AI to modify theme appearance" admin toggle AND edit_theme_options capability. Uses WordPress core /wp/v2/widgets so classic and block widgets are handled uniformly. Pass the id returned by wp_get_widgets.
Parameter Schema4 parameters
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Widget ID (e.g. text-2, block-15)"
},
"sidebar": {
"type": "string",
"description": "Sidebar ID to place the widget in (omit to leave unchanged)"
},
"instance": {
"type": "object",
"description": "Widget instance data. For classic widgets, either pass the same {encoded, hash} object returned by wp_get_widgets or wrap raw settings as {raw: {…}}."
},
"form_data": {
"type": "string",
"description": "Serialized form data (classic widgets alternative to instance)"
}
},
"required": [
"id"
]
}wp_list_page_templatesedit_postsList the templates a given post or post type can be rendered with, which is the set of valid values for wp_set_page_template. Resolved live from WordPress (get_page_templates), so the list reflects what is actually installed: the active theme's page templates, a block theme's custom templates, and any option a plugin injects. On an Elementor site that includes Elementor Canvas (no header or footer), Elementor Full Width (theme header and footer, full-width content), and Theme. Always includes "default", which means no explicit choice: the theme's own page template, or on an Elementor page the default set in Site Settings. Call this before wp_set_page_template rather than guessing a slug, because the set is per-site and per-post-type. Requires edit_posts, or edit_post on the target when post_id is given.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer",
"description": "Resolve the list for this specific post, and report which template it currently uses. Some providers vary the list per document, so this is more accurate than post_type alone."
},
"post_type": {
"type": "string",
"description": "Resolve the list for a post type instead of a specific post (default \"page\"). Ignored when post_id is supplied."
}
}
}wp_set_page_templateDestructiveSet which template renders one post or page, the per-document render context. This is what makes a single page a bare canvas with no theme header or footer, or wraps it in a specific custom template from a block theme. Pass a template value from wp_list_page_templates; a value outside that list is refused by name rather than stored, because WordPress would accept any string, read it back correctly, and silently fall through to the default at render time. Pass "default" to clear an explicit choice. Set dry_run=true to preview. The write is verified by reading the value back, so a host plugin blocking the change is reported instead of returning a false success. Requires edit_post on the target.
Parameter Schema3 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer",
"description": "Post or page ID to change."
},
"template": {
"type": "string",
"description": "Template value from wp_list_page_templates (e.g. \"elementor_canvas\", \"elementor_header_footer\", \"elementor_theme\", a theme file like \"page-wide.php\", or a block theme's custom template slug). Use \"default\" for no explicit choice."
},
"dry_run": {
"type": "boolean",
"description": "Report what would change without writing. Default false."
}
},
"required": [
"post_id",
"template"
]
}wp_get_seo_metaRead-onlyGet the SEO meta fields for a post (title, description, focus keyword, noindex, canonical, OG/Twitter overrides, schema page type, URL slug). Auto-detects Yoast SEO, Rank Math, All in One SEO, SEOPress, Slim SEO, or The SEO Framework and reads from wherever that plugin actually stores each field. The response lists which fields the active plugin supports, includes the raw stored values for diagnostics, and flags when more than one SEO plugin is active (which produces duplicate meta tags in the rendered head). The slug is a WordPress-native field and is returned regardless of SEO plugin. Complements seo_audit_meta_tags, which reads the rendered output rather than the database.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
}
},
"required": [
"post_id"
]
}wp_update_seo_metaedit_postsUpdate SEO meta fields on a post. Auto-routes each field to wherever the active plugin actually reads it: Yoast SEO, Rank Math, All in One SEO (custom tables, not post meta), SEOPress, Slim SEO, or The SEO Framework. A field the active plugin does not store is REFUSED by name rather than written to a plausible-looking key that would store cleanly and change nothing on the page. Every write is read back from storage and the returned values are what was actually stored, so a sanitizer or normalising filter is visible instead of being reported as a clean success. The slug field is WordPress-native and works with no SEO plugin active. Requires edit_post capability on the target post.
Parameter Schema12 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"title": {
"type": "string",
"description": "SEO title (replaces the meta title used in browser tabs and SERPs)"
},
"description": {
"type": "string",
"description": "SEO meta description (used in SERPs)"
},
"focus_keyword": {
"type": "string",
"description": "Primary focus keyword for SEO scoring. Yoast, Rank Math, and SEOPress only."
},
"noindex": {
"type": "boolean",
"description": "Tell search engines not to index this URL"
},
"canonical": {
"type": "string",
"description": "Canonical URL override"
},
"og_title": {
"type": "string",
"description": "Open Graph title (Facebook / Slack / LinkedIn previews)"
},
"og_description": {
"type": "string",
"description": "Open Graph description"
},
"twitter_title": {
"type": "string",
"description": "Twitter Card title"
},
"twitter_description": {
"type": "string",
"description": "Twitter Card description"
},
"schema_page_type": {
"type": "string",
"description": "Schema.org page type for the @graph (Yoast only). Values that render: WebPage, ContactPage, AboutPage, CollectionPage, FAQPage, ItemPage, ProfilePage, SearchResultsPage, CheckoutPage, RealEstateListing, QAPage."
},
"slug": {
"type": "string",
"description": "URL slug (post_name). WordPress will sanitize and ensure uniqueness; the actually-saved value is returned in the response so the caller can confirm."
}
},
"required": [
"post_id"
]
}wp_get_term_seo_metamanage_categoriesGet the SEO meta fields for a term (category, tag, or any custom taxonomy term). Reads from wherever the active SEO plugin actually stores term data, which is NOT always term meta: Yoast keeps taxonomy SEO in the wpseo_taxonomy_meta option keyed by taxonomy and term ID, and All in One SEO uses its own aioseo_terms table. Use this instead of wp_get_term_meta for SEO fields: wp_get_term_meta reads the raw meta table and will report nothing for those two plugins. Supported at term level: Yoast SEO, Rank Math, All in One SEO, SEOPress. Requires the taxonomy, because Yoast cannot be looked up by term ID alone.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"term_id": {
"type": "integer"
},
"taxonomy": {
"type": "string",
"description": "Taxonomy slug the term belongs to (e.g. category, post_tag, product_cat). Required."
}
},
"required": [
"term_id",
"taxonomy"
]
}wp_update_term_seo_metamanage_categoriesUpdate SEO meta fields on a term, writing to the location the active SEO plugin actually reads. This is the correct tool for taxonomy noindex: wp_update_term_meta writes to the term meta table, which Yoast never reads for noindex, so that call returns success and leaves the archive indexable (GitHub #6). Yoast writes are merged into wpseo_taxonomy_meta read-modify-write, so other terms' settings are preserved. Yoast term noindex is tri-state: "default" inherits the taxonomy-wide setting and is not the same as an explicit index; passing noindex=false writes an explicit index. A field the active plugin does not store at term level is refused by name. Every write is read back from storage. Supported at term level: Yoast SEO, Rank Math, All in One SEO, SEOPress. Requires manage_categories.
Parameter Schema11 parameters
{
"type": "object",
"properties": {
"term_id": {
"type": "integer"
},
"taxonomy": {
"type": "string",
"description": "Taxonomy slug the term belongs to. Required."
},
"title": {
"type": "string",
"description": "SEO title for the term archive"
},
"description": {
"type": "string",
"description": "SEO meta description for the term archive"
},
"focus_keyword": {
"type": "string",
"description": "Focus keyword. Yoast and Rank Math only at term level."
},
"noindex": {
"type": "boolean",
"description": "Tell search engines not to index this term archive"
},
"canonical": {
"type": "string",
"description": "Canonical URL override for the term archive"
},
"og_title": {
"type": "string",
"description": "Open Graph title"
},
"og_description": {
"type": "string",
"description": "Open Graph description"
},
"twitter_title": {
"type": "string",
"description": "Twitter Card title"
},
"twitter_description": {
"type": "string",
"description": "Twitter Card description"
}
},
"required": [
"term_id",
"taxonomy"
]
}seo_audit_meta_tagsRead-onlyFetch a post's actual rendered HTML and parse the head for title, meta description, canonical, viewport, Open Graph and Twitter Card tags. Catches theme/plugin/cache conflicts that only appear in the served output: duplicate title tags, mismatched canonicals, missing OG images, viewport misconfiguration. Complements wp_get_seo_meta (which reads DB fields) by validating what actually reaches crawlers. Pass a post_id (URL is resolved via get_permalink) or a same-site url. Read-only.
Parameter Schema2 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer",
"description": "Post ID whose permalink to audit. Either post_id or url is required."
},
"url": {
"type": "string",
"description": "Absolute URL to audit. Must be on this site (same host as home_url). Either post_id or url is required."
}
}
}wp_get_permalink_structuremanage_optionsGet the WordPress permalink structure (e.g. /%postname%/, /%year%/%monthnum%/%postname%/). Read-only.
Parameter Schema0 parameters
{
"type": "object",
"properties": {}
}wp_update_permalink_structureDestructiveUpdate the WordPress permalink structure. Requires the "Allow AI to write WordPress options" admin toggle. Common values: /%postname%/, /%year%/%monthnum%/%postname%/, /%category%/%postname%/. Changing this rewrites every URL on the site and flushes rewrite rules automatically.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"structure": {
"type": "string",
"description": "New permalink structure (e.g. /%postname%/)"
}
},
"required": [
"structure"
]
}wp_get_post_revisionsRead-onlyGet a post's revision history, paginated. Returns {total, offset, limit, returned, has_more, revisions[]}; each row carries revision_id, author, date, word_count, content_length, differs_from_parent, and elementor_data_length so revisions can be told apart without fetching each one. A revision_id is a valid post_id for the meta tools, so wp_get_post_meta(post_id=<revision_id>, key=_elementor_data) recovers a builder page's prior state: the practical route when wp_restore_revision is not enough, since it restores post_content while a builder page lives in meta.
Parameter Schema3 parameters
{
"type": "object",
"properties": {
"post_id": {
"type": "integer"
},
"limit": {
"type": "integer",
"description": "Max revisions to return (default 20, max 100)"
},
"offset": {
"type": "integer",
"description": "Skip this many revisions before returning results. Use with limit to page through a long history."
}
},
"required": [
"post_id"
]
}wp_restore_revisionDestructiveRestore a post to a specific revision. The current post content becomes the previous revision (so it can still be reverted again). Requires edit_post capability on the parent post.
Parameter Schema1 parameter
{
"type": "object",
"properties": {
"revision_id": {
"type": "integer"
}
},
"required": [
"revision_id"
]
}ahrefs_domain_ratingmanage_optionsGet the Ahrefs Domain Rating (DR, 0 - 100) for a domain. DR estimates the strength of a domain's backlink profile relative to others; it is Ahrefs' metric, not a Google ranking factor. Requires an Ahrefs APIv3 key, stored in Settings -> External Services -> SEO & analytics. Read-only, one outbound call to Ahrefs per invocation.
semrush_domain_overviewmanage_optionsSemrush domain overview: organic/paid keyword counts, traffic estimate, and traffic cost for a domain in one regional database. Source: Semrush (costs API units). Read-only.
semrush_organic_keywordsmanage_optionsKeywords a domain ranks for in organic search, with position, search volume, CPC, and traffic share. Source: Semrush (costs API units). Read-only.
semrush_competitorsmanage_optionsOrganic competitors of a domain (sites competing for the same keywords) with their common-keyword counts. Source: Semrush (costs API units). Read-only.
semrush_keyword_overviewmanage_optionsKeyword overview: search volume, CPC, competition, and result count for a phrase in one database. Source: Semrush (costs API units). Read-only.
semrush_related_keywordsmanage_optionsKeywords semantically related to a phrase, with volume and competition. Source: Semrush (costs API units). Read-only.
semrush_keyword_difficultymanage_optionsKeyword difficulty index (0 - 100) estimating how hard it is to rank for one or more phrases. Source: Semrush (costs API units). Read-only.
semrush_question_keywordsmanage_optionsQuestion-form keywords containing a phrase (who/what/how/…), with volume, useful for FAQ and passage targeting. Source: Semrush (costs API units). Read-only.
semrush_url_keywordsmanage_optionsKeywords a specific URL ranks for organically, with position and volume. Source: Semrush (costs API units). Read-only.
semrush_backlinks_overviewmanage_optionsBacklink profile summary for a domain: total backlinks, referring domains, referring IPs, and authority score. Source: Semrush (costs API units). Read-only.
semrush_backlinks_listmanage_optionsIndividual backlinks pointing at a domain, with source URL, anchor, and first-seen date. Source: Semrush (costs API units). Read-only.
semrush_referring_domainsmanage_optionsDomains linking to a target, ranked by their authority, with backlink counts. Source: Semrush (costs API units). Read-only.
semrush_backlink_anchorsmanage_optionsAnchor texts used in backlinks to a target, with counts, reveals over-optimized or branded anchor patterns. Source: Semrush (costs API units). Read-only.
semrush_api_unitsmanage_optionsRemaining Semrush API unit balance for the configured key. Read-only, does not itself cost units.
dataforseo_serpmanage_optionsLive Google organic SERP for a keyword: ranked results with position, title, URL, and snippet. Source: DataForSEO (consumes account credit). Read-only.
dataforseo_keyword_volumemanage_optionsSearch volume, CPC, and competition for one or more keywords (Google Ads data). Source: DataForSEO (consumes account credit). Read-only.
dataforseo_ranked_keywordsmanage_optionsKeywords a domain currently ranks for in organic search, with position and volume. Source: DataForSEO (consumes account credit). Read-only.
dataforseo_backlinks_summarymanage_optionsBacklink profile summary for a target: total backlinks, referring domains, rank, and spam score. Source: DataForSEO (consumes account credit). Read-only.
dataforseo_referring_domainsmanage_optionsDomains linking to a target, with backlink counts and domain rank. Source: DataForSEO (consumes account credit). Read-only.
dataforseo_onpage_instantmanage_optionsInstant on-page audit of a single URL: status code, load timing, title/description/heading checks, and detected issues. Source: DataForSEO (consumes account credit). Read-only.
seranking_domain_overviewmanage_optionsDomain overview in one regional database: organic/paid traffic, keyword counts, and estimated traffic cost. Source: SE Ranking (consumes API credit). Read-only.
seranking_domain_overview_globalmanage_optionsGlobal domain overview aggregating estimated organic metrics across all SE Ranking databases. Source: SE Ranking (consumes API credit). Read-only.
seranking_domain_keywordsmanage_optionsKeywords a domain ranks for organically, with position, volume, and traffic share. Source: SE Ranking (consumes API credit). Read-only.
seranking_domain_competitorsmanage_optionsOrganic competitors of a domain with common-keyword counts and overlap. Source: SE Ranking (consumes API credit). Read-only.
seranking_top_pagesmanage_optionsTop-performing pages of a domain by estimated organic traffic and keyword count. Source: SE Ranking (consumes API credit). Read-only.
seranking_subdomainsmanage_optionsSubdomains of a domain with their organic traffic and keyword counts. Source: SE Ranking (consumes API credit). Read-only.
seranking_keyword_overviewmanage_optionsKeyword overview: volume, CPC, competition, and difficulty for a phrase. Source: SE Ranking (consumes API credit). Read-only.
seranking_keyword_comparemanage_optionsCompare metrics for several keywords side by side (volume, CPC, difficulty). Source: SE Ranking (consumes API credit). Read-only.
seranking_related_keywordsmanage_optionsKeywords semantically related to a phrase, with volume and difficulty. Source: SE Ranking (consumes API credit). Read-only.
seranking_similar_keywordsmanage_optionsSimilar keywords sharing SERP results with a phrase. Source: SE Ranking (consumes API credit). Read-only.
seranking_question_keywordsmanage_optionsQuestion-form keywords containing a phrase, with volume, for FAQ and AI-answer targeting. Source: SE Ranking (consumes API credit). Read-only.
seranking_longtail_keywordsmanage_optionsLong-tail keyword variations of a phrase, with volume and difficulty. Source: SE Ranking (consumes API credit). Read-only.
seranking_backlinksmanage_optionsBacklink profile summary for a domain: total backlinks, referring domains, and anchors overview. Source: SE Ranking (consumes API credit). Read-only.
seranking_domain_authoritymanage_optionsDomain trust / authority scores (SE Ranking domain trust and page trust). Source: SE Ranking (consumes API credit). Read-only.
seranking_ai_visibilitymanage_optionsAI-search visibility for a domain: how often it appears in AI Overviews / AI answers across tracked prompts. (SE Ranking beta surface; verify against live account.) Source: SE Ranking (consumes API credit). Read-only.
gsc_list_sitesmanage_optionsList Search Console properties the connected Google account can access, with each property's permission level. Source: Google Search Console. Read-only.
gsc_search_analyticsmanage_optionsQuery Search Console performance data: clicks, impressions, CTR, and average position, grouped by the requested dimensions over a date range. Source: Google Search Console. Read-only.
gsc_list_sitemapsmanage_optionsList sitemaps submitted for a property, with submission state and last-download time. Source: Google Search Console. Read-only.
gsc_get_sitemapmanage_optionsGet details for one submitted sitemap: contents counts by type, warnings, and errors. Source: Google Search Console. Read-only.
gsc_inspect_urlmanage_optionsInspect a URL's index status in Google: coverage state, last crawl, canonical, mobile usability, and rich-result detection. Source: Google Search Console. Read-only.
ga4_list_accountsmanage_optionsList Google Analytics accounts the connected account can access. Source: Google Analytics 4 Admin API. Read-only.
ga4_list_propertiesmanage_optionsList GA4 properties under an account. Source: Google Analytics 4 Admin API. Read-only.
ga4_get_propertymanage_optionsGet one GA4 property's details: display name, time zone, currency, and create time. Source: Google Analytics 4 Admin API. Read-only.
ga4_metadatamanage_optionsList the dimensions and metrics available for a property, including custom ones. Use before ga4_run_report to pick valid field names. Source: Google Analytics 4 Data API. Read-only.
ga4_run_reportmanage_optionsRun a standard GA4 report: metrics by dimensions over a date range. Source: Google Analytics 4 Data API. Read-only.
ga4_run_pivot_reportmanage_optionsRun a GA4 pivot report: metrics pivoted across one or more dimensions. Source: Google Analytics 4 Data API. Read-only.
ga4_realtime_reportmanage_optionsRun a GA4 realtime report: active users and events in the last 30 minutes, by dimension. Source: Google Analytics 4 Data API. Read-only.
ga4_list_data_streamsmanage_optionsList data streams (web/app) configured for a property, with their measurement IDs. Source: Google Analytics 4 Admin API. Read-only.
ga4_list_conversion_eventsmanage_optionsList conversion (key) events configured for a property. Source: Google Analytics 4 Admin API. Read-only.
ga4_list_custom_dimensionsmanage_optionsList custom dimensions defined for a property. Source: Google Analytics 4 Admin API. Read-only.
ga4_list_custom_metricsmanage_optionsList custom metrics defined for a property. Source: Google Analytics 4 Admin API. Read-only.