{
 "name": "wptaskify MCP server",
 "generated": "2026-10-06T11:02:26Z",
 "endpoints": {
  "/mcp": "https://wptaskify.com/mcp",
  "/mcp/store": "https://wptaskify.com/mcp/store"
 },
 "transport": "Streamable HTTP (JSON-RPC 2.0)",
 "auth": {
  "type": "OAuth 2.1 authorization code + PKCE (S256)",
  "discovery": "https://wptaskify.com/.well-known/oauth-authorization-server",
  "registration": "https://wptaskify.com/register"
 },
 "count": 389,
 "tools": [
  {
   "name": "activate_plugin",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Activate an installed plugin by its file (e.g. 'akismet/akismet.php' - get it from list_plugins). Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "plugin_file": {
      "title": "Plugin File",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "plugin_file"
    ],
    "title": "activate_pluginArguments",
    "type": "object"
   }
  },
  {
   "name": "activate_theme",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Activate a theme by its slug (folder name) - makes it LIVE for all visitors.",
   "input_schema": {
    "properties": {
     "slug": {
      "title": "Slug",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "slug"
    ],
    "title": "activate_themeArguments",
    "type": "object"
   }
  },
  {
   "name": "add_menu_item",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Add a custom link item to a navigation menu. Returns the new item id.",
   "input_schema": {
    "properties": {
     "menu_id": {
      "title": "Menu Id",
      "type": "integer"
     },
     "title": {
      "title": "Title",
      "type": "string"
     },
     "url": {
      "title": "Url",
      "type": "string"
     },
     "parent_id": {
      "default": 0,
      "title": "Parent Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "menu_id",
     "title",
     "url"
    ],
    "title": "add_menu_itemArguments",
    "type": "object"
   }
  },
  {
   "name": "add_order_note",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Add a note to an order. customer_note=True emails it to the customer; False = private (staff-only) note.",
   "input_schema": {
    "properties": {
     "order_id": {
      "title": "Order Id",
      "type": "integer"
     },
     "note": {
      "title": "Note",
      "type": "string"
     },
     "customer_note": {
      "default": false,
      "title": "Customer Note",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "order_id",
     "note"
    ],
    "title": "add_order_noteArguments",
    "type": "object"
   }
  },
  {
   "name": "add_widget",
   "category": "tax",
   "endpoints": [
    "/mcp"
   ],
   "description": "Add a block widget to a widget area (sidebar). `block_html` is Gutenberg block markup, e.g. '<!-- wp:paragraph --><p>Hello</p><!-- /wp:paragraph -->' or a heading/list block. Find sidebar_id via list_widgets. Great for footer text, a CTA, or an ad block.",
   "input_schema": {
    "properties": {
     "sidebar_id": {
      "title": "Sidebar Id",
      "type": "string"
     },
     "block_html": {
      "title": "Block Html",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "sidebar_id",
     "block_html"
    ],
    "title": "add_widgetArguments",
    "type": "object"
   }
  },
  {
   "name": "ai_seo_score",
   "category": "geo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "The AI SEO Score - a unified, AI-era SEO scorecard for the whole site across 5 categories (each 0-100) plus an overall: On-Page, Technical, AEO (answer- engine readiness), GEO (AI-citation readiness), and Authority (E-E-A-T). Every score is MEASURED from real content/site signals (no external APIs). Also returns concrete issue COUNTS (missing meta, missing alt, no schema, orphan pages, thin content, broken structure) so the dashboard can show 'Fix with Claude' actions. This is what powers the dashboard's AI SEO widget.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 50,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "ai_seo_scoreArguments",
    "type": "object"
   }
  },
  {
   "name": "amazon_find_products",
   "category": "amazon",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Find Amazon products for the given keywords so you can pick one to feature in an article. With Creators API credentials connected, returns REAL products (title, price, features, image, affiliate link). Without credentials, returns a tagged Amazon SEARCH link to use instead. `region` targets a specific marketplace ('in' = amazon.in, 'co.uk' ...). `tag` picks ONE EXACT associate tag when a marketplace has several (e.g. two amazon.com tags) - call amazon_list_accounts to see the tags, then pass the one you want as tag=. Omit both to use this site's default. Pass the chosen product's ASIN (or the keywords) to insert_product_card WITH THE SAME region AND tag.",
   "input_schema": {
    "properties": {
     "keywords": {
      "title": "Keywords",
      "type": "string"
     },
     "count": {
      "default": 3,
      "title": "Count",
      "type": "integer"
     },
     "region": {
      "default": "",
      "title": "Region",
      "type": "string"
     },
     "tag": {
      "default": "",
      "title": "Tag",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "keywords"
    ],
    "title": "amazon_find_productsArguments",
    "type": "object"
   }
  },
  {
   "name": "amazon_list_accounts",
   "category": "amazon",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List EVERY Amazon associate account connected on this wptaskify account, one per marketplace region (amazon.com, amazon.in, amazon.co.uk...). You can use ANY of them immediately: pass region='in' to amazon_find_products / insert_product_card. No switching or selecting needed - the saved default is only what you get when you omit `region`.",
   "input_schema": {
    "properties": {},
    "title": "amazon_list_accountsArguments",
    "type": "object"
   }
  },
  {
   "name": "amazon_status",
   "category": "amazon",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Check whether Amazon affiliate is set up: associate tag, region, and whether Creators API credentials (for real product data + images) are connected. `region` checks a specific marketplace ('in', 'co.uk'...); empty = the default for this site. Use this first.",
   "input_schema": {
    "properties": {
     "region": {
      "default": "",
      "title": "Region",
      "type": "string"
     }
    },
    "title": "amazon_statusArguments",
    "type": "object"
   }
  },
  {
   "name": "apply_internal_links_plan",
   "category": "links",
   "endpoints": [
    "/mcp"
   ],
   "description": "STEP 2 of bulk internal linking: EXECUTE a plan from `plan_internal_links`, one BATCH at a time - no re-scanning, no per-post confirmation.",
   "input_schema": {
    "properties": {
     "plan_json": {
      "title": "Plan Json",
      "type": "string"
     },
     "batch_size": {
      "default": 25,
      "title": "Batch Size",
      "type": "integer"
     },
     "start_index": {
      "default": 0,
      "title": "Start Index",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "plan_json"
    ],
    "title": "apply_internal_links_planArguments",
    "type": "object"
   }
  },
  {
   "name": "audit_seo_fields",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Scan published posts and report which are MISSING their SEO meta title, description, or focus keyword. Great for finding posts to optimize.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 100,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "backend": {
      "default": "auto",
      "title": "Backend",
      "type": "string"
     }
    },
    "title": "audit_seo_fieldsArguments",
    "type": "object"
   }
  },
  {
   "name": "backup_download_link",
   "category": "links",
   "endpoints": [
    "/mcp"
   ],
   "description": "Get a temporary download URL for a backup file so the user can pull the backup OFF their site (e.g. to move it to another host). The big file is downloaded directly from the site in the browser - it does NOT come through this connector. what='files' for the code/media zip, what='db' for the database.sql (only exists if the backup was made with include_db=True). The link expires after ttl seconds (default 1 hour). Give the user the returned download_url to open in their browser. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "backup_id": {
      "title": "Backup Id",
      "type": "string"
     },
     "what": {
      "default": "files",
      "title": "What",
      "type": "string"
     },
     "ttl": {
      "default": 3600,
      "title": "Ttl",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "backup_id"
    ],
    "title": "backup_download_linkArguments",
    "type": "object"
   }
  },
  {
   "name": "bing_crawl_stats",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Bing Webmaster Tools: crawl / index status for the site - pages crawled, pages in the Bing index, crawl errors, and pages blocked by robots.txt. `bing_site` targets ANY site on the connected Bing account (no switching); empty = saved/current site.",
   "input_schema": {
    "properties": {
     "bing_site": {
      "default": "",
      "title": "Bing Site",
      "type": "string"
     }
    },
    "title": "bing_crawl_statsArguments",
    "type": "object"
   }
  },
  {
   "name": "bing_search_queries",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Bing Webmaster Tools: the top search QUERIES bringing you clicks from Bing (query, clicks, impressions, avg position). Real Microsoft/Bing search data. `bing_site` targets ANY site on the connected Bing account (no switching); leave empty to use the saved/current site.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "bing_site": {
      "default": "",
      "title": "Bing Site",
      "type": "string"
     }
    },
    "title": "bing_search_queriesArguments",
    "type": "object"
   }
  },
  {
   "name": "bing_status",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Check whether Bing Webmaster Tools is connected for the current site, and which Bing site is selected. Use this first if other bing_ tools say 'not connected'.",
   "input_schema": {
    "properties": {},
    "title": "bing_statusArguments",
    "type": "object"
   }
  },
  {
   "name": "bing_submit_url",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Ask Bing to (re)crawl and index a specific URL right away. Great after publishing or updating a page - Bing accepts direct URL submission instantly (unlike Google). Requires a connected Bing account.",
   "input_schema": {
    "properties": {
     "url": {
      "title": "Url",
      "type": "string"
     }
    },
    "required": [
     "url"
    ],
    "title": "bing_submit_urlArguments",
    "type": "object"
   }
  },
  {
   "name": "bing_top_pages",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Bing Webmaster Tools: the top PAGES by Bing search traffic (page, clicks, impressions). `bing_site` targets ANY site on the connected Bing account (no switching); leave empty to use the saved/current site.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "bing_site": {
      "default": "",
      "title": "Bing Site",
      "type": "string"
     }
    },
    "title": "bing_top_pagesArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_amazon_links",
   "category": "amazon",
   "endpoints": [
    "/mcp"
   ],
   "description": "Across the WHOLE site, turn natural product phrases into tagged Amazon SEARCH links (affiliate) - dry_run defaults to True so you PREVIEW first; set dry_run=False to apply. Conservative by default (2 links/post) to avoid spammy affiliate stuffing. Works with just an associate tag - no Creators API credentials needed. Never links text already inside an <a> tag, preserves JSON-LD schema, and links each phrase at most once per post. Set dry_run=True to preview. This is the lightweight complement to insert_product_card. `region`/`tag` choose which marketplace + exact associate tag to use (see amazon_list_accounts); omit for this site's default.",
   "input_schema": {
    "properties": {
     "max_per_post": {
      "default": 2,
      "title": "Max Per Post",
      "type": "integer"
     },
     "limit": {
      "default": 300,
      "title": "Limit",
      "type": "integer"
     },
     "dry_run": {
      "default": true,
      "title": "Dry Run",
      "type": "boolean"
     },
     "match_keywords": {
      "default": true,
      "title": "Match Keywords",
      "type": "boolean"
     },
     "region": {
      "default": "",
      "title": "Region",
      "type": "string"
     },
     "tag": {
      "default": "",
      "title": "Tag",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "bulk_amazon_linksArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_assign_terms",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Assign categories and/or tags to MANY posts at once. `post_ids`, `category_ids`, `tag_ids` are comma-separated id lists. By default terms are ADDED; set replace=True to replace existing ones. Returns per-post result.",
   "input_schema": {
    "properties": {
     "post_ids": {
      "title": "Post Ids",
      "type": "string"
     },
     "category_ids": {
      "default": "",
      "title": "Category Ids",
      "type": "string"
     },
     "tag_ids": {
      "default": "",
      "title": "Tag Ids",
      "type": "string"
     },
     "replace": {
      "default": false,
      "title": "Replace",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_ids"
    ],
    "title": "bulk_assign_termsArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_find_replace",
   "category": "content",
   "endpoints": [
    "/mcp"
   ],
   "description": "Find `find` text across content and replace with `replace`. Set post_type='product' to run it on WooCommerce PRODUCTS (a product is a post) or any CPT; default 'post' = blog posts. dry_run=True (default) only REPORTS which items would change (does NOT edit). Run with dry_run=False to actually apply. Always dry-run first, show the user, then apply.",
   "input_schema": {
    "properties": {
     "find": {
      "title": "Find",
      "type": "string"
     },
     "replace": {
      "title": "Replace",
      "type": "string"
     },
     "dry_run": {
      "default": true,
      "title": "Dry Run",
      "type": "boolean"
     },
     "status": {
      "default": "publish,draft",
      "title": "Status",
      "type": "string"
     },
     "limit": {
      "default": 200,
      "title": "Limit",
      "type": "integer"
     },
     "post_type": {
      "default": "post",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "find",
     "replace"
    ],
    "title": "bulk_find_replaceArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_generate_meta",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Generate SEO meta with AI: meta TITLE (<=60 chars), meta DESCRIPTION (<=155 chars) and a FOCUS KEYWORD - not just the description. Set post_type='product' to run it on WooCommerce PRODUCTS (a product is a post), or any CPT. `fields` = comma list of which to fill (default all three; e.g. 'title,description' to skip the keyword). apply=False previews; apply=True saves via the SEO backend (update_post_seo under the hood). Only items with real prose are processed.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 30,
      "title": "Limit",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "fields": {
      "default": "title,description,focus_keyword",
      "title": "Fields",
      "type": "string"
     },
     "post_type": {
      "default": "post",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "only_missing": {
      "default": true,
      "title": "Only Missing",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     }
    },
    "title": "bulk_generate_metaArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_generate_product_descriptions",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate descriptions for many products at once. only_missing=True (default) targets products with an EMPTY description. apply=False previews the list that would change; apply=True writes them. Great for filling out an imported catalog. To protect quality, apply runs in batches of at most 25 per call - use `offset` to continue (offset=25, then 50...) and review between batches.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 20,
      "title": "Limit",
      "type": "integer"
     },
     "only_missing": {
      "default": true,
      "title": "Only Missing",
      "type": "boolean"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "bulk_generate_product_descriptionsArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_generate_product_images",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate professional AI product images for MANY WooCommerce products at once. Each image is built from that product's own name + category + description (a rich, specific prompt), so the catalog looks like a real photo set - NOT generic. Quality is identical to the single generate_product_image (same AI provider, same prompt quality - no shortcuts for being bulk).",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 10,
      "title": "Limit",
      "type": "integer"
     },
     "only_missing": {
      "default": true,
      "title": "Only Missing",
      "type": "boolean"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "bulk_generate_product_imagesArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_generate_product_seo",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate SEO meta titles + descriptions for WooCommerce products (products are posts, so this uses the SEO backend). apply=False previews which products would change; apply=True writes meta via the SEO plugin. To protect quality, apply runs in batches of at most 25 per call - use `offset` to continue (offset=25, then 50...) and review between batches.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 30,
      "title": "Limit",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "bulk_generate_product_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_internal_links",
   "category": "links",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "BULK internal linking across the WHOLE site in ONE call - no need to go post-by-post. For every published post it finds natural anchor phrases that point to OTHER posts and turns the first mention of each into an internal link.",
   "input_schema": {
    "properties": {
     "max_per_post": {
      "default": 3,
      "title": "Max Per Post",
      "type": "integer"
     },
     "min_title_words": {
      "default": 2,
      "title": "Min Title Words",
      "type": "integer"
     },
     "limit": {
      "default": 300,
      "title": "Limit",
      "type": "integer"
     },
     "dry_run": {
      "default": true,
      "title": "Dry Run",
      "type": "boolean"
     },
     "match_keywords": {
      "default": true,
      "title": "Match Keywords",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "bulk_internal_linksArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_optimize_images",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Compress the media library's JPEG/PNG images (and optionally convert to WebP) to speed up the site. `quality` 40-95 (default 80). to_webp=True writes .webp copies. apply=False previews sizes; apply=True actually processes (backs up originals first when compressing in place). To keep each run fast and safe, apply processes at most 25 images per call - since it always starts from the still-unoptimized images, just call it again to continue the next batch. Returns bytes saved. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 30,
      "title": "Limit",
      "type": "integer"
     },
     "quality": {
      "default": 80,
      "title": "Quality",
      "type": "integer"
     },
     "to_webp": {
      "default": false,
      "title": "To Webp",
      "type": "boolean"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "bulk_optimize_imagesArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_product_alt_text",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Write SEO alt text for WooCommerce PRODUCT images - YOU (the connected AI) look at the images and write the alt text, so it's specific and high quality (not generic).",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 30,
      "title": "Limit",
      "type": "integer"
     },
     "only_missing": {
      "default": true,
      "title": "Only Missing",
      "type": "boolean"
     },
     "alts": {
      "default": "",
      "title": "Alts",
      "type": "string"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "bulk_product_alt_textArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_schedule_posts",
   "category": "content",
   "endpoints": [
    "/mcp"
   ],
   "description": "Schedule MANY posts at once. `schedule_json` is a JSON array of {\"post_id\": N, \"datetime_iso\": \"2026-07-15T09:00:00\"} (site-local time). Sets each to status=future. Returns per-post result.",
   "input_schema": {
    "properties": {
     "schedule_json": {
      "title": "Schedule Json",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "schedule_json"
    ],
    "title": "bulk_schedule_postsArguments",
    "type": "object"
   }
  },
  {
   "name": "bulk_update_category",
   "category": "tax",
   "endpoints": [
    "/mcp"
   ],
   "description": "Move ALL posts from one category to another (merge/cleanup). Every post in `from_category_id` gets `to_category_id` added and the old one removed. Returns how many posts were moved.",
   "input_schema": {
    "properties": {
     "from_category_id": {
      "title": "From Category Id",
      "type": "integer"
     },
     "to_category_id": {
      "title": "To Category Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "from_category_id",
     "to_category_id"
    ],
    "title": "bulk_update_categoryArguments",
    "type": "object"
   }
  },
  {
   "name": "change_user_role",
   "category": "users",
   "endpoints": [
    "/mcp"
   ],
   "description": "Change a user's role (subscriber/contributor/author/editor/administrator).",
   "input_schema": {
    "properties": {
     "user_id": {
      "title": "User Id",
      "type": "integer"
     },
     "role": {
      "title": "Role",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "user_id",
     "role"
    ],
    "title": "change_user_roleArguments",
    "type": "object"
   }
  },
  {
   "name": "check_approval",
   "category": "safety",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Check whether a queued approval (from request_approval) has been decided by the user. Returns status: 'pending', 'approved', or 'rejected'. Only perform the action once status is 'approved'; if 'rejected', do not do it.",
   "input_schema": {
    "properties": {
     "approval_id": {
      "title": "Approval Id",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "approval_id"
    ],
    "title": "check_approvalArguments",
    "type": "object"
   }
  },
  {
   "name": "check_broken_links",
   "category": "links",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Check links inside a post (or scan many posts if post_id=0) and report any that return 404 / errors. Checks both internal and external links. For a full scan, raise `limit` carefully (each link is fetched). Returns broken links per post.",
   "input_schema": {
    "properties": {
     "post_id": {
      "default": 0,
      "title": "Post Id",
      "type": "integer"
     },
     "limit": {
      "default": 50,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "check_broken_linksArguments",
    "type": "object"
   }
  },
  {
   "name": "check_site_health",
   "category": "safety",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Report site health: PHP & WP version, active theme, plugin counts, DB size, HTTPS, debug mode, memory limit. Good for a quick diagnostic. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "check_site_healthArguments",
    "type": "object"
   }
  },
  {
   "name": "clean_aioseo_leftovers",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete ALL leftover _aioseo_* meta from every post (cleans old All in One SEO data so only your theme's _cwg_seo_* SEO fields remain). Pass confirm=True to run. This does NOT touch your _cwg_seo_* fields or post content. Run scan_aioseo_leftovers first to see what will be removed. IMPORTANT: if you still need the AIOSEO data, run migrate_aioseo_meta(apply=true) BEFORE this - cleaning is irreversible.",
   "input_schema": {
    "properties": {
     "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "clean_aioseo_leftoversArguments",
    "type": "object"
   }
  },
  {
   "name": "compare_competitor_post",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Compare ONE of your posts/pages against a competitor URL that outranks it - a content-depth scorecard so you can make YOUR page demonstrably more complete (the #1 lever on actual ranking). Fetches the competitor's public page and compares, side by side: word count, heading count, does it have an FAQ, images, schema (Article/FAQ), lists/tables, and the subtopics (H2/H3 headings) THEY cover that you don't. Pure code, no paid data - it can't show their backlinks/traffic/ keywords, and says so. Use this before refreshing a post so you know exactly what to add.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "competitor_url": {
      "title": "Competitor Url",
      "type": "string"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "competitor_url"
    ],
    "title": "compare_competitor_postArguments",
    "type": "object"
   }
  },
  {
   "name": "create_category",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Create a new category. Returns its id.",
   "input_schema": {
    "properties": {
     "name": {
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "parent_id": {
      "default": 0,
      "title": "Parent Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "name"
    ],
    "title": "create_categoryArguments",
    "type": "object"
   }
  },
  {
   "name": "create_comment",
   "category": "users",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Post a comment on a post (or REPLY to another comment via parent_id). Use to answer reader comments as the site. If author_name/email are omitted the comment is authored by the connected account. New comments are auto-approved (posted by an admin).",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "content": {
      "title": "Content",
      "type": "string"
     },
     "parent_id": {
      "default": 0,
      "title": "Parent Id",
      "type": "integer"
     },
     "author_name": {
      "default": "",
      "title": "Author Name",
      "type": "string"
     },
     "author_email": {
      "default": "",
      "title": "Author Email",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "content"
    ],
    "title": "create_commentArguments",
    "type": "object"
   }
  },
  {
   "name": "create_coupon",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a WooCommerce coupon. discount_type = percent / fixed_cart / fixed_product. `amount` is '10' (=10% or a fixed amount). Optional expiry (YYYY-MM-DD), usage_limit, min_amount (minimum cart total), and free_shipping.",
   "input_schema": {
    "properties": {
     "code": {
      "title": "Code",
      "type": "string"
     },
     "discount_type": {
      "default": "percent",
      "title": "Discount Type",
      "type": "string"
     },
     "amount": {
      "default": "",
      "title": "Amount",
      "type": "string"
     },
     "expiry": {
      "default": "",
      "title": "Expiry",
      "type": "string"
     },
     "usage_limit": {
      "default": 0,
      "title": "Usage Limit",
      "type": "integer"
     },
     "min_amount": {
      "default": "",
      "title": "Min Amount",
      "type": "string"
     },
     "free_shipping": {
      "default": false,
      "title": "Free Shipping",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "code"
    ],
    "title": "create_couponArguments",
    "type": "object"
   }
  },
  {
   "name": "create_cpt_item",
   "category": "content",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create an item in ANY custom post type (e.g. post_type='service'). content is HTML. `terms` assigns custom-taxonomy terms as 'taxonomy:id[,id];taxonomy2:id' - e.g. 'service_hub:12' puts it in the 'lessons' hub (find IDs with list_taxonomies). Use list_post_types to get the post_type slug first.",
   "input_schema": {
    "properties": {
     "post_type": {
      "title": "Post Type",
      "type": "string"
     },
     "title": {
      "title": "Title",
      "type": "string"
     },
     "content": {
      "default": "",
      "title": "Content",
      "type": "string"
     },
     "status": {
      "default": "draft",
      "title": "Status",
      "type": "string"
     },
     "excerpt": {
      "default": "",
      "title": "Excerpt",
      "type": "string"
     },
     "terms": {
      "default": "",
      "title": "Terms",
      "type": "string"
     },
     "featured_media_id": {
      "default": 0,
      "title": "Featured Media Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_type",
     "title"
    ],
    "title": "create_cpt_itemArguments",
    "type": "object"
   }
  },
  {
   "name": "create_menu",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Create a new (empty) navigation menu. Optionally assign it to a theme location (e.g. 'primary' - find valid locations in list_menus output). Then use add_menu_item to fill it. Returns the new menu id.",
   "input_schema": {
    "properties": {
     "name": {
      "title": "Name",
      "type": "string"
     },
     "location": {
      "default": "",
      "title": "Location",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "name"
    ],
    "title": "create_menuArguments",
    "type": "object"
   }
  },
  {
   "name": "create_page",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Create a new page. status defaults to draft. content is HTML (Gutenberg block markup works too).",
   "input_schema": {
    "properties": {
     "title": {
      "title": "Title",
      "type": "string"
     },
     "content": {
      "title": "Content",
      "type": "string"
     },
     "status": {
      "default": "draft",
      "title": "Status",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "title",
     "content"
    ],
    "title": "create_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "create_plugin",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a NEW WordPress plugin (folder + main file with a valid header). `slug` = folder/file name (lowercase-dashes). `code` = optional PHP body AFTER the header (do NOT include <?php or the header - those are added). Safe: a new plugin can't break existing code. Activate it separately if needed. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "slug": {
      "title": "Slug",
      "type": "string"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "code": {
      "default": "",
      "title": "Code",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "slug"
    ],
    "title": "create_pluginArguments",
    "type": "object"
   }
  },
  {
   "name": "create_post",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Create a post - content is HTML, category_ids and tag_ids are COMMA-SEPARATED ID STRINGS like '3,7' (never arrays or ints), status defaults to draft, and you should always pass a short hyphenated `slug`. featured_media_id = media ID for the thumbnail. slug = a short, keyword-rich, hyphenated URL slug (e.g. 'watercolor-lighthouse-drawing', not the long auto-slug WordPress builds from the title).",
   "input_schema": {
    "properties": {
     "title": {
      "title": "Title",
      "type": "string"
     },
     "content": {
      "title": "Content",
      "type": "string"
     },
     "status": {
      "default": "draft",
      "title": "Status",
      "type": "string"
     },
     "excerpt": {
      "default": "",
      "title": "Excerpt",
      "type": "string"
     },
     "category_ids": {
      "default": "",
      "title": "Category Ids",
      "type": "string"
     },
     "tag_ids": {
      "default": "",
      "title": "Tag Ids",
      "type": "string"
     },
     "featured_media_id": {
      "default": 0,
      "title": "Featured Media Id",
      "type": "integer"
     },
     "slug": {
      "default": "",
      "title": "Slug",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "title",
     "content"
    ],
    "title": "create_postArguments",
    "type": "object"
   }
  },
  {
   "name": "create_product",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a WooCommerce product on the connected store and return its id. Status defaults to 'draft' so it's safe. Covers every common WooCommerce product option: * basics: name, regular_price/sale_price ('19.99'), description, short_description, sku, product_type (simple|grouped|external|variable), status, featured * inventory: stock_quantity (>=0 turns on manage_stock), stock_status (instock|outofstock|onbackorder) * taxonomy/media: category_ids + tags (comma names or ids), image_urls (comma, public URLs) * shipping: weight, length/width/height, shipping_class * tax: tax_status (taxable|shipping|none), tax_class * type flags: virtual (no shipping), downloadable (\"true\" or a JSON list of {\"nam",
   "input_schema": {
    "properties": {
     "name": {
      "title": "Name",
      "type": "string"
     },
     "regular_price": {
      "default": "",
      "title": "Regular Price",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "short_description": {
      "default": "",
      "title": "Short Description",
      "type": "string"
     },
     "sku": {
      "default": "",
      "title": "Sku",
      "type": "string"
     },
     "product_type": {
      "default": "simple",
      "title": "Product Type",
      "type": "string"
     },
     "stock_quantity": {
      "default": -1,
      "title": "Stock Quantity",
      "type": "integer"
     },
     "category_ids": {
      "default": "",
      "title": "Category Ids",
      "type": "string"
     },
     "image_urls": {
      "default": "",
      "title": "Image Urls",
      "type": "string"
     },
     "status": {
      "default": "draft",
      "title": "Status",
      "type": "string"
     },
     "sale_price": {
      "default": "",
      "title": "Sale Price",
      "type": "string"
     },
     "stock_status": {
      "default": "",
      "title": "Stock Status",
      "type": "string"
     },
     "tags": {
      "default": "",
      "title": "Tags",
      "type": "string"
     },
     "weight": {
      "default": "",
      "title": "Weight",
      "type": "string"
     },
     "length": {
      "default": "",
      "title": "Length",
      "type": "string"
     },
     "width": {
      "default": "",
      "title": "Width",
      "type": "string"
     },
     "height": {
      "default": "",
      "title": "Height",
      "type": "string"
     },
     "virtual": {
      "default": false,
      "title": "Virtual",
      "type": "boolean"
     },
     "downloadable": {
      "default": "",
      "title": "Downloadable",
      "type": "string"
     },
     "shipping_class": {
      "default": "",
      "title": "Shipping Class",
      "type": "string"
     },
     "tax_status": {
      "default": "",
      "title": "Tax Status",
      "type": "string"
     },
     "tax_class": {
      "default": "",
      "title": "Tax Class",
      "type": "string"
     },
     "cross_sell_ids": {
      "default": "",
      "title": "Cross Sell Ids",
      "type": "string"
     },
     "upsell_ids": {
      "default": "",
      "title": "Upsell Ids",
      "type": "string"
     },
     "purchase_note": {
      "default": "",
      "title": "Purchase Note",
      "type": "string"
     },
     "menu_order": {
      "default": -1,
      "title": "Menu Order",
      "type": "integer"
     },
     "reviews_allowed": {
      "default": true,
      "title": "Reviews Allowed",
      "type": "boolean"
     },
     "featured": {
      "default": false,
      "title": "Featured",
      "type": "boolean"
     },
     "attributes": {
      "default": "",
      "title": "Attributes",
      "type": "string"
     },
     "meta_data": {
      "default": "",
      "title": "Meta Data",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "name"
    ],
    "title": "create_productArguments",
    "type": "object"
   }
  },
  {
   "name": "create_product_category",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a WooCommerce product category. Returns its id.",
   "input_schema": {
    "properties": {
     "name": {
      "title": "Name",
      "type": "string"
     },
     "parent_id": {
      "default": 0,
      "title": "Parent Id",
      "type": "integer"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "name"
    ],
    "title": "create_product_categoryArguments",
    "type": "object"
   }
  },
  {
   "name": "create_product_variation",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Add ONE variation to a VARIABLE WooCommerce product. First create the parent with product_type='variable' and attributes that have variation=true, then call this once per variation (e.g. Red/S, Red/M, Blue/S...). * attributes = JSON mapping the varying attributes to THIS variation's values, e.g. {\"Color\":\"Red\",\"Size\":\"S\"} (names must match the parent's variation attributes). * regular_price/sale_price ('19.99'), sku, stock_quantity (>=0 = managed), stock_status * weight, image_url (one public URL), description, virtual, downloadable, meta_data (JSON).",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "attributes": {
      "title": "Attributes",
      "type": "string"
     },
     "regular_price": {
      "default": "",
      "title": "Regular Price",
      "type": "string"
     },
     "sale_price": {
      "default": "",
      "title": "Sale Price",
      "type": "string"
     },
     "sku": {
      "default": "",
      "title": "Sku",
      "type": "string"
     },
     "stock_quantity": {
      "default": -1,
      "title": "Stock Quantity",
      "type": "integer"
     },
     "stock_status": {
      "default": "",
      "title": "Stock Status",
      "type": "string"
     },
     "weight": {
      "default": "",
      "title": "Weight",
      "type": "string"
     },
     "image_url": {
      "default": "",
      "title": "Image Url",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "virtual": {
      "default": false,
      "title": "Virtual",
      "type": "boolean"
     },
     "downloadable": {
      "default": "",
      "title": "Downloadable",
      "type": "string"
     },
     "meta_data": {
      "default": "",
      "title": "Meta Data",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "attributes"
    ],
    "title": "create_product_variationArguments",
    "type": "object"
   }
  },
  {
   "name": "create_redirect",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Create a redirect (e.g. fix a 404). source_url = old path like '/old-page/'; target_url = new path or full URL. 301 = permanent (default).",
   "input_schema": {
    "properties": {
     "source_url": {
      "title": "Source Url",
      "type": "string"
     },
     "target_url": {
      "title": "Target Url",
      "type": "string"
     },
     "http_code": {
      "default": 301,
      "title": "Http Code",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "source_url",
     "target_url"
    ],
    "title": "create_redirectArguments",
    "type": "object"
   }
  },
  {
   "name": "create_tag",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Create a new tag. Returns its id.",
   "input_schema": {
    "properties": {
     "name": {
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "name"
    ],
    "title": "create_tagArguments",
    "type": "object"
   }
  },
  {
   "name": "create_theme",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a NEW WordPress theme (style.css + index.php + functions.php). `slug` = folder name. `style_css` = CSS (a Theme Name header is added if missing). `index_php`/`functions_php` = optional PHP (lint-checked). Safe: creating a theme doesn't affect the active one until you activate it with activate_theme. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "slug": {
      "title": "Slug",
      "type": "string"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "style_css": {
      "default": "",
      "title": "Style Css",
      "type": "string"
     },
     "index_php": {
      "default": "",
      "title": "Index Php",
      "type": "string"
     },
     "functions_php": {
      "default": "",
      "title": "Functions Php",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "slug"
    ],
    "title": "create_themeArguments",
    "type": "object"
   }
  },
  {
   "name": "create_user",
   "category": "users",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a new WordPress user. role is one of: subscriber, contributor, author, editor, administrator. Returns the new user id.",
   "input_schema": {
    "properties": {
     "username": {
      "title": "Username",
      "type": "string"
     },
     "email": {
      "title": "Email",
      "type": "string"
     },
     "password": {
      "title": "Password",
      "type": "string"
     },
     "role": {
      "default": "author",
      "title": "Role",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "username",
     "email",
     "password"
    ],
    "title": "create_userArguments",
    "type": "object"
   }
  },
  {
   "name": "deactivate_plugin",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Deactivate an active plugin by its file (from list_plugins). wptaskify cannot deactivate itself. This can change site behaviour - WARN the user and confirm first. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "plugin_file": {
      "title": "Plugin File",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "plugin_file"
    ],
    "title": "deactivate_pluginArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_coupon",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a WooCommerce coupon permanently.",
   "input_schema": {
    "properties": {
     "coupon_id": {
      "title": "Coupon Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "coupon_id"
    ],
    "title": "delete_couponArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_cpt_item",
   "category": "content",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete an item of ANY custom post type. Default = Trash (recoverable). permanent=True deletes forever.",
   "input_schema": {
    "properties": {
     "post_type": {
      "title": "Post Type",
      "type": "string"
     },
     "item_id": {
      "title": "Item Id",
      "type": "integer"
     },
     "permanent": {
      "default": false,
      "title": "Permanent",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_type",
     "item_id"
    ],
    "title": "delete_cpt_itemArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_media",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Permanently delete a media item by id.",
   "input_schema": {
    "properties": {
     "media_id": {
      "title": "Media Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "media_id"
    ],
    "title": "delete_mediaArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_menu",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Delete a navigation menu (its items are removed too; the menu location becomes empty).",
   "input_schema": {
    "properties": {
     "menu_id": {
      "title": "Menu Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "menu_id"
    ],
    "title": "delete_menuArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_menu_item",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Remove an item from a navigation menu.",
   "input_schema": {
    "properties": {
     "item_id": {
      "title": "Item Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "item_id"
    ],
    "title": "delete_menu_itemArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_page",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Delete a PAGE. Default = move to Trash (recoverable). permanent=True = delete forever. Use list_pages to find the page ID. (For posts, use delete_post.)",
   "input_schema": {
    "properties": {
     "page_id": {
      "title": "Page Id",
      "type": "integer"
     },
     "permanent": {
      "default": false,
      "title": "Permanent",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "page_id"
    ],
    "title": "delete_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_post",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Delete a post. Default = move to Trash (recoverable). permanent=True = delete forever.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "permanent": {
      "default": false,
      "title": "Permanent",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "delete_postArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_product",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a WooCommerce product. Default = move to Trash. permanent=True deletes forever.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "permanent": {
      "default": false,
      "title": "Permanent",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "delete_productArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_product_category",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a WooCommerce product category (products keep existing, lose this category).",
   "input_schema": {
    "properties": {
     "category_id": {
      "title": "Category Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "category_id"
    ],
    "title": "delete_product_categoryArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_redirect",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Delete a redirect by its ID (find it with list_redirects). Removes it from the Redirection plugin permanently. Use for duplicate/stale redirects.",
   "input_schema": {
    "properties": {
     "redirect_id": {
      "title": "Redirect Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "redirect_id"
    ],
    "title": "delete_redirectArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_term",
   "category": "tax",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete a taxonomy term (category, tag, or custom-taxonomy term). Posts keep existing but lose this term. `taxonomy` = REST base ('categories'/'tags'/custom rest_base). Terms are deleted permanently (WP has no term trash).",
   "input_schema": {
    "properties": {
     "taxonomy": {
      "title": "Taxonomy",
      "type": "string"
     },
     "term_id": {
      "title": "Term Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "taxonomy",
     "term_id"
    ],
    "title": "delete_termArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_unused_media",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Find media (images) NOT used as any post's featured image and NOT referenced in any post body. apply=False previews; apply=True deletes them (frees space). Be careful - deletion is permanent. Scans up to `limit` media items.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 200,
      "title": "Limit",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "delete_unused_mediaArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_user",
   "category": "users",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete a user. reassign_to = the user id to reassign their posts to (recommended so content isn't lost). If reassign_to=0, their content is deleted too - be careful.",
   "input_schema": {
    "properties": {
     "user_id": {
      "title": "User Id",
      "type": "integer"
     },
     "reassign_to": {
      "default": 0,
      "title": "Reassign To",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "user_id"
    ],
    "title": "delete_userArguments",
    "type": "object"
   }
  },
  {
   "name": "delete_widget",
   "category": "tax",
   "endpoints": [
    "/mcp"
   ],
   "description": "Remove a widget from its widget area (by widget id from list_widgets).",
   "input_schema": {
    "properties": {
     "widget_id": {
      "title": "Widget Id",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "widget_id"
    ],
    "title": "delete_widgetArguments",
    "type": "object"
   }
  },
  {
   "name": "design_intelligence",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Professional design reference for building themes, pages, layouts or CSS. Given a query describing the site/vibe (e.g. 'minimal saas dark', 'luxury ecommerce', 'playful food blog', 'bold agency portfolio'), returns curated design guidance: the best-matching visual STYLES (keywords, colors, effects), COLOR PALETTES (with hex), FONT PAIRINGS (with Google Fonts URLs), UX RULES, and core design principles.",
   "input_schema": {
    "properties": {
     "query": {
      "title": "Query",
      "type": "string"
     }
    },
    "required": [
     "query"
    ],
    "title": "design_intelligenceArguments",
    "type": "object"
   }
  },
  {
   "name": "design_reference",
   "category": "other",
   "endpoints": [
    "/mcp"
   ],
   "description": "Give yourself pro landing-page design inspiration WITHOUT the user supplying anything - use this BEFORE building/redesigning a page so the result looks professional (Dribbble-style, but actionable). Returns for the given site_type/niche: a proven SECTION BLUEPRINT (top-to-bottom order), a set of DESIGN RULES (spacing, type scale, color use, mobile, a11y), tasteful COLOR PALETTES each with a matching Google-fonts HEADING+BODY pairing, and REAL reference site URLs you should then READ with read_reference_page() to study real structure/copy. Set live_search= true to also pull fresh examples from the web.",
   "input_schema": {
    "properties": {
     "site_type": {
      "default": "",
      "title": "Site Type",
      "type": "string"
     },
     "niche": {
      "default": "",
      "title": "Niche",
      "type": "string"
     },
     "live_search": {
      "default": false,
      "title": "Live Search",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "design_referenceArguments",
    "type": "object"
   }
  },
  {
   "name": "duplicate_post",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Clone a post (great for templates): copies title, content, excerpt, categories and tags into a NEW draft. Pass new_title to rename the copy. Returns the new post id. For a CUSTOM post type (e.g. 'service'), pass post_type - the copy is created in the same type.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "new_title": {
      "default": "",
      "title": "New Title",
      "type": "string"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "duplicate_postArguments",
    "type": "object"
   }
  },
  {
   "name": "edit_htaccess",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Get or set the root .htaccess file. RISKY - a wrong rule can break the whole site (500 error). The plugin backs up the old file first. Always read it first (get_only=True), WARN the user, and confirm before writing. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "contents": {
      "default": "",
      "title": "Contents",
      "type": "string"
     },
     "get_only": {
      "default": false,
      "title": "Get Only",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "edit_htaccessArguments",
    "type": "object"
   }
  },
  {
   "name": "edit_llms_txt",
   "category": "geo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Get or set the site's /llms.txt - the AI-friendly index (like robots.txt but for LLMs / AI answer engines). It tells ChatGPT, Perplexity, Gemini etc. what the site is about and which pages matter, so they understand and CITE it better (GEO/AEO). get_only=True reads current state; passing `contents` sets a custom llms.txt (empty string = back to auto-generated from the site). Great to write a curated, well-described index of your best content. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "contents": {
      "default": "",
      "title": "Contents",
      "type": "string"
     },
     "get_only": {
      "default": false,
      "title": "Get Only",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "edit_llms_txtArguments",
    "type": "object"
   }
  },
  {
   "name": "edit_robots_txt",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Get or set the site's robots.txt (served via WordPress). Pass get_only=True to just read it. Setting it controls what search engines can crawl - be careful not to block the whole site.",
   "input_schema": {
    "properties": {
     "contents": {
      "default": "",
      "title": "Contents",
      "type": "string"
     },
     "get_only": {
      "default": false,
      "title": "Get Only",
      "type": "boolean"
     },
     "delete_physical": {
      "default": false,
      "title": "Delete Physical",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "edit_robots_txtArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_add_widget",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Insert a new Elementor element (widget/column/section/container) under `parent_id`. `element` is an Elementor element dict, e.g. {\"elType\":\"widget\",\"widgetType\":\"heading\",\"settings\":{\"title\":\"Hello\"}} or a section with nested elements. Fresh unique ids are auto-generated for it and any children (you can omit ids). position = index in the parent's children (-1 = append). To add at the TOP LEVEL of the page pass parent_id=\"\" (or \"root\"). Get parent ids from elementor_get_page. Auto-backed-up.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "parent_id": {
      "title": "Parent Id",
      "type": "string"
     },
     "element": {
      "additionalProperties": true,
      "title": "Element",
      "type": "object"
     },
     "position": {
      "default": -1,
      "title": "Position",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "parent_id",
     "element"
    ],
    "title": "elementor_add_widgetArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_apply_template",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Apply a SAVED library template (from elementor_list_templates) onto a page. `mode`='append' adds it after the existing content, 'replace' swaps the whole page. Everything is re-id'd and the page is auto-backed-up (undo with elementor_restore). Owner beta + paid.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "template_id": {
      "title": "Template Id",
      "type": "integer"
     },
     "mode": {
      "default": "append",
      "title": "Mode",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "template_id"
    ],
    "title": "elementor_apply_templateArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_delete_element",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete an Elementor element (widget/column/section) by its id. Its children go with it and the layout reflows. Get ids from elementor_get_page. Auto-backed-up; use elementor_restore to undo if you remove the wrong one.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "element_id": {
      "title": "Element Id",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "element_id"
    ],
    "title": "elementor_delete_elementArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_duplicate",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Duplicate an Elementor element (widget/column/section/container) by id - a deep copy with FRESH unique ids for the clone and all its children - inserted right AFTER the original, in the same parent. Perfect for repeating a feature/pricing/testimonial card or a whole section. Get ids from elementor_get_page. Returns the new element's id so you can then edit it. Auto-backed-up (undo with elementor_restore).",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "element_id": {
      "title": "Element Id",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "element_id"
    ],
    "title": "elementor_duplicateArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_edit_text",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Change the TEXT of one Elementor widget by its id, preserving all styling and the rest of the page. `fields` maps the widget's text setting(s) to new values, e.g. {\"title\": \"New heading\"} for a Heading, {\"editor\": \"<p>New copy</p>\"} for a Text Editor, {\"text\": \"Buy now\"} for a Button. Get ids from elementor_get_page first. Auto-backed-up.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "widget_id": {
      "title": "Widget Id",
      "type": "string"
     },
     "fields": {
      "additionalProperties": true,
      "title": "Fields",
      "type": "object"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "widget_id",
     "fields"
    ],
    "title": "elementor_edit_textArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_get_page",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read an Elementor page's layout. Returns is_elementor, a compact widget map (each widget's id, type, and editable text), the number of backups, AND the full _elementor_data tree. ALWAYS call this first before editing an Elementor page so you know the element ids. If is_elementor is false, the page is NOT built with Elementor — use the normal content tools (update_page / update_post) instead of these.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "elementor_get_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_globals",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read or set Elementor's SITE-WIDE global styles (the \"Global Colors\" + \"Global Fonts\" in Site Settings) - change the whole site's palette/typography in ONE call instead of per widget. Call with no args to READ the active kit's globals. To WRITE, pass `colors` and/or `fonts` as the kit's arrays: colors = {\"system_colors\": [{\"_id\":\"primary\",\"title\":\"Primary\",\"color\":\"#0f8a5f\"}, ...], \"custom_colors\": [...]} fonts = {\"system_typography\": [{\"_id\":\"primary\",\"title\":\"Primary\", \"typography_typography\":\"custom\",\"typography_font_family\":\"Poppins\", \"typography_font_weight\":\"600\"}, ...]} Widgets that use a Global color/font update automatically. Site-wide change - needs an admin connection. Owner beta ",
   "input_schema": {
    "properties": {
     "colors": {
      "additionalProperties": true,
      "default": null,
      "title": "Colors",
      "type": "object"
     },
     "fonts": {
      "additionalProperties": true,
      "default": null,
      "title": "Fonts",
      "type": "object"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "elementor_globalsArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_import_template",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Import an Elementor TEMPLATE onto a page - exactly like Elementor's own \"Import Template\" (the JSON files people share/export from Elementor). `template` is that export JSON as a string: it accepts BOTH shapes - a full export ({\"content\":[...], \"page_settings\":{...}, \"type\":\"...\", \"version\":\"...\"}) OR a raw _elementor_data element array. Fresh unique ids are generated for every imported element so they never clash with what's already on the page.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "template": {
      "title": "Template",
      "type": "string"
     },
     "mode": {
      "default": "replace",
      "title": "Mode",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "template"
    ],
    "title": "elementor_import_templateArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_list_templates",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the saved Elementor LIBRARY templates on this site (id, title, type) - the reusable designs you can apply to any page with elementor_apply_template. Owner beta + paid.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "elementor_list_templatesArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_move",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Move/reorder an existing Elementor element (widget/column/section/container) by id - Elementor's drag-and-drop equivalent. Give the element's id, and either a NEW parent to move it into or the SAME parent to just reorder. `new_parent_id` empty or \"root\" = top level. `position` = 0-based index among the target parent's children (-1 = append to the end). Get ids from elementor_get_page. The element keeps all its styling and children. Auto-backed-up (undo with elementor_restore).",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "element_id": {
      "title": "Element Id",
      "type": "string"
     },
     "new_parent_id": {
      "default": "",
      "title": "New Parent Id",
      "type": "string"
     },
     "position": {
      "default": -1,
      "title": "Position",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "element_id"
    ],
    "title": "elementor_moveArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_page_settings",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read or set a page's Elementor PAGE settings (the gear icon in the editor): page layout, content width, hide title, and the page-level Custom CSS. Call with only post_id to READ the current settings; pass `settings` (an object) to MERGE-write them (only the keys you send change). Common keys: 'custom_css' (page-level CSS string), 'template' ('elementor_canvas' | 'elementor_header_footer' | 'default'), 'content_width' ({'unit':'px','size':1140}), 'hide_title' ('yes'/''). Auto CSS-flush. Owner beta + paid.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "settings": {
      "additionalProperties": true,
      "default": null,
      "title": "Settings",
      "type": "object"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "elementor_page_settingsArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_playbook",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "The HTML->Elementor build guide the design flow refers to. Call this BEFORE building or restructuring an Elementor page, right after design_reference/design_intelligence, so you emit a VALID Elementor tree instead of guessing. Returns: (1) the _elementor_data shape rules, (2) the exact settings keys for the common widgets, (3) ready-to-adapt section TEMPLATES (as real Elementor JSON) you can drop into elementor_import_template(mode='append') and then tweak with elementor_update_widget / elementor_duplicate / elementor_move.",
   "input_schema": {
    "properties": {
     "section": {
      "default": "",
      "title": "Section",
      "type": "string"
     }
    },
    "title": "elementor_playbookArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_replace_data",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Escape hatch for a FULL restructure: replace the whole Elementor tree at once. `data` is the complete _elementor_data as a JSON string (or the array) you composed. It goes through the same guarded bridge (auto-backup + server-side JSON/shape validation + CSS-cache clear), so a malformed tree is rejected and the page is left untouched. Prefer the id-scoped tools for small edits; use this only for a full rebuild. Auto-backed-up.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "data": {
      "title": "Data",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "data"
    ],
    "title": "elementor_replace_dataArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_restore",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Undo Elementor edits: restore the last saved backup (or a specific one by backup_time from elementor_get_page's `backups` list). The current data is replaced with the backup and the CSS cache is cleared. Use this if an edit broke the page.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "backup_time": {
      "default": "",
      "title": "Backup Time",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "elementor_restoreArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_save_template",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Save a design as a REUSABLE Elementor library template. Either snapshot an existing page's whole layout (pass source_post_id) OR pass `data` (an Elementor JSON array/string, e.g. one section you built). `template_type` = 'section' | 'page' | 'container'. Returns the new template id; apply it later with elementor_apply_template. Owner beta + paid.",
   "input_schema": {
    "properties": {
     "title": {
      "title": "Title",
      "type": "string"
     },
     "source_post_id": {
      "default": 0,
      "title": "Source Post Id",
      "type": "integer"
     },
     "data": {
      "default": "",
      "title": "Data",
      "type": "string"
     },
     "template_type": {
      "default": "section",
      "title": "Template Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "title"
    ],
    "title": "elementor_save_templateArguments",
    "type": "object"
   }
  },
  {
   "name": "elementor_update_widget",
   "category": "elementor",
   "endpoints": [
    "/mcp"
   ],
   "description": "Merge arbitrary `settings` onto one Elementor element by id — full control over styling: typography, colors, spacing, alignment, background, responsive (_tablet/_mobile) keys, etc. Only the keys you pass are changed; everything else on the element and the rest of the page is preserved. Get the element id + current settings from elementor_get_page (the full tree is in `data`). Auto-backed-up; elementor_restore undoes it.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "widget_id": {
      "title": "Widget Id",
      "type": "string"
     },
     "settings": {
      "additionalProperties": true,
      "title": "Settings",
      "type": "object"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "widget_id",
     "settings"
    ],
    "title": "elementor_update_widgetArguments",
    "type": "object"
   }
  },
  {
   "name": "expert_playbook",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Expert best-practice playbook for a marketing/SEO/content task, so you act like a specialist instead of giving generic advice. Pass a topic such as: 'seo_audit', 'keyword_research', 'geo' (AI citations), 'meta_tags', 'schema', 'content_strategy', 'cro' (conversions), or 'copywriting' - or plain language like 'why isn't my post ranking' / 'get cited by ChatGPT' / 'improve my title'.",
   "input_schema": {
    "properties": {
     "topic": {
      "title": "Topic",
      "type": "string"
     }
    },
    "required": [
     "topic"
    ],
    "title": "expert_playbookArguments",
    "type": "object"
   }
  },
  {
   "name": "find_and_replace_meta",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Find & replace text across an SEO meta field on many posts. `field` is one of: meta_title, meta_description, focus_keyword. apply=False previews matches; apply=True writes the changes. Great for bulk rebrands/typos in SEO fields.",
   "input_schema": {
    "properties": {
     "field": {
      "title": "Field",
      "type": "string"
     },
     "find": {
      "title": "Find",
      "type": "string"
     },
     "replace": {
      "title": "Replace",
      "type": "string"
     },
     "limit": {
      "default": 300,
      "title": "Limit",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "field",
     "find",
     "replace"
    ],
    "title": "find_and_replace_metaArguments",
    "type": "object"
   }
  },
  {
   "name": "find_decaying_content",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Find posts that are LOSING search traffic/position so you can refresh them - the single highest-ROI SEO activity. If Google Search Console is connected, it compares the last `days` to the previous `days` and flags pages whose clicks or position dropped. If GSC is NOT connected, it falls back to a content-age heuristic (older posts that are also thin get flagged as refresh candidates). Returns a ranked 'refresh these first' list; then use improve_old_post to fix them.",
   "input_schema": {
    "properties": {
     "days": {
      "default": 90,
      "title": "Days",
      "type": "integer"
     },
     "limit": {
      "default": 15,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "find_decaying_contentArguments",
    "type": "object"
   }
  },
  {
   "name": "find_duplicate_titles",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Find posts with identical or near-identical titles (possible duplicate/competing content). Returns groups of posts sharing a title.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 300,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "find_duplicate_titlesArguments",
    "type": "object"
   }
  },
  {
   "name": "find_orphan_pages",
   "category": "links",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Find ORPHAN content: published posts/pages that NO other post links to internally. Orphans are hard for users and search engines to discover. Returns the orphaned items so you can add internal links to them (e.g. with bulk_internal_links). Scans up to `limit` posts.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 300,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "find_orphan_pagesArguments",
    "type": "object"
   }
  },
  {
   "name": "find_related_posts",
   "category": "links",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Find posts most related to a given post (by shared title keywords). Useful for adding 'Related articles' internal links. Returns title + url.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "max_results": {
      "default": 6,
      "title": "Max Results",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "find_related_postsArguments",
    "type": "object"
   }
  },
  {
   "name": "find_thin_content",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Scan posts and flag THIN content (fewer than `min_words` words of visible text, schema/HTML stripped). Thin pages hurt SEO. Returns id, title, word_count, url sorted shortest first.",
   "input_schema": {
    "properties": {
     "min_words": {
      "default": 600,
      "title": "Min Words",
      "type": "integer"
     },
     "limit": {
      "default": 300,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "find_thin_contentArguments",
    "type": "object"
   }
  },
  {
   "name": "fix_missing_alt_text",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Find media items with empty alt text. With apply=False (default) just reports them. With apply=True, sets alt text from each image's title (cleaned). Good for accessibility + image SEO.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 100,
      "title": "Limit",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "fix_missing_alt_textArguments",
    "type": "object"
   }
  },
  {
   "name": "fix_missing_excerpts",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Find published posts with an EMPTY excerpt. With apply=False reports them. With apply=True, generates a ~30-word excerpt from the first paragraph of each (your theme uses excerpt for meta description).",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 100,
      "title": "Limit",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "fix_missing_excerptsArguments",
    "type": "object"
   }
  },
  {
   "name": "full_site_backup",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Take a FULL backup of the site. Always includes code (all themes + plugins + mu-plugins). Set include_uploads=True to also back up the media library (can be large). Set include_db=True for a MIGRATION-GRADE backup - a complete SQL dump of EVERY database table (posts, users, options, WooCommerce, everything), built in resumable chunks so it never times out. With include_db the backup can rebuild the whole site on a new host. Returns a backup_id to use with restore_site_backup. Do this BEFORE big/risky changes or a migration. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "include_uploads": {
      "default": false,
      "title": "Include Uploads",
      "type": "boolean"
     },
     "include_db": {
      "default": false,
      "title": "Include Db",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "full_site_backupArguments",
    "type": "object"
   }
  },
  {
   "name": "ga_list_properties",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List EVERY Google Analytics 4 property and Search Console site this user's connected Google account can access. You can use ANY of them immediately - pass property_id=... to the ga_* traffic tools, or sc_site=... to ga_search_queries / ga_search_pages. There is no need to 'switch' or select first: the saved selection is only the default used when you omit those params (a lone property/site is auto-set as that default).",
   "input_schema": {
    "properties": {},
    "title": "ga_list_propertiesArguments",
    "type": "object"
   }
  },
  {
   "name": "ga_overview",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Google Analytics traffic overview for the last `days`: the period TOTAL plus a DAY-BY-DAY breakdown (users, sessions, pageviews, engagement, bounce, avg session duration for each date). `property_id` targets ANY GA4 property your connected Google account can access (see ga_list_properties) - no switching needed; leave it empty to use the saved default.",
   "input_schema": {
    "properties": {
     "days": {
      "default": 28,
      "title": "Days",
      "type": "integer"
     },
     "property_id": {
      "default": "",
      "title": "Property Id",
      "type": "string"
     }
    },
    "title": "ga_overviewArguments",
    "type": "object"
   }
  },
  {
   "name": "ga_search_pages",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Google Search Console: the top PAGES by clicks from Google search in the last `days` (page, clicks, impressions, CTR%, avg position). `sc_site` targets ANY Search Console site your connected Google account can access - one account serves all your sites, no switching. Leave empty to use the saved default.",
   "input_schema": {
    "properties": {
     "days": {
      "default": 28,
      "title": "Days",
      "type": "integer"
     },
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "sc_site": {
      "default": "",
      "title": "Sc Site",
      "type": "string"
     }
    },
    "title": "ga_search_pagesArguments",
    "type": "object"
   }
  },
  {
   "name": "ga_search_queries",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Google Search Console: the top search QUERIES bringing you clicks in the last `days` (query, clicks, impressions, CTR%, avg position). This is real Google search data. `sc_site` targets ANY Search Console site your connected Google account can access (e.g. 'https://example.com/' or 'sc-domain:example.com') - one account serves all your sites, no switching. Leave empty to use the saved default.",
   "input_schema": {
    "properties": {
     "days": {
      "default": 28,
      "title": "Days",
      "type": "integer"
     },
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "sc_site": {
      "default": "",
      "title": "Sc Site",
      "type": "string"
     }
    },
    "title": "ga_search_queriesArguments",
    "type": "object"
   }
  },
  {
   "name": "ga_select",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Choose WHICH Google Analytics 4 property and/or Search Console site to use for this account. Pass a GA4 property ID (digits, e.g. '123456789') and/or a Search Console site URL exactly as shown by ga_list_properties (e.g. 'https://completewaterguide.com/'). Only non-empty values change. Requires a connected Google account.",
   "input_schema": {
    "properties": {
     "ga_property_id": {
      "default": "",
      "title": "Ga Property Id",
      "type": "string"
     },
     "sc_site": {
      "default": "",
      "title": "Sc Site",
      "type": "string"
     }
    },
    "title": "ga_selectArguments",
    "type": "object"
   }
  },
  {
   "name": "ga_status",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Check whether the user has connected Google Analytics + Search Console, and which GA4 property / Search Console site is selected. Use this first.",
   "input_schema": {
    "properties": {},
    "title": "ga_statusArguments",
    "type": "object"
   }
  },
  {
   "name": "ga_top_pages",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Top pages by pageviews in the last `days` (path, views, users, avg engagement). Great for finding your best content. `property_id` targets ANY GA4 property your Google account can access; leave empty for the saved default.",
   "input_schema": {
    "properties": {
     "days": {
      "default": 28,
      "title": "Days",
      "type": "integer"
     },
     "limit": {
      "default": 15,
      "title": "Limit",
      "type": "integer"
     },
     "property_id": {
      "default": "",
      "title": "Property Id",
      "type": "string"
     }
    },
    "title": "ga_top_pagesArguments",
    "type": "object"
   }
  },
  {
   "name": "ga_traffic_sources",
   "category": "analytics",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Where traffic comes from in the last `days`: channel + source/medium with users and sessions. Shows organic vs direct vs referral vs social. `property_id` targets ANY GA4 property your Google account can access; empty = saved default.",
   "input_schema": {
    "properties": {
     "days": {
      "default": 28,
      "title": "Days",
      "type": "integer"
     },
     "limit": {
      "default": 15,
      "title": "Limit",
      "type": "integer"
     },
     "property_id": {
      "default": "",
      "title": "Property Id",
      "type": "string"
     }
    },
    "title": "ga_traffic_sourcesArguments",
    "type": "object"
   }
  },
  {
   "name": "generate_alt_text_ai",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "AI alt-text generator: for images with EMPTY alt text ONLY (it never touches images that already have alt - safe to re-run), use Gemini VISION to look at each image and write a proper descriptive alt text (better than the title-based fix_missing_alt_text).",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 20,
      "title": "Limit",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "generate_alt_text_aiArguments",
    "type": "object"
   }
  },
  {
   "name": "generate_featured_image",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Generate a REALISTIC PHOTO featured image with Google Gemini and attach it to an EXISTING post (the post_id must already exist - create the post first). If `prompt` is empty, an automatic prompt is built from the post's ACTUAL title/topic (so a tulip article gets a tulip image, a dirt-bike article gets a dirt-bike image). The image is uploaded to the WP media library and (by default) set as the post's featured image. Returns the new media id + url.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "prompt": {
      "default": "",
      "title": "Prompt",
      "type": "string"
     },
     "set_as_featured": {
      "default": true,
      "title": "Set As Featured",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "generate_featured_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "generate_image_standalone",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Generate a realistic image with Gemini from a free-text prompt and upload it to the media library (NOT attached to any post). Returns media id + url. Use when you just need an image in the library.",
   "input_schema": {
    "properties": {
     "prompt": {
      "title": "Prompt",
      "type": "string"
     },
     "filename": {
      "default": "ai-image",
      "title": "Filename",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "prompt"
    ],
    "title": "generate_image_standaloneArguments",
    "type": "object"
   }
  },
  {
   "name": "generate_product_description",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate a compelling product description + short description with AI, from the product's name, attributes and any existing detail. `tone` guides the style (persuasive/technical/ friendly). `keywords` are SEO terms to work in naturally. apply=False PREVIEWS the copy; apply=True saves it. For product SEO meta (title/description), call update_post_seo with this product id afterwards - a product IS a post, so no post_type argument is needed.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "tone": {
      "default": "persuasive",
      "title": "Tone",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "generate_product_descriptionArguments",
    "type": "object"
   }
  },
  {
   "name": "generate_product_image",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate a product image with AI and attach it to a WooCommerce product. If `prompt` is empty, a rich one is built from the product name, category and description (better quality). set_as_featured=True makes it the main image.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "prompt": {
      "default": "",
      "title": "Prompt",
      "type": "string"
     },
     "set_as_featured": {
      "default": true,
      "title": "Set As Featured",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "generate_product_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "generate_sitemap",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Return the site's XML sitemap URL (wptaskify serves one automatically). NOTE: Google (June 2023) and Bing both RETIRED the old sitemap-ping URLs, so there is no reliable ping endpoint anymore - reliable resubmission is done via Google Search Console (Site Kit). This confirms the sitemap and, if the old ping endpoints happen to still respond, reports that too.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "generate_sitemapArguments",
    "type": "object"
   }
  },
  {
   "name": "geo_audit_post",
   "category": "geo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "GEO / AEO audit - how CITATION-READY a post is for AI answer engines (ChatGPT, Perplexity, Google AI Overviews, Gemini, Claude). Scores 8 dimensions 0-100 (clear definitions, quotable statements, factual density, source citations, structured Q&A format, authority/E-E-A-T, freshness, structure clarity), gives an overall GEO score, and runs the ANSWER-BLOCK TEST against your `target_queries` (comma-separated) - for each query, is there a standalone 25-50 word answer a machine could quote? Returns measured scores + specific, actionable fixes. All numbers here are MEASURED from the content (not guessed); anything inferred is labeled. For a CUSTOM post type (e.g. 'service'), pass post_type.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "target_queries": {
      "default": "",
      "title": "Target Queries",
      "type": "string"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "geo_audit_postArguments",
    "type": "object"
   }
  },
  {
   "name": "geo_optimize_post",
   "category": "geo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Make a post AI-CITATION-READY. Two ways to use it:",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "optimized_html": {
      "default": "",
      "title": "Optimized Html",
      "type": "string"
     },
     "target_queries": {
      "default": "",
      "title": "Target Queries",
      "type": "string"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "geo_optimize_postArguments",
    "type": "object"
   }
  },
  {
   "name": "get_activity_log",
   "category": "safety",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Get the recent wptaskify activity log (what the AI changed on this site). Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "get_activity_logArguments",
    "type": "object"
   }
  },
  {
   "name": "get_any_post_meta",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Low-level: read ANY custom meta field on a post by exact key name. Use the diagnostic /wg-seo/v1/keys endpoint names. For advanced/edge cases.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "key": {
      "title": "Key",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "key"
    ],
    "title": "get_any_post_metaArguments",
    "type": "object"
   }
  },
  {
   "name": "get_author_seo",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Read the SEO meta title + description for an AUTHOR archive page. WordPress makes the author archive but gives it no SEO meta - this does. Requires the wptaskify plugin. Use list_authors / list_users to find user IDs.",
   "input_schema": {
    "properties": {
     "user_id": {
      "title": "User Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "user_id"
    ],
    "title": "get_author_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "get_custom_css",
   "category": "themes",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Get the current site-wide custom CSS set via wptaskify Studio.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "get_custom_cssArguments",
    "type": "object"
   }
  },
  {
   "name": "get_order",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Get a WooCommerce order's full detail: line items, customer, billing/shipping, totals, payment method and status.",
   "input_schema": {
    "properties": {
     "order_id": {
      "title": "Order Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "order_id"
    ],
    "title": "get_orderArguments",
    "type": "object"
   }
  },
  {
   "name": "get_page",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Get one page's full raw HTML content + title, status.",
   "input_schema": {
    "properties": {
     "page_id": {
      "title": "Page Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "page_id"
    ],
    "title": "get_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "get_post",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Get one post's FULL raw content (HTML) + title, excerpt, status, categories, tags, featured image id. Read this before editing. For a CUSTOM post type (e.g. 'service'), pass post_type so it reads from the right endpoint - otherwise only normal posts work.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "get_postArguments",
    "type": "object"
   }
  },
  {
   "name": "get_post_schema",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Extract ONLY the JSON-LD schema block(s) from a post's content. Use this to read/inspect a post's structured data without the full article. For a CUSTOM post type (e.g. 'service'), pass post_type.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "get_post_schemaArguments",
    "type": "object"
   }
  },
  {
   "name": "get_post_seo",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Read a post's SEO meta fields (meta title, description, focus keyword, keywords). Works on ANY site - auto-detects wptaskify, Yoast, Rank Math, or the wg-seo bridge. Returns current values + length hints (+ score if the wptaskify plugin is installed).",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "get_post_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "get_product",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Get a WooCommerce product's full detail: description, short description, price, stock, SKU, categories, attributes and images.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "get_productArguments",
    "type": "object"
   }
  },
  {
   "name": "get_seo_settings",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read the SITE-WIDE SEO settings (wptaskify plugin): Knowledge Graph identity (Organization vs Person, name, logo, sameAs social profiles, knowsAbout topics), homepage SEO title/description, and the default social (OG) image. Requires the wptaskify plugin. Use update_seo_settings to change them.",
   "input_schema": {
    "properties": {},
    "title": "get_seo_settingsArguments",
    "type": "object"
   }
  },
  {
   "name": "get_settings",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Get site settings: title, tagline (description), timezone, date format, etc.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "get_settingsArguments",
    "type": "object"
   }
  },
  {
   "name": "get_term_seo",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read the SEO meta title + description for a TERM archive (category, tag, or custom taxonomy term). WordPress makes these archive pages but gives them no SEO meta - this does. Requires the wptaskify plugin. Use list_categories / list_tags to find term IDs.",
   "input_schema": {
    "properties": {
     "term_id": {
      "title": "Term Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "term_id"
    ],
    "title": "get_term_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "get_user",
   "category": "users",
   "endpoints": [
    "/mcp"
   ],
   "description": "Get one user's profile (name, email, bio, url, roles). user_id='me' = the connected account. Use before update_user to see current values.",
   "input_schema": {
    "properties": {
     "user_id": {
      "default": "me",
      "title": "User Id",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "get_userArguments",
    "type": "object"
   }
  },
  {
   "name": "get_wp_option",
   "category": "other",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read ANY WordPress option/setting by key (e.g. 'blogname', 'posts_per_page', 'timezone_string'). Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "key": {
      "title": "Key",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "key"
    ],
    "title": "get_wp_optionArguments",
    "type": "object"
   }
  },
  {
   "name": "gsc_inspect_url",
   "category": "analytics",
   "endpoints": [
    "/mcp"
   ],
   "description": "Google Search Console URL INSPECTION: check ONE live URL against Google's index and get its real indexing status, both canonicals, and last crawl - the same data as the \"Inspect URL\" tool in Search Console, but automated. Returns: indexing verdict + coverage state (e.g. 'Submitted and indexed'), your declared canonical (user_canonical) vs the one Google actually chose (google_canonical), last crawl time, robots/fetch state, mobile and rich-results verdicts, and a deep link into Search Console. Use it to diagnose why a page isn't indexed, spot canonical mismatches, and re-check a page after you fix it. `url` = the full page URL to inspect. `sc_site` = which Search Console property (leave empt",
   "input_schema": {
    "properties": {
     "url": {
      "title": "Url",
      "type": "string"
     },
     "sc_site": {
      "default": "",
      "title": "Sc Site",
      "type": "string"
     }
    },
    "required": [
     "url"
    ],
    "title": "gsc_inspect_urlArguments",
    "type": "object"
   }
  },
  {
   "name": "gsc_list_sitemaps",
   "category": "analytics",
   "endpoints": [
    "/mcp"
   ],
   "description": "Google Search Console: list every SITEMAP submitted for the property, with its status - last submitted / last downloaded dates, pending flag, warnings and errors, and (when Google provides them) submitted-vs-indexed URL counts per content type. Use it to confirm your sitemap is being read and to spot sitemap errors. `sc_site` = which property (empty = default).",
   "input_schema": {
    "properties": {
     "sc_site": {
      "default": "",
      "title": "Sc Site",
      "type": "string"
     }
    },
    "title": "gsc_list_sitemapsArguments",
    "type": "object"
   }
  },
  {
   "name": "gsc_submit_sitemap",
   "category": "analytics",
   "endpoints": [
    "/mcp"
   ],
   "description": "Google Search Console: SUBMIT or RESUBMIT a sitemap so Google re-reads it (a write action). Use after publishing new content or fixing sitemap issues, then use gsc_list_sitemaps to confirm it was picked up. `sitemap_url` = the FULL sitemap URL (e.g. https://example.com/wppseo-sitemap.xml). `sc_site` = which property (empty = default). This does NOT force indexing - it only tells Google the sitemap is ready to be re-crawled, exactly like clicking Submit in Search Console.",
   "input_schema": {
    "properties": {
     "sitemap_url": {
      "title": "Sitemap Url",
      "type": "string"
     },
     "sc_site": {
      "default": "",
      "title": "Sc Site",
      "type": "string"
     }
    },
    "required": [
     "sitemap_url"
    ],
    "title": "gsc_submit_sitemapArguments",
    "type": "object"
   }
  },
  {
   "name": "insert_in_article_image",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Generate an image with Gemini and INSERT it inside a post's body as an <img>. If `after_text` is given, the image is placed right after the first occurrence of that text; otherwise appended before the schema block. Preserves schema.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "prompt": {
      "title": "Prompt",
      "type": "string"
     },
     "after_text": {
      "default": "",
      "title": "After Text",
      "type": "string"
     },
     "alt_text": {
      "default": "",
      "title": "Alt Text",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "prompt"
    ],
    "title": "insert_in_article_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "insert_product_card",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Build a polished Amazon product-review CARD and insert it into a post - the main monetization tool. It fetches the product (by ASIN, or the first match for `keywords`), uploads up to `real_images` real Amazon image(s), optionally generates 1 extra polished image with Gemini, and inserts a card (image(s) + title + price + features + 'View on Amazon' affiliate button + disclosure) after `after_text` (or before the schema block). Preserves the post's JSON-LD. Needs Creators API credentials for real data/images; without them it still builds a card with a Gemini image + a tagged search link.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "asin": {
      "default": "",
      "title": "Asin",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     },
     "after_text": {
      "default": "",
      "title": "After Text",
      "type": "string"
     },
     "gemini_image": {
      "default": true,
      "title": "Gemini Image",
      "type": "boolean"
     },
     "real_images": {
      "default": 1,
      "title": "Real Images",
      "type": "integer"
     },
     "disclosure": {
      "default": true,
      "title": "Disclosure",
      "type": "boolean"
     },
     "region": {
      "default": "",
      "title": "Region",
      "type": "string"
     },
     "tag": {
      "default": "",
      "title": "Tag",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "insert_product_cardArguments",
    "type": "object"
   }
  },
  {
   "name": "install_plugin_from_repo",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Install a plugin from the WordPress.org repository by its slug (e.g. 'wordpress-seo', 'contact-form-7'). Set activate=True to also activate it. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "slug": {
      "title": "Slug",
      "type": "string"
     },
     "activate": {
      "default": false,
      "title": "Activate",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "slug"
    ],
    "title": "install_plugin_from_repoArguments",
    "type": "object"
   }
  },
  {
   "name": "keyword_research",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "FREE multi-source keyword research: real GOOGLE + BING Autocomplete suggestions, grouped into questions / comparisons / buyer-intent / modifiers, then (use_ai=True) blended by AI into a prioritized topic plan. No paid SEO tool needed. `seed` = a topic/keyword (e.g. 'commuter e-bike'); `region` = 2-letter country (us, in, uk...). These are real search suggestions, NOT exact volumes - label any volume as an estimate.",
   "input_schema": {
    "properties": {
     "seed": {
      "title": "Seed",
      "type": "string"
     },
     "region": {
      "default": "us",
      "title": "Region",
      "type": "string"
     },
     "use_ai": {
      "default": true,
      "title": "Use Ai",
      "type": "boolean"
     }
    },
    "required": [
     "seed"
    ],
    "title": "keyword_researchArguments",
    "type": "object"
   }
  },
  {
   "name": "list_404_log",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "List recent 404 errors visitors hit (from Redirection plugin's 404 log). Great for finding broken URLs to redirect. Returns url + hit count.",
   "input_schema": {
    "properties": {
     "per_page": {
      "default": 25,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_404_logArguments",
    "type": "object"
   }
  },
  {
   "name": "list_authors",
   "category": "users",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List all authors/users (id, name, role). Use the id with set_post_author.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_authorsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_categories",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List all categories with id, name, count, slug. Use IDs when assigning to posts.",
   "input_schema": {
    "properties": {
     "per_page": {
      "default": 100,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_categoriesArguments",
    "type": "object"
   }
  },
  {
   "name": "list_comments",
   "category": "users",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List comments. status = hold (pending), approve, spam, trash, all. Returns id, author, content snippet, post id, status.",
   "input_schema": {
    "properties": {
     "status": {
      "default": "hold",
      "title": "Status",
      "type": "string"
     },
     "per_page": {
      "default": 20,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_commentsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_coupons",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List WooCommerce discount coupons (code, type, amount, usage, expiry).",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_couponsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_cpt_items",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List items of ANY custom post type (e.g. post_type='service'). Returns id, title, status, link, slug + any taxonomy term ids. Use list_post_types first to find the post_type slug.",
   "input_schema": {
    "properties": {
     "post_type": {
      "title": "Post Type",
      "type": "string"
     },
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "status": {
      "default": "publish,draft",
      "title": "Status",
      "type": "string"
     },
     "per_page": {
      "default": 15,
      "title": "Per Page",
      "type": "integer"
     },
     "page": {
      "default": 1,
      "title": "Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_type"
    ],
    "title": "list_cpt_itemsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_media",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List media library items (images). Returns id, title, source_url, mime_type.",
   "input_schema": {
    "properties": {
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "per_page": {
      "default": 10,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_mediaArguments",
    "type": "object"
   }
  },
  {
   "name": "list_menu_items",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List items in a menu (id, title, url, order, parent). Use to see/plan menu edits.",
   "input_schema": {
    "properties": {
     "menu_id": {
      "title": "Menu Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "menu_id"
    ],
    "title": "list_menu_itemsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_menus",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List navigation menus (id, name) and their locations.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_menusArguments",
    "type": "object"
   }
  },
  {
   "name": "list_my_sites",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List ALL WordPress sites connected to this account (URL + which one is active right now). If you have more than one site, use `use_site` to choose which one the tools act on before running commands on it. Also use this if a tool says no site is connected - it confirms whether any site exists.",
   "input_schema": {
    "properties": {},
    "title": "list_my_sitesArguments",
    "type": "object"
   }
  },
  {
   "name": "list_orders",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List WooCommerce orders (id, status, total, customer, date, items). Filter by `status` (pending/processing/completed/cancelled/refunded/any), `customer` (a customer id), or `after` (YYYY-MM-DD, orders created after this date).",
   "input_schema": {
    "properties": {
     "status": {
      "default": "any",
      "title": "Status",
      "type": "string"
     },
     "per_page": {
      "default": 15,
      "title": "Per Page",
      "type": "integer"
     },
     "page": {
      "default": 1,
      "title": "Page",
      "type": "integer"
     },
     "customer": {
      "default": 0,
      "title": "Customer",
      "type": "integer"
     },
     "after": {
      "default": "",
      "title": "After",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_ordersArguments",
    "type": "object"
   }
  },
  {
   "name": "list_pages",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List pages (About, calculators, etc.). Returns id, title, status, link.",
   "input_schema": {
    "properties": {
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "status": {
      "default": "publish,draft",
      "title": "Status",
      "type": "string"
     },
     "per_page": {
      "default": 20,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_pagesArguments",
    "type": "object"
   }
  },
  {
   "name": "list_plugins",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "List all installed plugins with name, version, file, and active/inactive state. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_pluginsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_post_types",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List every REST-enabled post type on the site (built-in AND custom, e.g. 'service', 'product', 'portfolio') with its slug, label, and REST base. Use this FIRST to discover custom post types before creating/editing their items with the *_cpt_item tools.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_post_typesArguments",
    "type": "object"
   }
  },
  {
   "name": "list_posts",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List posts. Filter by `search` text and `status` (publish,draft,pending,private,future). Returns id, title, status, link, categories, tags. Use to find a post ID before editing.",
   "input_schema": {
    "properties": {
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "status": {
      "default": "publish,draft",
      "title": "Status",
      "type": "string"
     },
     "per_page": {
      "default": 10,
      "title": "Per Page",
      "type": "integer"
     },
     "page": {
      "default": 1,
      "title": "Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_postsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_product_categories",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List WooCommerce product categories (id, name, slug, count, parent).",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_product_categoriesArguments",
    "type": "object"
   }
  },
  {
   "name": "list_product_variations",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List all variations of a variable WooCommerce product (id, sku, price, stock, and the attribute values each variation stands for). Read-only.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "per_page": {
      "default": 30,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "list_product_variationsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_products",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List WooCommerce products (id, name, sku, price, stock, status). Filter by `search`, `status` (publish/draft/any) or `category` (a category id). Use before editing.",
   "input_schema": {
    "properties": {
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "status": {
      "default": "any",
      "title": "Status",
      "type": "string"
     },
     "per_page": {
      "default": 15,
      "title": "Per Page",
      "type": "integer"
     },
     "page": {
      "default": 1,
      "title": "Page",
      "type": "integer"
     },
     "category": {
      "default": "",
      "title": "Category",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_productsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_redirects",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List existing redirects (Redirection plugin) with their ID, source URL, target, and hit count. Use `search` to filter by URL. Get the ID here, then delete_redirect to remove a duplicate/unwanted one.",
   "input_schema": {
    "properties": {
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "per_page": {
      "default": 50,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_redirectsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_revisions",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List a post's saved revisions (id, date, snippet). Use restore_revision to roll back if an edit went wrong.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "list_revisionsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_studio_backups",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the automatic file backups wptaskify Studio has made (before each edit). Useful to reassure the user their originals are saved. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_studio_backupsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_tags",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List tags with id, name, count, slug. Optionally filter by `search`.",
   "input_schema": {
    "properties": {
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "per_page": {
      "default": 100,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_tagsArguments",
    "type": "object"
   }
  },
  {
   "name": "list_taxonomies",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "List the taxonomies (categories/tags AND custom ones like 'service_hub') on the site, optionally filtered to a post_type, with their REST base and (if include_terms) their terms + term IDs. Use this to find the term IDs to assign when creating a custom post-type item.",
   "input_schema": {
    "properties": {
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "include_terms": {
      "default": true,
      "title": "Include Terms",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_taxonomiesArguments",
    "type": "object"
   }
  },
  {
   "name": "list_theme_plugin_files",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "List files/folders inside a theme, plugin or the uploads dir. `path` must start with 'themes/', 'plugins/' or 'uploads/' (e.g. 'themes/blocksy' or 'plugins/wp-pilot-seo'). Use this to explore before reading/editing files. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "path"
    ],
    "title": "list_theme_plugin_filesArguments",
    "type": "object"
   }
  },
  {
   "name": "list_themes",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "List all installed themes with name, version, and which one is ACTIVE. Use this before activating/previewing/editing a theme. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_themesArguments",
    "type": "object"
   }
  },
  {
   "name": "list_users",
   "category": "users",
   "endpoints": [
    "/mcp"
   ],
   "description": "List site users with id, name, email (if visible), and roles.",
   "input_schema": {
    "properties": {
     "per_page": {
      "default": 50,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_usersArguments",
    "type": "object"
   }
  },
  {
   "name": "list_widgets",
   "category": "tax",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the site's widgets and widget areas (sidebars). Returns each sidebar's id/name and the widgets in it. Many classic themes use widgets for footers/sidebars.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "list_widgetsArguments",
    "type": "object"
   }
  },
  {
   "name": "migrate_aioseo_meta",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "One-shot migration: copy old All-in-One-SEO (_aioseo_*) meta into your theme's SEO fields (_cwg_seo_*), for ALL posts + pages in a SINGLE server-side pass (no per-post loop). SAFE: only fills EMPTY target fields (never overwrites SEO you set manually), resolves AIOSEO template tags (#post_title, #site_title, #separator_sa) into real text, and flags anything with an unresolved tag.",
   "input_schema": {
    "properties": {
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "migrate_aioseo_metaArguments",
    "type": "object"
   }
  },
  {
   "name": "migrate_site",
   "category": "other",
   "endpoints": [
    "/mcp"
   ],
   "description": "Migrate one connected site to another - copy it directly plugin-to-plugin (e.g. LIVE -> LOCAL or LOCAL -> LIVE). Both sites must be connected to wptaskify with the Studio (Pro) add-on. This: (1) takes a full backup on from_site (code + media + full database), (2) makes temporary download links, (3) has to_site pull those files straight from from_site (server-to-server, nothing through this connector), (4) restores them on to_site - files and, if include_db, the whole database (OVERWRITES to_site's database).",
   "input_schema": {
    "properties": {
     "from_site": {
      "title": "From Site",
      "type": "string"
     },
     "to_site": {
      "title": "To Site",
      "type": "string"
     },
     "include_uploads": {
      "default": true,
      "title": "Include Uploads",
      "type": "boolean"
     },
     "include_db": {
      "default": true,
      "title": "Include Db",
      "type": "boolean"
     }
    },
    "required": [
     "from_site",
     "to_site"
    ],
    "title": "migrate_siteArguments",
    "type": "object"
   }
  },
  {
   "name": "moderate_comment",
   "category": "users",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Moderate a comment. action = approve, hold, spam, trash, delete.",
   "input_schema": {
    "properties": {
     "comment_id": {
      "title": "Comment Id",
      "type": "integer"
     },
     "action": {
      "title": "Action",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "comment_id",
     "action"
    ],
    "title": "moderate_commentArguments",
    "type": "object"
   }
  },
  {
   "name": "ping_search_engines",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Ask search engines to re-crawl. IMPORTANT: Google and Bing RETIRED their sitemap-ping endpoints in 2023, so there is no working \"ping\" anymore. The reliable way to get new content crawled is Google Search Console (Site Kit) - submit your sitemap once and use \"Request indexing\" for a specific URL. This tool now returns those instructions instead of hitting dead endpoints.",
   "input_schema": {
    "properties": {
     "post_url": {
      "default": "",
      "title": "Post Url",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "ping_search_enginesArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_account_analytics",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "How the WHOLE account performed over the last `days` - impressions, saves, pin clicks and outbound clicks. pinterest_pin_analytics answers \"how did this one pin do\"; this answers \"is any of this working\".",
   "input_schema": {
    "properties": {
     "days": {
      "default": 30,
      "title": "Days",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_account_analyticsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_account_profile",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "The connected Pinterest account's own profile: follower count, following count, monthly views, business name and website. Use it to answer \"is this account actually growing?\" before deciding what to pin more of.",
   "input_schema": {
    "properties": {
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_account_profileArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_board_pins",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the pins on ONE board. Use it to check whether a board is actually being fed, and what is already on it before adding more of the same.",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "bookmark": {
      "default": "",
      "title": "Bookmark",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id"
    ],
    "title": "pinterest_board_pinsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_board_section_pins",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the pins inside one board SECTION (pinterest_board_pins covers a whole board).",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "section_id": {
      "title": "Section Id",
      "type": "string"
     },
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id",
     "section_id"
    ],
    "title": "pinterest_board_section_pinsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_board_sections",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "List a board's sections. Boards with many pins are usually split into sections, and a pin can be placed in one - which nothing here could see or target before.",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id"
    ],
    "title": "pinterest_board_sectionsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_bulk_pin_blog_posts",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Prepare Pinterest pins for MANY WordPress blog posts at once (Pinterest is a top blog-traffic source).",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "limit": {
      "default": 5,
      "title": "Limit",
      "type": "integer"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id"
    ],
    "title": "pinterest_bulk_pin_blog_postsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_bulk_pin_products",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Prepare Pinterest pins for MANY products at once - the RIGHT way.",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "limit": {
      "default": 5,
      "title": "Limit",
      "type": "integer"
     },
     "only_active": {
      "default": true,
      "title": "Only Active",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id"
    ],
    "title": "pinterest_bulk_pin_productsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_create_board",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a Pinterest board (e.g. one per product category or blog topic). privacy = PUBLIC (default, so pins can be found), PROTECTED, or SECRET. `pinterest_account` = a username to target a specific connected account. Returns the new board id. Tip: use keyword-rich, searchable board names (Pinterest is a search engine).",
   "input_schema": {
    "properties": {
     "name": {
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "privacy": {
      "default": "PUBLIC",
      "title": "Privacy",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "name"
    ],
    "title": "pinterest_create_boardArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_create_board_section",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Add a section to a board - a sub-group inside it, like \"Kitchen\" inside \"Home Ideas\".",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "name": {
      "title": "Name",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id",
     "name"
    ],
    "title": "pinterest_create_board_sectionArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_delete_board",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete a board and EVERY pin on it. Irreversible.",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id"
    ],
    "title": "pinterest_delete_boardArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_delete_board_section",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete a board section. The pins inside it move back to the board rather than being deleted, so this is far safer than deleting a board - but it still needs confirm=True so it is never a side effect of a vague instruction.",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "section_id": {
      "title": "Section Id",
      "type": "string"
     },
     "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id",
     "section_id"
    ],
    "title": "pinterest_delete_board_sectionArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_delete_draft",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete a saved pin DRAFT (not a published pin). Nothing on Pinterest is touched.",
   "input_schema": {
    "properties": {
     "draft_id": {
      "default": "",
      "title": "Draft Id",
      "type": "string"
     },
     "all_drafts": {
      "default": false,
      "title": "All Drafts",
      "type": "boolean"
     },
     "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_delete_draftArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_delete_pin",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "PERMANENTLY delete a live Pinterest pin. Requires confirm=True.",
   "input_schema": {
    "properties": {
     "pin_id": {
      "title": "Pin Id",
      "type": "string"
     },
     "confirm": {
      "default": false,
      "title": "Confirm",
      "type": "boolean"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "pin_id"
    ],
    "title": "pinterest_delete_pinArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_draft_from_topic",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Design a Pinterest pin from a TOPIC ALONE and save it as a DRAFT. No website, no store and no Pinterest connection required - this is the tool for \"make me a nail art pin\" when nothing is connected yet.",
   "input_schema": {
    "properties": {
     "topic": {
      "title": "Topic",
      "type": "string"
     },
     "headline": {
      "default": "",
      "title": "Headline",
      "type": "string"
     },
     "pin_title": {
      "default": "",
      "title": "Pin Title",
      "type": "string"
     },
     "pin_description": {
      "default": "",
      "title": "Pin Description",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     },
     "style": {
      "default": "",
      "title": "Style",
      "type": "string"
     },
     "art_prompt": {
      "default": "",
      "title": "Art Prompt",
      "type": "string"
     },
     "alt_text": {
      "default": "",
      "title": "Alt Text",
      "type": "string"
     },
     "link": {
      "default": "",
      "title": "Link",
      "type": "string"
     },
     "board_name": {
      "default": "",
      "title": "Board Name",
      "type": "string"
     },
     "image_quality": {
      "default": "",
      "title": "Image Quality",
      "type": "string"
     },
     "image_model": {
      "default": "",
      "title": "Image Model",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "topic"
    ],
    "title": "pinterest_draft_from_topicArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_followers",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Who follows this Pinterest account.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_followersArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_following",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Who (or which boards) this account follows.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "boards": {
      "default": false,
      "title": "Boards",
      "type": "boolean"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_followingArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_generate_drafts",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Generate FINISHED Pinterest pins and SAVE them as DRAFTS (do NOT publish). This is how you prepare pins. NO Pinterest connection or board is required to build drafts - build them BEFORE connecting, then connect + publish later. `board_id` is OPTIONAL (a board is chosen at publish).",
   "input_schema": {
    "properties": {
     "board_id": {
      "default": "",
      "title": "Board Id",
      "type": "string"
     },
     "board_name": {
      "default": "",
      "title": "Board Name",
      "type": "string"
     },
     "source": {
      "default": "products",
      "title": "Source",
      "type": "string"
     },
     "limit": {
      "default": 20,
      "title": "Limit",
      "type": "integer"
     },
     "only_active": {
      "default": true,
      "title": "Only Active",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "design": {
      "default": true,
      "title": "Design",
      "type": "boolean"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "image_quality": {
      "default": "",
      "title": "Image Quality",
      "type": "string"
     },
     "post_id": {
      "default": 0,
      "title": "Post Id",
      "type": "integer"
     },
     "image_model": {
      "default": "",
      "title": "Image Model",
      "type": "string"
     },
     "pin_title": {
      "default": "",
      "title": "Pin Title",
      "type": "string"
     },
     "pin_description": {
      "default": "",
      "title": "Pin Description",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     },
     "headline": {
      "default": "",
      "title": "Headline",
      "type": "string"
     },
     "alt_text": {
      "default": "",
      "title": "Alt Text",
      "type": "string"
     },
     "style": {
      "default": "",
      "title": "Style",
      "type": "string"
     },
     "art_prompt": {
      "default": "",
      "title": "Art Prompt",
      "type": "string"
     }
    },
    "title": "pinterest_generate_draftsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_generate_pin_image",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Generate a VIRAL, Pinterest-optimized pin (2:3, 1000x1500) and SAVE IT AS A DRAFT.",
   "input_schema": {
    "properties": {
     "subject": {
      "title": "Subject",
      "type": "string"
     },
     "headline": {
      "default": "",
      "title": "Headline",
      "type": "string"
     },
     "style": {
      "default": "lifestyle",
      "title": "Style",
      "type": "string"
     },
     "context": {
      "default": "",
      "title": "Context",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "image_quality": {
      "default": "",
      "title": "Image Quality",
      "type": "string"
     },
     "art_prompt": {
      "default": "",
      "title": "Art Prompt",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     },
     "image_model": {
      "default": "",
      "title": "Image Model",
      "type": "string"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "link": {
      "default": "",
      "title": "Link",
      "type": "string"
     },
     "alt_text": {
      "default": "",
      "title": "Alt Text",
      "type": "string"
     },
     "board_name": {
      "default": "",
      "title": "Board Name",
      "type": "string"
     },
     "board_id": {
      "default": "",
      "title": "Board Id",
      "type": "string"
     },
     "board_reason": {
      "default": "",
      "title": "Board Reason",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     }
    },
    "required": [
     "subject"
    ],
    "title": "pinterest_generate_pin_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_get_pin",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "One published pin in full - its title, description, link, board, and its live metrics (saves, clicks, impressions) where Pinterest has them.",
   "input_schema": {
    "properties": {
     "pin_id": {
      "title": "Pin Id",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "pin_id"
    ],
    "title": "pinterest_get_pinArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_list_boards",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the Pinterest boards (id + name + pin count). Boards are only needed to PUBLISH a pin, and require a connected account.",
   "input_schema": {
    "properties": {
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_list_boardsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_list_drafts",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the Pinterest pin DRAFTS saved in your dashboard (generated but not yet published). status='draft' (unpublished, default) or 'published'. Use before publishing to review them.",
   "input_schema": {
    "properties": {
     "status": {
      "default": "draft",
      "title": "Status",
      "type": "string"
     },
     "only_needs_seo": {
      "default": false,
      "title": "Only Needs Seo",
      "type": "boolean"
     }
    },
    "title": "pinterest_list_draftsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_list_pins",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the pins already published on the connected account, newest first. This is how you answer \"what have I already pinned?\" - which matters before pinning again, because pinning the same URL repeatedly is what gets an account throttled.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "bookmark": {
      "default": "",
      "title": "Bookmark",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_list_pinsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_list_scheduled",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Every pin with a booked publish time, soonest first - the 'what is going out and when' view. Parked drafts are not listed here; use pinterest_list_drafts for those.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 50,
      "title": "Limit",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_list_scheduledArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_list_schedules",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Show the automatic Pinterest jobs that are running - what they do, how often, when they next run and what happened last time.",
   "input_schema": {
    "properties": {
     "pause": {
      "default": "",
      "title": "Pause",
      "type": "string"
     },
     "resume": {
      "default": "",
      "title": "Resume",
      "type": "string"
     },
     "delete": {
      "default": "",
      "title": "Delete",
      "type": "string"
     }
    },
    "title": "pinterest_list_schedulesArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_pin_ai_design",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a Pinterest pin from a FRESH AI-generated vertical design - not tied to a product or",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "topic": {
      "title": "Topic",
      "type": "string"
     },
     "link": {
      "title": "Link",
      "type": "string"
     },
     "style": {
      "default": "",
      "title": "Style",
      "type": "string"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "image_quality": {
      "default": "",
      "title": "Image Quality",
      "type": "string"
     },
     "art_prompt": {
      "default": "",
      "title": "Art Prompt",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     },
     "image_model": {
      "default": "",
      "title": "Image Model",
      "type": "string"
     }
    },
    "required": [
     "board_id",
     "topic",
     "link"
    ],
    "title": "pinterest_pin_ai_designArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_pin_analytics",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Get engagement analytics for one pin (impressions, saves, pin clicks, outbound clicks) over the last `days`. Read it to see which pins actually send traffic, not just which look busy - outbound clicks are the number that matters for a blog or a store.",
   "input_schema": {
    "properties": {
     "pin_id": {
      "title": "Pin Id",
      "type": "string"
     },
     "days": {
      "default": 30,
      "title": "Days",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "pin_id"
    ],
    "title": "pinterest_pin_analyticsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_pin_blog_post",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a Pinterest pin for a WordPress blog post, linking back to it (Pinterest is a top",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "image_url": {
      "default": "",
      "title": "Image Url",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "board_id"
    ],
    "title": "pinterest_pin_blog_postArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_pin_collection",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a Pinterest pin for a whole COLLECTION (Shopify) or CATEGORY (WooCommerce),",
   "input_schema": {
    "properties": {
     "collection_id": {
      "title": "Collection Id",
      "type": "string"
     },
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "image_url": {
      "default": "",
      "title": "Image Url",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "collection_id",
     "board_id"
    ],
    "title": "pinterest_pin_collectionArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_pin_custom",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a single Pinterest pin from explicit values (image URL + title + description +",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "title": {
      "title": "Title",
      "type": "string"
     },
     "description": {
      "title": "Description",
      "type": "string"
     },
     "link": {
      "title": "Link",
      "type": "string"
     },
     "image_url": {
      "title": "Image Url",
      "type": "string"
     },
     "alt_text": {
      "default": "",
      "title": "Alt Text",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id",
     "title",
     "description",
     "link",
     "image_url"
    ],
    "title": "pinterest_pin_customArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_pin_page",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a Pinterest pin for a PAGE - a Shopify page or a WordPress page (About, a landing",
   "input_schema": {
    "properties": {
     "page_id": {
      "title": "Page Id",
      "type": "integer"
     },
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "image_url": {
      "default": "",
      "title": "Image Url",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "page_id",
     "board_id"
    ],
    "title": "pinterest_pin_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_pin_product",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a Pinterest pin for one product, linking back to its page (drives traffic).",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "image_url": {
      "default": "",
      "title": "Image Url",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "board_id"
    ],
    "title": "pinterest_pin_productArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_pin_product_tags",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read the product tags on a pin - the shoppable products attached to it.",
   "input_schema": {
    "properties": {
     "pin_id": {
      "title": "Pin Id",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "pin_id"
    ],
    "title": "pinterest_pin_product_tagsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_publish_drafts",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Publish pins whose SCHEDULED TIME has arrived.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 5,
      "title": "Limit",
      "type": "integer"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     },
     "only_scheduled": {
      "default": true,
      "title": "Only Scheduled",
      "type": "boolean"
     }
    },
    "title": "pinterest_publish_draftsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_repin",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Save an existing pin to another of your boards (a repin).",
   "input_schema": {
    "properties": {
     "pin_id": {
      "title": "Pin Id",
      "type": "string"
     },
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "board_section_id": {
      "default": "",
      "title": "Board Section Id",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "pin_id",
     "board_id"
    ],
    "title": "pinterest_repinArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_schedule",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Schedule automatic DRAFT-BUILDING from your posts or products. Each run designs `count` fresh pin drafts and saves them for review - it PUBLISHES NOTHING.",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "source": {
      "default": "products",
      "title": "Source",
      "type": "string"
     },
     "count": {
      "default": 3,
      "title": "Count",
      "type": "integer"
     },
     "frequency": {
      "default": "daily",
      "title": "Frequency",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id"
    ],
    "title": "pinterest_scheduleArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_schedule_batch",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Book SEVERAL drafts across days, spacing them out - and show the time of every one.",
   "input_schema": {
    "properties": {
     "draft_ids": {
      "title": "Draft Ids",
      "type": "string"
     },
     "start": {
      "title": "Start",
      "type": "string"
     },
     "per_day": {
      "default": 8,
      "title": "Per Day",
      "type": "integer"
     },
     "gap_hours": {
      "default": 3,
      "title": "Gap Hours",
      "type": "number"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "draft_ids",
     "start"
    ],
    "title": "pinterest_schedule_batchArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_schedule_pin",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Book ONE draft to publish at a specific time.",
   "input_schema": {
    "properties": {
     "draft_id": {
      "title": "Draft Id",
      "type": "string"
     },
     "when": {
      "title": "When",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "draft_id",
     "when"
    ],
    "title": "pinterest_schedule_pinArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_schedule_publish",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Drip your REVIEWED pin drafts out to Pinterest automatically, at a safe pace.",
   "input_schema": {
    "properties": {
     "every": {
      "default": "3h",
      "title": "Every",
      "type": "string"
     },
     "per_run": {
      "default": 1,
      "title": "Per Run",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_schedule_publishArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_search_my_boards",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Find one of YOUR OWN boards by name - useful once an account has dozens of them.",
   "input_schema": {
    "properties": {
     "query": {
      "title": "Query",
      "type": "string"
     },
     "limit": {
      "default": 10,
      "title": "Limit",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "query"
    ],
    "title": "pinterest_search_my_boardsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_search_pins",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Search pins by keyword - either your own, or across Pinterest.",
   "input_schema": {
    "properties": {
     "query": {
      "title": "Query",
      "type": "string"
     },
     "limit": {
      "default": 10,
      "title": "Limit",
      "type": "integer"
     },
     "mine_only": {
      "default": true,
      "title": "Mine Only",
      "type": "boolean"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "query"
    ],
    "title": "pinterest_search_pinsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_seasonal_timing",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "WHEN to publish a seasonal pin, worked out from Pinterest's own demand curve.",
   "input_schema": {
    "properties": {
     "interest": {
      "default": "",
      "title": "Interest",
      "type": "string"
     },
     "region": {
      "default": "US",
      "title": "Region",
      "type": "string"
     },
     "limit": {
      "default": 15,
      "title": "Limit",
      "type": "integer"
     },
     "lead_days": {
      "default": 45,
      "title": "Lead Days",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_seasonal_timingArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_status",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Check which Pinterest business account(s) the user has connected. A user can connect SEVERAL accounts (e.g. different brands/niches). Returns the list with each account's username - pass a username (or leave blank for the default/first) as `pinterest_account` on the other tools to target a specific one. Use this first.",
   "input_schema": {
    "properties": {},
    "title": "pinterest_statusArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_tag_products",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Attach product tags to a pin, making it shoppable.",
   "input_schema": {
    "properties": {
     "pin_id": {
      "title": "Pin Id",
      "type": "string"
     },
     "product_pin_ids": {
      "title": "Product Pin Ids",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "pin_id",
     "product_pin_ids"
    ],
    "title": "pinterest_tag_productsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_top_pins",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "The account's BEST-PERFORMING pins over the last `days`. This is the one that closes the loop: it tells you which pins earned their distribution, so the next batch can look like those instead of being a guess. Read it before generating a new set of drafts.",
   "input_schema": {
    "properties": {
     "days": {
      "default": 30,
      "title": "Days",
      "type": "integer"
     },
     "sort_by": {
      "default": "IMPRESSION",
      "title": "Sort By",
      "type": "string"
     },
     "limit": {
      "default": 10,
      "title": "Limit",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_top_pinsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_top_video_pins",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "The account's best-performing VIDEO pins (pinterest_top_pins covers static pins).",
   "input_schema": {
    "properties": {
     "days": {
      "default": 30,
      "title": "Days",
      "type": "integer"
     },
     "sort_by": {
      "default": "IMPRESSION",
      "title": "Sort By",
      "type": "string"
     },
     "limit": {
      "default": 10,
      "title": "Limit",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_top_video_pinsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_trending_keywords",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "What people are ACTUALLY searching on Pinterest right now - real demand, not a guess.",
   "input_schema": {
    "properties": {
     "region": {
      "default": "US",
      "title": "Region",
      "type": "string"
     },
     "trend_type": {
      "default": "growing",
      "title": "Trend Type",
      "type": "string"
     },
     "interest": {
      "default": "",
      "title": "Interest",
      "type": "string"
     },
     "limit": {
      "default": 25,
      "title": "Limit",
      "type": "integer"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_trending_keywordsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_unschedule_pin",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Pull a scheduled pin back to a parked draft. It keeps its image and copy; it just loses its publish time and will not go out until it is given a new one.",
   "input_schema": {
    "properties": {
     "draft_id": {
      "title": "Draft Id",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "draft_id"
    ],
    "title": "pinterest_unschedule_pinArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_untag_products",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Remove product tags from a pin.",
   "input_schema": {
    "properties": {
     "pin_id": {
      "title": "Pin Id",
      "type": "string"
     },
     "product_pin_ids": {
      "title": "Product Pin Ids",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "pin_id",
     "product_pin_ids"
    ],
    "title": "pinterest_untag_productsArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_update_board",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Rename a board or rewrite its description. Only non-empty fields change.",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "privacy": {
      "default": "",
      "title": "Privacy",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id"
    ],
    "title": "pinterest_update_boardArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_update_board_section",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Rename a board section. `pinterest_account` = a username (blank = default).",
   "input_schema": {
    "properties": {
     "board_id": {
      "title": "Board Id",
      "type": "string"
     },
     "section_id": {
      "title": "Section Id",
      "type": "string"
     },
     "name": {
      "title": "Name",
      "type": "string"
     },
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "required": [
     "board_id",
     "section_id",
     "name"
    ],
    "title": "pinterest_update_board_sectionArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_update_draft",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Edit a saved pin draft's TEXT - title, description, link, board, alt text, keywords - without regenerating anything. Free: no image is made, so no credits are spent.",
   "input_schema": {
    "properties": {
     "draft_id": {
      "title": "Draft Id",
      "type": "string"
     },
     "headline": {
      "default": "",
      "title": "Headline",
      "type": "string"
     },
     "pin_title": {
      "default": "",
      "title": "Pin Title",
      "type": "string"
     },
     "pin_description": {
      "default": "",
      "title": "Pin Description",
      "type": "string"
     },
     "link": {
      "default": "",
      "title": "Link",
      "type": "string"
     },
     "board_id": {
      "default": "",
      "title": "Board Id",
      "type": "string"
     },
     "board_name": {
      "default": "",
      "title": "Board Name",
      "type": "string"
     },
     "alt_text": {
      "default": "",
      "title": "Alt Text",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     },
     "style": {
      "default": "",
      "title": "Style",
      "type": "string"
     }
    },
    "required": [
     "draft_id"
    ],
    "title": "pinterest_update_draftArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_verified_websites",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Which websites this Pinterest account has CLAIMED - the setting that turns plain pins into Rich Pins.",
   "input_schema": {
    "properties": {
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_verified_websitesArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_view_draft_image",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Look at the picture inside a saved pin draft - for pins the owner uploaded by hand, before writing their title, description, alt text and keywords. Returns the image (scaled down to at most 1024px). Free: nothing is generated.",
   "input_schema": {
    "properties": {
     "draft_id": {
      "title": "Draft Id",
      "type": "string"
     }
    },
    "required": [
     "draft_id"
    ],
    "title": "pinterest_view_draft_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "pinterest_website_claim_code",
   "category": "pinterest",
   "endpoints": [
    "/mcp"
   ],
   "description": "Get the code needed to CLAIM a website on Pinterest - both the meta tag and the DNS record.",
   "input_schema": {
    "properties": {
     "pinterest_account": {
      "default": "",
      "title": "Pinterest Account",
      "type": "string"
     }
    },
    "title": "pinterest_website_claim_codeArguments",
    "type": "object"
   }
  },
  {
   "name": "plan_internal_links",
   "category": "links",
   "endpoints": [
    "/mcp"
   ],
   "description": "STEP 1 of bulk internal linking: scan the WHOLE site ONCE and produce a COMPLETE plan of every internal link to add - WITHOUT changing anything.",
   "input_schema": {
    "properties": {
     "max_per_post": {
      "default": 3,
      "title": "Max Per Post",
      "type": "integer"
     },
     "min_title_words": {
      "default": 2,
      "title": "Min Title Words",
      "type": "integer"
     },
     "limit": {
      "default": 300,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "plan_internal_linksArguments",
    "type": "object"
   }
  },
  {
   "name": "preview_theme",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Get a SAFE PREVIEW link for a theme WITHOUT activating it - only the logged-in admin sees the preview; visitors keep seeing the current live theme. This is the 'staging' step: create_theme -> preview_theme -> (looks good?) -> activate_theme. ALWAYS preview a new theme and let the user confirm it looks right before activating. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "slug": {
      "title": "Slug",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "slug"
    ],
    "title": "preview_themeArguments",
    "type": "object"
   }
  },
  {
   "name": "publish_full_article",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "One-shot publisher: creates a post AND (optionally) sets author, categories, tags, excerpt, a short keyword-rich `slug`, generates+attaches a Gemini featured image, and returns suggested internal links for the topic so you can weave them in. `content_html` should be the full article HTML (include your schema script if you have one). ALWAYS pass a short `slug` (3-6 words) for a clean SEO URL. Use status='draft' to review first, 'publish' to go live.",
   "input_schema": {
    "properties": {
     "title": {
      "title": "Title",
      "type": "string"
     },
     "content_html": {
      "title": "Content Html",
      "type": "string"
     },
     "status": {
      "default": "draft",
      "title": "Status",
      "type": "string"
     },
     "author_id": {
      "default": 0,
      "title": "Author Id",
      "type": "integer"
     },
     "category_ids": {
      "default": "",
      "title": "Category Ids",
      "type": "string"
     },
     "tag_ids": {
      "default": "",
      "title": "Tag Ids",
      "type": "string"
     },
     "excerpt": {
      "default": "",
      "title": "Excerpt",
      "type": "string"
     },
     "internal_link_topic": {
      "default": "",
      "title": "Internal Link Topic",
      "type": "string"
     },
     "slug": {
      "default": "",
      "title": "Slug",
      "type": "string"
     },
     "generate_image": {
      "default": true,
      "title": "Generate Image",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "title",
     "content_html"
    ],
    "title": "publish_full_articleArguments",
    "type": "object"
   }
  },
  {
   "name": "read_reference_page",
   "category": "content",
   "endpoints": [
    "/mcp"
   ],
   "description": "Fetch a PUBLIC web page (e.g. a reference article the user linked) and return its ACTUAL structure so you can analyze it before writing something similar: page title, meta description, the H1/H2/H3 heading outline, word count, image count, and the readable body text (trimmed). USE THIS whenever the user gives a URL to 'follow the structure of' / 'write like this post' - never claim you matched a reference you haven't actually read. Returns JSON. Only http/https public pages; not for the user's own WP admin (use get_post for that).",
   "input_schema": {
    "properties": {
     "url": {
      "title": "Url",
      "type": "string"
     }
    },
    "required": [
     "url"
    ],
    "title": "read_reference_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "read_theme_plugin_file",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read a theme/plugin/uploads file's contents. `path` starts with 'themes/', 'plugins/' or 'uploads/' (e.g. 'themes/blocksy/functions.php'). Requires wptaskify Studio. Read BEFORE editing so you preserve existing code.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "path"
    ],
    "title": "read_theme_plugin_fileArguments",
    "type": "object"
   }
  },
  {
   "name": "request_approval",
   "category": "safety",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Queue a genuinely DESTRUCTIVE / hard-to-undo action for the site owner to approve, instead of doing it right away. Only a SMALL set of actions ever needs this.",
   "input_schema": {
    "properties": {
     "action_summary": {
      "title": "Action Summary",
      "type": "string"
     },
     "tool_name": {
      "default": "",
      "title": "Tool Name",
      "type": "string"
     },
     "risk": {
      "default": "high",
      "title": "Risk",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "action_summary"
    ],
    "title": "request_approvalArguments",
    "type": "object"
   }
  },
  {
   "name": "resolve_approval",
   "category": "safety",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Record the user's answer to a pending approval that they gave IN THIS CHAT.",
   "input_schema": {
    "properties": {
     "approval_id": {
      "title": "Approval Id",
      "type": "string"
     },
     "decision": {
      "default": "approved",
      "title": "Decision",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "approval_id"
    ],
    "title": "resolve_approvalArguments",
    "type": "object"
   }
  },
  {
   "name": "restore_revision",
   "category": "safety",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Roll a post back to a previous revision (undo). Fetches that revision's content/title and writes it back onto the live post.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "revision_id": {
      "title": "Revision Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "revision_id"
    ],
    "title": "restore_revisionArguments",
    "type": "object"
   }
  },
  {
   "name": "restore_site_backup",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Restore a full-site backup by its backup_id (from full_site_backup). This overwrites theme/plugin/mu-plugin files and restores the active theme/plugins. Set restore_db=True to ALSO import the database.sql from a migration-grade backup - this OVERWRITES the site's entire database (all posts, users, options). VERY RISKY - only for migration/disaster recovery. WARN the user and confirm first. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "backup_id": {
      "title": "Backup Id",
      "type": "string"
     },
     "restore_db": {
      "default": false,
      "title": "Restore Db",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "backup_id"
    ],
    "title": "restore_site_backupArguments",
    "type": "object"
   }
  },
  {
   "name": "rollback_theme",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Instantly switch back to the theme that was active BEFORE the last activate_theme. Use if a newly activated theme looks broken or wrong on the live site. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "rollback_themeArguments",
    "type": "object"
   }
  },
  {
   "name": "scan_aioseo_leftovers",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Count leftover _aioseo_* meta data still stored in the database (from the old All in One SEO plugin). These can conflict with your theme's _cwg_seo_* fields.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "scan_aioseo_leftoversArguments",
    "type": "object"
   }
  },
  {
   "name": "schedule_post",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Schedule a post to auto-publish at a future time. `datetime_iso` must be site-local time in ISO format, e.g. '2026-07-15T09:00:00'. Sets status=future.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "datetime_iso": {
      "title": "Datetime Iso",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "datetime_iso"
    ],
    "title": "schedule_postArguments",
    "type": "object"
   }
  },
  {
   "name": "search_site",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Search across all posts & pages by keyword. Returns id, title, url, type. Great for finding internal-linking targets before editing an article.",
   "input_schema": {
    "properties": {
     "query": {
      "title": "Query",
      "type": "string"
     },
     "per_page": {
      "default": 15,
      "title": "Per Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "query"
    ],
    "title": "search_siteArguments",
    "type": "object"
   }
  },
  {
   "name": "seo_audit_post",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Full on-page SEO audit of ONE post in a single report: title length, excerpt/meta length, word count, heading structure (H1-H6), internal vs external link counts, images & missing alt, schema present?, and (if given) focus_keyword usage in title/first paragraph/density. Returns issues + stats. For a CUSTOM post type (e.g. 'service'), pass post_type.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "focus_keyword": {
      "default": "",
      "title": "Focus Keyword",
      "type": "string"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "seo_audit_postArguments",
    "type": "object"
   }
  },
  {
   "name": "seo_backend_info",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Detect which SEO system this site uses (wptaskify, Yoast, Rank Math, wg-seo bridge, or none). Tells you whether SEO meta tools will work here and suggests installing the free wptaskify plugin if nothing is detected.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "seo_backend_infoArguments",
    "type": "object"
   }
  },
  {
   "name": "server_backups",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "List the backups taken of one file, newest first.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "path"
    ],
    "title": "server_backupsArguments",
    "type": "object"
   }
  },
  {
   "name": "server_create_plugin",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a new plugin on the filesystem, with a valid header.",
   "input_schema": {
    "properties": {
     "slug": {
      "title": "Slug",
      "type": "string"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "code": {
      "default": "",
      "title": "Code",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "slug"
    ],
    "title": "server_create_pluginArguments",
    "type": "object"
   }
  },
  {
   "name": "server_create_theme",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a new theme on the filesystem, with the files WordPress requires.",
   "input_schema": {
    "properties": {
     "slug": {
      "title": "Slug",
      "type": "string"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "style_css": {
      "default": "",
      "title": "Style Css",
      "type": "string"
     },
     "index_php": {
      "default": "",
      "title": "Index Php",
      "type": "string"
     },
     "functions_php": {
      "default": "",
      "title": "Functions Php",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "slug"
    ],
    "title": "server_create_themeArguments",
    "type": "object"
   }
  },
  {
   "name": "server_db_query",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Run a read-only SQL query against the site's own database.",
   "input_schema": {
    "properties": {
     "sql": {
      "title": "Sql",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "sql"
    ],
    "title": "server_db_queryArguments",
    "type": "object"
   }
  },
  {
   "name": "server_delete",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Delete a file, or an empty folder.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "path"
    ],
    "title": "server_deleteArguments",
    "type": "object"
   }
  },
  {
   "name": "server_diagnose",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "When a site is down and you do not know why - run this FIRST.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_diagnoseArguments",
    "type": "object"
   }
  },
  {
   "name": "server_disable_all_plugins",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Disable EVERY plugin at once, by renaming the plugins folder.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_disable_all_pluginsArguments",
    "type": "object"
   }
  },
  {
   "name": "server_disable_plugin",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Disable ONE plugin by renaming its folder - works on a site that will not load.",
   "input_schema": {
    "properties": {
     "plugin_folder": {
      "title": "Plugin Folder",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "plugin_folder"
    ],
    "title": "server_disable_pluginArguments",
    "type": "object"
   }
  },
  {
   "name": "server_disable_theme",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Force WordPress back to a default theme, by renaming the active theme's folder.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_disable_themeArguments",
    "type": "object"
   }
  },
  {
   "name": "server_edit_file",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Change part of a file without sending the whole thing back.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "find": {
      "title": "Find",
      "type": "string"
     },
     "replace": {
      "title": "Replace",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "all_matches": {
      "default": false,
      "title": "All Matches",
      "type": "boolean"
     }
    },
    "required": [
     "path",
     "find",
     "replace"
    ],
    "title": "server_edit_fileArguments",
    "type": "object"
   }
  },
  {
   "name": "server_enable_plugin",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Undo server_disable_plugin - rename the folder back.",
   "input_schema": {
    "properties": {
     "plugin_folder": {
      "title": "Plugin Folder",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "plugin_folder"
    ],
    "title": "server_enable_pluginArguments",
    "type": "object"
   }
  },
  {
   "name": "server_error_log",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read the PHP error log - the real reason a site is broken.",
   "input_schema": {
    "properties": {
     "lines": {
      "default": 120,
      "title": "Lines",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_error_logArguments",
    "type": "object"
   }
  },
  {
   "name": "server_fix_permissions",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Reset file and folder permissions to what WordPress expects: 644 and 755.",
   "input_schema": {
    "properties": {
     "path": {
      "default": "",
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_fix_permissionsArguments",
    "type": "object"
   }
  },
  {
   "name": "server_install_plugin_zip",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Install a plugin from a .zip URL by unpacking it into wp-content/plugins.",
   "input_schema": {
    "properties": {
     "zip_url": {
      "title": "Zip Url",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "zip_url"
    ],
    "title": "server_install_plugin_zipArguments",
    "type": "object"
   }
  },
  {
   "name": "server_list_files",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "List a folder inside the site - name, type, size, modified time.",
   "input_schema": {
    "properties": {
     "path": {
      "default": "",
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_list_filesArguments",
    "type": "object"
   }
  },
  {
   "name": "server_make_folder",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Create a folder, and any missing folders above it.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "path"
    ],
    "title": "server_make_folderArguments",
    "type": "object"
   }
  },
  {
   "name": "server_php_info",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "PHP version, memory limit, execution time and extensions, as the SITE sees them.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_php_infoArguments",
    "type": "object"
   }
  },
  {
   "name": "server_read_file",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Read a file from the site's filesystem.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "path"
    ],
    "title": "server_read_fileArguments",
    "type": "object"
   }
  },
  {
   "name": "server_rename",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Rename anything inside the site - the general form of the disable tools.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "new_path": {
      "title": "New Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "path",
     "new_path"
    ],
    "title": "server_renameArguments",
    "type": "object"
   }
  },
  {
   "name": "server_restore_all_plugins",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Undo server_disable_all_plugins.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_restore_all_pluginsArguments",
    "type": "object"
   }
  },
  {
   "name": "server_search",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Search the site's files - where is this function, who writes this option.",
   "input_schema": {
    "properties": {
     "text": {
      "title": "Text",
      "type": "string"
     },
     "path": {
      "default": "",
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "text"
    ],
    "title": "server_searchArguments",
    "type": "object"
   }
  },
  {
   "name": "server_set_debug",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Turn WordPress debug logging on or off in wp-config.php.",
   "input_schema": {
    "properties": {
     "on": {
      "default": true,
      "title": "On",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_set_debugArguments",
    "type": "object"
   }
  },
  {
   "name": "server_status",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Is server (SFTP/cPanel) access connected for this site, and what can it reach?",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "server_statusArguments",
    "type": "object"
   }
  },
  {
   "name": "server_undo",
   "category": "safety",
   "endpoints": [
    "/mcp"
   ],
   "description": "Put a file back to how it was before the last write.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "backup": {
      "default": "",
      "title": "Backup",
      "type": "string"
     }
    },
    "required": [
     "path"
    ],
    "title": "server_undoArguments",
    "type": "object"
   }
  },
  {
   "name": "server_upload_media",
   "category": "images",
   "endpoints": [
    "/mcp"
   ],
   "description": "Download a file from a URL straight onto the server.",
   "input_schema": {
    "properties": {
     "url": {
      "title": "Url",
      "type": "string"
     },
     "path": {
      "title": "Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "url",
     "path"
    ],
    "title": "server_upload_mediaArguments",
    "type": "object"
   }
  },
  {
   "name": "server_write_file",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "Write or replace a file on the site. PHP is syntax-checked FIRST.",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "content": {
      "title": "Content",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "skip_lint": {
      "default": false,
      "title": "Skip Lint",
      "type": "boolean"
     }
    },
    "required": [
     "path",
     "content"
    ],
    "title": "server_write_fileArguments",
    "type": "object"
   }
  },
  {
   "name": "set_any_post_meta",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Low-level: set ANY custom meta field on a post by exact key name. Use carefully.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "key": {
      "title": "Key",
      "type": "string"
     },
     "value": {
      "title": "Value",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "key",
     "value"
    ],
    "title": "set_any_post_metaArguments",
    "type": "object"
   }
  },
  {
   "name": "set_custom_css",
   "category": "themes",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set the site-wide custom CSS (applies to the WHOLE site, every theme). This is the SAFEST way to restyle a site - colors, fonts, spacing, layout tweaks - because CSS can never crash PHP. REPLACES the current custom CSS; use get_custom_css first if you want to append. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "css": {
      "title": "Css",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "css"
    ],
    "title": "set_custom_cssArguments",
    "type": "object"
   }
  },
  {
   "name": "set_featured_image",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set a post's featured image (thumbnail) to an existing media item id.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "media_id": {
      "title": "Media Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "media_id"
    ],
    "title": "set_featured_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "set_post_author",
   "category": "users",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set/change the author of a post (use list_authors to get the id). Good for E-E-A-T - assign the right expert to each article. For a CUSTOM post type (e.g. 'service'), pass post_type so it targets the right endpoint - otherwise it only works on normal posts.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "author_id": {
      "title": "Author Id",
      "type": "integer"
     },
     "post_type": {
      "default": "post",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "author_id"
    ],
    "title": "set_post_authorArguments",
    "type": "object"
   }
  },
  {
   "name": "set_product_sale",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Put a product on sale. sale_price is a string ('14.99'). Optional date_from/date_to (YYYY-MM-DD) schedule the sale window. Pass sale_price='' via update_product to end a sale.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "sale_price": {
      "title": "Sale Price",
      "type": "string"
     },
     "date_from": {
      "default": "",
      "title": "Date From",
      "type": "string"
     },
     "date_to": {
      "default": "",
      "title": "Date To",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "sale_price"
    ],
    "title": "set_product_saleArguments",
    "type": "object"
   }
  },
  {
   "name": "set_site_icon",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set the site's FAVICON (browser-tab / bookmark icon, aka Site Icon). `image` is either a public image URL (it gets uploaded) or an existing media id. WordPress wants a square image at least 512x512. Works on any theme (it's a core setting).",
   "input_schema": {
    "properties": {
     "image": {
      "title": "Image",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "image"
    ],
    "title": "set_site_iconArguments",
    "type": "object"
   }
  },
  {
   "name": "set_site_logo",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set the site's LOGO (the custom logo shown in the header by themes that support it). `image` is a public image URL (uploaded) or an existing media id. Uses the core Site Logo setting (works on block themes and classic themes with logo support). If the theme doesn't support a logo, it's stored but may not display - use set_site_icon for the favicon, which every theme shows.",
   "input_schema": {
    "properties": {
     "image": {
      "title": "Image",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "image"
    ],
    "title": "set_site_logoArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_add_product_image",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Add an image to a product from a public URL.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "image_url": {
      "title": "Image Url",
      "type": "string"
     },
     "alt": {
      "default": "",
      "title": "Alt",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "image_url"
    ],
    "title": "shopify_add_product_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_add_to_collection",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Add a product to a manual collection.",
   "input_schema": {
    "properties": {
     "collection_id": {
      "title": "Collection Id",
      "type": "integer"
     },
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "collection_id",
     "product_id"
    ],
    "title": "shopify_add_to_collectionArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_add_variant",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Add a variant to a product (e.g. a new size/colour). option1 is the variant option value (e.g. 'Large'). price is a string.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "price": {
      "title": "Price",
      "type": "string"
     },
     "option1": {
      "default": "",
      "title": "Option1",
      "type": "string"
     },
     "sku": {
      "default": "",
      "title": "Sku",
      "type": "string"
     },
     "inventory_quantity": {
      "default": -1,
      "title": "Inventory Quantity",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "price"
    ],
    "title": "shopify_add_variantArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_aeo_analyzer",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Per-PRODUCT answer-engine readiness analyzer (the Shopify version of the plugin's AEO Analyzer). For each product, checks 5 signals AI answer engines (ChatGPT, Perplexity, Google AI) look for: a direct/quotable answer, an FAQ block, citation-ready facts+sources, a clear entity definition, and freshness. Returns a per-product grid + a summary of how many miss each signal. Pure code, zero AI cost.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 50,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_aeo_analyzerArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_ai_bot_control",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Control which AI crawlers can read your store (like the WordPress AI Access Control). Writes a managed block into the theme's robots.txt.liquid that Disallows each bot you choose to BLOCK - without touching Shopify's own default rules. `block` = comma-separated bot names to block (e.g. 'GPTBot,CCBot'); anything not listed is ALLOWED. get_only=True just returns the current state.",
   "input_schema": {
    "properties": {
     "block": {
      "default": "",
      "title": "Block",
      "type": "string"
     },
     "get_only": {
      "default": false,
      "title": "Get Only",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_ai_bot_controlArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_ai_readiness",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "AI-Readiness / AEO score - grades whether your store is VISIBLE to AI shopping engines (ChatGPT, Perplexity, Google AI Overviews, Gemini). This is the biggest 2026 gap and almost no free app scores it. All pure code (fetches robots.txt + your homepage + a product page, parses JSON-LD) - ZERO AI cost. Checks: (1) AI crawlers (GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot, Google-Extended...) are NOT blocked in robots.txt - a store that followed old 'block the scrapers' advice is invisible to AI; (2) schema depth (Product, Offer, aggregateRating, Organization, BreadcrumbList, FAQPage) - AI answer engines cite structured data; (3) reviews/ social-proof signal present. Returns a 0-100 AI-readi",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_ai_readinessArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_ai_seo_score",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "The Shopify AI SEO Score - a store-wide SEO scorecard across 4 categories (each 0-100) plus an overall, MEASURED from your real product data (no external APIs). Checks the things that actually move Shopify SEO + AI visibility: meta titles/descriptions, product description depth, image alt text, and AEO/GEO readiness (structured, answer-friendly content). Returns concrete issue COUNTS (missing meta, thin descriptions, images without alt) so the AI can offer 'fix this' actions. The Shopify equivalent of the WordPress ai_seo_score.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 50,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_ai_seo_scoreArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_audit_collections",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Audit EVERY collection for the SEO basics: page title, meta description and intro copy.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_audit_collectionsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_broken_links",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Scan the store for broken links / 404s - the classic feature other apps charge for, here FREE. Checks that each published product, collection, page and blog article's storefront URL returns 200 (not 404/dead). Reports the dead URLs so the merchant can fix or redirect them. Pure HTTP checks - no AI cost.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 100,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_broken_linksArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_bulk_generate_descriptions",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate AI descriptions for many Shopify products at once. only_missing=True targets products with an empty body_html. apply=False previews; apply=True writes them. Great for a freshly-imported catalog. To protect quality, apply is processed in batches of at most 25 per call - use `offset` to continue (offset=25, then 50...) and review between batches.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 20,
      "title": "Limit",
      "type": "integer"
     },
     "only_missing": {
      "default": true,
      "title": "Only Missing",
      "type": "boolean"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_bulk_generate_descriptionsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_bulk_generate_product_images",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate professional AI product images for MANY Shopify products at once. Each image is built from that product's own title + type + description (a rich, specific prompt), so the catalog looks like a real photo set, NOT generic. Same AI quality as the single shopify_generate_product_image - no shortcuts for being bulk.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 10,
      "title": "Limit",
      "type": "integer"
     },
     "only_missing": {
      "default": true,
      "title": "Only Missing",
      "type": "boolean"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_bulk_generate_product_imagesArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_bulk_product_alt_text",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Write SEO alt text for Shopify PRODUCT images - YOU (the connected AI) look at the images and write the alt text, so it's specific and high quality (not generic).",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 30,
      "title": "Limit",
      "type": "integer"
     },
     "only_missing": {
      "default": true,
      "title": "Only Missing",
      "type": "boolean"
     },
     "alts": {
      "default": "",
      "title": "Alts",
      "type": "string"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_bulk_product_alt_textArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_bulk_product_seo",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate SEO meta titles + descriptions for many Shopify products at once (stored as Shopify global SEO metafields). apply=False previews; apply=True writes them. To protect quality, apply runs in batches of at most 25 per call - use `offset` to continue (offset=25, then 50...) and review between batches.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 20,
      "title": "Limit",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "offset": {
      "default": 0,
      "title": "Offset",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_bulk_product_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_create_article",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Publish a blog article to a Shopify blog (get blog_id from shopify_list_blogs). body_html is the article HTML. published=False saves it as a draft (safe). tags comma-separated.",
   "input_schema": {
    "properties": {
     "blog_id": {
      "title": "Blog Id",
      "type": "integer"
     },
     "title": {
      "title": "Title",
      "type": "string"
     },
     "body_html": {
      "title": "Body Html",
      "type": "string"
     },
     "author": {
      "default": "",
      "title": "Author",
      "type": "string"
     },
     "tags": {
      "default": "",
      "title": "Tags",
      "type": "string"
     },
     "published": {
      "default": false,
      "title": "Published",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "blog_id",
     "title",
     "body_html"
    ],
    "title": "shopify_create_articleArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_create_collection",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a manual (custom) collection. Add products with shopify_add_to_collection.",
   "input_schema": {
    "properties": {
     "title": {
      "title": "Title",
      "type": "string"
     },
     "body_html": {
      "default": "",
      "title": "Body Html",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "title"
    ],
    "title": "shopify_create_collectionArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_create_discount",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a Shopify discount code. value_type = percentage or fixed_amount. `value` is the amount (e.g. '10' for 10% or a fixed amount; stored negative automatically). Optional starts_at/ends_at (YYYY-MM-DD) and usage_limit.",
   "input_schema": {
    "properties": {
     "code": {
      "title": "Code",
      "type": "string"
     },
     "value": {
      "title": "Value",
      "type": "string"
     },
     "value_type": {
      "default": "percentage",
      "title": "Value Type",
      "type": "string"
     },
     "starts_at": {
      "default": "",
      "title": "Starts At",
      "type": "string"
     },
     "ends_at": {
      "default": "",
      "title": "Ends At",
      "type": "string"
     },
     "usage_limit": {
      "default": 0,
      "title": "Usage Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "code",
     "value"
    ],
    "title": "shopify_create_discountArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_create_page",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a static page (e.g. About, Shipping Policy). published=False saves a draft.",
   "input_schema": {
    "properties": {
     "title": {
      "title": "Title",
      "type": "string"
     },
     "body_html": {
      "title": "Body Html",
      "type": "string"
     },
     "published": {
      "default": false,
      "title": "Published",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "title",
     "body_html"
    ],
    "title": "shopify_create_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_create_product",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a Shopify product. `price` is a string ('19.99'). `tags` comma-separated. image_urls comma-separated public URLs. status defaults to draft (safe). Creates a single default variant with the given price/sku/inventory.",
   "input_schema": {
    "properties": {
     "title": {
      "title": "Title",
      "type": "string"
     },
     "body_html": {
      "default": "",
      "title": "Body Html",
      "type": "string"
     },
     "price": {
      "default": "",
      "title": "Price",
      "type": "string"
     },
     "sku": {
      "default": "",
      "title": "Sku",
      "type": "string"
     },
     "vendor": {
      "default": "",
      "title": "Vendor",
      "type": "string"
     },
     "product_type": {
      "default": "",
      "title": "Product Type",
      "type": "string"
     },
     "tags": {
      "default": "",
      "title": "Tags",
      "type": "string"
     },
     "inventory_quantity": {
      "default": -1,
      "title": "Inventory Quantity",
      "type": "integer"
     },
     "status": {
      "default": "draft",
      "title": "Status",
      "type": "string"
     },
     "image_urls": {
      "default": "",
      "title": "Image Urls",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "title"
    ],
    "title": "shopify_create_productArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_create_redirect",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a URL redirect (e.g. from '/old-product' to '/products/new'). Great after deleting or renaming products/pages so old links don't 404.",
   "input_schema": {
    "properties": {
     "from_path": {
      "title": "From Path",
      "type": "string"
     },
     "to_path": {
      "title": "To Path",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "from_path",
     "to_path"
    ],
    "title": "shopify_create_redirectArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_create_webhook",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a webhook (e.g. topic='orders/create', address='https://your-endpoint'). Lets you react to store events.",
   "input_schema": {
    "properties": {
     "topic": {
      "title": "Topic",
      "type": "string"
     },
     "address": {
      "title": "Address",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "topic",
     "address"
    ],
    "title": "shopify_create_webhookArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_declare_metafields",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Declare wptaskify's product metafield DEFINITIONS on the store (one-time setup). This makes the AEO fields (quick answer, key takeaways, USP, best-for, trust points, FAQ, specs) show up as proper, editable fields in the Shopify product admin under the 'wptaskify' namespace - so a merchant can see and edit them by hand too, not only via the AI. Safe to run more than once: definitions that already exist are skipped. Run this once per store (or after adding a new field). Uses the Shopify GraphQL Admin API (metafieldDefinitionCreate).",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_declare_metafieldsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_delete_article",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a blog article.",
   "input_schema": {
    "properties": {
     "blog_id": {
      "title": "Blog Id",
      "type": "integer"
     },
     "article_id": {
      "title": "Article Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "blog_id",
     "article_id"
    ],
    "title": "shopify_delete_articleArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_delete_collection",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a manual (custom) collection (products are not deleted).",
   "input_schema": {
    "properties": {
     "collection_id": {
      "title": "Collection Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "collection_id"
    ],
    "title": "shopify_delete_collectionArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_delete_discount",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a Shopify discount (price rule) and its codes.",
   "input_schema": {
    "properties": {
     "price_rule_id": {
      "title": "Price Rule Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "price_rule_id"
    ],
    "title": "shopify_delete_discountArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_delete_page",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a static page.",
   "input_schema": {
    "properties": {
     "page_id": {
      "title": "Page Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "page_id"
    ],
    "title": "shopify_delete_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_delete_product",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a Shopify product permanently.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_delete_productArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_delete_product_image",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete an image from a product.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "image_id": {
      "title": "Image Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "image_id"
    ],
    "title": "shopify_delete_product_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_delete_variant",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a variant from a product (a product must keep at least one variant).",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "variant_id": {
      "title": "Variant Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "variant_id"
    ],
    "title": "shopify_delete_variantArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_delete_webhook",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Delete a webhook.",
   "input_schema": {
    "properties": {
     "webhook_id": {
      "title": "Webhook Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "webhook_id"
    ],
    "title": "shopify_delete_webhookArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_duplicate_theme",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Make an UNPUBLISHED copy of a theme so you can edit its design safely without touching the live storefront. Pass from_theme_id (or leave 0 to copy the live 'main' theme). `name` is the new theme's name (defaults to '<original> (wptaskify edit)'). Returns the new theme_id - edit THAT with shopify_write_theme_file, preview it in Shopify, then publish when happy.",
   "input_schema": {
    "properties": {
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "from_theme_id": {
      "default": 0,
      "title": "From Theme Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_duplicate_themeArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_find_thin_content",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Find Shopify products with thin descriptions (fewer than min_words) - these hurt SEO and AI visibility. Returns the products so the AI can beef them up (shopify_generate_product_ description / shopify_geo_optimize). Mirrors find_thin_content for Shopify.",
   "input_schema": {
    "properties": {
     "min_words": {
      "default": 50,
      "title": "Min Words",
      "type": "integer"
     },
     "limit": {
      "default": 100,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_find_thin_contentArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_full_audit",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "A whole-store SEO audit - the all-in-one report other apps charge $34-99/mo for, here FREE. Aggregates every issue in one place: missing meta descriptions, duplicate titles, duplicate meta descriptions, thin descriptions, images without alt text, and products missing structured-data-worthy content. Pure code (reads the Admin API), zero AI cost. Returns itemized issues so the merchant knows exactly what to fix.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 100,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_full_auditArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_generate_product_description",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate a compelling product description with AI from the product's title, vendor and type. `tone` guides style; `keywords` are SEO terms to work in. apply=False PREVIEWS; apply=True saves it as the product's body_html.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "tone": {
      "default": "persuasive",
      "title": "Tone",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_generate_product_descriptionArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_generate_product_image",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate a product image with AI and add it to a Shopify product. If `prompt` is empty, a rich one is built from the product title, type and description (better quality). The image is uploaded to the product's gallery.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "prompt": {
      "default": "",
      "title": "Prompt",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_generate_product_imageArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_generate_schema",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Generate valid JSON-LD structured data for a product WITHOUT AI - built directly from the product's real data. Other apps charge to add schema; here it's FREE. schema_type: 'product' (Product+Offer), 'breadcrumb', or 'faq'. Returns ready-to-paste JSON-LD the merchant can add to the theme (helps Google rich results AND AI answer engines). Pure code - zero AI cost.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "schema_type": {
      "default": "product",
      "title": "Schema Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_generate_schemaArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_geo_optimize",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Optimize a Shopify product for AI answer engines (AEO/GEO) - so ChatGPT/Perplexity/Google AI are more likely to cite it. Uses AI to rewrite the description with a clear answer-first summary, key specs as a list, and factual details. apply=False previews the new description; apply=True writes it. Mirrors geo_optimize_post for Shopify.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "apply": {
      "default": false,
      "title": "Apply",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_geo_optimizeArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_get_collection_seo",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Read a collection's SEO: its page title, meta description, handle and intro copy.",
   "input_schema": {
    "properties": {
     "collection_id": {
      "title": "Collection Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "collection_id"
    ],
    "title": "shopify_get_collection_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_get_discount",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Get a discount (price rule) detail plus its discount codes.",
   "input_schema": {
    "properties": {
     "price_rule_id": {
      "title": "Price Rule Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "price_rule_id"
    ],
    "title": "shopify_get_discountArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_get_product",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Get a Shopify product's full detail: description (body_html), variants (price, sku, inventory), images, tags, vendor and type.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_get_productArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_get_product_aeo",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Read a product's current wptaskify AEO fields (quick_answer, key_takeaways, usp, best_for, trust_points, faq, specs) so you can review or pre-fill an editor before updating them with shopify_update_product_aeo. Returns each field's stored value (empty if not set yet).",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_get_product_aeoArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_inject_schema",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "ONE-CLICK: add store-wide Organization + WebSite JSON-LD structured data to the LIVE theme, so Google shows rich results and AI answer engines (ChatGPT/Perplexity/Google AI) can identify the brand. Built from the store's real shop info (name, domain, logo) - zero AI cost. Other apps charge for this; here it's free.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_inject_schemaArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_articles",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List articles in a Shopify blog (id, title, published).",
   "input_schema": {
    "properties": {
     "blog_id": {
      "title": "Blog Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "blog_id"
    ],
    "title": "shopify_list_articlesArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_blogs",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the Shopify store's blogs (id, title, handle). A store can have several blogs; you post articles into one of them.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_blogsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_collections",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the store's collections (manual/custom + smart/automated) with id, title, handle.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_collectionsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_discounts",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the store's discount price rules (id, title, value type, value, dates).",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_discountsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_locations",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the store's inventory locations (id, name). Needed to set stock per location.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_locationsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_metafields",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List metafields on a product/collection/order/customer (owner_id required) or the whole shop (owner_type='shop', owner_id ignored).",
   "input_schema": {
    "properties": {
     "owner_type": {
      "title": "Owner Type",
      "type": "string"
     },
     "owner_id": {
      "default": 0,
      "title": "Owner Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "owner_type"
    ],
    "title": "shopify_list_metafieldsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_pages",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the store's static pages (About, Contact, etc.) with id, title, handle.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_pagesArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_products",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List Shopify products (id, title, price, sku, inventory, status). `search` filters by title; `status` = active/draft/archived/any.",
   "input_schema": {
    "properties": {
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "status": {
      "default": "any",
      "title": "Status",
      "type": "string"
     },
     "limit": {
      "default": 20,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_productsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_redirects",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the store's URL redirects.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_redirectsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_theme_files",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the files in a Shopify theme (the Liquid sections, snippets, templates, assets and config that make up the store's design). Pass theme_id (from shopify_list_themes) or leave 0 to use the live 'main' theme. `prefix` filters by folder, e.g. 'sections/' or 'templates/'.",
   "input_schema": {
    "properties": {
     "theme_id": {
      "default": 0,
      "title": "Theme Id",
      "type": "integer"
     },
     "prefix": {
      "default": "",
      "title": "Prefix",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_theme_filesArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_themes",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the store's themes (id, name, role). role='main' is the live theme.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_themesArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_list_webhooks",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List the store's webhooks (topic + delivery address).",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_list_webhooksArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_optimize_images",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "ONE-CLICK image optimization: find oversized product images and re-compress + resize them so pages load faster (a top Core Web Vitals / SEO factor) - the headline feature other apps charge for, here free. Downloads each large image, resizes to max `max_dim`px on the long side, re-encodes as an optimized JPEG at `quality`, and replaces it on the product (alt text + position preserved). Shopify then serves it as WebP via its CDN. scan_only=True just reports what WOULD be optimized (no changes). Processes up to `limit` images per call (batched - re-run for more). Real compute cost, so it's capped.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 12,
      "title": "Limit",
      "type": "integer"
     },
     "max_dim": {
      "default": 2048,
      "title": "Max Dim",
      "type": "integer"
     },
     "quality": {
      "default": 82,
      "title": "Quality",
      "type": "integer"
     },
     "scan_only": {
      "default": false,
      "title": "Scan Only",
      "type": "boolean"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_optimize_imagesArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_read_theme_file",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Read the contents of ONE Shopify theme file (e.g. 'sections/header.liquid', 'templates/product.json', 'config/settings_data.json'). Pass theme_id or leave 0 for the live theme.",
   "input_schema": {
    "properties": {
     "key": {
      "title": "Key",
      "type": "string"
     },
     "theme_id": {
      "default": 0,
      "title": "Theme Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "key"
    ],
    "title": "shopify_read_theme_fileArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_render_aeo",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "ONE-CLICK: add an AEO renderer snippet to the live theme so the answer-engine content stored on products (quick_answer + FAQ, set via shopify_update_product_aeo) actually SHOWS on the storefront as visible text + FAQPage / speakable JSON-LD. Deterministic (no AI) - the content itself is whatever the merchant/AI wrote into the metafields. Idempotent via BEGIN/END markers. Needs Shopify theme approval; returns a clear message if not granted.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_render_aeoArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_seo_audit",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Deep SEO audit of ONE Shopify product: checks meta title/description, description length, image alt text, focus-keyword usage, and answer-readiness - with a pass/fail checklist and concrete fixes. The Shopify equivalent of seo_audit_post. Great before optimizing a product.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "focus_keyword": {
      "default": "",
      "title": "Focus Keyword",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_seo_auditArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_set_llms_txt",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "ONE-CLICK: publish an llms.txt for your store - a plain-text file that tells AI assistants what your store is and points them to your key pages (the emerging standard AI models read, like a robots.txt for LLMs). Built from your real shop info. Served at /apps or as a theme asset the merchant links; here we create it as a downloadable/paste-ready file and (if theme-approved) add a snippet. Zero AI cost.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_set_llms_txtArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_set_metafield",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Set a metafield (custom data field) on a product/customer/order/collection or the shop. owner_type = products / customers / orders / collections / shop. value_type is a Shopify metafield type (single_line_text_field, number_integer, json, etc.).",
   "input_schema": {
    "properties": {
     "owner_type": {
      "title": "Owner Type",
      "type": "string"
     },
     "owner_id": {
      "title": "Owner Id",
      "type": "integer"
     },
     "namespace": {
      "title": "Namespace",
      "type": "string"
     },
     "key": {
      "title": "Key",
      "type": "string"
     },
     "value": {
      "title": "Value",
      "type": "string"
     },
     "value_type": {
      "default": "single_line_text_field",
      "title": "Value Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "owner_type",
     "owner_id",
     "namespace",
     "key",
     "value"
    ],
    "title": "shopify_set_metafieldArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_status",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Check whether the current connected store is a Shopify store and show a quick snapshot (shop name, domain, currency, plan). Use this FIRST before other shopify_/product tools on a Shopify store.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_statusArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_technical_defects",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Scan the live storefront HTML for Shopify-NATIVE technical SEO defects that Admin-API-only apps can't see - checks other apps charge for, here FREE. All pure code, zero AI cost. Detects: (1) broken/wrong <link rel=canonical> on collection-scoped product URLs (/collections/x/products/y should canonical to the clean /products/y - a wrong one = theme bug); (2) variant URL (?variant=) canonical still self-referential; (3) duplicate or MISSING <h1> (Dawn and many themes emit 2 or 0); (4) a custom robots.txt.liquid that STRIPPED Shopify's default protective Disallow rules (opens faceted/filter URLs to mass duplicate content); (5) missing homepage title/meta. Fetches a small sample of real pages (s",
   "input_schema": {
    "properties": {
     "sample": {
      "default": 4,
      "title": "Sample",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "shopify_technical_defectsArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_update_article",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a blog article. published = 'yes'/'no'. Only non-empty fields change.",
   "input_schema": {
    "properties": {
     "blog_id": {
      "title": "Blog Id",
      "type": "integer"
     },
     "article_id": {
      "title": "Article Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "body_html": {
      "default": "",
      "title": "Body Html",
      "type": "string"
     },
     "tags": {
      "default": "",
      "title": "Tags",
      "type": "string"
     },
     "published": {
      "default": "",
      "title": "Published",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "blog_id",
     "article_id"
    ],
    "title": "shopify_update_articleArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_update_collection_seo",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Set a collection's SEO: page title, meta description, URL handle and intro copy.",
   "input_schema": {
    "properties": {
     "collection_id": {
      "title": "Collection Id",
      "type": "integer"
     },
     "meta_title": {
      "default": "",
      "title": "Meta Title",
      "type": "string"
     },
     "meta_description": {
      "default": "",
      "title": "Meta Description",
      "type": "string"
     },
     "body_html": {
      "default": "",
      "title": "Body Html",
      "type": "string"
     },
     "handle": {
      "default": "",
      "title": "Handle",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "collection_id"
    ],
    "title": "shopify_update_collection_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_update_discount",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a discount (price rule): change its `value` (e.g. '15'), ends_at (YYYY-MM-DD) or usage_limit. Only provided fields change.",
   "input_schema": {
    "properties": {
     "price_rule_id": {
      "title": "Price Rule Id",
      "type": "integer"
     },
     "value": {
      "default": "",
      "title": "Value",
      "type": "string"
     },
     "ends_at": {
      "default": "",
      "title": "Ends At",
      "type": "string"
     },
     "usage_limit": {
      "default": -1,
      "title": "Usage Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "price_rule_id"
    ],
    "title": "shopify_update_discountArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_update_page",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a static page. published = 'yes'/'no' to publish/unpublish. Only non-empty fields change.",
   "input_schema": {
    "properties": {
     "page_id": {
      "title": "Page Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "body_html": {
      "default": "",
      "title": "Body Html",
      "type": "string"
     },
     "published": {
      "default": "",
      "title": "Published",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "page_id"
    ],
    "title": "shopify_update_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_update_product",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a Shopify product. Only non-empty fields change. `price` updates the FIRST variant's price. status = active/draft/archived. tags comma-separated (replaces).",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "body_html": {
      "default": "",
      "title": "Body Html",
      "type": "string"
     },
     "status": {
      "default": "",
      "title": "Status",
      "type": "string"
     },
     "vendor": {
      "default": "",
      "title": "Vendor",
      "type": "string"
     },
     "product_type": {
      "default": "",
      "title": "Product Type",
      "type": "string"
     },
     "tags": {
      "default": "",
      "title": "Tags",
      "type": "string"
     },
     "price": {
      "default": "",
      "title": "Price",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_update_productArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_update_product_aeo",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Set a Shopify product's ANSWER-ENGINE (AEO/GEO) fields - the content that gets a product quoted and cited by ChatGPT, Perplexity, Google AI Overviews, Gemini & Claude. Shopify has no native AEO, so wptaskify stores these as product metafields under the 'wptaskify' namespace, which the wptaskify app block (or your theme) renders as visible text + JSON-LD (FAQPage / speakable). Only non-empty fields change. Fields: - quick_answer: a standalone 25-50 word direct answer about the product (the #1 GEO lever). - key_takeaways: TL;DR bullets, ONE PER LINE. - faq_json: a JSON array of {\"q\": \"...\", \"a\": \"...\"} pairs for a product FAQ (drives FAQPage schema). Example: [{\"q\":\"Is it waterproof?\",\"a\":\"Yes",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "quick_answer": {
      "default": "",
      "title": "Quick Answer",
      "type": "string"
     },
     "key_takeaways": {
      "default": "",
      "title": "Key Takeaways",
      "type": "string"
     },
     "faq_json": {
      "default": "",
      "title": "Faq Json",
      "type": "string"
     },
     "usp": {
      "default": "",
      "title": "Usp",
      "type": "string"
     },
     "best_for": {
      "default": "",
      "title": "Best For",
      "type": "string"
     },
     "specs_json": {
      "default": "",
      "title": "Specs Json",
      "type": "string"
     },
     "trust_points": {
      "default": "",
      "title": "Trust Points",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_update_product_aeoArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_update_product_seo",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Set a Shopify product's SEO fields: the search-engine title + description (stored as Shopify's global SEO metafields) and/or the URL handle. Only non-empty fields change. This is the product-page SEO control for Shopify stores.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "meta_title": {
      "default": "",
      "title": "Meta Title",
      "type": "string"
     },
     "meta_description": {
      "default": "",
      "title": "Meta Description",
      "type": "string"
     },
     "handle": {
      "default": "",
      "title": "Handle",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "shopify_update_product_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "shopify_write_theme_file",
   "category": "shopify",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create or overwrite ONE Shopify theme file (Liquid section/snippet/template/asset/config). Use this to change the store's DESIGN or add SEO markup (JSON-LD) to a section.",
   "input_schema": {
    "properties": {
     "key": {
      "title": "Key",
      "type": "string"
     },
     "contents": {
      "title": "Contents",
      "type": "string"
     },
     "theme_id": {
      "default": 0,
      "title": "Theme Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "allow_live": {
      "default": false,
      "title": "Allow Live",
      "type": "boolean"
     }
    },
    "required": [
     "key",
     "contents"
    ],
    "title": "shopify_write_theme_fileArguments",
    "type": "object"
   }
  },
  {
   "name": "site_action_plan",
   "category": "other",
   "endpoints": [
    "/mcp"
   ],
   "description": "Audit the WHOLE site and return a PRIORITIZED action plan - the best first thing to run after connecting. It runs the existing audits (AI SEO score, thin content, missing SEO fields, orphan pages, duplicate titles, broken links) and hands back a ranked 'do these first' list with the exact tool for each fix and how many items each affects. A concrete plan beats a blank chat box.",
   "input_schema": {
    "properties": {
     "limit": {
      "default": 60,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "site_action_planArguments",
    "type": "object"
   }
  },
  {
   "name": "site_capabilities",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Detect what the current connected site/store is and what it supports, so the AI knows which tools to use. Returns the platform (wordpress / shopify), whether WooCommerce is active (for WordPress), the SEO backend, and a short capability summary. Use this at the start when you're unsure whether a site is WordPress, a WooCommerce store, or Shopify.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "site_capabilitiesArguments",
    "type": "object"
   }
  },
  {
   "name": "site_info",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Get site overview: name, description, URL, post/page counts, and active plugins.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "site_infoArguments",
    "type": "object"
   }
  },
  {
   "name": "store_report",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Quick store performance summary: total sales, order count and top sellers for a period (week / month / year). A fast 'how is my store doing' snapshot.",
   "input_schema": {
    "properties": {
     "period": {
      "default": "week",
      "title": "Period",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "store_reportArguments",
    "type": "object"
   }
  },
  {
   "name": "studio_info",
   "category": "other",
   "endpoints": [
    "/mcp"
   ],
   "description": "Check whether wptaskify Studio (the build/file-editing companion plugin) is active, and what it can do. Use this before any CSS / file / theme / plugin build tool. Returns capabilities + allowed roots, or an install hint.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "studio_infoArguments",
    "type": "object"
   }
  },
  {
   "name": "suggest_internal_links",
   "category": "links",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Given a topic/keyword (or a draft article's subject), find the most relevant EXISTING posts to link to internally. Returns title + url + why (which topic words matched). Results are RANKED by how many topic keywords each title shares, so the most on-topic targets come first. Use this before writing/editing so you can insert internal links to these targets.",
   "input_schema": {
    "properties": {
     "topic": {
      "title": "Topic",
      "type": "string"
     },
     "exclude_post_id": {
      "default": 0,
      "title": "Exclude Post Id",
      "type": "integer"
     },
     "max_suggestions": {
      "default": 8,
      "title": "Max Suggestions",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "topic"
    ],
    "title": "suggest_internal_linksArguments",
    "type": "object"
   }
  },
  {
   "name": "trending_topics",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "FREE trending topics from Google Trends (today's rising searches) for a region - useful for timely article ideas. `region` = 2-letter country (us, in, uk...). `niche` (optional) = filter/relate results to your site's topic by also pulling autocomplete for it. Returns current trending search terms.",
   "input_schema": {
    "properties": {
     "region": {
      "default": "us",
      "title": "Region",
      "type": "string"
     },
     "niche": {
      "default": "",
      "title": "Niche",
      "type": "string"
     }
    },
    "title": "trending_topicsArguments",
    "type": "object"
   }
  },
  {
   "name": "update_analytics_settings",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set the site's analytics + search-engine verification (wptaskify plugin). These are added to the site's <head>. Only non-empty fields change. Fields: - ga4_id: Google Analytics 4 Measurement ID (G-XXXXXXX). The tracking snippet is built automatically; logged-in admins are not tracked. - gsc_verify: Google Search Console verification token (or paste the full meta tag - the token is extracted). - bing_verify: Bing Webmaster verification token. - head_code: extra raw head tags (meta/script/link) for other verifications or pixels; sanitized to safe tags on save. Requires the wptaskify plugin (admin capability).",
   "input_schema": {
    "properties": {
     "ga4_id": {
      "default": "",
      "title": "Ga4 Id",
      "type": "string"
     },
     "gsc_verify": {
      "default": "",
      "title": "Gsc Verify",
      "type": "string"
     },
     "bing_verify": {
      "default": "",
      "title": "Bing Verify",
      "type": "string"
     },
     "head_code": {
      "default": "",
      "title": "Head Code",
      "type": "string"
     }
    },
    "title": "update_analytics_settingsArguments",
    "type": "object"
   }
  },
  {
   "name": "update_author_seo",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set the SEO meta title and/or description for an AUTHOR archive page. Only non-empty fields change. Requires the wptaskify plugin.",
   "input_schema": {
    "properties": {
     "user_id": {
      "title": "User Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "user_id"
    ],
    "title": "update_author_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "update_comment",
   "category": "users",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Edit the CONTENT of an existing comment (fix a typo, redact something). To change a comment's status (approve/spam/trash) use moderate_comment instead.",
   "input_schema": {
    "properties": {
     "comment_id": {
      "title": "Comment Id",
      "type": "integer"
     },
     "content": {
      "title": "Content",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "comment_id",
     "content"
    ],
    "title": "update_commentArguments",
    "type": "object"
   }
  },
  {
   "name": "update_coupon",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a WooCommerce coupon: change its code, discount_type (percent/fixed_cart/ fixed_product), amount, expiry (YYYY-MM-DD), usage_limit, min_amount, or free_shipping ('yes'/'no'). Only provided fields change.",
   "input_schema": {
    "properties": {
     "coupon_id": {
      "title": "Coupon Id",
      "type": "integer"
     },
     "code": {
      "default": "",
      "title": "Code",
      "type": "string"
     },
     "discount_type": {
      "default": "",
      "title": "Discount Type",
      "type": "string"
     },
     "amount": {
      "default": "",
      "title": "Amount",
      "type": "string"
     },
     "expiry": {
      "default": "",
      "title": "Expiry",
      "type": "string"
     },
     "usage_limit": {
      "default": -1,
      "title": "Usage Limit",
      "type": "integer"
     },
     "min_amount": {
      "default": "",
      "title": "Min Amount",
      "type": "string"
     },
     "free_shipping": {
      "default": "",
      "title": "Free Shipping",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "coupon_id"
    ],
    "title": "update_couponArguments",
    "type": "object"
   }
  },
  {
   "name": "update_cpt_item",
   "category": "content",
   "endpoints": [
    "/mcp"
   ],
   "description": "Edit an item of ANY custom post type. Only non-empty fields change. `terms` = 'taxonomy:id[,id]' to (re)assign custom-taxonomy terms (find IDs with list_taxonomies). Pass status='publish' to make a draft live. `slug` changes the URL and 301-redirects the old one automatically (needs the Redirection plugin). `author_id` sets the author (use list_authors for the id) - this is how you set the author on a custom post type, since set_post_author only works on normal posts.",
   "input_schema": {
    "properties": {
     "post_type": {
      "title": "Post Type",
      "type": "string"
     },
     "item_id": {
      "title": "Item Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "content": {
      "default": "",
      "title": "Content",
      "type": "string"
     },
     "status": {
      "default": "",
      "title": "Status",
      "type": "string"
     },
     "excerpt": {
      "default": "",
      "title": "Excerpt",
      "type": "string"
     },
     "terms": {
      "default": "",
      "title": "Terms",
      "type": "string"
     },
     "featured_media_id": {
      "default": 0,
      "title": "Featured Media Id",
      "type": "integer"
     },
     "slug": {
      "default": "",
      "title": "Slug",
      "type": "string"
     },
     "author_id": {
      "default": 0,
      "title": "Author Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_type",
     "item_id"
    ],
    "title": "update_cpt_itemArguments",
    "type": "object"
   }
  },
  {
   "name": "update_discussion_settings",
   "category": "other",
   "endpoints": [
    "/mcp"
   ],
   "description": "WordPress Discussion settings. Each yes/no toggle: allow_comments (new posts default), require_name_email, require_registration (only logged-in can comment), hold_for_moderation (queue every comment). close_after_days = auto-close comments on posts older than N days (0 = never). Requires wptaskify Studio. Only provided fields change.",
   "input_schema": {
    "properties": {
     "allow_comments": {
      "default": "",
      "title": "Allow Comments",
      "type": "string"
     },
     "require_name_email": {
      "default": "",
      "title": "Require Name Email",
      "type": "string"
     },
     "require_registration": {
      "default": "",
      "title": "Require Registration",
      "type": "string"
     },
     "hold_for_moderation": {
      "default": "",
      "title": "Hold For Moderation",
      "type": "string"
     },
     "close_after_days": {
      "default": -1,
      "title": "Close After Days",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "update_discussion_settingsArguments",
    "type": "object"
   }
  },
  {
   "name": "update_media",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Edit a media item's metadata: title, caption, description, or alt text. Only non-empty fields change. (To just set alt text on many images use fix_missing_alt_text.)",
   "input_schema": {
    "properties": {
     "media_id": {
      "title": "Media Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "caption": {
      "default": "",
      "title": "Caption",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "alt_text": {
      "default": "",
      "title": "Alt Text",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "media_id"
    ],
    "title": "update_mediaArguments",
    "type": "object"
   }
  },
  {
   "name": "update_menu_item",
   "category": "tax",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Edit an existing menu item: rename, change its URL, re-nest under a parent, or reorder (menu_order). Only non-empty/>=0 fields change. Use to reorder or restructure a menu without deleting + re-adding items.",
   "input_schema": {
    "properties": {
     "item_id": {
      "title": "Item Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "url": {
      "default": "",
      "title": "Url",
      "type": "string"
     },
     "parent_id": {
      "default": -1,
      "title": "Parent Id",
      "type": "integer"
     },
     "menu_order": {
      "default": -1,
      "title": "Menu Order",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "item_id"
    ],
    "title": "update_menu_itemArguments",
    "type": "object"
   }
  },
  {
   "name": "update_order_status",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Change a WooCommerce order's status: pending, processing, on-hold, completed, cancelled, refunded, or failed. Optional `note` is added to the order as a private note.",
   "input_schema": {
    "properties": {
     "order_id": {
      "title": "Order Id",
      "type": "integer"
     },
     "status": {
      "title": "Status",
      "type": "string"
     },
     "note": {
      "default": "",
      "title": "Note",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "order_id",
     "status"
    ],
    "title": "update_order_statusArguments",
    "type": "object"
   }
  },
  {
   "name": "update_page",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Edit a page by ID. Only non-empty fields change. content replaces whole body (HTML). `slug` changes the page's URL - the OLD url is automatically 301-redirected to the new one (needs the Redirection plugin) so rankings and links are preserved.",
   "input_schema": {
    "properties": {
     "page_id": {
      "title": "Page Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "content": {
      "default": "",
      "title": "Content",
      "type": "string"
     },
     "status": {
      "default": "",
      "title": "Status",
      "type": "string"
     },
     "slug": {
      "default": "",
      "title": "Slug",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "page_id"
    ],
    "title": "update_pageArguments",
    "type": "object"
   }
  },
  {
   "name": "update_permalinks",
   "category": "links",
   "endpoints": [
    "/mcp"
   ],
   "description": "Set the permalink structure (e.g. '/%postname%/', '/%year%/%monthnum%/%postname%/'). Then flushes rewrite rules. Changing this can affect existing URLs - warn the user. Requires wptaskify Studio (uses option write + flush).",
   "input_schema": {
    "properties": {
     "structure": {
      "title": "Structure",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "structure"
    ],
    "title": "update_permalinksArguments",
    "type": "object"
   }
  },
  {
   "name": "update_post",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Edit a post by ID - only non-empty fields change, content REPLACES the whole HTML body, category_ids/tag_ids are COMMA-SEPARATED ID STRINGS like '3,7' (never arrays), status='publish' makes a draft live; use update_post_body_keep_schema instead if the post has JSON-LD schema you must preserve. `slug` changes the post's URL - the OLD url is automatically 301-redirected to the new one (needs the Redirection plugin) so rankings and links are preserved.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "content": {
      "default": "",
      "title": "Content",
      "type": "string"
     },
     "status": {
      "default": "",
      "title": "Status",
      "type": "string"
     },
     "excerpt": {
      "default": "",
      "title": "Excerpt",
      "type": "string"
     },
     "category_ids": {
      "default": "",
      "title": "Category Ids",
      "type": "string"
     },
     "tag_ids": {
      "default": "",
      "title": "Tag Ids",
      "type": "string"
     },
     "featured_media_id": {
      "default": 0,
      "title": "Featured Media Id",
      "type": "integer"
     },
     "slug": {
      "default": "",
      "title": "Slug",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "update_postArguments",
    "type": "object"
   }
  },
  {
   "name": "update_post_aeo",
   "category": "geo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set a post's ANSWER-ENGINE (AEO/GEO) fields - the stuff that gets a page quoted and cited by ChatGPT, Perplexity, Google AI Overviews, Gemini & Claude. WordPress and most SEO plugins have none of this. Only non-empty fields change. Requires the wptaskify plugin. Fields: - quick_answer: a standalone 25-50 word direct answer (rendered at the top of the post + marked speakable). This is the #1 GEO lever. - key_takeaways: TL;DR bullets, ONE PER LINE (rendered as a list + schema abstract) - reviewed_by: E-E-A-T reviewer name (adds reviewedBy to Article schema) - last_reviewed: intentional review date YYYY-MM-DD (separate from auto-modified) - speakable: '1' to mark the title + quick answer as voi",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "quick_answer": {
      "default": "",
      "title": "Quick Answer",
      "type": "string"
     },
     "key_takeaways": {
      "default": "",
      "title": "Key Takeaways",
      "type": "string"
     },
     "reviewed_by": {
      "default": "",
      "title": "Reviewed By",
      "type": "string"
     },
     "last_reviewed": {
      "default": "",
      "title": "Last Reviewed",
      "type": "string"
     },
     "speakable": {
      "default": "",
      "title": "Speakable",
      "type": "string"
     },
     "in_language": {
      "default": "",
      "title": "In Language",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "update_post_aeoArguments",
    "type": "object"
   }
  },
  {
   "name": "update_post_body_keep_schema",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Replace the article body but PRESERVE the existing JSON-LD schema block. Pass `new_content` as the new article HTML WITHOUT schema; the post's current schema <script> is automatically re-appended so structured data is not lost. Use this for normal content edits on this site. For a CUSTOM post type (e.g. 'service'), pass post_type.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "new_content": {
      "title": "New Content",
      "type": "string"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "new_content"
    ],
    "title": "update_post_body_keep_schemaArguments",
    "type": "object"
   }
  },
  {
   "name": "update_post_schema",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Replace ONLY the JSON-LD schema block in a post, leaving the article body untouched. `new_schema_script` must be a full <script type=\"application/ld+json\"> ... </script> tag. If the post has no schema yet, it is appended at the end. For a CUSTOM post type (e.g. 'service'), pass post_type.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "new_schema_script": {
      "title": "New Schema Script",
      "type": "string"
     },
     "post_type": {
      "default": "",
      "title": "Post Type",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id",
     "new_schema_script"
    ],
    "title": "update_post_schemaArguments",
    "type": "object"
   }
  },
  {
   "name": "update_post_seo",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Set a post's SEO meta_title, meta_description and focus_keyword (keywords = a COMMA-SEPARATED string of secondary keywords, not an array); only non-empty values are written. Works on ANY site - auto-detects wptaskify, Yoast, Rank Math, or the wg-seo bridge, and writes to the right fields so the rendered <title>, meta description, Open Graph & Twitter tags update.",
   "input_schema": {
    "properties": {
     "post_id": {
      "title": "Post Id",
      "type": "integer"
     },
     "meta_title": {
      "default": "",
      "title": "Meta Title",
      "type": "string"
     },
     "meta_description": {
      "default": "",
      "title": "Meta Description",
      "type": "string"
     },
     "focus_keyword": {
      "default": "",
      "title": "Focus Keyword",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "post_id"
    ],
    "title": "update_post_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "update_product",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a WooCommerce product. Only non-empty fields change (nothing you leave blank is touched). Prices are strings ('19.99'). Pass status='publish' to make a draft live. Same rich fields as create_product: * category_ids / tags (comma ids or names), stock_status (instock|outofstock|onbackorder) * weight, length/width/height, shipping_class, tax_status, tax_class * virtual / featured / reviews_allowed = \"true\" or \"false\" (blank = leave unchanged) * downloadable = \"true\" or a JSON list of {\"name\",\"file\"} * cross_sell_ids / upsell_ids (comma ids), purchase_note, menu_order * attributes = JSON list (see create_product), meta_data = JSON object/list to write ANY custom field / ACF / plugin meta. T",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "regular_price": {
      "default": "",
      "title": "Regular Price",
      "type": "string"
     },
     "sale_price": {
      "default": "",
      "title": "Sale Price",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "short_description": {
      "default": "",
      "title": "Short Description",
      "type": "string"
     },
     "sku": {
      "default": "",
      "title": "Sku",
      "type": "string"
     },
     "status": {
      "default": "",
      "title": "Status",
      "type": "string"
     },
     "category_ids": {
      "default": "",
      "title": "Category Ids",
      "type": "string"
     },
     "stock_status": {
      "default": "",
      "title": "Stock Status",
      "type": "string"
     },
     "tags": {
      "default": "",
      "title": "Tags",
      "type": "string"
     },
     "weight": {
      "default": "",
      "title": "Weight",
      "type": "string"
     },
     "length": {
      "default": "",
      "title": "Length",
      "type": "string"
     },
     "width": {
      "default": "",
      "title": "Width",
      "type": "string"
     },
     "height": {
      "default": "",
      "title": "Height",
      "type": "string"
     },
     "virtual": {
      "default": "",
      "title": "Virtual",
      "type": "string"
     },
     "downloadable": {
      "default": "",
      "title": "Downloadable",
      "type": "string"
     },
     "shipping_class": {
      "default": "",
      "title": "Shipping Class",
      "type": "string"
     },
     "tax_status": {
      "default": "",
      "title": "Tax Status",
      "type": "string"
     },
     "tax_class": {
      "default": "",
      "title": "Tax Class",
      "type": "string"
     },
     "cross_sell_ids": {
      "default": "",
      "title": "Cross Sell Ids",
      "type": "string"
     },
     "upsell_ids": {
      "default": "",
      "title": "Upsell Ids",
      "type": "string"
     },
     "purchase_note": {
      "default": "",
      "title": "Purchase Note",
      "type": "string"
     },
     "menu_order": {
      "default": -1,
      "title": "Menu Order",
      "type": "integer"
     },
     "reviews_allowed": {
      "default": "",
      "title": "Reviews Allowed",
      "type": "string"
     },
     "featured": {
      "default": "",
      "title": "Featured",
      "type": "string"
     },
     "attributes": {
      "default": "",
      "title": "Attributes",
      "type": "string"
     },
     "meta_data": {
      "default": "",
      "title": "Meta Data",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "update_productArguments",
    "type": "object"
   }
  },
  {
   "name": "update_product_category",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a WooCommerce product category: rename, re-describe, re-parent or re-slug. Only non-empty fields change. parent_id=-1 leaves the parent unchanged.",
   "input_schema": {
    "properties": {
     "category_id": {
      "title": "Category Id",
      "type": "integer"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "parent_id": {
      "default": -1,
      "title": "Parent Id",
      "type": "integer"
     },
     "slug": {
      "default": "",
      "title": "Slug",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "category_id"
    ],
    "title": "update_product_categoryArguments",
    "type": "object"
   }
  },
  {
   "name": "update_product_stock",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Quick inventory edit for a product. stock_quantity sets a managed count; stock_status = instock / outofstock / onbackorder (for products without a count).",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "stock_quantity": {
      "default": -1,
      "title": "Stock Quantity",
      "type": "integer"
     },
     "stock_status": {
      "default": "",
      "title": "Stock Status",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "update_product_stockArguments",
    "type": "object"
   }
  },
  {
   "name": "update_reading_settings",
   "category": "other",
   "endpoints": [
    "/mcp"
   ],
   "description": "WordPress Reading settings. front_page='posts' (blog) or 'page' (a static page). When 'page', set front_page_id (the homepage page) and posts_page_id (the blog page). posts_per_page = how many posts per page. search_engine_visible='yes'/'no' toggles 'Discourage search engines' (blog_public). Only provided fields change.",
   "input_schema": {
    "properties": {
     "front_page": {
      "default": "",
      "title": "Front Page",
      "type": "string"
     },
     "front_page_id": {
      "default": 0,
      "title": "Front Page Id",
      "type": "integer"
     },
     "posts_page_id": {
      "default": 0,
      "title": "Posts Page Id",
      "type": "integer"
     },
     "posts_per_page": {
      "default": 0,
      "title": "Posts Per Page",
      "type": "integer"
     },
     "search_engine_visible": {
      "default": "",
      "title": "Search Engine Visible",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "update_reading_settingsArguments",
    "type": "object"
   }
  },
  {
   "name": "update_seo_settings",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Update SITE-WIDE SEO settings (wptaskify plugin). Only non-empty fields are changed (partial update). Fields: - entity_type: 'Organization' or 'Person' (who publishes this site) - entity_name: brand/person name (blank = use site title) - same_as: social profile URLs, one per line (Facebook, X, LinkedIn, etc.) - knows_about: topics this site is an authority on, one per line - home_title / home_desc: homepage SEO title & meta description - logo_id / default_og_id: media library attachment IDs (upload first) This powers the site's Organization/Person schema + default OG image. Requires the wptaskify plugin (admin capability).",
   "input_schema": {
    "properties": {
     "entity_type": {
      "default": "",
      "title": "Entity Type",
      "type": "string"
     },
     "entity_name": {
      "default": "",
      "title": "Entity Name",
      "type": "string"
     },
     "same_as": {
      "default": "",
      "title": "Same As",
      "type": "string"
     },
     "knows_about": {
      "default": "",
      "title": "Knows About",
      "type": "string"
     },
     "home_title": {
      "default": "",
      "title": "Home Title",
      "type": "string"
     },
     "home_desc": {
      "default": "",
      "title": "Home Desc",
      "type": "string"
     },
     "logo_id": {
      "default": 0,
      "title": "Logo Id",
      "type": "integer"
     },
     "default_og_id": {
      "default": 0,
      "title": "Default Og Id",
      "type": "integer"
     }
    },
    "title": "update_seo_settingsArguments",
    "type": "object"
   }
  },
  {
   "name": "update_settings",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Update site settings. Only non-empty fields change. tagline = site description.",
   "input_schema": {
    "properties": {
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "tagline": {
      "default": "",
      "title": "Tagline",
      "type": "string"
     },
     "timezone": {
      "default": "",
      "title": "Timezone",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "update_settingsArguments",
    "type": "object"
   }
  },
  {
   "name": "update_term",
   "category": "tax",
   "endpoints": [
    "/mcp"
   ],
   "description": "Rename / re-describe / re-slug / re-parent a taxonomy term. `taxonomy` is the REST base: 'categories', 'tags', or a custom taxonomy's rest_base (find via list_taxonomies). Only non-empty fields change. parent_id=-1 leaves parent unchanged (categories only).",
   "input_schema": {
    "properties": {
     "taxonomy": {
      "title": "Taxonomy",
      "type": "string"
     },
     "term_id": {
      "title": "Term Id",
      "type": "integer"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "slug": {
      "default": "",
      "title": "Slug",
      "type": "string"
     },
     "parent_id": {
      "default": -1,
      "title": "Parent Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "taxonomy",
     "term_id"
    ],
    "title": "update_termArguments",
    "type": "object"
   }
  },
  {
   "name": "update_term_seo",
   "category": "seo",
   "endpoints": [
    "/mcp"
   ],
   "description": "Set the SEO meta title and/or description for a TERM archive (category, tag, custom taxonomy term). Only non-empty fields change. Improves how the archive page ranks and appears in search. Requires the wptaskify plugin.",
   "input_schema": {
    "properties": {
     "term_id": {
      "title": "Term Id",
      "type": "integer"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "term_id"
    ],
    "title": "update_term_seoArguments",
    "type": "object"
   }
  },
  {
   "name": "update_user",
   "category": "users",
   "endpoints": [
    "/mcp"
   ],
   "description": "Edit a user's profile: display name, email, first/last name, bio (description), website url, or password. Only non-empty fields change. Use get_user first to see current values.",
   "input_schema": {
    "properties": {
     "user_id": {
      "title": "User Id",
      "type": "integer"
     },
     "email": {
      "default": "",
      "title": "Email",
      "type": "string"
     },
     "first_name": {
      "default": "",
      "title": "First Name",
      "type": "string"
     },
     "last_name": {
      "default": "",
      "title": "Last Name",
      "type": "string"
     },
     "name": {
      "default": "",
      "title": "Name",
      "type": "string"
     },
     "description": {
      "default": "",
      "title": "Description",
      "type": "string"
     },
     "url": {
      "default": "",
      "title": "Url",
      "type": "string"
     },
     "password": {
      "default": "",
      "title": "Password",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "user_id"
    ],
    "title": "update_userArguments",
    "type": "object"
   }
  },
  {
   "name": "update_wp_option",
   "category": "other",
   "endpoints": [
    "/mcp"
   ],
   "description": "Write ANY WordPress option/setting by key. A few lock-out-risk options (siteurl, home, admin_email) are protected. Some changes affect the whole site - for risky ones, warn the user first. Requires wptaskify Studio.",
   "input_schema": {
    "properties": {
     "key": {
      "title": "Key",
      "type": "string"
     },
     "value": {
      "title": "Value",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     },
     "is_json": {
      "default": false,
      "title": "Is Json",
      "type": "boolean"
     }
    },
    "required": [
     "key",
     "value"
    ],
    "title": "update_wp_optionArguments",
    "type": "object"
   }
  },
  {
   "name": "upload_media_from_url",
   "category": "images",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Download an image from a public URL and upload it to the WP media library. Returns the new media id (use it as featured_media_id when creating/updating a post).",
   "input_schema": {
    "properties": {
     "image_url": {
      "title": "Image Url",
      "type": "string"
     },
     "filename": {
      "default": "",
      "title": "Filename",
      "type": "string"
     },
     "alt_text": {
      "default": "",
      "title": "Alt Text",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "image_url"
    ],
    "title": "upload_media_from_urlArguments",
    "type": "object"
   }
  },
  {
   "name": "use_site",
   "category": "other",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Switch which connected site or store (WordPress or Shopify) the tools act on. `site` can be the site's URL (e.g. 'https://completewaterguide.com' or just 'completewaterguide'), or its id. All following tool calls in this conversation act on that site until you switch again. Use list_my_sites first to see your options. Essential when you have connected more than one site.",
   "input_schema": {
    "properties": {
     "site": {
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "site"
    ],
    "title": "use_siteArguments",
    "type": "object"
   }
  },
  {
   "name": "validate_schema",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Validate the JSON-LD structured data (schema) in a post - or scan many posts if post_id=0. Checks each <script type=\"application/ld+json\"> block parses as valid JSON and has @context and @type. Reports posts with missing or broken schema. Good for rich-results health.",
   "input_schema": {
    "properties": {
     "post_id": {
      "default": 0,
      "title": "Post Id",
      "type": "integer"
     },
     "limit": {
      "default": 100,
      "title": "Limit",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "validate_schemaArguments",
    "type": "object"
   }
  },
  {
   "name": "verify_live_meta",
   "category": "seo",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Fetch the LIVE rendered page (cache-bypassed) and extract the ACTUAL meta tags Google sees: title, meta description, canonical, OG title/desc, Twitter, and which plugin/theme emitted them (looks for the <!-- cwg-seo --> marker). Use this to confirm an SEO edit really rendered. Pass post_id OR a full url.",
   "input_schema": {
    "properties": {
     "post_id": {
      "default": 0,
      "title": "Post Id",
      "type": "integer"
     },
     "url": {
      "default": "",
      "title": "Url",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "verify_live_metaArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_create_product_tag",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a WooCommerce product tag. Returns its id.",
   "input_schema": {
    "properties": {
     "name": {
      "title": "Name",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "name"
    ],
    "title": "wc_create_product_tagArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_create_variation",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Create a variation of a variable product. attributes_json maps each attribute to a value, e.g. '[{\"name\":\"Size\",\"option\":\"M\"},{\"name\":\"Color\",\"option\":\"Red\"}]'. regular_price is a string. Set the product's attributes first with wc_set_product_attributes.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "attributes_json": {
      "title": "Attributes Json",
      "type": "string"
     },
     "regular_price": {
      "default": "",
      "title": "Regular Price",
      "type": "string"
     },
     "sku": {
      "default": "",
      "title": "Sku",
      "type": "string"
     },
     "stock_quantity": {
      "default": -1,
      "title": "Stock Quantity",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "attributes_json"
    ],
    "title": "wc_create_variationArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_get_customer",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Get a WooCommerce customer's detail incl. billing/shipping.",
   "input_schema": {
    "properties": {
     "customer_id": {
      "title": "Customer Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "customer_id"
    ],
    "title": "wc_get_customerArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_list_customers",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List WooCommerce customers (id, name, email, orders, total spent). `search` matches name/email.",
   "input_schema": {
    "properties": {
     "search": {
      "default": "",
      "title": "Search",
      "type": "string"
     },
     "per_page": {
      "default": 20,
      "title": "Per Page",
      "type": "integer"
     },
     "page": {
      "default": 1,
      "title": "Page",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "wc_list_customersArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_list_product_reviews",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List WooCommerce product reviews (reviewer, rating, status, text). Optionally filter to one product_id.",
   "input_schema": {
    "properties": {
     "product_id": {
      "default": 0,
      "title": "Product Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "wc_list_product_reviewsArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_list_product_tags",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List WooCommerce product tags (id, name, count).",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "wc_list_product_tagsArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_list_variations",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "List a variable product's variations (id, attributes, price, stock).",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id"
    ],
    "title": "wc_list_variationsArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_moderate_review",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Moderate a product review. status = approved / hold / spam / trash.",
   "input_schema": {
    "properties": {
     "review_id": {
      "title": "Review Id",
      "type": "integer"
     },
     "status": {
      "title": "Status",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "review_id",
     "status"
    ],
    "title": "wc_moderate_reviewArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_refund_order",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Issue a refund on a WooCommerce order. If `amount` is empty, refunds the full order total. `reason` is an optional note. This moves real money - use carefully.",
   "input_schema": {
    "properties": {
     "order_id": {
      "title": "Order Id",
      "type": "integer"
     },
     "amount": {
      "default": "",
      "title": "Amount",
      "type": "string"
     },
     "reason": {
      "default": "",
      "title": "Reason",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "order_id"
    ],
    "title": "wc_refund_orderArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_set_product_attributes",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Set a product's attributes (needed for variable products). attributes_json is a JSON array like '[{\"name\":\"Size\",\"options\":[\"S\",\"M\",\"L\"],\"variation\":true,\"visible\":true}]'. After this, create variations with wc_create_variation.",
   "input_schema": {
    "properties": {
     "product_id": {
      "title": "Product Id",
      "type": "integer"
     },
     "attributes_json": {
      "title": "Attributes Json",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "product_id",
     "attributes_json"
    ],
    "title": "wc_set_product_attributesArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_status",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Check whether WooCommerce is active on this site and get a quick store snapshot (currency, product count, order count). Use this FIRST before other wc_/product/order tools. Read-only.",
   "input_schema": {
    "properties": {
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "title": "wc_statusArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_update_customer",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a WooCommerce customer's email or name. Only non-empty fields change.",
   "input_schema": {
    "properties": {
     "customer_id": {
      "title": "Customer Id",
      "type": "integer"
     },
     "email": {
      "default": "",
      "title": "Email",
      "type": "string"
     },
     "first_name": {
      "default": "",
      "title": "First Name",
      "type": "string"
     },
     "last_name": {
      "default": "",
      "title": "Last Name",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "customer_id"
    ],
    "title": "wc_update_customerArguments",
    "type": "object"
   }
  },
  {
   "name": "wc_update_order",
   "category": "woo",
   "endpoints": [
    "/mcp/store"
   ],
   "description": "Edit a WooCommerce order beyond status: customer_note, or billing/shipping address (JSON objects like '{\"first_name\":\"Jo\",\"address_1\":\"1 St\",\"city\":\"NYC\"}'). Only provided fields change.",
   "input_schema": {
    "properties": {
     "order_id": {
      "title": "Order Id",
      "type": "integer"
     },
     "customer_note": {
      "default": "",
      "title": "Customer Note",
      "type": "string"
     },
     "billing_json": {
      "default": "",
      "title": "Billing Json",
      "type": "string"
     },
     "shipping_json": {
      "default": "",
      "title": "Shipping Json",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "order_id"
    ],
    "title": "wc_update_orderArguments",
    "type": "object"
   }
  },
  {
   "name": "write_article_html",
   "category": "content",
   "endpoints": [
    "/mcp",
    "/mcp/store"
   ],
   "description": "Generate a HIGH-QUALITY, full-length article BODY in clean HTML using the premium writing model (Gemini 3.1 Pro), so the expensive model is used ONLY for the final writing while your cheaper model does all the research/planning. Use this to WRITE the article once you have the plan: pass a detailed `brief` (topic, angle, the exact section outline / headings to cover, any facts or reference-structure notes from read_reference_page), the `target_words` to hit, `section_count` (e.g. 28 to match a reference), optional `tone` and comma-separated `keywords`. Returns publish-ready HTML (h2/h3, paragraphs, lists) - NO title tag, NO surrounding html/body. Then pass the returned HTML to create_post / p",
   "input_schema": {
    "properties": {
     "title": {
      "title": "Title",
      "type": "string"
     },
     "brief": {
      "title": "Brief",
      "type": "string"
     },
     "target_words": {
      "default": 1500,
      "title": "Target Words",
      "type": "integer"
     },
     "section_count": {
      "default": 0,
      "title": "Section Count",
      "type": "integer"
     },
     "tone": {
      "default": "",
      "title": "Tone",
      "type": "string"
     },
     "keywords": {
      "default": "",
      "title": "Keywords",
      "type": "string"
     }
    },
    "required": [
     "title",
     "brief"
    ],
    "title": "write_article_htmlArguments",
    "type": "object"
   }
  },
  {
   "name": "write_theme_plugin_file",
   "category": "themes",
   "endpoints": [
    "/mcp"
   ],
   "description": "WRITE / EDIT / SAVE / UPDATE a theme or plugin file - create or overwrite. Use this to edit theme PHP files (functions.php, front-page.php, index.php, header.php, page templates), style.css, or any theme/plugin/uploads file. `path` starts with 'themes/', 'plugins/' or 'uploads/' (e.g. 'themes/mytheme/front-page.php'). This is the theme/ plugin FILE WRITE tool. The Studio plugin AUTOMATICALLY backs up any existing file and, for .php files, PHP-lints `contents` first - if the PHP is invalid the write is REFUSED (so a bad edit can't take the site down).",
   "input_schema": {
    "properties": {
     "path": {
      "title": "Path",
      "type": "string"
     },
     "contents": {
      "title": "Contents",
      "type": "string"
     },
     "site": {
      "default": "",
      "title": "Site",
      "type": "string"
     }
    },
    "required": [
     "path",
     "contents"
    ],
    "title": "write_theme_plugin_fileArguments",
    "type": "object"
   }
  }
 ]
}