An MCP server for managing WooCommerce products, categories, tags, and retrieving sales reports and customer/order statistics
WooCommerce MCP server has 16 tools with basic descriptions and parameter schemas, but significant quality gaps limit production readiness. All tools have descriptions (10-200 chars, within baseline range), and most parameters have type definitions. However, schemas lack depth: object parameters have minimal constraints, no enums for constrained inputs, no output schemas documented, and error handling is absent. Tool names follow verb_noun convention (get_, create_, delete_, update_) which is good. Critical issues: (1) object parameters like 'product' and 'tag' lack field-level documentation, LLMs cannot infer what fields are required or valid; (2) no pagination support despite tools returning lists (get_products, get_product_by_category); (3) no error recovery guidance; (4) responses are raw JSON strings, not structured objects; (5) destructive operations (delete_product, delete_product_tags) have no confirmation or dry-run pattern. Average per-tool score: 42/100.
Create a new product category in WooCommerce. Args: name (str): The name of the category. description (str, optional): The category description. parent (int, optional): The parent category ID. Returns: str: The JSON response from WooCommerce.
Create a new product in WooCommerce. Args: product (dict): A dictionary containing the product fields to create. Example: { "name": "Probiotika", "type": "simple", "price": "99.00", "categories": [{"id": 54}], ... } Returns: str: The JSON response from WooCommerce, representing the created product. Example response: { "id": 77, "name": "Probiotika", ... }
Delete a product from WooCommerce by its ID. Args: product_id (int): The unique identifier of the product to delete. Returns: str: The JSON response from WooCommerce, representing the deleted product or deletion status. Example response: { "id": 77, "deleted": true, ... }
Delete a tag for a product by its ID in WooCommerce. Args: tag_id (int): The unique identifier of the tag to delete. Returns: str: The JSON response from WooCommerce, representing the deleted tag or deletion status. Example response: { "id": 20, "deleted": true, ... }
Object parameters (product, tag) lack field-level schema documentation. LLMs cannot determine which fields are required, optional, or valid. Example: create_product accepts 'product' dict but no schema specifies required fields like 'name', 'type', or valid category structure.
No pagination support for list tools. get_products, get_product_by_category, and list_all_reports return unbounded results. Without pagination, large result sets blow context windows.
No output schemas documented. Tools return raw JSON strings (str(response.json())), not structured objects. LLMs cannot plan downstream calls or extract specific fields without parsing unstructured text.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Retrieve all products belonging to a specific category in WooCommerce. Args: category_id (int): The unique identifier of the category. Returns: str: The JSON response from WooCommerce, representing a list of products in the category. Example response: [ {"id": 77, "name": "Probiotika", ...}, {"id": 78, "name": "Zink", ...}, ... ]
Retrieve a product from WooCommerce by its ID. Args: product_id (int): The unique identifier of the product to retrieve. Returns: str: The JSON response from WooCommerce, representing the product details. Example response: { "id": 77, "name": "Probiotika", ... }
Retrieve the categories for a product by its ID from WooCommerce. Args: product_id (int): The unique identifier of the product whose categories to retrieve. Returns: str: The JSON response from WooCommerce, representing the product's categories. Example response: [ {"id": 54, "name": "Testkategori", ...}, ... ]
Retrieve the tags for a product by its ID from WooCommerce. Args: product_id (int): The unique identifier of the product whose tags to retrieve. Returns: str: The JSON response from WooCommerce, representing the product's tags. Example response: [ {"id": 20, "name": "kosttillskott", ...}, {"id": 49, "name": "probiotika", ...}, ... ]
List all products from WooCommerce with optional query parameters. Args: params (dict, optional): Optional dictionary of query parameters (e.g., {'per_page': 20, 'page': 2, 'search': 'shirt'}). Returns: str: The JSON response from WooCommerce, representing a list of products. Example response: [ {"id": 77, "name": "Probiotika", ...}, {"id": 78, "name": "Zink", ...}, ... ]
List all available reports in WooCommerce. Returns: str: The JSON response from WooCommerce, representing a list of available reports. Example response: [ {"slug": "sales", "description": "Sales reports", ...}, ... ]
Retrieve customer totals from WooCommerce. Returns: str: The JSON response from WooCommerce, representing customer statistics (e.g., total customers, customers by date, etc). Example response: { "total_customers": 100, ... }
Retrieve order totals from WooCommerce. Returns: str: The JSON response from WooCommerce, representing order statistics (e.g., total orders, orders by date, etc). Example response: { "total_orders": 200, ... }
Retrieve the sales report from WooCommerce. Returns: str: The JSON response from WooCommerce, representing sales statistics. Example response: { "total_sales": "1000.00", "net_sales": "900.00", ... }
Retrieve top sellers report with optional period, date_min, and date_max filters from WooCommerce. Args: period (str, optional): Time period for the report (week, month, last_month, year). date_min (str, optional): Minimum date (YYYY-MM-DD). date_max (str, optional): Maximum date (YYYY-MM-DD). Returns: str: The JSON response from WooCommerce, representing top selling products. Example response: [ {"product_id": 77, "quantity": 10, ...}, ... ]
Update a product in WooCommerce by its ID. Args: product_id (int): The unique identifier of the product to update. product (dict): A dictionary containing the product fields to update. Example: { "name": "New Product Name", "categories": [{"id": 54}], "price": "199.00", ... } Returns: str: The JSON response from WooCommerce, representing the updated product. Example response: { "id": 77, "name": "Probiotika", "categories": [{"id": 54, "name": "Testkategori", ...}], ... }
Update a tag for a product by its ID in WooCommerce. Args: product_id (int): The unique identifier of the product. tag_id (int): The unique identifier of the tag to update. tag (dict): A dictionary containing the tag fields to update. Example: { "name": "New Tag Name", ... } Returns: str: The JSON response from WooCommerce, representing the updated tag. Example response: { "id": 20, "name": "kosttillskott", ... }
Destructive operations (delete_product, delete_product_tags) lack confirmation or dry-run pattern. Agents make mistakes, no guard prevents accidental deletion. Per pattern:confirmation-request, irreversible operations should support confirmation step.
No error handling or recovery guidance. Tools return raw API responses without categorizing errors as retryable, user-fixable, or fatal. Per pattern:recovery-guide, error responses must tell LLM what to do next (e.g., 'User not found. Try search_users() first.').