docs: add SKILLS.md — full tool reference (267 tools, b1–b12 documented in full)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q8t9GEyyLZbUQu26na1JQg
This commit is contained in:
@@ -0,0 +1,302 @@
|
|||||||
|
# Advanced MCP Plugin by AskTam — Tool Skills Reference
|
||||||
|
|
||||||
|
> Auto-generated from the live tool registry on 2026-10-16.
|
||||||
|
> Plugin: `colorlink/advanced-mcp-plugin` · GPL-2.0-or-later · namespace `AskTamMCP\`.
|
||||||
|
> Total tools: **267**. Of these, **60** are net-new merge additions (batches b1–b12); the rest are the core/baseline set.
|
||||||
|
|
||||||
|
## How tools are defined
|
||||||
|
Each tool: `name`, `scope` (read|write), a JSON input schema, and a static handler `Class::method(array $args): array`. Handlers throw `\RuntimeException` on error. Empty PHP arrays are cast to `new \stdClass()` so they serialize as `{}` not `[]`.
|
||||||
|
|
||||||
|
## Architecture / adding tools
|
||||||
|
Add a batch = drop one file `includes/Extensions/BatchN.php` that registers on the `asktam_mcp_register_tools` hook. The main file glob-auto-discovers `Batch*.php` (priority 20, `class_exists` + try/catch per batch), so no core edits are needed and a broken batch cannot fatal the plugin. Guard families for absent plugins with `defined()` / `class_exists()` / theme checks so they stay inert where the dependency is missing and auto-activate where present.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Net-new merge additions (b1–b12)
|
||||||
|
|
||||||
|
### b1 — Elementor structure (net-new gaps)
|
||||||
|
Guard: `defined('ELEMENTOR_VERSION')`. Fills gaps the base Elementor set missed. Writes to `_elementor_data`; CSS is regenerated on save.
|
||||||
|
|
||||||
|
**`elementor_add_section`**
|
||||||
|
Add a classic Elementor section (legacy row layout). Optional parent_id nests it; settings accepts gap, content_width, background_color, padding, etc.
|
||||||
|
Args: `post_id:integer` **(req)**, `parent_id:string`, `position:integer`, `settings:object`
|
||||||
|
|
||||||
|
**`elementor_add_column`**
|
||||||
|
Add a column inside a section. size is the column width in percent (1-100, default 100).
|
||||||
|
Args: `post_id:integer` **(req)**, `section_id:string` **(req)**, `size:integer`, `position:integer`, `settings:object`
|
||||||
|
|
||||||
|
**`elementor_set_global_font`**
|
||||||
|
Add or update a typography entry in the Elementor global font palette (system_typography).
|
||||||
|
Args: `id:string`, `title:string` **(req)**, `font_family:string` **(req)**, `font_weight:string`
|
||||||
|
|
||||||
|
**`elementor_delete_global_color`**
|
||||||
|
Remove a colour from the Elementor global palette by its id.
|
||||||
|
Args: `id:string` **(req)**
|
||||||
|
|
||||||
|
**`elementor_delete_template`**
|
||||||
|
Delete a saved Elementor library template permanently.
|
||||||
|
Args: `template_id:integer` **(req)**
|
||||||
|
|
||||||
|
### b2 — SEO (extended) + text extraction
|
||||||
|
Guard: `none (SEO plugin auto-detected)`. seo_* auto-detect Yoast / RankMath / SEOPress and map each one's meta keys. On a site with no SEO plugin they report plugin=none (not an error). extract_page_text walks post content + Elementor data.
|
||||||
|
|
||||||
|
**`seo_detect`**
|
||||||
|
Detect which SEO plugin is active (Yoast, RankMath, SEOPress, AIOSEO) and whether extended meta read/write is supported.
|
||||||
|
Args: _(no args)_
|
||||||
|
|
||||||
|
**`seo_get_extended`**
|
||||||
|
Get extended SEO meta for a post: title, description, canonical, OG title/description/image, Twitter title, robots. Supports Yoast, RankMath, SEOPress.
|
||||||
|
Args: `post_id:integer` **(req)**
|
||||||
|
|
||||||
|
**`seo_update_extended`**
|
||||||
|
Update extended SEO meta on a post. Only supplied fields change. Supports Yoast, RankMath, SEOPress.
|
||||||
|
Args: `post_id:integer` **(req)**, `title:string`, `description:string`, `canonical:string`, `og_title:string`, `og_description:string`, `og_image:string`, `twitter_title:string`, `noindex:boolean`, `nofollow:boolean`
|
||||||
|
|
||||||
|
**`seo_bulk_audit`**
|
||||||
|
Scan posts/pages for missing SEO title or meta description. Returns the offenders.
|
||||||
|
Args: `post_types:array`, `per_page:integer`
|
||||||
|
|
||||||
|
**`extract_page_text`**
|
||||||
|
Extract all human-readable text from a page: title, excerpt, post content, and every Elementor text node (with element_id + field) — for translation, audit, or rewriting.
|
||||||
|
Args: `post_id:integer` **(req)**
|
||||||
|
|
||||||
|
### b3 — Accessibility audit (read-only)
|
||||||
|
Guard: `none`. WCAG 2.1 relative-luminance math (verified #777/#fff = 4.48:1). Walks post content via DOMDocument + Elementor data. All read-only.
|
||||||
|
|
||||||
|
**`a11y_contrast_check`**
|
||||||
|
Compute the WCAG 2.1 contrast ratio between two hex colours and report AA/AAA pass for normal and large text.
|
||||||
|
Args: `foreground:string` **(req)**, `background:string` **(req)**
|
||||||
|
|
||||||
|
**`a11y_audit_page`**
|
||||||
|
Accessibility audit of one page: images missing alt text, heading-order skips, and empty links/buttons. Scans post content and Elementor data.
|
||||||
|
Args: `post_id:integer` **(req)**
|
||||||
|
|
||||||
|
**`a11y_heading_outline`**
|
||||||
|
Return the ordered heading outline (level + text) of a page and flag skipped heading levels.
|
||||||
|
Args: `post_id:integer` **(req)**
|
||||||
|
|
||||||
|
**`a11y_images_missing_alt`**
|
||||||
|
List media-library image attachments that have no alt text.
|
||||||
|
Args: `per_page:integer`
|
||||||
|
|
||||||
|
**`a11y_audit_site`**
|
||||||
|
Run the page accessibility audit across published pages/posts and return per-page issue counts.
|
||||||
|
Args: `post_types:array`, `per_page:integer`
|
||||||
|
|
||||||
|
### b4 — WPML translation audit
|
||||||
|
Guard: `defined('ICL_SITEPRESS_VERSION')`. Uses the WPML filter API (apply_filters wpml_*). Inert unless WPML is active.
|
||||||
|
|
||||||
|
**`wpml_list_languages`**
|
||||||
|
List all WPML languages: code, name, native name, active flag, and which is the default.
|
||||||
|
Args: _(no args)_
|
||||||
|
|
||||||
|
**`wpml_get_post_language`**
|
||||||
|
Get the WPML language code of a post.
|
||||||
|
Args: `post_id:integer` **(req)**
|
||||||
|
|
||||||
|
**`wpml_get_translations`**
|
||||||
|
Get the full translation group of a post: for each language, the translated post id, title, status, and whether it exists.
|
||||||
|
Args: `post_id:integer` **(req)**
|
||||||
|
|
||||||
|
**`wpml_missing_translations`**
|
||||||
|
List the WPML languages a post is NOT yet translated into.
|
||||||
|
Args: `post_id:integer` **(req)**
|
||||||
|
|
||||||
|
**`wpml_audit`**
|
||||||
|
Audit published posts/pages for missing translations across all active WPML languages. Returns per-language missing counts and the offenders.
|
||||||
|
Args: `post_types:array`, `per_page:integer`
|
||||||
|
|
||||||
|
### b5 — Media & content utilities
|
||||||
|
Guard: `none`. Alt-text writers + link/image hygiene. bulk_set_alt_from_title derives alt from attachment title; find_broken_internal_links checks same-host links only.
|
||||||
|
|
||||||
|
**`set_image_alt`**
|
||||||
|
Set (or clear) the alt text of a media-library image attachment.
|
||||||
|
Args: `attachment_id:integer` **(req)**, `alt:string` **(req)**
|
||||||
|
|
||||||
|
**`bulk_set_alt_from_title`**
|
||||||
|
Backfill alt text for image attachments from their title (or a humanized filename). By default only fills images that have no alt; set overwrite=true to replace existing alts.
|
||||||
|
Args: `per_page:integer`, `overwrite:boolean`
|
||||||
|
|
||||||
|
**`find_broken_internal_links`**
|
||||||
|
Scan published posts/pages for internal links whose target slug does not resolve to a post/page (candidate broken links). Heuristic: term/archive URLs may appear as false positives.
|
||||||
|
Args: `post_types:array`, `per_page:integer`
|
||||||
|
|
||||||
|
**`list_large_images`**
|
||||||
|
List media-library images whose file size exceeds a threshold (KB), largest first.
|
||||||
|
Args: `min_kb:integer`, `per_page:integer`
|
||||||
|
|
||||||
|
**`duplicate_title_finder`**
|
||||||
|
Find published posts/pages that share an identical title.
|
||||||
|
Args: `post_types:array`, `per_page:integer`
|
||||||
|
|
||||||
|
### b6 — Gutenberg blocks
|
||||||
|
Guard: `none`. insert_blocks/create_reusable_block build block markup server-side. render_shortcode runs do_shortcode. list_block_types enumerates the registered block registry.
|
||||||
|
|
||||||
|
**`list_block_types`**
|
||||||
|
List registered Gutenberg block types (name, title, category). Optional category filter.
|
||||||
|
Args: `category:string`, `per_page:integer`
|
||||||
|
|
||||||
|
**`insert_blocks`**
|
||||||
|
Insert Gutenberg blocks into a post from a simple spec. Each block: {type, content, level?, items?, url?, alt?, id?}. Types: paragraph, heading, list, image, quote, html. mode=append (default) or replace.
|
||||||
|
Args: `post_id:integer` **(req)**, `blocks:array` **(req)**, `mode:string(append|replace)`
|
||||||
|
|
||||||
|
**`create_reusable_block`**
|
||||||
|
Create a reusable block (wp_block) from a block spec or raw block markup.
|
||||||
|
Args: `title:string` **(req)**, `blocks:array`, `markup:string`
|
||||||
|
|
||||||
|
**`list_reusable_blocks`**
|
||||||
|
List reusable blocks (wp_block posts).
|
||||||
|
Args: `per_page:integer`
|
||||||
|
|
||||||
|
**`render_shortcode`**
|
||||||
|
Render a shortcode string to HTML via do_shortcode, optionally in the context of a post.
|
||||||
|
Args: `shortcode:string` **(req)**, `post_id:integer`
|
||||||
|
|
||||||
|
### b7 — WPBakery (js_composer)
|
||||||
|
Guard: `defined('WPB_VC_VERSION')`. Elements enumerated via WPBMap::getAllShortCodes(). Inert on sites without WPBakery (verified GUARD_OK on mainwp). FUNCTIONAL TEST STILL PENDING on a js_composer site.
|
||||||
|
|
||||||
|
**`wpbakery_detect`** — _(guarded off where WPBakery absent — not in the live mainwp registry; activates on js_composer sites)_
|
||||||
|
|
||||||
|
**`wpbakery_list_elements`** — _(guarded off where WPBakery absent)_
|
||||||
|
|
||||||
|
**`wpbakery_get_content`** — _(guarded off where WPBakery absent)_
|
||||||
|
|
||||||
|
**`wpbakery_add_element`** — _(guarded off where WPBakery absent)_
|
||||||
|
|
||||||
|
**`wpbakery_replace_text`** — _(guarded off where WPBakery absent)_
|
||||||
|
|
||||||
|
### b8 — Remote-data presets
|
||||||
|
Guard: `none (outbound HTTP)`. wp_remote_get + transient cache (prefix amp_rd_). API keys are passed per-call and NEVER stored. remote_weather=OpenWeather, remote_place_reviews=Google Places.
|
||||||
|
|
||||||
|
**`remote_fetch_json`**
|
||||||
|
Fetch a JSON URL (GET) with transient caching. Optional dot-path (e.g. "data.0.name") extracts part of the response. cache_minutes default 15.
|
||||||
|
Args: `url:string` **(req)**, `cache_minutes:integer`, `path:string`, `headers:object`
|
||||||
|
|
||||||
|
**`remote_weather`**
|
||||||
|
Current weather from OpenWeather. Provide api_key and either city or lat+lon. units=metric (default) or imperial. Cached 30 min.
|
||||||
|
Args: `api_key:string` **(req)**, `city:string`, `lat:number`, `lon:number`, `units:string(metric|imperial)`
|
||||||
|
|
||||||
|
**`remote_place_reviews`**
|
||||||
|
Google Place rating + reviews via Places Details API. Provide api_key and place_id. Cached 60 min.
|
||||||
|
Args: `api_key:string` **(req)**, `place_id:string` **(req)**
|
||||||
|
|
||||||
|
**`remote_list_cache`**
|
||||||
|
List cached remote-data entries (key + size).
|
||||||
|
Args: _(no args)_
|
||||||
|
|
||||||
|
**`remote_clear_cache`**
|
||||||
|
Clear cached remote-data. Provide key to clear one, or omit to clear all remote-data cache.
|
||||||
|
Args: `key:string`
|
||||||
|
|
||||||
|
### b9 — Backup / export (Elementor)
|
||||||
|
Guard: `defined('ELEMENTOR_VERSION')`. export/import round-trips `_elementor_data` as JSON; import uses wp_slash(wp_json_encode(...)) and regenerates element IDs to avoid collisions.
|
||||||
|
|
||||||
|
**`export_elementor_page`**
|
||||||
|
Export a page's Elementor data: parsed elements, page settings, and template. Use as a backup or to clone into another page.
|
||||||
|
Args: `post_id:integer` **(req)**
|
||||||
|
|
||||||
|
**`import_elementor_page`**
|
||||||
|
Import Elementor data into a target post. Provide elementor_data (JSON string or array). regenerate_ids=true gives every element a fresh id.
|
||||||
|
Args: `post_id:integer` **(req)**, `elementor_data:Array` **(req)**, `regenerate_ids:boolean`
|
||||||
|
|
||||||
|
**`export_global_styles`**
|
||||||
|
Export the active Elementor kit's global styles (colors, typography, and other page settings).
|
||||||
|
Args: _(no args)_
|
||||||
|
|
||||||
|
**`import_global_styles`**
|
||||||
|
Write global styles into the active Elementor kit. merge=true (default) merges into existing settings; false replaces them.
|
||||||
|
Args: `settings:object` **(req)**, `merge:boolean`
|
||||||
|
|
||||||
|
**`duplicate_elementor_page`**
|
||||||
|
Duplicate a page including its Elementor data into a new post (default draft).
|
||||||
|
Args: `source_id:integer` **(req)**, `title:string`, `status:string`
|
||||||
|
|
||||||
|
### b10 — Memory layer (KV store)
|
||||||
|
Guard: `none`. Option-backed by default; ttl_minutes>0 switches to a transient. Keys sanitized to [a-z0-9_-] and prefixed ampmem_. Values are strings — JSON-encode structured data yourself. memory_append maintains a newline list.
|
||||||
|
|
||||||
|
**`memory_set`**
|
||||||
|
Store a string value under a key. Optional ttl_minutes makes it expire (otherwise it persists). For structured data, pass JSON text as value.
|
||||||
|
Args: `key:string` **(req)**, `value:string` **(req)**, `ttl_minutes:integer`
|
||||||
|
|
||||||
|
**`memory_get`**
|
||||||
|
Retrieve a stored value by key.
|
||||||
|
Args: `key:string` **(req)**
|
||||||
|
|
||||||
|
**`memory_list`**
|
||||||
|
List stored memory keys, optionally filtered by prefix.
|
||||||
|
Args: `prefix:string`
|
||||||
|
|
||||||
|
**`memory_delete`**
|
||||||
|
Delete a stored value by key.
|
||||||
|
Args: `key:string` **(req)**
|
||||||
|
|
||||||
|
**`memory_append`**
|
||||||
|
Append an item to a newline-delimited list stored at key (created if absent).
|
||||||
|
Args: `key:string` **(req)**, `item:string` **(req)**
|
||||||
|
|
||||||
|
### b11 — Motion / GSAP
|
||||||
|
Guard: `defined('ELEMENTOR_VERSION')`. Entrance animations (_animation/_animation_delay) + scroll motion-fx (translateY parallax / opacity). motion_apply_preset staggers delay across top-level elements. Recursive element walk by id.
|
||||||
|
|
||||||
|
**`motion_list_presets`**
|
||||||
|
List available entrance animations, scroll motion-FX effects, and named preset bundles.
|
||||||
|
Args: _(no args)_
|
||||||
|
|
||||||
|
**`motion_set_entrance`**
|
||||||
|
Set an Elementor entrance animation (and optional delay in ms) on one element by its id within a post.
|
||||||
|
Args: `post_id:integer` **(req)**, `element_id:string` **(req)**, `animation:string` **(req)**, `delay_ms:integer`
|
||||||
|
|
||||||
|
**`motion_set_scroll_fx`**
|
||||||
|
Apply a scroll motion-FX (translateY parallax or opacity fade) to one Elementor element by id.
|
||||||
|
Args: `post_id:integer` **(req)**, `element_id:string` **(req)**, `effect:string(translateY|opacity)` **(req)**, `speed:integer`
|
||||||
|
|
||||||
|
**`motion_apply_preset`**
|
||||||
|
Apply a named motion preset bundle to all top-level elements of an Elementor post (staggered).
|
||||||
|
Args: `post_id:integer` **(req)**, `preset:string` **(req)**
|
||||||
|
|
||||||
|
**`motion_clear`**
|
||||||
|
Remove entrance animation and scroll motion-FX settings from one element (or all top-level elements if element_id omitted).
|
||||||
|
Args: `post_id:integer` **(req)**, `element_id:string`
|
||||||
|
|
||||||
|
### b12 — Woodmart theme helpers
|
||||||
|
Guard: `active theme = Woodmart`. Writes to the xts-woodmart-options store. set_option is JSON-aware and auto-backs-up the prior value into amp_wd_backup; restore_option reverts or removes. Fully functional on mainwp (Woodmart 8.4.1).
|
||||||
|
|
||||||
|
**`woodmart_detect`**
|
||||||
|
Report whether the Woodmart theme is active and its version.
|
||||||
|
Args: _(no args)_
|
||||||
|
|
||||||
|
**`woodmart_get_option`**
|
||||||
|
Read one Woodmart theme option by key.
|
||||||
|
Args: `key:string` **(req)**
|
||||||
|
|
||||||
|
**`woodmart_list_options`**
|
||||||
|
List Woodmart theme option keys (and value types), optionally filtered by prefix.
|
||||||
|
Args: `prefix:string`
|
||||||
|
|
||||||
|
**`woodmart_set_option`**
|
||||||
|
Set one Woodmart theme option. value is parsed as JSON when valid (so arrays/booleans/numbers work), otherwise stored as a string. The prior value is auto-backed-up for woodmart_restore_option.
|
||||||
|
Args: `key:string` **(req)**, `value:string` **(req)**
|
||||||
|
|
||||||
|
**`woodmart_restore_option`**
|
||||||
|
Restore one Woodmart option to the value saved before the last woodmart_set_option (or remove it if there was none).
|
||||||
|
Args: `key:string` **(req)**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Core / baseline tools
|
||||||
|
|
||||||
|
The pre-existing plugin tools (Elementor base set, core WordPress CRUD, WooCommerce, media, menus, users, options, SEO base, etc.). Full definitions are the live registry; this section is a grouped index by name prefix. Regenerate the full listing any time with the dump + generator scripts noted at the foot of this file.
|
||||||
|
|
||||||
|
Counts by prefix (267 total = 212 core + 55 net-new live; b7's 5 WPBakery tools are guarded off on mainwp):
|
||||||
|
`activate` 1 · `add` 1 · `ai` 1 · `approve` 1 · `cli` 2 · `count` 3 · `create` 6 · `deactivate` 1 · `delete` 11 · `elementor` 56 · `email` 3 · `fs` 5 · `generate` 2 · `get` 31 · `list` 13 · `pexels` 2 · `read` 1 · `reorder` 1 · `run` 1 · `search` 1 · `send` 1 · `set` 2 · `spam` 1 · `sql` 3 · `switch` 1 · `theme` 7 · `transient` 5 · `trash` 1 · `update` 13 · `upload` 1 · `wc` 27 · `widget` 5 · `wp` 1 · `write` 1
|
||||||
|
|
||||||
|
(The net-new families above — a11y, seo, wpml, memory, motion, remote, woodmart, plus the b1/b5/b6/b9 additions — are documented in full in the section above.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Regenerating this file
|
||||||
|
Against the live registry on the target container:
|
||||||
|
1. `/tmp/dev_dump_defs.php` — bootstraps wp-load, calls `new \AskTamMCP\MCP\Registry()->getToolDefinitions()`, writes `amp_defs.json`.
|
||||||
|
2. `/tmp/dev_gen_skills.js` — formats that JSON into this grouped reference.
|
||||||
|
Re-run both whenever a batch is added so the count and listings stay in sync.
|
||||||
|
|
||||||
|
_End of reference._
|
||||||
Reference in New Issue
Block a user