Tools

ToolDescription
GetBillOfMaterials Returns the bill of material around one item-site: its components (what it is made of), its parents (what consumes it), or both.
GetCurrentExcess Returns items that are currently in excess or overstocked. Shows excess quantities, dollar values, days of excess, and inventory thresholds.
GetDeadStock Returns dead stock items — inventory with no recent demand. Results can be filtered by site, supplier, buyer, and ABC class.
GetDependentDemand Returns the time-phased dependent demand that planned and firm builds place on components — how much of a component is needed, on what date, and which parent assembly is driving it.
GetExcessRootCause Performs root cause analysis on excess inventory for one or more items at a site.
GetHoldingCost Returns holding cost per item-site, and the margin left after it. important: carrying cost AND holding cost ARE THE same figure IN StockIQ — a user who asks about carrying cost, cost of carry, cost to hold or inventory carrying charges is asking for this tool.
GetInventoryAgingDetail Returns receipt-level inventory aging detail for a specific item-site, showing individual receipts/shipments, their dates, remaining quantities, and remaining dollar values.
GetInventoryAgingReport Returns an inventory aging report showing the dollar value of on-hand inventory distributed into age buckets (e.g. 0-30 days, 31-60 days).
GetItemSiteHistory Returns historical daily snapshots for an item-site. Each record captures the item's on-hand quantity, order policy, safety stock levels, cost, ABC/XYZ class, and other planning parameters as of that date.
GetItemSiteSupplierHistory Returns historical daily snapshots for an item-site-supplier relationship.
GetLostSalesSummary Returns projected lost sales grouped by a category dimension, showing top categories and top SKUs within each.
GetNewItemDetail Returns new item details — recently created items being monitored for initial demand traction.
GetOrderPolicyRecommendations Returns items with order policy details and analysis. Use calculation AllOrderPolices (the enum's own spelling) to browse order policies by category, site, supplier, buyer, or ABC/XYZ class.
GetOrderPolicySummary Returns the order policy summary for a specific item-site. Shows the active order policy, ERP order policy, fixed quantities, min/max targets, kanban settings, safety stock, target stock, max stock, a human-readable settings description, and what StockIQ recommends.
GetProjectedExcess Returns items projected to be in excess. Shows SKUs whose on-hand + on-order position will exceed their excess threshold, with projected excess-start dates, excess quantity and dollar value, daily usage, and on-order info.
GetProjectedPosition Returns the projected inventory position for one or more item-sites AT A future point IN time — by default the date an order placed today would actually arrive.
GetProjectedStockOuts Returns items projected to stock out. Shows SKUs at risk of running out of inventory, with projected stockout dates, on-hand quantities, daily usage, and on-order information.
GetSafetyStockDetail Returns safety stock detail for one or more item-sites. Shows active and statistical safety stock levels, the chosen statistical method (Standard / Large Regular Pull / Sporadic / Retrospective), each method's value, usage source (Independent / Dependent / Both), target stock, reorder points, service levels, usage data, order policy, lead times, and any active alert status.
GetSlowMovers Returns slow-moving inventory items. Shows SKUs with low or stagnant sales/usage relative to their on-hand position, with last-used/last-sold dates and the dollar value sitting in slow-moving stock.
GetStockoutHistory Ranks item-sites by the stockouts they suffered over a past window — how many times each ran out, how many days it was out, and the sales that were lost while it was out.
GetStockoutRootCause Performs root cause analysis on a stock out for one or more items at a site.
GetStockOuts Returns item-sites that are currently out of stock. Shows stock-out details including how long they've been out, projected in-stock dates, next supply info, and lost revenue.
GetSuggestedTransfers Finds inventory transfer opportunities between warehouses: which item can move from which site (that holds excess) to which other site (that needs it), how much, and what it is worth.
AdjustChildForecasts Adjusts the forecasts of many nodes under a group node at once - Forecast Manager's Edit Child Forecasts: name the group (hierarchyNodeId), the level below it to edit at (hierarchyLevel, from GetHierarchyLayout; defaults to the bottom level), and optionally which nodes at that level (dimensionValue matches a name or code such as a customer or category, or hierarchyNodeIds lists them from FindHierarchyNodes). each selected child is saved individually and gets its OWN forecast settings override. Write
CompareForecastErrors Compares forecast accuracy across multiple forecast series at a hierarchy node.
ExplainForecast Returns the forecast for one or more hierarchy nodes as the Forecast Manager trend chart (actuals and forecast over time), which renders as an interactive chart in the UI. By default it also returns the effective forecast / seasonality / algorithm / lost-sales / current-period-projection settings driving it, current-period info (including whether the current period is partial), and the hierarchy level path — use those to explain why a forecast looks the way it does.
GetActualsByHierarchyLevel Returns sales actuals aggregated at a specific hierarchy level (e.g., level 2 = Product Group).
GetActualsByHierarchyNodes Returns sales actuals for specific hierarchy node IDs.
GetCustomerActuals Returns sales actuals by customer. Two shapes, chosen with groupBy. groupBy="customer" returns ONE ROW PER customer, summed across every period in the window.
GetCustomerShipToActuals Returns sales actuals by customer ship-to location. Two shapes, chosen with groupBy. groupBy="shipTo" returns ONE ROW PER ship-TO, summed across every period in the window.
GetForecastErrors Returns forecast error metrics for a hierarchy node. Shows backward-looking error, lead-time-ago vs current error, and lag period (out-of-sample) error.
GetForecastErrorsByLevel Ranks hierarchy nodes by forecast error or bias in ONE call - the children of one grouping, or a whole level.
GetForecastingConfiguration Returns the forecasting configuration for this StockIQ instance: demand series (historical data sources), demand forecast series (forecast outputs), which series is the operational/primary, and key date settings.
GetForecastSnapshotPeriods Returns period-by-period forecast quantities for specific snapshot(s).
GetForecastSnapshots Returns historical forecast snapshots for a hierarchy node, showing how the forecast has evolved over time.
GetForecastVarianceByLevel Ranks hierarchy nodes by how they compare to forecast, in ONE call.
GetItemSiteActuals Returns sales actuals by item-site. Two shapes, chosen with groupBy. groupBy="itemSite" returns ONE ROW PER item-site, summed across every period in the window.
ImportForecastFromAttachment Imports the forecast file the user attached to this conversation into StockIQ's demand forecast. Write Not available to tokens
SaveForecast Saves forecast quantities for ONE node of the forecast hierarchy - an item at a site, or a group node such as a product line - the way Forecast Manager's Save Forecast does: the change is applied AT that node, the node takes control of its own forecast settings, and StockIQ cascades the new values top-down to the node's children by fair share (a child with its own settings override keeps its forecast unless removeChildSettings=true). Write
ExplainComponentRequirements Works out what componentry a set of builds needs, which components are short, and which components are contended between the builds.
GetBulkExpediteRecommendations Returns ONE grid of expedite recommendations across every current and projected stockout in scope - the open PO lines to pull in, line by line.
GetBuyerScorecard Ranks buyers by whether they ordered what StockIQ asked them to, when it asked.
GetDeExpediteRecommendations Returns de-expedite recommendations for open supply orders when inventory is in excess.
GetExpediteRecommendations Returns expedite recommendations for open supply orders. Analyzes projected inventory and recommends which orders to expedite or redirect to avoid stockouts.
GetOrderScheduleDetail Returns the time-phased order schedule detail for ONE item-site-supplier — projected inventory, demand, and suggested orders bucketed by week (or day/month), rendered as an interactive grid.
GetOrderScheduleHeader Returns a list of order schedule headers — one row per item-site-supplier — showing inventory position, on-hand, on-order quantity, safety stock, max stock, and projected stockout dates.
GetOrderSuggestions Returns supplier-level purchase order suggestions showing which suppliers need orders and for how much.
GetSawtooth Returns a sawtooth chart showing projected inventory over time for an item-site-supplier.
GetSuggestedOrderLines Returns the detailed list of supply order lines (items, sites, suppliers, quantities, costs, dates) that StockIQ recommends ordering — the same lines a user would see on Place Orders Step 2 after picking suppliers in Step 1.
GetSupplierPaymentProjection Projects what we OWE suppliers over a forward window, bucketed by month (or another interval), per supplier, in money AND in units.
GetSuppliersCloseToMinimums Returns suppliers whose suggested order cost is at or above a percentage of their order minimum or free-freight minimum.
ImportOrderFromAttachment Places a purchase order from the order file the user attached to this conversation. Write Not available to tokens
LoadContainers Packs the order's current quantities into shipping containers and reports how many containers are needed, how full each one is, and what is in each. Write
PlaceOrder Places the supply orders the user has confirmed via the Edison Place-Orders flow. required inputs are the supplierContexts you received from GetOrderSuggestions and the same coverage parameters you used for GetSuggestedOrderLines — pass them verbatim. Write
TargetOrder Adjusts the quantities on a suggested supply order so the order reaches a target the user described — "fill this to a full container", "get me to 40,000 cubes", "take this up to the supplier minimum", "round everything to pack size". Write
ExplainPlannedSupplyOrder Explains why StockIQ is currently planning to place a supply order for one item-site-supplier.
ExplainSupplyOrder Explains why a specific supply order line was created. Returns the full audit snapshot captured at order time including inventory state, planning parameters, quantity logic, cost analysis, and key decision factors.
GetFirmAndPlannedSupply Reads the Purchase → firm AND planned supply screen: time-bucketed firm and planned supply per item-site per supplier.
GetLeadTimeDetail Returns the four lead times StockIQ holds for one item-site-supplier, side by side, one row per leg (admin, manufacturing, shipping, expedited shipping, putaway, and the planning total). call this whenever a user questions a lead time rather than merely asking for it — "why is the lead time 45 when my ERP says 30", "where does this lead time come from", "is StockIQ using my vendor's lead time or its own", "why did the lead time change", "why is my safety stock lead time different".
GetLeadTimeVariance Ranks suppliers, sites, items or individual item-site-supplier relationships by how their lead time has behaved over a window.
GetOnOrder Returns open supply orders (purchase orders on order) for an item or for a supplier.
GetReceiptHistory Returns what actually happened on past receipts — when each shipment shipped, was delivered and was received, how many days early or late that was, and whether it counted towards StockIQ's calculated lead time.
GetSupplyOrderHistory Returns historical purchasing - supply orders (purchase orders, transfers, work orders) that were actually placed, from the Order History screen.
GetAtRiskCustomers Returns a summary of customers who have open sales orders that are late or at risk of being late — i.e. orders that are already past their due date, not yet fulfilled, or predicted to miss their due date.
GetAtRiskSalesOrders Returns open sales order line detail for orders that are at risk — already late, not yet fulfilled, or predicted to miss the due date.
GetSalesOrderDetail Returns sales order line detail filtered by items, customers, sites, and date range.
GetSalesOrders Returns the sales order lines for ONE anchor: specific order numbers ('show me order #12345', 'what is on order 0009'), a product group (resolved hierarchy node ids), or a single item-site.
GetTopCustomers Returns the top customers, ranked. Runs in one of two modes. window mode — used when startDate, endDate or siteIds is supplied.
GetUnusualSales Returns individual sales that StockIQ flagged as unusually large for the item, the item-site, or that customer-item pair — demand spikes that normal sales and seasonality do not explain.
SendAtRiskCustomerEmail Sends an at-risk order status email to the customer's contact email address on file. Write Not available to tokens
GetExecutiveSummaryBurnDownBreakdown Returns the One-Year Burn Down breakdown for the Executive Summary screen: distribution of items across months-of-supply buckets, total annual burndown value, and items with the largest dollars at risk in short-supply or excessive-coverage buckets.
GetExecutiveSummaryLastUsedBreakdown Returns the Last Used breakdown for the Executive Summary screen: distribution of items across months-since-last-used buckets, the largest dollars locked in stale (>24 months) and never-used inventory, and the active-side count for context.
GetExecutiveSummaryOpportunityAndInvestmentBreakdown Returns the Opportunity & Investment breakdown for the Executive Summary screen: per-ABC-class totals of opportunity dollars (excess on hand vs. active target) and investment dollars (below-target shortfall), the inventory balance totals split into 6 buckets (Panic, Safety, Cycle, Planned Overstock, Overstock, Excess), and the most egregious individual items in each direction.
GetExecutiveSummaryOverview Returns a comprehensive executive summary of the current inventory position, including KPI card metrics (on-hand value, stock outs, excess, dead stock, slow movers, open supply orders), inventory position breakdown, and usage pattern breakdown.
GetExecutiveSummaryRevenueByPatternBreakdown Returns the Revenue by Usage Pattern breakdown for the Executive Summary screen: expected annual revenue and SKU count grouped by usage pattern (New, Recurring, Sporadic, Slow, Dead, Unknown), plus the largest revenue items sitting in unfavorable patterns (Slow, Sporadic, Dead) where revenue is locked up in low-velocity inventory.
GetExecutiveSummaryStratificationBreakdown Returns the Stratification breakdown for the Executive Summary screen across four orthogonal dimensions: ABC class, XYZ class, Inventory Position, and Usage Pattern.
GetExecutiveSummaryWeeksOfSupplyBreakdown Returns the Weeks of Supply breakdown for the Executive Summary screen: distribution of items across WoS buckets (No Inventory, <1, 1-4, 4-8, 8-12, 12-24, 24-52, >52 Weeks, No Demand), aggregate position, and the most concerning items in each direction (at risk of stocking out, excessive coverage, inventory with no demand).
GetInventoryOverTimeChart Returns an inventory over time chart showing on-hand value, safety stock and max stock bands, and inventory as a percentage of annual revenue.
GetInventoryTurnsOverTimeChart Returns an inventory turns over time chart showing average turns, target turns, and on-hand balance trends.
GetServiceLevelOverTimeChart Returns a service level over time chart showing monthly fill rate performance by hierarchy node.
DeleteForecastSettingsOverride Deletes the forecast-settings override that a node of the forecast hierarchy holds for one forecast series, so the node goes back to inheriting the settings controlled above it, or the level defaults. Write
DeleteOrderPolicyOverride Deletes an order policy override for an item at a site. Write
DeleteSafetyStockOverride Deletes a safety stock override for an item at a site. Write
ForgetFact Stops a remembered fact from being recalled in future conversations. Write
GetCustomerClassSettings Returns the customer classing configuration: whether classing is enabled, update frequency, number of classes, scoring weights, and ABC break thresholds.
GetForecastSettings Returns the effective forecast settings for one node of the forecast hierarchy - an item at a site, or a group node - and where each comes from: this node's own override, an override inherited from a node above it, or the level defaults.
GetItemSiteReplacements Returns configured item-site replacements (part supersessions) from the Item Site Replacements table.
GetOrderPolicyOverrides Returns order policy setting overrides. When itemCode is omitted or null, returns ALL overrides in the system.
GetReplenishmentSettings Returns the global replenishment settings: planning horizon, order defaults, backorder rules, order targeting, warehouse capacity, and advanced settings.
GetSafetyStockOverrides Returns safety stock setting overrides. When itemCode is omitted or null, returns ALL overrides in the system.
ListMemories Lists the durable facts you have remembered, with the ID needed to update or forget one.
RememberFact Remembers a durable fact for this user, so it is available in their later conversations. Write
RememberOrgFact Remembers a durable fact for the whole organisation, so it is available to every user in later conversations. Write
ResolveSettingLocation Finds where a StockIQ setting lives: the settings screen that hosts it, the field's exact on-screen label, and the permission needed to change it.
RunCustomerClassing Runs the customer classing calculation asynchronously. This scores and ranks all customers by their contribution to revenue/margin. Write
SaveForecastSettings Changes the forecast settings of one node of the forecast hierarchy (an item at a site, or a group node) for one forecast series: control (Auto / Manual / NotForecasted), the auto-forecast resume date, interval, freeze periods, the Algorithm Start Date and its Start Date, minimum hits, unit of measure, the per-period locks, the settings note, and optionally the removal of every child override below the node. Write
SaveOrderPolicyOverrides Creates or updates an order policy override on one item-site, or applies ONE override to many item-sites in a single step. Write
SaveSafetyStockOverride Creates or updates a safety stock override for an item at a site. Write
SetSetting Changes a StockIQ configuration setting. Write
UpdateGlobalCustomerClassSettings Updates global customer class settings. Write
UpdateReplenishmentSettings Updates global replenishment settings. Write
ActivateInactiveRecords Reactivates inactive records (items, sites, item-sites, suppliers, customers, ship-tos, item-site-suppliers). Write
CheckUserPermission Checks whether the current user has a specific permission. Use this before calling tools that require admin permissions (e.g., UpdateGlobalCustomerClassSettings requires 'EditGlobalCustomerClassSettings', RunCustomerClassing requires 'EditGlobalCustomerClassSettings').
ConvertHierarchyNodeToItemSite Converts a HierarchyNodeId to an ItemSiteId.
ConvertItemSiteToHierarchyNode Converts ItemSiteId(s) to HierarchyNodeId(s) for the forecast hierarchy.
ConvertToChart Converts grid data into a chart visualization.
DescribeAttachment Describes the file(s) the user attached to this conversation: the column headers, a few sample values from each column, how many rows were sampled, and how the file was read. Not available to tokens
EmailCurrentUser Emails the current user (the person using Edison right now). Write
EmailUser Emails another user in the StockIQ system. Write Not available to tokens
EscalateToSupport Escalates the user's issue to StockIQ Support by sending a notification email that includes the full conversation transcript and a link to this conversation.
FindHierarchyNodes Finds hierarchy nodes by name — use this whenever the user refers to a category, program, subgroup, product group or any other grouping by what it is called, e.g. 'subgroup Recliners 3 Position', 'the Lifts & Transfer program', 'PTACs-ALL'.
GetAlerts Returns the alerts StockIQ is currently raising, across the whole account, narrowed by any combination of alert type, category, priority, state and the usual item / site / supplier / buyer / class / category filters.
GetApiTokenGuide Returns a markdown guide for using this StockIQ instance's rest API with the API-token bearer scheme.
GetCategoryMetadata Returns the category metadata for this StockIQ instance. Shows what each category field is named (e.g., ItemSiteCategory1 might be called 'Product Line').
GetCustomFieldMetadata Returns the custom fields (flex fields) this StockIQ instance has added beyond the ones StockIQ ships with - for example a 'Brand' on items or a 'Do Not Ship Before' date on sales order lines.
GetDataRefreshStatus Reports data refresh status: whether a refresh is running now, when the last Full and Partial refreshes ran and how they ended, and whether the user may start one (Admin > Calculate, Initiate Data Updates permission).
GetFocusToday Returns the planner's prioritized daily focus list — projected stockouts, late POs, projected excess, under/over-forecast risks, expiring inventory, and at-risk sales orders — each summarized by total count, dollar exposure, and the top items by severity.
GetHierarchyLayout Returns the hierarchy level layout for this StockIQ instance.
GetImportQuality Reports what went wrong loading the customer's data overnight, ranked by how much data each problem affects.
GetInactiveRecords Lists records that have gone inactive and shows which of them can be reactivated.
GetInstanceInfo Returns information about this StockIQ instance: the customer's organization name, instance type, and URL. Use this to personalize responses and understand who the user works for.
GetItemSiteAttributes Returns detailed attributes for one or more item-sites. Includes item code, site, supplier, costs, inventory levels, lead times, safety stock, ABC/XYZ classification, and category assignments.
GetItemSiteCustomers Returns customers who have purchased a specific item at a site within a lookback period.
GetMcpConnectionGuide Returns a markdown guide for connecting an external LLM client (Claude Code, Codex, Cursor, Continue, VS Code) to this StockIQ instance via the MCP server using a personal MCP token.
GetMetricDefinition Explains what a StockIQ number means and HOW IT IS computed, grounded in the code that computes it.
GetPriorResultRows Returns the rows from the immediately-prior assistant turn's grid/table payload in the current chat session.
GetRequiredPropertiesForHierarchyLevel Given a target HierarchyProperty (the level you want to land on, e.g. 'Item', 'Site', 'Customer', 'CustomerShipTo', 'ItemSiteCategory3', 'CustomerShipToCategory1'), returns the list of property values you must supply to deterministically resolve a single hierarchy node at that level.
GetSitesForItem Returns all sites where a given item is stocked.
ImportFromAttachment Imports the file the user attached to this conversation into StockIQ. Call DescribeAttachment first to see the file's headers - you cannot map columns you have not looked at. Write Not available to tokens
ListImportTargets Lists the kinds of data ImportFromAttachment can load from an attached file, the field names each one accepts (use these as the Field values in a column mapping), whether the caller is allowed to import it, and what that target's delete mode does if it has one.
ResolveBuyer Resolves a user-provided buyer reference (code or name) into internal Buyer IDs.
ResolveHierarchyNodes Resolves item (and qualifier codes) into HierarchyNodeIds.
ResolveItem Resolves a user-provided item reference into internal Item IDs.
ResolveItemSite Resolves an item code and site code combination into an internal ItemSiteId.
ResolveItemSiteCategory Resolves an item-site category value the user named (e.g. a price group 'V01923', a product line 'Audio') into the numeric category IDs that the filter tools take.
ResolveItemSiteSupplier Resolves an item code and site code into ItemSiteSupplier records.
ResolveSite Resolves a user-provided site reference (code or name) into internal Site IDs.
ResolveSupplier Resolves a user-provided supplier reference (code or name) into internal Supplier IDs.
ShowCapabilities Returns a summary of what Edison can help with.
GetHelpContent Searches the StockIQ Help Center knowledge base and returns article content as formatted text.

Inventory

23 tools

Item and item-site detail, on-hand and projected positions, excess and dead stock, stockouts, and inventory alerts.

GetBillOfMaterials

Read-only Permission required

Returns the bill of material around one item-site: its components (what it is made of), its parents (what consumes it), or both. Use for 'what goes into X', 'what is X used in', 'show me the BoM for X', 'which assemblies use this part', 'what do I need to build X'. This is the same data as the BoM and BoM Viz tabs of Inventory Snapshot. Each row is ONE link: ParentItemCode consumes QuantityPer of ComponentItemCode, plus the stock position of the item-site that row adds. depth IS explicit: levels=1 (the default) returns only the directly-attached links - do not answer a multi-level question from it. Pass levels=0 for the full explosion, or a specific number of levels. Transfer (HubSpoke) links are excluded by default because a quantity-per across a warehouse transfer is meaningless; pass includeTransferLinks=true to see them. This returns structure, not requirements: it does not multiply anything by a build quantity and does not say what to order. For the component requirement that planned builds generate use GetDependentDemand; for what to order use GetOrderSuggestions.

ParameterTypeRequiredDescription
itemCode string Required Item code of the item-site to explore. Required. Use ResolveItem if the user named the item in words rather than by code.
siteCode string Optional Site code. Optional: if the item exists at exactly one site it is used automatically. If the item exists at several sites and none is named, the tool lists them and asks - it never picks one. Default: null
direction string Optional Which way to walk: 'Components' (default, what this item is made of), 'Parents' (what consumes this item), or 'Both'. Default: "Components"
levels int Optional How many levels to walk. 1 (default) returns only directly-attached links. 0 returns the entire tree. Any answer that spans more than one level needs levels greater than 1 or 0. Default: 1
includeTransferLinks bool Optional Include HubSpoke warehouse-transfer links as though they were components. Default false. They are real structure rows but they are a replenishment path, not a bill of material. Default: false
asOfDate string Optional Evaluate BoM effectivity dates as of this date (ISO 'yyyy-MM-dd'). Defaults to today. Links not yet effective or already expired on that date are excluded and counted in the assumptions. Default: null
limit int Optional Maximum number of links to return. Default 250, ceiling 2000. If the BoM has more links than this the tool refuses rather than returning part of a tree, because a partial BoM lets a total be computed over a sample. Default: DefaultLimit

GetCurrentExcess

Read-only Permission required

Returns items that are currently in excess or overstocked. Shows excess quantities, dollar values, days of excess, and inventory thresholds. Use when the user asks about excess inventory, overstocked items, or where they have too much stock relative to demand.

ParameterTypeRequiredDescription
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
includeOverStock bool Optional Include items in Overstocked position. Default false. Default: false
includePlannedOverStock bool Optional Include items in Planned Overstock position. Default false. Default: false
limit int Optional Maximum number of results to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a much larger set, so if the user asked for 'the 10 biggest by units' you must pass the matching column here — you cannot re-sort the returned rows to get a different ranking. Options: ExcessValue, ExcessQuantity, ExcessDays, ExcessCubes, OnHandValue, OnHandQuantity, DaysOfSupply. Default ExcessValue. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column (largest first). Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier has the most excess', 'break that down by warehouse' — it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetDeadStock

Read-only Permission required

Returns dead stock items — inventory with no recent demand. Results can be filtered by site, supplier, buyer, and ABC class. Use sortBy to rank results (e.g., 'OnHandBalance' for highest value dead stock). Returns a grid showing item details, costs, on-hand quantities, and last sale dates.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
includeZeroOnHands bool Optional Include items with zero on-hand quantity. Default false. Default: false
limit int Optional Maximum results to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a larger set, so if the user asked for 'the 10 that have sat longest' you must pass the matching column here — you cannot re-sort the returned rows to get a different ranking. Options: OnHandBalance, CurrentCost, TotalOnHandQuantity, TotalHistoricalDailyUsage, LastSaleDate, LastUsedDate. Default OnHandBalance. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column — values largest-first, dates oldest-first. Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier has the most dead stock', 'break that down by warehouse' — it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetDependentDemand

Read-only Permission required

Returns the time-phased dependent demand that planned and firm builds place on components — how much of a component is needed, on what date, and which parent assembly is driving it. Use for 'what components do I need to order for the assemblies I'm building', 'why does this component need ordering', 'what is driving demand on this part', 'what will building X consume and when'. role='Component' (default) anchors on a component and lists the parents that need it. role='Assembly' anchors on an assembly and lists what it drives onto its own components. This is StockIQ's actual plan, not a what-if: it reflects the builds already planned and firm, so it is the right answer to 'what do I need to order in preparation'. It is NOT a simulation of a build quantity you name. Pair it with GetBillOfMaterials for the structure behind these numbers, and with GetOrderSuggestions for what to actually order. negative quantities are components recovered by unbuilding an assembly - they are supply, not demand, and are excluded from the totals.

ParameterTypeRequiredDescription
itemCode string Required Item code to anchor on. Required. Use ResolveItem if the user named the item in words.
siteCode string Optional Site code. Optional: if the item exists at exactly one site it is used automatically; if several, the tool lists them and asks rather than picking one. Default: null
role string Optional 'Component' (default) — show the parent assemblies driving demand ON this item. 'Assembly' — show the demand this item drives onto ITS components. Default: "Component"
startDate string Optional Only include demand dated on or after this date (ISO 'yyyy-MM-dd'). Defaults to no lower bound. Default: null
endDate string Optional Only include demand dated on or before this date (ISO 'yyyy-MM-dd'). Defaults to no upper bound. Default: null
includeTransferLinks bool Optional Include HubSpoke warehouse-transfer demand rows. Default false — a transfer is a replenishment path, not a component requirement. Default: false
limit int Optional Maximum number of rows to return. Default 250, ceiling 2000. Rows are returned earliest-dated first so a truncated answer is still the nearest-term demand. Default: DefaultLimit

GetExcessRootCause

Read-only Permission required

Performs root cause analysis on excess inventory for one or more items at a site. Runs 9 diagnostic checks: Large Min/Max, Canceled Demand, Buyer Over-Purchased, Lead Time Mismatch, Safety Stock Drop, Over-Forecasted, On-Hand Changes, Forecast Reduction, and Order Policy Mismatch. Each check returns a severity (Ok, Info, Warning, Error) and an explanation. Use when the user asks why an item is overstocked, what caused excess, or wants root cause analysis for overstock. Accepts itemSiteIds from grid results for batch analysis.

ParameterTypeRequiredDescription
itemSiteId int? Optional ItemSite ID. If provided with itemSiteSupplierId, codes are ignored. Default: null
itemSiteSupplierId int? Optional ItemSiteSupplier ID. If not provided, StockIQ's declared primary supplier is used and the result records that assumption. Default: null
itemCode string Optional Item code to look up. Default: null
siteCode string Optional Site code to look up. Default: null
supplierCode string Optional Supplier code to look up. A supplier with no active relationship at this item-site is refused rather than swapped for the primary. Default: null
itemSiteIds List<int> Optional List of ItemSite IDs for batch analysis. When provided, runs root cause analysis on each item and returns combined results. Default: null

GetHoldingCost

Read-only Permission required

Returns holding cost per item-site, and the margin left after it. important: carrying cost AND holding cost ARE THE same figure IN StockIQ — a user who asks about carrying cost, cost of carry, cost to hold or inventory carrying charges is asking for this tool. There is no separate carrying-cost number anywhere in the product. Reports CurrentHoldingCost (what today's on-hand costs to hold), AverageHoldingCost, TargetHoldingCost (what the target stock level would cost) and the gap between current and target, alongside Revenue, Cogs, Margin, AdjustedCurrentMargin (margin NET of holding cost), Gmroi and the on-hand value. Use it for 'what is my carrying cost for SKU X', 'which SKUs cost the most to hold', 'where is carrying cost eating the margin', 'am I holding more than target', and — with usagePatterns — 'dead or slow items with a high carrying cost'. important — AdjustedCurrentMargin goes negative exactly when holding cost exceeds margin, so 'which items cost more to hold than they earn' is sortBy=AdjustedCurrentMargin, which ranks the most negative first. The summary states how many rows are negative. important — holding cost is NOT a flat percentage of value. It is value x the annual holding-cost rate x how long the stock is expected to sit, so a fast-moving item's holding cost is a small fraction of its value. When an item has NO usage StockIQ treats it as held forever and holding cost becomes the full on-hand value (capped at 5x). So a dead item's holding cost is its whole inventory value, not a carrying charge — say that rather than presenting it as a percentage-based cost. HoldingCostPercentOfOnHand shows which case a row is in; at or near 100% the item is not moving. These are the Stratification Detail / Class Analysis figures, refreshed by the nightly classing run, so they describe the position as of the last calculate rather than live. For the holding cost of a proposed order line rather than of stock on hand, use ExplainPlannedSupplyOrder. This tool does not project forward: it cannot say on what date carrying cost will overtake margin, only whether it already has.

ParameterTypeRequiredDescription
itemIds List<int> Optional Optional item IDs to filter by — get IDs from ResolveItem. Default: null
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
xyzClasses List<string> Optional Optional XYZ classes to filter by (e.g. 'X', 'Y', 'Z'). Default: null
usagePatterns List<string> Optional Optional usage patterns to filter by, as names: New, Recurring, Sporadic, Slow, Dead. Pass ['Dead','Slow'] for 'items that have not moved with a high carrying cost' — that is one call, not a separate trip to GetDeadStock or GetSlowMovers. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum number of item-sites to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a much larger set, so you cannot re-sort the returned rows to get a different ranking — pass the column the question asks for. Options: CurrentHoldingCost (default, most expensive to hold first), HoldingCostVsTarget (furthest above target first), AdjustedCurrentMargin (most negative first — where holding cost has overtaken margin), HoldingCostPercentOfOnHand (the stalest first), OnHandBalance, Margin, Revenue, Gmroi (worst return first). Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column (costs largest-first, margins and returns worst-first). Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier costs us most to hold', 'break carrying cost down by warehouse' — it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetInventoryAgingDetail

Read-only Permission required

Returns receipt-level inventory aging detail for a specific item-site, showing individual receipts/shipments, their dates, remaining quantities, and remaining dollar values. Use when the user wants to drill into a specific item's aging breakdown, asks 'why is this item aged', or wants to see receipt-by-receipt aging detail.

ParameterTypeRequiredDescription
itemSiteId int Required Required. The item-site ID to get aging detail for.
agingMethod string Optional Aging method: 'FIFO' (default) or 'LIFO'. Default: "FIFO"
targetDate string Optional Target date for aging: 'DateDelivered' (default) or 'DateReceived'. Default: "DateDelivered"

GetInventoryAgingReport

Read-only Permission required

Returns an inventory aging report showing the dollar value of on-hand inventory distributed into age buckets (e.g. 0-30 days, 31-60 days). Use when asked about inventory age, aging analysis, how old inventory is, stale/slow-moving inventory value by age range, or aging buckets.

ParameterTypeRequiredDescription
siteIds List<int> Optional Optional site IDs to filter by. Default: null
itemIds List<int> Optional Optional item IDs to filter by. Default: null
supplierIds List<int> Optional Optional primary supplier IDs. Default: null
buyerIds List<int> Optional Optional buyer IDs. Default: null
abcClasses List<string> Optional Optional ABC classes (e.g. 'A','B','C'). Default: null
xyzClasses List<string> Optional Optional XYZ classes. Default: null
orderPolicies List<int> Optional Optional order policies as integers. Default: null
category1Ids List<int> Optional Optional category 1 IDs. Default: null
category2Ids List<int> Optional Optional category 2 IDs. Default: null
category3Ids List<int> Optional Optional category 3 IDs. Default: null
category4Ids List<int> Optional Optional category 4 IDs. Default: null
agingMethod string Optional Aging method: 'FIFO' (default) or 'LIFO'. Default: "FIFO"
targetDate string Optional Target date for aging: 'DateDelivered' (default) or 'DateReceived'. Default: "DateDelivered"
customBuckets string Optional Optional custom aging buckets as JSON array of objects with Min and Max properties. Max 10 buckets. Use null for Max to indicate open-ended (e.g. {"Min":731,"Max":null} for '731+ days'). If omitted, uses default 7 buckets: 0-30, 31-60, 61-90, 91-180, 181-365, 366-730, 731+. Default: null
limit int Optional Maximum rows to return, sorted by on-hand value descending. Default 50. Default: 50

GetItemSiteHistory

Read-only Permission required

Returns historical daily snapshots for an item-site. Each record captures the item's on-hand quantity, order policy, safety stock levels, cost, ABC/XYZ class, and other planning parameters as of that date. Useful for root cause analysis, understanding how inventory levels and planning parameters changed over time, and investigating cost or policy changes. You can look up by item code + site code, a single ItemSiteId, or a list of ItemSiteIds.

ParameterTypeRequiredDescription
itemCode string Optional Item code to look up. Use with siteCode to resolve an ItemSiteId. Default: null
siteCode string Optional Site code to look up. Use with itemCode to resolve an ItemSiteId. Default: null
itemSiteId int? Optional Single ItemSiteId to retrieve history for. If provided, itemCode/siteCode are ignored. Default: null
itemSiteIds List<int> Optional List of ItemSiteIds to retrieve history for. If provided, other ID parameters are ignored. Default: null
daysBack int? Optional Number of most recent days of history to return. If omitted, returns all history. Default: null
result //SIQ-1673: was documented as "per item-site". It never was — the cut is applied once to the //combined Required
limit and the counts below now say plainly how much was dropped. [Description("Maximum number of rows to return in total across every item-site queried. Default 500.")] int Optional Maximum number of rows to return in total across every item-site queried. Default 500. Default: 500

GetItemSiteSupplierHistory

Read-only Permission required

Returns historical daily snapshots for an item-site-supplier relationship. Each record captures the supplier cost, lead times (calculated and active admin/manufacturing/shipping/putaway), safety stock lead time, order cycle, and suggested release quantities as of that date. Useful for understanding lead time changes over time, cost trends, and root cause analysis of supply issues. You can look up by item code + site code (+ optional supplier code), a single ItemSiteSupplierId, or a list of ItemSiteSupplierIds.

ParameterTypeRequiredDescription
itemCode string Optional Item code to look up. Use with siteCode to find supplier relationships. Default: null
siteCode string Optional Site code to look up. Use with itemCode. Default: null
supplierCode string Optional Optional supplier code. If omitted when using itemCode/siteCode, uses the primary supplier. Default: null
itemSiteSupplierId int? Optional Single ItemSiteSupplierId to retrieve history for. If provided, itemCode/siteCode are ignored. Default: null
itemSiteSupplierIds List<int> Optional List of ItemSiteSupplierIds to retrieve history for. If provided, other ID parameters are ignored. Default: null
daysBack int? Optional Number of most recent days of history to return. If omitted, returns all history. Default: null
filterRecordsWithoutLeadTimeInfo bool Optional If true, excludes early records before lead time tracking began. Default false. Default: false
limit int Optional Maximum number of rows to return. Default 500. Default: 500

GetLostSalesSummary

Read-only Permission required

Returns projected lost sales grouped by a category dimension, showing top categories and top SKUs within each. Use when the user asks about lost sales by category, top product families/lines/groups at risk, or revenue impact of stockouts by grouping. First call GetCategoryMetadata to determine which categoryNumber (1-8) matches the user's term (e.g. 'Product Family' = ItemSiteCategory1 = categoryNumber 1).

ParameterTypeRequiredDescription
categoryNumber int Required Which ItemSiteCategory to group by (1-8). Call GetCategoryMetadata first to determine which number matches the user's category term.
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
topCategoryCount int Optional Number of top categories to return. Default 5. Default: 5
topSkuCount int Optional Number of top SKUs per category to return. Default 5. Default: 5
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetNewItemDetail

Read-only Permission required

Returns new item details — recently created items being monitored for initial demand traction. Use noSalesWithinDays to find items with no sales within N days (e.g., 30, 60, 90). Results include item age, first/last sale dates, customer counts, and inventory balances.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs. If omitted, uses user's allowed sites. Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs. Default: null
buyerIds List<int> Optional Filter by buyer IDs. Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B']. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
noSalesWithinDays int? Optional Filter to items with no sales within this many days (e.g. 30, 60, 90). Items with no sales ever are always included. Default: null
limit int Optional Maximum results to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a larger set, so you cannot re-sort the returned rows to get a different ranking. Options: OnHandBalance, ItemAge, CurrentCost, TotalHistoricalDailyUsage, CustomerCount. Default OnHandBalance. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit for largest-first. Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier are the new items coming from', 'break that down by warehouse' - it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetOrderPolicyRecommendations

Read-only Permission required

Returns items with order policy details and analysis. Use calculation AllOrderPolices (the enum's own spelling) to browse order policies by category, site, supplier, buyer, or ABC/XYZ class. Use WithOrderPolicyMismatch for ERP vs StockIQ mismatches, RecommendedForStock for items recommended for stock, RecommendedForDeStock for items recommended for de-stock. Also use this tool when the user asks about order policies by category — pass the appropriate itemSiteCategory filter with calculation AllOrderPolices.

ParameterTypeRequiredDescription
calculation OrderPoliciesCalculation Optional Which items to return: AllOrderPolicies=1 (all items), WithOrderPolicyMismatch=2 (ERP vs SIQ mismatch), RecommendedForStock=3 (SIQ says stock, ERP does not), RecommendedForDeStock=4 (SIQ says don't stock, ERP does). Default 1. Default: OrderPoliciesCalculation.AllOrderPolices
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null
xyzClasses List<string> Optional Filter by XYZ classification values, e.g. ['X','Y'] Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum results to return. Default 100. Default: 100
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a much larger set, so if the user asked for 'the 10 biggest mismatches by value' you must pass the matching column here — you cannot re-sort the returned rows to get a different ranking. Options: DailyUsageValue, OnHandValue, OnHandQuantity, ForecastedDailyUsage, PolicyMismatch, ItemCode. Default DailyUsageValue, which puts the items with the most money moving through them first. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column (values largest-first, item code A-Z). Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier has the most policy mismatches', 'break that down by warehouse' - it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetOrderPolicySummary

Read-only Permission required

Returns the order policy summary for a specific item-site. Shows the active order policy, ERP order policy, fixed quantities, min/max targets, kanban settings, safety stock, target stock, max stock, a human-readable settings description, and what StockIQ recommends. Use when the user asks about how an item is ordered, its replenishment policy, kanban settings, or whether StockIQ's recommendation differs from the active policy.

ParameterTypeRequiredDescription
itemSiteId int Required The item-site ID to retrieve order policy information for. Required.

GetProjectedExcess

Read-only Permission required

Returns items projected to be in excess. Shows SKUs whose on-hand + on-order position will exceed their excess threshold, with projected excess-start dates, excess quantity and dollar value, daily usage, and on-order info. Use when the user asks about overstock risk, write-down candidates, or de-expedite opportunities.

ParameterTypeRequiredDescription
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum number of results to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a much larger set, so if the user asked for 'the ones going excess soonest' you must pass the matching column here — you cannot re-sort the returned rows to get a different ranking. Options: ProjectedExcessValue, ProjectedExcessQuantity, ProjectedExcessDate, OnDemandValue, OnHandQuantity, OnOrderQuantity, DaysOfSupply, NextShipDate. Default ProjectedExcessValue. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column (dates soonest-first, values largest-first). Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier is driving the projected excess', 'break that down by warehouse' — it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetProjectedPosition

Read-only Permission required

Returns the projected inventory position for one or more item-sites AT A future point IN time — by default the date an order placed today would actually arrive. USE this for 'what will my position be at lead time', 'do I need to order these', 'months of supply at lead time', 'projected on hand at <date>'. It resolves the lead time and the receiving bucket for you — do NOT ask the user for the lead time or the arrival date, and do NOT pull GetOrderScheduleDetail and hunt through its buckets for them. DO NOT USE this for 'how many days of supply will I have when this order arrives'. GetMetricDefinition explains either number if the user asks what they mean. By default it reports the lead-time position: the bucket StockIQ plans an order released now to arrive in. Pass asOfDate to report a specific date instead. Figures are read from a bucket, weekly unless you pass interval, and not from an exact date. Every row also carries the current position alongside, because 'now' versus 'when it lands' is the comparison that actually drives the order decision — never present the current figures as the lead-time ones. supply IS reported IN workdays, which is StockIQ's native unit. MonthsOfSupply is derived from it using the site's configured workdays per month, and both the divisor (AverageWorkdaysPerMonth) and the daily usage behind it are returned, so state the basis rather than converting yourself. Where an item has no meaningful demand the supply figures are null — say 'no demand', do not report an enormous number. ONE item across many sites: pass ONE itemCodes entry plus siteCodes to get one row per site. USE this for splitting or allocating a PO or shipment across warehouses, balancing stock age or cover between sites, and comparing one item's position site by site. Pass asOfDate = the order's arrival date to see each site's position when it lands. Do NOT call GetOrderScheduleDetail with several itemSiteSupplierIds for this: it returns their SUM, not a row per site. For the full time-phased schedule use GetOrderScheduleDetail; this tool deliberately returns one row per item-site instead.

ParameterTypeRequiredDescription
itemCodes List<string> Optional Item codes to report on. Used with siteCode, or ONE code with siteCodes. Maximum 25. Default: null
siteCode string Optional Site code the item codes belong to. Default: null
itemSiteSupplierIds List<int> Optional Resolved ItemSiteSupplier IDs. If provided, itemCodes and siteCode are ignored. Default: null
asOfDate DateTime? Optional Report the position at this date instead of at lead time. The bucket containing this date is used. Default: null
interval TimeInterval Optional Bucket size for the underlying schedule: Daily, Weekly or Monthly. Default Weekly. A finer bucket resolves a named asOfDate more precisely. Default: TimeInterval.Weekly
siteCodes List<string> Optional Several site codes for ONE item (pass exactly one itemCodes entry). One row per site. Maximum 25. Default: null
demandWindowDays int Optional Days of demand, starting at the reported bucket, averaged into WindowDailyUsage. Default 90, 7 to 365. Default: DefaultDemandWindowDays

GetProjectedStockOuts

Read-only Permission required

Returns items projected to stock out. Shows SKUs at risk of running out of inventory, with projected stockout dates, on-hand quantities, daily usage, and on-order information. Use when the user asks about stockout risk, items running low, or inventory shortages. horizon — when the user scopes by time ('at risk in the next 4-6 weeks', 'going out of stock in the next month', 'by the end of the quarter') you must pass the horizon parameters. Without them the tool returns the top `limit` rows across every projected stockout date, which answers a different period than the one asked about, and the rows cannot be re-filtered afterwards. Use horizonDays for 'within the next N days'; add horizonStartDays for a window ('between 4 and 6 weeks out' is horizonStartDays=28, horizonDays=42). The window filters on the projected stockout date, and a row with no projected stockout date is excluded whenever a window is applied — the summary says how many that removed. Read the horizon assumption in the result and state that period, not the one requested, since an out-of-range input is corrected rather than obeyed.

ParameterTypeRequiredDescription
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
horizonDays int? Optional Forward horizon in days: keep only items whose projected stockout date is on or before today + N days. This is 'in the next N days' — it includes items already out of stock unless horizonStartDays is also passed. Must be greater than zero. Default: null
horizonStartDays int? Optional Start of the horizon window in days from today: keep only items whose projected stockout date is on or after today + N days. Pass together with horizonDays for 'between X and Y out' — 'between 4 and 6 weeks' is horizonStartDays=28, horizonDays=42. Omit unless the user gave a lower bound. Default: null
horizonStartDate DateTime? Optional Explicit window start (ISO 'yyyy-MM-dd'). Takes precedence over horizonStartDays. Default: null
horizonEndDate DateTime? Optional Explicit window end (ISO 'yyyy-MM-dd'). Takes precedence over horizonDays. Use when the user names a date ('before the end of March') rather than a duration. Default: null
limit int Optional Maximum number of results to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a larger set, so if the user asked for 'top 5 by monthly demand' you must pass the matching column here — you cannot re-sort the returned rows to get a different ranking. Options: ProjectedOutOfStockDate, DailyUsage, OnDemandValue, OnHandQuantity, ProjectedBelowPanicPointDate. Default ProjectedOutOfStockDate (soonest first). Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column (dates soonest-first, values largest-first). Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier is driving the projected stockouts', 'break that down by warehouse' — it aggregates the whole result set server-side (after any horizon window), so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetSafetyStockDetail

Read-only Permission required

Returns safety stock detail for one or more item-sites. Shows active and statistical safety stock levels, the chosen statistical method (Standard / Large Regular Pull / Sporadic / Retrospective), each method's value, usage source (Independent / Dependent / Both), target stock, reorder points, service levels, usage data, order policy, lead times, and any active alert status. When called with a single itemSiteId, the result additionally carries an `Explanation` block with StockIQ-grounded driver factors (model error rate used as the variability factor, lead-time choice, TOQ, lead-time cap, capacity constraint) and — when the chosen method is Large Regular Pull — LRP-specific summary stats. Use this enriched single-item form to explain how a safety stock value was calculated. Use when the user asks about safety stock settings, safety stock levels, target service levels, why safety stock is high/low, or safety stock alerts. Supports lookup by: a single itemSiteId, a hierarchyNodeId (covering multiple items), a siteCode (all items at a site), or filter parameters (siteIds, supplier, buyer, ABC/XYZ class, category, etc.).

ParameterTypeRequiredDescription
itemSiteId int? Optional Single item-site ID to look up. Use this when the user asks about a specific item at a specific site — this is also the form that produces the deep Explanation block. Default: null
hierarchyNodeId int? Optional Hierarchy node ID to retrieve all item-sites under that node. Use when the user asks about a product group or hierarchy. Default: null
siteCode string Optional Site code to retrieve all items at that site (e.g. 'WH01'). Default: null
siteIds List<int> Optional Filter by site IDs. If omitted and no other lookup is specified, defaults to the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs. Default: null
buyerIds List<int> Optional Filter by buyer IDs. Default: null
abcClasses List<string> Optional Filter by ABC class values (e.g. ['A', 'B']). Default: null
xyzClasses List<string> Optional Filter by XYZ class values (e.g. ['X', 'Y']). Default: null
orderPolicies List<int> Optional Filter by order policy IDs. Default: null
itemStatuses List<int> Optional Filter by item status IDs. Default: null
shipperIds List<int> Optional Filter by shipper IDs. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum number of results to return. Default 50. Default: 50
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetSlowMovers

Read-only Permission required

Returns slow-moving inventory items. Shows SKUs with low or stagnant sales/usage relative to their on-hand position, with last-used/last-sold dates and the dollar value sitting in slow-moving stock. Use when the user asks about slow movers, stagnant inventory, items that aren't selling, or dead-stock risk before items become officially dead.

ParameterTypeRequiredDescription
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum number of results to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a much larger set, so if the user asked for 'the ones that have sat longest' you must pass the matching column here — you cannot re-sort the returned rows to get a different ranking. Options: OnHandValue, OnHandQuantity, LastSaleDate, LastUsedDate, ProjectedDeadDate, DaysUntilDead, ItemAge, DailyUsage. Default OnHandValue. Note LastSaleDate, LastUsedDate and DailyUsage rank ascending, so the stalest and slowest come first. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column (values largest-first, staleness oldest-first). Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier has the most slow-moving stock', 'break that down by warehouse' — it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetStockoutHistory

Read-only Permission required

Ranks item-sites by the stockouts they suffered over a past window — how many times each ran out, how many days it was out, and the sales that were lost while it was out. Use for "which top 10 SKUs had the most stockouts in the last 90 days", "what did our stockouts cost us last quarter", "which items keep running out", and any question about stockout history, repeat offenders or past service failures. important — this is the tool for stockouts in the past. GetStockOuts returns only items that are out right NOW, so an item that stocked out five times last quarter and is in stock today does not appear there at all. important — the question "most stockouts" is ambiguous and the ranking must match what the user meant: EpisodeCount is how often it ran out (a flapper), TotalDaysOut is how long it was out in total (a sustained outage), LostRevenue is what it cost. A cheap item that flapped nine times and an A-item dead for 60 days are different answers; pass the sortBy that matches the question. Set detail=true to list the individual outages instead of the per-item-site ranking — one row per episode with its start date, end date and the sales lost during it, the same view as the Item-Site Stock Out History screen. Use that for "when exactly did this run out", "show me each outage", or as the drill-down after a ranked answer; pair it with itemIds or siteIds, because unfiltered it returns every outage in the window. Lost sales are measured, not estimated. An empty lost-revenue column means no lost-sales data exists for that item-site — it does NOT mean the stockout was free.

ParameterTypeRequiredDescription
daysBack int Optional Size of the look-back window in days, ending today. Default 90. Ignored when startDate is supplied. Default: DefaultWindowDays
startDate DateTime? Optional Explicit window start (yyyy-MM-dd). Overrides daysBack when supplied. Default: null
endDate DateTime? Optional Explicit window end (yyyy-MM-dd). Defaults to today. Default: null
itemIds List<int> Optional Optional item IDs to filter by — get IDs from ResolveItem. Default: null
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
xyzClasses List<string> Optional Optional XYZ classes to filter by (e.g. 'X', 'Y', 'Z'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
includeNonStockPolicies bool Optional Include items with non-stock order policies. Default false, matching GetStockOuts. Default: false
includeItemsWithZeroSafetyStock bool Optional Include items with zero safety stock. Default true, matching GetStockOuts. Default: true
includeReplacedItems bool Optional Include replaced items. Default false, matching GetStockOuts. Default: false
detail bool Optional Return one row per individual outage (start date, end date, days out, sales lost) instead of the per-item-site ranking. Default false. sortBy does not apply in this mode — episodes come back newest first. Default: false
limit int Optional Maximum number of rows to return — item-sites in the ranked view, individual outages when detail=true. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a much larger set, so if the user asked for 'top 10 by number of stockouts' you must pass EpisodeCount — you cannot re-sort the returned rows to get a different ranking. Options: LostRevenue (default), TotalDaysOut, EpisodeCount, LongestEpisodeDays, LastStockoutEnd. Ignored when detail=true. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default (worst first). Default: null
groupBy string Optional Roll the ranked view up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier stocks us out most', 'break that down by warehouse' - it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz. Ignored when detail=true, which is already one row per outage. Omit for the item-site ranking. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetStockoutRootCause

Read-only Permission required

Performs root cause analysis on a stock out for one or more items at a site. Runs 8 diagnostic checks: Underforecasted, Unusual Sale, Late Supply Order, Missed Supply Order, Supply Order Date Change, Supply Order Quantity Change, Low Service Level, and Non-Stock Item. Each check returns a severity (Ok, Info, Warning, Error) and an explanation. Use when the user asks why an item ran out of stock, what caused a stockout, or wants root cause analysis. Accepts itemSiteIds from grid results for batch analysis.

ParameterTypeRequiredDescription
itemSiteId int? Optional ItemSite ID. If provided, codes are ignored. Default: null
itemCode string Optional Item code to look up. Used when itemSiteId is not provided. Default: null
siteCode string Optional Site code to look up. Used when itemSiteId is not provided. Default: null
itemSiteIds List<int> Optional List of ItemSite IDs for batch analysis. When provided, runs root cause analysis on each item and returns combined results. Default: null

GetStockOuts

Read-only Permission required

Returns item-sites that are currently out of stock. Shows stock-out details including how long they've been out, projected in-stock dates, next supply info, and lost revenue. Use when the user asks about current stock outs, what's out of stock, or when items will be back in stock. each ROW IS AN item-site (one item at one site), so one item out at five sites is five rows. The result reports both counts; when you state how many are out, say item-sites, or quote the distinct item count, never call the item-site count 'items'. lifecycle: itemStatuses is StockIQ's own Active/Discontinued status. Many customers track their lifecycle (Active, Retired, Disabled, Bridge ...) in an item-site category instead; when the user says 'exclude retired' or 'only active', find which category holds those values with ResolveItemSiteCategory and pass the ids of the values to keep as that category's itemSiteCategoryNIds.

ParameterTypeRequiredDescription
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
includeNonStockPolicies bool Optional Include items with non-stock order policies. Default false. Default: false
includeItemsWithZeroSafetyStock bool Optional Include items with zero safety stock. Default true. Default: true
includeReplacedItems bool Optional Include replaced items. Default false. Default: false
numberOfDaysForRecentStockouts int Optional Number of days to look back for counting recent stockout occurrences. Default 90. Default: 90
limit int Optional Maximum number of results to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a much larger set, so if the user asked for 'top 5 by dollar value' you must pass the matching column here — you cannot re-sort the returned rows to get a different ranking. Options: DaysOut, LostRevenuePerDay, OnDemandValue, DailyUsage, OutOfStockQuantity, TimesOut, NextSupplyDate, ProjectedInStockDate. Default DaysOut. TimesOut ranks by how often an item has stocked out in the lookback window, but only among items that are out right NOW — it does not answer 'which SKUs stocked out most over the last 90 days', because an item that stocked out five times and is back in stock today is not in this population at all. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column (dates soonest-first, values largest-first). Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site. Use this for 'group that by buyer', 'which supplier is stocking us out', 'break that down by warehouse' — it aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Options: buyer, supplier, site, abc, xyz, plus category1..category8 where the customer uses them. Omit for the item-site detail rows. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemStatuses List<ItemStatus> Optional Keep only these StockIQ item statuses (Active, Discontinued). A customer's own lifecycle states usually live in an item-site category instead; see the tool description. Default: null

GetSuggestedTransfers

Read-only Permission required

Finds inventory transfer opportunities between warehouses: which item can move from which site (that holds excess) to which other site (that needs it), how much, and what it is worth. Use for inventory balancing, 'can we transfer instead of buying', 'what can we ship out of this warehouse', 'why is this DC pulling so much from the hub', and rebalancing overstock across locations. Returns one row per source-site to destination-site pair, so the same answer reads from either end.

ParameterTypeRequiredDescription
itemIds List<int> Optional Optional item IDs to filter by — get IDs from ResolveItem. Default: null
sourceSiteIds List<int> Optional Optional source site IDs — the warehouses stock would ship from. Omit to consider every site the user may see. Default: null
destSiteIds List<int> Optional Optional destination site IDs — the warehouses stock would ship TO. Omit to consider every site the user may see. Ignored in HubSweepBack mode, where the destination is always the item's hub warehouse. Default: null
supplierIds List<int> Optional Optional primary supplier IDs to filter the source item-sites by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
shipperIds List<int> Optional Optional shipper IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
xyzClasses List<string> Optional Optional XYZ classes to filter by (e.g. 'X', 'Y', 'Z'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If the user is restricted by category, the framework intersects automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null
mode SuggestedTransfersMode Optional InventoryBalancing (default) considers any site as a destination — this is 'balance my warehouses'. HubSweepBack only ever sends stock back to the item's hub warehouse — use it for hub-and-spoke questions such as 'why is this DC pulling from the hub' or 'what should come back to the hub'. Default: SuggestedTransfersMode.InventoryBalancing
transferDownToLevel InventoryLevel Optional How far down the source site should be drawn: MaxInventory (default), ExcessThreshold, DaysOfInventory or DaysOfCycleStock. The last two require transferDownToDays. Default: InventoryLevel.MaxInventory
transferDownToDays decimal? Optional Required only when transferDownToLevel is DaysOfInventory or DaysOfCycleStock: how many days of stock to leave at the source. Default: null
acceptUpToLevel InventoryLevel Optional How far up the destination site may be filled: MaxInventory (default), ExcessThreshold, DaysOfInventory or DaysOfCycleStock. The last two require acceptUpToDays. Default: InventoryLevel.MaxInventory
acceptUpToDays decimal? Optional Required only when acceptUpToLevel is DaysOfInventory or DaysOfCycleStock: how many days of stock the destination may be filled to. Default: null
minUnitsToTransfer decimal? Optional Suppress transfers below this many units. Defaults to 10, matching the Suggested Transfers screen. Pass 0 to see every size of opportunity. Default: null
minValueToTransfer decimal? Optional Suppress transfers worth less than this. Defaults to 100, matching the Suggested Transfers screen. Pass 0 to see every size of opportunity. Default: null
transferToPreventStockouts bool Optional Also allow a transfer purely to prevent a stockout at the destination, not just to draw down excess at the source. Default true, matching the screen. Default: true
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a potentially much larger set, so if the user asked for 'top 5 by value' you must pass the matching column here — you cannot re-sort the returned rows to get a different ranking. Options: TransferValue, TransferQuantity, SourceExcessQuantity, DestAmountCanTake, DestDaysOfSupply. Default TransferValue. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default for the column (starved destinations first, values largest-first). Default: null
limit int Optional Maximum number of transfer pairs to return. Default 50. Default: 50
groupBy string Optional Roll the result up to one row per group instead of one row per transfer pair. Because a row is a source-to-destination pair, the site dimensions are named explicitly and there is no bare "site": sourceSite answers 'what is shipping OUT of this warehouse', destSite answers 'what is this warehouse pulling IN', and they are different questions with different totals. Also item, abc, xyz, and category1..category8 where the customer uses them. It aggregates the whole result set server-side, so the totals are right even though only `limit` rows come back. Omit for the individual transfer pairs. Default: null

Forecast

16 tools

Demand forecasts, forecast error and bias, forecast-versus-actual comparisons, snapshots, and the settings that drive them.

AdjustChildForecasts

Write Permission required

Adjusts the forecasts of many nodes under a group node at once - Forecast Manager's Edit Child Forecasts: name the group (hierarchyNodeId), the level below it to edit at (hierarchyLevel, from GetHierarchyLayout; defaults to the bottom level), and optionally which nodes at that level (dimensionValue matches a name or code such as a customer or category, or hierarchyNodeIds lists them from FindHierarchyNodes). each selected child is saved individually and gets its OWN forecast settings override. Use this for cross-cutting changes: 'raise Walmart by 10% across Headphones', 'lift every customer under Lifts & Transfer 5%'. When the number is FOR the node the user named - 'set Headphones to 300 a month' - use SaveForecast instead, which changes the group once and cascades top-down. Arithmetic, and say this in every preview: Percent applies to each child; UnitDelta, SetValue and PeriodValues are totals across the selected children, split between them by fair share (300 means 300 in total, not 300 each). Two-step confirmation: call with userConfirmed=false first - nothing is written; you get the group's trend chart with the change applied, the children selected, the arithmetic in words, and what happens to each child's settings in this instance's manual mode. Show ALL of it and stop. Call again with userConfirmed=true and the same arguments only after the user approves.

ParameterTypeRequiredDescription
hierarchyNodeId int? Optional HierarchyNodeId of the group node whose children are adjusted (from FindHierarchyNodes or ResolveHierarchyNodes). Optional when itemCode and siteCode name it. Default: null
itemCode string Optional Item code, together with siteCode, when the group is an item at a site with nodes below it (a customer dimension, say). Default: null
siteCode string Optional Site code, together with itemCode. Default: null
forecastSeriesCode string Optional Forecast series code or name. Optional - the operational series when omitted. Default: null
hierarchyLevel int? Optional The hierarchy level number to edit at, below the group (see GetHierarchyLayout). Optional - the bottom level when omitted. Ignored when hierarchyNodeIds is given. Default: null
dimensionValue string Optional Only the nodes at that level whose name or code matches this text, e.g. 'Walmart'. Optional - every active node at the level when omitted. Ignored when hierarchyNodeIds is given. Default: null
hierarchyNodeIds List<int> Optional The exact child nodes to adjust, e.g. from FindHierarchyNodes. Every one must sit below the group node. Optional. Default: null
adjustmentType string Optional Percent (each child, quantity is a percentage; -10 lowers), UnitDelta (total units added across the children, fair-share split), SetValue (total per period across the children, fair-share split) or PeriodValues (total per named period, fair-share split). Required. Default: null
quantity decimal? Optional The percentage, total delta or total value, by adjustmentType. Required except for PeriodValues. Default: null
startDate string Optional First period to change (yyyy-MM-dd). Optional - the first period a save may change when omitted. Default: null
endDate string Optional Last period to change (yyyy-MM-dd). Optional - the forecast horizon when omitted. Default: null
periodValues List<ForecastPeriodValueInput> Optional For PeriodValues: the periods and their total values across the children, e.g. [{periodDate:'2026-12-01', value:100}]. Up to 18 periods from the current one. Default: null
note string Optional Note stored on every edited forecast and its settings. Optional. Default: null
userConfirmed bool Optional Pass true only after the user has explicitly approved the preview. When false (default), nothing is written. Default: false

CompareForecastErrors

Read-only Permission required

Compares forecast accuracy across multiple forecast series at a hierarchy node. Returns current-period (no-lag) error and lead-time-ago lag error for every series available at the node, plus the synthetic Statistical and Naive/Benchmark baselines. Use this when the user asks to compare series (e.g. 'compare Operational vs Sales forecast accuracy'). For a deep single-series breakdown use GetForecastErrors instead. Resolve the hierarchyNodeId first via ResolveHierarchyNodes. Supports per-lag focus (lag=0 = current period; lag=N = N periods ago), a useLeadTimeLag convenience flag, a seriesNames filter (case-insensitive series-name match; reserved tokens 'Statistical'/'Stat' and 'Naive'/'Benchmark'), and recentSnapshotCount for trend analysis over recent lagging snapshots.

ParameterTypeRequiredDescription
hierarchyNodeId int Required The hierarchy node ID to compare forecast series at. Use ResolveHierarchyNodes to find this.
lag int? Optional Optional specific lag to focus on. 0 = current period (no lag); 1 = one period ago; etc. Omit to include current + lead-time-ago automatically. Default: null
useLeadTimeLag bool Optional If true, focus the comparison on the lead-time-ago lag (the canonical replenishment benchmark). Equivalent to filtering to rows where IsLeadTimeAgo is true. Default: false
seriesNames string[] Optional Optional array of forecast series names to filter to (case-insensitive contains-match on DemandForecastSeries.Name). Reserved tokens: 'Statistical' / 'Stat' = the synthetic stat baseline; 'Naive' / 'Benchmark' = the synthetic naive baseline. Omit to include every series. Default: null
recentSnapshotCount int? Optional Optional. If > 0, include a per-series trend table over the most-recent N lagging snapshots. Use this for questions like 'compare error trends over the last 6 months'. Default: null

ExplainForecast

Read-only Permission required

Returns the forecast for one or more hierarchy nodes as the Forecast Manager trend chart (actuals and forecast over time), which renders as an interactive chart in the UI. By default it also returns the effective forecast / seasonality / algorithm / lost-sales / current-period-projection settings driving it, current-period info (including whether the current period is partial), and the hierarchy level path — use those to explain why a forecast looks the way it does. Set includeExplanation=false when the user only wants to see the forecast or its trend. Accepts the same arguments the Forecast Manager screen sends to /api/TrendChartDetail/FetchByHierarchyNodeIds.

ParameterTypeRequiredDescription
hierarchyNodeIds List<int> Required Resolved internal HierarchyNodeIds. Forecast Manager typically passes one but can pass multiple selected nodes.
unitOfMeasure TimeSeriesUnitOfMeasure Optional Unit of measure shown in the chart: Units, Cogs, Revenue or Margin. Default Units. Default: TimeSeriesUnitOfMeasure.Units
showCurrentAndFutureActuals bool Optional Include current and future actuals in the trend chart. Default true (matches the Forecast Manager screen). Default: true
dataFiltersJson string Optional Optional. JSON-serialized HierarchyNodeFilters (same shape the screen posts as DataFilters). Default: null
includeExplanation bool Optional Include the settings that explain the forecast. Default true. Pass false when the user only wants to see the forecast or its trend, not why it looks that way. Default: true

GetActualsByHierarchyLevel

Read-only Permission required

Returns sales actuals aggregated at a specific hierarchy level (e.g., level 2 = Product Group). Requires itemHierarchyId and hierarchyLevel number. Four shapes, chosen with groupBy. groupBy="node" returns ONE ROW PER node, summed across every period in the window. Use this for any 'margin by product group', 'top N product lines' or 'which groups are down' question — otherwise the top rows are the highest single periods, not the highest nodes, and the same node appears once per period. groupBy="site" returns one row per site, and groupBy="node+site" the cross-tab: one row per node per site. Use node+site for 'by branch' / 'by warehouse' questions — 'which product groups are down, and at which branch'. The site is a dimension of the rows here, not a level of the hierarchy, so do not look for a deeper hierarchyLevel to get it; in many hierarchies the site sits below the item and no level is the cross-tab. Omitting groupBy (the default) returns one row per node per period, for trend and period-by-period questions. SummaryText carries accurate totals across all rows even when the grid is truncated, and states the period the result actually covers. That covered period can be wider than the dates requested, because actuals are stored in whole periods and the date filter selects whole periods rather than clipping them — describe the result using the covered dates it reports, never the dates you asked for.

ParameterTypeRequiredDescription
itemHierarchyId int Required The item hierarchy ID to query against.
hierarchyLevel int Required The 1-based hierarchy level number (e.g., 1 = top level, 2 = Product Group, etc.).
interval TimeInterval Optional Time interval for aggregation: Daily, Weekly, Monthly, Quarterly or Yearly. Default Monthly. Default: TimeInterval.Monthly
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
startDate DateTime? Optional Start date for the actuals period. Default: null
endDate DateTime? Optional End date for the actuals period. Default: null
limit int Optional Maximum number of rows to display in the grid. Default 200. Default: 200
groupBy string Optional Roll the result up, summed over the whole window, instead of returning one row per node per period. "node" gives one row per hierarchy node, "site" one row per site, "node+site" the node-by-site cross-tab. Pass one of these for any "biggest", "top N", "by product group" or "by branch" question; omit it for trend and period-by-period questions. Default: null
sortBy ActualsMeasure Optional Measure the returned rows are ranked by before the limit is applied: Revenue (default), Margin, QuantitySold or Hits. Default: ActualsMeasure.Revenue
comparisonPeriod string Optional Compare against an earlier window instead of reporting one: "priorYear" (the same window a year earlier) or "priorPeriod" (the window of equal length immediately before). Requires startDate and endDate. This is how "which product groups are down the most, FY25 to FY26" is answered in ONE call. Default: null
comparisonStartDate DateTime? Optional Start of an explicit comparison window. Use with comparisonEndDate, instead of comparisonPeriod. Default: null
comparisonEndDate DateTime? Optional End of an explicit comparison window. Use with comparisonStartDate. Default: null
rankBy ActualsComparisonRank Optional With a comparison window, what to rank on: Delta (the change, default), DeltaPercent (the percentage change) or Current (this window's value). Ignored without a comparison window. Default: ActualsComparisonRank.Delta
rankDirection ActualsRankDirection Optional Ranking direction. Descending (default) puts the largest first. For "down the most" pass Ascending - the biggest decline is the most negative change, not the largest one. Default: ActualsRankDirection.Descending

GetActualsByHierarchyNodes

Read-only Permission required

Returns sales actuals for specific hierarchy node IDs. Use when the user has already identified specific product groups or categories by their node IDs. Also requires itemHierarchyId and hierarchyLevel. SummaryText includes accurate totals across all rows.

ParameterTypeRequiredDescription
itemHierarchyId int Required The item hierarchy ID.
hierarchyLevel int Required The 1-based hierarchy level number.
hierarchyNodeIds List<int> Required Specific hierarchy node IDs to query.
interval TimeInterval Optional Time interval for aggregation: Daily, Weekly, Monthly, Quarterly or Yearly. Default Monthly. Default: TimeInterval.Monthly
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
startDate DateTime? Optional Start date for the actuals period. Default: null
endDate DateTime? Optional End date for the actuals period. Default: null
limit int Optional Maximum number of rows to display in the grid. Default 200. Default: 200

GetCustomerActuals

Read-only Permission required

Returns sales actuals by customer. Two shapes, chosen with groupBy. groupBy="customer" returns ONE ROW PER customer, summed across every period in the window. Use this for any 'top N customers' or 'largest buyer' question — otherwise the top rows are the highest single months, not the highest customers, and the same customer appears several times. Omitting groupBy (the default) returns one row per customer per period, for trend and period-by-period questions. To answer 'which customers are down for this product line', resolve the group by name with FindHierarchyNodes and pass its id as hierarchyNodeIds - the node expands to its item-sites server-side, so do not ask for the item list first. SummaryText carries accurate totals across all rows even when the grid is truncated, and states the period the result actually covers. That covered period can be wider than the dates requested, because actuals are stored in whole periods and the date filter selects whole periods rather than clipping them — describe the result using the covered dates it reports, never the dates you asked for. A shorter interval snaps the window more closely. For 'which customers are down the most since last year', pass comparisonPeriod="priorYear" with rankDirection=Ascending. The tool queries both windows and returns the change already computed and ranked — never call it twice and subtract in your answer.

ParameterTypeRequiredDescription
interval TimeInterval Optional Time interval for aggregation: Daily, Weekly, Monthly, Quarterly or Yearly. Default Monthly. Default: TimeInterval.Monthly
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
itemIds List<int> Optional Filter by item IDs. Default: null
hierarchyNodeIds List<int> Optional Scope to one or more forecast hierarchy nodes - a product line, category, program or subgroup - and everything beneath them, so "which customers' margin is down for this product line" is a single call. Resolve the node by name with FindHierarchyNodes first; any level works, including a leaf. Combined with siteIds as an AND and with itemIds as an intersection, not an error. A customer or ship-to node is limited to that customer; a customer group node (a forecast group) is refused - use GetItemSiteActuals for that group. Default: null
customerIds List<int> Optional Filter by customer IDs. Default: null
startDate DateTime? Optional Start date for the actuals period. Default: null
endDate DateTime? Optional End date for the actuals period. Default: null
limit int Optional Maximum number of rows to display in the grid. Default 200. Default: 200
groupBy string Optional Roll the result up to one row per customer, summed over the whole window, instead of one row per customer per period. Pass groupBy="customer" for any "biggest" or "top N" question; omit it for trend and period-by-period questions. (Was the aggregate flag before SIQ-1246; groupBy is the vocabulary every grid tool now uses.) Default: null
sortBy ActualsMeasure Optional Measure the returned rows are ranked by before the limit is applied: Revenue (default), Margin, QuantitySold or Hits. Default: ActualsMeasure.Revenue
comparisonPeriod string Optional Compare against an earlier window instead of reporting one: "priorYear" (the same window a year earlier) or "priorPeriod" (the window of equal length immediately before). Requires startDate and endDate. Use this instead of calling the tool twice and subtracting - the delta comes back computed and ranked. Default: null
comparisonStartDate DateTime? Optional Start of an explicit comparison window. Use with comparisonEndDate, instead of comparisonPeriod. Default: null
comparisonEndDate DateTime? Optional End of an explicit comparison window. Use with comparisonStartDate. Default: null
rankBy ActualsComparisonRank Optional With a comparison window, what to rank on: Delta (the change, default), DeltaPercent (the percentage change) or Current (this window's value). Ignored without a comparison window. Default: ActualsComparisonRank.Delta
rankDirection ActualsRankDirection Optional Ranking direction. Descending (default) puts the largest first. For "which customers are down the most" pass Ascending - the biggest decline is the most negative change. Default: ActualsRankDirection.Descending

GetCustomerShipToActuals

Read-only Permission required

Returns sales actuals by customer ship-to location. Two shapes, chosen with groupBy. groupBy="shipTo" returns ONE ROW PER ship-TO, summed across every period in the window. Use this for any 'which locations buy the most' or 'top N ship-tos' question — otherwise the top rows are the highest single periods, not the highest locations, and the same ship-to appears several times. Omitting groupBy (the default) returns one row per ship-to per period, for trend questions. SummaryText carries accurate totals across all rows even when the grid is truncated, and states the period the result actually covers. That covered period can be wider than the dates requested, because actuals are stored in whole periods and the date filter selects whole periods rather than clipping them — describe the result using the covered dates it reports, never the dates you asked for.

ParameterTypeRequiredDescription
interval TimeInterval Optional Time interval for aggregation: Daily, Weekly, Monthly, Quarterly or Yearly. Default Monthly. Default: TimeInterval.Monthly
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
itemIds List<int> Optional Filter by item IDs. Default: null
customerIds List<int> Optional Filter by customer IDs. Default: null
customerShipToIds List<int> Optional Filter by customer ship-to IDs. Default: null
startDate DateTime? Optional Start date for the actuals period. Default: null
endDate DateTime? Optional End date for the actuals period. Default: null
limit int Optional Maximum number of rows to display in the grid. Default 200. Default: 200
groupBy string Optional Roll the result up to one row per ship-to, summed over the whole window, instead of one row per ship-to per period. Pass groupBy="shipTo" for any "biggest" or "top N" question; omit it for trend and period-by-period questions. (Was the aggregate flag before SIQ-1246; groupBy is the vocabulary every grid tool now uses.) Default: null
sortBy ActualsMeasure Optional Measure the returned rows are ranked by before the limit is applied: Revenue (default), Margin, QuantitySold or Hits. Default: ActualsMeasure.Revenue

GetForecastErrors

Read-only Permission required

Returns forecast error metrics for a hierarchy node. Shows backward-looking error, lead-time-ago vs current error, and lag period (out-of-sample) error. Compares the operational forecast against naive and statistical benchmarks. Also returns hierarchy-level context, a glossary of StockIQ-specific error terms, and recent snapshot history so the model can comment on whether accuracy is improving or degrading. Use this to answer 'is my forecast good or bad?' for a specific item/site or aggregate level. Resolve the hierarchyNodeId first using ResolveHierarchyNodes.

ParameterTypeRequiredDescription
hierarchyNodeId int Required The hierarchy node ID to get forecast errors for. Use ResolveHierarchyNodes to find this.
demandForecastSeriesId int? Optional Optional demand forecast series ID. If omitted, uses the operational (default) forecast series. Default: null

GetForecastErrorsByLevel

Read-only Permission required

Ranks hierarchy nodes by forecast error or bias in ONE call - the children of one grouping, or a whole level. Use this for 'rank the buy categories under lowes US by bias %', 'which items under this forecast group have the worst forecast error', 'top 10 items with over 60% error'. never call GetForecastErrors node by node and rank the results yourself, and never ask the user for item codes to discover the nodes. Resolve the grouping with FindHierarchyNodes and pass it as parentNodeId; with hierarchyLevel omitted the direct children are ranked, and passing a deeper hierarchyLevel ranks every node at that level anywhere beneath the parent (e.g. all items under a forecast group, across all its buy categories). measure picks which error: Current (the configured error sample, default), LeadTimeAgo (the forecast as of the lead-time-ago snapshot, measured against the actuals now known), or LagPeriod (out-of-sample periods only). This is error and bias, not variance to forecast - for 'beating forecast this month' use GetForecastVarianceByLevel. For a custom date range ('change the timeframe to Feb-Aug 2026') pass startDate and endDate: each closed period in the range is then measured against the forecast as it stood when that period opened, which is the honest comparison for past periods. Without dates the numbers cover the configured window. Either way SummaryText states exactly which periods were measured - quote it when you answer.

ParameterTypeRequiredDescription
parentNodeId int? Optional Optional: rank only nodes underneath this hierarchy node. Resolve it with FindHierarchyNodes - do not guess an id. With hierarchyLevel omitted, its direct children are ranked. Default: null
hierarchyLevel int? Optional Optional: the 1-based hierarchy level to rank at (see GetHierarchyLayout). Required when parentNodeId is not given. With parentNodeId, any level below the parent. Default: null
measure ForecastErrorMeasure Optional Which error to rank: Current (default), LeadTimeAgo or LagPeriod. Default: ForecastErrorMeasure.Current
sortBy string Optional Column to rank by: errorPercent (default), biasPercent (ranks by size of bias, either direction - the Bias % column keeps its sign), mae, or errorValue. Default: null
sortDescending bool? Optional Optional: false to rank smallest-first. Defaults to largest-first. Default: null
minErrorPercent decimal? Optional Optional: keep only nodes whose error is at least this percentage - pass 60 for 60%, not 0.6. Default: null
minAbsBiasPercent decimal? Optional Optional: keep only nodes whose bias is at least this percentage in size, either direction - pass 20 for 20%. Default: null
minErrorValue decimal? Optional Optional volume floor: drop nodes whose error value (currency) is below this, so tiny items with huge percentages do not crowd the top. Default: null
itemHierarchyId int? Optional Optional item hierarchy ID. Defaults to the parent node's hierarchy, or the configured forecast hierarchy. Default: null
demandForecastSeriesId int? Optional Optional demand forecast series ID. Defaults to the operational forecast series. Default: null
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs. Default: null
buyerIds List<int> Optional Filter by buyer IDs. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs - get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
limit int Optional Maximum ranked rows to return. Default 25, maximum 200. Default: DefaultLimit
startDate DateTime? Optional Optional start of a custom window (any date inside the first period to measure). With a startDate the error is computed over that window from period-start forecasts and actuals, and `measure` does not apply. Default: null
endDate DateTime? Optional Optional end of a custom window (any date inside the last period). Periods that have not closed yet are not measured. Defaults to the last closed period. Default: null

GetForecastingConfiguration

Read-only

Returns the forecasting configuration for this StockIQ instance: demand series (historical data sources), demand forecast series (forecast outputs), which series is the operational/primary, and key date settings. Use this to understand what forecast series exist and how they are configured. This is instance-wide series configuration only. For the forecast settings that apply to a specific item, site or hierarchy node - Auto/Manual control, the auto-forecast resume date, the Algorithm Start Date, freeze periods, locked periods - use GetForecastSettings, which also returns the instance defaults when no node is named.

Takes no parameters.

GetForecastSnapshotPeriods

Read-only Permission required

Returns period-by-period forecast quantities for specific snapshot(s). Use after GetForecastSnapshots to drill into period data. Filter by snapshotName (e.g. 'Current - Operational') or snapshotDate (finds closest match). For comparing two snapshots, call this tool twice with different filters and compare the quantities by PeriodDate.

ParameterTypeRequiredDescription
hierarchyNodeId int Required The forecast hierarchy node ID.
snapshotName string Optional Filter to snapshot(s) whose name contains this text (e.g. 'Current'). Case-insensitive. Default: null
snapshotDate DateTime? Optional Filter to the snapshot closest to this date (ISO format, e.g. '2026-03-01'). Default: null
demandForecastSeriesId int? Optional Optional demand forecast series ID. Defaults to the operational forecast series. Default: null
interval TimeInterval? Optional Bucket size for the returned periods. Weekly (2) or Monthly (4). If omitted, uses the forecast settings. Default: null
historyLength TimeInterval Optional How far back to retrieve history, expressed as a TimeInterval: Weekly (2), Monthly (4), Quarterly (8), SemiAnnually (16) or Yearly (32). Default Monthly. This is a length, not a bucket size — None (0) and Daily (1) are not valid here. Default: TimeInterval.Monthly

GetForecastSnapshots

Read-only Permission required

Returns historical forecast snapshots for a hierarchy node, showing how the forecast has evolved over time. Each snapshot captures what the forecast looked like at a point in time, along with accuracy metrics (backward error, vs-current error, lag-period MAE). The most recent entry is the current live forecast (named 'Current - {SeriesName}'). Use GetForecastSnapshotPeriods to compare period-level quantities between snapshots.

ParameterTypeRequiredDescription
hierarchyNodeId int Required The forecast hierarchy node ID. Use ConvertItemSiteToHierarchyNode first if you only have an ItemSiteId.
demandForecastSeriesId int? Optional Optional demand forecast series ID. Defaults to the operational forecast series. Default: null
includeActuals bool Optional Include a synthetic actuals row showing historical sales. Default false to keep results focused on forecasts. Default: false
interval TimeInterval? Optional Optional time bucketing: Weekly or Monthly. If omitted, uses the forecast settings for the node. Default: null
historyLength TimeInterval Optional How far back to retrieve history, as an interval. Default Monthly. Default: TimeInterval.Monthly
limit int Optional Maximum number of snapshots to return. Default 20. Default: 20

GetForecastVarianceByLevel

Read-only Permission required

Ranks hierarchy nodes by how they compare to forecast, in ONE call. Use this for any 'which of these are above/below/beating forecast', 'what is off forecast', or 'fastest forecast growth' question - never fetch forecasts node by node and rank them yourself. metric=VarianceToForecast compares actuals to the forecast for the same periods (default; use for 'above or below forecast for July', 'beating their forecast this month'). metric=ForecastGrowth compares the last N periods of actuals to the next N periods of forecast (use for 'fastest forecasted growth over the last 6 months'); it is the Forecast Growth screen's Forecast Growth %. Scope it with parentNodeId to rank the children of one grouping, or with hierarchyLevel to rank a whole level. Resolve parentNodeId with FindHierarchyNodes first - do not guess a node id. thresholdPercent filters to nodes at least that far from forecast (pass 15 for 15%), and direction picks the side. Read the SummaryText before answering: it states the exact periods used and whether the current, in-progress period was projected or left out.

ParameterTypeRequiredDescription
metric ForecastComparisonMetric Optional Which comparison to run. VarianceToForecast = actuals vs the forecast for the same periods. ForecastGrowth = trailing actuals vs forward forecast. Default: ForecastComparisonMetric.VarianceToForecast
parentNodeId int? Optional Optional: rank only the nodes underneath this hierarchy node. Resolve it with FindHierarchyNodes. When given and hierarchyLevel is omitted, the direct children are ranked. Default: null
hierarchyLevel int? Optional Optional: the 1-based hierarchy level to rank at (see GetHierarchyLayout). Required when parentNodeId is not supplied. Default: null
startDate DateTime? Optional VarianceToForecast only: any date inside the first period to measure. Omit for the last closed period. Default: null
endDate DateTime? Optional VarianceToForecast only: any date inside the last period to measure. Omit to use the same period as startDate. Default: null
periods int Optional ForecastGrowth only: how many periods of history to compare against the same number of periods of forecast. Default 6. Default: 6
interval TimeInterval Optional Period size. Only Weekly and Monthly are supported - forecasts are stored at one of those two. Default Monthly. Default: TimeInterval.Monthly
thresholdPercent decimal? Optional Optional: keep only nodes at least this far from forecast, as a percentage - pass 15 for 15%, not 0.15. Default: null
direction ForecastVarianceDirection Optional Which side of the forecast thresholdPercent applies to. Above = sold more than forecast, Below = sold less, Either = both. Default: ForecastVarianceDirection.Either
sortBy string Optional Column to rank by: variancePercent, varianceUnits, growthPercent, statGrowthPercent, actualQuantity or forecastQuantity. Defaults to the metric's own percentage. Default: null
sortDescending bool? Optional Optional: false to rank smallest-first. Defaults to largest-first. Default: null
itemHierarchyId int? Optional Optional item hierarchy ID. Defaults to the configured forecast hierarchy, or the parent node's hierarchy. Default: null
demandForecastSeriesId int? Optional Optional demand forecast series ID. Defaults to the operational (default) forecast series. Default: null
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs. Defaults to the user's allowed suppliers. Default: null
buyerIds List<int> Optional Filter by buyer IDs. Defaults to the user's allowed buyers. Default: null
shipperIds List<int> Optional Filter by shipper IDs. Defaults to the user's allowed shippers. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
limit int Optional Maximum number of ranked rows to return. Default 25, maximum 200. Default: 25

GetItemSiteActuals

Read-only Permission required

Returns sales actuals by item-site. Two shapes, chosen with groupBy. groupBy="itemSite" returns ONE ROW PER item-site, summed across every period in the window. Use this for any 'top N items' or 'best selling items' question — otherwise the top rows are the highest single periods, not the highest items, and the same item appears several times. Omitting groupBy (the default) returns one row per item-site per period, for 'how much did we sell last month' and trend questions. To answer 'the products in that product line at that branch', resolve the group by name with FindHierarchyNodes and pass its id as hierarchyNodeIds together with siteIds - the node expands to its item-sites server-side, so do not ask for the item list first. For 'which items are down the most since last year', pass comparisonPeriod="priorYear" (or explicit comparison dates) with rankDirection=Ascending. The tool queries both windows, subtracts and ranks the change itself — never call it twice and do that arithmetic in your answer. SummaryText carries accurate totals across all rows even when the grid is truncated, and states the period the result actually covers. That covered period can be wider than the dates requested, because actuals are stored in whole periods and the date filter selects whole periods rather than clipping them — describe the result using the covered dates it reports, never the dates you asked for.

ParameterTypeRequiredDescription
interval TimeInterval Optional Time interval for aggregation: Daily, Weekly, Monthly, Quarterly or Yearly. Default Monthly. Default: TimeInterval.Monthly
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
itemIds List<int> Optional Filter by item IDs. Default: null
hierarchyNodeIds List<int> Optional Scope to one or more forecast hierarchy nodes - a product line, category, program or subgroup - and everything beneath them. Resolve the node by name with FindHierarchyNodes first, then pass its id here; any level works, including a leaf. Combined with siteIds as an AND, so "that product line at that branch" is one call. Combined with itemIds as an intersection, not an error: you get the items in that node that are also in your list. A node on a customer-side level (a forecast group, customer or ship-to) counts only that customer group's sales, so 'top items for forecast group X' is this call with X's node id. Nodes from two different customer groups cannot share one call. Default: null
customerIds List<int> Optional Filter by customer IDs. Default: null
startDate DateTime? Optional Start date for the actuals period. Default: null
endDate DateTime? Optional End date for the actuals period. Default: null
limit int Optional Maximum number of rows to display in the grid. Default 200. Default: 200
groupBy string Optional Roll the result up to one row per item-site, summed over the whole window, instead of one row per item-site per period. Pass groupBy="itemSite" for any "biggest" or "top N" question; omit it for trend and period-by-period questions. (Was the aggregate flag before SIQ-1246; groupBy is the vocabulary every grid tool now uses.) Default: null
sortBy ActualsMeasure Optional Measure the returned rows are ranked by before the limit is applied: Revenue (default), Margin, QuantitySold or Hits. Default: ActualsMeasure.Revenue
comparisonPeriod string Optional Compare against an earlier window instead of reporting one: "priorYear" (the same window a year earlier) or "priorPeriod" (the window of equal length immediately before). Requires startDate and endDate. Use this instead of calling the tool twice and subtracting - the delta comes back computed and ranked. Default: null
comparisonStartDate DateTime? Optional Start of an explicit comparison window. Use with comparisonEndDate, instead of comparisonPeriod. Default: null
comparisonEndDate DateTime? Optional End of an explicit comparison window. Use with comparisonStartDate. Default: null
rankBy ActualsComparisonRank Optional With a comparison window, what to rank on: Delta (the change, default), DeltaPercent (the percentage change) or Current (this window's value). Ignored without a comparison window. Default: ActualsComparisonRank.Delta
rankDirection ActualsRankDirection Optional Ranking direction. Descending (default) puts the largest first. For "down the most" pass Ascending - the biggest decline is the most negative change, not the largest one. Default: ActualsRankDirection.Descending

ImportForecastFromAttachment

Write Permission required Not available to MCP tokens

Imports the forecast file the user attached to this conversation into StockIQ's demand forecast. Call DescribeAttachment first to see the file's headers. The file is read by its column headers, in either layout: horizontal (one row per item, one column per period, each period column headed by its start date such as '2026-01-01' or 'Jan-26') or vertical (one row per period with Period Date and Value columns). Columns headed 'Item Code', 'Site Code', 'Item', 'SKU', 'Site', 'Warehouse', 'Customer', 'Ship To', 'Series', 'Category1', 'Date', 'Qty' and the like bind with no mapping; map only headers that differ. You supply the column mapping and any settings the user stated; never retype the file's rows. Settings the user does not state come from the persisted Forecast Import Settings, and the interval and unit of measure are inferred from the file. The preview lists every effective setting with its source. Confirmation flow: (a) call with userConfirmed=false first - nothing is written; you get the file as read, the settings, how many nodes would be touched and what exists on them today, and a 'This import will...' list of consequences. Show ALL of that to the user and stop. (b) call again with userConfirmed=true and the same arguments only after they approve. If the result is NeedsClarification, nothing was imported: pass the message on and ask. Series: the file's own series column wins per row; forecastSeriesCode fills rows without one; otherwise the operational series is assumed and the preview says so - relay that assumption. Level: hierarchyLevel names the HierarchyProperty the rows describe (Site for item-site rows, Customer, ItemSiteCategory1...); when omitted the persisted default (usually the bottom level) is used and validated against the file's columns.

This tool is reachable only by a signed-in StockIQ user. An MCP token may not call it.
ParameterTypeRequiredDescription
columnMapping List<ColumnMappingInput> Optional Column header → forecast field, for headers that do not already match a field name (ItemCode, SiteCode, CustomerCode, CustomerShipToCode, ItemSiteCategory1Code..8, CustomerShipToCategory1Code..3, DemandForecastCode, ItemHierarchyId, ShipperCode, PeriodDate, Interval, Value, UnitOfMeasure, Note). Period columns in a horizontal file are found by their date headers and are never mapped. Omit when the headers are standard. Default: null
forecastSeriesCode string Optional Forecast series code or name for rows whose file row does not say. Optional - when omitted the operational series is assumed and reported. Default: null
hierarchyLevel string Optional HierarchyProperty the rows describe: Item, Site, Customer, CustomerShipTo, ItemSiteCategory1..8, CustomerShipToCategory1..3. Optional - defaults to the persisted import level, else the bottom level. Default: null
interval string Optional Monthly or Weekly. Optional - inferred from the period dates; pass it only when the file cannot settle it or the user said. Default: null
unitOfMeasure string Optional Units, Cogs, Revenue or Margin. Optional - Units unless the user said otherwise or a vertical file carries its own column. Default: null
mergeMode string Optional Replace or Add. Optional - persisted default. Default: null
zeroMissingPeriodsMode string Optional PreserveOldValue, ZeroFuture or ZeroFutureAndHistorical: what happens to periods NOT in the file. Optional - persisted default. The last two zero out existing forecast. Default: null
updateHistoricalValues bool? Optional Write points dated before the current period. Optional - persisted default. Default: null
allowModificationWithinFirmFence bool? Optional Write points inside a node's firm fence. Optional - persisted default. Default: null
overrideChildForecasts bool? Optional Remove child forecasts and settings below each imported node. Destructive. Optional - persisted default. Default: null
createNewHierarchyNodes bool? Optional Create hierarchy nodes for combinations StockIQ does not have, instead of rejecting those rows. Optional - persisted default. Default: null
autoForecastOption string Optional DoNothing, Disable, RestartOnDate, RestartOnLastDateFound or Enable: what happens to auto-forecast on the imported nodes. Optional - persisted default. Enable keeps only the file's historical points. Default: null
restartAutoForecastDate string Optional Date auto-forecast resumes, for RestartOnDate. Optional. Default: null
enableStatisticalForecastAfterAutoForecastStart bool? Optional Enable the statistical forecast after the auto-start date: true, false, or omit for the current setting. Default: null
cancelImportIfParseErrors bool? Optional Abort the whole import when any row has an error. Optional - persisted default. Default: null
cancelImportIfSaveErrors bool? Optional Abort the whole import when saving reports an error. Optional - persisted default. Default: null
importComment string Optional Note to put on every imported forecast that has no note of its own in the file. Optional - persisted default, else an Edison authorship note. Default: null
applyForecastNoteToSettings bool? Optional Also copy the note onto the node's forecast settings. Optional - persisted default. Default: null
updateAverageCostAndPriceData bool? Optional Set cost and price information for newly created nodes now (slower). Only matters with createNewHierarchyNodes. Optional - persisted default. Default: null
createSiteNodesBelowItemNodes bool? Optional When importing at the level just above Site: give each node with no item-site below it Site children, splitting its forecast by the site mix of the nearest level above with sales history, so it plans. Only matters with createNewHierarchyNodes. Optional - persisted default. Default: null
userConfirmed bool Optional Pass true only when the user has explicitly approved the preview you showed them. When false (default), nothing is written. Default: false

SaveForecast

Write Permission required

Saves forecast quantities for ONE node of the forecast hierarchy - an item at a site, or a group node such as a product line - the way Forecast Manager's Save Forecast does: the change is applied AT that node, the node takes control of its own forecast settings, and StockIQ cascades the new values top-down to the node's children by fair share (a child with its own settings override keeps its forecast unless removeChildSettings=true). Use this when the number the user gives is FOR the node they named: 'raise 0305001 at site 95 by 10% for the next 3 months', 'set Headphones to 300 a month through June', '100 in December'. Do NOT use it when the change is to be applied to each of many nodes under a group, or the user names a cross-cutting dimension ('raise Walmart by 10% across Headphones') - that is AdjustChildForecasts. Adjustment: adjustmentType Percent, UnitDelta or SetValue with quantity, over an optional startDate..endDate (default: the first period a save may change through the forecast horizon); or PeriodValues with periodValues for named periods. Values are units. Two-step confirmation: call with userConfirmed=false first - nothing is written; you get a grid of period, current, proposed and change plus a 'This save will' list naming the node and level, the series (the operational series is assumed when none is named - relay that), the instance's manual mode and what the save does to the node's settings (resume date or locked periods, an override created), the children cascaded to and their overrides, depletion, and any periods refused as history or inside the freeze fence. Show ALL of it to the user and stop. Call again with userConfirmed=true and the same arguments only after they approve. A confirmed save returns the node's trend chart with the new values.

ParameterTypeRequiredDescription
hierarchyNodeId int? Optional HierarchyNodeId of the node (from FindHierarchyNodes or ResolveHierarchyNodes). Optional when itemCode and siteCode are given. Default: null
itemCode string Optional Item code, together with siteCode, when the user names an item at a site rather than a node. Default: null
siteCode string Optional Site code, together with itemCode. Default: null
forecastSeriesCode string Optional Forecast series code or name. Optional - the operational series when omitted. Default: null
adjustmentType string Optional Percent (quantity is a percentage; -10 lowers), UnitDelta (add quantity to each period), SetValue (set each period to quantity) or PeriodValues (use periodValues). Required. Default: null
quantity decimal? Optional The percentage, delta or value, by adjustmentType. Required except for PeriodValues. Default: null
startDate string Optional First period to change (yyyy-MM-dd, any date in the period). Optional - the first period a save may change when omitted. Never before the current period or inside the freeze fence. Default: null
endDate string Optional Last period to change (yyyy-MM-dd). Optional - the forecast horizon when omitted. Default: null
periodValues List<ForecastPeriodValueInput> Optional For PeriodValues: the periods and their new values, e.g. [{periodDate:'2026-12-01', value:100}]. Periods not named are untouched. Default: null
forecastControl string Optional Auto or Manual, to change the node's control alongside the save. Optional - the dialog's default for this instance's mode applies when omitted and the preview says what that is. Default: null
autoForecastResumeDate string Optional Date auto-forecasting resumes (yyyy-MM-dd) for an Auto node in resume-date mode, or 'none' to clear it. Optional - defaults to the period after the last edited period, as the dialog does. Ignored in per-period-lock mode. Default: null
removeChildSettings bool Optional Delete every child override below this node for the series, so this save applies top-down to ALL children - the dialog's 'Remove Child Settings'. Destructive. Default false: child overrides keep precedence. Default: false
forecastNote string Optional Note stored on the forecast. Optional. Default: null
settingsNote string Optional Note stored on the node's forecast settings. Optional. Default: null
userConfirmed bool Optional Pass true only after the user has explicitly approved the preview. When false (default), nothing is written. Default: false

Purchase

16 tools

Order suggestions, order schedules, purchase history, and placing purchase orders.

ExplainComponentRequirements

Read-only Permission required

Works out what componentry a set of builds needs, which components are short, and which components are contended between the builds. This is the Allocation Wizard's calculation from Place Orders, run read-only - it allocates nothing and changes no order. Use for 'what do I need to build 500 of X', 'can I build these, and what is stopping me', 'which components do these assemblies compete for', 'what is short if I build all of these'. Pass ALL the assemblies you care about in one call: a component's requirement is summed over the parents present in the same analysis, so asking one assembly at a time makes contention between assemblies invisible. The quantity is always the caller's own number - this tool does not invent one from the suggested order quantity or from stock. If the user has not named a quantity, ask for one. For the structure alone use GetBillOfMaterials; for the requirement the existing plan already generates use GetDependentDemand; for what to order use GetOrderSuggestions.

ParameterTypeRequiredDescription
builds List<BuildRequestInput> Required The builds to analyse, as a JSON array of objects with ItemCode, SiteCode and Quantity - e.g. [{"ItemCode":"assy-1","SiteCode":"WH01","Quantity":500}]. SiteCode may be omitted when the item exists at exactly one site. Pass every assembly of interest together.
supplyBasis string Optional Which pool a component's supply is measured from: 'AvailableToBuild' (default, component capacity only - 'how many could I make') or 'AvailableToPromise' (capacity plus stock already held and not promised to a parent - 'how many could I hand a customer'). The two give materially different answers. Default: "AvailableToBuild"
limit int Optional Maximum number of component rows to return. Default 250, ceiling 2000. If the component tree is larger the tool refuses rather than returning part of it, because a partial tree lets a requirement be totalled over a sample. Default: DefaultLimit

GetBulkExpediteRecommendations

Read-only Permission required

Returns ONE grid of expedite recommendations across every current and projected stockout in scope - the open PO lines to pull in, line by line. Use this for 'expedite plan for all stockouts', 'what POs should I expedite for supplier X', 'which orders do I pull in for the items stocking out this month'. Do NOT loop GetExpediteRecommendations or GetOnOrder item by item - this tool runs the same engine for every item-site in one call. Scope like GetProjectedStockOuts: resolve a supplier with ResolveSupplier and pass primarySupplierIds; sites, buyers, ABC classes and item-site categories narrow it further; horizonDays limits it to items stocking out within N days. Each row is one PO line (Order #, Line), with the quantity to expedite, its current ship and receipt dates, the date the stock is needed BY, and the latest date the supplier can ship it by standard freight and still make it ('Ship By'). The 'Expedited Receipt (Air)' column is expedited shipping from the line's current ship date, not a production pull-in - say so if you quote it. Item-sites with nothing on order that can be pulled in appear as rows with action NoOpenPO or NothingToExpedite: those need a NEW order, not an expedite. NoShortfallComputed means the item is projected to run out with stock on order, but the engine sized no units short - say that plainly rather than calling it covered. A note saying the ship-by date has passed means standard freight can no longer make the need date. The result is one grid, so EmailCurrentUser attaches all of it.

ParameterTypeRequiredDescription
primarySupplierIds List<int> Optional Primary supplier IDs - resolve a supplier name or code with ResolveSupplier first. Default: null
siteIds List<int> Optional Site IDs. If omitted, uses the user's allowed sites. Default: null
buyerIds List<int> Optional Buyer IDs. Default: null
abcClasses List<string> Optional ABC classes, e.g. ['A','B']. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs - get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs - get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs - get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs - get IDs from ResolveItemSiteCategory. Default: null
horizonDays int? Optional Keep only item-sites projected to stock out on or before today + N days. includes items already out of stock. Use for 'stocking out in the next N days'. Default: null
expediteTarget InventoryPosition Optional Inventory position to protect: OutOfStock (default) or BelowPanicPoint (broader - also covers the panic-point dip before the stockout). BelowSafetyStock is not supported. Default: InventoryPosition.OutOfStock
maxItemSites int Optional How many at-risk item-sites to analyze, soonest stockout first. Default 150, maximum 400. The result says when more matched. Default: DefaultMaxItemSites
limit int Optional Maximum grid rows returned. Default 500. Totals and counts in SummaryText always cover every analyzed item-site. Default: DefaultLimit
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetBuyerScorecard

Read-only Permission required

Ranks buyers by whether they ordered what StockIQ asked them to, when it asked. Use for "is my buyer ordering according to what StockIQ is asking them to", "which buyers are editing lines", "what percent of lines are edited", and "look at mismatches or late order placements". Two independent measures, and they answer different questions. timeliness asks whether an order appeared when StockIQ started asking for one: a suggestion episode is a run of days where StockIQ wanted a release, and it counts as on time when an order for that item and supplier was placed within the grace window of the first day of the episode, late when it arrived after that, and unordered when none arrived at all. editing asks what the buyer did to the quantity once they were in the order: how many lines they changed, and whether they went up (buying more than the plan) or down. important — an episode is dated from the day StockIQ actually started asking, even when that is before the window. Days late is therefore not capped by the window length: a 140-day lateness on a 90-day window is a correct answer about an episode that was already running, not an error, and the assumptions say how many verdicts are anchored that way. Where history does not reach far enough back to date the first ask, those episodes are reported as episodesStartUnknown and are left out of every rate — describe them as unmeasurable, never as compliant. important — a null rate is not a zero. A buyer StockIQ never asked to order anything has no on-time rate, and reporting 0% would accuse them of ignoring instructions that were never given. Say "not applicable" for a null, never "0%". important — attribution is by the buyer who owns the SKU (ItemSite.BuyerId), not the user who keyed the order. The Buyer Scorecard screen's order-dollar column attributes to the placing user instead, so the two can legitimately disagree where somebody orders outside their own buyer's items. The timeliness half counts an order placed directly in the ERP as a valid response, because the buyer did in fact respond; the editing half covers only StockIQ-placed lines, because an ERP line never carried a StockIQ suggestion to edit. important — the inventory columns (SKUs, Inventory, vs Target, Stocked Out) are a different kind of number from the rest. They are a position on ONE date — the latest inventory capture on or before the end of the window, reported as inventoryAsOf in the assumptions — not a total accumulated across the window. Describe them as "as of" that date. Everything else on the row is behaviour measured across the whole window.

ParameterTypeRequiredDescription
daysBack int Optional Size of the look-back window in days, ending today. Default 90. Ignored when startDate is supplied. Suggestion history retention is governed by the Max Item Site History Days setting (1100 by default), so longer windows return only what still exists. Default: DefaultWindowDays
startDate DateTime? Optional Explicit window start (yyyy-MM-dd). Overrides daysBack when supplied. Default: null
endDate DateTime? Optional Explicit window end (yyyy-MM-dd). Defaults to today. Default: null
onTimeGraceDays int Optional How many days either side of the first suggestion day still count as ordering on time. Default 3, matching the tolerance StockIQ's stockout root-cause analysis already uses. Raise it for a supplier ordered on a loose cadence; 0 demands the order land on the exact day. Default: DefaultOnTimeGraceDays
buyerIds List<int> Optional Optional buyer IDs to filter by — get IDs from ResolveBuyer. If omitted, uses the user's allowed buyers. Default: null
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
supplierIds List<int> Optional Optional supplier IDs to filter by. Narrows both halves to orders and suggestions for those suppliers — use it for "is this buyer late on this vendor". Default: null
itemIds List<int> Optional Optional item IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
xyzClasses List<string> Optional Optional XYZ classes to filter by (e.g. 'X', 'Y', 'Z'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum number of buyers to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a larger set, so you cannot re-sort the returned rows to get a different ranking. Options: OnTimeRate (default, worst adherence first), PercentLinesEdited, LateEpisodes, UnorderedEpisodes, MaximumDaysLate, AverageDaysLate, OrderLines, ReleasedValue, QuantityDeltaRate, InventoryDollars, InventoryToTargetRate, StockedOut, StockedOutRate, SkusManaged, BuyerCode. Buyers with no suggestion episodes have no on-time rate, and buyers with no inventory snapshot have no inventory figures; either way they always rank last, whichever direction is used. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default (worst first). Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetDeExpediteRecommendations

Read-only Permission required

Returns de-expedite recommendations for open supply orders when inventory is in excess. Recommends actions like Delay, Cancel, or Reduce on incoming orders to reduce overstock. Use when the user asks about de-expediting orders, delaying shipments, canceling orders due to excess, or how to reduce overstock.

ParameterTypeRequiredDescription
itemSiteSupplierId int? Optional ItemSiteSupplier ID. If provided, codes are ignored. Default: null
itemSiteId int? Optional ItemSite ID. If provided without itemSiteSupplierId, StockIQ's declared primary supplier is used and the result records that assumption. Default: null
itemCode string Optional Item code to look up. Default: null
siteCode string Optional Site code to look up. Default: null
supplierCode string Optional Supplier code to look up. A supplier with no active relationship at this item-site is refused rather than swapped for the primary. Default: null

GetExpediteRecommendations

Read-only Permission required

Returns expedite recommendations for open supply orders. Analyzes projected inventory and recommends which orders to expedite or redirect to avoid stockouts. Use when the user asks about expediting orders, rushing shipments, or how to prevent a stockout. supplier scope: with no supplierCode this covers every active supplier's open orders for the item-site — wider than the single-relationship tools, because an incoming order is worth expediting whichever supplier it comes from. Name a supplier to narrow it to one relationship.

ParameterTypeRequiredDescription
itemSiteSupplierId int? Optional ItemSiteSupplier ID. If provided, codes are ignored. Default: null
itemSiteId int? Optional ItemSite ID. Alternative to itemSiteSupplierId. Default: null
itemCode string Optional Item code to look up. Default: null
siteCode string Optional Site code to look up. Default: null
supplierCode string Optional Supplier code to look up. A supplier with no active relationship at this item-site is refused; it is not quietly widened to every supplier. Default: null
includeAllSites bool Optional Include orders from all sites, not just the specific site. Default false. Default: false
expediteTarget InventoryPosition Optional Inventory position to protect: OutOfStock (most urgent, default) or BelowPanicPoint (broader). BelowSafetyStock is not supported here - for that, point the user to the Expedited Lead Time wizard on Place Orders. Default: InventoryPosition.OutOfStock

GetOrderScheduleDetail

Read-only Permission required

Returns the time-phased order schedule detail for ONE item-site-supplier — projected inventory, demand, and suggested orders bucketed by week (or day/month), rendered as an interactive grid. This is the drill-IN view for a single row; it mirrors the StockIQ UI pattern where the Order Schedule screen shows a header list (one row per item-site-supplier) and clicking a row opens the detail. Use this only when the user has named or selected a specific item AND site (or single itemSiteSupplierId). Examples: 'show the order schedule for item 0305001 at site DC1', 'drill into acme's order schedule for X1234'. DO NOT use this tool to list or browse the order schedule — for any 'show me the order schedule for supplier X', 'order schedule for item Y' (no site named), 'all out-of-stock items on the schedule', or 'order schedule rows matching <filter>' use GetOrderScheduleHeader. Calling this tool repeatedly to build a list will exhaust the per-turn tool budget. Easiest call shape: pass itemCode + siteCode (the server picks the primary supplier automatically). Pass supplierCode only if the user named a specific non-primary supplier. If you already have itemSiteSupplierIds (e.g., from ResolveItemSiteSupplier or a prior GetOrderScheduleHeader row), pass those instead and skip the codes — do NOT call this tool twice with different argument shapes. several itemSiteSupplierIds are aggregated into ONE combined schedule, the same as selecting several rows on the Order Schedule screen: every bucket is the SUM across them, not any one of them. Pass several only when the user wants that combined view; never use it to compare sites. date window: the result covers fromDate to toDate. Omit both for the default: 90 days of history through the later of 180 days out or the lead time plus 90 days, which always includes the bucket an order released today would arrive in. Pass them when the user names a period. The window only drops buckets; every bucket shown carries the same figures as the screen. interval default: leave interval at the default (Weekly) unless the user explicitly asks for Daily or Monthly buckets. There is no system-default interval setting; Weekly is what every order-schedule screen in StockIQ starts on. grid layout: when the user explicitly asks for 'horizontal' or 'vertical' layout (e.g. 'show this in horizontal layout', 'switch to vertical'), pass gridLayout Horizontal or Vertical. When the user has not said anything about layout, omit this parameter (leave it null) so the user's saved layout preference is honored. After rendering, briefly offer the user the option to switch the bucket interval (daily / weekly / monthly) and the grid layout (vertical / horizontal) — these are surfaced as follow-up suggestions in the result.

ParameterTypeRequiredDescription
itemSiteSupplierIds List<int> Optional Optional list of resolved ItemSiteSupplier IDs. If provided, codes are ignored. Default: null
itemCode string Optional Item code to look up. Used when itemSiteSupplierIds is not provided. Default: null
siteCode string Optional Site code to look up. Used when itemSiteSupplierIds is not provided. Default: null
supplierCode string Optional Optional supplier code. If omitted, StockIQ's declared primary supplier is used and the result records that assumption, naming the alternatives. A supplier with no active relationship at this item-site is refused rather than swapped for the primary. Default: null
interval TimeInterval Optional Bucket size: Daily, Weekly or Monthly. Default Weekly. Default: TimeInterval.Weekly
gridLayout OrderScheduleGridLayout? Optional Optional grid layout override: Vertical or Horizontal. Set only when the user explicitly asks for one — otherwise leave null so the user's saved layout preference applies. Default: null
fromDate string Optional Optional start of the window (yyyy-MM-dd). Omit for 90 days before today. A date in the past brings in history buckets. Default: null
toDate string Optional Optional end of the window (yyyy-MM-dd). Omit for the later of 180 days out or the lead time plus 90 days. Default: null

GetOrderScheduleHeader

Read-only Permission required

Returns a list of order schedule headers — one row per item-site-supplier — showing inventory position, on-hand, on-order quantity, safety stock, max stock, and projected stockout dates. This is the list/browse entry point for the order schedule (the same grid the user sees on the main Order Schedule screen). Use this whenever the user wants to see order schedule rows for a SET of item-site-suppliers — e.g. 'show the order schedule for item 0305001', 'order schedule for supplier acme', 'all out-of-stock items on the order schedule', 'order schedule for site DC1'. Filters: itemCode (single item across all sites/suppliers), supplierCode, siteCode, buyerName, ABC/XYZ class, inventory position. DO NOT call GetOrderScheduleDetail repeatedly to build a list — use this single call. GetOrderScheduleDetail is only for drilling into the time-phased schedule of ONE item-site-supplier the user has named or selected. If you need PO-level detail (purchase order numbers, due dates) for an item, use GetOnOrder instead. important: Always pass at least one filter (item, supplier, site, buyer, ABC/XYZ class, or inventory position) to avoid returning too many rows.

ParameterTypeRequiredDescription
itemCode string Optional Optional item code to filter to a single item across all of its site-supplier combinations. Item codes are exact-match only. Default: null
supplierCode string Optional Optional supplier code or name to filter results to a single supplier. Default: null
siteCode string Optional Optional site code to filter results to a single site. Default: null
buyerName string Optional Optional buyer code or name to filter to a single buyer. Default: null
abcClasses List<string> Optional Optional ABC class filter, e.g. ['A','B'] for A and B items only. Default: null
xyzClasses List<string> Optional Optional XYZ class filter, e.g. ['X','Y'] for X and Y items only. Default: null
inventoryPositions List<InventoryPosition> Optional Optional inventory position filter, by name, e.g. ["OutOfStock", "BelowSafetyStock"]. Leave null for all positions. Default: null
limit int Optional Maximum number of results to return. Default 100. Default: 100

GetOrderSuggestions

Read-only Permission required

Returns supplier-level purchase order suggestions showing which suppliers need orders and for how much. Use this to answer questions like 'what do I need to order today?', 'what do I need to order this week?', or 'what do I need to order from supplier X?'. Returns a grid of suppliers with item counts, suggested order costs, minimum percentages, and projected stock-out counts. scope — this tool is supplier-anchored and returns every supplier in the user's permitted view unless you narrow it; an unscoped call on a real catalogue can exceed the whole per-turn budget on its own. If the question names particular items ('what should I order for item X?'), pass `itemCodes` or `itemIds` — that is the item-anchored route into this tool, and it narrows both this grid and the downstream GetSuggestedOrderLines drilldown. There is no singular `itemCode` parameter here and an undeclared argument is refused, so pass the list form. If the question names an item-site category value instead — a buy category, product line, price group or similar ('plan an order for the lifx buy category') — pass it in the matching `itemSiteCategoryNIds` parameter: call GetCategoryMetadata to learn which category number (1-8) the user's term is, then ResolveItemSiteCategory to turn the value into its Id. Never guess the Id. The category scopes the whole chain: the SupplierIssContext this returns holds only that category's item-sites, so GetSuggestedOrderLines and PlaceOrder stay inside it without being told again. A category order can span many suppliers — leave the supplier filter off unless the user named one. For one item at one site — 'should I order this, why this quantity, why is it not suggested' — ExplainPlannedSupplyOrder is the better route: it re-runs the engine for that single item-site-supplier and explains the decision rather than summarizing suppliers. The result also includes IssIdsToOrder per supplier — preserve these in context for any follow-up place-orders request. narrowing THE plan: when you have agreed with the user on a subset of suppliers (for example, budget allocation across selected vendors), re-call this tool with `supplierCodes` (or `supplierIds`) containing only that subset before any confirmation or placement step, so the rendered grid matches the prose the user just approved. The downstream GetSuggestedOrderLines and PlaceOrder tools accept supplierContexts but consumers see the Step 1 grid alongside narration — show the same scope you described.

ParameterTypeRequiredDescription
supplierCode string Optional Optional supplier code or name to filter to a single supplier. Leave null for all suppliers. When you need multiple suppliers, use `supplierCodes` instead. Default: null
supplierCodes List<string> Optional Optional list of supplier codes or names. Use this to narrow the grid to a specific subset of suppliers (e.g. after agreeing a budget-tiered plan). Leave null for all suppliers. Takes precedence over `supplierCode`. Default: null
supplierIds List<int> Optional Optional list of supplier IDs. Use when you already have SupplierIds from a prior tool result and want to skip code resolution. Takes precedence over `supplierCode` and `supplierCodes`. Default: null
siteCode string Optional Optional site code to filter to a single site. Leave null for all sites. Default: null
buyerName string Optional Optional buyer name or code to filter to a single buyer. Leave null for all buyers. Default: null
itemCodes List<string> Optional Optional list of item codes to scope the suggestions to. USE this whenever the user asks about specific item(s) — 'do I need to order item X', 'what should I order for X' — instead of pulling every supplier and filtering the answer afterwards. Pass a JSON array of strings, e.g. ["11091"], even for one item. Leave null for all items. Default: null
itemIds List<int> Optional Optional list of item IDs. Use when you already hold ItemIds from a prior tool result (e.g. ResolveItem) and want to skip code resolution. Takes precedence over `itemCodes`. Default: null
abcClasses List<string> Optional Optional ABC class filter, e.g. ['A','B'] for A and B items only. Leave null for all classes. Default: null
daysOfCoverage int? Optional Number of days of coverage from today. Null = system default (today). 7 = only items running out within 7 days. Use when user says 'in the next N days'. Default: null
coverageDateStr string Optional Explicit coverage date as ISO string 'yyyy-MM-dd'. Use when user specifies a date like 'by April 10th' or 'by Friday'. Takes precedence over daysOfCoverage. Default: null
extendToNextScheduleDate bool Optional Set to true when user says 'extend to next schedule date' or 'show everything until my next order schedule'. Default false. Default: false
coverageMode DaysCoverageMode Optional Coverage mode: ReleaseDate (default, based on planned receipt date) or ShipDate (based on expected ship date). Use ShipDate when user refers to ship date. Default: DaysCoverageMode.ReleaseDate
orderLineFilterOption OrderLineFilterOption Optional Filter option: NeedsToBeOrdered (default — always use this unless the user explicitly asks otherwise). All also returns every supplier with nothing to order, which on a real catalogue roughly doubles the size of this result for no added information — it was half of the largest response in the Edison beta. Only pass All when the user actually says something like 'show me all suppliers' or 'even the ones I don't need to order from', and prefer narrowing by item, supplier, site or buyer instead. Default: OrderLineFilterOption.NeedsToBeOrdered
supplierLevels List<int> Optional Filter by supplier level: 1=Primary vendor, 2=Secondary, 3=Tertiary, etc. Default [1] (primary only), matching the Place Orders screen. Use [1,2] for 'primary and secondary', [2] for 'secondary only', or null for all levels. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetSawtooth

Read-only Permission required

Returns a sawtooth chart showing projected inventory over time for an item-site-supplier. Displays stacked demand, supply, forecast bars and projected inventory line with safety stock and max stock thresholds. Use when the user asks to see the sawtooth, inventory projection chart, or supply/demand visualization.

ParameterTypeRequiredDescription
itemSiteSupplierIds List<int> Optional Optional list of resolved ItemSiteSupplier IDs. If provided, codes are ignored. Default: null
itemCode string Optional Item code to look up. Used when itemSiteSupplierIds is not provided. Default: null
siteCode string Optional Site code to look up. Used when itemSiteSupplierIds is not provided. Default: null
supplierCode string Optional Optional supplier code. If omitted, StockIQ's declared primary supplier is used and the result records that assumption, naming the alternatives. A supplier with no active relationship at this item-site is refused rather than swapped for the primary. Default: null
interval TimeInterval Optional Bucket size: Daily, Weekly or Monthly. Default Weekly. Default: TimeInterval.Weekly

GetSuggestedOrderLines

Read-only Permission required

Returns the detailed list of supply order lines (items, sites, suppliers, quantities, costs, dates) that StockIQ recommends ordering — the same lines a user would see on Place Orders Step 2 after picking suppliers in Step 1. Use this after GetOrderSuggestions when the user asks 'show me the items/products/lines to order from supplier X', 'what would I order from acme', or any drill-down request from a supplier summary row. Pass the SupplierIssContext entries you received from GetOrderSuggestions verbatim — the IssIdsToOrder and MatchedIssIds values are required to populate the supplier selections the server-side matcher reads. Also pass the same coverage settings (daysOfCoverage / coverageDateStr / coverageMode / extendToNextScheduleDate / orderLineFilterOption) you used in the upstream call; mismatched coverage triggers a re-match and may return different rows. item anchor: to answer 'what should I order for item X', pass `itemCodes` (or `itemIds`) here AND on the upstream GetOrderSuggestions call. Upstream it narrows which suppliers are considered; here it narrows the returned lines. The item filter is applied to the finished lines only — it does not alter the supplier selections or the coverage inputs the matcher reads, so it cannot change which lines the engine produced. category: there is no category parameter here. To order by an item-site category (a buy category, product line, price group...), pass `itemSiteCategoryNIds` to GetOrderSuggestions and use the SupplierIssContext it returns — those contexts already hold only that category's item-sites, so the lines here are scoped to it. dimension note: each returned line is one item-site-supplier row. GetOrderSuggestions' 'NumberOfItemsToOrder' counts distinct items per supplier — so this tool's line count can exceed that when the same item ships from multiple sites under the same supplier. When the user asks 'why did N lines come back when supplier X had M items?', explain it's items × sites at that supplier, not a discrepancy.

ParameterTypeRequiredDescription
supplierContexts List<SupplierIssContextInput> Required Supplier contexts from GetOrderSuggestions. required. Each entry must include SupplierId plus IssIdsToOrder and MatchedIssIds. Pass them verbatim from the upstream SupplierIssContext.
siteCode string Optional Optional site code filter — narrows scope further. Leave null for all sites in the contexts. Default: null
itemCodes List<string> Optional Optional list of item codes — narrows the returned lines to these items. Use for 'what should I order for item X'; pass the same list to the upstream GetOrderSuggestions call so the supplier set is scoped too. Pass a JSON array of strings, e.g. ["11091"], even for one item. Leave null for all items in the contexts. Default: null
itemIds List<int> Optional Optional list of item IDs. Use when you already hold ItemIds from a prior tool result and want to skip code resolution. Takes precedence over `itemCodes`. Default: null
daysOfCoverage int? Optional Number of days of coverage. Must match the value used in the upstream GetOrderSuggestions call. Default: null
coverageDateStr string Optional Explicit coverage date (ISO 'yyyy-MM-dd'). Must match the upstream call. Default: null
extendToNextScheduleDate bool Optional Set true to extend to next schedule date. Must match the upstream call. Default: false
coverageMode DaysCoverageMode Optional Coverage mode: ReleaseDate (default) or ShipDate. Must match the upstream call. Default: DaysCoverageMode.ReleaseDate
orderLineFilterOption OrderLineFilterOption Optional Filter option: NeedsToBeOrdered (default) or All. Must match the upstream call. Default: OrderLineFilterOption.NeedsToBeOrdered
maxLines int Optional Max lines to return in the rendered grid. Default 500. Default: 500

GetSupplierPaymentProjection

Read-only Permission required

Projects what we OWE suppliers over a forward window, bucketed by month (or another interval), per supplier, in money AND in units. Use for "how much do we need to pay our suppliers over the next few months", "what is the monthly projection", "how many units are we ordering per supplier", and supplier cash-flow or payment planning. important — firm and planned are reported as separate columns and must stay separate when you describe them. Firm is money committed on purchase orders that already exist. Planned is money StockIQ intends to spend on orders nobody has placed yet, so it can still be changed, deferred or cancelled. Quoting only the combined total tells a customer they are committed to spending money they are not committed to. Lead with firm, then say what planned adds. important — dates are payment DUE dates, not order or receipt dates. Each order's payment terms shift its cost from the expected receipt of the goods to the day the cash actually leaves, and milestone terms split one order across several due dates. So a month's figure is what falls due for payment that month, which is NOT the same as what arrives that month. important — units are apportioned across a payment schedule by each installment's share, so a 100-unit line paid 10/40/50 contributes 10, 40 and 50 units to those three months. Totals across the whole window are exact; a single month can therefore show a fractional unit count when terms are milestone-based. Describe units as "units being paid for", not as a delivery schedule. important — the discount column is money available if we paid early, not money already saved. StockIQ projects the full amount at the net due date and never assumes the discount is taken. This is a projection as of the last full calculate, not a live query — the assumptions say so. It has no forecast component: StockIQ forecasts demand, not future purchasing, so beyond the planned orders it already suggests there is nothing further to project.

ParameterTypeRequiredDescription
horizonDays int Optional Length of the forward window in days, starting today. Default 180 (about six months). Default: DefaultHorizonDays
horizonStartDays int? Optional Delay the start of the window by this many days from today. Use for "what falls due after this month". Default 0. Default: null
startDate DateTime? Optional Explicit window start (yyyy-MM-dd). Overrides horizonStartDays when supplied. Default: null
endDate DateTime? Optional Explicit window end (yyyy-MM-dd). Overrides horizonDays when supplied. Default: null
interval string Optional Bucket size: Monthly (default), Quarterly, Weekly or Daily. Monthly is what the cash-flow question normally means. Default: null
supplierIds List<int> Optional Optional supplier IDs to filter by — get IDs from ResolveSupplier. If omitted, covers every supplier the user is allowed to see. Default: null
siteIds List<int> Optional Optional site IDs to filter by. If omitted, covers every site the user is allowed to see. Default: null
limit int Optional Maximum number of suppliers to return — not rows. Every bucket in the window is returned for each supplier included, so the monthly series is never ragged. Default 25. Default: 25
sortBy string Optional Ranks suppliers by their total across the whole window before the limit is applied, then all of that supplier's buckets are returned. important: the tool returns the top `limit` suppliers by this measure out of a larger set, so you cannot re-sort the returned rows to get a different ranking. Options: TotalAmount (default, biggest payable first), FirmAmount, PlannedAmount, TotalQuantity, DiscountAmount, SupplierName. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default (largest first). Default: null

GetSuppliersCloseToMinimums

Read-only Permission required

Returns suppliers whose suggested order cost is at or above a percentage of their order minimum or free-freight minimum. Use this to answer questions like 'which suppliers am I close to hitting minimums on?', 'where am I close to free freight?', or 'which suppliers should I top off?'. Results are sorted by PercentOfOrderMinimum descending so the most critical suppliers appear first.

ParameterTypeRequiredDescription
minimumThresholdPercent decimal Optional Minimum threshold as a decimal fraction — only return suppliers at or above this percentage of their order minimum. Default 0.5 (50%). Example: use 0.75 for suppliers at 75%+ of minimum. Default: 0.5m
supplierCode string Optional Optional supplier code or name to filter to a single supplier. Default: null
siteCode string Optional Optional site code to filter to a single site. Default: null
abcClasses List<string> Optional Optional ABC class filter, e.g. ['A','B'] for A and B items only. Default: null
daysOfCoverage int? Optional Number of days of coverage from today. Null = system default. 7 = items running out within 7 days. Default: null
coverageDateStr string Optional Explicit coverage date as ISO string 'yyyy-MM-dd'. Takes precedence over daysOfCoverage. Default: null
coverageMode DaysCoverageMode Optional Coverage mode: ReleaseDate (default) or ShipDate. Default: DaysCoverageMode.ReleaseDate

ImportOrderFromAttachment

Write Permission required Not available to MCP tokens

Places a purchase order from the order file the user attached to this conversation. Call DescribeAttachment first to see the file's headers - you cannot map columns you have not looked at. You supply only a column mapping; never retype the file's rows. The file itself is read server-side by the same parser the Upload Order screen uses. Columns whose headers already match a field name (with or without spaces) - 'Item Code', 'Site', 'Order Qty', 'Release Quantity', 'Supplier Code' - need no mapping entry at all; map only the ones that differ. ItemCode, SiteCode and ReleaseQuantity are required; the import fails if the file has no column for one of them. Confirmation flow: (a) Call with userConfirmed=false first. The tool reads and converts the file without writing anything and returns a preview: the file name, the mapping used, any supplier it had to assume, per-row errors, and the line totals. Show that to the user and stop - wait for their explicit approval. (b) Call again with userConfirmed=true, and the same arguments, only after they have approved. Supplier: if the file has a supplier column, that wins per line. Otherwise pass the supplier the user named in supplierCodeOrName; if they named none, the tool assumes each item-site's primary supplier and tells you what it assumed and what else was available - relay that to the user in your confirmation. If the result is NeedsClarification, the file was NOT imported: pass the message on and ask.

This tool is reachable only by a signed-in StockIQ user. An MCP token may not call it.
ParameterTypeRequiredDescription
columnMapping List<ColumnMappingInput> Optional Column header → order-line field, for columns whose headers do not already match a field name. Omit entirely when the file's headers are already standard. Default: null
supplierCodeOrName string Optional Supplier code or name the user named for lines whose file row does not say. Optional - when omitted, each item-site's primary supplier is assumed and reported back. Default: null
orderStatus string Optional Optional order status override: "Approved" or "Review". When null, the system default from GlobalOrderNumberingSettings is used. Default: null
userConfirmed bool Optional Pass true only when the user has explicitly approved the preview you showed them. When false (default), the tool writes nothing and returns the preview. Default: false
proceedDespiteWarnings bool Optional Pass true to place the order even when the validator flagged Errors. Validation results are returned alongside the placement. Default: false

LoadContainers

Write Permission required

Packs the order's current quantities into shipping containers and reports how many containers are needed, how full each one is, and what is in each. This is StockIQ's Load Containers wizard, the same one on the Place Orders screen. nothing IS saved. To place the packed order, pass the ContainerLoadingSpec from this result into PlaceOrder's `containerLoading` argument, verbatim. It does NOT change the total quantity of anything - it decides which container each line rides in, splitting a line across containers where it has to. To change quantities so they fill a container, use TargetOrder with targetType="Containers" first, then pack the result with this tool. required inputs are the supplierContexts from GetOrderSuggestions plus the same coverage parameters you used for GetSuggestedOrderLines - pass them verbatim, because the lines are rebuilt server-side from them. ⭐ Use action="Recalculate" to answer "how full are my containers?" without moving anything - it reports the current position and rearranges nothing. Lines are grouped into containers by destination site and ship-window date, always - items for the same site share a container, items for different sites never do. That is not configurable. The result leads with Assumptions: one line per loading option, saying whether the user chose it or a default was applied. Show those alongside the container summary. If a required choice is missing, or the items lack the weights and measures loading needs, the tool returns NeedsClarification explaining what is missing rather than loading nothing silently.

ParameterTypeRequiredDescription
supplierContexts List<SupplierIssContextInput> Required Supplier contexts from GetOrderSuggestions. required. Each entry must include SupplierId plus IssIdsToOrder and MatchedIssIds, passed verbatim from the upstream call.
shippingContainer string Optional Which container to pack into, by its description, e.g. "40ft High Cube". If it is missing or ambiguous the tool lists what is configured and asks. Default: null
loadingStrategy string Optional How lines are packed: "KeepItemsTogether" (default - keep an item's quantity in as few containers as possible) or "EvenlyDistributeItems" (spread items across the containers so each carries a similar mix). Default: null
action string Optional "RunFromExisting" (default - keep any existing container assignments and fix overloaded ones), "Recalculate" (report the current fill and move nothing), or "ResetAndRerun" (discard existing assignments and pack from scratch). Default: null
obeyMinimums bool? Optional Respect item order minimums when splitting a line across containers. Defaults to true, matching the Load Containers screen. Default: null
obeyMultiples bool? Optional Respect item order multiples when splitting a line across containers. Defaults to true, matching the Load Containers screen. Default: null
daysOfCoverage int? Optional Same coverage parameter as the upstream GetSuggestedOrderLines call. Default: null
coverageDateStr string Optional Same as the upstream call. Default: null
extendToNextScheduleDate bool Optional Same as the upstream call. Default: false
coverageMode DaysCoverageMode Optional Same as the upstream call: ReleaseDate (default) or ShipDate. Default: DaysCoverageMode.ReleaseDate
orderLineFilterOption OrderLineFilterOption Optional Same as the upstream call: NeedsToBeOrdered (default) or All. Default: OrderLineFilterOption.NeedsToBeOrdered
maxLines int Optional Max loaded lines to return. Default 500. The container summary and the counts always describe the whole order, not just the rows returned. Default: DefaultMaxLines

PlaceOrder

Write Permission required

Places the supply orders the user has confirmed via the Edison Place-Orders flow. required inputs are the supplierContexts you received from GetOrderSuggestions and the same coverage parameters you used for GetSuggestedOrderLines — pass them verbatim. The tool re-builds the order lines server-side from those contexts so that all entity IDs and line state are guaranteed fresh and correct. To exclude a line, drop its ItemSiteSupplierId from the matching SupplierIssContext.IssIdsToOrder list. To place an order for one item-site category (a buy category, product line...), scope GetOrderSuggestions with `itemSiteCategoryNIds` and pass the contexts it returns — they hold only that category's item-sites. There is no category parameter here. Confirmation flow: (a) Call with userConfirmed=true directly when the user has already reviewed the suggested order lines via GetSuggestedOrderLines and has explicitly approved placement (e.g. they said 'yes, place this order' / 'go ahead and order these'). (b) Call with userConfirmed=false only when you have not yet shown the user the specific lines that will be placed — the tool will return a fresh structured preview for the user to approve. Per the system prompt's two-step rule, after returning a preview you must stop and wait for explicit approval before re-calling with userConfirmed=true. If validation flags errors, the tool blocks unless you also pass proceedDespiteWarnings=true on the confirm call. Order status defaults to the system DefaultOrderStatus from GlobalOrderNumberingSettings; pass orderStatus="Review" to route the order to manual review instead. Quantities: the preview lists every line it will place in Lines, each with its ItemSiteSupplierId, the ReleaseQuantity that will be written and the SuggestedReleaseQuantity StockIQ arrived at. Quote those numbers to the user rather than computing your own. If the user agrees quantities that differ from StockIQ's suggestion, you must send them back in lineQuantities on the confirm call — describing adjusted quantities and then omitting lineQuantities places the engine's figures instead, which is not what the user approved. The tool refuses the whole call rather than placing a partly-adjusted order. On success the result lists each created order's StockIqOrderNumber and ErpOrderNumber, the per-line quantities actually written in Lines, and tells the user to visit Order History.

ParameterTypeRequiredDescription
supplierContexts List<SupplierIssContextInput> Required Supplier contexts from GetOrderSuggestions. required. IssIdsToOrder on each context is the canonical "place these" set — drop an ItemSiteSupplierId from that list to exclude its line from this placement. MatchedIssIds must be passed verbatim from the upstream call so the server-side matcher can recover when inputs drift.
daysOfCoverage int? Optional Same coverage parameter as the upstream GetSuggestedOrderLines call. Default: null
coverageDateStr string Optional Same as the upstream call. Default: null
extendToNextScheduleDate bool Optional Same as the upstream call. Default: false
coverageMode DaysCoverageMode Optional Same as the upstream call: ReleaseDate (default) or ShipDate. Default: DaysCoverageMode.ReleaseDate
orderLineFilterOption OrderLineFilterOption Optional Same as the upstream call: NeedsToBeOrdered (default) or All. Default: OrderLineFilterOption.NeedsToBeOrdered
orderStatus string Optional Optional order status override: "Approved" or "Review". When null, the system default from GlobalOrderNumberingSettings is used. Default: null
userConfirmed bool Optional Pass true only when the user has explicitly approved placement of the lines they reviewed. When false (default), the tool returns a structured preview and refuses to write. Default: false
proceedDespiteWarnings bool Optional Pass true to place the order even when the validator flagged Errors. Validation results are returned alongside the placement. Default: false
lineQuantities List<OrderLineQuantityInput> Optional Optional per-line quantity adjustments: each entry is an itemSiteSupplierId from the plan plus the releaseQuantity to place, in stocking units. Send this whenever the user has approved quantities that differ from StockIQ's suggestion. A quantity of 0 drops that line. An id that is not in the plan, a negative quantity, a repeated id, or an id whose plan has more than one release line refuses the entire call and places nothing. Default: null
targeting McpOrderTargetingSpec Optional Optional order targeting: pass the TargetingSpec object returned by the TargetOrder tool, verbatim, to place the quantities that targeting arrived at. The server re-runs the same targeting here rather than taking the quantities back from you, so do not try to hand-build this object or transcribe TargetOrder's per-line numbers into lineQuantities. Targeting is applied first and lineQuantities on top of it, so an explicit per-line quantity the user named still wins. Default: null
containerLoading McpContainerLoadingSpec Optional Optional container loading: pass the ContainerLoadingSpec object returned by the LoadContainers tool, verbatim, to place the order packed into containers. The server re-runs the same loading here. Applied after targeting, so "fill this to a full container, then pack it" is one call carrying both specs. note that loading splits a line across containers, so a packed order cannot also use lineQuantities - adjust quantities first, then load. Default: null

TargetOrder

Write Permission required

Adjusts the quantities on a suggested supply order so the order reaches a target the user described — "fill this to a full container", "get me to 40,000 cubes", "take this up to the supplier minimum", "round everything to pack size". This is StockIQ's Order Targeting (Order Wizard) engine, the same one behind the Place Orders screen's targeting dialog. nothing IS saved — it computes and returns adjusted quantities. To actually place them, pass the TargetingSpec from this tool's result into PlaceOrder's `targeting` argument, verbatim. required inputs are the supplierContexts from GetOrderSuggestions plus the same coverage parameters you used for GetSuggestedOrderLines — pass them verbatim, exactly as PlaceOrder requires, because the lines are rebuilt server-side from them. The result leads with Assumptions: one line per targeting option, saying whether the user chose it or a default was applied. show those TO THE user along with the before/after totals — the whole point is that they can see what was assumed and correct it in one sentence before placing. Then it carries Changes: only the lines whose quantity moved, with old and new quantities. ⚠️ Watch the maximumDaysOfSupply assumption. The default caps every line at 180 days of projected supply, so targeting can legitimately stop short of the number asked for; Outcome says when that happened. If the user wants the target hit regardless, re-run with quantityLimit="None". If a required choice is missing — which shipping container, what number to aim at — the tool returns NeedsClarification naming the options rather than guessing.

ParameterTypeRequiredDescription
supplierContexts List<SupplierIssContextInput> Required Supplier contexts from GetOrderSuggestions. required. Each entry must include SupplierId plus IssIdsToOrder and MatchedIssIds, passed verbatim from the upstream call.
targetType string Required What to target. required. One of: Units, Cost, NetCost, Weight, Cubes, PurchaseUnits (cases/vendor units), Pallets, EquivalencyUnits, DaysOfSupply, Containers, SupplierMinimums, SupplierItemMinimums, PackSizeMultiples. Pricebreak targeting is not implemented. Everyday words are accepted too ("cases", "cubes", "dollars", "pallets", "container", "supplier minimum").
target decimal? Optional The number to reach, in the unit named by targetType. Required for Units, Cost, NetCost, Weight, Cubes, PurchaseUnits, Pallets, EquivalencyUnits and DaysOfSupply. Not used for Containers, SupplierMinimums, SupplierItemMinimums or PackSizeMultiples — those take their target from the container's capacity, the supplier's minimum or the item's pack size. Default: null
stopOption string Optional Which direction to stop in: "AtOrAbove" (default — reach AT least the target; use for "at least", "minimum of", "get me over") or "AtOrBelow" (never exceed it; use for "up to", "no more than", "without going over", and for anything with a physical capacity like a container, a weight limit or a truck). Default: null
targetingLevel string Optional "Order" (default — one target for the whole order) or "Site" (a target per site). Default: null
siteTargets List<McpSiteLevelTarget> Optional Per-site targets, used only with targetingLevel="Site". Each entry is a siteCode and its target. Omit to give every site the same target. Default: null
quantityLimit string Optional The cap that stops any one line being pushed too far: "ProjectedDaysOfSupply" (default, the Order Targeting screen's default), "OrderDaysOfSupply", "ProjectedExcess", or "None" for no cap. Pass "None" when the user wants the target hit whatever the consequence for days of supply. Default: null
maximumDaysOfSupply int? Optional Days-of-supply cap used with quantityLimit="ProjectedDaysOfSupply" or "OrderDaysOfSupply". Defaults to 180, matching the Order Targeting screen. Default: null
addMethod string Optional How quantity is added while closing on the target: "MultipleAtATime" (default), "EvenOrderDaysOfSupply", "EvenTotalDaysOfSupply" or "EvenDaysOfCycleStock". The Even* methods spread the increase so every line ends at a similar days of supply rather than topping lines up one order multiple at a time. Default: null
targetByDaysOfCoverage bool? Optional Set true to let targeting pull additional items in using days of coverage, rather than only adjusting the lines already in the order. Default false. Default: null
obeyMinimums bool? Optional Respect item order minimums. Defaults to the customer's Order Targeting setting (GlobalReplenishmentSettings), not to a fixed value. Default: null
obeyMultiples bool? Optional Respect item order multiples. Defaults to the customer's Order Targeting setting (GlobalReplenishmentSettings), not to a fixed value. Default: null
shippingContainer string Optional Which shipping container to fill. required when targetType is "Containers" — give the container's description, e.g. "40ft High Cube". If it is missing or ambiguous the tool lists what is configured and asks. Default: null
containerFillDirection string Optional With targetType="Containers": "Up" (default) to round a partly-filled container up, "Down" to leave it short. Default: null
containerLoadingStrategy string Optional With targetType="Containers": "KeepItemsTogether" (default) or "EvenlyDistributeItems". Default: null
supplierMinimumType string Optional With targetType="SupplierMinimums": "Order" (default — the ordinary order minimum) or "FreeFreight" (the free-freight threshold). Default: null
canChangeQuantitiesEditedByUser bool? Optional Set true to let targeting overwrite quantities a person already edited by hand. Default false. Default: null
includeBtoPolicyItems bool? Optional Set true to allow build-to-order policy items to be targeted. Default false. Default: null
modifyOnlyHighestUsageItems bool? Optional Set true to restrict the change to the highest-usage items. Default false. Default: null
usageThreshold double? Optional The usage cut-off used with modifyOnlyHighestUsageItems, as a fraction. Default 0.80. Default: null
allowMultiplePackSizing bool? Optional Set true to allow more than one pack size on a line. Default false. Default: null
daysOfCoverage int? Optional Same coverage parameter as the upstream GetSuggestedOrderLines call. Default: null
coverageDateStr string Optional Same as the upstream call. Default: null
extendToNextScheduleDate bool Optional Same as the upstream call. Default: false
coverageMode DaysCoverageMode Optional Same as the upstream call: ReleaseDate (default) or ShipDate. Default: DaysCoverageMode.ReleaseDate
orderLineFilterOption OrderLineFilterOption Optional Same as the upstream call: NeedsToBeOrdered (default) or All. Default: OrderLineFilterOption.NeedsToBeOrdered
maxChanges int Optional Max change rows to return. Default 500. The totals and Outcome always describe the whole order, not just the rows returned. Default: DefaultMaxChanges

Supply

8 tools

Suppliers, supplier lead times and vendor scorecards.

ExplainPlannedSupplyOrder

Read-only Permission required

Explains why StockIQ is currently planning to place a supply order for one item-site-supplier. This is the planned-order counterpart to ExplainSupplyOrder, which only works for orders already placed. Use when the user asks 'why are you planning to order X?', 'why is this on Place Orders?', 'explain this planned order', or right-clicks a row in the Place Orders Step 2 grid. The tool re-runs the replenishment engine for the requested item-site-supplier (no Place Orders session needed) and returns the same factor breakdown as ExplainSupplyOrder plus a time-phased Schedule section (projected on-hand, demand, suggested releases, planned receipts, order/delivery/holiday flags) that grounds 'why this qty / this date' reasoning. also answers the negative question — 'why didn't you order this?', 'why isn't this item suggested?', 'why is StockIQ not picking this up?'. When no order is planned it returns a NoPlannedOrder section naming the specific reason (inactive item-site-supplier, inactive item-site, item not yet calculated, discontinued item, DoNotOrder policy, build-to-order/phantom supplied through its parent, buy-to-order with no demand, an order deferred BY THE open order lookahead because enough is already on order arriving inside the lookahead window, a release that is simply not due until a later date, or a projected shortage with no release inside the horizon, which needs investigating) together with the same Schedule section as evidence and the checks that were run. Report the reason and the dates it gives; do NOT assume the projection is comfortable unless the reason says so. For the DeferredByOpenOrderLookahead reason the projection does dip below safety stock and StockIQ is choosing to wait — report the OpenOrderLookahead figures (quantity already on order, the quantity needed, the window, and the Open Order Lookahead Days setting) rather than telling the user their stock is fine. Pass itemSiteSupplierId directly when you have it; otherwise pass itemCode + siteCode (and optionally supplierCode — falls back to the primary supplier).

ParameterTypeRequiredDescription
itemSiteSupplierId int? Optional Resolved ItemSiteSupplier ID. Most direct lookup. Default: null
itemCode string Optional Item code. Used with siteCode when itemSiteSupplierId is not provided. Default: null
siteCode string Optional Site code. Used with itemCode when itemSiteSupplierId is not provided. Default: null
supplierCode string Optional Optional supplier code. If omitted, StockIQ's declared primary supplier for the item-site is used and the result records that assumption, naming the alternatives. Pass it when the user named a supplier, or when an item-site is served by more than one. Default: null
daysOfCoverage int? Optional Days of coverage horizon being planned to. When the in-app Insights button calls this it forwards the user's current Place Orders coverage setting; when invoked from chat, omit unless the user explicitly asks about coverage. A value > 0 (or coverage date in the future) means StockIQ is planning a forward coverage buy, not just a stockout-prevention order. Default: null
coverageDateStr string Optional Explicit coverage date (ISO 'yyyy-MM-dd'). Overrides daysOfCoverage when set. Default: null
extendToNextScheduleDate bool Optional Set true to extend coverage to the next valid order/delivery schedule date. Default: false
coverageMode DaysCoverageMode Optional Coverage mode: ReleaseDate (default) or ShipDate. Controls whether coverage is measured at order release or at receipt. Default: DaysCoverageMode.ReleaseDate

ExplainSupplyOrder

Read-only Permission required

Explains why a specific supply order line was created. Returns the full audit snapshot captured at order time including inventory state, planning parameters, quantity logic, cost analysis, and key decision factors. Use when the user asks 'why did we order this?', 'explain this order', or wants to understand the reasoning behind a purchase order line.

ParameterTypeRequiredDescription
supplyOrderLineId int? Optional Supply order line ID. Most direct lookup. Default: null
supplyOrderId int? Optional Supply order ID. Returns explanation for all lines on that order. Default: null
orderNumber string Optional ERP or StockIQ order number. Searches both numbering systems. Default: null
itemCode string Optional Item code. Narrows results when using orderNumber or supplyOrderId. Default: null
siteCode string Optional Site code. Further disambiguation when multiple sites match. Default: null

GetFirmAndPlannedSupply

Read-only Permission required

Reads the Purchase → firm AND planned supply screen: time-bucketed firm and planned supply per item-site per supplier. Use whenever the user asks about Firm and Planned, a "planned quantity", a "firm quantity", "why does the screen show" some number, "where is this quantity coming from", "what are we planning to buy from X next quarter", or names a figure they are reading off that screen. firm = supply already committed (a purchase order that exists). planned = supply StockIQ is suggesting but nobody has placed yet. A row can have both; the screen shows them as separate columns and so does this. ⭐ every ROW names ITS OWN source, which is the point of the tool. SupplySource is Purchase (an external vendor), Transfer (stock moving from another of the customer's sites, with SourceSiteCode naming it) or Manufacture, and SourceDescription says it in words. An item-site served by more than one supplier gets ONE ROW PER supplier PER period — so a quantity a user cannot account for is very often a second supplier they were not looking at, not a mystery record. Read SupplierCode and SupplySource off the row before offering any explanation; do NOT infer that a quantity is a transfer because the item-site's primary supplier is a transfer. ⚠️ NOT THE same question AS ExplainPlannedSupplyOrder. That tool answers a release-today question for ONE item-site-supplier — why the engine is (or is not) planning to release right now, with the factor breakdown. This answers a whole-horizon question — what firm and planned supply sits in each period across the forward calendar, per supplier. "Why is there 840 planned in August?" is this tool. "Why are you telling me to order this today?" is ExplainPlannedSupplyOrder. Chain them: find the period and the supplier here, then explain that one relationship there. MinimumOrderQuantity and OrderMultipleQuantity come back on each row when they are greater than one, because a planned quantity that looks arbitrary is usually the supplier's order minimum. dateBasis picks which date the periods are bucketed on — OrderDate (default, when the order is released), ShipDate, or ReceiptDate (when it lands) — and it matches the screen's own Display Options, so use ReceiptDate for "when does it arrive". With no date range this returns a 90-day window and says so in the Assumptions; pass startDate/endDate for the full horizon or for a period the user named. Use groupBy for "how much of this is transfers", "which supplier dominates our planned book", "break that down by warehouse".

ParameterTypeRequiredDescription
itemCode string Optional Item code to narrow to. Combine with siteCode for one item-site, or pass alone for the item at every site the caller may see. Default: null
siteCode string Optional Site code — the destination site, i.e. where the supply is going. Not the site a transfer comes from; that is reported per row as SourceSiteCode. Default: null
itemSiteId int? Optional ItemSite ID straight out of another tool's grid. Takes precedence over itemCode/siteCode. Default: null
supplierCode string Optional Supplier code or name to narrow to — matched against the supplier each row's supply comes from, which is what this grid is keyed on. This is how to answer 'what are we planning to buy from DS218'. Resolve ambiguous vendor text with ResolveSupplier first. Default: null
siteIds List<int> Optional Optional destination site IDs. Omit to use the caller's allowed sites. Default: null
supplierIds List<int> Optional Optional supplier IDs — again the supplier the supply comes from, not the item-site's configured primary. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
shipperIds List<int> Optional Optional shipper IDs to filter by. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B'). Default: null
dateBasis string Optional Which date the periods are bucketed on, mirroring the screen's Display Options: 'OrderDate' (default — the release date), 'ShipDate', or 'ReceiptDate' (when it arrives). Default: null
interval string Optional Period size: 'Monthly' (default) or 'Weekly'. No other interval is supported by this screen or this data. Default: null
showLoadBalancedPlan bool Optional Mirrors the screen's 'Show load balanced plan' toggle. True (default) shows the load-balanced plan for item-sites the app actually load-balanced, splitting planned quantity across the balanced suppliers; false shows the unbalanced plan. Item-sites without valid load balancing are unaffected either way. Default: true
startDate string Optional Start of the window (yyyy-MM-dd), applied to the date named by dateBasis. Omit both dates to get a 90-day window from today. Default: null
endDate string Optional End of the window (yyyy-MM-dd), applied to the date named by dateBasis. Default: null
limit int Optional Maximum rows (or groups, when groupBy is set) to return. Default 100, maximum 500. Default: 100
sortBy string Optional Column to rank by before the limit. The tool returns the top `limit` rows by this column out of a larger set, so you cannot re-sort what comes back to get a different ranking. Options: TotalDollars (default), PlannedDollars, FirmDollars, TotalQuantity, PlannedQuantity, FirmQuantity, PeriodDate, ItemCode, SupplierCode. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit for the sensible default (values largest-first, dates and codes ascending). Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per item-site/supplier/period. It aggregates the whole result set server-side, so the totals are right even when only `limit` groups come back. Options: source (Purchase vs Transfer vs Manufacture — use this for 'how much of this is transfers'), supplier, sourceSite, site, item, period, buyer, abc, plus category1..category8 where the customer uses them. Omit for the detail rows. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetLeadTimeDetail

Read-only Permission required

Returns the four lead times StockIQ holds for one item-site-supplier, side by side, one row per leg (admin, manufacturing, shipping, expedited shipping, putaway, and the planning total). call this whenever a user questions a lead time rather than merely asking for it — "why is the lead time 45 when my ERP says 30", "where does this lead time come from", "is StockIQ using my vendor's lead time or its own", "why did the lead time change", "why is my safety stock lead time different". For the plain "what is the lead time" question, ActivePlanningLeadTime from GetItemSiteAttributes is enough. each ROW gives: the active figure (the one the planning engine uses and every order date is built from), the ERP figure the host system sent, StockIQ's calculated figure derived from receipt history, the instance default used when the ERP sent nothing, that leg's method, and the method's plain-English rule. THE method IS PER LEG. One item-site-supplier can plan to the ERP's shipping time and StockIQ's calculated manufacturing time at the same time, so never answer "you are on calculated lead times" for the whole relationship. DO NOT assert which source WON unless the numbers make it unambiguous. Two instance-wide switches are returned in the summary and both override the per-leg method: when 'plan to calculated lead times' is off the engine uses the ERP figure everywhere regardless of method, and 'always use ERP lead times for transfers' forces the ERP figure for warehouse suppliers. Where ERP and calculated hold the same value, the active figure cannot be attributed to either — say so rather than picking. ALL figures ARE calendar days, which is what the user sees and enters. Never convert them to work days in your answer. The summary also carries the safety stock lead time (which is resolved separately and may legitimately differ from the planning lead time), the receipt count behind the calculated figure, and the settings that govern whether a calculated figure can exist at all. GetMetricDefinition explains what any of these mean; this tool returns this relationship's actual values. transfers: when the supplier is a warehouse (the site is restocked by transfer from a hub, including a virtual warehouse), the summary also walks back through the hub to the supplier it buys from and gives every leg plus the END-TO-END total. Use that for "how long from the vendor to this site" — never quote one leg as the whole journey, and never add the legs up yourself from other tools.

ParameterTypeRequiredDescription
itemCode string Optional Item code to look up. Use with siteCode. Default: null
siteCode string Optional Site code to look up. Use with itemCode. Default: null
supplierCode string Optional Optional supplier code. If omitted when using itemCode/siteCode, StockIQ's declared primary supplier is used and the result records that assumption, naming the alternatives. Default: null
itemSiteSupplierId int? Optional ItemSiteSupplierId to look up directly. If provided, the codes are ignored. Default: null

GetLeadTimeVariance

Read-only Permission required

Ranks suppliers, sites, items or individual item-site-supplier relationships by how their lead time has behaved over a window. Use for "which are my worst performing suppliers", "which sites' shipping lead times have increased the most in the last 90 days", "what products have seen a lead-time fluctuation", and "which suppliers have the highest variance between promised and actual delivery". important — what "worst" means here is lead-time reliability and nothing else. This data cannot speak to fill rate, price adherence or on-time-in-full; do not present it as a general supplier scorecard. Pick the measure deliberately, because they answer different questions: Drift is end-of-window minus start-of-window and is signed, so it answers "has it got longer"; Fluctuation is highest minus lowest in the window and answers "is it unstable" (a supplier that swings 30 days either way but ends where it started scores high on Fluctuation and zero on Drift); PromisedVsActual is the planned lead time minus StockIQ's calculated lead time at the end of the window, where positive means we plan with more days than receipts justify and negative means we plan short and the supplier is routinely late. Numbers are whole days. Each group's figure is the average across its item-site-supplier relationships, and WorstChange is the single worst relationship behind that average — quote both, because a large supplier's average hides its outliers.

ParameterTypeRequiredDescription
measure LeadTimeTrendMeasure Optional What to measure: Drift (end minus start of window, signed — "has it got longer"), Fluctuation (max minus min in window — "is it unstable"), PromisedVsActual (planned minus calculated at window end). Default Drift. Default: LeadTimeTrendMeasure.Drift
component LeadTimeComponent Optional Which leg of the lead time: Total, Admin, Manufacturing, Shipping, Putaway. Default Total. Answering a question about shipping or manufacturing lead time with Total is answering a different question, so set this when the user names a leg. Default: LeadTimeComponent.Total
groupBy LeadTimeTrendGrain Optional Roll the result up to one row per group. Supplier, Site, Item, or ItemSiteSupplier for the individual offenders rather than an average. Default Supplier. (Named groupBy before SIQ-1246; groupBy is the vocabulary every grid tool now uses.) Default: LeadTimeTrendGrain.Supplier
daysBack int Optional Size of the look-back window in days, ending today. Default 90. Ignored when startDate is supplied. Retention is governed by the Max Item Site History Days setting (1100 by default), so windows longer than that return only what still exists. Default: DefaultWindowDays
startDate DateTime? Optional Explicit window start (yyyy-MM-dd). Overrides daysBack when supplied. Default: null
endDate DateTime? Optional Explicit window end (yyyy-MM-dd). Defaults to today. Default: null
minimumSnapshots int Optional Minimum lead-time readings a relationship needs inside the window before it is ranked. Default 2, which is the fewest that can show a change at all. Raise it to suppress relationships with barely any history. Default: 2
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
supplierIds List<int> Optional Optional supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
itemIds List<int> Optional Optional item IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
xyzClasses List<string> Optional Optional XYZ classes to filter by (e.g. 'X', 'Y', 'Z'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum number of results to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a larger set, so you cannot re-sort the returned rows to get a different ranking. Options: Change, WorstChange, LeadTimeAtWindowEnd, RelationshipCount, ReceiptCount, Name. Default Change, which is whichever measure you selected. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default (largest change first). Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetOnOrder

Read-only Permission required

Returns open supply orders (purchase orders on order) for an item or for a supplier. Shows PO line details including order numbers, quantities, expected dates, and supplier info. Use when the user asks what's on order, open POs, open orders, incoming supply, or pending deliveries. important — pick the right call shape in a single call, do NOT loop per site or per item: (a) For ONE item at ONE site: pass itemSiteId (or itemCode + siteCode). (b) For ONE item across ALL sites (e.g. 'what's on order for item ABC at all sites'): pass itemCode alone (or itemSiteId for any site of that item) AND set includeAllSites=true. The server pivots to the Item and returns rows across every site — no per-site looping needed. (c) For a supplier (e.g. 'what's on order from DS163', 'what is vendor 00108 still owing us'): pass supplierCode and NO item. This matches the supplier the purchase order was actually placed with. Add itemCode and/or siteCode alongside supplierCode to narrow further. (d) For a broad list of many items (e.g. 'which items have open orders'): use GetOrderScheduleHeader and filter by TotalOnOrderQuantity > 0 in your response. promised-VS-lead-time: every line also carries the promised span (planned receipt date minus order creation date, in calendar days) against the lead times StockIQ holds for that relationship, as DaysBeyondActiveLeadTime and DaysBeyondCalculatedLeadTime. Use minDaysBeyondCalculatedLeadTime for 'which orders are promised further out than our calculated lead time', which is the question a planner asks when they suspect the lead time is wrong rather than the order being late. That is a different question from a late order: lateness is measured against the order's own due date (GetFocusToday, DaysUntilReceiptDue), and an order can be perfectly on schedule against a promise that was never realistic. ⚠️ A few days of positive delta is structural, not a finding: the promised span is a raw calendar-day subtraction while the engine walks work days on the supplier's calendar with holidays, vendor ship schedules and any planning pad. Treat small values as noise and say so.

ParameterTypeRequiredDescription
itemSiteId int? Optional ItemSite ID. If provided, codes are ignored. Default: null
itemCode string Optional Item code to look up. Used when itemSiteId is not provided. Default: null
siteCode string Optional Site code to look up. Used when itemSiteId is not provided. Default: null
includeAllSites bool Optional When true, returns open orders for the same Item across ALL Sites in a single call (pivots from the supplied itemSiteId to its Item, then ignores the Site). Use this instead of calling the tool once per site. When false (default), returns orders only for the exact Item+Site combination. Ignored when supplierCode is supplied. Default: false
startDate string Optional Optional start date filter (yyyy-MM-dd), against the planned receipt date. Default: null
endDate string Optional Optional end date filter (yyyy-MM-dd), against the planned receipt date. Default: null
supplierCode string Optional Supplier code or name. Scopes results to orders placed with that supplier, and makes the item optional — this is how to answer 'what's on order from supplier X'. Resolve ambiguous vendor text with ResolveSupplier first. Default: null
limit int Optional Maximum number of order lines to return. Default 100, maximum 500. Default: 100
sortBy string Optional Column to sort by. PlannedReceiptDate (default) and ExpectedShipDate sort soonest-first; OpenDollars and ReleaseQuantity sort largest-first; DaysBeyondCalculatedLeadTime sorts worst-first; ErpOrderNumber groups by order. Default: DefaultSortBy
minDaysBeyondCalculatedLeadTime int? Optional Keep only lines whose promised span runs at least this many calendar days beyond StockIQ's calculated lead time. Lines with no order creation date or no calculated lead time cannot be compared and are excluded — the summary counts them, so an empty result is never read as 'everything is fine'. Small thresholds return structural noise; 7 or more is a meaningful starting point. Default: null

GetReceiptHistory

Read-only Permission required

Returns what actually happened on past receipts — when each shipment shipped, was delivered and was received, how many days early or late that was, and whether it counted towards StockIQ's calculated lead time. USE this for "did this vendor deliver on time", "how late have this supplier's shipments been", "which suppliers are delivering late", "why is my calculated lead time not moving", "was this order received when it was promised". This is the only tool that returns receipts. GetOnOrder returns open purchase orders (nothing has arrived yet) and GetSupplyOrderHistory returns orders that were placed (what was bought, not what turned up) — neither can answer a delivery-performance question. ⚠️ A receipt's lead-time columns are what happened once on that shipment. They are NOT the item's lead time — that is the resolved Active lead time the engine plans to, which GetLeadTimeDetail returns. Never quote a receipt leg as "the lead time", and never average these yourself and present the result as the calculated lead time: StockIQ's calculated figure filters outliers and pads to a percentile, so your average will not match it and will usually be lower. ⚠️ "On time" is a tolerance band, not exact. A receipt inside the configured early/late tolerance reports OnTime even though it did not arrive on the promised day, and Early means earlier than THE tolerance allows — which ties up cash and space, so it is a finding, not good news. Both tolerances are returned in the summary; state them when you report on-time performance. Set view="performance" for a days-early-or-late distribution across the same population instead of individual receipts — the shape behind the Lead Time Viewer's histogram, and the right answer to "how reliable is this supplier" over many shipments. Scope it either to one relationship (itemSiteSupplierId, or itemCode + siteCode + optional supplierCode) OR with the fleet filters. All day counts are calendar days.

ParameterTypeRequiredDescription
view string Optional Report individual receipts ("receipts", default) or the days-early-or-late distribution ("performance"). Any other value is refused rather than defaulted. note: the performance view cannot apply onTimeStatus or onlyExcludedFromLeadTime — it says so in Assumptions rather than dropping them silently. Default: "receipts"
itemSiteSupplierId int? Optional ItemSiteSupplierId to drill into one relationship. Ignores the fleet filters when supplied. Default: null
itemCode string Optional Item code, used with siteCode to drill into one relationship. Default: null
siteCode string Optional Site code, used with itemCode. Default: null
supplierCode string Optional Optional supplier code for the drill-down. Omitted, StockIQ's declared primary supplier is used and the result records that assumption, naming the alternatives. Default: null
dateFilter string Optional Which date the start/end range filters on: "received" (default) or "ordered" (the order creation date). Any other value is refused rather than defaulted. Default: "received"
startDate DateTime? Optional Earliest date, ISO 'yyyy-MM-dd'. Default: null
endDate DateTime? Optional Latest date, ISO 'yyyy-MM-dd'. Default: null
onTimeStatus string Optional Return only receipts with this on-time status: "Late", "Early" or "OnTime". Omit for all. Remember Early means outside the early tolerance, not merely ahead of schedule. Default: null
onlyExcludedFromLeadTime bool Optional True to return only receipts that did NOT count towards the calculated lead time. Use for "why is my calculated lead time not moving" — the result says which of the three reasons applies to each one. Default: false
leg string Optional For view="performance": which leg to measure. One of Planning (default, the whole span to receipt), Administration, Manufacturing, Shipping, Vendor. Putaway is NOT supported and will be rejected. Default: "Planning"
siteIds List<int> Optional Filter by site IDs. Omitted, defaults to the user's allowed sites. Default: null
supplierIds List<int> Optional Filter by supplier IDs — the vendor the order was placed with. Default: null
buyerIds List<int> Optional Filter by buyer IDs. Resolve a buyer name with ResolveBuyer first. Default: null
shipperIds List<int> Optional Filter by shipper IDs. Default: null
itemIds List<int> Optional Filter by item IDs. Default: null
abcClasses List<string> Optional Filter by ABC classes (e.g. ['A','B']). Default: null
xyzClasses List<string> Optional Filter by XYZ classes. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs. Default: null
limit int Optional Maximum receipts to return. Default 100, ceiling 500. Ignored for view="performance". Default: DefaultLimit
sortBy string Optional Sort column, applied before the limit — so the returned rows are the top N by this column and cannot be re-ranked. Options: ReceiptDelayDays (default, latest first), DateReceived, PlannedReceiptDate, ShipDelayDays, DeliveryDelayDays, ItemCode, SupplierCode. Default: null
sortDescending bool? Optional Override the natural sort direction. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

GetSupplyOrderHistory

Read-only Permission required

Returns historical purchasing - supply orders (purchase orders, transfers, work orders) that were actually placed, from the Order History screen. Use this for anything about what was bought: spend with a vendor, what we ordered for an item, which orders StockIQ placed, which orders still need to sync to the ERP, which lines a buyer edited. This is NOT the tool for what is still open (use GetOnOrder), what we should buy (use GetOrderSuggestions), or what is planned (use GetOrderScheduleHeader). pick A groupBy - it decides the shape of the answer and is the difference between one useful row and a thousand: (a) groupBy="supplier" for 'how much are we spending with vendor X', 'who are our biggest vendors' - one row per vendor with total spend. (b) groupBy="month" or "supplierMonth" for spend over time / trend questions. (c) groupBy="order" for 'what orders did we place today', 'what orders still need to sync' - one row per order, and the only mode that reports ERP sync status. (d) groupBy="item", "site" or "buyer" for 'what are we buying most of', 'spend by warehouse'. (e) groupBy="line" (the default) for the individual PO lines - use it when the user wants the detail, or after a roll-up to drill in. dates: filters on the order creation date. If you do not pass startDate/endDate the server applies a default window (90 days for line detail, 365 days for roll-ups) and says so - so if the user asked about a year, or 'all time', pass explicit dates rather than relying on the default. supplier means THE vendor THE order WAS placed with, which is what the user means by 'spending with'. Pass supplierCodes; resolve ambiguous vendor text with ResolveSupplier first.

ParameterTypeRequiredDescription
groupBy string Optional Shape of the answer. One of: . Default "line". Default: "line"
startDate string Optional Earliest order creation date, ISO 'yyyy-MM-dd'. Omit to accept the default window. Default: null
endDate string Optional Latest order creation date, ISO 'yyyy-MM-dd'. Omit to accept the default window. Default: null
supplierCodes List<string> Optional Supplier codes or names - the vendor the order was placed with. This is the right filter for 'what are we spending with X'. Default: null
supplierIds List<int> Optional Resolved supplier IDs, if you already have them (e.g. from ResolveSupplier). Same meaning as supplierCodes. Default: null
itemCodes List<string> Optional Item codes to filter by. Default: null
itemIds List<int> Optional Resolved item IDs, if you already have them. Default: null
siteCodes List<string> Optional Site codes to filter by. Default: null
siteIds List<int> Optional Resolved site IDs, if you already have them. Default: null
buyerIds List<int> Optional Buyer IDs to filter by. Resolve a buyer name with ResolveBuyer first. Default: null
shipperIds List<int> Optional Shipper IDs to filter by. Default: null
erpOrderNumbers List<string> Optional ERP order numbers. Passing these skips the default date window - a named order is found whenever it was placed. Default: null
stockIqOrderNumbers List<string> Optional StockIQ order numbers. Passing these skips the default date window. Default: null
supplyTypes List<string> Optional Supply types by name (not number): ReplenishmentPO, DropShipPO, PO, TransferOrder, WorkOrder, Unbuild. Default: null
stockIqStatuses List<string> Optional StockIQ line statuses by name: Review, Confirmed, HoldForMerge, Merged, Approved, Accepted, Canceled, Error. Default: null
erpLineStatuses List<string> Optional ERP line statuses by name: Open, Closed, Canceled, OnHold, Released, Error. Default: null
syncStatuses List<string> Optional ERP sync statuses by name: NeedsInitialSync, Sent, Synced, NeedsReSync, NotApplicable. For 'what still needs to sync' pass ["NeedsInitialSync","NeedsReSync"] with groupBy="order". Default: null
createdBy string Optional Who created the order: "stockiq" for orders StockIQ placed, "erp" for orders imported from the ERP. Omit for both. Default: null
hasBuyerEditedQuantity bool Optional True to return only lines whose quantity a buyer edited. Default false. Default: false
abcClasses List<string> Optional ABC classes to filter by (e.g. 'A','B'). Default: null
xyzClasses List<string> Optional XYZ classes to filter by. Default: null
itemSiteCategory1Ids List<int> Optional Item-site Category 1 IDs. If the user is category-restricted the framework intersects automatically. Default: null
itemSiteCategory2Ids List<int> Optional Item-site Category 2 IDs. Default: null
itemSiteCategory3Ids List<int> Optional Item-site Category 3 IDs. Default: null
itemSiteCategory4Ids List<int> Optional Item-site Category 4 IDs. Default: null
includeInactive bool Optional Set false to exclude lines whose item-site has since been deactivated or removed from the catalog. Default true, which is what the Order History screen does - those were still real purchases and excluding them understates spend. Applies to line and roll-up groupings only: with groupBy="order" the rows come from the order header, which has no item-site activity filter, and the Assumptions array will say so. Default: true
maxRows int Optional Maximum rows to return. Default 200, ceiling 1000 (roll-ups cap at 500 groups). Totals are always over the full matched set, never just the returned rows. Default: DefaultMaxRows
sortBy string Optional Sort override. Line detail: OrderCreationDate (default, newest first), LinePurchaseCost, ReleaseQuantity, ErpOrderNumber, ItemCode, SupplierCode. Roll-ups: TotalPurchaseCost (default), LineCount, OrderCount, TotalQuantity. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null

Sales

7 tools

Sales orders, sales history, customers and ship-tos, and at-risk customer analysis.

GetAtRiskCustomers

Read-only Permission required

Returns a summary of customers who have open sales orders that are late or at risk of being late — i.e. orders that are already past their due date, not yet fulfilled, or predicted to miss their due date. Returns a grid of customers with counts of at-risk, already-late, predicted-late, and partially-filled orders. Pass customerIds to focus on specific customers (e.g. after calling GetTopCustomers). Default look-ahead window is 30 days.

ParameterTypeRequiredDescription
customerIds List<int> Optional Filter to specific customer IDs. Typically passed from GetTopCustomers results. Default: null
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
startDate DateTime? Optional Start of the order due date window. Defaults to today. Default: null
endDate DateTime? Optional End of the order due date window. Defaults to 30 days from today. Default: null
limit int Optional Maximum number of customers to return. Default 20. Default: 20

GetAtRiskSalesOrders

Read-only Permission required

Returns open sales order line detail for orders that are at risk — already late, not yet fulfilled, or predicted to miss the due date. Use this to drill into specific customers after GetAtRiskCustomers, or to see all at-risk orders across the business. Default look-ahead window is 30 days.

ParameterTypeRequiredDescription
customerIds List<int> Optional Filter to specific customer IDs. Default: null
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
startDate DateTime? Optional Start of the order due date window. Defaults to today. Default: null
endDate DateTime? Optional End of the order due date window. Defaults to 30 days from today. Default: null
limit int Optional Maximum number of order lines to return. Default 50. Default: 50

GetSalesOrderDetail

Read-only Permission required

Returns sales order line detail filtered by items, customers, sites, and date range. Use to answer 'how much of X did we sell' or 'show me orders for customer Y'. For one specific order number, product group (hierarchy node) or item-site, use GetSalesOrders instead. The SummaryText includes accurate totals across ALL matching rows even if the grid is truncated.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
itemIds List<int> Optional Filter by item IDs. Default: null
customerIds List<int> Optional Filter by customer IDs. Default: null
customerShipToIds List<int> Optional Filter by customer ship-to IDs. Default: null
startDate DateTime? Optional Start date for demand date range filter. Default: null
endDate DateTime? Optional End date for demand date range filter. Default: null
includeClosed bool Optional Include closed/fulfilled orders. Default false. Default: false
limit int Optional Maximum number of rows to display in the grid. Default 200. Default: 200

GetSalesOrders

Read-only Permission required

Returns the sales order lines for ONE anchor: specific order numbers ('show me order #12345', 'what is on order 0009'), a product group (resolved hierarchy node ids), or a single item-site. Pass exactly one of: orderNumbers; hierarchyNodeIds; itemSiteId; or itemCode (with siteCode when the item is stocked at more than one site). To search across items, customers or sites instead, use GetSalesOrderDetail. The SummaryText includes accurate totals across ALL matching rows even if the grid is truncated.

ParameterTypeRequiredDescription
orderNumbers string[] Optional Sales order numbers to look up, e.g. ["0009"] or ["SO-100","SO-101"]. Returns every line on those orders; the date range and includeClosed do not apply. Default: null
hierarchyNodeIds List<int> Optional Resolved internal hierarchy node ids (product groups). Default: null
itemSiteId int? Optional An ItemSiteId from a grid row. Includes the sales of any item-site it replaced. Default: null
itemCode string Optional Item code, when the item-site is named by the user rather than taken from a grid. Includes the sales of any item-site it replaced. Default: null
siteCode string Optional Site code for itemCode. Required when the item is stocked at more than one site. Default: null
startDate DateTime? Optional Start date for the demand date range filter. Default: null
endDate DateTime? Optional End date for the demand date range filter. Default: null
includeClosed bool Optional Include closed/fulfilled orders. Default false. Default: false
limit int Optional Maximum number of rows to display in the grid. Default 200. Default: 200

GetTopCustomers

Read-only Permission required

Returns the top customers, ranked. Runs in one of two modes. window mode — used when startDate, endDate or siteIds is supplied. Ranks customers by their actual sales over that window and those sites, aggregated per customer: one row per customer, NOT one row per customer per month. This is the mode for 'top customers this year', 'top customers for FY26', 'top customers at warehouse 04'. SummaryText states the period the result actually covers, which can be wider than the dates requested because actuals are stored in whole periods — describe the result using the covered dates it reports, never the dates you asked for. stratification mode — used only when no window and no site is given. Returns the stored ranking from the last customer classing run, which is the only mode that carries ABC class, rank, score and usage pattern. That ranking is NOT period-scoped: its window comes from the classing settings, not from anything the user asked for. Never present it as covering a specific period; if the user named one, use window mode instead. Window mode ranks over monthly periods. For an exact day-level window, or for a ship-to or item breakdown, use GetCustomerActuals with aggregate=true. If no stratification rankings exist, customer classing may need to be enabled and run — use GetCustomerClassSettings to check, then UpdateGlobalCustomerClassSettings to enable and RunCustomerClassing to calculate.

ParameterTypeRequiredDescription
topN int Optional Number of top customers to return. Default 20. Default: 20
siteIds List<int> Optional Filter by site IDs. Supplying any site switches the tool to window mode, because the stored stratification ranking is org-wide and cannot be scoped to a site. Defaults to the user's allowed sites. Default: null
startDate DateTime? Optional Start of the period to rank over. Supplying it switches the tool to window mode. Default: null
endDate DateTime? Optional End of the period to rank over. Supplying it switches the tool to window mode. Default: null
sortBy ActualsMeasure Optional Measure to rank by in window mode: Revenue (default), Margin, QuantitySold or Hits. In stratification mode Revenue, Margin and QuantitySold rank on the stored classing figures, and Hits ranks on transaction count. Default: ActualsMeasure.Revenue
hierarchyNodeIds List<int> Optional Scope to one or more forecast hierarchy nodes - a product line, category, program or subgroup - and everything beneath them, for 'top customers for this product line'. Resolve the node by name with FindHierarchyNodes first. Supplying it switches the tool to window mode, because the stored stratification ranking is org-wide and cannot be scoped to part of the catalogue. A customer group node (a forecast group) is refused for now - ranking customers inside one customer group is not supported yet. Default: null

GetUnusualSales

Read-only Permission required

Returns individual sales that StockIQ flagged as unusually large for the item, the item-site, or that customer-item pair — demand spikes that normal sales and seasonality do not explain. Use for "identify spikes in demand that don't align with normal sales", "was that big order a one-off", and "show me the outlier sales for this product over the last three years". Each row is one sales order line, with the date, the quantity, the customer where known, and the outlier score. important — the score IS the severity, not a threshold: it is a robust, standard-deviation-like measure of how far outside normal the sale sat, and StockIQ flags the sale when it reaches the configured threshold. Higher is further outside normal. A score of exactly 0 means a rule explicitly cleared the sale (for example it was within the typical-order-quantity multiplier), so 0 is not a near-miss. important — "unusual" is a customer setting, not a fixed definition. Which grains are examined (item, item-site, item-customer) and whether a sale must fail one grain or all of them is configured per customer, and this tool reports the active configuration in its assumptions. Read it back to the user rather than implying a universal rule; a sale that is unusual for one customer's settings would not be for another's. Scores are only populated for the grains that customer examines, so an empty score column means that grain was not evaluated — it does not mean the sale was normal there. This tool answers what was flagged, not why. It cannot say whether a spike was a promotion, a one-off project order or a data error; where a sale is linked to a recorded event or carries a note, those columns say so.

ParameterTypeRequiredDescription
daysBack int Optional Size of the look-back window in days, ending today. Default 1095 (three years). Ignored when startDate is supplied. Default: DefaultWindowDays
startDate DateTime? Optional Explicit window start (yyyy-MM-dd). Overrides daysBack when supplied. Default: null
endDate DateTime? Optional Explicit window end (yyyy-MM-dd). Defaults to today. Default: null
itemIds List<int> Optional Optional item IDs to filter by — get IDs from ResolveItem. This is the usual way to ask the question for one product. Default: null
siteIds List<int> Optional Optional site IDs to filter by. If omitted, uses the user's allowed sites. Default: null
supplierIds List<int> Optional Optional primary supplier IDs to filter by. Default: null
buyerIds List<int> Optional Optional buyer IDs to filter by. Default: null
abcClasses List<string> Optional Optional ABC classes to filter by (e.g. 'A', 'B', 'C'). Default: null
xyzClasses List<string> Optional Optional XYZ classes to filter by (e.g. 'X', 'Y', 'Z'). Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum number of sales to return. Default 50. Default: 50
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a larger set, so you cannot re-sort the returned rows to get a different ranking. Options: ItemOutlierScore (default, most extreme first), ItemSiteOutlierScore, ItemCustomerOutlierScore, Quantity, DemandDate, Revenue. Rows with no score for the chosen grain always rank last, whichever direction is used. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit to use the sensible default (most extreme first). Default: null

SendAtRiskCustomerEmail

Write Permission required Not available to MCP tokens

Sends an at-risk order status email to the customer's contact email address on file. The email lists all open sales orders that are late or predicted to be late. Only call this after confirming with the user which customer to email. Returns a confirmation message with the recipient address.

This tool is reachable only by a signed-in StockIQ user. An MCP token may not call it.
ParameterTypeRequiredDescription
customerId int Required The ID of the customer to email.
siteIds List<int> Optional Filter by site IDs. Defaults to the user's allowed sites. Default: null
startDate DateTime? Optional Start of the order due date window. Defaults to today. Default: null
endDate DateTime? Optional End of the order due date window. Defaults to 30 days from today. Default: null

Executive Summary

10 tools

The breakdowns behind the Executive Summary screen - inventory balance, burn down, stratification, service level and turns over time.

GetExecutiveSummaryBurnDownBreakdown

Read-only Permission required

Returns the One-Year Burn Down breakdown for the Executive Summary screen: distribution of items across months-of-supply buckets, total annual burndown value, and items with the largest dollars at risk in short-supply or excessive-coverage buckets. Use this when asked about inventory liquidity, depletion timing, annual burndown, or value at risk by supply duration.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null

GetExecutiveSummaryLastUsedBreakdown

Read-only Permission required

Returns the Last Used breakdown for the Executive Summary screen: distribution of items across months-since-last-used buckets, the largest dollars locked in stale (>24 months) and never-used inventory, and the active-side count for context. Use this when asked about stagnant inventory, obsolescence risk, dead-stock candidates, or staleness by usage recency.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null

GetExecutiveSummaryOpportunityAndInvestmentBreakdown

Read-only Permission required

Returns the Opportunity & Investment breakdown for the Executive Summary screen: per-ABC-class totals of opportunity dollars (excess on hand vs. active target) and investment dollars (below-target shortfall), the inventory balance totals split into 6 buckets (Panic, Safety, Cycle, Planned Overstock, Overstock, Excess), and the most egregious individual items in each direction. Use this when asked about inventory imbalances, overstock vs. shortfall, opportunity to reduce inventory, or investment needed to reach target stock.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null

GetExecutiveSummaryOverview

Read-only Permission required

Returns a comprehensive executive summary of the current inventory position, including KPI card metrics (on-hand value, stock outs, excess, dead stock, slow movers, open supply orders), inventory position breakdown, and usage pattern breakdown. Use this tool when asked about overall business health, inventory performance, or executive-level metrics.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null

GetExecutiveSummaryRevenueByPatternBreakdown

Read-only Permission required

Returns the Revenue by Usage Pattern breakdown for the Executive Summary screen: expected annual revenue and SKU count grouped by usage pattern (New, Recurring, Sporadic, Slow, Dead, Unknown), plus the largest revenue items sitting in unfavorable patterns (Slow, Sporadic, Dead) where revenue is locked up in low-velocity inventory. Use this when asked about revenue concentration, revenue at risk, or mismatches between revenue and usage pattern.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null

GetExecutiveSummaryStratificationBreakdown

Read-only Permission required

Returns the Stratification breakdown for the Executive Summary screen across four orthogonal dimensions: ABC class, XYZ class, Inventory Position, and Usage Pattern. For each, reports SKU counts plus current/average/target on-hand balance and holding cost so Claude can comment on imbalances (e.g. dollars concentrated in low-velocity classes, current vs target gap, items in unfavorable inventory positions). Use when asked about inventory mix, classification health, or stratification. For ONE dimension as a pie chart, pass `dimension` by name: InventoryPosition for inventory health distribution or stock position breakdown (how many items are Out of Stock, Below Safety Stock, OK, Overstocked, Excess); UsagePattern for demand patterns or item activity classification (New, Recurring, Sporadic, Slow, Dead); Abc or Xyz for the class mix. Omit it (All) for every dimension as text.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null
dimension StratificationDimension Optional Which breakdown to return, by name: All (default; every dimension as text), Abc, Xyz, InventoryPosition or UsagePattern (one dimension, as a pie chart). Default: StratificationDimension.All

GetExecutiveSummaryWeeksOfSupplyBreakdown

Read-only Permission required

Returns the Weeks of Supply breakdown for the Executive Summary screen: distribution of items across WoS buckets (No Inventory, <1, 1-4, 4-8, 8-12, 12-24, 24-52, >52 Weeks, No Demand), aggregate position, and the most concerning items in each direction (at risk of stocking out, excessive coverage, inventory with no demand). Use this when asked about coverage, days/weeks/months of supply, stockout risk distribution, or inventory burndown.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null

GetInventoryOverTimeChart

Read-only Permission required

Returns an inventory over time chart showing on-hand value, safety stock and max stock bands, and inventory as a percentage of annual revenue. Use this when asked about inventory trends or historical inventory levels.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null

GetInventoryTurnsOverTimeChart

Read-only Permission required

Returns an inventory turns over time chart showing average turns, target turns, and on-hand balance trends. Use this when asked about inventory turnover, turn rates, or inventory efficiency trends. Can be scoped to one item-site category value (a price group, product line, etc.) — call ResolveItemSiteCategory to turn the value the user named into an ID first, and pass it as the matching itemSiteCategoryNIds. group BY: pass groupBy (category1..category8, or site) to compare groups in ONE call, e.g. 'which product types are driving the decline'. The result is then a grid with one row per group: its first and latest average turns and the change, biggest decline first. It works only when that category or site is a level of the customer's item hierarchy above the item level; otherwise the tool refuses and lists the groupings that are available. excluding items: pass excludeItemCodes to leave items out, as exact item codes or as a code prefix ending in * for a family (e.g. 'dlca-BLK*'). Every entry must match at least one item or the call is refused. lifecycle: itemStatuses is StockIQ's own Active/Discontinued status; a customer's own lifecycle states (Active, Retired, Disabled ...) usually live in an item-site category, so resolve that category and pass the values to keep as its itemSiteCategoryNIds.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If user is restricted by category, framework will intersect automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory5Ids List<int> Optional Filter by item-site Category 5 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory6Ids List<int> Optional Filter by item-site Category 6 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory7Ids List<int> Optional Filter by item-site Category 7 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory8Ids List<int> Optional Filter by item-site Category 8 IDs — get IDs from ResolveItemSiteCategory. Default: null
groupBy string Optional Compare groups in one call: category1..category8 or site. Returns one row per group instead of the chart. Default: null
itemStatuses List<ItemStatus> Optional Keep only these StockIQ item statuses (Active, Discontinued). Default: null
excludeItemCodes List<string> Optional Items to leave out: exact item codes, or a prefix ending in * for a family ('dlca-BLK*'). Default: null
limit int Optional With groupBy, the most groups to return, biggest decline first. Default 25, maximum 100. Default: DefaultGroupLimit

GetServiceLevelOverTimeChart

Read-only Permission required

Returns a service level over time chart showing monthly fill rate performance by hierarchy node. Use this when asked about service levels, fill rates, or delivery performance trends.

ParameterTypeRequiredDescription
siteIds List<int> Optional Filter by site IDs Default: null
primarySupplierIds List<int> Optional Filter by primary supplier IDs Default: null
buyerIds List<int> Optional Filter by buyer IDs Default: null
abcClasses List<string> Optional Filter by ABC classification values, e.g. ['A','B'] Default: null

Settings

21 tools

Reading and changing planning settings - order policies, safety stock overrides, replenishment and classing settings, and remembered facts.

DeleteForecastSettingsOverride

Write Permission required

Deletes the forecast-settings override that a node of the forecast hierarchy holds for one forecast series, so the node goes back to inheriting the settings controlled above it, or the level defaults. Only an override AT the named node can be deleted; if the node inherits its settings the tool says which node's override it inherits, and nothing is deleted. To remove the overrides below a node use SaveForecastSettings with deleteChildSettings=true. Two-step confirmation: call with userConfirmed=false (default) first and show the user the preview - the override's current values, who created it and when, and what the node will inherit after the delete. Nothing is written on the preview call. Call again with userConfirmed=true and the same arguments only after the user approves. Name the node with hierarchyNodeId or with itemCode and siteCode. Without forecastSeriesCode the operational series is assumed and the preview says so.

ParameterTypeRequiredDescription
hierarchyNodeId int? Optional HierarchyNodeId of the node. Optional when itemCode and siteCode are given. Default: null
itemCode string Optional Item code, together with siteCode, when the user names an item at a site rather than a node. Default: null
siteCode string Optional Site code, together with itemCode. Default: null
forecastSeriesCode string Optional Forecast series code or name. Optional - the operational series when omitted. Default: null
userConfirmed bool Optional Pass true only after the user has explicitly approved the preview. When false (default), nothing is deleted. Default: false

DeleteOrderPolicyOverride

Write Permission required

Deletes an order policy override for an item at a site. Uses a two-step confirmation flow: first call with userConfirmed=false (default) to preview what will be deleted, then call again with userConfirmed=true after the user approves. If multiple overrides exist for the item-site (one per DateEffective), pass dateEffective to pick which one to delete; omit dateEffective to target the open-ended override (the one with no DateEffective set). Deleting reverts the item-site to default order policy settings. After a confirmed delete the item is automatically replanned, so replenishment reflects the change immediately.

ParameterTypeRequiredDescription
itemCode string Required The item code
siteCode string Required The site code
dateEffective string Optional Optional effective date (ISO yyyy-MM-dd) used to disambiguate when multiple overrides exist for the item-site. Omit / leave null to target the override with no DateEffective set. Default: null
userConfirmed bool Optional Set to true only after the user has explicitly confirmed the deletion. When false (default), returns a preview for the user to review. Default: false

DeleteSafetyStockOverride

Write Permission required

Deletes a safety stock override for an item at a site. This tool uses a two-step confirmation flow: first call with userConfirmed=false (default) to preview what will be deleted, then call again with userConfirmed=true after the user approves. This permanently removes the override so the item-site will revert to the default safety stock settings. After a confirmed delete the item is automatically replanned, so replenishment reflects the change immediately.

ParameterTypeRequiredDescription
itemCode string Required The item code
siteCode string Required The site code
userConfirmed bool Optional Set to true only after the user has explicitly confirmed the deletion. When false (default), returns a preview for the user to review. Default: false

ForgetFact

Write

Stops a remembered fact from being recalled in future conversations. Call ListMemories first to find the ID - never guess one, and never show the ID to the user; refer to the fact by what it says. Forgetting one of the user's own facts happens immediately. Forgetting an organisation fact uses two-step confirmation: call first with userConfirmed=false (default) to preview, then again with userConfirmed=true once the user approves, because it changes what every colleague sees.

ParameterTypeRequiredDescription
memoryId int Required The ID of the memory to forget, from ListMemories.
userConfirmed bool Optional Set to true only after the user has approved forgetting an organisation-wide fact. Ignored for the user's own facts, which are forgotten immediately. Default: false

GetCustomerClassSettings

Read-only Permission required

Returns the customer classing configuration: whether classing is enabled, update frequency, number of classes, scoring weights, and ABC break thresholds. Use this to understand why customer rankings may be missing or how they are calculated.

Takes no parameters.

GetForecastSettings

Read-only Permission required

Returns the effective forecast settings for one node of the forecast hierarchy - an item at a site, or a group node - and where each comes from: this node's own override, an override inherited from a node above it, or the level defaults. Covers control (Auto / Manual / Do Not Forecast), the auto-forecast resume date, forecast interval, unit of measure, freeze periods and the first unfrozen period, the forecast start setting and date, minimum hits, the locked periods, and how many child overrides sit below the node. Name the node with hierarchyNodeId (from FindHierarchyNodes or ResolveHierarchyNodes) or with itemCode and siteCode. Name NO node to get the instance-wide defaults instead - what Settings > Default Forecast Settings holds, which every node without an override of its own inherits. Without forecastSeriesCode every forecast series is described. The answer names the StockIQ screen and field for each setting - use that wording; never invent a field name. To change a setting use SaveForecastSettings; to remove a node's own override use DeleteForecastSettingsOverride.

ParameterTypeRequiredDescription
hierarchyNodeId int? Optional HierarchyNodeId of the node. Optional when itemCode and siteCode are given, or when you want the instance defaults. Default: null
itemCode string Optional Item code, together with siteCode, when the user names an item at a site rather than a node. Default: null
siteCode string Optional Site code, together with itemCode. Default: null
forecastSeriesCode string Optional Optional forecast series code or name. Omit to describe every series. Default: null

GetItemSiteReplacements

Read-only Permission required

Returns configured item-site replacements (part supersessions) from the Item Site Replacements table. This is the only authoritative source for whether a part is replaced by, or replaces, another part. An item code matches whether it is the replaced (old) part or the replacing (new) part, and each row says which. important: never infer a replacement from item description text — some customers write conventions like 'USE #1234567' into descriptions, and those are NOT replacement records. If this tool returns no rows for an item, the correct answer is that no replacement is configured for it, not that one exists in the description. Omitting itemCode returns all configured replacements, which is capped; prefer filtering by item.

ParameterTypeRequiredDescription
itemCode string Optional Item code to look up. Matches the replaced part OR the replacing part. Omit to return all replacements (capped). Default: null
siteCode string Optional Optional site code. Keeps rows where either side of the replacement is at that site. Default: null
itemSiteId int? Optional Optional ItemSite ID, when it is already known. Matches either side of the replacement. Default: null
siteIds List<int> Optional Do not set. The system fills this with the sites this account may see. Default: null

GetOrderPolicyOverrides

Read-only Permission required

Returns order policy setting overrides. When itemCode is omitted or null, returns ALL overrides in the system. When itemCode is provided, returns overrides for that item, optionally filtered to a specific site.

ParameterTypeRequiredDescription
itemCode string Optional Optional item code to filter overrides for. If omitted, returns all overrides. Default: null
siteCode string Optional Optional site code to filter to a specific site Default: null

GetReplenishmentSettings

Read-only Permission required

Returns the global replenishment settings: planning horizon, order defaults, backorder rules, order targeting, warehouse capacity, and advanced settings. Use this to answer questions about how replenishment is configured.

Takes no parameters.

GetSafetyStockOverrides

Read-only Permission required

Returns safety stock setting overrides. When itemCode is omitted or null, returns ALL overrides in the system. When itemCode is provided, returns overrides for that item, optionally filtered to a specific site.

ParameterTypeRequiredDescription
itemCode string Optional Optional item code to filter overrides for. If omitted, returns all overrides. Default: null
siteCode string Optional Optional site code to filter to a specific site Default: null

ListMemories

Read-only

Lists the durable facts you have remembered, with the ID needed to update or forget one. Call this before RememberFact so you can update an existing fact in place instead of recording a near-duplicate, and before ForgetFact to find the right ID. Returns both the current user's own memories and the organisation-wide ones. The IDs are for tool calls only - never show them to the user.

Takes no parameters.

RememberFact

Write Permission required

Remembers a durable fact for this user, so it is available in their later conversations. This is the default scope - use it unless the user explicitly says the fact is for the whole team or organisation, in which case use RememberOrgFact. important: call ListMemories first. If a fact covering the same thing already exists, this tool updates it in place instead of adding a near-duplicate, which is what keeps memory useful over time. Record only durable facts - what a term means in this business, how their sites relate, a recurring date, a standing preference - never a one-off filter value or the answer to the current question. Saves immediately; tell the user plainly what you recorded.

ParameterTypeRequiredDescription
fact string Required The fact to remember, as one self-contained sentence. It must still make sense read months later with no conversation around it.
term string Optional Optional. If this fact defines a single term in the customer's vocabulary (for example 'Program' or '1*Supplier'), pass just that term here. Default: null

RememberOrgFact

Write Permission required

Remembers a durable fact for the whole organisation, so it is available to every user in later conversations. Requires the Administer Edison permission. Use this only when the user explicitly says the fact is for everyone ('for the team', 'for all of us', 'organisation-wide'). If they did not say so, use RememberFact instead and ask whether they want it shared. Two-step confirmation: call first with userConfirmed=false (default) to preview, then again with userConfirmed=true once the user has approved. important: call ListMemories first - if a fact covering the same thing already exists, this updates it in place rather than adding a near-duplicate. Best used for vocabulary the whole business shares: what a category level is called, what a code prefix means, how sites relate, when the fiscal year starts.

ParameterTypeRequiredDescription
fact string Required The fact to remember, as one self-contained sentence. It must still make sense to a different colleague months later with no conversation around it.
term string Optional Optional. If this fact defines a single term in the customer's vocabulary (for example 'Program' or '1*Supplier'), pass just that term here. Default: null
userConfirmed bool Optional Set to true only after the user has explicitly approved the preview. When false (default), returns a preview for them to review. Default: false

ResolveSettingLocation

Read-only

Finds where a StockIQ setting lives: the settings screen that hosts it, the field's exact on-screen label, and the permission needed to change it. Use this whenever the user asks where to change or find a setting, and always before telling anyone a setting does not exist or is not configurable — settings are frequently on screen under wording different from the one the user searched for (for example 'allow recurring safety stock' is labelled 'Retrospective SS - Allow on Recurring Items?'). Also use it when a settings update tool reports that it does not own the setting you named, to find the tool or screen that does. Searches field labels, property names and help text. This returns the location of a setting, never its current value — use the Get*Settings tools for values.

ParameterTypeRequiredDescription
settingName string Required The setting as the user described it, in their own words, e.g. 'allow recurring safety stock' or 'how many weeks do we plan replenishment for'.

RunCustomerClassing

Write Permission required

Runs the customer classing calculation asynchronously. This scores and ranks all customers by their contribution to revenue/margin. Uses a two-step confirmation flow: first call with userConfirmed=false (default) to show the user what the run affects, then call again with userConfirmed=true after they approve. important: Requires EditGlobalCustomerClassSettings permission — always check with CheckUserPermission first.

ParameterTypeRequiredDescription
userConfirmed bool Optional Set to true only after the user has explicitly confirmed the run. When false (default), describes what the run would do instead of starting it. Default: false

SaveForecastSettings

Write Permission required

Changes the forecast settings of one node of the forecast hierarchy (an item at a site, or a group node) for one forecast series: control (Auto / Manual / NotForecasted), the auto-forecast resume date, interval, freeze periods, the Algorithm Start Date and its Start Date, minimum hits, unit of measure, the per-period locks, the settings note, and optionally the removal of every child override below the node. Only the settings you pass change; the rest keep their current effective values. Use this for explicit settings intents ('set it to manual', 'resume auto-forecasting in March', 'lock December', 'start forecasting this item from 1/1/2026 instead of first sale', 'remove the child overrides under Headphones'). To change forecast quantities use SaveForecast instead - it applies its own settings consequences. Two-step confirmation: call with userConfirmed=false (default) first and show the user the preview - it lists every change old to new, whether an override is being created at this node (a node using defaults or inherited settings starts controlling its own forecast settings the moment it is saved), how many child overrides sit below and what happens to them, and what the control change means in this instance's manual mode. Nothing is written on the preview call. Call again with userConfirmed=true and the same arguments only after the user approves. Name the node with hierarchyNodeId or with itemCode and siteCode. Without forecastSeriesCode the operational series is assumed and the preview says so - relay that assumption.

ParameterTypeRequiredDescription
hierarchyNodeId int? Optional HierarchyNodeId of the node. Optional when itemCode and siteCode are given. Default: null
itemCode string Optional Item code, together with siteCode, when the user names an item at a site rather than a node. Default: null
siteCode string Optional Site code, together with itemCode. Default: null
forecastSeriesCode string Optional Forecast series code or name. Optional - the operational series when omitted. Default: null
forecastControl string Optional Auto, Manual or NotForecasted. Optional. NotForecasted (Do Not Forecast) always removes the child overrides below the node. Default: null
autoForecastResumeDate string Optional Date auto-forecasting resumes (yyyy-MM-dd), for an Auto node in resume-date mode: periods before it stay as manually set. Pass 'none' to clear it so every period is forecast. Optional. Ignored by StockIQ in per-period-lock mode and cleared on a Manual node. Default: null
interval string Optional Monthly or Weekly. Optional. Changing it re-expresses any locked periods in the new interval. Default: null
forecastFreezePeriods int? Optional Number of periods from the current one that a save may not change. 0 means no freeze. Optional. Default: null
minHitsToBeginForecasting int? Optional Minimum number of demand hits before StockIQ begins forecasting the node. Optional. Default: null
prorateFirstPeriodSalesForMissedDays bool? Optional Prorate the first period's sales for the days before the forecast start. Optional. Default: null
enableStatisticalForecastAfterAutoForecastStart bool? Optional Keep producing the statistical forecast after the auto-start date. Optional. Default: null
unitOfMeasure string Optional Units, Cogs, Revenue or Margin. Optional. Default: null
forecastStart string Optional The Algorithm Start Date option - where the forecasting algorithms begin reading this node's history. On screen and here: 'From First Sale' (FromFirstSale), 'From Creation Date' (FromCreationDate), 'From A Specific Date' (FromProductLaunchDate - the option for a date the user names, despite the code name), 'From Date First Stocked' (FromDateFirstStocked). Optional. This is the setting a user means by 'history start', 'start date' or 'start forecasting from'; there is no 'History Start Date' field in StockIQ. Default: null
forecastStartDate string Optional The Start Date that goes with Algorithm Start Date = 'From A Specific Date' (yyyy-MM-dd), or 'none' to clear it. Optional. StockIQ ignores this date under every other option, so passing it alone moves the option to 'From A Specific Date' for you and the preview says so; passing it with a different forecastStart is refused. Default: null
lockPeriods List<string> Optional Period start dates (yyyy-MM-dd) to lock so StockIQ keeps their manually set values. Optional. Effective in per-period-lock mode. Default: null
unlockPeriods List<string> Optional Period start dates (yyyy-MM-dd) to unlock so StockIQ forecasts them again. Optional. Default: null
clearLockedPeriods bool Optional Remove every locked period on the node. Default false. Default: false
note string Optional Settings note. Optional - the existing note is kept when omitted. Default: null
takeControl bool Optional Create an override at this node even when no value changes, so the node controls its own forecast settings instead of inheriting them. Default false. Default: false
deleteChildSettings bool Optional Delete every child override below this node for the series, so this node's settings apply top-down to all of its children. Destructive. Default false. Default: false
userConfirmed bool Optional Pass true only after the user has explicitly approved the preview. When false (default), nothing is written. Default: false

SaveOrderPolicyOverrides

Write Permission required

Creates or updates an order policy override on one item-site, or applies ONE override to many item-sites in a single step. For many, pass the ItemSiteId values straight from a grid you already fetched (GetStockOuts, GetOrderPolicySummary, GetSlowMovers and the other grids all return ItemSiteId). For one item-site named by the user, pass itemCode and siteCode instead of itemSiteIds; siteCode may be omitted only when the item is stocked at a single site. Two-step confirmation: call with userConfirmed=false (default) first. That writes nothing and returns a breakdown — how many item-sites get a new override, how many already have one that will BE overwritten, how many already match the policy and will be left alone, and how many are skipped and why. Show that to the user and stop. Call again with userConfirmed=true, same arguments, only after they explicitly approve. Partial commit: rows are saved one at a time and a row the saver refuses does not stop the others, so a run can end with most rows written and a few reported as failures. The reply names them. At most 500 item-sites per call; more than that is refused rather than trimmed. After a confirmed save the affected item-sites are replanned once, unless there are more than 100 of them, in which case the plans refresh on the next scheduled run and the reply says so. method and selectedPolicy are passed by name. method defaults to SelectedPolicy, which needs selectedPolicy; for selectedPolicy MinMax provide minMaxTargetQuantity, for FixedQuantity provide fixedQuantity, and for Kanban provide kanbanBinCount and kanbanQuantityPerBin.

ParameterTypeRequiredDescription
itemSiteIds List<int> Optional The ItemSiteId values to re-policy, taken from a grid you already fetched. Omit when you pass itemCode instead. Default: null
itemCode string Optional Item code of a single item-site to re-policy, when you have codes rather than an ItemSiteId. Do not combine with itemSiteIds. Default: null
siteCode string Optional Site code for itemCode. Optional when the item is stocked at only one site; if it is stocked at several, the reply lists them and you must ask which. Default: null
method OrderPolicyMethod Optional How the order policy is chosen. Default SelectedPolicy, which requires selectedPolicy. Default: OrderPolicyMethod.SelectedPolicy
selectedPolicy ReplenishmentOrderPolicy? Optional The policy to apply. Required when method is SelectedPolicy. Default: null
fixedQuantity decimal? Optional The fixed order quantity, applied to every item-site in the set. Use when selectedPolicy is FixedQuantity. Default: null
minMaxTargetQuantity decimal? Optional The Min/Max target order-up-to quantity, applied to every item-site in the set. Use when selectedPolicy is MinMax. Default: null
kanbanBinCount int? Optional Number of Kanban bins, applied to every item-site in the set. Use when selectedPolicy is Kanban. Default: null
kanbanQuantityPerBin int? Optional Quantity per Kanban bin, applied to every item-site in the set. Use when selectedPolicy is Kanban. Default: null
dateEffective string Optional Optional effective date in ISO format (yyyy-MM-dd), applied to every override. If omitted, effective immediately. An existing override with the same effective date is updated rather than added alongside. Default: null
dateExpires string Optional Optional expiry date in ISO format (yyyy-MM-dd), applied to every override. Default: null
note string Optional Optional note explaining the change, stored on every override. Say why the policy was applied - it is what the next planner reads. Default: null
userConfirmed bool Optional Set to true only after the user has explicitly approved the preview you showed them. When false (default), nothing is written. Default: false

SaveSafetyStockOverride

Write Permission required

Creates or updates a safety stock override for an item at a site. This tool uses a two-step confirmation flow: first call with userConfirmed=false (default) to preview the record, then call again with userConfirmed=true after the user approves. After a confirmed save the item is automatically replanned, so replenishment reflects the override immediately. method is passed by name: FixedValue (the default; provide fixedValue), NumberOfDays (provide numberOfDays), Statistical, HostProvided, Highest or Lowest.

ParameterTypeRequiredDescription
itemCode string Required The item code
siteCode string Required The site code
method SafetyStockMethod Optional How safety stock is set. Default FixedValue. Default: SafetyStockMethod.FixedValue
fixedValue decimal? Optional The fixed safety stock quantity. Required when method is FixedValue. Default: null
numberOfDays int? Optional Number of days of safety stock. Required when method is NumberOfDays. Default: null
minimum decimal? Optional Optional minimum safety stock quantity. Default: null
maximum decimal? Optional Optional maximum safety stock quantity. Default: null
dateEffective string Optional Optional effective date in ISO format (yyyy-MM-dd). If omitted, effective immediately. Default: null
dateExpires string Optional Optional expiry date in ISO format (yyyy-MM-dd). Default: null
note string Optional Optional note explaining the override. Default: null
userConfirmed bool Optional Set to true only after the user has explicitly confirmed the proposed override. When false (default), returns a preview of the record for the user to review. Default: false

SetSetting

Write Permission required

Changes a StockIQ configuration setting. Uses a two-step confirmation flow: call first with userConfirmed=false (the default) to show the user exactly what would change from and to, then call again with userConfirmed=true only after they approve. A reason is required and is written to the audit trail. Only a curated set of settings can be changed this way and only by a user who already has permission for the screen that hosts them; anything else is refused with the screen name so the user can make the change themselves. Identify the setting the way the user described it — the same wording ResolveSettingLocation accepts. Use ResolveSettingLocation first if you are unsure which setting they mean.

ParameterTypeRequiredDescription
settingName string Required The setting to change, in the user's own words or by its on-screen label, e.g. 'allow recurring safety stock'.
value string Required The new value. For a checkbox use true/false; for a drop-down use the option name, not a number.
reason string Required required: why is this change being made? Ask the user. This is written to the audit trail.
userConfirmed bool Optional Set to true only after the user has explicitly approved the change previewed by the first call. Default: false

UpdateGlobalCustomerClassSettings

Write Permission required

Updates global customer class settings. Uses a two-step confirmation flow: first call with userConfirmed=false (default) to preview the changes, then call again with userConfirmed=true after the user approves. important: Requires EditGlobalCustomerClassSettings permission — always check with CheckUserPermission first. Only non-null parameters are applied (partial update).

ParameterTypeRequiredDescription
isEnabled bool? Optional Enable or disable customer classing. true = enabled, false = disabled. Default: null
updateFrequency string Optional How often customer classes are recalculated, by name: Never, EachRefresh, Daily, Weekly, Monthly, MonthlyAndWeekly, Quarterly or Annually. Numbers are refused. Default: null
numberOfClassesToUse int? Optional Number of ABC classes to use (e.g., 3 for A/B/C, 4 for A/B/C/D, 5 for A/B/C/D/E) Default: null
customerNewAgeInDays int? Optional Days after creation to consider a customer 'new' Default: null
deadCustomerDaysBackToCheck int? Optional Days without sales to consider a customer 'dead' Default: null
userConfirmed bool Optional Set to true only after the user has explicitly confirmed the proposed changes. When false (default), returns a preview of them for the user to review. Default: false

UpdateReplenishmentSettings

Write Permission required

Updates global replenishment settings. Uses a two-step confirmation flow: first call with userConfirmed=false (default) to preview the changes, then call again with userConfirmed=true after the user approves. important: Requires EditGlobalReplenishmentSettings permission — always check with CheckUserPermission first. You must also collect a reason from the user, which is saved to the audit trail. Only non-null parameters are applied (partial update).

ParameterTypeRequiredDescription
reason string Required required: Why is this change being made? Ask the user for a reason. This is saved to the audit trail.
numberOfReplenishmentWeeks int? Optional Number of weeks for the replenishment planning horizon (e.g. 52, 72) Default: null
openOrderLookaheadDays int? Optional Days to look ahead for open orders. Pass -1 to clear. Default: null
enableTimePhasedStatisticalInventory bool? Optional Enable or disable time-phased statistical inventory Default: null
enableExpirationForecast bool? Optional Enable or disable expiration forecast Default: null
enableIncomingShipmentPlanning bool? Optional Enable or disable incoming shipment planning Default: null
enableBlanketPurchaseOrderPlanning bool? Optional Enable or disable blanket purchase order planning Default: null
addLinesToOrderByDefault bool? Optional Add lines to orders by default Default: null
addLinesWithNegativeAdjustedMarginByDefault bool? Optional Add lines with negative adjusted margin by default Default: null
optimizeForSupplierOnHand bool? Optional Optimize for supplier on-hand inventory Default: null
optimizePurchasePlanForObsoleteItems bool? Optional Optimize purchase plan for obsolete items Default: null
skipManufacturingTimeByDefault bool? Optional Skip manufacturing time by default Default: null
allowForecastBackorders bool? Optional Allow forecast backorders Default: null
allowDependentForecastBackorders bool? Optional Allow dependent forecast backorders Default: null
orderTargetingObeyMinimums bool? Optional Order targeting obeys minimums Default: null
orderTargetingObeyMultiples bool? Optional Order targeting obeys multiples Default: null
pricebreakExtraQuantityLimit OrderTargetingQuantityLimit? Optional What limits the extra quantity bought to reach a price break. Default: null
pricebreakBuyaheadProjectedDaysOfSupplyLimit int? Optional Price break buyahead projected days of supply limit Default: null
warehouseCapacityComparisonQuantity WarehouseCapacityComparisonQuantity? Optional Which quantity is compared against warehouse capacity. Default: null
comanTransferLeadTimeOffsetMode ComanTransferLeadTimeOffsetMode? Optional Which lead time offsets co-manufacturer transfers. Default: null
maxYearsOfSupplyOrderHistory int? Optional Maximum years of supply order history to retain Default: null
includeDependentDemandInRecentHistoryColumns bool? Optional Include dependent demand in recent history columns Default: null
userConfirmed bool Optional Set to true only after the user has explicitly confirmed the proposed changes. When false (default), returns a preview of them for the user to review. Default: false

General

38 tools

Cross-cutting tools - searching and resolving codes to records, explaining a screen or a number, instance information, and the connection guides.

ActivateInactiveRecords

Write Permission required

Reactivates inactive records (items, sites, item-sites, suppliers, customers, ship-tos, item-site-suppliers). Chain from GetInactiveRecords and pass the Id values from that grid. Call with userConfirmed=false first: that returns a preview naming exactly what would be activated and what would be skipped, which you must show the user before doing anything. Only call again with userConfirmed=true after they explicitly approve. Records flagged Removed can never be activated - they were dropped from the ERP data feed and have to return through it. Do not retry those and do not present them as a failure to fix.

ParameterTypeRequiredDescription
recordType InactiveRecordType Required Which kind of record these ids are: Item, Site, ItemSite, Supplier, Customer, CustomerShipTo or ItemSiteSupplier.
ids List<int> Required The Id values to activate, taken from the GetInactiveRecords grid.
userConfirmed bool Optional Set to true only after the user has explicitly approved the preview. When false (default), returns the preview and changes nothing. Default: false

CheckUserPermission

Read-only

Checks whether the current user has a specific permission. Use this before calling tools that require admin permissions (e.g., UpdateGlobalCustomerClassSettings requires 'EditGlobalCustomerClassSettings', RunCustomerClassing requires 'EditGlobalCustomerClassSettings'). Pass the permission name as a string.

ParameterTypeRequiredDescription
permissionName string Required The SecurityPermission name to check, e.g. 'EditGlobalCustomerClassSettings', 'AdministerSecurity', 'EditForecasts'

ConvertHierarchyNodeToItemSite

Read-only

Converts a HierarchyNodeId to an ItemSiteId. Use this when you have a forecast hierarchy node and need the corresponding item-site for inventory/replenishment tools. The ItemSite is the central planning unit; the HierarchyNode is the central forecasting unit.

ParameterTypeRequiredDescription
hierarchyNodeId int Required The HierarchyNodeId to convert to an ItemSiteId.

ConvertItemSiteToHierarchyNode

Read-only

Converts ItemSiteId(s) to HierarchyNodeId(s) for the forecast hierarchy. Use this when you have item-site IDs and need hierarchy node IDs for forecast tools like ExplainForecast or GetForecastSnapshots. Defaults to the customer's primary forecast hierarchy.

ParameterTypeRequiredDescription
itemSiteIds List<int> Required The ItemSiteId(s) to convert to HierarchyNodeIds.
itemHierarchyId int? Optional Optional item hierarchy ID. Defaults to the primary forecast hierarchy. Default: null

ConvertToChart

Read-only

Converts grid data into a chart visualization. Use when the user asks to see previous grid/table results as a chart. Supported chart types: bar, line, spline, area, stackedbar, stackedline, fullstackedbar, fullstackedline, stackedarea, fullstackedarea, scatter, stepline, steparea, rangebar, rangearea. Default: bar

ParameterTypeRequiredDescription
title string Required Chart title
chartType string Required Chart series type (bar, line, spline, area, stackedbar, etc.). Default: bar
argumentField string Required Data field name for the X axis (argument axis), must match a property name from the grid rows
argumentAxisLabel string Required Display label for the X axis (e.g. 'Part', 'Supplier', 'Date')
valueFieldsJson string Required JSON array of value field specs. Each object: {"dataField":"FieldName","seriesName":"Display Name","format":"currency|percent|numeric","axisPosition":"left|right","precision":2}. Use format 'currency' for dollar amounts, 'percent' for percentages, 'numeric' for quantities/counts. Use axisPosition 'left' and 'right' when mixing different units of measure (e.g. dollars on left, quantity on right).
rowsJson string Required The grid data rows as a JSON array of objects

DescribeAttachment

Read-only Permission required Not available to MCP tokens

Describes the file(s) the user attached to this conversation: the column headers, a few sample values from each column, how many rows were sampled, and how the file was read. Call this first whenever the user attaches a file and asks you to do anything with it - you cannot see the file otherwise. Takes no arguments: it always describes the current conversation's own attachments. Use the result to decide which column holds which field, then ASK the user about any column you cannot place confidently rather than guessing. AllSampledValuesAreNumeric=true is a strong hint for a quantity or amount column. RowsSampled is only the number of rows examined - if MoreRowsNotSampled is true, do NOT report it to the user as the file's row count. If ProblemMessage is set the file could not be read; pass that message on to the user.

This tool is reachable only by a signed-in StockIQ user. An MCP token may not call it.
Takes no parameters.

EmailCurrentUser

Write Permission required

Emails the current user (the person using Edison right now). Use when the user says 'email me this', 'send this to me', or 'email me that report'. Write the body in HTML — a short intro paragraph is enough. When the user is asking you to email a grid, chart, or report — one you fetched earlier IN this turn, or one from the immediately prior assistant turn — leave includePriorResult=true (the default) and DO NOT try to reproduce the table yourself — the server appends the actual rendered grid to the email automatically. Set includePriorResult=false only if the email is unrelated to the prior turn. If the prior turn was a chart, this tool sends nothing and returns a message to relay — charts cannot be rendered in email, so the user is offered the underlying data as a table first.

ParameterTypeRequiredDescription
subject string Required Subject line for the email.
body string Required HTML body of the email. Keep it brief — usually a one-paragraph intro. The prior result's grid (if any) is appended automatically when includePriorResult=true.
includePriorResult bool Optional When true (default), the server appends a rendered HTML table: the grid a tool returned earlier in this turn if there is one, otherwise the prior assistant turn's. If this turn returned more than one table, nothing is sent and you are asked to pick. Set false to send the body alone - including when your answer is a table you assembled from several results, which you must then write into the body yourself. Default: true
sendChartAsTable bool Optional Set true only after the user has been told the prior result is a chart and has agreed to receive its underlying data as a table instead. Leave false otherwise. Default: false

EmailUser

Write Permission required Not available to MCP tokens

Emails another user in the StockIQ system. Use when the user asks to email a specific person — by name (e.g. 'email this to Bob Johnson'), by email address, or by user ID. Only users with accounts in this StockIQ instance can receive email through this tool. If a name matches multiple users, this tool returns a list and asks for clarification — DO NOT guess; present the options to the user. Write the body in HTML — a short intro paragraph is enough. When the user is asking you to email a grid, chart, or report — one you fetched earlier IN this turn, or one from the immediately prior assistant turn — leave includePriorResult=true (the default) and DO NOT try to reproduce the table yourself — the server appends the actual rendered grid to the email automatically. Set includePriorResult=false only if the email is unrelated to the prior turn. If the prior turn was a chart, this tool sends nothing and returns a message to relay — charts cannot be rendered in email, so the user is offered the underlying data as a table first.

This tool is reachable only by a signed-in StockIQ user. An MCP token may not call it.
ParameterTypeRequiredDescription
subject string Required Subject line for the email.
body string Required HTML body of the email. Keep it brief — usually a one-paragraph intro. The prior result's grid (if any) is appended automatically when includePriorResult=true.
recipientName string Optional Full or partial name of the recipient (e.g. 'Bob Johnson'). Used to search the StockIQ user directory. Default: null
recipientUserId int? Optional The StockIQ UserId of the recipient, if known. Default: null
recipientEmail string Optional The email address of the recipient. Must belong to a user with a StockIQ account. Default: null
includePriorResult bool Optional When true (default), the server appends a rendered HTML table: the grid a tool returned earlier in this turn if there is one, otherwise the prior assistant turn's. If this turn returned more than one table, nothing is sent and you are asked to pick. Set false to send the body alone - including when your answer is a table you assembled from several results, which you must then write into the body yourself. Default: true
sendChartAsTable bool Optional Set true only after the user has been told the prior result is a chart and has agreed to receive its underlying data as a table instead. Leave false otherwise. Default: false

EscalateToSupport

Read-only

Escalates the user's issue to StockIQ Support by sending a notification email that includes the full conversation transcript and a link to this conversation. Use this when the user explicitly confirms they want support assistance, or when you detect sustained frustration. Always ask for confirmation before calling. Call at most once per conversation — if support was already notified in this conversation, do not call again.

ParameterTypeRequiredDescription
reason string Required Brief summary of the issue or reason for escalation

FindHierarchyNodes

Read-only

Finds hierarchy nodes by name — use this whenever the user refers to a category, program, subgroup, product group or any other grouping by what it is called, e.g. 'subgroup Recliners 3 Position', 'the Lifts & Transfer program', 'PTACs-ALL'. Requires nothing but the name: no item code, and no codes for the parent levels. This is the tool to reach for first when a user names a grouping; only fall back to ResolveHierarchyNodes when you already have an item code (browse) or every parent code (deterministic). Matching ignores case, spaces, hyphens and punctuation, so 'PTACs-ALL' finds a node actually named 'PTACs - All'. Results are ranked best-match first and include the level, the level's business name, and the parent path. If more than one node matches, show the user the candidates with their levels and ask which they meant rather than guessing. By default this searches the grouping levels only. Pass hierarchyLevel or hierarchyProperty to search one specific level, including the per-item levels.

ParameterTypeRequiredDescription
searchText string Required The name the user used, or any part of it. Case, spacing, hyphens and punctuation are ignored.
hierarchyLevel int? Optional Optional: restrict to one level number (see GetHierarchyLayout). Use when the user named the level, e.g. 'subgroup X' with Subgroup at level 3. Default: null
hierarchyProperty string Optional Optional: restrict to one HierarchyProperty name, e.g. 'ItemSiteCategory3'. Use when you know the property but not the level number. Ignored if hierarchyLevel is supplied. Default: null
itemHierarchyId int? Optional Optional item hierarchy ID. Defaults to the configured forecast hierarchy. Default: null
limit int Optional Maximum number of matches to return. Default 25. Default: 25

GetAlerts

Read-only Permission required

Returns the alerts StockIQ is currently raising, across the whole account, narrowed by any combination of alert type, category, priority, state and the usual item / site / supplier / buyer / class / category filters. Use for "what alerts do I have", "show me my forecast alerts", "which items have a projected stockout alert", "what is my highest-priority alert list", and as the first step of any question that starts from the alerting population. ONE item-site — for the alerts on one product at one site ("what alerts are on item X at site Y"), pass itemCode with siteCode, or an itemSiteId, and leave the item / site / class / category filters out. That returns the alerts on the item-site and on its primary-supplier record, the same set the item's own Alerts tab shows; type, priority and state filters still apply. alert types — pass names, not numbers, in `alertTypes`: StockOut, ProjectedStockOut, CurrentExcess, ProjectedExcess, SlowMover, DeadStock, InventoryExpiration, SafetyStock, ItemSiteServiceLevel, NewItem, LateSupplyOrder, CriticalOrder, OverdueToBuy, OrderStatus, PlanAtRisk, LargeMinMult, UnderForecast, OverForecast, ForecastError, ForecastVsModel, Backorders, UnusualSales, PromotionFrequency, PromotionDepth, PromotionLength. categories — `alertCategories` is the shorthand when the user speaks in groups rather than types: Forecast, Inventory, Purchasing, Sales, Promotion. Supplying both widens rather than narrows: the result is the union. state — defaults to Active alerts only. Pass `states` as Active, Suspended or Ignored when the user explicitly asks about paused or dismissed alerts. cross-referencing — the result carries ItemSiteIds, the distinct item-sites behind the rows returned. That is the handoff for a follow-up call: "unusual sales for items with a forecast alert" is this tool with alertCategories=[Forecast], then GetUnusualSales scoped to those item-sites. Do NOT read PrimaryId off the rows for this — it only means an item-site when PrimaryIdProperty says so, and a supplier-level or hierarchy-level alert will hand you an id that means something else. If the result is truncated, ItemSiteIds covers only the rows returned and the Assumptions say so — narrow the filters or raise `limit` before scoping a follow-up by it, or the second answer is confidently about part of the population.

ParameterTypeRequiredDescription
alertTypes List<string> Optional Alert type names to include, e.g. ["ProjectedStockOut","LateSupplyOrder"]. Omit for every type. Default: null
alertCategories List<string> Optional Alert category names to include — Forecast, Inventory, Purchasing, Sales, Promotion. A shorthand for the types inside them; combined with `alertTypes` as a union. Default: null
priorities List<string> Optional Alert priority names to include: High, Medium, Low. Omit for every priority. Default: null
states List<string> Optional Alert state names to include: Active, Suspended, Ignored. Defaults to Active only. Default: null
itemCode string Optional Item code of ONE item-site whose alerts you want. Use with siteCode; siteCode may be omitted only when the item is stocked at a single site. Default: null
siteCode string Optional Site code for itemCode. Default: null
itemSiteId int? Optional ItemSiteId of ONE item-site whose alerts you want, when you already have it from a grid. Use instead of itemCode. Default: null
itemIds List<int> Optional Filter by item IDs — get IDs from ResolveItem. Default: null
siteIds List<int> Optional Filter by site IDs. If omitted, uses the user's allowed sites. Default: null
supplierIds List<int> Optional Filter by primary supplier IDs. Default: null
buyerIds List<int> Optional Filter by buyer IDs — get IDs from ResolveBuyer. Default: null
abcClasses List<string> Optional Filter by ABC classes, e.g. ['A','B']. Default: null
xyzClasses List<string> Optional Filter by XYZ classes, e.g. ['X','Y']. Default: null
customerIds List<int> Optional Filter to alerts tied to these customer IDs. Only the customer-grain alerts carry a customer, so this narrows sharply. Default: null
itemSiteCategory1Ids List<int> Optional Filter by item-site Category 1 IDs — get IDs from ResolveItemSiteCategory. If the user is restricted by category, the framework intersects automatically. Default: null
itemSiteCategory2Ids List<int> Optional Filter by item-site Category 2 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory3Ids List<int> Optional Filter by item-site Category 3 IDs — get IDs from ResolveItemSiteCategory. Default: null
itemSiteCategory4Ids List<int> Optional Filter by item-site Category 4 IDs — get IDs from ResolveItemSiteCategory. Default: null
limit int Optional Maximum number of alerts to return. Default 100. Default: DefaultLimit
sortBy string Optional Column to rank by before the limit is applied. important: the tool returns the top `limit` rows by this column out of a larger set, so you cannot re-sort the returned rows to get a different ranking. Options: Priority (default, highest first), DateCreated, AlertTypeName, ItemCode. Default: null
sortDescending bool? Optional Override the natural direction of sortBy. Omit for the sensible default. Default: null
groupBy string Optional Roll the result up to one row per group instead of one row per alert. Use for 'which alert types do I have most of', 'break the alerts down by buyer', 'which site has the most alerts'. It counts the whole matching set server-side, so the counts are right even though only `limit` groups come back. Options: alertType, category, priority, state, site, buyer, supplier, abc, item. Omit for the alert detail rows. Default: null

GetApiTokenGuide

Read-only

Returns a markdown guide for using this StockIQ instance's rest API with the API-token bearer scheme. Use when the user asks how to create an API token, how to call the API from a script or external app, how to assign roles/permissions and data scopes to a token, how to rotate or disable a key, or how the /api/authenticate exchange works. The guide includes this instance's base URL, end-to-end curl examples, and rotation/revocation playbooks. This is the API-key counterpart to GetMcpConnectionGuide (which covers connecting external LLM clients via MCP).

ParameterTypeRequiredDescription
section string Optional Optional section filter. Accepts 'all', 'overview', 'create', 'permissions', 'authenticate', 'consume', 'rotate', 'revoke', 'troubleshoot'. Defaults to 'all'. Default: "all"

GetCategoryMetadata

Read-only

Returns the category metadata for this StockIQ instance. Shows what each category field is named (e.g., ItemSiteCategory1 might be called 'Product Line'). Use this to understand how to translate user requests like 'show me items in category Audio' into the correct category filter. This tool returns the category names only, not their values. Once you know which categoryNumber the user's term maps to, call ResolveItemSiteCategory to turn the value they named into the ID the filter tools take. No parameters needed.

Takes no parameters.

GetCustomFieldMetadata

Read-only

Returns the custom fields (flex fields) this StockIQ instance has added beyond the ones StockIQ ships with - for example a 'Brand' on items or a 'Do Not Ship Before' date on sales order lines. Use this when a user asks about a field name you do not recognise, or asks what extra fields exist. Values for these fields appear on grid rows as CF_ followed by the field's code, so a field coded Brand appears as CF_Brand; those columns are hidden by default and the user can show them from the column chooser. No parameters needed.

Takes no parameters.

GetDataRefreshStatus

Read-only

Reports data refresh status: whether a refresh is running now, when the last Full and Partial refreshes ran and how they ended, and whether the user may start one (Admin > Calculate, Initiate Data Updates permission). Use it whenever a refresh matters to the answer - 'when did data last update?', 'is a refresh running?', 'can you run a refresh?', and above all when something the user changed (an activated item-site, a new item) is not showing yet. For an item-site missing from Forecast Manager, resolve it first (ResolveItemSite) and pass its id in itemSiteIds: the answer then says whether it is already in the forecast tree and, if not, exactly which refresh adds it - a reactivated item-site needs only a Partial refresh, an item-site new since the last Full refresh needs a Full one. Repeat that answer; do not guess or hedge. Edison cannot start, schedule or cancel a refresh - say so plainly and pass on who can and where.

ParameterTypeRequiredDescription
itemSiteIds List<int> Optional Optional. Up to 25 item-site ids (from ResolveItemSite or a grid) to check against the forecast tree. Default: null

GetFocusToday

Read-only Permission required

Returns the planner's prioritized daily focus list — projected stockouts, late POs, projected excess, under/over-forecast risks, expiring inventory, and at-risk sales orders — each summarized by total count, dollar exposure, and the top items by severity. Scopes to the logged-in user's buyer if auth.User.BuyerId is set; otherwise returns an org-wide view and includes a tip about associating the login with a buyer. Use when the user asks 'what should I focus on today?', 'what's my day look like?', 'what should I work on?', or similar planner-dashboard daily-priority questions. Pair this tool with GetOrderSuggestions to surface today's recommended POs alongside the alert focus areas.

ParameterTypeRequiredDescription
topN int Optional Maximum number of top alerts to include per category. Default 5. Default: 5

GetHierarchyLayout

Read-only

Returns the hierarchy level layout for this StockIQ instance. Shows how items, sites, and categories are organized into hierarchy levels. Use this to understand which level corresponds to which business dimension (Item, Site, Category, etc.). This returns the levels, not the nodes in them — to find an actual node by the name a user said, call FindHierarchyNodes. If no hierarchyId is provided, uses the default forecast hierarchy.

ParameterTypeRequiredDescription
itemHierarchyId int? Optional Optional item hierarchy ID. If omitted, uses the default forecast hierarchy. Default: null

GetImportQuality

Read-only Permission required

Reports what went wrong loading the customer's data overnight, ranked by how much data each problem affects. This is the import quality digest behind the Data Quality panels on Admin > Import and Reports > Data Validation. Use it when the user asks how the import or the overnight refresh went, what data needs fixing or cleaning up, why rows were rejected or a feed looks short, or what to fix before go-live. Each row says what the problem is, which feed to fix it in, who owns the fix (the customer's own data, the ERP extract, StockIQ configuration, or a StockIQ defect), how many rows it affected out of how many, and whether it is new since the previous imports or has been happening every night. Rows whose Evidence is 'Incomplete data' are fields the planning algorithms need that too few records carry - a missing cost or primary supplier - rather than rows the import rejected. Do not use this for the import's row counts or timings; it reports problems, not volumes.

ParameterTypeRequiredDescription
tableImportSessionId int? Optional Optional. A specific import session id to report on. Omit for the import the data currently in StockIQ came from, which is what the user almost always means. Default: null
limit int Optional Maximum findings to return, highest impact first. Default 20, capped at 100. Default: 20

GetInactiveRecords

Read-only Permission required

Lists records that have gone inactive and shows which of them can be reactivated. This is the Reports > Inactive Records screen. Use it when the user asks why an item, site, item-site, supplier, customer, ship-to or item-site-supplier has disappeared, or asks to turn one back on. Each row carries CanActivate: rows with CanActivate=false are flagged Removed, which means they were dropped from the customer's ERP data feed and can never be reactivated - do not offer to activate those, explain that the record has to come back through the data feed first. Chain into ActivateInactiveRecords using the Id values from this grid.

ParameterTypeRequiredDescription
recordType InactiveRecordType Required Which kind of record to list: Item, Site, ItemSite, Supplier, Customer, CustomerShipTo or ItemSiteSupplier.
codeOrNameFilter string Optional Optional. Narrows to rows whose code or description contains this text, e.g. an item code or part of a supplier name. Default: null
limit int Optional Maximum rows to return. Default 50, capped at 500. Default: 50

GetInstanceInfo

Read-only

Returns information about this StockIQ instance: the customer's organization name, instance type, and URL. Use this to personalize responses and understand who the user works for.

Takes no parameters.

GetItemSiteAttributes

Read-only

Returns detailed attributes for one or more item-sites. Includes item code, site, supplier, costs, inventory levels, lead times, safety stock, ABC/XYZ classification, and category assignments. Use this to show details about specific item-site records.

ParameterTypeRequiredDescription
itemSiteIds List<int> Required List of ItemSiteIds to retrieve attributes for

GetItemSiteCustomers

Read-only

Returns customers who have purchased a specific item at a site within a lookback period. Shows customer details, quantities sold, revenue, margin, and last purchase date. Use when the user asks about who buys a product, customer impact of a stockout, or customer demand.

ParameterTypeRequiredDescription
itemSiteId int? Optional ItemSite ID. If provided, codes are ignored. Default: null
itemCode string Optional Item code to look up. Used when itemSiteId is not provided. Default: null
siteCode string Optional Site code to look up. Used when itemSiteId is not provided. Default: null
lookbackDays int Optional Number of days to look back for customer purchases. Default 365. Default: 365

GetMcpConnectionGuide

Read-only

Returns a markdown guide for connecting an external LLM client (Claude Code, Codex, Cursor, Continue, VS Code) to this StockIQ instance via the MCP server using a personal MCP token. Use when the user asks how to wire up an external AI assistant to StockIQ, how to use their MCP token, or where to store the token safely. The guide includes this instance's MCP endpoint URL, token-handling best practices, and per-client setup commands.

ParameterTypeRequiredDescription
client string Optional Optional client filter. Accepts 'claude-code', 'codex', 'cursor', 'continue', 'vscode', or 'all'. Defaults to 'all' (every client's instructions plus the shared security section). Default: "all"

GetMetricDefinition

Read-only

Explains what a StockIQ number means and HOW IT IS computed, grounded in the code that computes it. Call this whenever the user asks what a column, field or figure means, how it is calculated, why two similar numbers differ, or why a value looks wrong or has an unexpected sign — e.g. 'what's the difference between projected on hand and projected actual available', 'is the on-hand value including markup', 'why is Available at LT negative', 'what's the difference between Below Safety Stock and Below Panic Point'. Accepts the user's own wording; abbreviated captions like 'Prj Actual Avl @ LT' and loose phrasings like 'available at LT' both resolve. The answer includes the metrics this one is commonly confused with, so a 'difference between X and Y' question needs only one call. important: StockIQ holds both a current and a forward-projected version of many figures, with different values. Each result says which kind it is, and the tool warns when a request spans both — when it does, ask the user whether they mean today's position or a projected one instead of guessing. Lead times are a second trap of the same shape: users see and enter them in calendar days while the planning engine works in work days, so never quote an internal work-day figure at someone reading a grid. days OF supply runs the other way and is the trap that has actually reached a customer: every days-of-supply column on a grid (Prj DoS On Arr., Prj Days Supply, Order DoS, the Order Schedule's Prj Days, the cycle-stock variants) is a quantity over a per-workday usage rate, so those figures are work days even though the user is reading them on screen. Call this tool before answering any 'is this calendar days' question rather than reasoning from the lead-time rule. This is NOT the Help Center: for where something lives in the UI, how to navigate to it, or how to perform a task, use GetHelpContent instead. If this tool returns no match, say the definition is not available and offer GetHelpContent — do NOT describe the number from memory.

ParameterTypeRequiredDescription
term string Required The column, field or figure the user asked about, in their own words. Pass the phrase they used rather than a guess at the internal field name.

GetPriorResultRows

Read-only

Returns the rows from the immediately-prior assistant turn's grid/table payload in the current chat session. Use this when you need the actual row values to perform follow-up analysis (e.g. 'run root-cause on the top 5 from that grid', 'pick the top 3 by opportunity dollars'), and the prior payload was NOT already inlined into your history (look for a [Prior result payload not inlined ...] hint above). If you can already see the prior rows in the conversation, do NOT call this tool — just use them. ⚠️ This tool re-serves rows only. It does NOT re-serve the SummaryText that carried the prior result's totals, so a partial set from here has nothing correct to fall back on: never compute a total, a share, an average or a ranking of the whole grid from rows this tool returned unless it says it returned all of them. If every row will not fit, it returns none and tells you the count — re-run the original tool with a groupBy or a tighter filter so the server does the roll-up, rather than aggregating a fragment.

ParameterTypeRequiredDescription
maxRows int Optional Maximum number of rows to return. Default 50. Increase if you need more. Default: 50
need string Optional What you need these rows FOR. "all" (the default) means your answer depends on every row: if they do not all fit within maxRows the tool returns none, because an answer computed over part of a grid is simply wrong. Pass "prefix" when you only want the first few to drill into — 'run root-cause on the top 5 of that grid' — and a partial set is genuinely what you want. Default: "all"

GetRequiredPropertiesForHierarchyLevel

Read-only

Given a target HierarchyProperty (the level you want to land on, e.g. 'Item', 'Site', 'Customer', 'CustomerShipTo', 'ItemSiteCategory3', 'CustomerShipToCategory1'), returns the list of property values you must supply to deterministically resolve a single hierarchy node at that level. USE this before calling ResolveHierarchyNodes with a targetHierarchyProperty: it tells you exactly which '*Code' arguments to populate and which to leave alone (the resolver infers some properties from others — e.g. ItemSiteCategoryN below item-site is inferred from item+site). Each row maps a required HierarchyProperty to the exact argument name on ResolveHierarchyNodes (e.g. 'itemSiteCategory3Code', 'customerCode'). Use that argument name — do not guess. If the user has not yet provided one of the required values, ask them for it before calling ResolveHierarchyNodes; do not invent or fuzzy-match it. note: Shipper appears with IsOptional=true when Item is required — it defaults to '000' and only needs a value when the same item code exists under multiple shippers. Run GetHierarchyLayout first if you don't know which HierarchyProperty values exist in this hierarchy.

ParameterTypeRequiredDescription
targetHierarchyProperty string Required The HierarchyProperty enum name for the level you want to resolve to. Valid values: Item, Site, Shipper, Customer, CustomerShipTo, ItemSiteCategory1..ItemSiteCategory8, CustomerShipToCategory1..CustomerShipToCategory3. Get the list of properties actually used in this hierarchy from GetHierarchyLayout.

GetSitesForItem

Read-only

Returns all sites where a given item is stocked. Use this when the user asks 'what sites is item X at?' or 'where is item X stocked?'. Returns a list of sites with their ItemSiteIds.

ParameterTypeRequiredDescription
itemCode string Required The item code to look up

ImportFromAttachment

Write Permission required Not available to MCP tokens

Imports the file the user attached to this conversation into StockIQ. Call DescribeAttachment first to see the file's headers - you cannot map columns you have not looked at. Call ListImportTargets to see what can be imported and what each target's fields are. You supply a target and, if needed, a column mapping; never retype the file's rows. The file is read server-side by the same parser the matching upload screen uses. Columns whose headers already match a field name (with or without spaces) need no mapping entry; map only the ones that differ. Confirmation flow: (a) Call with userConfirmed=false first. Nothing is written; you get back the file name, the mapping used, the row count, a few sample rows as they were parsed, and any parse errors. Show that to the user and stop. (b) Call again with userConfirmed=true, same arguments, only after they explicitly approve. important: the preview shows what was read from the file, not a preview of what will change - do not tell the user it is a diff. deleteMode: leave false unless the user has clearly asked for the target's delete behaviour, which the preview spells out. It destroys data when wrong. If the result is NeedsClarification, nothing was imported: pass the message on and ask.

This tool is reachable only by a signed-in StockIQ user. An MCP token may not call it.
ParameterTypeRequiredDescription
target string Required Which table to import into. Call ListImportTargets for the valid values.
columnMapping List<ColumnMappingInput> Optional Column header → field name, for columns whose headers do not already match. Omit when the file's headers are standard. Default: null
deleteMode bool Optional Pass true only when the user asked for this target's delete behaviour, which the preview describes. Destroys data when wrong. Default: false
userConfirmed bool Optional Pass true only when the user has explicitly approved the preview you showed them. When false (default), nothing is written. Default: false

ListImportTargets

Read-only

Lists the kinds of data ImportFromAttachment can load from an attached file, the field names each one accepts (use these as the Field values in a column mapping), whether the caller is allowed to import it, and what that target's delete mode does if it has one. Call this when the user attaches a file and you need to work out which target fits, or when they ask what Edison can import.

Takes no parameters.

ResolveBuyer

Read-only

Resolves a user-provided buyer reference (code or name) into internal Buyer IDs. Returns matching buyers. Use this when the user mentions a buyer/planner and you need the internal ID for filtering tools like dead stock or inventory.

ParameterTypeRequiredDescription
searchText string Required The buyer code or name to search for

ResolveHierarchyNodes

Read-only

Resolves item (and qualifier codes) into HierarchyNodeIds. Two modes: (1) deterministic — pass targetHierarchyProperty plus the *Code arguments required for that level. Returns the single matching node. Use this when the user has named or implied a specific level (item, item-site, customer, ship-to, a category, etc.). recommended PRE-flight: call GetHierarchyLayout to see what HierarchyProperty values exist in this hierarchy, then call GetRequiredPropertiesForHierarchyLevel(targetHierarchyProperty) to learn exactly which *Code arguments to populate. If a required value is missing, ASK THE user for it before calling this tool — do not guess. Each *Code argument maps 1:1 to a HierarchyProperty (e.g. itemSiteCategory3Code <-> ItemSiteCategory3, customerCode <-> Customer). (2) browse — omit targetHierarchyProperty. Pass itemCode (and optional siteCode) to list every hierarchy node level for that item/item-site, with optional dimensionValue fuzzy-match to narrow down. Use this when the user hasn't specified a level, or you need to disambiguate phrasing like 'the Sam's Club node for SKU123' before calling deterministic mode. browse tips: For 'item level / across all sites / rolled up', pass itemCode only (omit siteCode) — the returned item-level row is where forecasts aggregate across sites. For one specific site, pass itemCode + siteCode. Do NOT iterate per site for an 'all sites' question. Rows with IsDefaultForecastLevel=true are where forecast control normally lives. If multiple rows could match a user request, ask the user to confirm before calling downstream tools.

ParameterTypeRequiredDescription
itemCode string Optional Item code. Required in browse mode. Required in deterministic mode whenever the target level is at or below Item (which is almost always). Default: null
siteCode string Optional Site code. In browse mode: optional — omit to get the item-level (sites-aggregated) node, supply to scope to one site. In deterministic mode: supply when GetRequiredPropertiesForHierarchyLevel reports Site as required. Default: null
targetHierarchyProperty string Optional deterministic mode switch. Pass the HierarchyProperty enum name for the level you want a single node at (e.g. 'Item', 'Site', 'Customer', 'CustomerShipTo', 'ItemSiteCategory3', 'CustomerShipToCategory1'). Omit for browse mode. Get valid values from GetHierarchyLayout. Default: null
shipperCode string Optional Optional shipper code. Only consulted in deterministic mode and only when GetRequiredPropertiesForHierarchyLevel lists Shipper. Defaults to '000' if omitted. Default: null
customerCode string Optional Customer code (deterministic mode, when Customer is required). Default: null
customerShipToCode string Optional Customer ship-to code (deterministic mode, when CustomerShipTo is required). Default: null
itemSiteCategory1Code string Optional ItemSiteCategory1 code (deterministic mode, when ItemSiteCategory1 is required). Default: null
itemSiteCategory2Code string Optional ItemSiteCategory2 code (deterministic mode, when ItemSiteCategory2 is required). Default: null
itemSiteCategory3Code string Optional ItemSiteCategory3 code (deterministic mode, when ItemSiteCategory3 is required). Default: null
itemSiteCategory4Code string Optional ItemSiteCategory4 code (deterministic mode, when ItemSiteCategory4 is required). Default: null
itemSiteCategory5Code string Optional ItemSiteCategory5 code (deterministic mode, when ItemSiteCategory5 is required). Default: null
itemSiteCategory6Code string Optional ItemSiteCategory6 code (deterministic mode, when ItemSiteCategory6 is required). Default: null
itemSiteCategory7Code string Optional ItemSiteCategory7 code (deterministic mode, when ItemSiteCategory7 is required). Default: null
itemSiteCategory8Code string Optional ItemSiteCategory8 code (deterministic mode, when ItemSiteCategory8 is required). Default: null
customerShipToCategory1Code string Optional CustomerShipToCategory1 code (deterministic mode, when CustomerShipToCategory1 is required). Default: null
customerShipToCategory2Code string Optional CustomerShipToCategory2 code (deterministic mode, when CustomerShipToCategory2 is required). Default: null
customerShipToCategory3Code string Optional CustomerShipToCategory3 code (deterministic mode, when CustomerShipToCategory3 is required). Default: null
dimensionValue string Optional Browse mode only. A business-dimension value to narrow the listing (e.g. 'Sam's Club'). Matched case-insensitively against active ItemSiteCategoryN names/codes, CustomerShipToCategoryN values, Customer name/code, CustomerShipTo name/code, and Shipper name/code. Ignored when targetHierarchyProperty is set. Default: null

ResolveItem

Read-only

Resolves a user-provided item reference into internal Item IDs. Searches your own item codes and descriptions, and — when nothing matches those — the supplier'S part numbers too, so a code the user read off a vendor document (e.g. 'PM-DC20088') still finds the StockIQ item. The MatchedOn column tells you which one hit, so say so when you answer. If the text turns out to name a supplier rather than an item, the result says so and names it — do not keep searching for an item. The other tools that take an itemCode resolve supplier part numbers too, so passing one straight to them also works; use this tool when you want to SEE the candidates or need the ItemId.

ParameterTypeRequiredDescription
searchText string Required The item code, description text, or the supplier's own part number to search for
limit int? Optional Maximum number of results to return. Defaults to 25. Default: 25

ResolveItemSite

Read-only

Resolves an item code and site code combination into an internal ItemSiteId. Both itemCode and siteCode are required. If you don't have a site code, use ResolveSite first to find available sites. The ItemSiteId is the central planning unit in StockIQ.

ParameterTypeRequiredDescription
itemCode string Required The item code to look up. Required.
siteCode string Required The site code to look up. Required.

ResolveItemSiteCategory

Read-only

Resolves an item-site category value the user named (e.g. a price group 'V01923', a product line 'Audio') into the numeric category IDs that the filter tools take. Call GetCategoryMetadata first to learn which categoryNumber (1-8) this instance uses for the user's term — 'Price Group' might be ItemSiteCategory2. Pass the returned Id to the matching itemSiteCategoryNIds parameter on tools like GetDeadStock, GetProjectedStockOuts, GetSlowMovers, GetCurrentExcess or GetInventoryTurnsOverTimeChart. Matches an exact code first, then an exact value, then a partial match on either; removed values are excluded. Refer to the category by its Code or Value when you answer — never by the Id.

ParameterTypeRequiredDescription
categoryNumber int Required Which ItemSiteCategory level to search (1-8). Call GetCategoryMetadata first to determine which number matches the user's category term.
searchText string Required The category code or value to search for, as the user said it
maxResults int? Optional Maximum number of matches to return. Defaults to 25, capped at 100. Default: DefaultMaxResults

ResolveItemSiteSupplier

Read-only

Resolves an item code and site code into ItemSiteSupplier records. Both itemCode and siteCode are required. Returns the supplier relationships for the item at that site. If supplierCode is omitted, returns all active suppliers, primary first, with IsPrimary true on the one StockIQ declares primary — never on merely the first row. If no row has IsPrimary the item-site has no declared primary: ask the user which supplier to use, do not pick one. The ItemSiteSupplierId is needed for order schedule and replenishment tools.

ParameterTypeRequiredDescription
itemCode string Required The item code to look up. Required.
siteCode string Required The site code to look up. Required.
supplierCode string Optional Optional supplier code. If provided, returns only that supplier's record. Default: null

ResolveSite

Read-only

Resolves a user-provided site reference (code or name) into internal Site IDs. Returns matching sites. Use this when the user mentions a site by code or name and you need the internal ID for other tools.

ParameterTypeRequiredDescription
searchText string Required The site code or site name to search for

ResolveSupplier

Read-only

Resolves a user-provided supplier reference (code or name) into internal Supplier IDs. Returns matching suppliers. Use this when the user mentions a supplier and you need the internal ID for other tools.

ParameterTypeRequiredDescription
searchText string Required The supplier code or name to search for
limit int? Optional Maximum number of results to return. Defaults to 20. Default: 20

ShowCapabilities

Read-only

Returns a summary of what Edison can help with. Call this when the user asks what you can do.

Takes no parameters.

Resources

tools

The StockIQ Help Center knowledge base.

GetHelpContent

Read-only

Searches the StockIQ Help Center knowledge base and returns article content as formatted text. This is the only grounded source for how the StockIQ application looks and behaves — screens, modules, menus, tabs, buttons, grid columns, field names, settings locations and click-by-click steps. You must call it, and answer only from what it returns, for any 'how do I / where is / which module / what is this field' question. Do not describe StockIQ's interface from your own knowledge; it varies by version and customer configuration. Returns errorCode 'HELP_UNAVAILABLE' when the knowledge base cannot be reached — in that case say so and stop, do not fall back to memory.

ParameterTypeRequiredDescription
query string Required Search query — use StockIQ feature names or concepts (e.g., 'dead stock', 'order schedule', 'safety stock', 'forecast manager')
maxArticles int? Optional Maximum number of articles to return. Default 3. Default: 3