Lax Abilities Toolkit
A developer-friendly WordPress toolkit that exposes content management as Abilities via the WP Abilities API. Supports any post type or taxonomy via filter hooks.
by Lax Mariappan · github.com/laxmariappan/lax-abilities-toolkit · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/laxmariappan/lax-abilities-toolkit/archive/refs/heads/main.zipConnect your WordPress site to AI assistants — Claude Desktop, Cursor, VS Code, and any MCP-compatible client — so they can read and manage your content through natural conversation.
Built on the WP Abilities API (WordPress 6.9+) and the MCP Adapter plugin, Lax Abilities Toolkit exposes your posts, pages, categories, tags, and media library as structured tools that AI clients understand natively.
What you can do
Once connected, your AI assistant can:
- Write and publish — draft posts and pages, schedule them for a future date, set featured images
- Edit content — update titles, body, status, categories, tags, and metadata
- Browse your library — list posts by status, filter media by type, look up a single item by ID
- Manage taxonomies — create categories and tags, list them with post counts, delete unused ones
- Handle media — browse the media library, retrieve image URLs and dimensions, delete files
- Answer site questions — name, URL, WordPress version, timezone, language, admin email
Everything is scoped to the logged-in user's WordPress capabilities, so the AI can only do what that user account is allowed to do.
Requirements
- WordPress 6.9+ (the Abilities API ships in core)
- PHP 7.4+
- MCP Adapter plugin — exposes abilities to AI clients over HTTP
- Node.js LTS — needed on the computer running the AI client (includes
npx)
Installation
- Download the latest release zip from the Releases page.
- In WordPress admin, go to Plugins → Add New → Upload Plugin and upload the zip.
- Activate Lax Abilities Toolkit.
- Install and activate the MCP Adapter plugin the same way.
- Go to Settings → Lax Abilities — the setup guide is right there on that page.
Connecting to an AI client
Step 1 — Create an Application Password
Application Passwords let AI clients log in to your site securely without using your main WordPress password.
- In WordPress admin, click your name in the top-right corner, then Edit Profile (or go to Users → Profile).
- Scroll to the Application Passwords section near the bottom.
- Type a name — something like
Claude Desktop— and click Add New Application Password. - Copy the password shown — it looks like
xxxx xxxx xxxx xxxx xxxx xxxx. You won't see it again.
The Settings → Lax Abilities page has a password field that auto-fills all config snippets below. Paste your password there to get ready-to-use configs.
Step 2 — Configure your AI client
Pick the client you use:
Claude Desktop
- Download Claude Desktop if you haven't already.
- Open (or create) the config file for your OS:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
- macOS:
- Add the entry below inside
"mcpServers". If the file is empty, paste the whole block:
{
"mcpServers": {
"my-wordpress-site": {
"command": "npx",
"args": ["-y", "@automattic/mcp-wordpress-remote"],
"env": {
"WP_API_URL": "https://yoursite.com/wp-json/mcp/mcp-adapter-default-server",
"WP_API_USERNAME": "your-username",
"WP_API_PASSWORD": "your-application-password"
}
}
}
}
- Replace the three values with your actual site URL, WordPress username, and the application password from Step 1.
- Fully quit Claude Desktop (
Cmd+Qon Mac /Alt+F4on Windows) and reopen it. - A hammer icon will appear in the chat toolbar — that's your WordPress tools.
Cursor
- Download Cursor if you haven't already.
- Open or create
~/.cursor/mcp.json(global) or.cursor/mcp.jsonin your project root:
{
"mcpServers": {
"my-wordpress-site": {
"command": "npx",
"args": ["-y", "@automattic/mcp-wordpress-remote"],
"env": {
"WP_API_URL": "https://yoursite.com/wp-json/mcp/mcp-adapter-default-server",
"WP_API_USERNAME": "your-username",
"WP_API_PASSWORD": "your-application-password"
}
}
}
}
- Reload Cursor:
Cmd/Ctrl + Shift + P→ Developer: Reload Window. - The server appears in Cursor Settings → MCP.
VS Code
- Install VS Code 1.99 or later (MCP support is built in).
- Create
.vscode/mcp.jsonin your project root:
{
"servers": {
"my-wordpress-site": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@automattic/mcp-wordpress-remote"],
"env": {
"WP_API_URL": "https://yoursite.com/wp-json/mcp/mcp-adapter-default-server",
"WP_API_USERNAME": "your-username",
"WP_API_PASSWORD": "your-application-password"
}
}
}
}
- VS Code discovers the server automatically — no restart needed.
- Open GitHub Copilot Chat (or any MCP-aware extension) to see the WordPress tools.
Other MCP clients
Set these three environment variables, then run the bridge:
export WP_API_URL="https://yoursite.com/wp-json/mcp/mcp-adapter-default-server"
export WP_API_USERNAME="your-username"
export WP_API_PASSWORD="your-application-password"
npx -y @automattic/mcp-wordpress-remote
Step 3 — Start a conversation
Once connected, paste this starter prompt to orient your AI and let it discover what it can do:
I've connected my WordPress site to you via MCP using the Lax Abilities Toolkit plugin.
Site: My Site Name (https://yoursite.com)
My WordPress username: your-username
You have access to abilities to create and manage posts, pages, categories, tags, and media on my site.
Please start by discovering all available abilities using your MCP tools, then give me a brief summary of what you can help me do.
The Settings → Lax Abilities page generates a pre-filled version of this prompt with your actual site name, URL, and username — just copy and paste.
Ability Groups
From Settings → Lax Abilities → Ability Groups, you can enable or disable entire groups of abilities. For example, you can turn off media abilities if you only want the AI to manage written content, or disable site-info if you prefer to keep that private.
Changes take effect immediately — no plugin reactivation needed.
All built-in abilities
Posts
| Ability | Description |
|---|---|
lax-abilities/create-post |
Create a post; supports scheduling, featured image, categories, tags |
lax-abilities/update-post |
Update title, content, status, date, and metadata |
lax-abilities/list-posts |
List posts filtered by status (draft, publish, future, etc.) |
lax-abilities/get-post |
Full details of a single post by ID |
lax-abilities/delete-post |
Move a post to trash |
Pages
| Ability | Description |
|---|---|
lax-abilities/create-page |
Create a page with parent and template support |
lax-abilities/update-page |
Update a page |
lax-abilities/list-pages |
List pages |
lax-abilities/get-page |
Full details of a single page by ID |
lax-abilities/delete-page |
Move a page to trash |
Categories
| Ability | Description |
|---|---|
lax-abilities/create-category |
Create a category (returns existing data if name already exists) |
lax-abilities/list-categories |
List all categories with IDs, slugs, and post counts |
lax-abilities/delete-category |
Permanently delete a category by ID |
Tags
| Ability | Description |
|---|---|
lax-abilities/create-tag |
Create a tag (returns existing data if name already exists) |
lax-abilities/list-tags |
List all tags with IDs, slugs, and post counts |
lax-abilities/delete-tag |
Permanently delete a tag by ID |
Media
| Ability | Description |
|---|---|
lax-abilities/list-media |
List media items with URLs, dimensions, alt text; filter by MIME type or parent post |
lax-abilities/get-media |
Full details of a single attachment including all registered image sizes |
lax-abilities/delete-media |
Permanently delete a media attachment and its associated files |
Site
| Ability | Description |
|---|---|
lax-abilities/site-info |
Site name, URL, tagline, WordPress version, timezone, language, admin email |
Scheduling posts
create-post and update-post accept an optional publish_date field in YYYY-MM-DD HH:MM:SS format (site timezone). When the date is in the future the post status is automatically set to future. The response includes scheduled_for and scheduled_for_gmt so the AI can confirm exactly when it will go live.
{
"title": "My Upcoming Post",
"content": "Hello world.",
"publish_date": "2025-09-01 09:00:00"
}
Developer: Extending with custom post types
Register any post type with the lax_abilities_registered_post_types filter. The plugin generates create, update, list, get, and delete abilities automatically.
add_filter( 'lax_abilities_registered_post_types', function( $types ) {
$types['product'] = array(
'label' => 'Product',
'plural' => 'Products',
'capability_type' => 'product',
'taxonomies' => array( 'product_cat', 'product_tag' ),
'supports_schedule' => false,
);
return $types;
} );
// Registers: lax-abilities/create-product, lax-abilities/update-product,
// lax-abilities/list-products, lax-abilities/get-product,
// lax-abilities/delete-product
Only post types with public = true are shown in the admin UI and registered as abilities. Internal WordPress types (nav menus, patterns, templates, etc.) are automatically excluded.
Post type config options
| Key | Type | Default | Description |
|---|---|---|---|
label |
string | derived from slug | Singular label |
plural |
string | label + "s" | Plural label |
capability_type |
string | post type slug | Used to derive publish_{type}s cap |
taxonomies |
string[] | [] |
Taxonomy slugs; generates {taxonomy}_ids input fields |
supports_parent |
bool | false |
Adds parent_id field |
supports_template |
bool | false |
Adds template field |
supports_schedule |
bool | true |
Adds publish_date scheduling field |
Developer: Extending with custom taxonomies
add_filter( 'lax_abilities_registered_taxonomies', function( $taxonomies ) {
$taxonomies['product_cat'] = array(
'label' => 'Product Category',
'plural' => 'Product Categories',
'hierarchical' => true,
'ability_slug' => 'product-category',
);
return $taxonomies;
} );
// Registers: lax-abilities/create-product-category
// lax-abilities/list-product-categories
// lax-abilities/delete-product-category
Only taxonomies with publicly_queryable or show_ui set to true are included.
Developer: Extra fields and meta
Add fields to the create/update schema
add_filter( 'lax_abilities_input_schema_product', function( $schema, $post_type ) {
$schema['properties']['price'] = array(
'type' => 'string',
'description' => 'Product price.',
);
return $schema;
}, 10, 2 );
Persist extra fields before insert/update
add_filter( 'lax_abilities_post_data_product', function( $post_data, $params, $post_type ) {
if ( isset( $params['price'] ) ) {
$post_data['meta_input']['_price'] = sanitize_text_field( $params['price'] );
}
return $post_data;
}, 10, 3 );
Extend the response
// create/update responses
add_filter( 'lax_abilities_post_response_product', function( $response, $post ) {
$response['price'] = get_post_meta( $post->ID, '_price', true );
return $response;
}, 10, 2 );
// list items
add_filter( 'lax_abilities_list_item_product', function( $item, $post, $post_type ) {
$item['price'] = get_post_meta( $post->ID, '_price', true );
return $item;
}, 10, 3 );
// single-item detail
add_filter( 'lax_abilities_post_detail_product', function( $item, $post, $post_type ) {
$item['price'] = get_post_meta( $post->ID, '_price', true );
$item['sku'] = get_post_meta( $post->ID, '_sku', true );
return $item;
}, 10, 3 );
Filter reference
| Filter | Args | Description |
|---|---|---|
lax_abilities_registered_post_types |
$types |
Add or modify post type configurations |
lax_abilities_registered_taxonomies |
$taxonomies |
Add or modify taxonomy configurations |
lax_abilities_input_schema_{post_type} |
$schema, $post_type |
Extend create/update input schema |
lax_abilities_post_data_{post_type} |
$post_data, $params, $post_type |
Modify post data before insert/update |
lax_abilities_post_response_{post_type} |
$response, $post |
Extend create/update response |
lax_abilities_list_item_{post_type} |
$item, $post, $post_type |
Extend individual list items |
lax_abilities_post_detail_{post_type} |
$item, $post, $post_type |
Extend single-item get response |
License
GPL v2 or later.