@adsim/wordpress-mcp-server 4.6.0 → 5.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/.env.example +18 -0
  2. package/README.md +867 -499
  3. package/companion/mcp-diagnostics.php +1184 -0
  4. package/dxt/manifest.json +715 -98
  5. package/index.js +166 -4786
  6. package/package.json +14 -6
  7. package/src/data/plugin-performance-data.json +59 -0
  8. package/src/plugins/adapters/acf/acfAdapter.js +55 -3
  9. package/src/shared/api.js +79 -0
  10. package/src/shared/audit.js +39 -0
  11. package/src/shared/context.js +15 -0
  12. package/src/shared/governance.js +98 -0
  13. package/src/shared/utils.js +148 -0
  14. package/src/tools/comments.js +50 -0
  15. package/src/tools/content.js +395 -0
  16. package/src/tools/core.js +114 -0
  17. package/src/tools/editorial.js +634 -0
  18. package/src/tools/fse.js +370 -0
  19. package/src/tools/health.js +160 -0
  20. package/src/tools/index.js +96 -0
  21. package/src/tools/intelligence.js +2082 -0
  22. package/src/tools/links.js +118 -0
  23. package/src/tools/media.js +71 -0
  24. package/src/tools/performance.js +219 -0
  25. package/src/tools/plugins.js +368 -0
  26. package/src/tools/schema.js +417 -0
  27. package/src/tools/security.js +590 -0
  28. package/src/tools/seo.js +1633 -0
  29. package/src/tools/taxonomy.js +115 -0
  30. package/src/tools/users.js +188 -0
  31. package/src/tools/woocommerce.js +1008 -0
  32. package/src/tools/workflow.js +409 -0
  33. package/src/transport/http.js +39 -0
  34. package/tests/unit/helpers/pagination.test.js +43 -0
  35. package/tests/unit/plugins/acf/acfAdapter.test.js +43 -5
  36. package/tests/unit/tools/bulkUpdate.test.js +188 -0
  37. package/tests/unit/tools/diagnostics.test.js +397 -0
  38. package/tests/unit/tools/dynamicFiltering.test.js +100 -8
  39. package/tests/unit/tools/editorialIntelligence.test.js +817 -0
  40. package/tests/unit/tools/fse.test.js +548 -0
  41. package/tests/unit/tools/multilingual.test.js +653 -0
  42. package/tests/unit/tools/performance.test.js +351 -0
  43. package/tests/unit/tools/postMeta.test.js +105 -0
  44. package/tests/unit/tools/runWorkflow.test.js +150 -0
  45. package/tests/unit/tools/schema.test.js +477 -0
  46. package/tests/unit/tools/security.test.js +695 -0
  47. package/tests/unit/tools/site.test.js +1 -1
  48. package/tests/unit/tools/users.crud.test.js +399 -0
  49. package/tests/unit/tools/validateBlocks.test.js +186 -0
  50. package/tests/unit/tools/visualStaging.test.js +271 -0
  51. package/tests/unit/tools/woocommerce.advanced.test.js +679 -0
package/dxt/manifest.json CHANGED
@@ -2,9 +2,9 @@
2
2
  "manifest_version": "0.3",
3
3
  "name": "wordpress-mcp-server",
4
4
  "display_name": "WordPress MCP Server",
5
- "version": "4.6.0",
6
- "description": "Manage your WordPress site from Claude Desktop posts, pages, media, SEO audits, content intelligence, plugin intelligence, plugin layer (ACF, Elementor), plugins, themes, revisions, WooCommerce, content compression, and more. 92 tools, no WordPress plugin required.",
7
- "long_description": "A full-featured MCP server for WordPress REST API integration. Manage posts, pages, media, categories, tags, comments, users, SEO metadata, plugins, themes, revisions, and WooCommerce products/orders/customers through 92 tools — all from Claude Desktop.\n\nNo WordPress plugin required. Uses the built-in WordPress REST API with Application Passwords for secure authentication.\n\nFeatures:\n- Content management: create, read, update, delete posts and pages\n- Content compression: field filtering, content_format (html/text/links_only), list modes (full/summary/ids_only) for LLM context optimization\n- Content intelligence: readability scoring, duplicate detection, entity extraction, publishing velocity, revision diff, content structure analysis, FAQ extraction, CTA detection, link mapping, anchor text audit, schema markup validation\n- Plugin intelligence: SEO plugin detection (RankMath/Yoast/SEOPress), rendered head analysis, schema validation from plugin fields, SEO score reading, Twitter Card meta, pillar content management\n- Plugin layer: extensible adapter architecture for third-party plugins (ACF, Elementor). Adapters activate only when plugin detected via REST namespace discovery\n- Editorial approval workflow: submit for review, approve, reject\n- Media library: list, get details, upload from URL\n- Taxonomy: categories, tags, custom post types\n- SEO: auto-detects Yoast, RankMath, SEOPress, or All in One SEO\n- SEO audit suite: media alt text, orphan pages, heading structure, thin content, canonicals, E-E-A-T signals, broken links, keyword cannibalization, taxonomy bloat, outbound links\n- Plugins & themes: list, activate, deactivate\n- Revisions: list, view, restore, delete\n- WooCommerce read: products, orders, customers, price guardrail\n- WooCommerce intelligence: inventory alerts, order analytics, product SEO audit, product link suggestions\n- WooCommerce write: update products (with price guardrail), stock management, order status transitions\n- Enterprise controls: read-only mode, draft-only, disable-delete, require-approval (global and per-target)\n- Multi-site: target multiple WordPress installations with per-target controls",
5
+ "version": "4.14.0",
6
+ "description": "Enterprise WordPress MCP server 173 tools for content, SEO, schema, editorial intelligence, multilingual, security, performance, WooCommerce, FSE, and more. Governance controls, audit trail, multi-site. No WordPress plugin required.",
7
+ "long_description": "Enterprise WordPress MCP server with 173 tools across 18 categories — all from Claude Desktop or Claude Code.\n\nNo WordPress plugin required. Uses the built-in WordPress REST API with Application Passwords for secure authentication.\n\nFeatures:\n- Content management: CRUD for posts, pages, media, taxonomies, comments, users\n- SEO: auto-detects Yoast, RankMath, SEOPress, AIOSEO. 10-tool audit suite + 3 metadata tools\n- Schema.org Intelligence: generate, inject, validate JSON-LD (Article, FAQ, HowTo, LocalBusiness, Breadcrumb)\n- Content Intelligence: 16 analysis tools (readability, TF-IDF duplicates, entities, structure, link maps)\n- Editorial Intelligence: 6 tools (content updates, author consistency, editorial calendar, pillar gaps, link equity, clusters)\n- Multilingual (EU): WPML, Polylang Pro/Free, TranslatePress. Translation coverage, SEO sync\n- Performance & Core Web Vitals: PageSpeed Insights, render-blocking, image optimization, caching, database bloat\n- Security Audit: user risks, file permissions, plugin vulnerabilities (WPScan), SSL, login security\n- Full Site Editing: 26 tools for templates, template parts, global styles, patterns, navigation, widgets\n- Plugin Intelligence: rendered head analysis, schema validation, SEO scoring (RankMath/Yoast)\n- Plugin Layer: ACF and Elementor adapters, auto-detected via REST namespace discovery\n- WooCommerce: 20 tools (read, intelligence, advanced analytics, write with price guardrail)\n- Enterprise controls: read-only, draft-only, disable-delete, require-approval, confirm-destructive\n- WP_TOOL_CATEGORIES: load only the categories you need (~4-9k tokens vs ~20k)\n- Multi-site: target multiple WordPress installations with per-target controls\n- HTTP Streamable transport + stdio, audit trail, rate limiting",
8
8
  "author": {
9
9
  "name": "AdSim",
10
10
  "email": "georges@adsim.be",
@@ -34,99 +34,702 @@
34
34
  }
35
35
  },
36
36
  "tools": [
37
- { "name": "wp_list_posts", "description": "List posts with filtering and search. Use mode to reduce context size" },
38
- { "name": "wp_get_post", "description": "Get post by ID. Use fields/content_format to reduce context size for large posts" },
39
- { "name": "wp_create_post", "description": "Create a post (default: draft)" },
40
- { "name": "wp_update_post", "description": "Update a post" },
41
- { "name": "wp_delete_post", "description": "Delete a post (trash or permanent). Supports two-step confirmation via WP_CONFIRM_DESTRUCTIVE" },
42
- { "name": "wp_search", "description": "Full-text search across all content" },
43
- { "name": "wp_submit_for_review", "description": "Submit a draft post for editorial review (draft → pending)" },
44
- { "name": "wp_approve_post", "description": "Approve a pending post for publication (pending → publish)" },
45
- { "name": "wp_reject_post", "description": "Reject a pending post back to draft with a reason" },
46
- { "name": "wp_list_pages", "description": "List pages with hierarchy" },
47
- { "name": "wp_get_page", "description": "Get page by ID with content and template" },
48
- { "name": "wp_create_page", "description": "Create a page (default: draft)" },
49
- { "name": "wp_update_page", "description": "Update a page" },
50
- { "name": "wp_list_media", "description": "List media files" },
51
- { "name": "wp_get_media", "description": "Get media details with all sizes" },
52
- { "name": "wp_upload_media", "description": "Upload media from URL" },
53
- { "name": "wp_list_categories", "description": "List categories with hierarchy and post count" },
54
- { "name": "wp_list_tags", "description": "List tags with post count" },
55
- { "name": "wp_create_taxonomy_term", "description": "Create a category or tag" },
56
- { "name": "wp_list_comments", "description": "List comments with filters" },
57
- { "name": "wp_create_comment", "description": "Create a comment or reply" },
58
- { "name": "wp_list_post_types", "description": "Discover all registered post types (CPT)" },
59
- { "name": "wp_list_custom_posts", "description": "List posts from any custom post type" },
60
- { "name": "wp_list_users", "description": "List users with roles" },
61
- { "name": "wp_set_target", "description": "Switch active WordPress site (multi-target mode)" },
62
- { "name": "wp_site_info", "description": "Get site info, current user, post types, enterprise controls, and plugin_layer (detected plugins, tools count)" },
63
- { "name": "wp_get_seo_meta", "description": "Get SEO metadata for a post or page" },
64
- { "name": "wp_update_seo_meta", "description": "Update SEO metadata for a post or page" },
65
- { "name": "wp_audit_seo", "description": "Audit SEO metadata across multiple posts/pages" },
66
- { "name": "wp_list_plugins", "description": "List WordPress plugins with status filtering" },
67
- { "name": "wp_activate_plugin", "description": "Activate a WordPress plugin" },
68
- { "name": "wp_deactivate_plugin", "description": "Deactivate a WordPress plugin" },
69
- { "name": "wp_list_themes", "description": "List installed WordPress themes" },
70
- { "name": "wp_get_theme", "description": "Get details of a specific WordPress theme" },
71
- { "name": "wp_list_revisions", "description": "List revisions of a post or page" },
72
- { "name": "wp_get_revision", "description": "Get a specific revision with full content" },
73
- { "name": "wp_restore_revision", "description": "Restore a post or page to a previous revision" },
74
- { "name": "wp_delete_revision", "description": "Permanently delete a revision. Supports two-step confirmation via WP_CONFIRM_DESTRUCTIVE" },
75
- { "name": "wp_analyze_links", "description": "Analyze internal and external links in a post with broken link checking" },
76
- { "name": "wp_suggest_internal_links", "description": "Suggest internal links based on keyword relevance, categories, and freshness" },
77
- { "name": "wc_list_products", "description": "List WooCommerce products with filtering and search" },
78
- { "name": "wc_get_product", "description": "Get a WooCommerce product by ID with full details" },
79
- { "name": "wc_list_orders", "description": "List WooCommerce orders with filtering" },
80
- { "name": "wc_get_order", "description": "Get a WooCommerce order by ID with full details" },
81
- { "name": "wc_list_customers", "description": "List WooCommerce customers with search and filtering" },
82
- { "name": "wc_price_guardrail", "description": "Analyze a product price change safety without modifying anything" },
83
- { "name": "wc_inventory_alert", "description": "Identify low-stock and out-of-stock products below a threshold, sorted by urgency" },
84
- { "name": "wc_order_intelligence", "description": "Analyze customer purchase history: lifetime value, average order, favourite products, order frequency" },
85
- { "name": "wc_seo_product_audit", "description": "Audit WooCommerce product listings for SEO issues (missing descriptions, images, alt text, generic slugs)" },
86
- { "name": "wc_suggest_product_links", "description": "Suggest WooCommerce products to link from a WordPress blog post based on SEO keyword relevance" },
87
- { "name": "wc_update_product", "description": "Update a WooCommerce product with automatic price guardrail (>20% changes require confirmation)" },
88
- { "name": "wc_update_stock", "description": "Update stock quantity of a WooCommerce product or variation" },
89
- { "name": "wc_update_order_status", "description": "Update WooCommerce order status with transition validation" },
90
- { "name": "wp_audit_media_seo", "description": "Audit media library images for SEO issues (missing alt text, filename-as-alt, alt too short)" },
91
- { "name": "wp_find_orphan_pages", "description": "Find published pages with no internal links pointing to them from other pages" },
92
- { "name": "wp_audit_heading_structure", "description": "Audit heading hierarchy (H1-H6) for SEO issues: H1 in content, level skips, empty headings" },
93
- { "name": "wp_find_thin_content", "description": "Find thin/low-quality published posts: too short, outdated, uncategorized" },
94
- { "name": "wp_audit_canonicals", "description": "Audit canonical URLs for SEO issues: missing, HTTP on HTTPS site, staging URLs, wrong domain" },
95
- { "name": "wp_analyze_eeat_signals", "description": "Analyze E-E-A-T signals for posts. Scores 0-100 with actionable priority fixes" },
96
- { "name": "wp_find_broken_internal_links", "description": "Scan posts and verify internal links via HEAD requests. Detects 404s, redirects, timeouts" },
97
- { "name": "wp_find_keyword_cannibalization", "description": "Detect articles targeting the same focus keywords, creating internal competition" },
98
- { "name": "wp_audit_taxonomies", "description": "Audit categories and tags for taxonomy bloat: empty tags, single-post tags, near-duplicate terms" },
99
- { "name": "wp_audit_outbound_links", "description": "Analyze outbound links in posts. Detects missing sources, excessive links, identifies most-cited domains" },
100
- { "name": "wp_get_content_brief", "description": "Editorial brief aggregator: SEO + structure + links in 1 call" },
101
- { "name": "wp_extract_post_outline", "description": "H1-H6 outline extraction with category-level pattern analysis" },
102
- { "name": "wp_audit_readability", "description": "Bulk Flesch-Kincaid FR scoring with transition word and passive voice analysis" },
103
- { "name": "wp_audit_update_frequency", "description": "Outdated content detection cross-referenced with SEO scores" },
104
- { "name": "wp_build_link_map", "description": "Internal link matrix with simplified PageRank scoring (0-100)" },
105
- { "name": "wp_audit_anchor_texts", "description": "Anchor text diversity audit: generic, over-optimized, image link detection" },
106
- { "name": "wp_audit_schema_markup", "description": "JSON-LD schema.org detection and validation (Article, FAQ, HowTo, LocalBusiness)" },
107
- { "name": "wp_audit_content_structure", "description": "Editorial structure scoring (0-100): intro, conclusion, FAQ, TOC, lists, images" },
108
- { "name": "wp_find_duplicate_content", "description": "TF-IDF cosine similarity for near-duplicate detection with union-find clustering" },
109
- { "name": "wp_find_content_gaps", "description": "Taxonomy under-representation analysis (categories + tags)" },
110
- { "name": "wp_extract_faq_blocks", "description": "FAQ inventory: JSON-LD, Gutenberg blocks, HTML patterns" },
111
- { "name": "wp_audit_cta_presence", "description": "CTA detection (6 types) with scoring 0-100" },
112
- { "name": "wp_extract_entities", "description": "Regex/heuristic named entity extraction (brands, locations, persons, organizations)" },
113
- { "name": "wp_get_publishing_velocity", "description": "Publication cadence by author/category with trend detection" },
114
- { "name": "wp_compare_revisions_diff", "description": "Textual diff between revisions with amplitude scoring" },
115
- { "name": "wp_list_posts_by_word_count", "description": "Posts sorted by length with 6-tier segmentation" },
116
- { "name": "wp_get_rendered_head", "description": "Fetch real rendered <head> HTML via RankMath or Yoast headless endpoint, compare rendered vs stored meta" },
117
- { "name": "wp_audit_rendered_seo", "description": "Bulk audit rendered vs stored SEO meta divergences with per-post scoring" },
118
- { "name": "wp_get_pillar_content", "description": "Read or set RankMath pillar/cornerstone content flag. Write mode blocked by WP_READ_ONLY" },
119
- { "name": "wp_audit_schema_plugins", "description": "Audit JSON-LD schemas from SEO plugin native fields (rank_math_schema or Yoast head)" },
120
- { "name": "wp_get_seo_score", "description": "Read RankMath native SEO score (0-100) with bulk mode distribution stats" },
121
- { "name": "wp_get_twitter_meta", "description": "Read or write Twitter Card meta (title, description, image) from RankMath, Yoast, or SEOPress" },
122
- { "name": "wp_get_site_options", "description": "Read WordPress site settings (title, tagline, language, timezone) via /wp/v2/settings. Requires manage_options" },
123
- { "name": "acf_get_fields", "description": "Get ACF custom fields for a post/page with key filtering and raw/compact/summary modes. Requires ACF plugin" },
124
- { "name": "acf_list_field_groups", "description": "List all configured ACF field groups. Requires ACF plugin" },
125
- { "name": "acf_get_field_group", "description": "Get full detail of an ACF field group by ID. Requires ACF plugin" },
126
- { "name": "acf_update_fields", "description": "Update ACF custom fields for a post/page. Write — blocked by WP_READ_ONLY. Requires ACF plugin" },
127
- { "name": "elementor_list_templates", "description": "List Elementor templates (page, section, block, popup) with type filtering. Requires Elementor" },
128
- { "name": "elementor_get_template", "description": "Get full Elementor template content and elements. Context-guarded at 50k chars. Requires Elementor" },
129
- { "name": "elementor_get_page_data", "description": "Get Elementor editor data for a post/page: widgets used, elements count. Requires Elementor" }
37
+ {
38
+ "name": "wp_list_posts",
39
+ "description": "browse/filter posts by status, category, tag, author, or search"
40
+ },
41
+ {
42
+ "name": "wp_get_post",
43
+ "description": "read a single post with full content and meta"
44
+ },
45
+ {
46
+ "name": "wp_create_post",
47
+ "description": "create a post (defaults to draft)"
48
+ },
49
+ {
50
+ "name": "wp_update_post",
51
+ "description": "modify any post field only provided fields change"
52
+ },
53
+ {
54
+ "name": "wp_delete_post",
55
+ "description": "trash or permanently delete a post"
56
+ },
57
+ {
58
+ "name": "wp_search",
59
+ "description": "full-text search across all content types"
60
+ },
61
+ {
62
+ "name": "wp_submit_for_review",
63
+ "description": "transition a draft post to pending status for editorial review"
64
+ },
65
+ {
66
+ "name": "wp_approve_post",
67
+ "description": "transition a pending post to published (editor/admin action)"
68
+ },
69
+ {
70
+ "name": "wp_reject_post",
71
+ "description": "return a pending post to draft with a mandatory rejection reason"
72
+ },
73
+ {
74
+ "name": "wp_list_pages",
75
+ "description": "browse pages with hierarchy and templates"
76
+ },
77
+ {
78
+ "name": "wp_get_page",
79
+ "description": "read a single page with content and template"
80
+ },
81
+ {
82
+ "name": "wp_create_page",
83
+ "description": "create a page (defaults to draft)"
84
+ },
85
+ {
86
+ "name": "wp_update_page",
87
+ "description": "modify any page field"
88
+ },
89
+ {
90
+ "name": "wp_list_media",
91
+ "description": "browse media library by type (image/video/audio)"
92
+ },
93
+ {
94
+ "name": "wp_get_media",
95
+ "description": "get full media details with all available sizes"
96
+ },
97
+ {
98
+ "name": "wp_upload_media",
99
+ "description": "upload a file from a public URL to the media library"
100
+ },
101
+ {
102
+ "name": "wp_list_categories",
103
+ "description": "list categories with hierarchy, post count, and descriptions"
104
+ },
105
+ {
106
+ "name": "wp_list_tags",
107
+ "description": "list tags with post count"
108
+ },
109
+ {
110
+ "name": "wp_create_taxonomy_term",
111
+ "description": "create a new category or tag"
112
+ },
113
+ {
114
+ "name": "wp_list_comments",
115
+ "description": "list comments filtered by post or status (approved/hold/spam)"
116
+ },
117
+ {
118
+ "name": "wp_create_comment",
119
+ "description": "post a comment or reply on any post"
120
+ },
121
+ {
122
+ "name": "wp_list_post_types",
123
+ "description": "discover all registered post types including custom ones (products, portfolio, events)"
124
+ },
125
+ {
126
+ "name": "wp_list_custom_posts",
127
+ "description": "list any custom post type (products, portfolio, events)"
128
+ },
129
+ {
130
+ "name": "wp_list_users",
131
+ "description": "list site users with roles"
132
+ },
133
+ {
134
+ "name": "wp_get_user",
135
+ "description": "get a user profile by ID"
136
+ },
137
+ {
138
+ "name": "wp_create_user",
139
+ "description": "create a new WordPress user"
140
+ },
141
+ {
142
+ "name": "wp_update_user",
143
+ "description": "update a user profile"
144
+ },
145
+ {
146
+ "name": "wp_delete_user",
147
+ "description": "delete a user permanently"
148
+ },
149
+ {
150
+ "name": "wp_list_user_roles",
151
+ "description": "list all available WordPress user roles with their capabilities"
152
+ },
153
+ {
154
+ "name": "wp_get_user_capabilities",
155
+ "description": "get the capabilities of a specific user (can_publish, manage_options, etc.)"
156
+ },
157
+ {
158
+ "name": "wp_reset_user_password",
159
+ "description": "trigger a password reset email for a user"
160
+ },
161
+ {
162
+ "name": "wp_list_user_application_passwords",
163
+ "description": "list application passwords for a user"
164
+ },
165
+ {
166
+ "name": "wp_revoke_application_password",
167
+ "description": "revoke (delete) an application password by UUID"
168
+ },
169
+ {
170
+ "name": "wp_set_target",
171
+ "description": "switch active WordPress site in multi-target mode"
172
+ },
173
+ {
174
+ "name": "wp_site_info",
175
+ "description": "discover site config, user, post types, governance flags, and available targets"
176
+ },
177
+ {
178
+ "name": "wp_get_site_options",
179
+ "description": "read WordPress site settings (title, tagline, language, timezone, etc.) via /wp/v2/settings"
180
+ },
181
+ {
182
+ "name": "wp_get_seo_meta",
183
+ "description": "read SEO title, description, focus keyword, canonical, robots, OG for one post"
184
+ },
185
+ {
186
+ "name": "wp_update_seo_meta",
187
+ "description": "update SEO title, description, focus keyword, canonical, or robots"
188
+ },
189
+ {
190
+ "name": "wp_audit_seo",
191
+ "description": "quick bulk SEO scoring (0-100) across posts or pages"
192
+ },
193
+ {
194
+ "name": "wp_list_plugins",
195
+ "description": "list installed plugins with status and version"
196
+ },
197
+ {
198
+ "name": "wp_activate_plugin",
199
+ "description": "activate a plugin"
200
+ },
201
+ {
202
+ "name": "wp_deactivate_plugin",
203
+ "description": "deactivate a plugin"
204
+ },
205
+ {
206
+ "name": "wp_list_themes",
207
+ "description": "list installed themes with active theme detection"
208
+ },
209
+ {
210
+ "name": "wp_get_theme",
211
+ "description": "get theme details by stylesheet slug"
212
+ },
213
+ {
214
+ "name": "wp_list_revisions",
215
+ "description": "list revisions of a post or page (metadata only)"
216
+ },
217
+ {
218
+ "name": "wp_get_revision",
219
+ "description": "read a specific revision with full content"
220
+ },
221
+ {
222
+ "name": "wp_restore_revision",
223
+ "description": "restore a post to a previous revision"
224
+ },
225
+ {
226
+ "name": "wp_delete_revision",
227
+ "description": "permanently delete a revision"
228
+ },
229
+ {
230
+ "name": "wp_analyze_links",
231
+ "description": "audit all internal and external links in a single post via HEAD requests"
232
+ },
233
+ {
234
+ "name": "wp_suggest_internal_links",
235
+ "description": "get scored internal link suggestions for a post based on keyword relevance, categories, and freshness"
236
+ },
237
+ {
238
+ "name": "wc_list_products",
239
+ "description": "browse WooCommerce products"
240
+ },
241
+ {
242
+ "name": "wc_get_product",
243
+ "description": "get full product details including variations summary"
244
+ },
245
+ {
246
+ "name": "wc_list_orders",
247
+ "description": "browse WooCommerce orders"
248
+ },
249
+ {
250
+ "name": "wc_get_order",
251
+ "description": "get order details with line items, shipping, billing, and payment info"
252
+ },
253
+ {
254
+ "name": "wc_list_customers",
255
+ "description": "list WooCommerce customers with search and role filtering"
256
+ },
257
+ {
258
+ "name": "wc_price_guardrail",
259
+ "description": "Use BEFORE changing a product price"
260
+ },
261
+ {
262
+ "name": "wc_inventory_alert",
263
+ "description": "identify low-stock and out-of-stock products below a threshold, sorted by urgency"
264
+ },
265
+ {
266
+ "name": "wc_order_intelligence",
267
+ "description": "analyze a customer's purchase history: lifetime value, average order, favorite products, frequency"
268
+ },
269
+ {
270
+ "name": "wc_seo_product_audit",
271
+ "description": "audit WooCommerce product listings for SEO issues (missing descriptions, images, alt text, generic slugs)"
272
+ },
273
+ {
274
+ "name": "wc_suggest_product_links",
275
+ "description": "suggest WooCommerce products to link from a blog post based on keyword relevance"
276
+ },
277
+ {
278
+ "name": "wc_audit_product_seo",
279
+ "description": "audit WooCommerce product SEO: title length, description, slug quality, image alt, schema presence"
280
+ },
281
+ {
282
+ "name": "wc_find_abandoned_carts_pattern",
283
+ "description": "analyze abandoned cart patterns: hourly/daily trends, top abandoned products, estimated revenue loss"
284
+ },
285
+ {
286
+ "name": "wc_audit_checkout_friction",
287
+ "description": "audit checkout friction: guest checkout, required fields count, coupon fields, multi-step, post-purchase redirect"
288
+ },
289
+ {
290
+ "name": "wc_get_product_performance",
291
+ "description": "get product performance metrics with period comparison: units sold, revenue, refund rate, trend direction"
292
+ },
293
+ {
294
+ "name": "wc_audit_stock_alerts",
295
+ "description": "audit stock levels: out-of-stock, low-stock with last sale date"
296
+ },
297
+ {
298
+ "name": "wc_find_duplicate_products",
299
+ "description": "find duplicate products by SKU, title similarity (Levenshtein), or slug similarity"
300
+ },
301
+ {
302
+ "name": "wc_audit_pricing_consistency",
303
+ "description": "find pricing inconsistencies: sale >= regular, empty prices, expired sales, suspicious discounts"
304
+ },
305
+ {
306
+ "name": "wc_update_product",
307
+ "description": "update product fields (title, description, price, stock, status)"
308
+ },
309
+ {
310
+ "name": "wc_update_stock",
311
+ "description": "update stock quantity of a product or variation"
312
+ },
313
+ {
314
+ "name": "wc_update_order_status",
315
+ "description": "transition order status (e.g"
316
+ },
317
+ {
318
+ "name": "wp_audit_media_seo",
319
+ "description": "checking image SEO"
320
+ },
321
+ {
322
+ "name": "wp_find_orphan_pages",
323
+ "description": "find posts with zero inbound internal links, sorted by word count"
324
+ },
325
+ {
326
+ "name": "wp_audit_heading_structure",
327
+ "description": "check H1-H6 hierarchy in a single post"
328
+ },
329
+ {
330
+ "name": "wp_find_thin_content",
331
+ "description": "surface short/low-quality posts below a word count threshold"
332
+ },
333
+ {
334
+ "name": "wp_audit_canonicals",
335
+ "description": "validate canonical URLs across posts/pages"
336
+ },
337
+ {
338
+ "name": "wp_analyze_eeat_signals",
339
+ "description": "score E-E-A-T per post (0-100): author bio, dates, citations, word count, structured data"
340
+ },
341
+ {
342
+ "name": "wp_find_broken_internal_links",
343
+ "description": "check internal links via HEAD requests"
344
+ },
345
+ {
346
+ "name": "wp_find_keyword_cannibalization",
347
+ "description": "detect posts competing on the same focus keyword"
348
+ },
349
+ {
350
+ "name": "wp_audit_taxonomies",
351
+ "description": "detect taxonomy bloat: empty/single-post terms, near-duplicates, missing descriptions"
352
+ },
353
+ {
354
+ "name": "wp_audit_outbound_links",
355
+ "description": "analyze external link profile per post"
356
+ },
357
+ {
358
+ "name": "wp_get_content_brief",
359
+ "description": "get a compact content brief in 1 call: title, SEO meta, headings, word count, links, categories"
360
+ },
361
+ {
362
+ "name": "wp_extract_post_outline",
363
+ "description": "extract H1-H4 outline from N posts in a category as a reference template for new content"
364
+ },
365
+ {
366
+ "name": "wp_audit_readability",
367
+ "description": "score text readability (Flesch-Kincaid adapted)"
368
+ },
369
+ {
370
+ "name": "wp_audit_update_frequency",
371
+ "description": "find stale posts not updated since N days, cross-referenced with SEO score"
372
+ },
373
+ {
374
+ "name": "wp_build_link_map",
375
+ "description": "generate full internal link matrix with simplified PageRank scores per post"
376
+ },
377
+ {
378
+ "name": "wp_audit_anchor_texts",
379
+ "description": "check internal link anchor diversity"
380
+ },
381
+ {
382
+ "name": "wp_audit_schema_markup",
383
+ "description": "detect and validate JSON-LD in post HTML content (Article, FAQ, HowTo, LocalBusiness)"
384
+ },
385
+ {
386
+ "name": "wp_audit_content_structure",
387
+ "description": "analyze post structure: intro/body/conclusion ratio, FAQ presence, TOC, lists, tables"
388
+ },
389
+ {
390
+ "name": "wp_find_duplicate_content",
391
+ "description": "detect near-duplicate posts via TF-IDF cosine similarity"
392
+ },
393
+ {
394
+ "name": "wp_find_content_gaps",
395
+ "description": "find under-represented taxonomy terms (< N posts) as content creation opportunities"
396
+ },
397
+ {
398
+ "name": "wp_extract_faq_blocks",
399
+ "description": "inventory all FAQ blocks (Gutenberg + schema JSON-LD) across the corpus"
400
+ },
401
+ {
402
+ "name": "wp_audit_cta_presence",
403
+ "description": "detect presence/absence of CTAs (contact links, forms, buttons) per post"
404
+ },
405
+ {
406
+ "name": "wp_extract_entities",
407
+ "description": "extract named entities (brands, places, people, organizations) from post content"
408
+ },
409
+ {
410
+ "name": "wp_get_publishing_velocity",
411
+ "description": "measure publication cadence per author and category over 30/90/180 days"
412
+ },
413
+ {
414
+ "name": "wp_compare_revisions_diff",
415
+ "description": "diff two revisions and measure update amplitude"
416
+ },
417
+ {
418
+ "name": "wp_list_posts_by_word_count",
419
+ "description": "rank posts by length with auto-segmentation (<500, 500-1k, 1k-2k, 2k+)"
420
+ },
421
+ {
422
+ "name": "wp_get_rendered_head",
423
+ "description": "fetch the real <head> HTML Google sees via RankMath/Yoast headless endpoint"
424
+ },
425
+ {
426
+ "name": "wp_audit_rendered_seo",
427
+ "description": "bulk rendered-vs-stored SEO divergence detection with per-post scoring"
428
+ },
429
+ {
430
+ "name": "wp_get_pillar_content",
431
+ "description": "read or set RankMath cornerstone/pillar flag"
432
+ },
433
+ {
434
+ "name": "wp_audit_schema_plugins",
435
+ "description": "validate JSON-LD from SEO plugin native fields (rank_math_schema or yoast_head_json)"
436
+ },
437
+ {
438
+ "name": "wp_get_seo_score",
439
+ "description": "read RankMath native SEO score (0-100)"
440
+ },
441
+ {
442
+ "name": "wp_get_twitter_meta",
443
+ "description": "read or update Twitter Card meta (title, description, image) for RankMath/Yoast/SEOPress"
444
+ },
445
+ {
446
+ "name": "wp_list_templates",
447
+ "description": "list all block templates"
448
+ },
449
+ {
450
+ "name": "wp_get_template",
451
+ "description": "get a single block template by ID"
452
+ },
453
+ {
454
+ "name": "wp_create_template",
455
+ "description": "create a new block template"
456
+ },
457
+ {
458
+ "name": "wp_update_template",
459
+ "description": "update an existing block template"
460
+ },
461
+ {
462
+ "name": "wp_delete_template",
463
+ "description": "delete a block template"
464
+ },
465
+ {
466
+ "name": "wp_list_template_parts",
467
+ "description": "list all template parts"
468
+ },
469
+ {
470
+ "name": "wp_get_template_part",
471
+ "description": "get a single template part by ID"
472
+ },
473
+ {
474
+ "name": "wp_create_template_part",
475
+ "description": "create a new template part"
476
+ },
477
+ {
478
+ "name": "wp_update_template_part",
479
+ "description": "update an existing template part"
480
+ },
481
+ {
482
+ "name": "wp_delete_template_part",
483
+ "description": "delete a template part"
484
+ },
485
+ {
486
+ "name": "wp_get_global_styles",
487
+ "description": "get global styles by ID"
488
+ },
489
+ {
490
+ "name": "wp_update_global_styles",
491
+ "description": "update global styles (colors, typography, spacing etc)"
492
+ },
493
+ {
494
+ "name": "wp_get_global_styles_variations",
495
+ "description": "list available global style variations for a theme"
496
+ },
497
+ {
498
+ "name": "wp_list_block_patterns",
499
+ "description": "list all registered block patterns"
500
+ },
501
+ {
502
+ "name": "wp_get_block_pattern",
503
+ "description": "get a single block pattern by name"
504
+ },
505
+ {
506
+ "name": "wp_create_block_pattern",
507
+ "description": "create a custom block pattern"
508
+ },
509
+ {
510
+ "name": "wp_delete_block_pattern",
511
+ "description": "delete a custom block pattern"
512
+ },
513
+ {
514
+ "name": "wp_list_navigation_menus",
515
+ "description": "list navigation menus"
516
+ },
517
+ {
518
+ "name": "wp_get_navigation_menu",
519
+ "description": "get a single navigation menu by ID"
520
+ },
521
+ {
522
+ "name": "wp_create_navigation_menu",
523
+ "description": "create a navigation menu"
524
+ },
525
+ {
526
+ "name": "wp_update_navigation_menu",
527
+ "description": "update a navigation menu"
528
+ },
529
+ {
530
+ "name": "wp_delete_navigation_menu",
531
+ "description": "delete a navigation menu"
532
+ },
533
+ {
534
+ "name": "wp_list_widgets",
535
+ "description": "list all widgets"
536
+ },
537
+ {
538
+ "name": "wp_get_widget",
539
+ "description": "get a single widget by ID"
540
+ },
541
+ {
542
+ "name": "wp_update_widget",
543
+ "description": "update a widget"
544
+ },
545
+ {
546
+ "name": "wp_delete_widget",
547
+ "description": "delete a widget"
548
+ },
549
+ {
550
+ "name": "wp_get_site_health_status",
551
+ "description": "get overall site health score (good/recommended/critical) and issue counts by severity"
552
+ },
553
+ {
554
+ "name": "wp_list_site_health_issues",
555
+ "description": "list all site health issues with label, description, severity, and type"
556
+ },
557
+ {
558
+ "name": "wp_get_site_health_info",
559
+ "description": "get system info: PHP version, MySQL version, memory limit, active extensions, WP constants"
560
+ },
561
+ {
562
+ "name": "wp_get_debug_log",
563
+ "description": "read the last N lines of the WordPress debug.log"
564
+ },
565
+ {
566
+ "name": "wp_get_cron_events",
567
+ "description": "list all scheduled WP-Cron events with hook, args, schedule, next run, and overdue status"
568
+ },
569
+ {
570
+ "name": "wp_get_transients",
571
+ "description": "list database transients with key, expiration, and approximate size"
572
+ },
573
+ {
574
+ "name": "wp_check_php_compatibility",
575
+ "description": "check each active plugin PHP version requirement vs current PHP"
576
+ },
577
+ {
578
+ "name": "wp_get_active_hooks",
579
+ "description": "list registered WordPress actions and filters with callbacks and priorities"
580
+ },
581
+ {
582
+ "name": "wp_audit_page_speed",
583
+ "description": "run a Google PageSpeed Insights audit"
584
+ },
585
+ {
586
+ "name": "wp_find_render_blocking_resources",
587
+ "description": "detect render-blocking CSS and JS in the <head> of a page"
588
+ },
589
+ {
590
+ "name": "wp_audit_image_optimization",
591
+ "description": "audit media library images for optimization issues: non-WebP format, large file size (>100KB), missing alt text"
592
+ },
593
+ {
594
+ "name": "wp_check_caching_status",
595
+ "description": "check if a caching plugin is active (WP Rocket, W3 Total Cache, LiteSpeed, WP Super Cache, Autoptimize) and detect cache-related HTTP headers on th..."
596
+ },
597
+ {
598
+ "name": "wp_audit_database_bloat",
599
+ "description": "audit database for bloat: revision count, expired transients, auto-drafts, spam/trash, orphan postmeta, table sizes"
600
+ },
601
+ {
602
+ "name": "wp_get_plugin_performance_impact",
603
+ "description": "estimate the performance impact of active plugins"
604
+ },
605
+ {
606
+ "name": "wp_generate_schema_article",
607
+ "description": "generate JSON-LD Article schema for a post"
608
+ },
609
+ {
610
+ "name": "wp_generate_schema_faq",
611
+ "description": "generate JSON-LD FAQPage schema from post content"
612
+ },
613
+ {
614
+ "name": "wp_generate_schema_howto",
615
+ "description": "generate JSON-LD HowTo schema from post content"
616
+ },
617
+ {
618
+ "name": "wp_generate_schema_localbusiness",
619
+ "description": "generate JSON-LD LocalBusiness schema"
620
+ },
621
+ {
622
+ "name": "wp_generate_schema_breadcrumb",
623
+ "description": "generate JSON-LD BreadcrumbList schema for a post or page"
624
+ },
625
+ {
626
+ "name": "wp_inject_schema",
627
+ "description": "inject generated JSON-LD schema into a post _custom_schema_jsonld meta field"
628
+ },
629
+ {
630
+ "name": "wp_validate_schema_live",
631
+ "description": "validate JSON-LD schema on a live URL"
632
+ },
633
+ {
634
+ "name": "wp_detect_multilingual_plugin",
635
+ "description": "detect active multilingual plugin: WPML, Polylang Pro, Polylang Free (hreflang fallback), TranslatePress, or none"
636
+ },
637
+ {
638
+ "name": "wp_list_languages",
639
+ "description": "list all configured site languages with code, name, native name, locale, URL prefix, and optional post counts"
640
+ },
641
+ {
642
+ "name": "wp_get_post_translations",
643
+ "description": "get all translations of a post"
644
+ },
645
+ {
646
+ "name": "wp_audit_translation_coverage",
647
+ "description": "audit translation completeness across all languages and post types"
648
+ },
649
+ {
650
+ "name": "wp_find_missing_seo_translations",
651
+ "description": "find translated posts missing SEO metadata (title, description, OG)"
652
+ },
653
+ {
654
+ "name": "wp_sync_seo_meta_translations",
655
+ "description": "copy SEO metadata from a source post to its translations"
656
+ },
657
+ {
658
+ "name": "wp_audit_user_security",
659
+ "description": "audit administrator accounts for security risks: default usernames, inactive accounts, generic emails, missing 2FA, enumerable display names"
660
+ },
661
+ {
662
+ "name": "wp_check_file_permissions",
663
+ "description": "check critical WordPress file/directory permissions via companion mu-plugin"
664
+ },
665
+ {
666
+ "name": "wp_list_recently_modified_files",
667
+ "description": "list recently modified files in wp-content with suspicious file detection (random names, PHP in uploads, out-of-update-window changes)"
668
+ },
669
+ {
670
+ "name": "wp_audit_plugin_vulnerabilities",
671
+ "description": "scan active plugins against WPScan vulnerability database"
672
+ },
673
+ {
674
+ "name": "wp_check_ssl_certificate",
675
+ "description": "check SSL/TLS certificate validity, expiration, security headers (HSTS, X-Content-Type-Options, X-Frame-Options, CSP), and compute a security grade..."
676
+ },
677
+ {
678
+ "name": "wp_audit_login_security",
679
+ "description": "audit WordPress login security: XML-RPC exposure, user enumeration, login URL, 2FA plugins, brute force protection, admin username"
680
+ },
681
+ {
682
+ "name": "wp_suggest_content_updates",
683
+ "description": "find stale posts that need updating"
684
+ },
685
+ {
686
+ "name": "wp_audit_author_consistency",
687
+ "description": "profile each active author: post count, avg word count, publication frequency, readability score (Flesch-Kincaid), media usage"
688
+ },
689
+ {
690
+ "name": "wp_build_editorial_calendar",
691
+ "description": "generate a recommended editorial calendar"
692
+ },
693
+ {
694
+ "name": "wp_find_pillar_content_gaps",
695
+ "description": "identify topics covered by 3+ secondary posts without a dedicated pillar page"
696
+ },
697
+ {
698
+ "name": "wp_audit_internal_link_equity",
699
+ "description": "build the internal link graph and identify orphan pages (0 inbound), over-linked pages (>20 inbound), and important content with low link equity"
700
+ },
701
+ {
702
+ "name": "wp_suggest_content_cluster",
703
+ "description": "cluster existing content by semantic similarity using TF-IDF + cosine similarity"
704
+ },
705
+ {
706
+ "name": "acf_get_fields",
707
+ "description": "Get ACF custom fields for a post/page with key filtering and raw/compact/summary modes. Requires ACF plugin"
708
+ },
709
+ {
710
+ "name": "acf_list_field_groups",
711
+ "description": "List all configured ACF field groups. Requires ACF plugin"
712
+ },
713
+ {
714
+ "name": "acf_get_field_group",
715
+ "description": "Get full detail of an ACF field group by ID. Requires ACF plugin"
716
+ },
717
+ {
718
+ "name": "acf_update_fields",
719
+ "description": "Update ACF custom fields for a post/page. Write — blocked by WP_READ_ONLY. Requires ACF plugin"
720
+ },
721
+ {
722
+ "name": "elementor_list_templates",
723
+ "description": "List Elementor templates (page, section, block, popup) with type filtering. Requires Elementor"
724
+ },
725
+ {
726
+ "name": "elementor_get_template",
727
+ "description": "Get full Elementor template content and elements. Context-guarded at 50k chars. Requires Elementor"
728
+ },
729
+ {
730
+ "name": "elementor_get_page_data",
731
+ "description": "Get Elementor editor data for a post/page: widgets used, elements count. Requires Elementor"
732
+ }
130
733
  ],
131
734
  "keywords": [
132
735
  "wordpress",
@@ -144,10 +747,20 @@
144
747
  "ecommerce",
145
748
  "content-compression",
146
749
  "content-intelligence",
750
+ "editorial-intelligence",
147
751
  "plugin-intelligence",
148
752
  "plugin-layer",
149
753
  "acf",
150
- "elementor"
754
+ "elementor",
755
+ "schema-org",
756
+ "multilingual",
757
+ "security-audit",
758
+ "performance",
759
+ "full-site-editing",
760
+ "enterprise",
761
+ "governance",
762
+ "audit-trail",
763
+ "multi-site"
151
764
  ],
152
765
  "license": "MIT",
153
766
  "user_config": {
@@ -199,7 +812,11 @@
199
812
  },
200
813
  "compatibility": {
201
814
  "claude_desktop": ">=0.10.0",
202
- "platforms": ["darwin", "win32", "linux"],
815
+ "platforms": [
816
+ "darwin",
817
+ "win32",
818
+ "linux"
819
+ ],
203
820
  "runtimes": {
204
821
  "node": ">=18.0.0"
205
822
  }