corewordpress-core

WordPress 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.

138Total Abilities
18Destructive
11Capability Gates
Functional Domains:
Core surface (no host plugin required)
WordPress capabilities required:
activate_plugins 1switch_themes 2manage_options 61edit_theme_options 11moderate_comments 5manage_categories 8edit_pages 4edit_posts 18upload_files 6list_users 2read 20

Available Tools (138)

wp_get_postsRead-only

Get WordPress posts (supports custom post types)

Ability IDmore-mcp/wp-get-postsRequiresread
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-only

Get single post by ID (any post type)

Ability IDmore-mcp/wp-get-postRequiresread
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Post ID"
    }
  },
  "required": [
    "id"
  ]
}
wp_create_postedit_posts

Create new post (supports custom post types). Combine status="future" with date to schedule. Excerpt may contain safe HTML (same allow-list as post content).

Ability IDmore-mcp/wp-create-postRequiresedit_posts
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_posts

Update 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.

Ability IDmore-mcp/wp-update-postRequiresedit_posts
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_posts

Find/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.

Ability IDmore-mcp/wp-replace-in-postRequiresedit_posts
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-only

Get all registered public post types (including custom post types)

Ability IDmore-mcp/wp-get-post-typesRequiresread
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_delete_postDestructive

Delete post

Ability IDmore-mcp/wp-delete-postRequiresedit_posts
Parameter Schema2 parameters
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "force": {
      "type": "boolean",
      "description": "Skip trash and permanently delete"
    }
  },
  "required": [
    "id"
  ]
}
wp_count_postsRead-only

Get post counts by status

Ability IDmore-mcp/wp-count-postsRequiresread
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "post_type": {
      "type": "string",
      "description": "Post type (post, page, etc)"
    }
  }
}
wp_get_pagesRead-only

List WordPress pages. Returns id, title, status, and URL for each. Filter by parent to walk the page hierarchy.

Ability IDmore-mcp/wp-get-pagesRequiresread
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-only

Get single page by ID

Ability IDmore-mcp/wp-get-pageRequiresread
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Page ID"
    }
  },
  "required": [
    "id"
  ]
}
wp_create_pageedit_pages

Create 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.

Ability IDmore-mcp/wp-create-pageRequiresedit_pages
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_pages

Update 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.

Ability IDmore-mcp/wp-update-pageRequiresedit_pages
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_pages

Find/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.

Ability IDmore-mcp/wp-replace-in-pageRequiresedit_pages
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_pageDestructive

Delete page

Ability IDmore-mcp/wp-delete-pageRequiresedit_pages
Parameter Schema2 parameters
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "force": {
      "type": "boolean"
    }
  },
  "required": [
    "id"
  ]
}
wp_get_mediaupload_files

List 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.

Ability IDmore-mcp/wp-get-mediaRequiresupload_files
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_files

Get single media item by ID

Ability IDmore-mcp/wp-get-media-itemRequiresupload_files
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    }
  },
  "required": [
    "id"
  ]
}
wp_upload_media_from_urlupload_files

Download 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.

Ability IDmore-mcp/wp-upload-media-from-urlRequiresupload_files
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_files

Upload 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.

Ability IDmore-mcp/wp-upload-mediaRequiresupload_files
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_posts

Set 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.

Ability IDmore-mcp/wp-set-featured-imageRequiresedit_posts
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_posts

Update metadata on an existing media attachment: alt text, caption, title, description. Great for adding SEO-friendly alt text to images already in the library.

Ability IDmore-mcp/wp-update-mediaRequiresedit_posts
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_files

Process 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.

Ability IDmore-mcp/wp-process-imageRequiresupload_files
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_mediaDestructive

Delete media item

Ability IDmore-mcp/wp-delete-mediaRequiresedit_posts
Parameter Schema2 parameters
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "force": {
      "type": "boolean"
    }
  },
  "required": [
    "id"
  ]
}
wp_count_mediaupload_files

Get media counts by type

Ability IDmore-mcp/wp-count-mediaRequiresupload_files
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_get_categoriesRead-only

List 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.

Ability IDmore-mcp/wp-get-categoriesRequiresread
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "per_page": {
      "type": "integer",
      "description": "Number of categories (default 100, max 100)"
    }
  }
}
wp_get_tagsRead-only

List blog tags (the `post_tag` taxonomy). Returns id, name, slug, and count for each. For custom taxonomies, use wp_get_terms.

Ability IDmore-mcp/wp-get-tagsRequiresread
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "per_page": {
      "type": "integer",
      "description": "Number of tags (default 100, max 100)"
    }
  }
}
wp_create_termmanage_categories

Create 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.

Ability IDmore-mcp/wp-create-termRequiresmanage_categories
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_categories

Update 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).

Ability IDmore-mcp/wp-update-termRequiresmanage_categories
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_termDestructive

Delete a term from any registered taxonomy.

Ability IDmore-mcp/wp-delete-termRequiresmanage_categories
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_posts

Add or replace terms on a post in any taxonomy.

Ability IDmore-mcp/wp-add-post-termsRequiresedit_posts
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_posts

List 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.

Ability IDmore-mcp/wp-get-termsRequiresedit_posts
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-only

Get term counts in a taxonomy

Ability IDmore-mcp/wp-count-termsRequiresread
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "taxonomy": {
      "type": "string"
    }
  }
}
wp_get_taxonomiesRead-only

Get 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.

Ability IDmore-mcp/wp-get-taxonomiesRequiresread
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_get_term_metamanage_categories

Get 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.

Ability IDmore-mcp/wp-get-term-metaRequiresmanage_categories
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_categories

Update 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.

Ability IDmore-mcp/wp-update-term-metaRequiresmanage_categories
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_metaDestructive

Delete term meta data

Ability IDmore-mcp/wp-delete-term-metaRequiresmanage_categories
Parameter Schema2 parameters
{
  "type": "object",
  "properties": {
    "term_id": {
      "type": "integer"
    },
    "key": {
      "type": "string"
    }
  },
  "required": [
    "term_id",
    "key"
  ]
}
wp_get_commentsRead-only

List 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".

Ability IDmore-mcp/wp-get-commentsRequiresread
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_posts

Create 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.

Ability IDmore-mcp/wp-create-commentRequiresedit_posts
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_commentDestructive

Delete a comment

Ability IDmore-mcp/wp-delete-commentRequiresmoderate_comments
Parameter Schema2 parameters
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "force": {
      "type": "boolean"
    }
  },
  "required": [
    "id"
  ]
}
wp_get_pending_commentsmoderate_comments

Get comments awaiting moderation (status=hold). Requires moderate_comments capability.

Ability IDmore-mcp/wp-get-pending-commentsRequiresmoderate_comments
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_comments

Approve a pending comment. Requires moderate_comments capability.

Ability IDmore-mcp/wp-approve-commentRequiresmoderate_comments
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "comment_id": {
      "type": "integer"
    }
  },
  "required": [
    "comment_id"
  ]
}
wp_spam_commentDestructive

Mark a comment as spam. Requires moderate_comments capability.

Ability IDmore-mcp/wp-spam-commentRequiresmoderate_comments
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "comment_id": {
      "type": "integer"
    }
  },
  "required": [
    "comment_id"
  ]
}
wp_trash_commentDestructive

Move a comment to trash. Requires moderate_comments capability.

Ability IDmore-mcp/wp-trash-commentRequiresmoderate_comments
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "comment_id": {
      "type": "integer"
    }
  },
  "required": [
    "comment_id"
  ]
}
wp_get_userslist_users

List 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).

Ability IDmore-mcp/wp-get-usersRequireslist_users
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_users

Get 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.

Ability IDmore-mcp/wp-get-userRequireslist_users
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "User ID."
    }
  },
  "required": [
    "id"
  ]
}
wp_get_post_metaRead-only

Get post meta data

Ability IDmore-mcp/wp-get-post-metaRequiresread
Parameter Schema2 parameters
{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "integer"
    },
    "key": {
      "type": "string"
    }
  },
  "required": [
    "post_id"
  ]
}
wp_update_post_metaedit_posts

Update 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).

Ability IDmore-mcp/wp-update-post-metaRequiresedit_posts
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_posts

Add 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.

Ability IDmore-mcp/wp-add-post-metaRequiresedit_posts
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_metaDestructive

Delete post meta data

Ability IDmore-mcp/wp-delete-post-metaRequiresedit_posts
Parameter Schema2 parameters
{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "integer"
    },
    "key": {
      "type": "string"
    }
  },
  "required": [
    "post_id",
    "key"
  ]
}
wp_get_site_infoRead-only

Get 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.

Ability IDmore-mcp/wp-get-site-infoRequiresread
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_get_site_statusmanage_options

One-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.

Ability IDmore-mcp/wp-get-site-statusRequiresmanage_options
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_get_error_log_tailmanage_options

Read 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.

Ability IDmore-mcp/wp-get-error-log-tailRequiresmanage_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_options

Enumerate 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.

Ability IDmore-mcp/wp-get-cron-scheduleRequiresmanage_options
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
more_mcp_connection_healthRead-only

Diagnostic 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.

Ability IDmore-mcp/connection-healthRequiresread
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
more_mcp_undo_last_operationDestructive

Reverse 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.

Ability IDmore-mcp/undo-last-operationRequiresmanage_options
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-only

Search all content. Pass snippet>0 to receive a content excerpt around each match (saves tokens vs. fetching each result with wp_get_page).

Ability IDmore-mcp/wp-searchRequiresread
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_options

Get a single WordPress option value (allowlisted, sensitive keys redacted)

Ability IDmore-mcp/wp-get-optionRequiresmanage_options
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    }
  },
  "required": [
    "name"
  ]
}
wp_get_plugin_settingsmanage_options

Get all options stored by a plugin, looked up by slug. Sensitive keys (api keys, secrets, tokens, passwords) are redacted before return.

Ability IDmore-mcp/wp-get-plugin-settingsRequiresmanage_options
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "plugin_slug": {
      "type": "string",
      "description": "Plugin slug, e.g. woocommerce or rank-math"
    }
  },
  "required": [
    "plugin_slug"
  ]
}
wp_update_optionDestructive

Update 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.

Ability IDmore-mcp/wp-update-optionRequiresmanage_options
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_options

Set 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.

Ability IDmore-mcp/wp-set-front-pageRequiresmanage_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_options

List 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.

Ability IDmore-mcp/wp-get-menusRequiresedit_theme_options
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_create_menuedit_theme_options

Create 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.

Ability IDmore-mcp/wp-create-menuRequiresedit_theme_options
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_options

Get menu items

Ability IDmore-mcp/wp-get-menu-itemsRequiresedit_theme_options
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "menu_id": {
      "type": "integer"
    }
  },
  "required": [
    "menu_id"
  ]
}
wp_create_menu_itemedit_theme_options

Create a menu item in a navigation menu. Requires edit_theme_options capability.

Ability IDmore-mcp/wp-create-menu-itemRequiresedit_theme_options
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_options

Update 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.

Ability IDmore-mcp/wp-update-menu-itemRequiresedit_theme_options
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_itemDestructive

Delete a menu item. Requires edit_theme_options capability.

Ability IDmore-mcp/wp-delete-menu-itemRequiresedit_theme_options
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "menu_item_id": {
      "type": "integer"
    }
  },
  "required": [
    "menu_item_id"
  ]
}
wp_reorder_menu_itemsDestructive

Reorder 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.

Ability IDmore-mcp/wp-reorder-menu-itemsRequiresedit_theme_options
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_plugins

List 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.

Ability IDmore-mcp/wp-get-pluginsRequiresactivate_plugins
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_get_themesswitch_themes

List 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.

Ability IDmore-mcp/wp-get-themesRequiresswitch_themes
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_get_active_themeswitch_themes

Get the active theme with name, version, parent (if child theme), and screenshot URL

Ability IDmore-mcp/wp-get-active-themeRequiresswitch_themes
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_get_theme_modsedit_theme_options

Get all customizer settings (theme_mods) for the active theme

Ability IDmore-mcp/wp-get-theme-modsRequiresedit_theme_options
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_update_theme_modedit_theme_options

Update 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).

Ability IDmore-mcp/wp-update-theme-modRequiresedit_theme_options
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_options

Get the active theme's custom CSS

Ability IDmore-mcp/wp-get-custom-cssRequiresedit_theme_options
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "theme_slug": {
      "type": "string",
      "description": "Theme slug (defaults to active theme)"
    }
  }
}
wp_update_custom_cssDestructive

Update 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.

Ability IDmore-mcp/wp-update-custom-cssRequiresedit_theme_options
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-only

List 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.

Ability IDmore-mcp/wp-get-widgetsRequiresread
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-only

List 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.

Ability IDmore-mcp/wp-get-sidebarsRequiresread
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_update_widgetDestructive

Update 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.

Ability IDmore-mcp/wp-update-widgetRequiresedit_posts
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_posts

List 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.

Ability IDmore-mcp/wp-list-page-templatesRequiresedit_posts
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_templateDestructive

Set 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.

Ability IDmore-mcp/wp-set-page-templateRequiresedit_posts
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-only

Get 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.

Ability IDmore-mcp/wp-get-seo-metaRequiresread
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "integer"
    }
  },
  "required": [
    "post_id"
  ]
}
wp_update_seo_metaedit_posts

Update 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.

Ability IDmore-mcp/wp-update-seo-metaRequiresedit_posts
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_categories

Get 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.

Ability IDmore-mcp/wp-get-term-seo-metaRequiresmanage_categories
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_categories

Update 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.

Ability IDmore-mcp/wp-update-term-seo-metaRequiresmanage_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-only

Fetch 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.

Ability IDmore-mcp/seo-audit-meta-tagsRequiresread
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_options

Get the WordPress permalink structure (e.g. /%postname%/, /%year%/%monthnum%/%postname%/). Read-only.

Ability IDmore-mcp/wp-get-permalink-structureRequiresmanage_options
Parameter Schema0 parameters
{
  "type": "object",
  "properties": {}
}
wp_update_permalink_structureDestructive

Update 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.

Ability IDmore-mcp/wp-update-permalink-structureRequiresmanage_options
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "structure": {
      "type": "string",
      "description": "New permalink structure (e.g. /%postname%/)"
    }
  },
  "required": [
    "structure"
  ]
}
wp_get_post_revisionsRead-only

Get 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.

Ability IDmore-mcp/wp-get-post-revisionsRequiresread
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_revisionDestructive

Restore 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.

Ability IDmore-mcp/wp-restore-revisionRequiresedit_posts
Parameter Schema1 parameter
{
  "type": "object",
  "properties": {
    "revision_id": {
      "type": "integer"
    }
  },
  "required": [
    "revision_id"
  ]
}
ahrefs_domain_ratingmanage_options

Get 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.

Ability IDmore-mcp/ahrefs-domain-ratingRequiresmanage_options
semrush_domain_overviewmanage_options

Semrush 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.

Ability IDmore-mcp/semrush-domain-overviewRequiresmanage_options
semrush_organic_keywordsmanage_options

Keywords a domain ranks for in organic search, with position, search volume, CPC, and traffic share. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-organic-keywordsRequiresmanage_options
semrush_competitorsmanage_options

Organic competitors of a domain (sites competing for the same keywords) with their common-keyword counts. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-competitorsRequiresmanage_options
semrush_keyword_overviewmanage_options

Keyword overview: search volume, CPC, competition, and result count for a phrase in one database. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-keyword-overviewRequiresmanage_options
semrush_related_keywordsmanage_options

Keywords semantically related to a phrase, with volume and competition. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-related-keywordsRequiresmanage_options
semrush_keyword_difficultymanage_options

Keyword difficulty index (0 - 100) estimating how hard it is to rank for one or more phrases. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-keyword-difficultyRequiresmanage_options
semrush_question_keywordsmanage_options

Question-form keywords containing a phrase (who/what/how/…), with volume, useful for FAQ and passage targeting. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-question-keywordsRequiresmanage_options
semrush_url_keywordsmanage_options

Keywords a specific URL ranks for organically, with position and volume. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-url-keywordsRequiresmanage_options
semrush_backlinks_overviewmanage_options

Backlink profile summary for a domain: total backlinks, referring domains, referring IPs, and authority score. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-backlinks-overviewRequiresmanage_options
semrush_backlinks_listmanage_options

Individual backlinks pointing at a domain, with source URL, anchor, and first-seen date. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-backlinks-listRequiresmanage_options
semrush_referring_domainsmanage_options

Domains linking to a target, ranked by their authority, with backlink counts. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-referring-domainsRequiresmanage_options
semrush_backlink_anchorsmanage_options

Anchor texts used in backlinks to a target, with counts, reveals over-optimized or branded anchor patterns. Source: Semrush (costs API units). Read-only.

Ability IDmore-mcp/semrush-backlink-anchorsRequiresmanage_options
semrush_api_unitsmanage_options

Remaining Semrush API unit balance for the configured key. Read-only, does not itself cost units.

Ability IDmore-mcp/semrush-api-unitsRequiresmanage_options
dataforseo_serpmanage_options

Live Google organic SERP for a keyword: ranked results with position, title, URL, and snippet. Source: DataForSEO (consumes account credit). Read-only.

Ability IDmore-mcp/dataforseo-serpRequiresmanage_options
dataforseo_keyword_volumemanage_options

Search volume, CPC, and competition for one or more keywords (Google Ads data). Source: DataForSEO (consumes account credit). Read-only.

Ability IDmore-mcp/dataforseo-keyword-volumeRequiresmanage_options
dataforseo_ranked_keywordsmanage_options

Keywords a domain currently ranks for in organic search, with position and volume. Source: DataForSEO (consumes account credit). Read-only.

Ability IDmore-mcp/dataforseo-ranked-keywordsRequiresmanage_options
dataforseo_backlinks_summarymanage_options

Backlink profile summary for a target: total backlinks, referring domains, rank, and spam score. Source: DataForSEO (consumes account credit). Read-only.

Ability IDmore-mcp/dataforseo-backlinks-summaryRequiresmanage_options
dataforseo_referring_domainsmanage_options

Domains linking to a target, with backlink counts and domain rank. Source: DataForSEO (consumes account credit). Read-only.

Ability IDmore-mcp/dataforseo-referring-domainsRequiresmanage_options
dataforseo_onpage_instantmanage_options

Instant 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.

Ability IDmore-mcp/dataforseo-onpage-instantRequiresmanage_options
seranking_domain_overviewmanage_options

Domain overview in one regional database: organic/paid traffic, keyword counts, and estimated traffic cost. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-domain-overviewRequiresmanage_options
seranking_domain_overview_globalmanage_options

Global domain overview aggregating estimated organic metrics across all SE Ranking databases. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-domain-overview-globalRequiresmanage_options
seranking_domain_keywordsmanage_options

Keywords a domain ranks for organically, with position, volume, and traffic share. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-domain-keywordsRequiresmanage_options
seranking_domain_competitorsmanage_options

Organic competitors of a domain with common-keyword counts and overlap. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-domain-competitorsRequiresmanage_options
seranking_top_pagesmanage_options

Top-performing pages of a domain by estimated organic traffic and keyword count. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-top-pagesRequiresmanage_options
seranking_subdomainsmanage_options

Subdomains of a domain with their organic traffic and keyword counts. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-subdomainsRequiresmanage_options
seranking_keyword_overviewmanage_options

Keyword overview: volume, CPC, competition, and difficulty for a phrase. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-keyword-overviewRequiresmanage_options
seranking_keyword_comparemanage_options

Compare metrics for several keywords side by side (volume, CPC, difficulty). Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-keyword-compareRequiresmanage_options
seranking_related_keywordsmanage_options

Keywords semantically related to a phrase, with volume and difficulty. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-related-keywordsRequiresmanage_options
seranking_similar_keywordsmanage_options

Similar keywords sharing SERP results with a phrase. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-similar-keywordsRequiresmanage_options
seranking_question_keywordsmanage_options

Question-form keywords containing a phrase, with volume, for FAQ and AI-answer targeting. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-question-keywordsRequiresmanage_options
seranking_longtail_keywordsmanage_options

Long-tail keyword variations of a phrase, with volume and difficulty. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-longtail-keywordsRequiresmanage_options
seranking_backlinksmanage_options

Backlink profile summary for a domain: total backlinks, referring domains, and anchors overview. Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-backlinksRequiresmanage_options
seranking_domain_authoritymanage_options

Domain trust / authority scores (SE Ranking domain trust and page trust). Source: SE Ranking (consumes API credit). Read-only.

Ability IDmore-mcp/seranking-domain-authorityRequiresmanage_options
seranking_ai_visibilitymanage_options

AI-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.

Ability IDmore-mcp/seranking-ai-visibilityRequiresmanage_options
gsc_list_sitesmanage_options

List Search Console properties the connected Google account can access, with each property's permission level. Source: Google Search Console. Read-only.

Ability IDmore-mcp/gsc-list-sitesRequiresmanage_options
gsc_search_analyticsmanage_options

Query 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.

Ability IDmore-mcp/gsc-search-analyticsRequiresmanage_options
gsc_list_sitemapsmanage_options

List sitemaps submitted for a property, with submission state and last-download time. Source: Google Search Console. Read-only.

Ability IDmore-mcp/gsc-list-sitemapsRequiresmanage_options
gsc_get_sitemapmanage_options

Get details for one submitted sitemap: contents counts by type, warnings, and errors. Source: Google Search Console. Read-only.

Ability IDmore-mcp/gsc-get-sitemapRequiresmanage_options
gsc_inspect_urlmanage_options

Inspect a URL's index status in Google: coverage state, last crawl, canonical, mobile usability, and rich-result detection. Source: Google Search Console. Read-only.

Ability IDmore-mcp/gsc-inspect-urlRequiresmanage_options
ga4_list_accountsmanage_options

List Google Analytics accounts the connected account can access. Source: Google Analytics 4 Admin API. Read-only.

Ability IDmore-mcp/ga4-list-accountsRequiresmanage_options
ga4_list_propertiesmanage_options

List GA4 properties under an account. Source: Google Analytics 4 Admin API. Read-only.

Ability IDmore-mcp/ga4-list-propertiesRequiresmanage_options
ga4_get_propertymanage_options

Get one GA4 property's details: display name, time zone, currency, and create time. Source: Google Analytics 4 Admin API. Read-only.

Ability IDmore-mcp/ga4-get-propertyRequiresmanage_options
ga4_metadatamanage_options

List 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.

Ability IDmore-mcp/ga4-metadataRequiresmanage_options
ga4_run_reportmanage_options

Run a standard GA4 report: metrics by dimensions over a date range. Source: Google Analytics 4 Data API. Read-only.

Ability IDmore-mcp/ga4-run-reportRequiresmanage_options
ga4_run_pivot_reportmanage_options

Run a GA4 pivot report: metrics pivoted across one or more dimensions. Source: Google Analytics 4 Data API. Read-only.

Ability IDmore-mcp/ga4-run-pivot-reportRequiresmanage_options
ga4_realtime_reportmanage_options

Run a GA4 realtime report: active users and events in the last 30 minutes, by dimension. Source: Google Analytics 4 Data API. Read-only.

Ability IDmore-mcp/ga4-realtime-reportRequiresmanage_options
ga4_list_data_streamsmanage_options

List data streams (web/app) configured for a property, with their measurement IDs. Source: Google Analytics 4 Admin API. Read-only.

Ability IDmore-mcp/ga4-list-data-streamsRequiresmanage_options
ga4_list_conversion_eventsmanage_options

List conversion (key) events configured for a property. Source: Google Analytics 4 Admin API. Read-only.

Ability IDmore-mcp/ga4-list-conversion-eventsRequiresmanage_options
ga4_list_custom_dimensionsmanage_options

List custom dimensions defined for a property. Source: Google Analytics 4 Admin API. Read-only.

Ability IDmore-mcp/ga4-list-custom-dimensionsRequiresmanage_options
ga4_list_custom_metricsmanage_options

List custom metrics defined for a property. Source: Google Analytics 4 Admin API. Read-only.

Ability IDmore-mcp/ga4-list-custom-metricsRequiresmanage_options