AI Landing Pages
WordPress plugin: create landing page drafts from an AI client over MCP, validated against a page-type schema and rendered as core blocks.
Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/innaplx/ai-landing-pages/archive/refs/heads/main.zipA WordPress plugin that lets marketing create landing pages from their own AI client, like Claude, over MCP. The AI sends content only. The plugin checks it against a page type schema, builds the page from core blocks and saves it as a draft that looks like the active theme and is edited in the normal block editor.
The design and the reasoning behind it are in SOLUTION.md.
Requirements
- WordPress 6.9 or later (the Abilities API is in core). Tested on 7.1 with Twenty Twenty-Five and Twenty Twenty-Four.
- The WordPress MCP Adapter plugin, active.
- Node.js, for the
@automattic/mcp-wordpress-remoteproxy that Claude Desktop runs. - Claude Desktop, or any other MCP client.
Install
- Copy this folder to
wp-content/plugins/ai-landing-pages. - Install and activate the MCP Adapter plugin.
- Activate AI Landing Pages.
The MCP endpoint is then http://YOUR-SITE/wp-json/mcp/mcp-adapter-default-server.
Create a user and an Application Password
- Create a WordPress user with the Editor role (any role with
edit_pagesworks). Each person should use their own user, so pages are attributed to them. - Go to Users > Profile > Application Passwords, add a name such as "Claude", and copy the password. It is shown only once.
On a local site without HTTPS, Application Passwords may need to be enabled first (for example, set WP_ENVIRONMENT_TYPE to local).
Connect Claude Desktop
Open Settings > Developer > Edit Config and add:
{
"mcpServers": {
"wordpress-ai-landing": {
"command": "npx",
"args": ["-y", "@automattic/mcp-wordpress-remote@latest"],
"env": {
"WP_API_URL": "http://YOUR-SITE/wp-json/mcp/mcp-adapter-default-server",
"WP_API_USERNAME": "your-wp-username",
"WP_API_PASSWORD": "xxxx xxxx xxxx xxxx xxxx xxxx",
"OAUTH_ENABLED": "false"
}
}
}
}
Restart Claude Desktop fully (quit it from the tray, not just the window). The server should show as running under Settings > Developer.
Try it
What landing page types can you create on our WordPress site?
Create a webinar landing page for "Scaling Onboarding with AI" on November 18 at 17:00 CET.
Speakers: Dana Levi, Head of Product Adoption, and Tom Cohen, Solutions Architect.
Registration link: https://example.com/register. Add an agenda with 4 points and 3 FAQ questions.
Create the same webinar page, but add a testimonials section and a pricing table.
The last one asks for sections the type doesn't have. Claude should build the page without them and say why.
Every page is saved as a draft. Claude returns an edit link and a preview link; review and publish in WordPress.
Add a page type
If the new type only reuses existing sections (hero, speaker, agenda, faq, cta), drop a JSON file in page-types/. It shows up in list-page-types right away, with no code change. Reused sections must keep the fields their renderer needs:
{
"slug": "product-launch",
"label": "Product launch",
"description": "Announces a new product and sends people to try it.",
"sections": {
"hero": {
"label": "Hero",
"description": "Product name, launch date and a main button.",
"min": 1, "max": 1, "position": "first",
"fields": {
"headline": { "type": "string", "required": true, "max_length": 80 },
"subheadline": { "type": "string", "required": false, "max_length": 200 },
"date_time": { "type": "string", "required": true, "max_length": 60 },
"button_label": { "type": "string", "required": true, "max_length": 30 },
"button_url": { "type": "url", "required": true }
}
},
"faq": {
"label": "FAQ item",
"description": "One question and answer. Optional; repeat for each question.",
"min": 0, "max": 6,
"fields": {
"question": { "type": "string", "required": true, "max_length": 120 },
"answer": { "type": "text", "required": true, "max_length": 400 }
}
},
"cta": {
"label": "Closing call to action",
"description": "Final push to try the product.",
"min": 1, "max": 1, "position": "last",
"fields": {
"headline": { "type": "string", "required": true, "max_length": 80 },
"button_label": { "type": "string", "required": true, "max_length": 30 },
"button_url": { "type": "url", "required": true }
}
}
}
}
sections: the section types the page may use, keyed by section name.min/max: how many times the section may appear.min: 0makes it optional,maxabove 1 makes it repeatable.position: optional,firstorlast.fields: each field has atype(string,textfor longer text with paragraphs,urlorlist),required, and limits:max_length, andmin_items/max_itemsfor lists.
A new kind of section (say, a download form) needs the JSON plus one render_<name> method in includes/class-page-builder.php.
Project structure
ai-landing-pages.php Plugin bootstrap, checks for the Abilities API, loads the CSS on landing pages only
includes/
class-abilities.php The three abilities exposed over MCP
class-registry.php Loads page types from page-types/*.json
class-validator.php Checks the AI's input against the schema and sanitizes it
class-page-builder.php Turns sections into core blocks and saves the draft
page-types/
webinar.json The example page type
assets/
alp.css Layout-only styles built on theme presets
SOLUTION.md Solution document