Skip to main content

Inventory MCP server

Let an assistant read and update your stock.

The MCP server uses the same API, the same workspace keys and the same limits, on every plan.

Works todayThe MCP server works today on every plan.

Inventory MCP tools

Nineteen tools read, twenty-two tools write.

A read-only key gets only the read tools. Every write is recorded in the integration activity log.

MCP tools
ToolWhat it doesKey needed
search_productsFind variants by SKU, name or barcode.Read
list_locationsList locations with their ids.Read
get_stock_levelsStock on hand for a SKU, at every location or one.Read
list_stock_levelsOn hand, reserved and available for each SKU and location, a page at a time, by location, SKUs or change time.Read
list_stock_movementsStock movements, newest first, by SKU, location, kind or source.Read
list_customersList customers, or find them by name, code or email.Read
list_suppliersList suppliers, or find them by name, code or email.Read
list_price_listsList price lists with their prices.Read
get_price_listOne price list with its prices.Read
list_sales_ordersSales orders by status, customer, customer reference or change time, a page at a time.Read
get_sales_orderOne sales order with its lines.Read
list_invoicesInvoices by status or sales order.Read
get_invoiceOne invoice with its lines.Read
list_purchase_ordersPurchase orders by status, supplier or change time, a page at a time.Read
get_purchase_orderOne purchase order with its lines.Read
get_stock_valueStock value by SKU and location, for today or an as-at date. Unit cost is a weighted average that includes landed freight and duty.Read
get_cost_of_goodsCost of goods shipped from one date to another, at their cost when shipped. Unit cost is a weighted average that includes landed freight and duty.Read
adjust_stockAdjust stock at a location, with a reason.Read and write
transfer_stockMove stock between two locations.Read and write
count_stockSet stock at a location to what was counted. Each difference posts as an adjustment with the reason count.Read and write
create_productAdd a product.Read and write
update_productChange a product's name, category or other details.Read and write
create_variantAdd a variant to a product, with its SKU, price and barcode.Read and write
update_variantChange a variant's price, barcode, cost or other details, found by id or SKU.Read and write
create_customerAdd a customer, with their currency, terms and addresses.Read and write
update_customerChange a customer's details, terms, price list or addresses.Read and write
create_sales_orderRaise a sales order for a customer, with a ship-to address if needed.Read and write
update_sales_orderChange a sales order's lines, required date, reference, notes or addresses. Lines merge by line_id.Read and write
cancel_sales_orderCancel a sales order and free its reserved stock.Read and write
pick_sales_orderPick units on a sales order's lines. No stock moves until it ships.Read and write
unpick_sales_orderReturn picked units on a sales order to unpicked.Read and write
ship_sales_orderShip a sales order in full, or ship only what is picked.Read and write
close_sales_orderClose what is still open on a part-shipped sales order and free its reserved stock.Read and write
raise_invoiceInvoice what has shipped on a sales order.Read and write
mark_invoice_paidMark an invoice paid.Read and write
list_returnsCustomer returns, by sales order.Read
list_credit_notesCredit notes, by invoice.Read
record_returnRecord units sent back on a shipped sales order: restock at a location, or write off with a reason.Read and write
raise_credit_noteCredit an invoice for a return's units at its prices and tax, or for an amount before tax.Read and write
create_purchase_orderRaise a purchase order with a supplier.Read and write
receive_purchase_orderReceive lines on a purchase order. Set allow_over_delivery to take more than ordered.Read and write

MCP tool input schemas

The arguments each tool takes.

Each schema is the one the server lists in tools/list. An argument a tool does not list is refused, with its name.

search_products No required arguments.
search_products input schema (JSON)
{
  "type": "object",
  "properties": {
    "sku": {
      "type": "string",
      "description": "An exact SKU."
    },
    "barcode": {
      "type": "string",
      "description": "An exact barcode."
    },
    "query": {
      "type": "string",
      "description": "Part of a SKU or name. Every page is searched, and every match comes back at once."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
list_locations No required arguments.
list_locations input schema (JSON)
{
  "type": "object",
  "properties": {
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
get_stock_levels Required: sku.
get_stock_levels input schema (JSON)
{
  "type": "object",
  "properties": {
    "sku": {
      "type": "string",
      "description": "The SKU."
    },
    "location_id": {
      "type": "string",
      "description": "Only this location; every location when left out."
    }
  },
  "required": [
    "sku"
  ],
  "additionalProperties": false
}
list_stock_levels No required arguments.
list_stock_levels input schema (JSON)
{
  "type": "object",
  "properties": {
    "location_id": {
      "type": "string",
      "description": "Only this location; every location when left out."
    },
    "sku": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 250,
      "description": "Only these SKUs, up to 250; every SKU when left out or empty. A SKU not in the workspace matches nothing."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
list_stock_movements No required arguments.
list_stock_movements input schema (JSON)
{
  "type": "object",
  "properties": {
    "sku": {
      "type": "string",
      "description": "Only this SKU."
    },
    "location_id": {
      "type": "string",
      "description": "Only this location."
    },
    "kind": {
      "type": "string",
      "description": "One or more of opening, receipt, shipment, adjustment, transfer, return, separated by commas."
    },
    "source": {
      "type": "string",
      "description": "One or more of screen, scan, api, import, sync, separated by commas."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
list_customers No required arguments.
list_customers input schema (JSON)
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Part of the customer's name, code or email. Every customer when left out; with it, every match comes back at once."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
list_suppliers No required arguments.
list_suppliers input schema (JSON)
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Part of the supplier's name, code or email. Every supplier when left out; with it, every match comes back at once."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
list_price_lists No required arguments.
list_price_lists input schema (JSON)
{
  "type": "object",
  "properties": {
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
get_price_list Required: id.
get_price_list input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The price list's id."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
list_sales_orders No required arguments.
list_sales_orders input schema (JSON)
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "One or more of draft, confirmed, part_picked, picked, part_shipped, backordered, shipped, invoiced, cancelled, separated by commas."
    },
    "customer_id": {
      "type": "string",
      "description": "Only this customer's orders."
    },
    "customer_reference": {
      "type": "string",
      "description": "Only orders with exactly this customer_reference, such as a Shopify order number."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
get_sales_order Required: id.
get_sales_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The sales order's id."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
list_invoices No required arguments.
list_invoices input schema (JSON)
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "One or more of open, paid, void, separated by commas."
    },
    "sales_order_id": {
      "type": "string",
      "description": "Only the invoices raised from this sales order."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
get_invoice Required: id.
get_invoice input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The invoice's id."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
list_purchase_orders No required arguments.
list_purchase_orders input schema (JSON)
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "One or more of draft, sent, partly_received, received, closed, separated by commas."
    },
    "supplier_id": {
      "type": "string",
      "description": "Only this supplier's orders."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
get_purchase_order Required: id.
get_purchase_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The purchase order's id."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
get_stock_value No required arguments.
get_stock_value input schema (JSON)
{
  "type": "object",
  "properties": {
    "as_at": {
      "type": "string",
      "description": "A day, YYYY-MM-DD (UTC): stock and unit cost as at the end of that day. Today when left out. Unit cost is a weighted average that includes landed freight and duty."
    }
  },
  "required": [],
  "additionalProperties": false
}
get_cost_of_goods No required arguments.
get_cost_of_goods input schema (JSON)
{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "description": "The first day, YYYY-MM-DD (UTC); the first of the to date's month when left out."
    },
    "to": {
      "type": "string",
      "description": "The last day, YYYY-MM-DD (UTC); today when left out. Units shipped against sales order lines, at their cost when shipped. Unit cost is a weighted average that includes landed freight and duty."
    }
  },
  "required": [],
  "additionalProperties": false
}
adjust_stock Required: sku, location_id, quantity, reason.
adjust_stock input schema (JSON)
{
  "type": "object",
  "properties": {
    "sku": {
      "type": "string",
      "description": "The SKU."
    },
    "location_id": {
      "type": "string",
      "description": "The location's id."
    },
    "quantity": {
      "type": "integer",
      "description": "Units to add (positive) or take out (negative), never 0."
    },
    "reason": {
      "type": "string",
      "description": "Why.",
      "enum": [
        "count",
        "damage",
        "found",
        "correction",
        "other"
      ]
    },
    "note": {
      "type": "string",
      "description": "A note; needed when the reason is other."
    }
  },
  "required": [
    "sku",
    "location_id",
    "quantity",
    "reason"
  ],
  "additionalProperties": false
}
transfer_stock Required: sku, from_location_id, to_location_id, quantity.
transfer_stock input schema (JSON)
{
  "type": "object",
  "properties": {
    "sku": {
      "type": "string",
      "description": "The SKU."
    },
    "from_location_id": {
      "type": "string",
      "description": "Where the stock is now."
    },
    "to_location_id": {
      "type": "string",
      "description": "Where it goes."
    },
    "quantity": {
      "type": "integer",
      "description": "Units to move, above 0.",
      "minimum": 1
    },
    "note": {
      "type": "string",
      "description": "A note."
    },
    "allow_reserved": {
      "type": "boolean",
      "description": "Set true only when the person confirms moving units reserved for open sales orders. Without it, such a move is refused."
    }
  },
  "required": [
    "sku",
    "from_location_id",
    "to_location_id",
    "quantity"
  ],
  "additionalProperties": false
}
count_stock Required: location_id, lines.
count_stock input schema (JSON)
{
  "type": "object",
  "properties": {
    "location_id": {
      "type": "string",
      "description": "The location counted."
    },
    "note": {
      "type": "string",
      "description": "A note on every adjustment the count posts."
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "variant_id": {
            "type": "string"
          },
          "sku": {
            "type": "string"
          },
          "counted": {
            "type": "integer",
            "description": "Units counted on the shelf, 0 or more. On hand at the location is set to this."
          }
        },
        "required": [
          "counted"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "location_id",
    "lines"
  ],
  "additionalProperties": false
}
create_product Required: code, name.
create_product input schema (JSON)
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "category": {
      "type": "string"
    },
    "brand": {
      "type": "string"
    },
    "option_names": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "archived": {
      "type": "boolean"
    }
  },
  "required": [
    "code",
    "name"
  ],
  "additionalProperties": false
}
update_product Required: id.
update_product input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The product's id."
    },
    "code": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "category": {
      "type": "string"
    },
    "brand": {
      "type": "string"
    },
    "option_names": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "archived": {
      "type": "boolean"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
create_variant Required: product_id, sku, name.
create_variant input schema (JSON)
{
  "type": "object",
  "properties": {
    "product_id": {
      "type": "string",
      "description": "The product's id."
    },
    "sku": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "barcode": {
      "type": "string"
    },
    "option_values": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "unit": {
      "type": "string"
    },
    "unit_cost": {
      "type": "string",
      "pattern": "^-?\\d+\\.\\d{2}$",
      "description": "A decimal amount, two places."
    },
    "list_price": {
      "type": "string",
      "pattern": "^-?\\d+\\.\\d{2}$",
      "description": "A decimal amount, two places."
    },
    "reorder_point": {
      "type": "integer"
    },
    "reorder_quantity": {
      "type": "integer"
    },
    "supplier_id": {
      "type": "string"
    },
    "supplier_sku": {
      "type": "string"
    },
    "supplier_cost": {
      "type": "string",
      "pattern": "^-?\\d+\\.\\d{2}$",
      "description": "A decimal amount, two places."
    },
    "archived": {
      "type": "boolean"
    }
  },
  "required": [
    "product_id",
    "sku",
    "name"
  ],
  "additionalProperties": false
}
update_variant No required arguments.
update_variant input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The variant's id. Give this or sku."
    },
    "sku": {
      "type": "string",
      "description": "The variant's SKU now, to find it when id is left out."
    },
    "name": {
      "type": "string"
    },
    "barcode": {
      "type": "string"
    },
    "option_values": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "unit": {
      "type": "string"
    },
    "unit_cost": {
      "type": "string",
      "pattern": "^-?\\d+\\.\\d{2}$",
      "description": "A decimal amount, two places."
    },
    "list_price": {
      "type": "string",
      "pattern": "^-?\\d+\\.\\d{2}$",
      "description": "A decimal amount, two places."
    },
    "reorder_point": {
      "type": "integer"
    },
    "reorder_quantity": {
      "type": "integer"
    },
    "supplier_id": {
      "type": "string"
    },
    "supplier_sku": {
      "type": "string"
    },
    "supplier_cost": {
      "type": "string",
      "pattern": "^-?\\d+\\.\\d{2}$",
      "description": "A decimal amount, two places."
    },
    "archived": {
      "type": "boolean"
    },
    "new_sku": {
      "type": "string",
      "description": "A new SKU for the variant."
    }
  },
  "required": [],
  "additionalProperties": false
}
create_customer Required: code, name, currency.
create_customer input schema (JSON)
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "trade",
        "online"
      ]
    },
    "code": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "contact_name": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "enum": [
        "USD",
        "CAD",
        "GBP",
        "EUR"
      ]
    },
    "payment_terms_days": {
      "type": "integer"
    },
    "price_list_id": {
      "type": "string"
    },
    "default_location_id": {
      "type": "string"
    },
    "tax_number": {
      "type": "string"
    },
    "billing_address": {
      "type": "object",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string"
        },
        "postal_code": {
          "type": "string"
        },
        "country": {
          "type": "string"
        }
      },
      "required": [
        "line1",
        "line2",
        "city",
        "region",
        "postal_code",
        "country"
      ],
      "additionalProperties": false
    },
    "shipping_address": {
      "type": "object",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string"
        },
        "postal_code": {
          "type": "string"
        },
        "country": {
          "type": "string"
        }
      },
      "required": [
        "line1",
        "line2",
        "city",
        "region",
        "postal_code",
        "country"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "code",
    "name",
    "currency"
  ],
  "additionalProperties": false
}
update_customer Required: id.
update_customer input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The customer's id."
    },
    "kind": {
      "type": "string",
      "enum": [
        "trade",
        "online"
      ]
    },
    "code": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "contact_name": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "currency": {
      "type": "string",
      "enum": [
        "USD",
        "CAD",
        "GBP",
        "EUR"
      ]
    },
    "payment_terms_days": {
      "type": "integer"
    },
    "price_list_id": {
      "type": "string"
    },
    "default_location_id": {
      "type": "string"
    },
    "tax_number": {
      "type": "string"
    },
    "billing_address": {
      "type": "object",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string"
        },
        "postal_code": {
          "type": "string"
        },
        "country": {
          "type": "string"
        }
      },
      "required": [
        "line1",
        "line2",
        "city",
        "region",
        "postal_code",
        "country"
      ],
      "additionalProperties": false
    },
    "shipping_address": {
      "type": "object",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string"
        },
        "postal_code": {
          "type": "string"
        },
        "country": {
          "type": "string"
        }
      },
      "required": [
        "line1",
        "line2",
        "city",
        "region",
        "postal_code",
        "country"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
create_sales_order Required: customer_id, lines.
create_sales_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "customer_id": {
      "type": "string"
    },
    "location_id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "confirmed"
      ]
    },
    "channel": {
      "type": "string",
      "enum": [
        "wholesale",
        "online"
      ]
    },
    "tax_rate": {
      "type": "number"
    },
    "required_date": {
      "type": "string"
    },
    "customer_reference": {
      "type": "string"
    },
    "reject_duplicate_reference": {
      "type": "boolean",
      "description": "True to refuse the order with a 409 when another sales order already has this customer_reference."
    },
    "notes": {
      "type": "string"
    },
    "shipping_address": {
      "type": "object",
      "description": "Where this order ships, such as a web order's ship-to. Left out, the customer's shipping address. Its province sets the default tax_rate in Canada (GST or HST); elsewhere, send tax_rate.",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string",
          "description": "State, province or county code, such as ON or NY."
        },
        "postal_code": {
          "type": "string"
        },
        "country": {
          "type": "string",
          "description": "Two letters, such as CA or US."
        }
      },
      "required": [
        "line1",
        "city",
        "country"
      ],
      "additionalProperties": false
    },
    "billing_address": {
      "type": "object",
      "description": "Who this order is billed to. Left out, the customer's billing address.",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string",
          "description": "State, province or county code, such as ON or NY."
        },
        "postal_code": {
          "type": "string"
        },
        "country": {
          "type": "string",
          "description": "Two letters, such as CA or US."
        }
      },
      "required": [
        "line1",
        "city",
        "country"
      ],
      "additionalProperties": false
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "variant_id": {
            "type": "string"
          },
          "sku": {
            "type": "string"
          },
          "quantity": {
            "type": "integer"
          },
          "unit_price": {
            "type": "string",
            "pattern": "^-?\\d+\\.\\d{2}$",
            "description": "A decimal amount, two places."
          },
          "discount_percent": {
            "type": "number"
          }
        },
        "required": [
          "quantity"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "customer_id",
    "lines"
  ],
  "additionalProperties": false
}
update_sales_order Required: id.
update_sales_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The sales order's id."
    },
    "required_date": {
      "type": "string"
    },
    "customer_reference": {
      "type": "string"
    },
    "notes": {
      "type": "string"
    },
    "shipping_address": {
      "type": "object",
      "description": "Where this order ships. The tax rate on lines already on the order stays as it is.",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string",
          "description": "State, province or county code, such as ON or NY."
        },
        "postal_code": {
          "type": "string"
        },
        "country": {
          "type": "string",
          "description": "Two letters, such as CA or US."
        }
      },
      "required": [
        "line1",
        "city",
        "country"
      ],
      "additionalProperties": false
    },
    "billing_address": {
      "type": "object",
      "description": "Who this order is billed to.",
      "properties": {
        "line1": {
          "type": "string"
        },
        "line2": {
          "type": "string"
        },
        "city": {
          "type": "string"
        },
        "region": {
          "type": "string",
          "description": "State, province or county code, such as ON or NY."
        },
        "postal_code": {
          "type": "string"
        },
        "country": {
          "type": "string",
          "description": "Two letters, such as CA or US."
        }
      },
      "required": [
        "line1",
        "city",
        "country"
      ],
      "additionalProperties": false
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "line_id": {
            "type": "string",
            "description": "A line already on the order, to change or remove. Leave it out to add a line."
          },
          "variant_id": {
            "type": "string",
            "description": "For a new line: the item, by id. Or send sku."
          },
          "sku": {
            "type": "string",
            "description": "For a new line: the item, by SKU."
          },
          "quantity": {
            "type": "integer",
            "description": "Units on the line. Required for a new line; left out, a line keeps its quantity. Not below what is picked and shipped on it."
          },
          "unit_price": {
            "type": "string",
            "pattern": "^-?\\d+\\.\\d{2}$",
            "description": "A decimal amount, two places."
          },
          "discount_percent": {
            "type": "number"
          },
          "remove": {
            "type": "boolean",
            "description": "True, with line_id, to take the line off the order. A line with units picked or shipped stays."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "description": "Changes to the order's lines, merged by line_id. A line with line_id is changed; one without is added; one with remove: true is taken off. Lines not sent stay as they are."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
cancel_sales_order Required: id.
cancel_sales_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The sales order's id. Its reserved stock is freed; an order with units shipped cannot be canceled."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
pick_sales_order Required: id, lines.
pick_sales_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The sales order's id."
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "line_id": {
            "type": "string"
          },
          "sku": {
            "type": "string"
          },
          "quantity": {
            "type": "integer",
            "description": "Units picked now. Not past what is still to pick on the line."
          }
        },
        "required": [
          "quantity"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "id",
    "lines"
  ],
  "additionalProperties": false
}
unpick_sales_order Required: id.
unpick_sales_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The sales order's id. With no lines, every picked unit is unpicked."
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "line_id": {
            "type": "string"
          },
          "sku": {
            "type": "string"
          },
          "quantity": {
            "type": "integer",
            "description": "Units to return to unpicked. Not past what is picked on the line."
          }
        },
        "required": [
          "quantity"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
ship_sales_order Required: id.
ship_sales_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The sales order's id. Without only_picked, the whole order ships."
    },
    "only_picked": {
      "type": "boolean"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
close_sales_order Required: id.
close_sales_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The sales order's id. What is still open on it is closed and its reserved stock freed."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
raise_invoice Required: sales_order_id.
raise_invoice input schema (JSON)
{
  "type": "object",
  "properties": {
    "sales_order_id": {
      "type": "string",
      "description": "The sales order's id. The invoice bills what has shipped and is not yet invoiced."
    }
  },
  "required": [
    "sales_order_id"
  ],
  "additionalProperties": false
}
mark_invoice_paid Required: id.
mark_invoice_paid input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The invoice's id."
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false
}
list_returns No required arguments.
list_returns input schema (JSON)
{
  "type": "object",
  "properties": {
    "sales_order_id": {
      "type": "string",
      "description": "Only the returns against this sales order."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
list_credit_notes No required arguments.
list_credit_notes input schema (JSON)
{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "string",
      "description": "Only the credit notes against this invoice."
    },
    "updated_since": {
      "type": "string",
      "description": "Only records changed at or after this date and time, such as 2026-10-28T00:00:00Z."
    },
    "limit": {
      "type": "integer",
      "description": "Up to 250.",
      "minimum": 1,
      "maximum": 250
    },
    "cursor": {
      "type": "string",
      "description": "The next_cursor from the page before."
    }
  },
  "required": [],
  "additionalProperties": false
}
record_return Required: id, lines.
record_return input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The sales order's id."
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "line_id": {
            "type": "string"
          },
          "sku": {
            "type": "string"
          },
          "quantity": {
            "type": "integer",
            "description": "Units returned. Not past what shipped on the line, less what already came back."
          },
          "disposition": {
            "type": "string",
            "enum": [
              "restock",
              "write_off"
            ]
          },
          "location_id": {
            "type": "string",
            "description": "Where restocked units go; the order's ship-from location when left out."
          },
          "reason": {
            "type": "string",
            "description": "Why units are written off; required for write_off."
          }
        },
        "required": [
          "quantity",
          "disposition"
        ],
        "additionalProperties": false
      }
    },
    "note": {
      "type": "string"
    }
  },
  "required": [
    "id",
    "lines"
  ],
  "additionalProperties": false
}
raise_credit_note Required: invoice_id.
raise_credit_note input schema (JSON)
{
  "type": "object",
  "properties": {
    "invoice_id": {
      "type": "string",
      "description": "The invoice's id. Give return_id or amount, one of the two."
    },
    "return_id": {
      "type": "string",
      "description": "Credit the units on this return that the invoice billed, at its prices and tax."
    },
    "amount": {
      "type": "string",
      "pattern": "^-?\\d+\\.\\d{2}$",
      "description": "A decimal amount, two places."
    },
    "reason": {
      "type": "string"
    }
  },
  "required": [
    "invoice_id"
  ],
  "additionalProperties": false
}
create_purchase_order Required: supplier_id, location_id, lines.
create_purchase_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "supplier_id": {
      "type": "string"
    },
    "location_id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "sent"
      ]
    },
    "expected_date": {
      "type": "string"
    },
    "supplier_reference": {
      "type": "string"
    },
    "notes": {
      "type": "string"
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "variant_id": {
            "type": "string"
          },
          "sku": {
            "type": "string"
          },
          "quantity": {
            "type": "integer"
          },
          "unit_cost": {
            "type": "string",
            "pattern": "^-?\\d+\\.\\d{2}$",
            "description": "A decimal amount, two places."
          }
        },
        "required": [
          "quantity"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "supplier_id",
    "location_id",
    "lines"
  ],
  "additionalProperties": false
}
receive_purchase_order Required: id, lines.
receive_purchase_order input schema (JSON)
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The purchase order's id."
    },
    "location_id": {
      "type": "string"
    },
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "line_id": {
            "type": "string"
          },
          "sku": {
            "type": "string"
          },
          "quantity": {
            "type": "integer"
          }
        },
        "required": [
          "quantity"
        ],
        "additionalProperties": false
      }
    },
    "costs": {
      "type": "object",
      "properties": {
        "freight": {
          "type": "string",
          "pattern": "^-?\\d+\\.\\d{2}$",
          "description": "A decimal amount, two places."
        },
        "duty": {
          "type": "string",
          "pattern": "^-?\\d+\\.\\d{2}$",
          "description": "A decimal amount, two places."
        },
        "other": {
          "type": "string",
          "pattern": "^-?\\d+\\.\\d{2}$",
          "description": "A decimal amount, two places."
        }
      },
      "required": [],
      "additionalProperties": false
    },
    "spread_by": {
      "type": "string",
      "enum": [
        "value",
        "quantity"
      ]
    },
    "allow_over_delivery": {
      "type": "boolean",
      "description": "True to receive more than a line still needs. Left out, an over-delivery is refused with 422."
    }
  },
  "required": [
    "id",
    "lines"
  ],
  "additionalProperties": false
}

Connect an assistant to the MCP server

Add the server URL and a key.

Any assistant that supports remote MCP servers over HTTP, such as Claude, takes the same two settings.

  1. Create a key in workspace settings, read only or read and write.
  2. Add a remote MCP server with the URL below.
  3. Send the key as a Bearer token in the Authorization header.
  4. In the demo, use the key shown in Settings, under API keys.
Server URL
https://slatestock.com/api/mcp
Client settings (JSON)
{
  "mcpServers": {
    "slatestock": {
      "type": "http",
      "url": "https://slatestock.com/api/mcp",
      "headers": {
        "Authorization": "Bearer wsk_example_4f7c2a9d1e8b6035"
      }
    }
  }
}

MCP server example

Ask in your own words.

The assistant picks the tool for each question and calls the API with your key.

  • How many LTT-SGE do we have at each location?
  • Move 20 LTT-OAT from the Main warehouse to the Downtown shop.
  • Which purchase orders from Example Linen Mill are still open?
  • Set the price of LTT-SGE to 9.75 and give it a new barcode.
  • Ship Fictional Design Studio's open order and raise the invoice.
  • What was our stock worth at the end of September?

Inventory management API pricing

The API, webhooks and the MCP server come with every plan.