Skip to main content
Glama
logiwa-mcp-server

logiwa-mcp-server

by cgtykctn

logiwa-mcp-server

An MCP server for the Logiwa IO (WMS) API. It lets MCP clients (Claude Desktop, Claude Code, etc.) work with your Logiwa warehouse data through well-described tools: products, inventory, shipment/purchase/return orders, warehouses & locations, customers/vendors/retailers, key reports, and reference lookups.

  • Language / transport: TypeScript · stdio

  • API base: https://myapi.logiwa.com (override with LOGIWA_BASE_URL)

  • Auth: JWT bearer — fetched from email/password, or a pre-issued token

  • Tools: 32 (see Tools)

Built with the mcp-builder skill.


Prerequisites

  • Node.js ≥ 18

  • A Logiwa IO account. Each user authenticates with their own credentials (email/password or a pre-issued JWT). The server calls the Logiwa API on behalf of whoever's credentials are configured — no credentials are bundled in this repo, so every user must supply their own.

Related MCP server: MoySklad MCP Server

Setup

git clone https://github.com/cgtykctn/Logiwa-IO-WMS--MCP-.git
cd Logiwa-IO-WMS--MCP-
npm install
npm run build

Then verify the build without needing credentials:

node dist/index.js --list-tools   # prints the 32 registered tools

Authentication

The server authenticates with a JWT bearer token. Provide credentials via environment variables (see .env.example):

Variable

Description

LOGIWA_EMAIL + LOGIWA_PASSWORD

Recommended. The server POSTs these to /v3.1/Authorize/token, caches the returned JWT in memory, and re-authenticates automatically on a 401.

LOGIWA_API_TOKEN

A pre-issued JWT. If set, it takes precedence and no login call is made.

LOGIWA_BASE_URL

Optional. API base URL (default https://myapi.logiwa.com).

LOGIWA_TIMEOUT_MS

Optional. Per-request timeout in ms (default 30000).

Credentials are read from the process environment only — nothing is written to disk or logged.

Register with an MCP client

Replace /absolute/path/to/Logiwa-IO-WMS--MCP- with the real path where you cloned the repo, and use your own Logiwa email/password. The server runs locally (stdio) alongside your MCP client — each user installs and configures it on their own machine.

Claude Code (CLI)

claude mcp add logiwa \
  --env LOGIWA_EMAIL=you@example.com \
  --env LOGIWA_PASSWORD=your-password \
  -- node "/absolute/path/to/Logiwa-IO-WMS--MCP-/dist/index.js"

Claude Desktop

Add to claude_desktop_config.json (Settings → Developer → Edit Config):

{
  "mcpServers": {
    "logiwa": {
      "command": "node",
      "args": ["/absolute/path/to/Logiwa-IO-WMS--MCP-/dist/index.js"],
      "env": {
        "LOGIWA_EMAIL": "you@example.com",
        "LOGIWA_PASSWORD": "your-password"
      }
    }
  }
}

Restart the client after editing. Tools then appear under the logiwa server.

Tools

All list/report tools paginate with page (1-based) and page_size (≤200), and accept response_format (markdown default, or json for full structured data). Logiwa's list endpoints paginate by page index only (no server-side text filter), so page through results or use a get/lookup tool when you already know an identifier. Write tools expose the API's required fields plus an additional_fields escape hatch for any other Logiwa body field.

Products — logiwa_list_products, logiwa_get_product, logiwa_create_product, logiwa_update_product Inventory — logiwa_list_inventory, logiwa_add_inventory, logiwa_adjust_inventory, logiwa_remove_inventory, logiwa_transfer_inventory Shipment orders — logiwa_list_shipment_orders, logiwa_get_shipment_order, logiwa_create_shipment_order, logiwa_update_shipment_order, logiwa_cancel_shipment_order, logiwa_ship_shipment_orders Purchase orders — logiwa_list_purchase_orders, logiwa_get_purchase_order, logiwa_create_purchase_order, logiwa_receive_purchase_order Return orders — logiwa_list_return_orders, logiwa_create_return_order, logiwa_cancel_return_order Warehouses — logiwa_list_warehouses, logiwa_list_warehouse_locations Partners — logiwa_list_customers, logiwa_list_vendors, logiwa_list_retailers Reports — logiwa_report_total_inventory, logiwa_report_shipment_history, logiwa_report_receiving_history, logiwa_report_available_to_promise Lookups — logiwa_lookup (clients, warehouses, types, reasons, carriers, …)

Tip: start with logiwa_lookup to resolve the clientIdentifier, type names, and currency ids that the create/update tools require.

Development

npm run dev          # tsx watch (auto-reload)
npm run build        # tsc -> dist/
npm start            # node dist/index.js
npx @modelcontextprotocol/inspector node dist/index.js   # interactive testing

Project structure

src/
├── index.ts              # entry point: wires up tools, stdio transport, --list-tools
├── constants.ts          # base URL, limits, defaults
├── types.ts              # response envelope types
├── registry.ts           # registerTool wrapper that records tool names
├── services/
│   ├── client.ts         # auth (token fetch + cache + 401 retry) and HTTP
│   └── format.ts         # list/object formatting, pagination, truncation, error messages
├── schemas/
│   └── common.ts         # shared Zod fragments (pagination, line items, packing)
└── tools/                # one file per domain
    ├── products.ts  inventory.ts  shipmentOrders.ts  purchaseOrders.ts
    ├── returnOrders.ts  warehouses.ts  partners.ts  reports.ts  helpers.ts
    └── simpleList.ts     # factory for simple read-only list tools

Scope & notes

  • Covers the core Logiwa domains (the API has 200+ endpoints). Niche areas — robotics, billing, count plans, warehouse tasks, webhooks, data-setup CRUD, user/role admin — are intentionally omitted from this first version and can be added the same way.

  • Destructive operations (*_cancel_*, *_remove_*, *_adjust_*) are flagged with destructiveHint.

  • For Logiwa field references, see the developer docs at https://mydeveloper.logiwa.com/ and the Swagger UI at https://myapi.logiwa.com/swagger/index.html.

License

Licensed under the Apache License 2.0.

Available Tools

32 tools
logiwa_add_inventoryAdd InventoryA

Increases the on-hand quantity of an existing inventory record by quantity.

Identify the record with 'inventoryIdentifier' (UUID) from logiwa_list_inventory.

Args:

  • inventoryIdentifier (string, required): UUID of the inventory record

  • quantity (number, required): quantity to add

  • note (string): optional note

  • adjustmentReasonName (string): optional reason (must match a configured reason)

Returns: the operation result from Logiwa.

Inputs: quantity (required), inventoryIdentifier (required), note, additional_fields, +1 more.

logiwa_adjust_inventoryAdjust InventoryA
Destructive

Adjusts the on-hand quantity of an inventory record to a new value. This overwrites the counted quantity.

Identify the record with 'inventoryIdentifier' (UUID) from logiwa_list_inventory.

Args:

  • inventoryIdentifier (string, required): UUID of the inventory record

  • quantity (number, required): quantity to adjust

  • note (string): optional note

  • adjustmentReasonName (string): optional reason (must match a configured reason)

Returns: the operation result from Logiwa.

Inputs: quantity (required), inventoryIdentifier (required), note, additional_fields, +1 more.

logiwa_cancel_return_orderCancel Return OrderA
DestructiveIdempotent

Cancel a return order. Identify it by rmaNumber and the related shipment order / warehouse / client.

Args (common):

  • rmaNumber (string): the RMA to cancel

  • shipmentOrderCode or shipmentOrderIdentifier (string)

  • warehouseIdentifier (string), clientIdentifier (string) Other identifiers via additional_fields.

Returns: the cancellation result. Destructive state change.

Inputs: client, rmaNumber, warehouse, clientIdentifier, +4 more.

logiwa_cancel_shipment_orderCancel Shipment OrderA
DestructiveIdempotent

Cancel a shipment order by its identifier (UUID). This is a destructive state change.

Args:

  • identifier (string, required): the order UUID

  • cancelReasonName (string): optional cancellation reason

  • shipmentOrderCode (string): optional code for cross-checking Other fields (warehouseIdentifier, clientIdentifier, cancelReasonIdentifier) via additional_fields.

Returns: the cancellation result.

Inputs: identifier (required), cancelReasonName, additional_fields, shipmentOrderCode.

logiwa_create_productCreate ProductA

Create a new product (SKU) in Logiwa.

Required: clientIdentifier, sku, name, description, currencyId, isPackagingMaterial, packingSettings. Use logiwa_lookup to resolve clientIdentifier and currency/pack-type values. Provide any additional Logiwa fields (kit components, hazmat, custom fields, etc.) via additional_fields.

Returns: the create response from Logiwa (typically the new product identifier / status).

Inputs: sku (required), name (required), currencyId (required), description (required), +13 more.

logiwa_create_purchase_orderCreate Purchase OrderA

Create a new purchase (inbound) order.

Required: code, clientIdentifier, vendor, purchaseOrderTypeName, warehouseIdentifier, currencyId, purchaseOrderLineList (>=1 line). Resolve client/warehouse/type/currency with logiwa_lookup and logiwa_list_warehouses. Other fields via additional_fields.

Returns: the create response (new PO identifier / status).

Inputs: code (required), vendor (required), currencyId (required), clientIdentifier (required), +7 more.

logiwa_create_return_orderCreate Return OrderA

Create a return order (RMA).

Required: rmaNumber, returnOrderProductLineList (>=1 line; each line needs productIdentifier + requestedQuantity). Link to the original sale with shipmentOrderCode or shipmentOrderIdentifier. Resolve product identifiers via logiwa_list_products. Other fields via additional_fields.

Returns: the create response (new return order identifier / status).

Inputs: rmaNumber (required), returnOrderProductLineList (required), client, carrier, +8 more.

logiwa_create_shipment_orderCreate Shipment OrderA

Create a new shipment (outbound) order.

Required: code, shipmentOrderType, shipmentOrderDate (ISO date-time), currencyId, shipmentOrderLineList (>=1 line). Provide customer / shipmentAddress / billingAddress as objects matching the Logiwa API. Resolve type/warehouse/currency values with logiwa_lookup. Any other fields go in additional_fields.

Returns: the create response (new order identifier / status).

Inputs: code (required), currencyId (required), shipmentOrderDate (required), shipmentOrderType (required), +11 more.

logiwa_get_productGet ProductA
Read-onlyIdempotent

Get the full detail of a single product by its Logiwa identifier (UUID).

Args:

  • identifier (string): the product's UUID (from logiwa_list_products items[].identifier)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: the product object including SKU, name, description, pricing, packing settings, custom fields and flags.

Inputs: identifier (required), response_format.

logiwa_get_purchase_orderGet Purchase OrderA
Read-onlyIdempotent

Get full detail (including line items) of one purchase order by its identifier (UUID).

Args:

  • identifier (string): the PO's UUID (from logiwa_list_purchase_orders)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: the purchase order with vendor, warehouse, dates and line products.

Inputs: identifier (required), response_format.

logiwa_get_shipment_orderGet Shipment OrderA
Read-onlyIdempotent

Get full detail of one shipment order by its identifier (UUID).

Args:

  • identifier (string): the order's UUID (from logiwa_list_shipment_orders)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: the shipment order including status, addresses, line products, carrier and tracking info.

Inputs: identifier (required), response_format.

logiwa_list_customersList CustomersA
Read-onlyIdempotent

List customers (ship-to parties), paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: customers with identifier, name and contact/address details.

Inputs: page, page_size, response_format.

logiwa_list_inventoryList InventoryA
Read-onlyIdempotent

List on-hand inventory records with their warehouse locations, paginated.

Each record ties a product/SKU to a warehouse, location and on-hand quantity, and carries an 'inventoryIdentifier' UUID used by the add/adjust/remove tools.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: paginated { items[] } where each item includes inventoryIdentifier, sku, warehouse, location and quantity.

Inputs: page, page_size, response_format.

logiwa_list_productsList ProductsA
Read-onlyIdempotent

List products (SKUs) in the Logiwa catalog, paginated.

Logiwa list endpoints paginate by page index only — there is no server-side text filter, so page through results to find a SKU, or use logiwa_get_product when you already know the product identifier.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: { title, page, page_size, count, total_count, has_more, next_page, items[] }. Each item includes the product identifier (UUID), sku, name, stock and packaging info.

Inputs: page, page_size, response_format.

logiwa_list_purchase_ordersList Purchase OrdersA
Read-onlyIdempotent

List purchase (inbound) orders, paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: paginated { items[] } where each item includes the PO identifier (UUID), code, vendor, warehouse, status and dates.

Inputs: page, page_size, response_format.

logiwa_list_retailersList RetailersA
Read-onlyIdempotent

List retailers / sales channels configured in the account, paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: retailers with identifier and name.

Inputs: page, page_size, response_format.

logiwa_list_return_ordersList Return OrdersA
Read-onlyIdempotent

List return orders (RMAs), paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: paginated { items[] } where each item includes the return order identifier, rmaNumber, related shipment order, warehouse and status.

Inputs: page, page_size, response_format.

logiwa_list_shipment_ordersList Shipment OrdersA
Read-onlyIdempotent

List shipment (outbound / sales) orders, paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: paginated { items[] } where each item includes the order identifier (UUID), code, status, warehouse, customer and dates.

Inputs: page, page_size, response_format.

logiwa_list_vendorsList VendorsA
Read-onlyIdempotent

List vendors (suppliers) used on purchase orders, paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: vendors with identifier, name and contact details.

Inputs: page, page_size, response_format.

logiwa_list_warehouse_locationsList Warehouse LocationsA
Read-onlyIdempotent

List warehouse locations (bins/shelves), paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: locations with their identifier (UUID), code, zone/group and warehouse — used to resolve location codes for inventory transfers and receiving.

Inputs: page, page_size, response_format.

logiwa_list_warehousesList WarehousesA
Read-onlyIdempotent

List the warehouses configured in the account, paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: warehouses with their identifier (UUID), code and name — used to resolve warehouseIdentifier / warehouse code for other tools.

Inputs: page, page_size, response_format.

logiwa_lookupLookup Reference DataA
Read-onlyIdempotent

Fetch Logiwa reference/lookup data used to resolve names and identifiers needed by other tools (clients, warehouses, order types, product types/groups, pack types, damage/return reasons, carriers, users).

Many create/update tools need a clientIdentifier, type name, or currency — use this first to discover valid values.

Args:

  • category (string, optional): return only one list. One of: clientList, warehouseList, shipmentOrderTypeList, purchaseOrderTypeList, productTypeList, productGroupList, packTypeList, damageReasonList, returnReasonList, carrierList, userList. Omit to get a summary of all categories with their counts.

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: the requested lookup list (each entry typically has an identifier and a name), or a category summary.

Inputs: category, response_format.

logiwa_receive_purchase_orderReceive Purchase OrderA

Receive stock against a purchase order (records an inbound receipt for one product line).

Identify the PO (purchaseOrderCode or purchaseOrderIdentifier), the product (sku), the receiving warehouse and location, and the quantity received. Provide lot/expiry/serial or license-plate details via the typed fields or additional_fields.

Args (common):

  • purchaseOrderCode (string): the PO code being received

  • sku (string): product received

  • quantity (number): units received

  • warehouse / warehouseLocationCode (string): where it is received

  • client (string), packType (string), lotBatchNumber, expiryDate (string), licensePlateNumber (string): optional

Returns: the receipt result from Logiwa.

Inputs: sku, client, packType, quantity, +9 more.

logiwa_remove_inventoryRemove InventoryA
Destructive

Decreases (removes) quantity units from an existing inventory record.

Identify the record with 'inventoryIdentifier' (UUID) from logiwa_list_inventory.

Args:

  • inventoryIdentifier (string, required): UUID of the inventory record

  • quantity (number, required): quantity to remove

  • note (string): optional note

  • adjustmentReasonName (string): optional reason (must match a configured reason)

Returns: the operation result from Logiwa.

Inputs: quantity (required), inventoryIdentifier (required), note, additional_fields, +1 more.

logiwa_report_available_to_promiseReport: Available To PromiseA
Read-onlyIdempotent

Available-to-promise (sellable) quantities per SKU, paginated. Best for "how many can I still sell?".

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: ATP rows per SKU/warehouse with on-hand, allocated and available-to-promise quantities.

Inputs: page, page_size, response_format.

logiwa_report_receiving_historyReport: Receiving HistoryA
Read-onlyIdempotent

Historical receipt records (inbound receiving history), paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: receipt history with SKU, quantities, purchase order and date information.

Inputs: page, page_size, response_format.

logiwa_report_shipment_historyReport: Shipment HistoryA
Read-onlyIdempotent

Historical shipped-line records (outbound fulfillment history), paginated.

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: shipment line history with SKU, quantities, order and date information.

Inputs: page, page_size, response_format.

logiwa_report_total_inventoryReport: Total InventoryA
Read-onlyIdempotent

Total (consolidated) on-hand inventory across locations, paginated. Best for "how much of each SKU do we have?".

Args:

  • page (number): 1-based page number (default 1)

  • page_size (number): records per page, 1-200 (default 20)

  • response_format ('markdown' | 'json'): output format (default markdown)

Returns: consolidated inventory rows per SKU/warehouse with on-hand and available quantities.

Inputs: page, page_size, response_format.

logiwa_ship_shipment_ordersShip Shipment OrdersA
Idempotent

Mark one or more shipment orders as shipped (completes fulfillment).

Args:

  • shipmentOrderIdentifiers (string[], required): one or more order UUIDs to ship

Returns: the ship operation result from Logiwa.

Inputs: shipmentOrderIdentifiers (required).

logiwa_transfer_inventoryTransfer Inventory (Product)A

Move a quantity of a product between warehouse locations / license plates.

Identify the product (productSku or productIdentifier) and the source/target locations. Use codes (human-readable) or identifiers (UUIDs). Resolve values with logiwa_lookup, logiwa_list_warehouses and logiwa_list_warehouse_locations.

Args (common):

  • productSku or productIdentifier (string): which product to move

  • quantity (number, required): units to transfer

  • sourceWarehouseCode / sourceWarehouseLocationCode (string): where the stock is now

  • targetWarehouseLocationCode (string): where to move it

  • packTypeName, lotBatchNumber, expiryDate (string): optional Provide any other Logiwa transfer fields via additional_fields.

Returns: the transfer result from Logiwa.

Inputs: quantity (required), expiryDate, productSku, packTypeName, +9 more.

logiwa_update_productUpdate ProductA
Idempotent

Update an existing product. Provide the product 'identifier' (UUID) to locate it, plus the fields to change.

Required by the API: sku, name, description, packingSettings. Send the full intended state of these fields. Provide any other Logiwa fields via additional_fields.

Returns: the update response from Logiwa.

Inputs: sku (required), name (required), identifier (required), description (required), +10 more.

logiwa_update_shipment_orderUpdate Shipment OrderA
Idempotent

Update an existing shipment order. Provide 'identifier' (UUID) plus the full intended state of the required fields.

Required: code, shipmentOrderType, shipmentOrderDate, currencyId, shipmentOrderLineList. Other fields via additional_fields.

Returns: the update response from Logiwa.

Inputs: code (required), currencyId (required), identifier (required), shipmentOrderDate (required), +6 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 32 tools

    Disambiguation5/5

    Every tool targets a distinct resource and action. The three inventory-related reporting tools are clearly differentiated (per-location, consolidated, and ATP), and operations like add/adjust/remove/transfer have unambiguous purposes. No two tools appear to overlap.

    Naming Consistency5/5

    All tools follow a consistent logiwa_<verb>_<noun> pattern (e.g., list_products, create_shipment_order, cancel_return_order). The sole exception is logiwa_lookup, but it is still a clear verb and fits the overall style. Naming is predictable and uniform.

    Tool Count2/5

    At 32 tools, the server exceeds the 25-tool threshold the rubric considers too many. Even though the scope is broad (WMS operations), the high count makes the surface feel heavy and potentially overwhelming for agents.

    Completeness3/5

    The server covers the primary workflows: products, inventory, shipment and purchase orders, returns, and reporting. However, there are notable gaps such as no delete operations anywhere, no update or cancel for purchase orders, and no get/update for return orders, which could leave agents with dead ends.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that provides access to WooCommerce REST API functionality, enabling product, order, customer, and coupon management.
      348 npm
      1
      MIT
    • A
      license
      C
      quality
      B
      maintenance
      MCP server for MoySklad (МойСклад) warehouse and CRM management API. 21 tools covering the full order lifecycle: products, stock, counterparties, customer orders, shipments, supplies, warehouses, organizations, reports, and webhooks.
      60
      70 npm
      10
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      This MCP server simplifies interaction with the ConnectWise Manage API through API discovery, execution, and a fast memory system for efficient workflows.
      12 npm
      -
    • F
      license
      Not graded
      quality
      C
      maintenance
      MCP server wrapping Boxzooka's bxz-api to provide 33 tools for managing products, inbound orders, orders, inventory, shipments, and returns.
      -