AI Engine for WordPress

Free MCP server for WordPress: Claude and ChatGPT connect with OAuth. No account, cap or API key.

Should I use this

Quality & Safety

A
Description quality
99%
Schema completeness
80%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,273Tokens (tool definitions)
~906 BTypical response size
Significant attention impact (3.34% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "ai-engine": {
      "url": "https://connect.meowapps.com/mcp"
    }
  }
}

Remote endpoints

https://connect.meowapps.com/mcpstreamable-http

What it can do

Tool inventory

Tools (30)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢wp_get_posts(post_type, post_status, search, author, author_name, ...)

List posts, pages or another post type, newest first. Returns ID, title, status, excerpt and link for each, without the full content. Filter by post_type, post_status, search text, author (user ID or slug) or a date range. Returns 10 items unless limit is set; page with offset or paged.

Input Schema

{
  "type": "object",
  "properties": {
    "post_type": {
      "type": "string"
    },
    "post_status": {
      "type": "string"
    },
    "search": {
      "type": "string"
    },
    "author": {
      "type": "integer",
      "description": "Filter by author user ID."
    },
    "author_name": {
      "type": "string",
      "description": "Filter by author user slug (nicename). Ignored if author is set."
    },
    "author__not_in": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Exclude posts by these author user IDs."
    },
    "after": {
      "type": "string"
    },
    "before": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    },
    "offset": {
      "type": "integer"
    },
    "paged": {
      "type": "integer"
    }
  }
}
🟢wp_get_post(ID, content_format)

Get one post or page by ID: title, content, status, dates and permalink. Set content_format to "prose" to return the text without block markup.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer"
    },
    "content_format": {
      "type": "string",
      "enum": [
        "full",
        "prose"
      ],
      "description": "full (default) returns raw content; prose strips block-attribute JSON, keeping prose, headings and block markers."
    }
  },
  "required": [
    "ID"
  ]
}
🟢wp_get_post_snapshot(ID, include, exclude, content_format)

Get everything about one post by ID: all fields, custom fields, terms, featured image and author. Use include or exclude to limit the sections returned.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer",
      "description": "Post ID"
    },
    "include": {
      "type": "array",
      "description": "Optional: fields to include (default: all). Options: meta, terms, thumbnail, author",
      "items": {
        "type": "string"
      }
    },
    "exclude": {
      "type": "array",
      "description": "Optional: fields to exclude from post data. Options: content (useful for posts with huge content like many galleries)",
      "items": {
        "type": "string"
      }
    },
    "content_format": {
      "type": "string",
      "enum": [
        "full",
        "prose"
      ],
      "description": "full (default) returns raw content; prose strips block-attribute JSON (huge gallery blobs), keeping prose and block markers. Ignored if content is excluded."
    }
  },
  "required": [
    "ID"
  ]
}
🟢wp_count_posts(post_type)

Count posts by status (published, draft, scheduled, pending, private, trash) for one post type. The default post type is post.

Input Schema

{
  "type": "object",
  "properties": {
    "post_type": {
      "type": "string"
    }
  }
}
🟢wp_get_post_types

List the public post types on the site with their key and label, such as post, page or product.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢wp_get_post_meta(ID, key)

Get the custom fields of a post by ID. Pass key to read a single field; without it, all custom fields are returned.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer"
    },
    "key": {
      "type": "string"
    }
  },
  "required": [
    "ID"
  ]
}
🟢wp_get_comments(post_id, status, type, search, user_id, ...)

List comments with their post, author, content, date and approval status. Filter by post_id, status, search text, user_id or author_email. Returns 10 unless limit is set. With type set to "note", it lists the editor notes on posts, where an approval status of 1 means the note thread is resolved.

Input Schema

{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "integer"
    },
    "status": {
      "type": "string"
    },
    "type": {
      "type": "string",
      "description": "Filter by comment type, e.g. \"comment\", \"pingback\", or \"note\" (WP 6.9 editor Notes). Omit to return all types."
    },
    "search": {
      "type": "string"
    },
    "user_id": {
      "type": "integer",
      "description": "Filter by the registered user ID of the commenter."
    },
    "author_email": {
      "type": "string",
      "description": "Filter by the commenter email address."
    },
    "limit": {
      "type": "integer"
    },
    "offset": {
      "type": "integer"
    },
    "paged": {
      "type": "integer"
    }
  }
}
🟢wp_get_taxonomies(post_type)

List the taxonomies available for a post type, such as categories and tags.

Input Schema

{
  "type": "object",
  "properties": {
    "post_type": {
      "type": "string"
    }
  }
}
🟢wp_get_terms(taxonomy, search, parent, limit)

List the terms of a taxonomy (for example every category), optionally filtered by search text or parent term.

Input Schema

{
  "type": "object",
  "properties": {
    "taxonomy": {
      "type": "string"
    },
    "search": {
      "type": "string"
    },
    "parent": {
      "type": "integer"
    },
    "limit": {
      "type": "integer"
    }
  },
  "required": [
    "taxonomy"
  ]
}
🟢wp_count_terms(taxonomy)

Count the terms in a taxonomy.

Input Schema

{
  "type": "object",
  "properties": {
    "taxonomy": {
      "type": "string"
    }
  },
  "required": [
    "taxonomy"
  ]
}
🟢wp_get_post_terms(ID, taxonomy)

List the terms attached to a post, optionally for one taxonomy only.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer"
    },
    "taxonomy": {
      "type": "string"
    }
  },
  "required": [
    "ID"
  ]
}
🟢wp_get_media(search, author, author_name, after, before, ...)

List items in the Media Library with their ID, title and URL. Filter by search text, uploader or date range. Returns 10 unless limit is set.

Input Schema

{
  "type": "object",
  "properties": {
    "search": {
      "type": "string"
    },
    "author": {
      "type": "integer",
      "description": "Filter by uploader user ID."
    },
    "author_name": {
      "type": "string",
      "description": "Filter by uploader user slug (nicename). Ignored if author is set."
    },
    "after": {
      "type": "string"
    },
    "before": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    }
  }
}
🟢wp_count_media(after, before)

Count the items in the Media Library, optionally within a date range.

Input Schema

{
  "type": "object",
  "properties": {
    "after": {
      "type": "string"
    },
    "before": {
      "type": "string"
    }
  }
}
🟢wp_list_block_patterns(search, category, include_content, limit)

List the block patterns available on the site (ready-made layouts from WordPress, the theme and plugins), with name, title, categories and description. Filter by search text or category. Set include_content to true to also get each pattern's block markup, which can be placed in a post with Update post or Edit post text.

Input Schema

{
  "type": "object",
  "properties": {
    "search": {
      "type": "string",
      "description": "Case-insensitive filter on title, name, description, and keywords."
    },
    "category": {
      "type": "string",
      "description": "Pattern category slug, e.g. \"featured\", \"call-to-action\", \"gallery\", \"testimonials\"."
    },
    "include_content": {
      "type": "boolean",
      "description": "Include each match's raw block markup (default false; can be large)."
    },
    "limit": {
      "type": "integer",
      "description": "Max patterns to return (default 50, max 500)."
    }
  }
}
🟡wp_create_post(post_title, post_content, post_excerpt, post_status, post_type, ...)

Create a post, page or item of another post type. post_title is required. post_content accepts HTML, blocks or Markdown. The status is draft unless post_status says otherwise, and the type is post unless post_type says otherwise. meta_input sets custom fields.

Input Schema

{
  "type": "object",
  "properties": {
    "post_title": {
      "type": "string"
    },
    "post_content": {
      "type": "string"
    },
    "post_excerpt": {
      "type": "string"
    },
    "post_status": {
      "type": "string"
    },
    "post_type": {
      "type": "string"
    },
    "post_name": {
      "type": "string"
    },
    "meta_input": {
      "type": "object",
      "description": "Custom fields as key/value pairs. Keys starting with an underscore (WordPress internals) are refused, except the Yoast SEO title, description and focus keyphrase."
    }
  },
  "required": [
    "post_title"
  ]
}
🔴wp_update_post(ID, fields, meta_input, schedule_for)

Update an existing post by ID: title, content, excerpt, status, slug, date or custom fields. Pass the fields to change in fields and custom fields in meta_input. Set schedule_for to schedule publication. Passing post_category replaces all of the post's categories.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer",
      "description": "The ID of the post to update."
    },
    "fields": {
      "type": "object",
      "properties": {
        "post_title": {
          "type": "string"
        },
        "post_content": {
          "type": "string"
        },
        "post_status": {
          "type": "string"
        },
        "post_name": {
          "type": "string"
        },
        "post_excerpt": {
          "type": "string"
        },
        "post_category": {
          "type": "array",
          "items": {
            "type": "integer"
          }
        }
      },
      "additionalProperties": true
    },
    "meta_input": {
      "type": "object",
      "description": "Custom fields as key/value pairs. Keys starting with an underscore (WordPress internals) are refused, except the Yoast SEO title, description and focus keyphrase."
    },
    "schedule_for": {
      "type": "string",
      "description": "Schedule post for future publication. Provide local datetime (e.g., \"2026-02-02 09:00:00\"). Automatically sets status to \"future\" and calculates GMT from WordPress timezone."
    }
  },
  "required": [
    "ID"
  ]
}
🔴wp_alter_post(ID, field, search, replace, regex, ...)

Find and replace text inside one field of a post (for example its content), without sending the whole content again. Supports regular expressions with regex set to true and modifiers in flags.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer",
      "description": "Post ID."
    },
    "field": {
      "type": "string",
      "description": "Field to modify: post_content, post_excerpt, or post_title."
    },
    "search": {
      "type": "string",
      "description": "Text to search for, or (with regex=true) a bare PCRE pattern without delimiters, e.g. <!-- /wp:paragraph -->\\s*$"
    },
    "replace": {
      "type": "string",
      "description": "Replacement text. In regex mode, backreferences like $1 / \\1 are supported."
    },
    "regex": {
      "type": "boolean",
      "description": "Treat search as a regex pattern (default: false)."
    },
    "flags": {
      "type": "string",
      "description": "Optional PCRE modifier letters applied in regex mode, e.g. \"i\" (case-insensitive), \"s\" (dotall), \"m\" (multiline). Allowed: i, m, s, x, u, A, D, S, U, X, J."
    }
  },
  "required": [
    "ID",
    "field",
    "search",
    "replace"
  ]
}
🔴wp_write_blocks(ID, blocks, mode)

Write block editor content to an existing post from a list of block specs. Types and fields: paragraph (content), heading (content, level 1-6), list (items, ordered), quote (content, citation), image (url, alt, caption), buttons (buttons: text, url), group (blocks), columns (columns: arrays of blocks), separator, spacer (height), code (content), html (content). mode is replace (default), append or prepend.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer",
      "description": "Target post/page ID (create it first with wp_create_post)."
    },
    "blocks": {
      "type": "array",
      "description": "Ordered array of block specs. Each item is an object with a \"type\" and the fields for that type (see the tool description).",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "mode": {
      "type": "string",
      "enum": [
        "replace",
        "append",
        "prepend"
      ],
      "description": "replace (default) overwrites post_content; append/prepend add the blocks to the existing content."
    }
  },
  "required": [
    "ID",
    "blocks"
  ]
}
🔴wp_delete_post(ID)

Move a post, page or item of another post type to the trash by ID. It can be restored from the trash in WordPress.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer"
    }
  },
  "required": [
    "ID"
  ]
}
🔴wp_set_featured_image(post_id, media_id)

Set the featured image of a post to a Media Library item, or remove it when media_id is empty.

Input Schema

{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "integer"
    },
    "media_id": {
      "type": "integer"
    }
  },
  "required": [
    "post_id"
  ]
}
🟡wp_create_term(taxonomy, term_name, slug, description, parent)

Create a term in a taxonomy, such as a new category or tag, with an optional slug, description and parent.

Input Schema

{
  "type": "object",
  "properties": {
    "taxonomy": {
      "type": "string"
    },
    "term_name": {
      "type": "string"
    },
    "slug": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "parent": {
      "type": "integer"
    }
  },
  "required": [
    "taxonomy",
    "term_name"
  ]
}
🔴wp_update_term(term_id, taxonomy, name, slug, description, ...)

Update the name, slug, description or parent of an existing term.

Input Schema

{
  "type": "object",
  "properties": {
    "term_id": {
      "type": "integer"
    },
    "taxonomy": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "slug": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "parent": {
      "type": "integer"
    }
  },
  "required": [
    "term_id",
    "taxonomy"
  ]
}
🔴wp_add_post_terms(ID, taxonomy, terms, append)

Attach terms to a post. With append set to true they are added to the existing terms; otherwise they replace all terms of that taxonomy on the post.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer"
    },
    "taxonomy": {
      "type": "string"
    },
    "terms": {
      "type": "array",
      "items": {
        "type": "integer"
      }
    },
    "append": {
      "type": "boolean"
    }
  },
  "required": [
    "ID",
    "terms"
  ]
}
🟡wp_upload_media(url, base64, filename, title, description, ...)

Add a file to the Media Library, either from a public URL that WordPress downloads or from base64 content with a filename. Optional title, description and alt text.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL to download the file from. Use this OR base64/filename."
    },
    "base64": {
      "type": "string",
      "description": "Base64-encoded file content. Must be used together with filename."
    },
    "filename": {
      "type": "string",
      "description": "Filename with extension (e.g. photo.jpg). Required when using base64."
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "alt": {
      "type": "string"
    }
  }
}
🔴wp_update_media(ID, title, caption, description, alt)

Update the title, caption, description or alt text of a Media Library item.

Input Schema

{
  "type": "object",
  "properties": {
    "ID": {
      "type": "integer"
    },
    "title": {
      "type": "string"
    },
    "caption": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "alt": {
      "type": "string"
    }
  },
  "required": [
    "ID"
  ]
}
🟡wp_create_comment(post_id, comment_content, comment_author, comment_author_email, comment_author_url, ...)

Add a comment to a post. post_id and comment_content are required; author name, email, URL and approval status are optional.

Input Schema

{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "integer"
    },
    "comment_content": {
      "type": "string"
    },
    "comment_author": {
      "type": "string"
    },
    "comment_author_email": {
      "type": "string"
    },
    "comment_author_url": {
      "type": "string"
    },
    "comment_approved": {
      "type": "string"
    }
  },
  "required": [
    "post_id",
    "comment_content"
  ]
}
🔴wp_update_comment(comment_ID, fields)

Update a comment by ID: its content or its approval status (approve, hold or mark as spam).

Input Schema

{
  "type": "object",
  "properties": {
    "comment_ID": {
      "type": "integer"
    },
    "fields": {
      "type": "object",
      "properties": {
        "comment_content": {
          "type": "string"
        },
        "comment_approved": {
          "type": "string"
        }
      },
      "additionalProperties": true
    }
  },
  "required": [
    "comment_ID"
  ]
}
🟡wp_create_note(post_id, content, anchor_text, block_index, parent_id)

Add an editor note to a block of a post (WordPress 6.9 or later), as shown in the editor's Notes panel. Locate the block with anchor_text (a short exact snippet of its text) or block_index, or reply to an existing note with parent_id.

Input Schema

{
  "type": "object",
  "properties": {
    "post_id": {
      "type": "integer",
      "description": "The post to annotate. Not needed for a reply."
    },
    "content": {
      "type": "string",
      "description": "The note text."
    },
    "anchor_text": {
      "type": "string",
      "description": "A short exact snippet of text from the block the note is about. The first block containing it is used."
    },
    "block_index": {
      "type": "integer",
      "description": "Alternative to anchor_text: 0-based position among the top-level blocks."
    },
    "parent_id": {
      "type": "integer",
      "description": "Reply to this note instead of starting a new thread."
    }
  },
  "required": [
    "content"
  ]
}
🔴wp_update_note(note_id, content, status)

Edit the text of an editor note, or mark its thread as resolved or reopen it.

Input Schema

{
  "type": "object",
  "properties": {
    "note_id": {
      "type": "integer"
    },
    "content": {
      "type": "string",
      "description": "New text for the note."
    },
    "status": {
      "type": "string",
      "enum": [
        "resolved",
        "open"
      ],
      "description": "Resolve or reopen the thread (top-level notes only)."
    }
  },
  "required": [
    "note_id"
  ]
}
🟢wp_get_site_info

Get the site's name, tagline, address and time zone.

Input Schema

{
  "type": "object",
  "properties": {}
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded30 tools