All MCP tools
Generated from a live
tools/listcall onhttps://seo-navigator-mcp.autumn-recipe-cac7.workers.dev/mcp, last hand-updated 2026-06-19.Total surface: 76 built-in tools plus proxy tools from
wp-mcp-adapter(WordPress) andgohighlevel(HighLevel CRM) on linked sites. Some are conditionally hidden or refuse at runtime — see legend below.See Tokens & scoping for how to control what a token can call, and Account safety below for the risk-tier cap and write-confirm gate that every write tool now passes through.
Account safety: risk tiers & the write-confirm gate
Section titled “Account safety: risk tiers & the write-confirm gate”Every built-in tool carries a risk tier. Two independent controls read it:
| Tier | Meaning | Examples |
|---|---|---|
| T0 | read-only, no state change | list_sites, get_post, get_ga4_report, clarity_get_metrics |
| T1 | reversible content / draft write — never publishes or deletes | create_draft, set_seo_meta, write_astro_file |
| T2 | external write (CRM / Drive), also super-admin flag-gated | drive_save_audit |
| T3 | production publish / push, also flag-gated | publish_post, publish_page |
| T4 | destructive / admin, super-admin only | delete_astro_route |
- Write-confirm gate — any tool at tier ≥ T1 must be called with
confirm: true. Without it the tool returns aneeds_confirmationpreview (what it would do) and changes nothing. This protects against a tool being invoked by mistake. Theconfirmparameter is auto-added to every built-in write tool’s input schema. A token withskip_write_confirmset (super-admin only — for trusted automation) bypasses this gate. - Per-account risk cap — a token or user can carry a
max_riskceiling. A call to a tool above the ceiling is refused (auditedrisk_capped) before it runs. Use it to contain a leaked automation token to read-only (max_risk = 0) or drafts-only (max_risk = 1).
Dynamic proxy tools are tiered by action verb: a GoHighLevel / wp-mcp-adapter write is treated as T2, a read as T0. See Tokens & scoping.
Built-in tools
Section titled “Built-in tools”These tools are part of the SEO Navigator worker itself. They are always available regardless of which sites a token is scoped to (as long as the tool’s required platform credentials are configured).
Discovery
Section titled “Discovery”| Tool | Description |
|---|---|
list_sites | List sites this token can access. Each row carries project_id plus an integrations object — config-presence flags for gohighlevel, clarity, ga4, gsc, google_ads, meta_ads, drive, github, rankmath (project defaults honoured for the Google/GitHub fields). Presence means configured, not probed — diagnose_site does live checks. |
list_projects | List projects visible to this token (a project shows when the token can reach at least one of its sites; wildcard tokens see all). Each row: id, name, site_count, sites[], and integration flags OR-rolled-up across member sites. Use list_sites for per-site detail. |
get_site | Get one site’s full configuration: platform, base URL, builders, MCP backend, and any linked GitHub repo (with branch + path prefix). |
ping_site | Verify auth + connectivity to a site. |
diagnose_site | Report the install state of a site. WordPress: WP REST OK, Elementor active+version, functions.php snippet applied, WP MCP Adapter + msrbuilds/elementor-mcp installed, seo-navigator-code-page installed, RankMath bridge installed + active, saswp bridge installed + active (+ entry count). GoHighLevel: Drive folder reachable + Clarity token works + super-admin gates. Use this BEFORE asking the user to install plugins. |
list_builders_for_site | List the page builders enabled for a WordPress site. Returns { available: [“gutenberg”, “elementor”], default: “gutenberg”, multiple: true }. Call this BEFORE create_page_draft when you have not yet asked the user which builder to use — if multiple is true, ask the user; if false, the only available builder is implied. |
list_wp_users | List WordPress users with their roles (read-only, WordPress only). Goes straight to WP core REST GET /wp/v2/users — does NOT depend on the wordpress/mcp-adapter plugin registering a users ability. Returns id, name, slug, email, roles, url. Email + roles only come back when the site’s app-password user has the list_users capability (admin). Optional filters: roles, search, page, per_page (max 100). |
Read (posts)
Section titled “Read (posts)”| Tool | Description |
|---|---|
get_post | Fetch one post (any status). |
list_drafts | List drafts and scheduled posts (never published). |
Write (posts, both WP + Duda)
Section titled “Write (posts, both WP + Duda)”| Tool | Description |
|---|---|
create_draft | Create a new draft post on the given site. |
update_draft | Update fields of an existing draft. |
schedule_draft | Schedule a draft to publish at a future ISO8601 time (>= 60s lead). |
unschedule | Return a scheduled post to draft state. |
upload_media | Upload an image to a site (WordPress only currently). |
list_taxonomies | List tags or categories on a site (WordPress only). |
create_taxonomy | Create a new tag or category (WordPress only). |
Pages (WordPress + Duda)
Section titled “Pages (WordPress + Duda)”| Tool | Description |
|---|---|
create_page_draft | Create a new draft Page. WordPress: per-request ‘page_builder’ overrides the site default (gutenberg|elementor); Elementor needs elementor_template_id + variables. Duda: pages are created with draft_status=DRAFT and never auto-publish. |
update_page_draft | Update fields of an existing Page draft. WordPress + Elementor: providing elementor_template_id + variables re-clones from template. Duda: set publish_on_next_site_publish=true to flip to STAGED_DRAFT (publishes on next site update); omit it to keep the page in DRAFT. |
schedule_page | Schedule a draft Page (WordPress only) to publish at a future ISO8601 time (>= 60s lead). Duda has no time-based page schedule — use update_page_draft with publish_on_next_site_publish=true instead. |
list_page_templates | List Elementor page templates available for duplicate-and-fill. Returns id, title, and placeholders (e.g. {{HERO_H1}}) for each template. Gutenberg + Duda sites return []. |
Pages (Duda extras)
Section titled “Pages (Duda extras)”| Tool | Description |
|---|---|
duplicate_page | Duplicate an existing Duda page into a new DRAFT page. Returns the new page’s uuid. Duda only — for WordPress + Elementor templates use create_page_draft with elementor_template_id instead. |
inject_page_section | Append a reusable SECTION element to a Duda page (Content Injection). element_source_id is the section’s site-alias as exposed by the Duda dashboard. Duda only. |
Publish (opt-in per site)
Section titled “Publish (opt-in per site)”These tools refuse with E_PUBLISH_NOT_ALLOWED until a super-admin enables
the allow_publish flag on the site. See
Publishing & preview branches.
| Tool | Description |
|---|---|
publish_post ⚙ flagged | Flip a draft / scheduled post to published. WordPress + Duda. Audit-logged. |
publish_page ⚙ flagged | Flip a draft page to published. Works for Gutenberg / Elementor / code-first (all use WP REST POST /pages/:id) and Duda Pages (PUT draft_status=PUBLISHED). |
Code-first pages (WordPress only)
Section titled “Code-first pages (WordPress only)”| Tool | Description |
|---|---|
create_page_from_code | Create a WordPress page from raw HTML + CSS + JS files (a “code page”). Use this when the user has hand-built a design in Claude Code and wants to deploy it as a WP page. The server auto-scopes CSS to a deterministic class derived from (site_id, slug), wraps HTML in a Gutenberg block, and stores CSS/JS as page meta. Requires the WP plugin seo-navigator-code-page to be installed on the target site (check with diagnose_site). WordPress only. Pages are always created as drafts. |
update_page_from_code | Update an existing code page. Pass only the parts you want to change (html, css, js, title…). The scope class stays the same as long as slug is unchanged, so external CSS caches do not invalidate. WordPress only. |
GitHub markdown sync
Section titled “GitHub markdown sync”| Tool | Description |
|---|---|
save_md_to_github | Save a markdown document into the GitHub repo linked to a site. Creates or updates the file; pass sha when updating. Body MUST already include YAML frontmatter (use serializeMarkdown convention). Commit message is auto-prefixed with [content @ |
read_md_from_github | Read a single markdown file from the GitHub repo linked to a site. Returns frontmatter object, body string, and sha (needed for subsequent updates). Used by both content (re-edit) and design (deploy) teams. |
list_md_from_github | List markdown files in the GitHub repo linked to a site. Optional filter by status frontmatter (eg “ready-for-design”). Returns minimal records — call read_md_from_github for the body. |
update_md_status | Patch the frontmatter of an existing markdown file (vd: status=“deployed”, append to deployments array). Body is preserved verbatim. Returns new sha. |
deploy_md_to_site | Read a markdown file from GitHub and deploy it as a draft to a WordPress or Duda site. Dispatches by frontmatter.type (‘post’ → create_draft; ‘page’ → create_page_draft); body markdown is rendered to HTML. Optionally appends the new post_id to the file’s frontmatter.deployments array (use update_md_status afterwards to commit). Returns the new post/page ref. |
Astro routes (deploy via Cloudflare Pages)
Section titled “Astro routes (deploy via Cloudflare Pages)”| Tool | Description |
|---|---|
create_astro_route | Create a new Astro page at a route in the linked Cloudflare Pages repo. Wraps the supplied HTML in an Astro template, writes src/pages/ |
update_astro_route | Overwrite an existing Astro route. Same arg shape as create_astro_route plus an optional ‘sha’ for optimistic concurrency. The worker re-wraps the HTML and pushes a new commit. Refuses if the existing file was not generated by this server (no MCP marker), to avoid clobbering hand-written .astro files. |
list_astro_routes | List Astro pages in the linked Cloudflare Pages repo. Walks src/pages/**/*.astro from the configured branch and returns each route’s URL, file path, sha, and whether it was generated by this server. |
delete_astro_route ⚠ super-admin | Delete an Astro page file from the linked Cloudflare Pages repo. SUPER-ADMIN TOKENS ONLY — regular-user tokens cannot use this even if the scope includes it. Refuses by default if the file was not generated by this server (no MCP marker); pass force=true to delete any .astro file. The file is removed from the configured branch — git history preserves it, so recovery is via git revert. |
check_astro_deploy ⓞ optional | Query Cloudflare Pages for the status of the latest deployment of a site, or the deployment matching a specific commit_sha. Returns status (pending|building|success|failure|canceled), stage, optional preview URL, and a log_url that points to the Cloudflare dashboard for debugging. Call this after create_astro_route / update_astro_route — the build usually finishes in 30-90 seconds. Optional tool: requires CLOUDFLARE_API_TOKEN + CLOUDFLARE_ACCOUNT_ID worker secrets; not visible if those are not set. |
Astro source files (components, styles, content)
Section titled “Astro source files (components, styles, content)”| Tool | Description |
|---|---|
read_astro_file | Read any source file from the linked Astro repo back into the chat. Blocks .env*, .github/**, node_modules/, dist/, and path traversal; config files are readable. |
list_astro_files | List files in the repo, optionally filtered by path prefix + extension. Same blocklist as read. |
write_astro_file | Create / overwrite a file under src/components/, src/styles/, src/layouts/, src/content/, or public/. Refuses src/pages/ (use create_astro_route), config files, and secrets. allow_overwrite defaults to false. Honors target_branch (preview default). Capped at 900 KB per file. |
bulk_write_astro_files ⚙ flagged | Push N files in ONE git commit (Git Data API). Requires allow_full_repo_write. Path whitelist is dropped (still blocks secrets). Handles empty repos. Limits: ≤1000 files / ≤100 MB total / ≤25 MB per file. |
init_astro_project ⚙ flagged | Scaffold Astro v5 boilerplate (package.json, astro.config, tsconfig, .gitignore, README, env.d.ts, global.css, favicon) + wrap homepage_html as src/pages/index.astro + optional extra_pages. ONE atomic commit. Refuses on cluttered repos (README/LICENSE/.gitignore/.gitattributes/.github OK). Requires allow_full_repo_write + allow_main_branch_push for the default main-branch init. |
reset_astro_preview_branch | Forget the per-token cached Astro preview branch — the next write tool will mint a fresh one off the primary branch HEAD. |
Astro target_branch semantics (applies to create_astro_route,
update_astro_route, write_astro_file):
"preview"(default) — push to a per-session branchmcp/<token>/<unix>. Cloudflare Pages builds a preview deployment; callcheck_astro_deployfor the URL."main"— push directly to the site’sgithub_branch(production trigger). Requiresallow_main_branch_push=1on the site; elseE_MAIN_BRANCH_LOCKED.
See Publishing & preview branches.
RankMath SEO (WordPress only)
Section titled “RankMath SEO (WordPress only)”Enabled per site in the admin form. REST tools need only RankMath active; the plugin tools need the seo-navigator-rankmath bridge + the site’s channel set to plugin. SEO meta/schema is editable on drafts/scheduled only unless the super-admin opts the site in to allow_seo_on_published — when that flag is on, set_seo_meta / set_seo_schema write through on live posts and the audit log row carries _published: true. See Publishing & preview branches.
| Tool | Description |
|---|---|
get_seo_meta | Read RankMath title, description, focus keyword, robots, canonical, OG off a post/page. Read-only. |
set_seo_meta ⚙ flagged | Set any of those fields (rank_math_* via REST). Refuses with E_FORBIDDEN_OP on a published post unless the site has allow_seo_on_published=1. |
set_seo_schema 🔌 plugin · ⚙ flagged | Set rank_math_schema_* structured data. Same published-post guard as set_seo_meta. |
set_seo_redirect 🔌 plugin | Upsert a redirect (source → destination, default 301). Never deletes. |
get_sitemap_status 🔌 plugin | Read the sitemap URL + module status; rebuild=true invalidates the cache. |
Full setup + examples: RankMath SEO workflow.
saswp Custom Schema (WordPress only — bridge plugin)
Section titled “saswp Custom Schema (WordPress only — bridge plugin)”Read/update saswp (“Schema & Structured Data for WP”) Custom Schema JSON-LD. saswp does not expose its custom-schema storage over core REST, so these tools talk to the bridge routes (/sn-saswp/v1/) shipped by seo-navigator-companion (or the standalone seo-navigator-saswp). No per-site toggle — the only requirement is the bridge + saswp active (E_SASWP_BRIDGE_REQUIRED otherwise). diagnose_site reports install state.
| Tool | Description |
|---|---|
get_saswp_schema | List every Custom Schema entry (post_id, type, status, title, value_type, value), one entry by id, or filter with needle (substring match inside the JSON-LD, eg AutomotiveBusiness). Read-only. |
set_saswp_schema | Update one entry’s JSON-LD (write-confirm gated). value must match the value_type a prior read returned (string or array) so storage is never corrupted; string values are validated as JSON before writing. Never deletes, never touches saswp display/target conditions. Updating a GLOBAL entry propagates to every page its display rules target — review with get_saswp_schema first. |
Google Analytics, Search Console, Sheets & Ads (any site — bound Google account)
Section titled “Google Analytics, Search Console, Sheets & Ads (any site — bound Google account)”These read-only tools query Google APIs through the Google account bound to the site (google_user_id, with project-level fallback). The user connects Google once at /admin/users (same per-user OAuth as Drive); the site (or its project) sets ga4_property_id / gsc_site_url / google_ads_customer_id. Available on any platform, not just GoHighLevel. Refuse with E_GOOGLE_NOT_LINKED / E_GA4_NOT_LINKED / E_GSC_NOT_LINKED / E_GOOGLE_ADS_NOT_LINKED when the account or property isn’t configured.
| Tool | Description |
|---|---|
get_ga4_report | Run a Google Analytics 4 report (Analytics Data API runReport). Provide a date range, one or more metrics (eg activeUsers, sessions, screenPageViews, conversions) and optional dimensions (eg date, sessionDefaultChannelGroup, country, pagePath). Read-only. |
get_gsc_search_analytics | Query Search Console search analytics (clicks, impressions, CTR, average position). Date range + optional dimensions (query, page, country, device, date, searchAppearance). Read-only. |
generate_seo_report | One-shot composite report over a date range: GA4 (users/sessions/page views/conversions — totals + by channel) plus Search Console (clicks/impressions/CTR/position — totals + top queries). Pulls only the sources the site has configured; an unconfigured or erroring section is skipped and noted. Returns structured data and a ready-to-paste markdown summary. Read-only. |
read_sheet | Read a value range from a Google Sheet (content workbook) via the site’s bound Google account. Provide spreadsheet_id (from the sheet URL) and range in A1 notation (eg Content!A1:F200). Returns a 2-D array of cell values. Read-only (spreadsheets.readonly). |
get_google_ads_report | Run a Google Ads report via a GAQL query (googleAds:search), eg SELECT campaign.name, metrics.cost_micros, metrics.clicks FROM campaign WHERE segments.date DURING LAST_30_DAYS. Cost fields are in micros (1,000,000 = 1 unit). Uses the site’s google_ads_customer_id (+ optional manager/MCC login-customer-id). Read-only. Prerequisites: the connected Google account must grant the adwords scope (reconnect once after this ships), and the Worker needs an app-level GOOGLE_ADS_DEVELOPER_TOKEN (Basic Access from a Google Ads Manager account) — else E_MISSING_SECRET. |
Meta Marketing — Facebook / Instagram Ads (per-user OAuth)
Section titled “Meta Marketing — Facebook / Instagram Ads (per-user OAuth)”Read-only ad insights via the Meta Graph API. Separate OAuth provider from Google: each worker user clicks Connect Meta at /admin/users once (Facebook Login, ads_read scope); the long-lived (~60-day) token is encrypted with MASTER_TOKEN. The site sets meta_ad_account_id in /admin/sites and binds the same worker user (via google_user_id). Available on any platform.
| Tool | Description |
|---|---|
get_meta_ads_insights | Pull Meta Ads insights (act_{id}/insights) — spend, impressions, clicks, CTR, CPC, actions/conversions. Args: fields, date_preset (default last_30d) or time_range {since,until}, level (account/campaign/adset/ad), breakdowns, time_increment (daily rows), action_breakdowns, sort, action_attribution_windows, limit. Read-only. Refuses E_META_NOT_LINKED (no ad account / worker user), E_META_TOKEN_EXPIRED (reconnect needed), E_META_AUTH (missing ads_read / access). Prerequisites: a Meta App with Facebook Login + ads_read (App Review + Business Verification for production), and META_APP_ID / META_APP_SECRET worker secrets. |
list_meta_ad_accounts | List the ad accounts the bound worker user can reach (me/adaccounts) — id (act_…), name, currency, account_status, amount_spent. Works before meta_ad_account_id is set; use it to discover the id (the admin Sites form has a picker built on the same call). |
get_meta_ad_account | Metadata for the linked ad account: name, currency, account_status, amount_spent, spend_cap, balance, timezone. |
list_meta_campaigns | Campaigns under the linked account — objective, status, effective_status, daily/lifetime budget (minor currency units), start/stop. Filter with effective_status. |
list_meta_adsets | Ad sets for the account, or one campaign via campaign_id — status, budgets, optimization_goal, billing_event, schedule. |
list_meta_ads | Ads for the account, or one ad set via adset_id — status, adset/campaign ids, creative id+name. |
Google Drive (per-user OAuth)
Section titled “Google Drive (per-user OAuth)”Any site can link to one Drive folder owned by a worker user. The user clicks Connect Google at /admin/users once; the refresh token is encrypted with MASTER_TOKEN in D1. Scope is drive.file only (non-sensitive — files this app uploaded or files the user explicitly shared via Picker). The folder is configured per-site in /admin/sites (drive_user_id + drive_folder_id). See Drive + Clarity setup.
| Tool | Description |
|---|---|
drive_get_site_folder | Return metadata for the linked Drive folder (id, name, webViewLink). Read-only. |
drive_list_site_files | List files in the linked folder (newest first). Read-only. |
drive_save_audit ⚙ flagged | Save a CRM-audit document into the folder. Refused by default with E_DRIVE_WRITE_NOT_ALLOWED until a super-admin sets allow_drive_write=1 on the site (honours the SOP “read-only first 90 days” rule). |
drive_read_file | Download the text content of a file in the folder. Read-only. |
drive_get_baseline | Convenience wrapper: locate baseline.md in the folder and return its content. The weekly-audit workflow uses this to load the agreed KPI baseline before composing the diff. Read-only. |
Microsoft Clarity (any site — per-site token)
Section titled “Microsoft Clarity (any site — per-site token)”Any site (WordPress, Duda, Astro, or GoHighLevel) can link to one Microsoft Clarity project — Clarity is website analytics (heatmaps, session recordings, scroll depth), so it fits any platform. Configure clarity_project_id + the Data Export token per-site in /admin/sites; the token is encrypted with MASTER_TOKEN. All Clarity tools are read-only. A daily cron (01:30 UTC) snapshots a 1-day metric pull per linked site (any platform) so clarity_get_historical_metrics can read windows beyond the API’s 3-day cap.
| Tool | Description |
|---|---|
clarity_get_project_info | Probe the Data Export token (numOfDays=1, no dimensions). Returns whether the token works + how many metric blocks come back. Read-only. |
clarity_get_metrics | Pull Clarity insights with up to 3 dimensions (Browser, Device, OS, Country, Source, Medium, Campaign, Channel, URL) over 1-3 days. Read-only. |
clarity_get_session_recordings | Aggregate session + traffic + engagement metric blocks + dashboard deep-link. Public Data Export API does not expose per-session URLs. Read-only. |
clarity_get_heatmap_metrics | Aggregate rage/dead-click + scroll-depth metric blocks + heatmaps deep-link. Public Data Export API does not expose pixel-level heatmaps. Read-only. |
clarity_get_historical_metrics | Read Clarity metrics from D1 daily snapshots over a window larger than the 3-day API cap. The Worker runs a daily cron (01:30 UTC) that persists a 1-day snapshot per linked site; this tool reads from the snapshot table. Returns snapshot_count and days_missing so callers know when the window has gaps. Read-only. |
GoHighLevel CRM analytics
Section titled “GoHighLevel CRM analytics”These tools call GoHighLevel’s REST API directly to compute the metrics used by the CRM-audit workflow. All read-only — no writes (the GHL write gate stays enforced on the proxy tools, not here). See CRM-audit workflow for the end-to-end usage.
| Tool | Description |
|---|---|
ghl_compute_pipeline_funnel | Opportunity counts + stage-to-stage conversion rates for every pipeline in the location, over a look-back window. |
ghl_compute_no_show_rate | Appointment status breakdown + no-show rate (also no-show rate excluding cancelled). |
ghl_compute_sms_stats | SMS reply rate from outbound vs inbound SMS counts. Caps conversations sampled (raise max_conversations for full coverage). |
ghl_compute_tag_hygiene | List tags with usage below the threshold (default 5 uses) — candidates to archive. |
ghl_compute_reactivation_candidates | Contacts with lastActivity older than N days, optional tag filter — pool for reactivation campaigns. |
ghl_get_funnel_stats | Per-page views + opt-ins + opt-in rate for every funnel in the location (closes the §1.5 metric GHL’s MCP server itself does NOT expose). |
ghl_bootstrap_baseline | Compose a draft baseline.md markdown from 30-day GHL data (funnel opt-in rates, pipeline funnel, no-show, reactivation pool size). Caller saves it via drive_save_audit. |
ghl_list_workflows | List automation workflows for the location, with status + last-updated timestamp. Used by §3.2 monthly audit. |
ghl_get_workflow_executions | Execution history for one workflow grouped by status (success / failed / error). Flag dead workflows (zero executions) + high-error workflows. |
ghl_compute_window_compare | Compare two adjacent windows (default 14d vs prior 14d) across opportunities, win rate, no-show rate. SOP §4 ad-hoc lead-drop diagnostic. |
ghl_compute_opt_in_rate | Aggregate opt-in rate across all funnels (sums views + opt-ins per funnel, plus an overall sitewide rate). |
ghl_compute_form_submission_rate | Share of new contacts attributed to a form submission (inferred from tags + custom fields containing “form”). |
ghl_get_campaign_a2p_stats | Best-effort campaign + A2P deliverability surface. GHL public REST does NOT stably expose per-campaign delivery stats — this returns campaign metadata and points the caller at the dashboard for actual A2P numbers. |
ghl_compute_missed_call_textback | Missed-call → text-back conversion rate. A missed call counts as “texted back” if there’s any outbound SMS to the same contact within the configurable window (default 5 minutes). |
ghl_list_invoices | List invoices (GET /invoices/ — the endpoint HighLevel’s own MCP does NOT expose). Filters: status, start_at/end_at (YYYY-MM-DD), search. Returns invoice number, status, total, amount paid/due, currency, dates, contact. Requires invoices.readonly on the site’s Private Integration Token (add it under HighLevel → Settings → Private Integrations). |
ghl_compute_revenue_stats | Revenue stats from invoices over a window (days, default 30, or explicit start_at/end_at): revenue collected, total invoiced, outstanding, average invoice total (≈ average bill per vehicle/job), average collected per paid invoice, by-status counts, top 5 invoices. Needs invoices.readonly like above. |
ghl_compute_lead_to_book | Lead-to-book rate: new contacts created in the window vs how many of those booked a calendar appointment in the same window (lead_to_book_rate = new_leads_booked / new_leads), plus overall appointment volume. |
Legend
- ⚠ super-admin — tool is filtered out of regular-user token creation UI + refused at runtime if invoked by a non-super-admin token (see delete_astro_route exception)
- ⓞ optional — tool is conditionally hidden from
tools/listunless the worker has the required env secrets set (egCLOUDFLARE_API_TOKEN+CLOUDFLARE_ACCOUNT_IDforcheck_astro_deploy) - 🔌 plugin — requires the site’s RankMath channel set to
pluginand theseo-navigator-rankmathbridge installed; else refused at runtime withE_RANKMATH_PLUGIN_REQUIRED - ⚙ flagged — refused by default; needs a super-admin to flip the relevant site flag in
/admin/sites:allow_publish(publish_post/publish_page),allow_seo_on_published(SEO on live posts),allow_main_branch_push(Astro production push),allow_full_repo_write(bulk + non-default Astro paths),allow_drive_write(drive_save_audit),allow_gohighlevel_write(the 12 mutating GoHighLevel proxy tools)
Proxy tools (GoHighLevel)
Section titled “Proxy tools (GoHighLevel)”Sites with platform = gohighlevel proxy GoHighLevel’s hosted MCP server at services.leadconnectorhq.com/mcp/. The worker forwards JSON-RPC tools/list + tools/call over Bearer auth using each site’s Private Integration Token (encrypted in D1).
36 upstream tools as of writing — 24 read-only (always available) and 12 mutating (*_create-*, *_update-*, *_upsert-*, *_edit-*, *_add-*, *_remove-*, *_send-*). Mutating tools refuse with E_GOHIGHLEVEL_WRITE_NOT_ALLOWED until a super-admin enables allow_gohighlevel_write on the site. See GoHighLevel prerequisites for the full read/write table.
Naming note: code, DB, and admin UI use gohighlevel; tool descriptions surface “GoHighLevel / GHL / HighLevel” so Claude matches either alias from user prompts.
Proxy tools (wp-mcp-adapter)
Section titled “Proxy tools (wp-mcp-adapter)”Sites with the wordpress/mcp-adapter plugin and one of its tool plugins (currently msrbuilds/elementor-mcp) installed expose their own MCP tool surface to the worker, which proxies it back to Claude. These tools change as you install new plugins on the site.
The list below is a snapshot — there are 76 proxy tools visible on this worker right now. Filtering happens in src/mcp/proxy-guardrails.ts — any delete-* or publish-* tool that targets a page/post/template is hidden from tools/list and refused at tools/call even if Claude tries to invoke it.
| Tool | Description |
|---|---|
elementor-mcp-add-accordion | Adds an accordion widget. Supports title/content colors, background, border, typography (set title_typography_typography=custom), spacing, icon color, and FAQ schema. Accepts responsive suffixes and advanced controls. (site: viper-template) |
elementor-mcp-add-alert | Adds an alert/notice widget with type, title, and description. (site: viper-template) |
elementor-mcp-add-atomic-button | Adds an Elementor 4.0 atomic button element. (site: viper-template) |
elementor-mcp-add-atomic-divider | Adds an Elementor 4.0 atomic divider element. (site: viper-template) |
elementor-mcp-add-atomic-heading | Adds an Elementor 4.0 atomic heading element. Accepts plain text and tag; $$type wrapping is handled automatically. (site: viper-template) |
elementor-mcp-add-atomic-image | Adds an Elementor 4.0 atomic image element. Provide either image_id (from media library) or image_url. (site: viper-template) |
elementor-mcp-add-atomic-paragraph | Adds an Elementor 4.0 atomic paragraph element. (site: viper-template) |
elementor-mcp-add-atomic-svg | Adds an Elementor 4.0 atomic SVG element. (site: viper-template) |
elementor-mcp-add-atomic-video | Adds an Elementor 4.0 atomic self-hosted video element. (site: viper-template) |
elementor-mcp-add-atomic-widget | Adds any Elementor 4.0+ atomic widget to a container. Settings must use the $$type prop format. For simpler usage, prefer the convenience tools (add-atomic-heading, etc.). (site: viper-template) |
elementor-mcp-add-atomic-youtube | Adds an Elementor 4.0 atomic YouTube video element. (site: viper-template) |
elementor-mcp-add-button | Adds a button widget. Supports typography (set typography_typography=custom), border, background, hover colors, box shadow, and text shadow. Accepts responsive suffixes and advanced controls. (site: viper-template) |
elementor-mcp-add-container | Adds a container to a page. Supports both flex (default) and grid layouts via container_type. Omit parent_id for top-level, or provide a parent container ID for nesting. Flex tips: Use flex_direction=row for side-by-side children, flex_wrap=wrap for wrapping, flex_justify_content for main-axis alignment (e.g. space-between, center), flex_align_items for cross-axis alignment. (The shorthand justify_content / align_items are also accepted and remapped to flex_justify_content / flex_align_items.) Grid tips: Set container_type=grid with grid_columns_grid, grid_rows_grid, grid_gaps. Background: set background_background=classic and background_color=#hex. Border: set border_border=solid, border_width, border_color. Also supports min_height, overflow, html_tag, padding, margin, position, z_index, animation. (site: viper-template) |
elementor-mcp-add-counter | Adds an animated counter widget that counts up to a number. (site: viper-template) |
elementor-mcp-add-custom-js | Adds a custom JavaScript snippet to a page by inserting an HTML widget containing a |
elementor-mcp-add-div-block | Adds an Elementor 4.0 div-block container (block flow layout). Use for non-flex containers. (site: viper-template) |
elementor-mcp-add-divider | Adds a horizontal divider/separator widget with style, weight, color, and width options. (site: viper-template) |
elementor-mcp-add-flexbox | Adds an Elementor 4.0 flexbox container. Layout properties (direction, justify, align, gap) are applied as local styles automatically. Use this instead of add-container for Elementor 4.0+ sites. (site: viper-template) |
elementor-mcp-add-google-maps | Adds an embedded Google Maps widget with address, zoom, and height. (site: viper-template) |
elementor-mcp-add-heading | Adds a heading widget. Supports full typography (set typography_typography=custom first), text stroke, text shadow, blend mode, hover color. Also accepts responsive suffixes (align_tablet, align_mobile) and common advanced controls (_margin, _padding, background, border, etc). (site: viper-template) |
elementor-mcp-add-html | Adds a custom HTML code widget. (site: viper-template) |
elementor-mcp-add-icon | Adds an icon widget. Supports Font Awesome and SVG icons, view modes (default/stacked/framed), hover colors, rotate, padding, border radius, and hover animation. For SVG, first use upload-svg-icon. (site: viper-template) |
elementor-mcp-add-icon-box | Adds an icon box widget. Supports icon position (top/left/right), title typography (set title_typography_typography=custom), description typography, icon spacing, hover colors, and hover animation. Accepts responsive suffixes and advanced controls. (site: viper-template) |
elementor-mcp-add-icon-list | Adds a list widget with icons and text. Great for feature lists, checklists, and contact info. (site: viper-template) |
elementor-mcp-add-image | Adds an image widget. Supports width, max-width, opacity, border, border-radius, box shadow, CSS filters (brightness, contrast, saturation, hue), and hover effects. Accepts responsive suffixes and advanced controls. (site: viper-template) |
elementor-mcp-add-image-box | Adds an image box widget with image, title, and description. Great for service cards. (site: viper-template) |
elementor-mcp-add-image-carousel | Adds a rotating image carousel/slider widget. (site: viper-template) |
elementor-mcp-add-menu-anchor | Adds a menu anchor for one-page navigation. (site: viper-template) |
elementor-mcp-add-progress | Adds an animated progress bar widget with label and percentage. (site: viper-template) |
elementor-mcp-add-rating | Adds a star/icon rating widget. (site: viper-template) |
elementor-mcp-add-shortcode | Adds a WordPress shortcode widget. (site: viper-template) |
elementor-mcp-add-social-icons | Adds social media icon links. Great for headers and footers. (site: viper-template) |
elementor-mcp-add-spacer | Adds a spacer widget for vertical spacing between elements. (site: viper-template) |
elementor-mcp-add-star-rating | Adds a star rating display widget. (site: viper-template) |
elementor-mcp-add-stock-image | Searches Openverse for an image, downloads it to the Media Library, and adds it as an image widget to the page — all in one step. Defaults to landscape (wide) images for consistent layouts. Combines search-images + sideload-image + add-image. (site: viper-template) |
elementor-mcp-add-tabs | Adds a tabbed content widget with horizontal or vertical layout. (site: viper-template) |
elementor-mcp-add-testimonial | Adds a testimonial widget with quote, author name, job title, and image. (site: viper-template) |
elementor-mcp-add-text-editor | Adds a rich text editor widget. Supports typography (set typography_typography=custom), drop cap, text columns, and text color. Accepts responsive suffixes and advanced controls. (site: viper-template) |
elementor-mcp-add-text-path | Adds curved/path text widget. (site: viper-template) |
elementor-mcp-add-toggle | Adds a toggle widget (multiple items can be open). Supports title/content colors, background, border, typography (set title_typography_typography=custom), spacing, and icon color. Accepts responsive suffixes and advanced controls. (site: viper-template) |
elementor-mcp-add-video | Adds a video widget. Supports YouTube, Vimeo, Dailymotion, self-hosted. Options: start/end time, lazy load, privacy mode, image overlay, play icon. Accepts responsive suffixes and advanced controls. (site: viper-template) |
elementor-mcp-add-widget | Adds any Elementor widget to a container. Use get-widget-schema to discover the available settings for each widget type. (site: viper-template) |
elementor-mcp-apply-template | Applies a saved Elementor template to a page at a given position, inserting its elements with fresh IDs. (site: viper-template) |
elementor-mcp-batch-update | Updates multiple elements in a single save operation. Each operation specifies an element_id and settings to merge. Much more efficient than calling update-element multiple times. (site: viper-template) |
elementor-mcp-build-page | Creates a complete Elementor page from a declarative structure in a single call. Supports nested containers and any widget types. IMPORTANT LAYOUT RULES: (1) For side-by-side columns, use a parent container with flex_direction=row — children are auto-set to content_width=full with equal percentage widths (e.g. 2 children = 50%, 3 = 33.33%). (2) NEVER set flex_wrap or _flex_size in settings — these cause layout overflow. The tool handles layout automatically. (3) Background colors: set background_background=classic and background_color=#hex on containers. (4) Background images: set background_background=classic, background_image={url,id}, background_size=cover. (5) Background overlay: background_overlay_background=classic, background_overlay_color=#hex, background_overlay_opacity={size:0.7,unit:px}. (6) Text alignment: text_align on text/heading widgets. (7) Use search-images and sideload-image tools to get real images before building. (site: viper-template) |
elementor-mcp-create-page | Creates a new WordPress page with Elementor enabled. Optionally provide initial element content. (site: viper-template) |
elementor-mcp-detect-elementor-version | Returns the Elementor version and whether atomic elements (v4.0+) are supported. Call this first to decide whether to use legacy tools (add-heading, add-container) or atomic tools (add-atomic-heading, add-flexbox). (site: viper-template) |
elementor-mcp-duplicate-element | Duplicates an element (including all children) with fresh IDs. The duplicate is placed immediately after the original. (site: viper-template) |
elementor-mcp-export-page | Exports a page’s full Elementor data as a JSON structure that can be imported elsewhere. (site: viper-template) |
elementor-mcp-find-element | Searches elements on a page by type, widget type, or settings content. Returns matching element IDs, types, and a settings preview. (site: viper-template) |
elementor-mcp-get-container-schema | Returns JSON Schema for all container controls (flex + grid), including flex_direction, justify_content, align_items, flex_wrap, gap, content_width, min_height, container_type, grid controls, background, border, padding, and more. (site: viper-template) |
elementor-mcp-get-element-settings | Returns the current settings for a specific element on a page. Provide the post ID and element ID to retrieve all control values for that element. (site: viper-template) |
elementor-mcp-get-global-settings | Returns the active Elementor kit/global settings including colors, typography, spacing, and breakpoints. These are the site-wide design tokens used across all pages. (site: viper-template) |
elementor-mcp-get-page-structure | Returns the element tree for an Elementor page, showing all containers, widgets, and their nesting structure. Each element includes its ID, type, widget type (for widgets), and child elements. (site: viper-template) |
elementor-mcp-get-widget-schema | Returns the full JSON Schema for a widget type’s settings, describing all available controls and their types. Use this to discover what settings a widget accepts before creating or updating it. (site: viper-template) |
elementor-mcp-import-template | Imports a JSON template structure into a page at an optional position. (site: viper-template) |
elementor-mcp-list-pages | Returns all WordPress pages and posts that are built with Elementor. Optionally filter by post type and status. (site: viper-template) |
elementor-mcp-list-templates | Returns all saved Elementor templates from the template library. Optionally filter by template type (page, section, container). (site: viper-template) |
elementor-mcp-list-widgets | Returns all registered Elementor widget types with their names, titles, icons, categories, and keywords. Optionally filter by widget category. (site: viper-template) |
elementor-mcp-move-element | Moves an element to a new parent container and/or position within the page tree. (site: viper-template) |
elementor-mcp-remove-element | Removes an element and all its children from a page. (site: viper-template) |
elementor-mcp-reorder-elements | Reorders the children of a container by providing an ordered array of element IDs. All IDs must be direct children of the specified container. (site: viper-template) |
elementor-mcp-save-as-template | Saves a page or a specific element as a reusable Elementor template. (site: viper-template) |
elementor-mcp-search-images | Searches Openverse (WordPress.org) for Creative Commons licensed images. Returns image URLs, thumbnails, licensing info, and attribution. Use the returned URLs with sideload-image or add-stock-image. (site: viper-template) |
elementor-mcp-sideload-image | Downloads an external image URL into the WordPress Media Library and returns the local attachment ID and URL. Use this after search-images to import a chosen image. (site: viper-template) |
elementor-mcp-update-atomic-widget | Updates settings on an existing Elementor 4.0+ atomic widget. Performs a partial merge — only provided keys are changed. (site: viper-template) |
elementor-mcp-update-container | Updates settings on an existing container. Settings are merged (partial update). Supports all container controls: flex_direction, flex_justify_content, flex_align_items, flex_wrap, flex_align_content, gap, content_width, min_height, overflow, html_tag, container_type, grid controls, background (set background_background=classic first), border (set border_border=solid first), border_radius, box_shadow, padding, margin, position, z_index, animation, shape dividers, etc. (The unprefixed justify_content / align_items / align_content are accepted and remapped to the flex_-prefixed keys.) (site: viper-template) |
elementor-mcp-update-element | Updates settings on any element (container or widget). Settings are merged (partial update). Works for all element types — no need to know if the target is a container or widget. (site: viper-template) |
elementor-mcp-update-global-colors | Updates the site-wide color palette in the Elementor kit. Provide an array of color objects with id, title, and color (hex). (site: viper-template) |
elementor-mcp-update-global-typography | Updates the site-wide typography settings in the Elementor kit. (site: viper-template) |
elementor-mcp-update-page-settings | Updates page-level Elementor settings such as background, padding, custom CSS, and layout options. (site: viper-template) |
elementor-mcp-update-widget | Updates settings on an existing widget. Settings are merged (partial update). (site: viper-template) |
elementor-mcp-upload-svg-icon | Uploads an SVG icon to the WordPress Media Library and returns an Elementor icon object ready to use with any widget that accepts icons (icon, icon-box, button, etc.). Accepts either an external SVG URL or raw SVG markup. The returned icon object has the format: { “value”: { “id”: 123, “url”: ”…” }, “library”: “svg” }. Use this value for the selected_icon setting in icon/icon-box widgets, or the selected_icon setting in button widgets. (site: viper-template) |
mcp-adapter-discover-abilities | Discover all available WordPress abilities in the system. Returns a list of all registered abilities with their basic information. (site: viper-template) |
mcp-adapter-execute-ability | Execute a WordPress ability with the provided parameters. This is the primary execution layer that can run any registered ability. (site: viper-template) |
mcp-adapter-get-ability-info | Get detailed information about a specific WordPress ability including its input/output schema, description, and usage examples. (site: viper-template) |
How to regenerate this page
Section titled “How to regenerate this page”This file is regenerated by running
node scripts/gen-tools-reference.mjs <bearer-token>from the seo-navigator-mcp repository. The script hits tools/list on the production worker and overwrites seo-navigator-docs/src/content/docs/reference/tools.md.