@noleemits/vision-builder-control-mcp 4.15.1 → 4.16.0

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 (3) hide show
  1. package/README.md +1 -1
  2. package/index.js +64 -2
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Vision Builder Control — MCP Server
2
2
 
3
- **v4.2.2** | 63 tools for WordPress + Elementor management via Claude
3
+ **v4.15.2** | 65+ tools for WordPress + Elementor management via Claude
4
4
 
5
5
  ## Quick Start
6
6
 
package/index.js CHANGED
@@ -104,7 +104,7 @@ process.on('SIGINT', () => {
104
104
  // CONFIG
105
105
  // ================================================================
106
106
 
107
- const VERSION = '4.15.1';
107
+ const VERSION = '4.16.0';
108
108
  const MIN_PLUGIN_VERSION = '4.13.0'; // Minimum WP plugin version required by this MCP server
109
109
 
110
110
  // ================================================================
@@ -2051,7 +2051,7 @@ function getToolDefinitions() {
2051
2051
  },
2052
2052
  {
2053
2053
  name: 'find_replace',
2054
- description: 'Global find & replace across all Elementor pages. Searches heading titles, text-editor HTML, button text, image-box titles/descriptions, icon-list items, toggle titles/content, and image alt text. Supports literal text or regex. Always preview with dry_run=true first.',
2054
+ description: 'Global find & replace across all Elementor pages. Searches heading titles, text-editor HTML, button text, image-box titles/descriptions, icon-box titles/descriptions, icon-list items, toggle titles/content, and image alt text. Supports literal text or regex. Always preview with dry_run=true first.',
2055
2055
  inputSchema: {
2056
2056
  type: 'object',
2057
2057
  properties: {
@@ -2116,6 +2116,7 @@ function getToolDefinitions() {
2116
2116
  post_type: { type: 'string', description: '"post", "page", "any" (default), or CPT slug' },
2117
2117
  status: { type: 'string', description: 'Comma-separated: publish,draft,private (default: all three)' },
2118
2118
  search: { type: 'string', description: 'Search by keyword' },
2119
+ category: { type: 'string', description: 'Filter by category: ID (number) or slug (string). Only applies to post types with categories.' },
2119
2120
  per_page: { type: 'number', description: 'Results per page, max 100 (default: 50)' },
2120
2121
  page: { type: 'number', description: 'Page number (default: 1)' }
2121
2122
  }
@@ -2229,6 +2230,35 @@ function getToolDefinitions() {
2229
2230
  }
2230
2231
  }
2231
2232
  },
2233
+ {
2234
+ name: 'update_term_seo',
2235
+ description: 'Update RankMath SEO fields on a taxonomy term (category, tag, custom taxonomy). Accepts any subset: title, description, focus_keyword, canonical_url, noindex (boolean convenience flag).',
2236
+ inputSchema: {
2237
+ type: 'object',
2238
+ properties: {
2239
+ term_id: { type: 'number', description: 'WordPress term ID' },
2240
+ taxonomy: { type: 'string', description: 'Taxonomy slug, e.g. "category", "post_tag", "testimonial-category"' },
2241
+ title: { type: 'string', description: 'SEO meta title' },
2242
+ description: { type: 'string', description: 'SEO meta description' },
2243
+ focus_keyword: { type: 'string', description: 'Primary focus keyword' },
2244
+ canonical_url: { type: 'string', description: 'Canonical URL' },
2245
+ noindex: { type: 'boolean', description: 'Set true to noindex this term archive' }
2246
+ },
2247
+ required: ['term_id']
2248
+ }
2249
+ },
2250
+ {
2251
+ name: 'get_term_seo',
2252
+ description: 'Read current RankMath SEO fields for a taxonomy term.',
2253
+ inputSchema: {
2254
+ type: 'object',
2255
+ properties: {
2256
+ term_id: { type: 'number', description: 'WordPress term ID' },
2257
+ taxonomy: { type: 'string', description: 'Optional taxonomy slug for validation' }
2258
+ },
2259
+ required: ['term_id']
2260
+ }
2261
+ },
2232
2262
  // ── Taxonomies ──
2233
2263
  {
2234
2264
  name: 'list_taxonomies',
@@ -3678,6 +3708,7 @@ async function handleToolCall(name, args) {
3678
3708
  if (args.post_type) params.set('post_type', args.post_type);
3679
3709
  if (args.status) params.set('status', args.status);
3680
3710
  if (args.search) params.set('search', args.search);
3711
+ if (args.category) params.set('category', args.category);
3681
3712
  if (args.per_page) params.set('per_page', args.per_page);
3682
3713
  if (args.page) params.set('page', args.page);
3683
3714
  const qs = params.toString() ? `?${params.toString()}` : '';
@@ -3808,6 +3839,37 @@ async function handleToolCall(name, args) {
3808
3839
  return ok(out);
3809
3840
  }
3810
3841
 
3842
+ case 'update_term_seo': {
3843
+ const { term_id, taxonomy, ...seoFields } = args;
3844
+ const body = { ...seoFields };
3845
+ if (taxonomy) body.taxonomy = taxonomy;
3846
+ const r = await apiCall(`/terms/${term_id}/seo`, 'POST', body);
3847
+ if (!r.success) return ok(`Failed: ${r.message || 'Unknown error'}`);
3848
+ let out = `SEO updated for term "${r.name}" (${r.taxonomy}, ID ${r.term_id})!\nFields changed: ${r.updated_fields.join(', ')}\n\n--- Current SEO ---\n`;
3849
+ if (r.seo) {
3850
+ for (const [k, v] of Object.entries(r.seo)) {
3851
+ out += ` ${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}\n`;
3852
+ }
3853
+ }
3854
+ return ok(out);
3855
+ }
3856
+
3857
+ case 'get_term_seo': {
3858
+ const { term_id, taxonomy } = args;
3859
+ const qs = taxonomy ? `?taxonomy=${encodeURIComponent(taxonomy)}` : '';
3860
+ const r = await apiCall(`/terms/${term_id}/seo${qs}`);
3861
+ if (!r.success) return ok(`Failed: ${r.message || 'Unknown error'}`);
3862
+ let out = `SEO for term "${r.name}" (${r.taxonomy}, ID ${r.term_id}):\n`;
3863
+ if (r.seo) {
3864
+ for (const [k, v] of Object.entries(r.seo)) {
3865
+ out += ` ${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}\n`;
3866
+ }
3867
+ } else {
3868
+ out += ' No RankMath SEO data set on this term.';
3869
+ }
3870
+ return ok(out);
3871
+ }
3872
+
3811
3873
  // ── Taxonomies ──
3812
3874
 
3813
3875
  case 'list_taxonomies': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@noleemits/vision-builder-control-mcp",
3
- "version": "4.15.1",
3
+ "version": "4.16.0",
4
4
  "description": "Vision Builder Control MCP server - design token-driven page builder tools for WordPress/Elementor websites",
5
5
  "type": "module",
6
6
  "main": "index.js",