Skip to main content
Glama

gobox-mcp

MCP server wrapping the Gobox Open API (dev-api.gobox.asia/open/api/*) for AI agents, Claude Desktop, and CLI automation.

Features

  • ~40 tools covering orders, products, SKU quantities, warehouses, reports, shops, locations, consignments, Goship rates, webhooks

  • 5 SKU quantity states: available, in_warehouse, keep_pick, wait_qc, wait_incoming (+ composite sku_full_status)

  • Dual transport: stdio (Claude Desktop local) or SSE (Docker shared for bot/team)

  • Auto token refresh with in-memory cache

  • Modular: each tool group in its own file under tools/

Related MCP server: commercetools Commerce MCP

Setup

1. Credentials

Contact Gobox admin for client_id + client_secret.

2. Install

cd gobox-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Edit .env with your credentials

3. Run locally (stdio)

python gobox_mcp.py

4. Run in Docker (SSE)

docker compose up -d
# Test: curl http://localhost:8000/sse

Connect to Claude Desktop

Stdio mode (local)

Edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "gobox": {
      "command": "/absolute/path/to/gobox-mcp/.venv/bin/python",
      "args": ["/absolute/path/to/gobox-mcp/gobox_mcp.py"],
      "env": {
        "GOBOX_BASE_URL": "https://dev-api.gobox.asia",
        "GOBOX_CLIENT_ID": "xxx",
        "GOBOX_CLIENT_SECRET": "xxx"
      }
    }
  }
}

SSE mode (Docker)

{
  "mcpServers": {
    "gobox": {
      "url": "http://localhost:8000/sse"
    }
  }
}

Connect to Claude Code

claude mcp add gobox \
  /absolute/path/.venv/bin/python \
  /absolute/path/gobox_mcp.py \
  -e GOBOX_BASE_URL=https://dev-api.gobox.asia \
  -e GOBOX_CLIENT_ID=xxx \
  -e GOBOX_CLIENT_SECRET=xxx

Environment switching (dev/prod)

Set GOBOX_BASE_URL to switch:

  • Dev: https://dev-api.gobox.asia

  • Prod: https://api.gobox.asia (verify actual prod URL)

Tool catalog

Module

Tools

orders_tools

list_orders, get_order, create_order, update_order, update_order_status, cancel_order, send_order_to_goship

products_tools

list_products, get_product, list_categories, list_brands, list_attributes, sku_quantity_available, sku_quantity_in_warehouse, sku_quantity_keep_pick, sku_quantity_wait_qc, sku_quantity_wait_incoming, sku_full_status

warehouses_tools

list_warehouses, list_inventories, list_warehouse_pickings

reports_tools

report_warehouse_import, report_warehouse_import_refund, report_export_by_order, report_export_by_sku, report_inventories, report_warehouse_store, report_warehouse_stock, report_materials

shops_tools

list_shops

locations_tools

list_cities, list_districts, list_wards, list_countries, get_sys_helpers

consignments_tools

list_consignments, get_consignment, create_consignment, cancel_consignment

goship_tools

get_shipping_rates

webhooks_tools

list_webhooks, create_webhook, update_webhook, delete_webhook, toggle_webhook

Example AI queries

"List all Gobox warehouses" "Check stock for SKU ABC123" → calls sku_full_status("ABC123") "Có bao nhiêu đơn Shopee chưa giao hôm nay?" "Báo cáo nhập kho tháng này"

Troubleshooting

OAuth fails: Verify GOBOX_GRANT_TYPE (default client_credentials). Contact admin if unsure.

FastMCP SSE DNS rebinding error: Add transport_security=TransportSecuritySettings(enable_dns_rebinding_protection=False) to mcp.run() call.

Token expired mid-call: Auto-refresh handles this. If persists, call gobox_auth.clear_cache().

Project structure

gobox-mcp/
├── gobox_mcp.py              # Main entry
├── gobox_auth.py             # OAuth token cache
├── gobox_client.py           # HTTP helper
├── tools/
│   ├── orders_tools.py
│   ├── products_tools.py
│   ├── warehouses_tools.py
│   ├── reports_tools.py
│   ├── shops_tools.py
│   ├── locations_tools.py
│   ├── consignments_tools.py
│   ├── goship_tools.py
│   └── webhooks_tools.py
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── .env.example
└── README.md

Available Tools

59 tools
add_consignment_attachmentsC

Add attachment files to a consignment.

Inputs: code (required), files (required). Returns: object

cancel_consignmentA

Cancel a consignment. Only works for draft/confirmed status.

Inputs: code (required), reason. Returns: object

cancel_orderB

Cancel an order. Only works before shipping stage.

Inputs: transaction_no (required), reason. Returns: object

create_consignmentA

Create a new consignment (nhập hàng vào kho).

WORKFLOW: First call list_warehouses to get warehouse_id, then get_product to verify SKUs.

Inputs: warehouse_id (required), status (required), products (required), qc_type, +4 more. Returns: object

create_orderB

Create a new order.

WORKFLOW: First verify product stock with sku_quantity_available. See WORKFLOW GUIDE in module docstring for full creation flow.

Inputs: data (required). Returns: object

create_productA

Create a new product.

WORKFLOW: First call list_categories + list_brands to get valid IDs.

Required body fields: category_id (int): Category ID (from list_categories) Optional fields: name (str), sku (str), description (str), brand_id (int), weight (int, grams), length/width/height (int), is_combo (bool), total_price (number, required if is_combo=1), product_combos: [{sku_name, quantity}] (if combo), variants: [{name, value}], skus: [{sku, price, supplier_price, variants}], images: [{image, variant_name, variant_value}], attributes: [{attribute_id, value, platform, values[], unit}]

Inputs: data (required). Returns: object

create_webhookB

Register a new webhook endpoint.

Inputs: url (required), events (required). Returns: object

delete_productB

Delete product by SKU. WARNING: This is irreversible.

Inputs: sku (required). Returns: object

delete_webhookC

Delete a webhook subscription.

Inputs: webhook_id (required). Returns: object

get_consignmentA

Fetch full consignment detail by code.

Inputs: code (required), include. Returns: object

get_orderB

Fetch full order detail by transactionNo.

Inputs: transaction_no (required). Returns: object

get_productA

Fetch FULL product detail by SKU with all relations.

Inputs: sku (required), include. Returns: object

get_shipping_ratesC

Fetch Goship carrier rates for a delivery route.

Inputs: address (required), warehouse_id, cod, amount, +4 more. Returns: object

get_sys_helpersA

Fetch system enum/status reference (order statuses, types, etc.).

Call this once to let AI understand what status codes mean when interpreting order/inventory responses.

Inputs: no named parameters. Returns: object

list_attributesA

List product attributes for a category. category_id is REQUIRED.

WORKFLOW: Call list_categories first to get category_id.

Inputs: category_id (required). Returns: object

list_brandsA

List brands for a category. category_id is REQUIRED.

WORKFLOW: Call list_categories first to get category_id.

Inputs: category_id (required). Returns: object

list_categoriesA

List all product categories. Use to get category_id for product creation.

WORKFLOW: Call this FIRST, then use category_id for list_brands and list_attributes.

Inputs: no named parameters. Returns: object

list_citiesA

List all Vietnamese provinces/cities.

Inputs: no named parameters. Returns: object

list_consignmentsB

List consignment documents. Returns paginated results.

IMPORTANT for AI:

  • Use 'q' to search by consignment code.

  • Use 'include' for relations: warehouse,skus,attachments

  • Status: 0=draft, 2=confirmed, 3=received, 4=partially imported, 5=imported, 49=cancelled

Inputs: q, status, warehouse_id, start_create_date, +6 more. Returns: object

list_countriesA

List all countries supported by Gobox.

Inputs: no named parameters. Returns: object

list_districtsA

List districts for a city. city_id is REQUIRED.

WORKFLOW: Call list_cities first to get city_id.

Inputs: city_id (required). Returns: object

list_inventoriesA

List inventory check (kiểm kho) documents. Paginated.

IMPORTANT for AI:

  • Status: 1=pending, 10=awaiting confirmation, 200=completed

  • Done status: 1=matched, 2=discrepancy, 3=excess, 4=shortage

  • Use date filters + warehouse_id to narrow results.

  • Include: location,confirmer,creator,processer,sku

Inputs: q, warehouse_id, status, done_status, +9 more. Returns: object

list_ordersA

List orders with filters. Returns paginated results.

IMPORTANT for AI:

  • Use 'q' to search by order code, transaction number, or tracking number.

  • Use date range filters to narrow results.

  • Response 'meta.pagination' has total, total_pages, current_page for pagination.

Inputs: q, status, shop_id, warehouse_id, +6 more. Returns: object

list_productsA

List products with filters. Returns paginated results.

IMPORTANT for AI:

  • ALWAYS use 'q' to search by name/SKU first instead of browsing all pages.

  • Use 'include' to get relations: skus,variants,images,attributes,brand,shops,combos

  • Response 'meta.pagination' has total, total_pages, current_page for pagination.

  • Platform codes: 1=shopee, 2=lazada, 3=tiktokshop, 4=tiki, 5=pancake, 6=pos

Inputs: q, category_id, brand_id, shop_ids, +7 more. Returns: object

list_product_skusC

List all product SKU variants.

Inputs: q, limit, page. Returns: object

list_shopsC

List all connected e-commerce shops.

Inputs: q, limit, page. Returns: object

list_wardsA

List wards for a district. district_id is REQUIRED.

WORKFLOW: Call list_cities → list_districts(city_id) → list_wards(district_id).

Inputs: district_id (required). Returns: object

list_warehouse_pickingsA

List warehouse picking documents (nhập/xuất/chuyển kho). Paginated.

IMPORTANT for AI:

  • Type: 1=shelf transfer, 2=import, 3=export, 4=warehouse transfer

  • Use 'q' to search by code, order number, or shipping code.

  • Include: moves.sku,order,processer,doner,handoverer,handover,assigner,waiting_revoker,revoker

Inputs: q, warehouse_id, warehouse_dest_id, type, +10 more. Returns: object

list_warehousesC

List all warehouses.

Inputs: q, include, limit, page. Returns: object

list_webhooksA

List all registered webhook subscriptions.

Inputs: no named parameters. Returns: object

report_export_by_orderC

Warehouse export report grouped by order.

Inputs: start_date, end_date, warehouse_id, q, +3 more. Returns: object

report_export_by_skuC

Warehouse export report grouped by SKU.

Inputs: start_date, end_date, warehouse_id, sku_sku, +3 more. Returns: object

report_inventoriesD

Inventory check (kiểm kho) report.

Inputs: start_date, end_date, warehouse_id, sku_sku, +5 more. Returns: object

report_materialsC

Materials (packaging, supplies) usage report.

Inputs: start_date, end_date, warehouse_id, q, +3 more. Returns: object

report_warehouse_importC

Warehouse import (stock-in) report.

Inputs: start_date, end_date, warehouse_id, sku_sku, +5 more. Returns: object

report_warehouse_import_refundC

Import report for refund/returned stock.

Inputs: start_date, end_date, warehouse_id, sku_sku, +4 more. Returns: object

report_warehouse_stockC

Current stock balance per warehouse/SKU. warehouse_id is REQUIRED.

Inputs: warehouse_id (required), start_date, end_date, sku_sku, +1 more. Returns: object

report_warehouse_storeC

Warehouse storage snapshot — what's currently stored.

Inputs: start_date, end_date, warehouse_id, sku_sku, +3 more. Returns: object

search_all_consignmentsB

Fetch ALL consignments across all pages in parallel.

ALWAYS use filters to narrow results.

Inputs: q, status, warehouse_id, start_create_date, +2 more. Returns: object

search_all_inventoriesC

Fetch ALL inventory checks across all pages in parallel.

ALWAYS use filters to narrow results.

Inputs: warehouse_id, status, done_status, include, +2 more. Returns: object

search_all_ordersA

Fetch ALL orders across all pages in parallel.

Use for reporting/counting, e.g. 'all orders from last week'. ALWAYS use filters to narrow results.

Inputs: q, status, shop_id, warehouse_id, +2 more. Returns: object

search_all_productsA

Fetch ALL products across all pages in parallel.

Use when you need a complete list, e.g. 'show all products of brand X'. ALWAYS use q/category/brand filters to narrow results when possible.

Inputs: q, category_id, brand_id, include. Returns: object

search_all_product_skusA

Fetch ALL product SKU variants across all pages in parallel.

Inputs: q. Returns: object

search_all_shopsA

Fetch ALL shops across all pages in parallel.

Inputs: no named parameters. Returns: object

search_all_warehouse_pickingsB

Fetch ALL warehouse pickings across all pages in parallel.

ALWAYS use filters to narrow results.

Inputs: warehouse_id, type, status, include, +2 more. Returns: object

search_all_warehousesC

Fetch ALL warehouses across all pages in parallel.

Inputs: include. Returns: object

send_order_to_goboxA

Send order to warehouse (Gobox) for packing.

WORKFLOW: Call this AFTER create_order, BEFORE send_order_to_goship. This triggers the warehouse to start picking and packing the order.

Inputs: transaction_no (required). Returns: object

send_order_to_goshipA

Send order to carrier (Goship) for delivery.

WORKFLOW: Call this AFTER send_order_to_gobox (order must be packed first). This triggers carrier pickup/delivery scheduling.

Inputs: transaction_no (required). Returns: object

sku_full_statusA

Composite: fetch ALL 5 quantity states for a single SKU in parallel.

PREFERRED tool for answering 'How much of SKU X do we have?' Returns all states in one call instead of 5 sequential calls.

Inputs: sku (required). Returns: object

sku_quantity_availableB

Get AVAILABLE (sellable) quantity. This is what can be sold NOW.

Inputs: sku. Returns: object

sku_quantity_in_warehouseB

Get total quantity physically IN warehouse (includes held stock).

Inputs: sku. Returns: object

sku_quantity_keep_pickB

Get quantity reserved for outgoing order picks (not available for sale).

Inputs: sku. Returns: object

sku_quantity_wait_incomingC

Get quantity expected from incoming consignments (not yet in warehouse).

Inputs: sku. Returns: object

sku_quantity_wait_qcA

Get quantity waiting for QC inspection (not yet sellable).

Inputs: sku. Returns: object

toggle_webhookC

Enable/disable a webhook.

Inputs: webhook_id (required). Returns: object

update_orderB

Update order fields by transactionNo.

WORKFLOW: Call get_order first to see current state.

Inputs: transaction_no (required), data (required). Returns: object

update_order_statusC

Update order status. Call get_sys_helpers() for valid status values.

Inputs: transaction_no (required), status (required). Returns: object

update_productA

Update product by SKU.

WORKFLOW: Call get_product(sku) first to see current state before updating. Body fields same as create_product.

Inputs: sku (required), data (required). Returns: object

update_webhookC

Update webhook configuration.

Inputs: webhook_id (required), data (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 59 tools

    Disambiguation5/5

    Every tool targets a distinct operation or resource, with clear descriptions and workflow notes that prevent confusion. Overlapping concepts like list_consignments vs search_all_consignments are clearly differentiated by scope.

    Naming Consistency5/5

    Tool names follow a consistent verb_noun pattern (e.g., list_warehouses, create_order, get_product, delete_webhook). Variations like sku_full_status and toggle_webhook still adhere to the same style, ensuring predictability.

    Tool Count4/5

    59 tools is high but justified by the comprehensive domain coverage (products, orders, consignments, inventory, reports, webhooks, etc.). Each tool serves a specific need, though some consolidation could reduce the count without loss of clarity.

    Completeness5/5

    The tool set covers the full lifecycle of key entities (CRUD for products, orders, consignments; status checks; reports; shipping workflow) with no obvious gaps. Workflow hints ensure agents can chain operations correctly.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • -
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables AI agents to interact with Skulabs inventory management system through comprehensive tools for managing products, orders, customers, and analytics. Supports voice agents like Retell AI and desktop applications like Claude for natural language inventory operations.
      -
    • F
      license
      Not graded
      quality
      C
      maintenance
      Enables AI to view and manage e-commerce data such as products, orders, and coupons, and perform actions like updating prices, stock, and generating sales reports.
      -