CXT Software MCP by usefulapi
Track and search CXT courier orders, check drivers, propose and save order and route plans.
Should I use this
Quality & Safety
Findings (5)
- HIGHin cxt_get_planning_limits
- HIGH
- MEDIUMin cxt_get_planning_limits
- MEDIUMin cxt_validate_drivers
- INFOin cxt_get_planning_limits
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": {
"cxt-software": {
"url": "https://cxt-software.usefulapi.io/mcp"
}
}
}Remote endpoints
https://cxt-software.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (14)
🟢cxt_track_shipments(tracking_numbers, include_partial_match, begin_date, end_date, page_num, ...)
Track orders and route stops by tracking number: matches a parcel reference, a parcel item barcode, or Reference1/Reference2 of an order or route stop. Returns shipment summaries with status events and proof of delivery as far as the caller's permissions allow: an INET login sees the most detail; with an Operations App login this endpoint is called without credentials (CXT lists only internet users and anonymous callers for it), which returns the limited public tracking view. Costs 1 API credit with the vendor. POST /v2/Shipments/Summaries.
Input Schema
{
"type": "object",
"properties": {
"tracking_numbers": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"description": "Tracking numbers, references or barcodes (1-50)."
},
"include_partial_match": {
"description": "Also return partial matches (default false).",
"type": "boolean"
},
"begin_date": {
"type": "string",
"description": "A date (2026-10-01) or an ISO 8601 date-time with a timezone, e.g. 2026-10-01T08:00:00Z."
},
"end_date": {
"type": "string",
"description": "A date (2026-10-01) or an ISO 8601 date-time with a timezone, e.g. 2026-10-01T08:00:00Z."
},
"page_num": {
"description": "CXT's pageNum, documented as 'the offset for the records to return' (default 0). When has_more is true, ask for the next records and check the new page does not repeat the previous one (if it does, pageNum counts records: use a multiple of page_size).",
"type": "integer",
"minimum": 0,
"maximum": 10000000
},
"page_size": {
"description": "Results per page, 1-1000 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
}
},
"required": [
"tracking_numbers"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_search_shipments(tracking_type, search_criteria, include_partial_match, begin_date, end_date, ...)
Search orders and route stops by place, address, city, state, postal code, order template, or only by date range. tracking_type says which field search_criteria is matched against: Location (origin/destination or stop name), Address, City, State, Postal (zip or zip+4), Template (order template name), Tracking (references/barcodes) or DateOnly (no criteria: everything between begin_date and end_date). Returns shipment summaries, up to 1000 per page. An INET login sees the most detail; with an Operations App login this endpoint is called without credentials (CXT lists only internet users and anonymous callers for it), so the view is limited. Costs 1 API credit with the vendor. POST /v2/Shipments/Summaries.
Input Schema
{
"type": "object",
"properties": {
"tracking_type": {
"type": "string",
"enum": [
"Location",
"Address",
"City",
"State",
"Postal",
"Template",
"Tracking",
"DateOnly"
],
"description": "Which field search_criteria matches."
},
"search_criteria": {
"description": "Values to match (omit for DateOnly).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"include_partial_match": {
"description": "Also return partial matches (default false).",
"type": "boolean"
},
"begin_date": {
"type": "string",
"description": "A date (2026-10-01) or an ISO 8601 date-time with a timezone, e.g. 2026-10-01T08:00:00Z."
},
"end_date": {
"type": "string",
"description": "A date (2026-10-01) or an ISO 8601 date-time with a timezone, e.g. 2026-10-01T08:00:00Z."
},
"page_num": {
"description": "CXT's pageNum, documented as 'the offset for the records to return' (default 0). When has_more is true, ask for the next records and check the new page does not repeat the previous one (if it does, pageNum counts records: use a multiple of page_size).",
"type": "integer",
"minimum": 0,
"maximum": 10000000
},
"page_size": {
"description": "Results per page, 1-1000 (default 50).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
}
},
"required": [
"tracking_type"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_list_recent_orders(count)
The most recent orders of the signed-in INTERNET user (user type INET; the orders of their account). Costs 1 API credit with the vendor. POST /v2/Shipments/Summaries with numRecentOrders.
Input Schema
{
"type": "object",
"properties": {
"count": {
"description": "How many recent orders, 1-1000 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_get_order(order_id, include_itemized_charges)
One on-demand order with its status, confirmation, pickup, delivery and proof-of-delivery details, as an INTERNET user sees it (sign in with user type INET). Optionally with the itemized charges. Operations App users should use cxt_get_dispatch_order. Costs 1 API credit with the vendor. GET /v2/Orders/{orderId}/{includeItemizedCharges}.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "CXT order id."
},
"include_itemized_charges": {
"description": "Include the itemized charges (default false).",
"type": "boolean"
}
},
"required": [
"order_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_get_dispatch_order(order_id)
One on-demand order with itemized charges, as an OPERATIONS APP (X Dispatch) user sees it (sign in with user type XDISPATCH): addresses, times, driver, status events, proof of delivery. Costs 1 API credit with the vendor. GET /v2/Dispatch/Orders/{onDemandOrderId}.
Input Schema
{
"type": "object",
"properties": {
"order_id": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "CXT on-demand order id."
}
},
"required": [
"order_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_get_planning_limits
The itinerary planning limits of this X Dispatch system: maxAllowedStops (shipments x 2), maxAllowedLocations and maxAllowedPlaceholders. Needs an Operations App user with the ITINERARY_PLANNING_ACCESS permission. GET /v3/ItineraryPlanning/Settings.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_validate_drivers(driver_ids)
Check whether drivers are available to be planned: for each driver id, vehicle violations (for example an expired inspection) and HR violations (for example not scheduled), each with isBypassable. Changes nothing. Needs ITINERARY_PLANNING_ACCESS. POST /v3/ItineraryPlanning/Orders/Drivers/Validate.
Input Schema
{
"type": "object",
"properties": {
"driver_ids": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "Driver ids to check."
}
},
"required": [
"driver_ids"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_validate_driver_for_orders(driver_id, order_ids)
Check one driver against specific orders: vehicle violations, HR violations and capability violations (for example Hazmat or Lift Gate that the driver lacks). Changes nothing. Needs ITINERARY_PLANNING_ACCESS. POST /v3/ItineraryPlanning/Orders/Drivers/{driverId}/Validate.
Input Schema
{
"type": "object",
"properties": {
"driver_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Driver id."
},
"order_ids": {
"minItems": 1,
"maxItems": 3000,
"type": "array",
"items": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "Order ids to check the driver against."
}
},
"required": [
"driver_id",
"order_ids"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_plan_orders(order_ids, driver_ids, start_time, end_time, num_placeholders, ...)
Generate a proposed itinerary that assigns on-demand orders to drivers (pickup and delivery stops in sequence, with times, distance and unassigned stops). This only PROPOSES a plan: nothing is dispatched until cxt_save_order_plan is called. Needs ITINERARY_PLANNING_ACCESS. Check the limits with cxt_get_planning_limits first. POST /v3/ItineraryPlanning/Orders.
Input Schema
{
"type": "object",
"properties": {
"order_ids": {
"minItems": 1,
"maxItems": 1500,
"type": "array",
"items": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "Order ids to plan."
},
"driver_ids": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "Driver ids to plan onto."
},
"start_time": {
"type": "string",
"description": "Planning window start, local time, e.g. 2026-10-01T08:00:00."
},
"end_time": {
"type": "string",
"description": "Planning window end, local time, e.g. 2026-10-01T18:00:00."
},
"num_placeholders": {
"description": "Virtual placeholder drivers (0-1000).",
"type": "integer",
"minimum": 0,
"maximum": 1000
},
"max_orders_per_driver": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 10000
},
"goal": {
"description": "Optimization goal (default QUICKEST_ROUTE).",
"type": "string",
"enum": [
"QUICKEST_ROUTE",
"SHORTEST_DISTANCE"
]
},
"enhanced_routing": {
"description": "Enhanced routing (default OFF).",
"type": "string",
"enum": [
"OFF",
"ON"
]
}
},
"required": [
"order_ids",
"driver_ids",
"start_time",
"end_time"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_optimize_order_plan(driver_id, is_placeholder, plan_order_ids, all_input_order_ids, start_time, ...)
Re-optimize a single driver's plan after manual changes (proposal only: nothing is dispatched until cxt_save_order_plan). Needs ITINERARY_PLANNING_ACCESS. POST /v3/ItineraryPlanning/Orders/Optimize.
Input Schema
{
"type": "object",
"properties": {
"driver_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Driver id (or the placeholder's id when is_placeholder)."
},
"is_placeholder": {
"description": "The driver is a placeholder.",
"type": "boolean"
},
"plan_order_ids": {
"maxItems": 3000,
"type": "array",
"items": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "Orders currently in this driver's plan."
},
"all_input_order_ids": {
"maxItems": 3000,
"type": "array",
"items": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"description": "All orders in the planning run."
},
"start_time": {
"type": "string",
"description": "Local date-time without timezone, e.g. 2026-10-01T08:00:00."
},
"end_time": {
"type": "string",
"description": "Local date-time without timezone, e.g. 2026-10-01T08:00:00."
},
"goal": {
"description": "Optimization goal (default QUICKEST_ROUTE).",
"type": "string",
"enum": [
"QUICKEST_ROUTE",
"SHORTEST_DISTANCE"
]
},
"enhanced_routing": {
"description": "Enhanced routing (default OFF).",
"type": "string",
"enum": [
"OFF",
"ON"
]
}
},
"required": [
"driver_id",
"plan_order_ids",
"all_input_order_ids",
"start_time",
"end_time"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_plan_routes(post_date, input_route_ids, output_route_ids, start_time, end_time, ...)
Generate a proposed re-sequencing of the stops of existing routes for one route date (stops move between the output routes, with times, distance and unassigned stops). Proposal only: nothing changes until cxt_save_route_plan is called. Needs ITINERARY_PLANNING_ACCESS. POST /v3/ItineraryPlanning/Routes/{postDate}.
Input Schema
{
"type": "object",
"properties": {
"post_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Route date, yyyy-mm-dd."
},
"input_route_ids": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"description": "Route ids to take stops from."
},
"output_route_ids": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"description": "Route ids to assign stops to."
},
"start_time": {
"type": "string",
"description": "Local date-time without timezone, e.g. 2026-10-01T08:00:00."
},
"end_time": {
"type": "string",
"description": "Local date-time without timezone, e.g. 2026-10-01T08:00:00."
},
"num_placeholders": {
"type": "integer",
"minimum": 0,
"maximum": 1000
},
"max_stops_per_route": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 10000
},
"excluded_stop_ids": {
"description": "Stop ids to leave out of planning.",
"maxItems": 5000,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"service_time_per_stop": {
"description": "Service time per stop, minutes.",
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"grace_period_per_stop": {
"description": "Grace period per stop, minutes.",
"type": "integer",
"minimum": 0,
"maximum": 1440
},
"goal": {
"description": "Optimization goal (default QUICKEST_ROUTE).",
"type": "string",
"enum": [
"QUICKEST_ROUTE",
"SHORTEST_DISTANCE"
]
},
"enhanced_routing": {
"description": "Enhanced routing (default OFF).",
"type": "string",
"enum": [
"OFF",
"ON"
]
}
},
"required": [
"post_date",
"input_route_ids",
"output_route_ids",
"start_time",
"end_time"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢cxt_optimize_route_plan(post_date, route_id, is_placeholder, plan_stop_ids, input_route_ids, ...)
Re-optimize a single route after manual changes (proposal only: nothing changes until cxt_save_route_plan). Needs ITINERARY_PLANNING_ACCESS. POST /v3/ItineraryPlanning/Routes/{postDate}/Optimize.
Input Schema
{
"type": "object",
"properties": {
"post_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Route date, yyyy-mm-dd."
},
"route_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Route to optimize."
},
"is_placeholder": {
"type": "boolean"
},
"plan_stop_ids": {
"description": "Stops currently assigned to this route.",
"maxItems": 5000,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"input_route_ids": {
"description": "Source routes for stops.",
"maxItems": 500,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"excluded_stop_ids": {
"maxItems": 5000,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"start_time": {
"type": "string",
"description": "Local date-time without timezone, e.g. 2026-10-01T08:00:00."
},
"end_time": {
"type": "string",
"description": "Local date-time without timezone, e.g. 2026-10-01T08:00:00."
},
"is_batch_call": {
"description": "Batch optimization (default false).",
"type": "boolean"
},
"goal": {
"description": "Optimization goal (default QUICKEST_ROUTE).",
"type": "string",
"enum": [
"QUICKEST_ROUTE",
"SHORTEST_DISTANCE"
]
},
"enhanced_routing": {
"description": "Enhanced routing (default OFF).",
"type": "string",
"enum": [
"OFF",
"ON"
]
}
},
"required": [
"post_date",
"route_id",
"start_time",
"end_time"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴cxt_save_order_plan(plans, driver_pay_locked_status, confirm)
COMMIT an order plan: assigns the orders to the drivers and DISPATCHES them (drivers receive the work in the driver app; customers may be notified by the system's own status rules). Use only after the user has seen and approved the plan from cxt_plan_orders / cxt_optimize_order_plan. Pass each driver's stops from the plan reply: id, type (PICKUP or DELIVERY), sequence and from (the scheduled time). Response is empty on success (204). Needs ITINERARY_PLANNING_ACCESS. POST /v3/ItineraryPlanning/Orders/Save.
Input Schema
{
"type": "object",
"properties": {
"plans": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"driverId": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"stops": {
"minItems": 1,
"maxItems": 6000,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Order id."
},
"type": {
"type": "string",
"enum": [
"PICKUP",
"DELIVERY"
]
},
"sequence": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"from": {
"type": "object",
"properties": {
"timeStamp": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "number"
}
]
}
},
"required": [
"timeStamp"
],
"additionalProperties": {},
"description": "Scheduled arrival: copy `from` from the plan reply, or {timeStamp: '2026-10-01T08:30:00'}."
},
"isNew": {
"description": "Whether this is a new assignment.",
"type": "boolean"
}
},
"required": [
"id",
"type",
"sequence",
"from"
]
}
}
},
"required": [
"driverId",
"stops"
]
}
},
"driver_pay_locked_status": {
"description": "What to do with already locked driver pay: KEEP_LOCKED_AND_DISPATCH or UNLOCK_AND_DISPATCH.",
"type": "string",
"enum": [
"KEEP_LOCKED_AND_DISPATCH",
"UNLOCK_AND_DISPATCH"
]
},
"confirm": {
"type": "boolean",
"const": true,
"description": "Must be true: the user approved this plan and wants it dispatched to the drivers now."
}
},
"required": [
"plans",
"confirm"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴cxt_save_route_plan(post_date, plans, driver_pay_locked_status, confirm)
COMMIT a route plan for one route date: moves and re-sequences route stops as in the plan and DISPATCHES the changed routes to drivers. Use only after the user has seen and approved the plan from cxt_plan_routes / cxt_optimize_route_plan. Pass each route's stops from the plan reply: id, sequence and from (the scheduled time). Response is empty on success (204). Needs ITINERARY_PLANNING_ACCESS. POST /v3/ItineraryPlanning/Routes/{postDate}/Save.
Input Schema
{
"type": "object",
"properties": {
"post_date": {
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$",
"description": "Route date, yyyy-mm-dd."
},
"plans": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"routeId": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"stops": {
"minItems": 1,
"maxItems": 6000,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Route stop id."
},
"sequence": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100000
},
"from": {
"type": "object",
"properties": {
"timeStamp": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 64
},
{
"type": "number"
}
]
}
},
"required": [
"timeStamp"
],
"additionalProperties": {},
"description": "Scheduled arrival: copy `from` from the plan reply, or {timeStamp: '2026-10-01T08:30:00'}."
},
"isNew": {
"type": "boolean"
}
},
"required": [
"id",
"sequence",
"from"
]
}
}
},
"required": [
"routeId",
"stops"
]
}
},
"driver_pay_locked_status": {
"description": "What to do with already locked driver pay: KEEP_LOCKED_AND_DISPATCH or UNLOCK_AND_DISPATCH.",
"type": "string",
"enum": [
"KEEP_LOCKED_AND_DISPATCH",
"UNLOCK_AND_DISPATCH"
]
},
"confirm": {
"type": "boolean",
"const": true,
"description": "Must be true: the user approved this plan and wants it dispatched to the drivers now."
}
},
"required": [
"post_date",
"plans",
"confirm"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence