Extensiv MCP by usefulapi
Read Extensiv warehouse records, create outbound orders and cancel eligible orders.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"extensiv": {
"url": "https://extensiv.usefulapi.io/mcp"
}
}
}Remote endpoints
https://extensiv.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (16)
🟢extensiv_list_facilities
List the warehouse's facilities with their ids and properties (facility ids are needed for orders, stock details and receivers). GET /properties/facilities.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_carriers
List the carriers with their shipment services (modes) and billing codes, the values an order's routingInfo and billingCode must use. GET /properties/carriers.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_customers(rql, sort, pgsiz, pgnum)
List the warehouse's customers (the companies whose goods it stores), with their customer ids. GET /customers.
Input Schema
{
"type": "object",
"properties": {
"rql": {
"description": "Optional RQL filter, for example `ReadOnly.CustomerIdentifier.id==1` or `readonly.processDate=gt=2026-10-01T00:00:00;readonly.processDate=lt=2026-10-02T00:00:00` (';' = and).",
"type": "string",
"maxLength": 1000
},
"sort": {
"description": "Optional sort expression, for example `ReadOnly.CreationDate`.",
"type": "string",
"maxLength": 200
},
"pgsiz": {
"description": "Page size (default 100, max 500).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pgnum": {
"description": "Page number, from 1 (default 1). Use totalResults and _links.next of the previous reply.",
"type": "integer",
"minimum": 1,
"maximum": 100000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_get_customer(customer_id)
One customer by customer id: company info, contacts and settings. GET /customers/{customer_id}.
Input Schema
{
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The customer id (from extensiv_list_customers)."
}
},
"required": [
"customer_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_items(customer_id, rql, sort, pgsiz, pgnum)
List the items (SKUs) of one customer, with item ids, descriptions and units. Filter with rql, for example `sku==ABC-1`. GET /customers/{customer_id}/items.
Input Schema
{
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The customer id (from extensiv_list_customers)."
},
"rql": {
"description": "Optional RQL filter, for example `ReadOnly.CustomerIdentifier.id==1` or `readonly.processDate=gt=2026-10-01T00:00:00;readonly.processDate=lt=2026-10-02T00:00:00` (';' = and).",
"type": "string",
"maxLength": 1000
},
"sort": {
"description": "Optional sort expression, for example `ReadOnly.CreationDate`.",
"type": "string",
"maxLength": 200
},
"pgsiz": {
"description": "Page size (default 100, max 500).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pgnum": {
"description": "Page number, from 1 (default 1). Use totalResults and _links.next of the previous reply.",
"type": "integer",
"minimum": 1,
"maximum": 100000
}
},
"required": [
"customer_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_orders(rql, detail, itemdetail, sort, pgsiz, ...)
List outbound orders matching an RQL filter, for example `ReadOnly.CustomerIdentifier.id==1` or `readonly.processDate=gt=2026-10-01T00:00:00` (orders closed after that time). Use detail=OrderItems to include the line items. Orders carry the ship-to name, address and contact details (personal data). GET /orders.
Input Schema
{
"type": "object",
"properties": {
"rql": {
"description": "Optional RQL filter, for example `ReadOnly.CustomerIdentifier.id==1` or `readonly.processDate=gt=2026-10-01T00:00:00;readonly.processDate=lt=2026-10-02T00:00:00` (';' = and).",
"type": "string",
"maxLength": 1000
},
"detail": {
"description": "Order-level detail, comma-delimited: None (default), OrderItems, BillingDetails, SavedElements, Packages, Contacts, ProposedBilling, OutboundSerialNumbers, SmallParcel, All.",
"type": "string",
"pattern": "^(none|orderitems|billingdetails|savedelements|packages|contacts|proposedbilling|outboundserialnumbers|smallparcel|all)(,(none|orderitems|billingdetails|savedelements|packages|contacts|proposedbilling|outboundserialnumbers|smallparcel|all))*$"
},
"itemdetail": {
"description": "Item-level detail, comma-delimited: None (default), SavedElements, Allocations, AllocationsWithDetail, All.",
"type": "string",
"pattern": "^(none|savedelements|allocations|allocationswithdetail|all)(,(none|savedelements|allocations|allocationswithdetail|all))*$"
},
"sort": {
"description": "Optional sort expression, for example `ReadOnly.CreationDate`.",
"type": "string",
"maxLength": 200
},
"pgsiz": {
"description": "Page size (default 100, max 500).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pgnum": {
"description": "Page number, from 1 (default 1). Use totalResults and _links.next of the previous reply.",
"type": "integer",
"minimum": 1,
"maximum": 100000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_get_order(order_id, detail, itemdetail)
One order by its transaction id (the order id from extensiv_list_orders): status, ship-to, routing, and with detail=OrderItems the lines. GET /orders/{transaction_id}.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The order's transaction id."
},
"detail": {
"description": "Order-level detail, comma-delimited: None (default), OrderItems, BillingDetails, SavedElements, Packages, Contacts, ProposedBilling, OutboundSerialNumbers, SmallParcel, All.",
"type": "string",
"pattern": "^(none|orderitems|billingdetails|savedelements|packages|contacts|proposedbilling|outboundserialnumbers|smallparcel|all)(,(none|orderitems|billingdetails|savedelements|packages|contacts|proposedbilling|outboundserialnumbers|smallparcel|all))*$"
},
"itemdetail": {
"description": "Item-level detail, comma-delimited: None (default), SavedElements, Allocations, AllocationsWithDetail, All.",
"type": "string",
"pattern": "^(none|savedelements|allocations|allocationswithdetail|all)(,(none|savedelements|allocations|allocationswithdetail|all))*$"
}
},
"required": [
"order_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_stock_summaries(rql, pgsiz, pgnum)
Inventory totals per item and facility (on hand, allocated, available). Filter with rql, for example `ItemId==123` or a customer filter. GET /inventory/stocksummaries.
Input Schema
{
"type": "object",
"properties": {
"rql": {
"description": "Optional RQL filter, for example `ReadOnly.CustomerIdentifier.id==1` or `readonly.processDate=gt=2026-10-01T00:00:00;readonly.processDate=lt=2026-10-02T00:00:00` (';' = and).",
"type": "string",
"maxLength": 1000
},
"pgsiz": {
"description": "Page size (default 100, max 500).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pgnum": {
"description": "Page number, from 1 (default 1). Use totalResults and _links.next of the previous reply.",
"type": "integer",
"minimum": 1,
"maximum": 100000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_inventory(rql, pgsiz, pgnum)
Inventory detail lines (location, lot, quantities). Filter with rql, for example `itemIdentifier.sku==SF-Box-DG`. GET /inventory.
Input Schema
{
"type": "object",
"properties": {
"rql": {
"description": "Optional RQL filter, for example `ReadOnly.CustomerIdentifier.id==1` or `readonly.processDate=gt=2026-10-01T00:00:00;readonly.processDate=lt=2026-10-02T00:00:00` (';' = and).",
"type": "string",
"maxLength": 1000
},
"pgsiz": {
"description": "Page size (default 100, max 500).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pgnum": {
"description": "Page number, from 1 (default 1). Use totalResults and _links.next of the previous reply.",
"type": "integer",
"minimum": 1,
"maximum": 100000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_stock_details(customer_id, facility_id, pgsiz, pgnum)
All inventory of one customer in one facility, broken out by receive item (lot number, serial number and other track-by values). Both ids are required. GET /inventory/stockdetails.
Input Schema
{
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The customer id."
},
"facility_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The facility id (from extensiv_list_facilities)."
},
"pgsiz": {
"description": "Page size (default 100, max 500).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pgnum": {
"description": "Page number, from 1 (default 1). Use totalResults and _links.next of the previous reply.",
"type": "integer",
"minimum": 1,
"maximum": 100000
}
},
"required": [
"customer_id",
"facility_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_receivers(rql, detail, itemdetail, pgsiz, pgnum)
List inbound receivers (receipts of goods), for example `ReadOnly.CustomerIdentifier.id==1`. Use detail=ReceiveItems for the lines. GET /inventory/receivers.
Input Schema
{
"type": "object",
"properties": {
"rql": {
"description": "Optional RQL filter, for example `ReadOnly.CustomerIdentifier.id==1` or `readonly.processDate=gt=2026-10-01T00:00:00;readonly.processDate=lt=2026-10-02T00:00:00` (';' = and).",
"type": "string",
"maxLength": 1000
},
"detail": {
"description": "Receiver-level detail, comma-delimited: None (default), ReceiveItems, BillingDetails, SavedElements, ProposedBilling, All.",
"type": "string",
"pattern": "^(none|receiveitems|billingdetails|savedelements|proposedbilling|all)(,(none|receiveitems|billingdetails|savedelements|proposedbilling|all))*$"
},
"itemdetail": {
"description": "Item-level detail, comma-delimited: None (default), SavedElements, All.",
"type": "string",
"pattern": "^(none|savedelements|all)(,(none|savedelements|all))*$"
},
"pgsiz": {
"description": "Page size (default 100, max 500).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pgnum": {
"description": "Page number, from 1 (default 1). Use totalResults and _links.next of the previous reply.",
"type": "integer",
"minimum": 1,
"maximum": 100000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_get_receiver(receiver_id)
One receiver by its transaction id. GET /inventory/receivers/{transaction_id}.
Input Schema
{
"type": "object",
"properties": {
"receiver_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The receiver's transaction id (from extensiv_list_receivers)."
}
},
"required": [
"receiver_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_receiver_items(receiver_id, detail)
The line items of one receiver, with item details. GET /inventory/receivers/{transaction_id}/items.
Input Schema
{
"type": "object",
"properties": {
"receiver_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The receiver's transaction id (from extensiv_list_receivers)."
},
"detail": {
"description": "Detail level, comma-delimited: None (default), SavedElements, All.",
"type": "string",
"pattern": "^(none|savedelements|all)(,(none|savedelements|all))*$"
}
},
"required": [
"receiver_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢extensiv_list_purchase_orders(rql, sort, pgsiz, pgnum)
List inbound purchase orders per customer. Filter with rql, sort with sort. GET /inventory/pos.
Input Schema
{
"type": "object",
"properties": {
"rql": {
"description": "Optional RQL filter, for example `ReadOnly.CustomerIdentifier.id==1` or `readonly.processDate=gt=2026-10-01T00:00:00;readonly.processDate=lt=2026-10-02T00:00:00` (';' = and).",
"type": "string",
"maxLength": 1000
},
"sort": {
"description": "Optional sort expression, for example `ReadOnly.CreationDate`.",
"type": "string",
"maxLength": 200
},
"pgsiz": {
"description": "Page size (default 100, max 500).",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"pgnum": {
"description": "Page number, from 1 (default 1). Use totalResults and _links.next of the previous reply.",
"type": "integer",
"minimum": 1,
"maximum": 100000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡extensiv_create_order(customer_id, facility_id, reference_num, ship_to, items, ...)
WRITE: submit a new outbound order for a customer and facility (the warehouse will pick and ship it). Not idempotent: calling twice creates two orders, so check extensiv_list_orders for the reference_num first. Needs ids from extensiv_list_customers, extensiv_list_facilities and SKUs from extensiv_list_items; billing_code, carrier and mode are required by Extensiv and must come from extensiv_list_carriers. POST /orders.
Input Schema
{
"type": "object",
"properties": {
"customer_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The customer id the order is for."
},
"facility_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The facility id that fulfils it."
},
"reference_num": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Your reference number for the order (for example a PO or web-shop order number)."
},
"ship_to": {
"type": "object",
"properties": {
"company_name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"address1": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"address2": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"state": {
"description": "State or province code, for example CA.",
"type": "string",
"minLength": 1,
"maxLength": 50
},
"zip": {
"type": "string",
"minLength": 1,
"maxLength": 30
},
"country": {
"type": "string",
"minLength": 1,
"maxLength": 2,
"description": "Two-letter country code, for example US."
},
"email_address": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"phone_number": {
"type": "string",
"minLength": 1,
"maxLength": 50
}
},
"required": [
"name",
"address1",
"city",
"country"
],
"description": "The ship-to address."
},
"items": {
"minItems": 1,
"maxItems": 200,
"type": "array",
"items": {
"type": "object",
"properties": {
"sku": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "The item SKU."
},
"qty": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 1000000
}
},
"required": [
"sku",
"qty"
]
},
"description": "The order lines."
},
"notes": {
"description": "Warehouse instructions.",
"type": "string",
"minLength": 1,
"maxLength": 1000
},
"shipping_notes": {
"description": "Carrier-specific shipping instructions.",
"type": "string",
"minLength": 1,
"maxLength": 1000
},
"billing_code": {
"type": "string",
"minLength": 1,
"maxLength": 50,
"description": "Freight billing code as listed for the carrier by extensiv_list_carriers (billingCodes), for example Prepaid or BillThirdParty."
},
"carrier": {
"type": "string",
"minLength": 1,
"maxLength": 50,
"description": "Carrier name, for example UPS (from extensiv_list_carriers)."
},
"mode": {
"type": "string",
"minLength": 1,
"maxLength": 50,
"description": "The carrier's service mode code (from extensiv_list_carriers)."
},
"account": {
"description": "The shipper account number for third-party or collect billing.",
"type": "string",
"minLength": 1,
"maxLength": 50
}
},
"required": [
"customer_id",
"facility_id",
"reference_num",
"ship_to",
"items",
"billing_code",
"carrier",
"mode"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴extensiv_cancel_order(order_id, reason, charge)
WRITE: cancel one order by transaction id, with a reason and an optional cancellation fee. This cannot be undone; the order must be in a state the warehouse can still cancel (otherwise Extensiv answers with an error). The tool first reads the order to get the ETag Extensiv requires (If-Match). POST /orders/{transaction_id}/canceler.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "string",
"pattern": "^[0-9]{1,12}$",
"description": "The order's transaction id (from extensiv_list_orders)."
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "Why the order is cancelled."
},
"charge": {
"description": "Cancellation fee to bill, 0 (default) if none.",
"type": "number",
"minimum": 0,
"maximum": 1000000
}
},
"required": [
"order_id",
"reason"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence