Massblogger MCP Server
Connect Claude, Cursor, OpenClaw, Windsurf, or any MCP-compatible agent to your WordPress sites. The agent manages everything — posts, pages, categories, tags, media, users, settings, and comments — without you having to copy-paste HTML or switch tabs.
Quick start — hosted endpoint
The fastest way is to point your agent at the hosted MCP server. No local server needed.
MCP server: https://www.massblogger.com/api/mcp Authorization: Bearer <your MCP token>
Generate your token in Massblogger → Settings → Agentic SEO → Hosted MCP access. Each token is scoped to a single user account and its websites.
Claude — CLI (claude.ai)
The easiest way if you use Claude on the command line. Two commands and you're done — Claude will open a browser tab to authenticate automatically.
npm install -g @anthropic-ai/claude-code first, then follow the steps below.Step 1 — Remove any old Massblogger connection (safe to skip if first time)
claude mcp remove massblogger
Step 2 — Add the Massblogger MCP server
claude mcp add --transport http massblogger https://www.massblogger.com/api/mcp
Step 3 — Start Claude and verify
claude # Then ask Claude: "list my websites"
When you run the add command, Claude will open a browser window and ask you to sign in to Massblogger to grant access. No manual token copy-pasting needed. Once authorised, Claude can manage all your WordPress sites from the terminal.
Claude Desktop
Claude Desktop currently works best through mcp-remote. Add this to claude_desktop_config.json:
{
"mcpServers": {
"massblogger": {
"command": "npx",
"args": [
"-y",
"mcp-remote@0.1.38",
"https://www.massblogger.com/api/mcp",
"--resource",
"https://www.massblogger.com/api/mcp",
"--header",
"Authorization:${MASSBLOGGER_AUTH_HEADER}"
],
"env": {
"MASSBLOGGER_AUTH_HEADER": "Bearer <your MCP token>"
}
}
}
}Use the www host exactly as shown. After saving, restart Claude Desktop and run list_websites as your first tool call to confirm the connection.
Cursor
Use the same mcp-remote config as Claude Desktop in your Cursor MCP settings:
{
"mcpServers": {
"massblogger": {
"command": "npx",
"args": [
"-y",
"mcp-remote@0.1.38",
"https://www.massblogger.com/api/mcp",
"--resource",
"https://www.massblogger.com/api/mcp",
"--header",
"Authorization:${MASSBLOGGER_AUTH_HEADER}"
],
"env": {
"MASSBLOGGER_AUTH_HEADER": "Bearer <your MCP token>"
}
}
}
}OpenClaw
OpenClaw can connect directly to the hosted MCP server. Replace YOUR_MCP_TOKEN with the token from Massblogger Settings:
openclaw config set mcpServers.massblogger.url "https://www.massblogger.com/api/mcp" openclaw config set mcpServers.massblogger.headers.Authorization "Bearer YOUR_MCP_TOKEN" openclaw config set mcpServers.massblogger.name "Massblogger"
If your OpenClaw version uses env vars instead of headers, use the fallback token header:
openclaw config set mcpServers.massblogger.url "https://www.massblogger.com/api/mcp" openclaw config set mcpServers.massblogger.env.x-massblogger-mcp-token "YOUR_MCP_TOKEN"
After configuration, restart OpenClaw and run list_websites to verify the connection.
Windsurf and other MCP clients
Any client that supports direct HTTP MCP can use the hosted MCP server and pass the token in the Authorization header (or as x-massblogger-mcp-token if the client doesn't support custom headers).
# Windsurf mcp_config.json
{
"mcpServers": {
"massblogger": {
"serverUrl": "https://www.massblogger.com/api/mcp",
"headers": {
"Authorization": "Bearer <your MCP token>"
}
}
}
}
# Fallback — some clients only support env vars:
x-massblogger-mcp-token: <your MCP token>Local / self-hosted MCP server
If you run Massblogger yourself, you can also launch the MCP server locally (stdio mode) and scope it to a single user:
MASSBLOGGER_MCP_USER_EMAIL="you@example.com" npm run mcp:agentic-seo
Then point your MCP client at the local stdio process instead of the HTTP endpoint:
# Claude Desktop / Cursor — local stdio config
{
"mcpServers": {
"massblogger-local": {
"command": "node",
"args": ["scripts/mcp-agentic-seo.mjs"],
"cwd": "/path/to/your/massblogger",
"env": {
"MASSBLOGGER_MCP_USER_EMAIL": "you@example.com"
}
}
}
}
# OpenClaw — local stdio config
openclaw config set mcpServers.massblogger-local.command "node"
openclaw config set mcpServers.massblogger-local.args '["scripts/mcp-agentic-seo.mjs"]'
openclaw config set mcpServers.massblogger-local.env.MASSBLOGGER_MCP_USER_EMAIL "you@example.com"Prerequisites & WordPress permissions
- WordPress Application Password: the stored
wpAppPasswordmust belong to a user with the Administrator or Editor role. Author-level credentials can create and edit their own posts but cannot restore trashed content, manage plugins, or modify other users' posts. Generate it in WordPress under Users → Profile → Application Passwords. - Trash operations (
restore_wordpress_post,restore_wordpress_page): require Editor or Administrator role. The WordPress REST API blocks status updates on trashed items for lower-privilege users. If you see an "Unauthorized" error on restore, check that the Application Password belongs to an Editor or Administrator account. - Plugin management (
activate_wordpress_plugin,deactivate_wordpress_plugin,list_wordpress_plugins): requires Administrator role and WordPress 5.5+. - User management (
create_wordpress_user,delete_wordpress_user): requires Administrator role. - Yoast SEO fields (
metaTitle,metaDescription): require the Yoast SEO plugin installed on the WordPress site. - Menu write operations (
create_wordpress_menu,add_wordpress_menu_item, etc.): require a plugin that exposes the WP REST API menus endpoint, such as WP REST API Menus or WordPress 6.x+ Full Site Editing. - Webhook sites: must have webhook delivery enabled in Massblogger website settings.
- Next.js / REST sites: must be connected in Massblogger so saved posts are accessible via the existing API.
- MCP token: generate in Massblogger Settings → Agentic SEO → Hosted MCP access. No separate API key needed. The token is scoped to your account only.
Partial updates — no full body required
Every update tool is designed for surgical changes. You only send the fields you want to modify:
// Change only the title and status of post 42
{
"name": "update_post",
"arguments": {
"website": "myblog.com",
"wpPostId": 42,
"title": "10 Best Lightweight Camping Stoves in 2026",
"status": "publish"
}
}
// Change only the Yoast meta description
{
"name": "update_post",
"arguments": {
"website": "myblog.com",
"wpPostId": 42,
"metaDescription": "We tested 10 stoves so you don't have to. Here's what we found."
}
}Fields you don't include are left unchanged. Use get_wordpress_post first if the agent needs to read the existing content before making changes.
Full tool catalog
WordPress — Posts
list_wordpress_postsList posts with optional search, status, category, and tag filters. Returns id, title, slug, status, dates, categories, and tags.get_wordpress_postFetch full raw HTML content + all metadata for a single post. Use this before any update so you have the current state.create_postCreate a new post. Send only the fields you need — title, content, status, categories, tags, featured image, Yoast meta, scheduled date, etc.update_postUpdate any subset of a post's fields without sending the full HTML body. Only supply what you want to change.delete_wordpress_postMove a post to trash, or permanently delete it with force: true.restore_wordpress_postRestore a post from trash back to draft or publish.WordPress — Pages
list_wordpress_pagesList pages with optional search, status, and parent filters.get_wordpress_pageFetch full raw HTML content + all metadata for a single page.create_wordpress_pageCreate a new page with content, status, parent hierarchy, menu order, featured image, and Yoast meta.update_wordpress_pageUpdate any subset of a page's fields. No need to resend the full body.delete_wordpress_pageTrash or permanently delete a page.restore_wordpress_pageRestore a page from trash back to draft or publish.WordPress — Categories
list_wordpress_categoriesList all categories with post counts, descriptions, parent IDs, and slugs.create_wordpress_categoryCreate a new category, optionally nested under a parent.update_wordpress_categoryRename, change slug, update description, or reparent a category.delete_wordpress_categoryDelete a category. Posts are reassigned to the default category.WordPress — Tags
list_wordpress_tagsList all tags with post counts and descriptions.create_wordpress_tagCreate a new tag.update_wordpress_tagRename or update a tag.delete_wordpress_tagDelete a tag permanently.WordPress — Media Library
list_wordpress_mediaBrowse the WordPress media library with optional MIME type and search filters.upload_wordpress_mediaDownload a file from a public URL and upload it to the WordPress media library.update_wordpress_mediaUpdate title, alt text, caption, or description for a WordPress media item.delete_wordpress_mediaPermanently delete a WordPress media item.WordPress — Featured Images
set_wordpress_featured_imageSet or clear the featured image on any post or page using a WordPress media ID. Pass mediaId: 0 to remove.WordPress — Post & Page Content
insert_image_into_postInsert an image into a post or page at a specific position (beginning, end, after_intro, before_conclusion) without replacing the full body.search_replace_post_contentFind and replace a string inside a post or page's HTML — fix a typo, update a URL, or change a product name across the whole article.WordPress — Users
list_wordpress_usersList users with optional role and search filters.get_wordpress_userGet details for a specific user, or the currently authenticated user.WordPress — Site Settings
get_wordpress_settingsRead site title, tagline, URL, admin email, timezone, date/time formats, posts per page, default category, and comment settings.update_wordpress_settingsUpdate any subset of site settings. No need to send everything — just the fields you want to change.WordPress — Comments
list_wordpress_commentsList comments, filtered by post ID, status (approve, hold, spam, trash), or search term.update_wordpress_commentApprove, hold, mark as spam, or edit the content of a comment.delete_wordpress_commentTrash or permanently delete a comment.WordPress — Navigation Menus
list_wordpress_menusList all registered WordPress navigation menus and the locations they are assigned to.get_wordpress_menuGet the full item list (links, pages, categories) for a specific menu by ID or slug.WordPress — Plugins & Theme
list_wordpress_pluginsList installed plugins with activation status, version, and description. Requires WP 5.5+ and admin credentials.activate_wordpress_pluginActivate an installed plugin by its file path (e.g. 'yoast-seo/wp-seo-main.php').deactivate_wordpress_pluginDeactivate an active plugin.get_wordpress_themeGet the currently active theme and all installed themes.WordPress — Post Revisions
list_post_revisionsList the revision history for a post or page — revision ID, author, date, and a content preview.restore_post_revisionRestore a post or page to a specific revision. Fetches the revision's content and title and writes it back to the live post — no full body needed.WordPress — Navigation Menus (full CRUD)
list_wordpress_menusList all registered navigation menus and their assigned theme locations.get_wordpress_menuGet all items for a menu — title, URL, type, order, and parent.create_wordpress_menuCreate a new navigation menu.add_wordpress_menu_itemAdd a custom link, page, post, category, or tag to a menu. Supports parent/child nesting and _blank targets.update_wordpress_menu_itemChange a menu item's label, URL, position, parent, or CSS classes.delete_wordpress_menu_itemRemove an item from a menu.WordPress — Scheduling
list_scheduled_postsList all posts or pages scheduled for future publication, ordered by date.reschedule_postChange the scheduled publish date of a post or page, or schedule a draft for future publication.WordPress — User Management (full CRUD)
list_wordpress_usersList users with optional role and search filters.get_wordpress_userGet details for a specific user.create_wordpress_userCreate a new user with a role (subscriber, contributor, author, editor, administrator).update_wordpress_userUpdate any user field — name, email, role, password, or bio. Only send what you want to change.delete_wordpress_userDelete a user. Reassign their posts to another user ID, or set deleteContent: true to remove them.WordPress — Bulk Comment Operations
list_wordpress_commentsList comments filtered by post ID, status, or search.update_wordpress_commentApprove, hold, spam, or edit a single comment.delete_wordpress_commentTrash or permanently delete a comment.bulk_moderate_commentsApprove, hold, spam, or trash multiple comment IDs in one call.delete_all_spam_commentsPermanently delete all spam comments site-wide or for a specific post. Supports dryRun: true to preview without deleting.WordPress — SEO
update_wordpress_seoSet Yoast SEO title and meta description on any post or page. Requires the Yoast SEO plugin.Massblogger — Media Library
list_massblogger_mediaList images and files in the Massblogger media library, including AI-generated images. Returns URL, filename, content type, and size.use_massblogger_media_in_wordpressTake an image from the Massblogger media library and upload it to a WordPress site. Returns the WordPress media ID. Optionally sets it as the featured image in the same call.Massblogger — AI Image Generation
generate_image_for_websiteGenerate an AI image using DALL-E or GPT Image. The prompt can be custom or auto-built from the website's topic. The image is stored in the Massblogger media library.generate_and_set_featured_imageOne-step: generate an AI image, upload it to WordPress, and set it as the featured image on a post or page. The image is also saved to the Massblogger media library.Massblogger — Cross-Site Operations
search_replace_across_sitesFind and replace a string across multiple WordPress sites at once — update a brand name, domain, or phrase portfolio-wide. Supports dryRun: true to preview.clone_post_to_sitesCopy a WordPress post (content, title, categories, featured image) to one or more target sites. Categories are matched by name and created if missing.bulk_update_post_statusChange the status of multiple posts or pages in one call — bulk publish drafts, bulk archive, or bulk trash.MCP Safety — Publish Guard
get_publish_guardCheck whether publish guard is on for a website. When enabled, the MCP server silently redirects all 'publish' requests to 'draft'.set_publish_guardEnable or disable publish guard for a website. A server-side safety flag stored in Massblogger — the agent cannot bypass it.Massblogger — Websites & Automation
list_websitesList all websites in the account with WordPress connection status, delivery type, and category assignments.get_site_contextFetch llms.txt and agents.md from a site to give the agent topic, audience, and writing context before creating content.research_topicsRun Massblogger's topic research pipeline and optionally save the resulting ideas.list_saved_topicsInspect saved topics for a website.generate_post_from_saved_topicTurn a saved Massblogger topic into a full article using the native generation pipeline, then optionally publish it.create_massblogger_postCreate a post in Massblogger for any delivery type — WordPress, webhook, or Next.js/REST.run_automation_for_websiteTrigger the saved automation config for a website.get_activity_logsRead recent MCP and AI activity logs, optionally filtered by website.Massblogger — pSEO
list_pseo_campaignsList pSEO campaigns for the account, optionally filtered to one website.find_pseo_campaign_for_pathFind the best existing pSEO campaign for a website by matching a route path before creating a new one.list_pseo_pagesList saved pSEO pages for a campaign.create_pseo_campaignCreate a new pSEO campaign in builder or connect mode.update_pseo_campaignUpdate an existing pSEO campaign instead of creating a duplicate.update_pseo_pageCreate or update a pSEO page entry with content, status, and field overrides.generate_pseo_page_contentGenerate and save pSEO page content for builder or enrichment campaigns.render_pseo_page_for_repoReturn a concrete repo file path and file contents for one pSEO page.render_pseo_campaign_repo_filesReturn repo-ready file plans for saved pages in a pSEO campaign.Recommended agent workflow
- Start with
list_websitesto discover available sites, check which ones are WordPress-connected, and get the correct website ID or domain. - Use
get_site_contextso the agent reads the site'sllms.txt/ audience and writing rules before generating content. - Use
list_wordpress_categoriesandlist_wordpress_tagsto resolve names to IDs before assigning them to posts. - For content updates, call
get_wordpress_postfirst to read the current title and content, then callupdate_postwith only the changed fields. - To add an image inside an article, use
insert_image_into_post— no need to rewrite the whole body. Usesearch_replace_post_contentfor targeted text changes. - For featured images: use
generate_and_set_featured_imageto generate an AI image and set it in one call, orlist_massblogger_media+use_massblogger_media_in_wordpressto reuse an image already in the Massblogger library. - Use
set_wordpress_featured_imagewhen you already have a WordPress media ID and just need to assign it. - Use
upload_wordpress_mediato push images from any public URL and get back a media ID. - To restore accidentally trashed content, use
restore_wordpress_postorrestore_wordpress_page. To undo a content edit, uselist_post_revisionsthenrestore_post_revision— WordPress saves a revision on every save, so you can always roll back. - For production safety, run
set_publish_guardon any site where you don't want the agent publishing directly. Allstatus: publishcalls will be silently redirected todraftat the server level — the agent cannot override it. - For portfolio-wide changes, use
search_replace_across_siteswithdryRun: truefirst, then re-run without it once you're happy. - Use
update_wordpress_seoafter publishing to set Yoast SEO title and meta description. - Use
get_activity_logsat the end of any session to audit what the AI actually did.
Example agent prompts
Publish a new article with AI featured image
Research topics for myblog.com about "best lightweight camping stoves". Save the best 3 ideas. Generate a full article from the top topic and publish it. Then generate and set a featured image for that post. Set the Yoast meta description, then show me the activity log.
Add images to articles missing them
List the last 20 published posts on myblog.com. For each one that has no featured image, generate an AI featured image using the post title as context and set it. Then insert a relevant image after the first paragraph of each post.
Bulk SEO update
List the last 20 published posts on myblog.com. For each one that's missing a Yoast meta description, write a compelling 150-character description and update it using update_wordpress_seo.
Fix content across the site
Search all posts on myblog.com that mention "BestGadgets 2024" and replace with "BestGadgets 2026". Use search_replace_post_content for each post.
Reorganise categories
List all categories on myblog.com. Create a new parent category called "Gear Reviews". Move "Tents", "Stoves", and "Sleeping Bags" to be children of "Gear Reviews". Confirm the updated category tree.
Portfolio-wide brand rename
We rebranded from "GearLife" to "TrailPro". Run search_replace_across_sites with dryRun: true first to show me how many posts and pages would change across all my sites, then run it for real once I confirm.
Onboard a new author across 5 sites
Create a WordPress user named "Sarah Chen" (sarah@example.com) with the role "author" on these 5 sites: myblog.com, gearblog.com, hikingblog.com, campblog.com, trailblog.com.
Undo a bad search/replace
I just ran a search/replace on post 142 on myblog.com and it broke something. List the last 5 revisions for that post, then restore it to the revision just before the most recent one.
Enable publish guard before a big batch job
Before running the content refresh job, enable publish guard on myblog.com. Then generate and update the 10 oldest posts with new content and updated Yoast meta. Show me the drafts when done so I can review before publishing.
WordPress vs webhook vs Next.js
WordPress sites
Full CRUD over posts, pages, categories, tags, media, users, settings, and comments via the WordPress REST API. Credentials are stored once in Massblogger and reused for every tool call.
Webhook sites
Use create_massblogger_post with published: true. Massblogger stores the post and dispatches the configured signed webhook to your endpoint.
Next.js / REST sites
Use create_massblogger_post. The post is stored in Massblogger and your frontend reads it through the existing REST API. No WordPress credentials required.
Related guides
- WordPress Application Passwords — how to generate and store credentials
- Webhooks Guide — custom site delivery and signature verification
- pSEO Webhooks — programmatic SEO page delivery
- REST API — frontend rendering for API-backed sites