logiwa-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@logiwa-mcp-server list all products in warehouse A"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 withLOGIWA_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 buildThen verify the build without needing credentials:
node dist/index.js --list-tools # prints the 32 registered toolsAuthentication
The server authenticates with a JWT bearer token. Provide credentials via environment variables
(see .env.example):
Variable | Description |
| Recommended. The server |
| A pre-issued JWT. If set, it takes precedence and no login call is made. |
| Optional. API base URL (default |
| Optional. Per-request timeout in ms (default |
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_lookupto resolve theclientIdentifier, 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 testingProject 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 toolsScope & 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 withdestructiveHint.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 toolslogiwa_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 InventoryADestructive
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 OrderADestructiveIdempotent
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 OrderADestructiveIdempotent
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 ProductARead-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 OrderARead-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 OrderARead-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 CustomersARead-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 InventoryARead-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 ProductsARead-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 OrdersARead-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 RetailersARead-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 OrdersARead-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 OrdersARead-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 VendorsARead-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 LocationsARead-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 WarehousesARead-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 DataARead-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 InventoryADestructive
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 PromiseARead-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 HistoryARead-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 HistoryARead-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 InventoryARead-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 OrdersAIdempotent
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 ProductAIdempotent
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 OrderAIdempotent
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
Scored across 32 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for SkuVault — products, inventory, sales, purchase orders and stock adjustments.
MCP server for MarketTime — wholesale orders, customers, catalog and shipment tracking.
Unified MCP server for 70+ eCommerce platforms: products, orders, customers, and more.
MCP server for Flex on the Job: inventory, jobs, customers, invoices, purchasing, sales orders.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides access to WooCommerce REST API functionality, enabling product, order, customer, and coupon management.348 npm1MIT
- AlicenseCqualityBmaintenanceMCP 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.6070 npm10MIT
- FlicenseNot gradedqualityDmaintenanceThis MCP server simplifies interaction with the ConnectWise Manage API through API discovery, execution, and a fast memory system for efficient workflows.12 npm-
- FlicenseNot gradedqualityCmaintenanceMCP server wrapping Boxzooka's bxz-api to provide 33 tools for managing products, inbound orders, orders, inventory, shipments, and returns.-