WooCommerce MCP Server
by keysersoft
README.md
# WooCommerce MCP Server
**Connect WooCommerce to Claude, ChatGPT and Copilot: products, variations, inventory, orders, refunds, customers and reports as MCP tools.** Powered by [AnythingMCP](https://github.com/HelpCode-ai/anythingmcp).
WooCommerce MCP Server gives Claude, ChatGPT, Copilot and Cursor 49 tools for WooCommerce: products, variations, inventory, orders, refunds, customers and reports. 30 tools read and 19 can change data. It runs on AnythingMCP: one click on AnythingMCP Cloud, or self-hosted with Docker. Credentials are stored encrypted and every call is audited.
**Last verified:** 2026-09-26 against WooCommerce 11.1.2 on WordPress 7.1.2 (a local test shop) (38 of the 40 API tools called through MCP, reads and writes, no errors).
**Adapter synced:** <!-- synced -->2026-09-26
Maintained by [@keysersoft](https://github.com/keysersoft), an AnythingMCP maintainer. Built on [AnythingMCP](https://github.com/HelpCode-ai/anythingmcp) by helpcode.ai.
## Quick start (AnythingMCP Cloud)
1. Sign in at [cloud.anythingmcp.com](https://cloud.anythingmcp.com) and open the [install link](https://cloud.anythingmcp.com/connectors/store?install=woocommerce).
2. Enter `WOOCOMMERCE_URL`, `WOOCOMMERCE_CONSUMER_KEY`, `WOOCOMMERCE_CONSUMER_SECRET` (see [Authentication](#authentication)).
3. Copy the URL of your MCP server under **MCP Servers** and add it to your AI client ([below](#connect-claude-chatgpt-copilot-or-cursor)).
AnythingMCP Cloud is the same open-source code, operated by helpcode.ai in Frankfurt, Germany.
## Self-hosted (Docker)
Needs Docker 24+, openssl and Node 18+.
```bash
git clone https://github.com/keysersoft/woocommerce-mcp-server.git
cd woocommerce-mcp-server
./scripts/install.sh
```
`install.sh` writes `.env` with fresh secrets, starts AnythingMCP, creates the first admin, installs the connector if `WOOCOMMERCE_URL` and `WOOCOMMERCE_CONSUMER_KEY` and `WOOCOMMERCE_CONSUMER_SECRET` are set in `.env` and creates an MCP API key. Without credentials it prints the install link instead: `http://localhost:3000/connectors/store?install=woocommerce`. Then check the whole chain:
```bash
npm install && node scripts/smoke.mjs
```
## Connect Claude, ChatGPT, Copilot or Cursor
- **Claude (claude.ai, Desktop, mobile):** *Customize → Connectors → Add custom connector*, paste your MCP server URL and sign in. Claude connects from Anthropic's cloud, so the URL must be public HTTPS: your AnythingMCP Cloud URL, or your own instance behind TLS.
- **Claude Code:**
```bash
claude mcp add --transport http woocommerce-mcp-server http://localhost:4000/mcp --header "X-API-Key: <MCP_API_KEY>"
```
- **Cursor** (`.cursor/mcp.json`) and **VS Code / GitHub Copilot** (`.vscode/mcp.json`, key `servers` instead of `mcpServers`, plus `"type": "http"`):
```json
{ "mcpServers": { "woocommerce-mcp-server": { "url": "http://localhost:4000/mcp", "headers": { "X-API-Key": "<MCP_API_KEY>" } } } }
```
- **ChatGPT:** add the public HTTPS URL as a connector (app) in ChatGPT's settings. A `localhost` URL does not work there.
## Tools
49 tools, generated from [`adapter/woocommerce.json`](adapter/woocommerce.json). **read** tools cannot change anything in the source system.
<!-- tools:start (generated from adapter/*.json, do not edit) -->
| Tool | What it does | Access |
|---|---|---|
| `woocommerce_search_products` | Search/list products with rich filters — keyword (`search`), SKU, status, type (simple/variable/grouped/external), stock_status, on_sale, price range,… | read |
| `woocommerce_get_product` | Get a single product by id, including all fields: name, slug, description, short_description, sku, price/regular_price/sale_price, stock_quantity,… | read |
| `woocommerce_create_product` | Create a product. | write |
| `woocommerce_update_product` | Partial-update a product by id. | write |
| `woocommerce_delete_product` | Move a product to trash, or pass `force=true` to delete permanently (cannot be undone). | write |
| `woocommerce_batch_update_products` | Bulk create / update / delete products in a single call. | write |
| `woocommerce_list_product_variations` | List variations for a variable product. | read |
| `woocommerce_update_product_variation` | Update a single variation of a variable product — price, SKU, stock, attributes. | write |
| `woocommerce_list_product_categories` | List product categories. | read |
| `woocommerce_create_product_category` | Create a product category. | write |
| `woocommerce_list_product_tags` | List product tags. | read |
| `woocommerce_list_product_attributes` | List the global attribute definitions configured for the store (e.g. | read |
| `woocommerce_find_low_stock` | Find products that are out of stock OR have `manage_stock=true` with `stock_quantity` at/below `threshold`. | read |
| `woocommerce_update_stock` | Convenience wrapper over `update_product`: enables stock management and sets quantity + status in one call. | write |
| `woocommerce_list_orders` | List orders with status, date, customer, and product filters. | read |
| `woocommerce_get_order` | Get a single order by id — full payload incl. | read |
| `woocommerce_update_order_status` | Set an order's status (e.g. | write |
| `woocommerce_add_order_note` | Add a note to an order. | write |
| `woocommerce_list_refunds` | List refunds attached to an order. | read |
| `woocommerce_create_refund` | Create a refund against an order. | write |
| `woocommerce_list_customers` | List customers. | read |
| `woocommerce_get_customer` | Get a customer by id (includes billing/shipping addresses, order count, total spent, last_order info). | read |
| `woocommerce_sales_report` | Sales report for a date window or named period. | read |
| `woocommerce_top_sellers_report` | Top-selling products for a date window or named period. | read |
| `woocommerce_coupons_totals_report` | Coupon counts grouped by discount type (percent \| fixed_cart \| fixed_product). | read |
| `woocommerce_orders_totals_report` | Counts of orders grouped by status (pending, processing, completed, ...). | read |
| `woocommerce_update_customer` | Partial-update a customer by id. | write |
| `woocommerce_delete_customer` | Permanently delete a customer. | write |
| `woocommerce_create_customer` | Create a customer account. | write |
| `woocommerce_create_order` | Create an order. | write |
| `woocommerce_delete_order` | Move an order to trash, or pass `force=true` to delete permanently. | write |
| `woocommerce_list_order_notes` | List notes attached to an order (both internal admin notes and customer-visible notes). | read |
| `woocommerce_get_order_note` | Retrieve a single order note by id. | read |
| `woocommerce_delete_order_note` | Delete an order note. | write |
| `woocommerce_list_coupons` | List discount coupons in the store. | read |
| `woocommerce_create_coupon` | Create a discount coupon. | write |
| `woocommerce_get_coupon` | Get a single coupon by id, including full usage stats (`usage_count`, `used_by` array). | read |
| `woocommerce_update_coupon` | Partial-update a coupon. | write |
| `woocommerce_delete_coupon` | Move a coupon to trash, or pass `force=true` to delete permanently. | write |
| `woocommerce_list_order_status_options` | Reference card: valid order status slugs. | read |
| `woocommerce_list_product_type_options` | Reference card: valid `type` values for `woocommerce_create_product` / `woocommerce_update_product` and product type filter on search. | read |
| `woocommerce_list_stock_status_options` | Reference card: valid `stock_status` values for product create/update + list filter. | read |
| `woocommerce_list_report_period_options` | Reference card: valid `period` values for `woocommerce_sales_report` and `woocommerce_top_sellers_report`. | read |
| `woocommerce_skill_inventory_optimization` | Skill recipe: find out-of-stock and low-stock products, cross-reference with demand (top sellers), and bulk-bump stock via batch update. | read |
| `woocommerce_skill_product_seo_optimization` | Skill recipe: optimise a product's name, description, slug, and Yoast/Rank Math SEO meta. | read |
| `woocommerce_skill_upsell_cross_sell` | Skill recipe: build upsell + cross-sell relationships for a product based on category, price tier, and tags. | read |
| `woocommerce_skill_low_conversion_analysis` | Skill recipe: identify products visible in the catalogue but not selling, with an honest framing of what WooCommerce REST can and cannot measure. | read |
| `woocommerce_skill_abandoned_order_triage` | Skill recipe: process stuck orders (pending / on-hold / failed) — chase or cancel based on age and reason. | read |
| `woocommerce_skill_revenue_kpi_snapshot` | Skill recipe: build a one-page KPI snapshot — revenue, AOV, top sellers, pipeline state, coupon mix. | read |
<!-- tools:end -->
## Example prompts
- Which products are low on stock, and how many of each did we sell last month?
- Show order 1042 with its items and the customer's address.
- Which orders are still "processing" after three days?
- Put order 1042 on hold and add a note that the customer called about the delivery date. (write)
- Refund 10 EUR on order 1042 for a scratched door. (write)
- What were our sales and order totals last week?
More in [examples/prompts.md](examples/prompts.md).
## Authentication
This connector talks to the WooCommerce REST API v3 (`/wp-json/wc/v3`). Works against any WordPress + WooCommerce site. HTTPS required.
## Setup
1. **`WOOCOMMERCE_URL`** — site root (e.g. `https://shop.example.com`). Do NOT include `/wp-json`; the adapter appends `/wp-json/wc/v3`.
2. **`WOOCOMMERCE_CONSUMER_KEY`** + **`WOOCOMMERCE_CONSUMER_SECRET`** — generate in WP admin → WooCommerce → Settings → Advanced → REST API → Add key. Use **Read/Write** for full functionality.
HTTPS is mandatory: on HTTP, WC requires OAuth1 instead of Basic Auth (the connector only does Basic Auth).
## Pagination
List endpoints default to `per_page=10`, max `100`. Pass explicit `per_page` + iterate `page` for full catalog scans. Total counts are in `X-WP-Total` / `X-WP-TotalPages` headers (not returned in the JSON body).
## Bulk writes
For ≥ 3 product updates use `woocommerce_batch_update_products` (one call, up to 100 entries). Don't fan out single `update_product` calls.
## SEO meta (Yoast / Rank Math) on products
Meta lives in the `meta_data` array on the product. Set it via `woocommerce_update_product`:
```json
"meta_data": [
{ "key": "_yoast_wpseo_metadesc", "value": "..." },
{ "key": "_yoast_wpseo_focuskw", "value": "..." }
]
```
Rank Math: `rank_math_description`, `rank_math_focus_keyword`, `rank_math_title`. Full reference: `wordpress_list_seo_meta_keys` (sibling WordPress connector).
## Multi-step workflows
For inventory optimisation, product SEO, upsell/cross-sell, low-conversion analysis, abandoned-order triage, or KPI snapshots → call the dedicated **`woocommerce_skill_*`** tool. It returns the step-by-step playbook on demand. Don't preload that knowledge here.
## Enum reference cards
Valid values for order status / product type / stock status / report period / payment methods → call **`woocommerce_list_*_options`**.
## Permissions cheat-sheet
- All list / get / reports: Read-only key.
- Product create/update/delete, order update, refund, batch: Read/Write key.
- Customer create / coupon create: Read/Write key.
## Security
- **Read or write is your choice.** 30 of the tools only read; `woocommerce_create_product`, `woocommerce_update_product`, `woocommerce_delete_product`, `woocommerce_batch_update_products`, `woocommerce_update_product_variation`, `woocommerce_create_product_category`, `woocommerce_update_stock`, `woocommerce_update_order_status`, `woocommerce_add_order_note`, `woocommerce_create_refund`, `woocommerce_update_customer`, `woocommerce_delete_customer`, `woocommerce_create_customer`, `woocommerce_create_order`, `woocommerce_delete_order`, `woocommerce_delete_order_note`, `woocommerce_create_coupon`, `woocommerce_update_coupon`, `woocommerce_delete_coupon` can change data. Assign the connector to an MCP server whose role whitelists only the tools you want, and the rest are invisible to that client.
- **Credentials** are encrypted with AES-256-GCM and never shown to the model.
- **Response mapping** drops or reshapes fields per tool before they reach the model, e.g. bank details or personal data.
- **Audit log:** every call is recorded with input, output, duration and status, in your own database when self-hosted.
- **SSO, RBAC and SCIM** are included in the self-hosted build.
## FAQ
### Is there a WooCommerce MCP server?
Yes, this one. It connects the WooCommerce REST API v3 to Claude, ChatGPT and Copilot through AnythingMCP: 49 tools for products, variations, stock, orders, refunds, customers, coupons and reports, plus a few built-in playbooks.
### What do I need to connect my shop?
The shop's URL and a REST API key: WordPress admin → WooCommerce → Settings → Advanced → REST API → Add key. Choose Read for a read-only setup, Read/Write if the AI may change things. The site must use HTTPS, because WooCommerce only accepts the key over HTTPS.
### Can the AI change my shop?
Only if you let it. Many tools write (products, stock, orders, refunds, coupons, customers). Create the key with Read permission, or give the MCP server a role that whitelists only the read tools.
### Does it work with ChatGPT and Copilot?
Yes. The same MCP server works in ChatGPT (with a public HTTPS URL such as AnythingMCP Cloud), GitHub Copilot in VS Code, Cursor and Claude Code.
### My shop is on a local or staging server. Does that work?
Yes, with a self-hosted AnythingMCP that can reach it; add the host to `SSRF_ALLOWED_HOSTS`.
## Troubleshooting
| Problem | Fix |
|---|---|
| `401` / `403` from the vendor | The credentials are wrong or lack rights. Re-enter them on the connector page; the import runs a test call and shows the result. |
| Tools missing in the AI client | The connector is not assigned to the MCP server the client uses. Check **MCP Servers**, then run `node scripts/smoke.mjs`. |
| The host is on your internal network | Self-host AnythingMCP on that network and add the hostname to `SSRF_ALLOWED_HOSTS`, or the outbound guard blocks the call. |
| Works locally, fails on AnythingMCP Cloud | The system must be reachable from the internet with a valid TLS certificate. |
## Related
- [ecommerce-mcp-server](https://github.com/HelpCode-ai/ecommerce-mcp-server): E-commerce MCP server: connect Amazon, eBay, WooCommerce, Shopware, Kaufland, OTTO and 7 more to Claude & ChatGPT.
- [shopware-mcp-server](https://github.com/kochfreiburg/shopware-mcp-server): Shopware 6 MCP server: let Claude & ChatGPT search your Shopware catalog: products, categories and cross-sells (Store API).
- [magento-mcp-server](https://github.com/keysersoft/magento-mcp-server): Magento MCP server: Claude & ChatGPT manage products, stock, orders and customers in Magento 2 / Adobe Commerce.
- [AnythingMCP](https://github.com/HelpCode-ai/anythingmcp): the open-source MCP server and gateway this repository is built on.
## License
AGPL-3.0-only. The adapter definition in `adapter/` comes from AnythingMCP (AGPL-3.0).
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues