UnoPim MCP Server

UnoPim MCP Server

Enables Claude to manage the UnoPim Product Information Management system through natural language, supporting product creation, attribute management, and media uploads. It features full API integration, including support for configurable products and automatic OAuth2 token management.

Category
Visit Server

README

UnoPim MCP Server πŸš€

A powerful Model Context Protocol (MCP) server that enables Claude Desktop to manage your UnoPim Product Information Management system. Create products, manage attributes, upload media, and handle complex configurable products - all through natural language conversations with Claude.

✨ Features

  • πŸ”Œ Full UnoPim API Integration - Create and manage attributes, families, categories, and products
  • πŸ‘• Configurable Products - Full support for products with variants (e.g., T-shirts with color/size options)
  • πŸ“Έ Media Upload - Upload product images and category media via URL or base64
  • 🧠 Smart Product Creation - Automatically validates against family schema before creating
  • 🌐 HTTP/SSE Transport - Expose via ngrok for Claude Desktop remote access
  • πŸ”„ Automatic Token Refresh - OAuth2 with automatic token management

πŸš€ Quick Start

1. Install dependencies

npm install
npm run build

2. Configure environment

export UNOPIM_BASE_URL="http://your-unopim:8000"
export UNOPIM_CLIENT_ID="your_client_id"
export UNOPIM_CLIENT_SECRET="your_client_secret"
export UNOPIM_USERNAME="api-user@email.com"
export UNOPIM_PASSWORD="password"

3. Start the server

# HTTP mode (recommended for Claude Desktop)
node dist/index-http.js

4. Expose via ngrok (for remote access)

ngrok http 3000

πŸ“‹ Claude Desktop Configuration

Remote (HTTP/SSE) mode via ngrok ⭐ Recommended

{
  "mcpServers": {
    "unopim": {
      "url": "https://your-ngrok-url.ngrok-free.app/sse"
    }
  }
}

Local (stdio) mode

{
  "mcpServers": {
    "unopim": {
      "command": "node",
      "args": ["/path/to/unopim-mcp/dist/index.js"],
      "env": {
        "UNOPIM_BASE_URL": "https://your-unopim.com",
        "UNOPIM_CLIENT_ID": "your_client_id",
        "UNOPIM_CLIENT_SECRET": "your_client_secret",
        "UNOPIM_USERNAME": "api-user",
        "UNOPIM_PASSWORD": "password"
      }
    }
  }
}

πŸ› οΈ Available Tools (24 tools)

Schema & Discovery

Tool Description
unopim_get_schema Fetch complete data model
unopim_get_attributes List all attributes with types
unopim_get_families List all product families
unopim_get_family_schema Get detailed schema for a specific family

Attribute Management

Tool Description
unopim_create_attribute Create attribute (text, select, boolean, price, etc.)
unopim_create_attribute_options Create options for select attributes
unopim_get_attribute_options Get options for a select attribute
unopim_get_attribute_groups List attribute groups
unopim_create_attribute_group Create attribute group

Family Management

Tool Description
unopim_create_family Create product family
unopim_update_family Update family

Category Management

Tool Description
unopim_get_categories Fetch category tree
unopim_create_category Create category

Product Management

Tool Description
unopim_get_products List products with filtering
unopim_get_product Get single product by SKU
unopim_create_product Create simple product
unopim_update_product Update product
unopim_upsert_product Create or update product
unopim_smart_create_product ⭐ Auto-validates against family schema
unopim_bulk_create_products Batch create products

Configurable Products

Tool Description
unopim_create_configurable_product Create parent product with variants
unopim_add_variant Add variant to configurable product
unopim_update_configurable_product Update configurable product

Media Upload ⭐ Automatic Linking

Tool Description
unopim_upload_product_media ⭐ Upload image and auto-link to product
unopim_upload_category_media Upload image and auto-link to category

Note: Media upload tools now automatically update the product/category with the uploaded file path. Images are immediately visible in UnoPim UI after upload!


πŸ‘• Configurable Products Workflow

Creating a configurable product (e.g., T-shirt with color variants):

Step 1: Create the configurable product (parent)

{
  "sku": "tshirt-config-001",
  "family": "default",
  "super_attributes": ["color"],
  "values": {
    "common": { "sku": "tshirt-config-001" },
    "channel_locale_specific": {
      "default": {
        "en_US": { "name": "T-Shirt Configurable" }
      }
    },
    "categories": [],
    "associations": { "up_sells": [], "cross_sells": [], "related_products": [] }
  }
}

Step 2: Add variants (one at a time)

{
  "parent": "tshirt-config-001",
  "family": "default",
  "sku": "tshirt-red-001",
  "values": {
    "common": { "sku": "tshirt-red-001", "color": "Red" },
    "channel_locale_specific": {
      "default": {
        "en_US": { "name": "T-Shirt Red" }
      }
    },
    "categories": []
  },
  "variant_attributes": { "color": "Red" }
}

Step 3: Add product image

{
  "sku": "tshirt-red-001",
  "attribute": "image",
  "file_url": "https://example.com/tshirt-red.jpg"
}

πŸ“Έ Media Upload

Upload product images via URL or base64 - images are automatically linked to the product:

// Via URL
{
  "sku": "PROD001",
  "attribute": "image",
  "file_url": "https://example.com/product.jpg"
}

// Via Base64
{
  "sku": "PROD001",
  "attribute": "image",
  "file_base64": "iVBORw0KGgo...",
  "filename": "product-image.jpg"
}

What happens automatically:

  1. βœ… File uploads to UnoPim storage
  2. βœ… Attribute metadata fetched to determine scope (common/locale_specific/channel_specific/channel_locale_specific)
  3. βœ… Product updated with file path in correct value structure
  4. βœ… Image immediately visible in UnoPim UI

No manual product update needed - the tool handles everything!


⚠️ Important API Notes

Attribute Value Structure

UnoPim attributes have different scoping based on value_per_locale and value_per_channel:

Scope When Structure
common Both = 0 values.common.attr
locale_specific locale=1, channel=0 values.locale_specific.en_US.attr
channel_specific locale=0, channel=1 values.channel_specific.default.attr
channel_locale_specific Both = 1 values.channel_locale_specific.default.en_US.attr

Example: The name attribute typically requires channel_locale_specific:

{
  "values": {
    "common": { "sku": "PROD001" },
    "channel_locale_specific": {
      "default": {
        "en_US": { "name": "Product Name" }
      }
    }
  }
}

πŸ› Known API Quirks

Issue Workaround
Configurable endpoint typo API uses /configrable-products (missing 'u') - MCP server handles this
Attribute options array Returns flat array [...] not { data: [...] }
Variants not auto-created Must add variants separately with unopim_add_variant
Case-sensitive options Option codes like "Red" must match exactly

πŸ”§ Development

# Build
npm run build

# Watch mode
npm run watch

# Type check
npm run typecheck

# Test with MCP Inspector
npx @modelcontextprotocol/inspector dist/index.js

πŸ“Š Environment Variables

Required

Variable Description
UNOPIM_BASE_URL UnoPim API URL (e.g., http://localhost:8000)
UNOPIM_CLIENT_ID OAuth2 Client ID
UNOPIM_CLIENT_SECRET OAuth2 Client Secret
UNOPIM_USERNAME API username
UNOPIM_PASSWORD API password

Optional

Variable Default Description
UNOPIM_DEFAULT_LOCALE en_US Default locale
UNOPIM_DEFAULT_CHANNEL default Default channel
UNOPIM_DEFAULT_CURRENCY USD Default currency
PORT 3000 HTTP server port

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Claude Desktop │────▢│   ngrok      │────▢│  MCP Server β”‚
β”‚                 β”‚ SSE β”‚              β”‚     β”‚  (Node.js)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
                                                     β”‚
                                                     β”‚ OAuth2
                                                     β”‚ REST API
                                                     β–Ό
                                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                              β”‚   UnoPim    β”‚
                                              β”‚    PIM      β”‚
                                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Project Structure

src/
β”œβ”€β”€ index-http.ts      # HTTP server with SSE (for ngrok)
β”œβ”€β”€ index.ts           # stdio server (for local)
β”œβ”€β”€ config.ts          # Configuration loader
β”œβ”€β”€ auth/
β”‚   └── oauth.ts       # OAuth2 token management
β”œβ”€β”€ client/
β”‚   └── unopim-client.ts  # HTTP client with retry logic
β”œβ”€β”€ tools/
β”‚   β”œβ”€β”€ attributes.ts  # Attribute CRUD
β”‚   β”œβ”€β”€ categories.ts  # Category management
β”‚   β”œβ”€β”€ families.ts    # Family management
β”‚   β”œβ”€β”€ groups.ts      # Attribute groups
β”‚   β”œβ”€β”€ products.ts    # Product CRUD + media upload
β”‚   └── schema.ts      # Schema discovery
└── types/
    β”œβ”€β”€ errors.ts      # Error handling
    β”œβ”€β”€ oauth.ts       # OAuth types
    └── unopim.ts      # API types

πŸŽ‰ Example Conversation with Claude

You: Create a T-shirt product family with name, description, price and color attributes

Claude: I'll create the family with those attributes... (Uses unopim_create_family, unopim_create_attribute, etc.)

You: Now create a configurable T-shirt with red, blue and green variants at $29.99

Claude: I'll create the configurable product and add the color variants... (Uses unopim_create_configurable_product, unopim_add_variant)

You: Upload this image for the red variant: https://example.com/red-shirt.jpg

Claude: Uploading the image to the red variant... (Uses unopim_upload_product_media)


πŸ“„ License

ISC


πŸ™ Credits

Built with:

Made with ❀️ for seamless PIM management through AI

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured