@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.
- package/README.md +1 -1
- package/index.js +64 -2
- package/package.json +1 -1
package/README.md
CHANGED
package/index.js
CHANGED
|
@@ -104,7 +104,7 @@ process.on('SIGINT', () => {
|
|
|
104
104
|
// CONFIG
|
|
105
105
|
// ================================================================
|
|
106
106
|
|
|
107
|
-
const VERSION = '4.
|
|
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.
|
|
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",
|