Skip to main content
Glama
opestro

woocommerce-mcp-server

by opestro
README.md
# WooCommerce MCP Server

A Model Context Protocol (MCP) server for integrating WooCommerce with Claude and other AI assistants.

## Overview

This server provides tools for AI assistants to interact with a WooCommerce store, allowing them to:

- Fetch recent orders with optional filtering
- Retrieve detailed information about specific orders by ID

The server implements the [Model Context Protocol](https://modelcontextprotocol.io/) specification, making it compatible with MCP-enabled AI assistants like Claude for Desktop.

## Prerequisites

- Node.js v18 or higher
- A WooCommerce store with REST API access
- WooCommerce API credentials (consumer key and secret)

## Installation

1. Clone this repository:

```bash
git clone https://github.com/techspawn/woocommerce-mcp-server.git
cd woocommerce-mcp-server
```

2. Install dependencies:

```bash
npm install
```

## Configuration

You need to configure your WooCommerce API credentials. You can do this by:

1. Setting environment variables when running the server:

```bash
WOOCOMMERCE_URL=https://your-store.com \
WOOCOMMERCE_CONSUMER_KEY=your-consumer-key \
WOOCOMMERCE_CONSUMER_SECRET=your-consumer-secret \
node index.js
```

2. Or by editing the default values in the `index.js` file:

```javascript
const woocommerceConfig = {
  url: process.env.WOOCOMMERCE_URL || 'https://your-store.com',
  consumerKey: process.env.WOOCOMMERCE_CONSUMER_KEY || 'your-consumer-key',
  consumerSecret: process.env.WOOCOMMERCE_CONSUMER_SECRET || 'your-consumer-secret',
  version: 'wc/v3'
};
```

## Running the Server

To run the server directly:

```bash
node index.js
```

Or using the npm script:

```bash
npm start
```

## Integration with Claude for Desktop

To connect this server to Claude for Desktop:

1. Make sure you have [Claude for Desktop](https://claude.ai/desktop) installed
2. Open your Claude Desktop configuration file located at:
   - Windows: `%USERPROFILE%\AppData\Roaming\Claude\claude_desktop_config.json`
   - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
   - Linux: `~/.config/Claude/claude_desktop_config.json`

3. Add your WooCommerce MCP server configuration (create the file if it doesn't exist):

```json
{
  "mcpServers": {
    "woocommerce": {
      "command": "node",
      "args": [
        "/ABSOLUTE/PATH/TO/woocommerce-mcp-server/index.js"
      ],
      "env": {
        "WOOCOMMERCE_URL": "https://your-store.com",
        "WOOCOMMERCE_CONSUMER_KEY": "your-consumer-key",
        "WOOCOMMERCE_CONSUMER_SECRET": "your-consumer-secret"
      }
    }
  }
}
```

4. Save the file and restart Claude for Desktop

## Available Tools

### `getRecentOrders`

Fetches a list of recent orders from your WooCommerce store.

Parameters:
- `status` (optional): Filter orders by status (e.g., "processing", "completed", "on-hold")
- `limit` (optional, default: 5): Number of orders to return

### `getOrderById`

Retrieves detailed information about a specific order.

Parameters:
- `id`: The order ID to retrieve

## Building Your Own MCP Server with JavaScript

This section provides a guide to creating your own MCP server using JavaScript/Node.js.

### 1. Set up a new project

```bash
mkdir my-mcp-server
cd my-mcp-server
npm init -y
```

### 2. Install dependencies

```bash
npm install @modelcontextprotocol/sdk axios zod
```

### 3. Create your server file (index.js)

Start with the basic structure:

```javascript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// Initialize server
const server = new McpServer({
  name: "My MCP Service",
  version: "1.0.0",
});

// Define and register your tools
server.tool(
  "myToolName",
  {
    // Define parameters using Zod schemas
    param1: z.string().describe("Description of param1"),
    param2: z.number().optional().describe("Optional parameter")
  },
  async ({ param1, param2 }) => {
    // Tool implementation logic here
    const result = `Processed ${param1} with value ${param2 || 'none'}`;
    
    // Return result in the expected format
    return {
      content: [
        {
          type: "text",
          text: result
        }
      ]
    };
  }
);

// Connect the server
const transport = new StdioServerTransport();
await server.connect(transport);
```

### 4. Make your package.json ES module compatible

```json
{
  "type": "module",
  "scripts": {
    "start": "node index.js"
  }
}
```

### 5. Define tools

MCP tools are defined with three components:
- Name: A unique identifier for the tool
- Parameters: Schema for input parameters (using Zod)
- Handler: Async function that processes the inputs and returns results

Example:

```javascript
server.tool(
  "calculateTotal",
  {
    items: z.array(
      z.object({
        name: z.string(),
        price: z.number(),
        quantity: z.number().int().positive()
      })
    ).describe("Array of items to calculate total for")
  },
  async ({ items }) => {
    const total = items.reduce((sum, item) => sum + (item.price * item.quantity), 0);
    
    return {
      content: [
        {
          type: "text",
          text: `Total: $${total.toFixed(2)}`
        }
      ]
    };
  }
);
```

### 6. Testing locally

You can test your MCP server locally using the stdio transport:

```bash
node index.js
```

### 7. Debugging tips

- Use `console.error()` for debugging, not `console.log()` which interferes with stdio transport
- Check the logs in Claude for Desktop for errors
- Ensure your tool handlers properly handle exceptions

## Resources

- [Model Context Protocol documentation](https://modelcontextprotocol.io/)
- [MCP JavaScript SDK](https://www.npmjs.com/package/@modelcontextprotocol/sdk)
- [WooCommerce REST API documentation](https://woocommerce.github.io/woocommerce-rest-api-docs/)

## License

MIT 

TDQS

D1.7/5.0

Scored across 2 tools

Disambiguation5/5

The two tools are clearly distinct: one retrieves recent orders, the other retrieves a single order by ID. There is no overlap in their purposes.

Naming Consistency5/5

Both tools follow a consistent camelCase verb_noun pattern (getRecentOrders, getOrderById), making naming predictable.

Tool Count2/5

With only 2 tools for a WooCommerce server, the tool surface is far too thin for the typical scope of e-commerce operations.

Completeness1/5

The server only provides order retrieval, missing critical CRUD operations for orders, products, customers, and other WooCommerce entities.

Maintenance

ActivityInactive
ResponsivenessNo issues