Demand forecasts, reorder points, order quantities and inventory health for Shopify stores.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when someone asks how many units to order, given demand, lead time, stock on hand and on order, and supplier rules such as MOQ, case pack or a minimum order value. Sizes the line the way Forthcast sizes a purchase-order line and lists every rule that changed the quantity. Works without a connected store.
Units available now.
Supplier lead time in days.
Supplier minimum order quantity for this item.
Units already on open purchase orders.
Units per case; quantity is rounded up to whole cases.
Purchase cost per unit.
Daily units sold, oldest first, 14 to 365 values.
Target in-stock probability, 0.50 to 0.99.
Supplier minimum order value in currency; needs unit_cost.
Standard deviation of daily demand, if known.
Optional explicit days of cover to buy instead of the default weeks-of-supply target.
Average units sold per day, if no daily history.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http inventory https://app.forthcast.io/mcp
Use this when someone asks how many units to order, given demand, lead time, stock on hand and on order, and supplier rules such as MOQ, case pack or a minimum order value. Sizes the line the way Forthcast sizes a purchase-order line and lists every rule that changed the quantity. Works without a connected store.
| Argument | Type | Description |
|---|---|---|
| moq | any | Supplier minimum order quantity for this item. |
| on_hand* | number | Units available now. |
| on_order | number | Units already on open purchase orders. |
| case_pack | any | Units per case; quantity is rounded up to whole cases. |
| unit_cost | any | Purchase cost per unit. |
| daily_demand | any | Daily units sold, oldest first, 14 to 365 values. |
| service_level | number | Target in-stock probability, 0.50 to 0.99. |
| lead_time_days* | integer | Supplier lead time in days. |
| min_order_value | any | Supplier minimum order value in currency; needs unit_cost. |
| demand_std_daily | any | Standard deviation of daily demand, if known. |
| cover_days_target | any | Optional explicit days of cover to buy instead of the default weeks-of-supply target. |
| average_daily_demand | any | Average units sold per day, if no daily history. |
{
"type": "object",
"title": "calculate_order_quantityArguments",
"required": [
"lead_time_days",
"on_hand"
],
"properties": {
"moq": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Moq",
"default": null,
"description": "Supplier minimum order quantity for this item."
},
"on_hand": {
"type": "number",
"title": "On Hand",
"description": "Units available now."
},
"on_order": {
"type": "number",
"title": "On Order",
"default": 0,
"minimum": 0,
"description": "Units already on open purchase orders."
},
"case_pack": {
"anyOf": [
{
"type": "integer",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Case Pack",
"default": null,
"description": "Units per case; quantity is rounded up to whole cases."
},
"unit_cost": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Unit Cost",
"default": null,
"description": "Purchase cost per unit."
},
"daily_demand": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
},
"maxItems": 365
},
{
"type": "null"
}
],
"title": "Daily Demand",
"default": null,
"description": "Daily units sold, oldest first, 14 to 365 values."
},
"service_level": {
"type": "number",
"title": "Service Level",
"default": 0.95,
"maximum": 99,
"minimum": 0.5,
"description": "Target in-stock probability, 0.50 to 0.99."
},
"lead_time_days": {
"type": "integer",
"title": "Lead Time Days",
"maximum": 730,
"minimum": 1,
"description": "Supplier lead time in days."
},
"min_order_value": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Min Order Value",
"default": null,
"description": "Supplier minimum order value in currency; needs unit_cost."
},
"demand_std_daily": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Demand Std Daily",
"default": null,
"description": "Standard deviation of daily demand, if known."
},
"cover_days_target": {
"anyOf": [
{
"type": "integer",
"maximum": 3000,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Cover Days Target",
"default": null,
"description": "Optional explicit days of cover to buy instead of the default weeks-of-supply target."
},
"average_daily_demand": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Average Daily Demand",
"default": null,
"description": "Average units sold per day, if no daily history."
}
}
}Use this when someone asks how much safety stock to hold or at what stock level to reorder a product. Give a daily demand history (best) or an average daily demand with its variability, plus the supplier lead time and a service level. Returns safety stock, lead-time demand and the reorder point with Forthcast's formula and assumptions. Works without a connected store.
| Argument | Type | Description |
|---|---|---|
| daily_demand | any | Daily units sold, oldest first, 14 to 365 values. |
| service_level | number | Target in-stock probability, 0.50 to 0.99 (95 also accepted). |
| lead_time_days* | integer | Supplier lead time in days. |
| demand_std_daily | any | Standard deviation of daily demand; assumed sqrt(average) when omitted. |
| average_daily_demand | any | Average units sold per day, if no daily history. |
{
"type": "object",
"title": "calculate_reorder_pointArguments",
"required": [
"lead_time_days"
],
"properties": {
"daily_demand": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
},
"maxItems": 365
},
{
"type": "null"
}
],
"title": "Daily Demand",
"default": null,
"description": "Daily units sold, oldest first, 14 to 365 values."
},
"service_level": {
"type": "number",
"title": "Service Level",
"default": 0.95,
"maximum": 99,
"minimum": 0.5,
"description": "Target in-stock probability, 0.50 to 0.99 (95 also accepted)."
},
"lead_time_days": {
"type": "integer",
"title": "Lead Time Days",
"maximum": 730,
"minimum": 1,
"description": "Supplier lead time in days."
},
"demand_std_daily": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Demand Std Daily",
"default": null,
"description": "Standard deviation of daily demand; assumed sqrt(average) when omitted."
},
"average_daily_demand": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Average Daily Demand",
"default": null,
"description": "Average units sold per day, if no daily history."
}
}
}Use this when someone asks what an inventory planning term means or how Forthcast calculates it: safety stock, reorder point, days of cover, urgency bands, service level, ABC class, EOQ, order quantity, fill rate, on-time rate, lead time, intermittent demand. Works without a connected store.
| Argument | Type | Description |
|---|---|---|
| metric* | string | Metric name, for example 'reorder point' or 'days of cover'. |
{
"type": "object",
"title": "explain_inventory_metricArguments",
"required": [
"metric"
],
"properties": {
"metric": {
"type": "string",
"title": "Metric",
"maxLength": 64,
"minLength": 1,
"description": "Metric name, for example 'reorder point' or 'days of cover'."
}
}
}Use this when the merchant wants a bounded list of their items filtered by urgency, assigned supplier, or Shopify vendor, such as all excess items or a supplier's critical SKUs. Requires a connected Forthcast store; the assistant will prompt to sign in.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum items to return. |
| vendor | any | Optional case-insensitive Shopify vendor or brand. |
| urgency | any | Optional Forthcast urgency bucket. |
| supplier | any | Optional case-insensitive assigned supplier name. |
{
"type": "object",
"title": "find_inventory_itemsArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 15,
"maximum": 30,
"minimum": 1,
"description": "Maximum items to return."
},
"vendor": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"title": "Vendor",
"default": null,
"description": "Optional case-insensitive Shopify vendor or brand."
},
"urgency": {
"anyOf": [
{
"enum": [
"critical",
"warning",
"ok",
"excess",
"no-demand"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Urgency",
"default": null,
"description": "Optional Forthcast urgency bucket."
},
"supplier": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"title": "Supplier",
"default": null,
"description": "Optional case-insensitive assigned supplier name."
}
}
}Use this when someone pastes past sales numbers and asks what to expect next month, next quarter or next season. Takes 3 to 365 monthly, weekly or daily totals (oldest first) and returns the next periods with an 80 percent range, the model used (Holt-Winters seasonal, damped trend, Croston for intermittent demand, or moving average) and why. Works without a connected store.
| Argument | Type | Description |
|---|---|---|
| sales* | array | Past sales totals per period, oldest first. |
| period | string | Granularity of the sales list. |
| horizon | integer | Periods to forecast: up to 12 monthly, 26 weekly, 90 daily. |
{
"type": "object",
"title": "forecast_demand_seriesArguments",
"required": [
"sales"
],
"properties": {
"sales": {
"type": "array",
"items": {
"type": "number"
},
"title": "Sales",
"maxItems": 365,
"minItems": 3,
"description": "Past sales totals per period, oldest first."
},
"period": {
"enum": [
"monthly",
"weekly",
"daily"
],
"type": "string",
"title": "Period",
"default": "monthly",
"description": "Granularity of the sales list."
},
"horizon": {
"type": "integer",
"title": "Horizon",
"default": 6,
"maximum": 90,
"minimum": 1,
"description": "Periods to forecast: up to 12 monthly, 26 weekly, 90 daily."
}
}
}Use this when the merchant names an exact SKU and needs its live stock, forecast demand, days of supply, reorder point, suggested quantity, supplier, or open-PO coverage. Requires a connected Forthcast store; the assistant will prompt to sign in.
| Argument | Type | Description |
|---|---|---|
| sku* | string | Exact merchant SKU code. |
{
"type": "object",
"title": "get_inventory_itemArguments",
"required": [
"sku"
],
"properties": {
"sku": {
"type": "string",
"title": "Sku",
"maxLength": 255,
"minLength": 1,
"description": "Exact merchant SKU code."
}
}
}Use this when the merchant asks for a broad inventory health check, an executive summary, their urgent/excess/no-demand counts, inventory valuation, or current PO workload. Requires a connected Forthcast store; the assistant will prompt to sign in.
No arguments.
{
"type": "object",
"title": "get_inventory_overviewArguments",
"properties": {}
}Use this when the merchant asks what to reorder, how much to buy, or which critical/warning items need action. Quantities reuse Forthcast's live lead-time, MOQ, case-pack, open-PO, location, and supplier minimum-order-value logic; this tool does not create a PO. Requires a connected Forthcast store; the assistant will prompt to sign in.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum recommendations to return. |
| priority | string | Return order-now items, plan-ahead items, or both. |
| supplier | any | Optional case-insensitive supplier name filter. |
{
"type": "object",
"title": "get_reorder_recommendationsArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 15,
"maximum": 30,
"minimum": 1,
"description": "Maximum recommendations to return."
},
"priority": {
"enum": [
"critical",
"warning",
"all"
],
"type": "string",
"title": "Priority",
"default": "all",
"description": "Return order-now items, plan-ahead items, or both."
},
"supplier": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"title": "Supplier",
"default": null,
"description": "Optional case-insensitive supplier name filter."
}
}
}Use this when the merchant asks how suppliers are performing or wants rolling 24-month on-time rate, fill rate, actual versus promised lead time, spend, or invoice price accuracy, plus current open and overdue purchase-order counts. Requires a connected Forthcast store; the assistant will prompt to sign in.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum suppliers to return. |
| supplier | any | Optional case-insensitive supplier name filter. |
{
"type": "object",
"title": "get_supplier_performanceArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 20,
"maximum": 50,
"minimum": 1,
"description": "Maximum suppliers to return."
},
"supplier": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"title": "Supplier",
"default": null,
"description": "Optional case-insensitive supplier name filter."
}
}
}Use this when the merchant asks what is ordered, drafted, open, partially received, received, cancelled, overdue, expected, or associated with a named supplier. Results are grouped by PO; this tool does not approve, receive, cancel, or otherwise modify an order. Requires a connected Forthcast store; the assistant will prompt to sign in.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum grouped purchase orders to return. |
| status | any | Optional exact purchase-order status. |
| supplier | any | Optional case-insensitive supplier name filter. |
{
"type": "object",
"title": "list_purchase_ordersArguments",
"properties": {
"limit": {
"type": "integer",
"title": "Limit",
"default": 10,
"maximum": 40,
"minimum": 1,
"description": "Maximum grouped purchase orders to return."
},
"status": {
"anyOf": [
{
"enum": [
"draft",
"open",
"partial",
"received",
"cancelled"
],
"type": "string"
},
{
"type": "null"
}
],
"title": "Status",
"default": null,
"description": "Optional exact purchase-order status."
},
"supplier": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "null"
}
],
"title": "Supplier",
"default": null,
"description": "Optional case-insensitive supplier name filter."
}
}
}Use this when someone shares a list or CSV of products with stock and sales rates and asks which need reordering, which are overstocked, or how healthy the inventory is. Up to 500 rows. Applies Forthcast's urgency bands (Order now, Plan ahead, On track, Excess, No demand), reorder points, suggested quantities and inventory value. Works without a connected store.
| Argument | Type | Description |
|---|---|---|
| items* | array | Products to score. |
| service_level | number | Target in-stock probability, 0.50 to 0.99. |
| default_lead_time_days | integer | Lead time for rows that give none. |
{
"type": "object",
"$defs": {
"InventoryRowInput": {
"type": "object",
"title": "InventoryRowInput",
"required": [
"sku",
"on_hand"
],
"properties": {
"sku": {
"type": "string",
"title": "Sku",
"maxLength": 64,
"minLength": 1,
"description": "SKU or product name."
},
"on_hand": {
"type": "number",
"title": "On Hand",
"description": "Units available now."
},
"on_order": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "On Order",
"default": null,
"description": "Units on open purchase orders."
},
"unit_cost": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Unit Cost",
"default": null,
"description": "Cost per unit, for valuation."
},
"demand_per_day": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Demand Per Day",
"default": null,
"description": "Average units sold per day."
},
"lead_time_days": {
"anyOf": [
{
"type": "integer",
"maximum": 730,
"minimum": 1
},
{
"type": "null"
}
],
"title": "Lead Time Days",
"default": null,
"description": "Supplier lead time in days."
},
"demand_per_month": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Demand Per Month",
"default": null,
"description": "Average units sold per month (if no daily figure)."
},
"demand_std_daily": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"title": "Demand Std Daily",
"default": null,
"description": "Standard deviation of daily demand, if known."
}
},
"additionalProperties": false
}
},
"title": "score_inventory_healthArguments",
"required": [
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/$defs/InventoryRowInput"
},
"title": "Items",
"maxItems": 500,
"minItems": 1,
"description": "Products to score."
},
"service_level": {
"type": "number",
"title": "Service Level",
"default": 0.95,
"maximum": 99,
"minimum": 0.5,
"description": "Target in-stock probability, 0.50 to 0.99."
},
"default_lead_time_days": {
"type": "integer",
"title": "Default Lead Time Days",
"default": 14,
"maximum": 730,
"minimum": 1,
"description": "Lead time for rows that give none."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.