skforecast-ai
OfficialPackage |
|
Agents |
|
Meta |
|
Testing |
|
Community |
|
About skforecast-ai
The forecasting assistant that shows its work. Give skforecast-ai a time series: it profiles the data, chooses the model with deterministic rules, validates it and returns the forecast together with the skforecast script that produced it. Every decision comes from a rule you can read, the same data always gives the same result, and the script runs on its own with plain skforecast. An optional LLM explains every decision; it never makes them.
36-hour LightGBM forecast of hourly bike sharing users, with its 80% prediction interval against the held-out hours, and the answer of ask() that explains its metrics. Real skforecast-ai outputs, from the animation on ai.skforecast.org.
Related MCP server: timesfm-mcp
Installation
pip install skforecast-aiThe LLM layer is optional. To use it, install the extra ([bedrock] for AWS Bedrock):
pip install "skforecast-ai[llm]"Requires Python 3.10 or newer. More options in the installation guide; to install from source, see the Contribution Guide.
Quick example
Try it without installing anything: Your first forecast runs in Google Colab, from the data to a validated forecast, with no API key.
from skforecast_ai import ForecastingAssistant
from skforecast.datasets import load_demo_dataset
# Download demo dataset (monthly)
data = load_demo_dataset(verbose=False)
# Profile the data, plan the model, generate the script and run it,
# evaluated on the last 12 months. No LLM needed.
assistant = ForecastingAssistant()
result = assistant.forecast(data=data, target="y", steps=12, test_size=12)
result.predictions.head()
# pred
# 2007-07-01 0.851486
# 2007-08-01 1.048000
# 2007-09-01 0.998147
# 2007-10-01 1.147577
# 2007-11-01 1.110845
result.metrics
# series MAE MSE MASE MAPE
# 0 y 0.078442 0.008933 0.802828 0.088608
print(result.code) # the skforecast script that produced this resultThat single call chose a ForecasterRecursive with a Ridge estimator, its lags and window features, and ran the script that result.code returns. result.profile and result.plan hold every decision and the rule behind it. Drop test_size to train on all the data and forecast the next 12 months.
# End-to-end forecast
skforecast-ai forecast data.csv --target y --date-column date --steps 12
# Only the standalone script, without running it
skforecast-ai forecast-code data.csv --target y --date-column date --steps 12 --output forecast.pyThe CLI covers the whole pipeline, including ask() and the prompts of refine_plan() and create_cv(). See Using the CLI.
# pip install "skforecast-ai[llm]"
assistant = ForecastingAssistant(llm="openai:gpt-5.5")
answer = assistant.ask(
"Is the MASE good, and why was this estimator chosen?",
context=result,
)ask() reads the object you pass and explains it, grounded in the skforecast agent skills. It never changes the result. The dataset is never sent: a result shares only its own predictions and metrics, with a warning. Providers, credentials and local models are covered in Configuring the LLM.
In Claude Code, install the server and its skill as a plugin:
/plugin marketplace add skforecast/skforecast-ai
/plugin install skforecast-ai@skforecast-aiThen ask in plain language: "Forecast the next 12 months of data/sales.csv and tell me how accurate it is." The agent brings the language model and calls skforecast-ai as tools; every decision still comes from the same deterministic rules, every result comes with the script that produced it, and responses never carry rows of your data. The setups for Cursor, VS Code, Codex and Claude Desktop are in MCP server for coding agents.
A real Claude Code session with the server and its skill, from the agent check of skforecast-ai 0.4.0, abridged: the first three calls share a row, and an ellipsis marks every cut in a response or in the answer. The whole session shows every call, every message of the agent and its complete answer.
In VS Code, this button adds the server and asks for the directory with your data (it needs uv):
Features
A deterministic engine
Data profiling: frequency, missing values, exogenous and categorical variables, and the significant lags from the partial autocorrelation.
A plan with a rule for every decision: forecaster and estimator, lags, window and calendar features, prediction intervals, metric and cross-validation.
The code you see is the code that ran:
forecast()andbacktest()execute the same script thatforecast_code()andbacktest_code()return. Inspect it, version it or run it with plain skforecast.Model selection with
compare(): every candidate is backtested with the same data and cross-validation, and the ranking is a plain sort of the metric. For a single series, a seasonal naive baseline is ranked alongside them, so you also see whether a model beats the simplest reasonable forecast.Reproducible: the same input always gives the same profile, plan, script and predictions.
Python or terminal: the CLI runs the same pipeline from a CSV file or URL.
Coding agents: an MCP server gives Claude Code, Cursor and other MCP clients the same pipeline as tools, with a skill that teaches them to use it. Responses never carry rows of your data.
The engine chooses among the forecasters of skforecast: recursive and direct, multi-series and multivariate, statistical (ARIMA) and foundation models.
An optional LLM layer
Explains a forecast, a backtest, a comparison, a plan or a script in plain language with
ask(), or answers a general forecasting question.Refines lags and window features from your domain knowledge with
refine_plan(prompt=...).Translates a deployment scenario into a backtesting strategy with
create_cv(prompt=...).Validated before it runs: every LLM output is checked by a Pydantic model; if it is not valid, you get the deterministic result and a warning.
Any provider through pydantic-ai: OpenAI, Anthropic, Google, Groq, AWS Bedrock, Ollama for local models, or any OpenAI-compatible endpoint.
Methods
All methods work without an LLM except ask(). A prompt is always explicit: nothing is sent to an LLM unless you ask for it.
Method | What it does | LLM |
| Inspects the data and recommends a forecaster and an estimator | no |
| Builds the plan: lags, window and calendar features, interval, metric | no |
| Changes a plan with explicit overrides, or with a | optional |
| Builds the cross-validation strategy, or translates a | optional |
| Runs the forecast, or returns its script without running it | no |
| Runs the backtest, or returns its script without running it | no |
| Backtests several configurations and ranks them | no |
| Explains a profile, plan, script or result, or answers a question | required |
How it works
skforecast-ai has two ways in, on the same engine. The fast path goes from data to a forecast or a backtest in one call. The step-by-step path returns each intermediate object (profile, plan, cross-validation) so you can inspect it, change it or refine it with the LLM before running anything. Both branch into forecasting and backtesting, compare() picks the best configuration from measured performance, and ask() explains any object along the way.
Read more in Agentic forecasting and Agentic forecasting step by step.
Documentation
The full documentation is available at https://ai.skforecast.org.
Documentation | |
Install skforecast-ai, run your first forecast and ask the assistant | |
The fast path: profile, forecast, backtest, compare and ask | |
Every intermediate object, and how to change it | |
Providers, credentials, local models and what is sent | |
The same pipeline from the terminal | |
The same pipeline as tools for Claude Code, Cursor and other MCP clients | |
| |
What changed in each version |
Part of the skforecast family
skforecast: the forecasting library that runs every forecast of skforecast-ai. Machine learning, statistical and foundation models, backtesting and tuning.
Skforecast Studio: a no-code application to build forecasting models visually, which generates production-ready Python code.
Contributing
Bug reports, feature requests, code, tests and documentation are all welcome. Open an issue on GitHub Issues or read the Contribution Guide and the Code of Conduct to get started.
skforecast-ai is created and maintained by Joaquín Amat Rodrigo and Javier Escobar Ortiz, together with everyone who has contributed to it (about the project).
Citation
If you use skforecast-ai in a scientific publication, please cite the version you used: each version has its own DOI and ready-made citations on Zenodo. To cite skforecast-ai in general, use the DOI that always resolves to the latest release.
APA:
Amat Rodrigo, J., & Escobar Ortiz, J. skforecast-ai [Computer software]. https://doi.org/10.5281/zenodo.21338159BibTeX:
@software{skforecast-ai,
author = {Amat Rodrigo, Joaquin and Escobar Ortiz, Javier},
title = {skforecast-ai},
license = {Apache-2.0},
url = {https://ai.skforecast.org/},
doi = {10.5281/zenodo.21338159}
}The citation metadata is also in CITATION.cff (GitHub's "Cite this repository" button).
Sponsorship and funding
skforecast-ai is built by the skforecast team. skforecast is free, open-source software supported by the Sovereign Tech Fund and by the organizations that sponsor it. If your company relies on skforecast or skforecast-ai, see Sponsorship and funding for sponsorship tiers, support agreements, feature sponsorship and training.
Individuals can support the project through Open Collective, Buy Me a Coffee, GitHub Sponsors (Joaquín Amat Rodrigo, Javier Escobar Ortiz) or PayPal.
License
skforecast-ai software: Apache License 2.0. The underlying skforecast engine is distributed under its own BSD-3-Clause License.
skforecast-ai documentation: CC BY-NC-SA 4.0
Trademark: The trademark skforecast is registered with the European Union Intellectual Property Office (EUIPO) under the application number 019109684. Unauthorized use of this trademark, its logo, or any associated visual identity elements is strictly prohibited without the express consent of the owner.
Available Tools
11 toolsbacktestA
Backtest a plan with a cross-validation strategy: metrics over the folds, with the predictions and metrics in CSV files. Returns a backtest id.
| Name | Required | Description | Default |
|---|---|---|---|
| cv_id | Yes | Id returned by `create_cv`. | |
| plan_id | No | Plan to backtest, built from the same profile. Null for the plan the cross-validation strategy was built for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cost | No | |
| kind | Yes | |
| files | No | |
| links | No | |
| notices | No | |
| summary | Yes | |
| changeable | No | |
| notices_omitted | No | |
| values_included | No | |
| summary_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a non-destructive, non-open-world write (readOnlyHint=false, destructiveHint=false). The description adds useful behavior beyond that: it writes predictions and metrics to CSV files as a side effect. However, it says nothing about permissions, runtime, or whether repeated runs overwrite output files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the mechanism and output front-loaded before the return value. No filler, though the trailing 'Returns a backtest id' is somewhat redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return value need not be explained, and the description still summarizes it. It conveys the CSV side effects and the cv_id prerequisite; only explicit alternative-tool routing and overwrite/permission behavior are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents cv_id and the optional plan_id with its null default semantics. The description adds no additional parameter meaning, which matches the baseline 3 when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Backtest') and resource ('a plan') plus the mechanism ('with a cross-validation strategy') and the artifact it produces. This distinguishes it from siblings like forecast or compare, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the required cv_id 'Id returned by create_cv' hints that a cross-validation strategy must exist first, but the description gives no explicit when-to-use or when-not-to-use guidance versus forecast, compare, or refine_plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareA
Backtest several configurations on the same folds and rank them by metric. Reports progress per candidate and can be cancelled between candidates. Returns a comparison id and the plan of the winner in links.best_plan_id.
| Name | Required | Description | Default |
|---|---|---|---|
| cv_id | Yes | Id returned by `create_cv`: every candidate is backtested on its folds. | |
| metric | No | Metric of every candidate. Metric, or list of metrics whose first one is the primary metric (the one that ranks); only the ones given are computed. Null for the metric chosen for the plan the strategy was built for, if one was chosen, else the one selected from the data. | |
| baseline | No | Whether to add a seasonal naive baseline (ForecasterEquivalentDate) to the ranking. | |
| interval | No | Prediction interval computed for every candidate. Prediction interval as two quantiles [lower, upper] with 0 < lower < upper < 1, e.g. [0.1, 0.9] for 80 %. The baseline and ForecasterStats only take symmetric ones (lower + upper = 1). Null for the interval of the plan the strategy was built for. | |
| candidates | No | Configurations to compare, each {'name': ..., 'config': {...}}, e.g. [{'name': 'ridge', 'config': {'estimator': 'Ridge'}}]. Null for the candidates recommended by the profile: the forecasters of its family (with several series, ForecasterRecursiveMultiSeries and ForecasterFoundation), or the estimators of the recommended forecaster when that leaves one, without those above 500 estimator fits; plus the plan the strategy was built for, in the row 'Strategy plan', when it is none of them. The summary names the row of that plan. A candidate that fails is ranked last with its error. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cost | No | |
| kind | Yes | |
| files | No | |
| links | No | |
| notices | No | |
| summary | Yes | |
| changeable | No | |
| notices_omitted | No | |
| values_included | No | |
| summary_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is not read-only, not destructive and not open-world; the description goes further by disclosing that it reports per-candidate progress, that it 'can be cancelled between candidates', and that a failing candidate context matters ('a candidate that fails is ranked last' lives in the schema). The long-running/cancellable trait is exactly the kind of behavior annotations cannot express, though cost/scaling implications of many candidates are not stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the operation and ranking rule, followed by runtime behavior and return contract. Every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, yet the description still names the key return artifacts (comparison id, winner plan id). Combined with 100% schema coverage and modest parameter count, the definition is nearly complete; only cost/duration expectations for many candidates are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters in depth. The description only reasserts that `metric` is the ranking key and references `links.best_plan_id` as the winner pointer, adding marginal meaning beyond the structured fields. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb pair plus resource ('Backtest several configurations ... and rank them by `metric`'), and the scope 'several configurations on the same folds' implicitly distinguishes it from the single-run `backtest` sibling. An agent can pick this tool for candidate comparison without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: comparison of multiple candidate configs on shared CV folds is clearly the use case, but there is no explicit 'when to use this vs `backtest`/`refine_plan`' and no preconditions (e.g. that a `cv_id` from `create_cv` is mandatory) in the prose. The routing comes from the reader's inference, not the text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_cvB
Build a time series cross-validation strategy (TimeSeriesFold) for a plan. The response states its cost in cost. Returns a cv id.
| Name | Required | Description | Default |
|---|---|---|---|
| gap | No | Observations between the end of training and the test set. Null for 0. A direct forecaster (ForecasterDirect, ForecasterDirectMultiVariate) cannot be backtested with a gap. | |
| refit | No | Whether to train again in every fold (true), never (false) or every n folds (an integer). Null for false: train once. Refitting multiplies the cost; ForecasterStats is refitted in every fold whatever it says. | |
| plan_id | Yes | Id of the plan to backtest (from `plan` or `refine_plan`). | |
| skip_folds | No | Folds are numbered from 0, and fold 0 always runs. An integer n keeps folds 0, n, 2n, ...; a list skips the folds at those numbers (each at least 1 and below the number of folds). Null for every fold. | |
| fold_stride | No | Observations the test set advances between folds. Null for `steps` (back-to-back folds); a larger value means fewer folds. | |
| fixed_train_size | No | Whether the training window keeps its size when refitting (true) or grows (false). Null for false. Only with `refit` true or an integer: with `refit` false or null it is an error, as it would not run (ForecasterStats aside). | |
| initial_train_size | No | Observations of the first training set (a number), or the ISO 8601 date that ends it ('2005-06-01'). Null for the default: 70 % of the series, at least what the lags need and leaving room for two folds, written as a date when the data has dates. | |
| allow_incomplete_fold | No | Whether the last fold may have fewer than `steps` observations. Null for true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cost | No | |
| kind | Yes | |
| files | No | |
| links | No | |
| notices | No | |
| summary | Yes | |
| changeable | No | |
| notices_omitted | No | |
| values_included | No | |
| summary_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and readOnlyHint=false, covering the mutation/safety profile. The description adds that the response reports its own 'cost' and returns a cv id, which is real behavioral context. It says nothing about persistence, lifetime, or whether the strategy can be modified or deleted afterwards.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose, no filler. The final sentence 'Returns a cv id' is largely duplicative of the output schema, which costs it slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the schema documents all eight parameters thoroughly. The definition is complete enough to invoke correctly; only the relationship to sibling tools is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the eight parameters have detailed inline descriptions covering gap, refit, fold_stride, skip_folds, and initial_train_size semantics. The description adds nothing about parameters, so baseline 3 applies; the schema carries the full parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and artifact: 'Build a time series cross-validation strategy (TimeSeriesFold) for a plan.' An agent can tell it creates a CV configuration rather than running a backtest. It doesn't explicitly differentiate from the sibling 'backtest' or 'forecast', so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to use this tool versus alternatives, and no prerequisites. With siblings like 'backtest' present, the description never says whether this must be created first or how it relates to them. Usage must be inferred entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_objectBRead-only
Return the response that created an object (summary, links, notices, files).
| Name | Required | Description | Default |
|---|---|---|---|
| object_id | Yes | Id of a registered object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cost | No | |
| kind | Yes | |
| files | No | |
| links | No | |
| notices | No | |
| summary | Yes | |
| changeable | No | |
| notices_omitted | No | |
| values_included | No | |
| summary_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds one useful behavioral nuance — that it returns the historical creation payload rather than the object's current state — but says nothing about missing records, pagination, or truncation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the action, with the parenthetical payload list earning its place by clarifying scope. It is slightly dense ('the response that created an object') and would benefit from a touch more precision, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is not strictly required, and annotations cover safety, so the definition is minimally viable. It is still missing usage context and any hint of error behavior when no creation record exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema coverage is 100%; the schema documents object_id as 'Id of a registered object.' The description adds no format, sourcing, or lookup guidance for the id, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Return') and a precisely scoped resource ('the response that created an object'), even enumerating the payload parts (summary, links, notices, files). It does not, however, distinguish itself from siblings like list_objects or get_code, which an agent might reasonably confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives, nor any prerequisite (e.g. that the object must be registered or that a creation record must exist). The reader must infer the trigger condition entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forecastA
Run a plan: forecast the future, or evaluate on a test set with test_size. Predictions and metrics go to CSV files. Returns a forecast id.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | Id of the plan to run (from `plan`, `refine_plan` or `links.best_plan_id` of `compare`). | |
| exog_path | No | Absolute path of a CSV file with the future values of the exogenous variables, one row per date (and series) of the horizon. Required to forecast the future when the plan uses exogenous variables. The script of `get_code` reads them from 'exog_future.csv' in its working directory. | |
| test_size | No | Null to forecast the future. To evaluate instead, the test set: the last n observations (an integer, which must equal `steps`) or the ISO 8601 date it starts at. A fraction in (0, 1) only works when it gives exactly `steps` observations. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cost | No | |
| kind | Yes | |
| files | No | |
| links | No | |
| notices | No | |
| summary | Yes | |
| changeable | No | |
| notices_omitted | No | |
| values_included | No | |
| summary_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish it is a non-read-only, non-destructive, closed-world operation. The description adds real behavioral context beyond that: predictions and metrics are written to CSV files (a side effect) and a forecast id is returned for chaining, which the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and the two modes, then the side effects and return value. No filler, though the second clause is slightly compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema covering return values, the description only needs to frame the modes and side effects, which it does. Nothing critical is missing, though the relationship to sibling tools remains unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions are highly detailed (exog_path semantics, test_size null vs integer vs fraction). The description adds little beyond the schema, only naming `test_size` as the evaluation switch, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Run a plan') and clearly splits into two operating modes: forecast the future, or evaluate on a test set. It is distinguishable from generic siblings, though it never contrasts itself with the adjacent `backtest`/`compare` tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains when each internal mode applies (default/null `test_size` to forecast, a value to evaluate), which is genuine conditional guidance. However, it never addresses when to reach for this tool versus siblings like `backtest` or `compare`, leaving the selection implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_codeARead-only
Return the Python script of an object: the one that ran, or that would run for a plan.
| Name | Required | Description | Default |
|---|---|---|---|
| candidate | No | For a comparison, the candidate whose script to return. Null for the best one. | |
| object_id | Yes | Id of a plan (its forecasting script), a cross-validation strategy (the code that builds it), a backtest, a forecast or a comparison (the script that ran). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| code | Yes | |
| kind | Yes | |
| files | No | |
| candidate | No | |
| requirements | No | |
| code_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false and a closed world, so the safety profile is covered. The description does add one real behavioral fact ('would run for a plan' implies no executed script exists for plans), but it says nothing about permissions, script size, or what happens for objects with no associated code, which matters given the broad object_id scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the colon construction keeps the core action first and the qualification second. Slightly compressed, but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, annotations cover safety, and all parameters are documented, so the description need not explain return values. The only remaining gap is the absence of explicit routing against the object-inspection siblings, which is minor for a tool this simple.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both object_id (plan, CV strategy, backtest, forecast, comparison) and candidate (the comparison candidate, null for the best). The description adds no parameter-level meaning beyond that, which is the correct baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Return the Python script of an object') and adds the discriminating nuance that it is the script that ran, or the one that would run for a not-yet-executed plan. This clearly separates it from metadata-style siblings like describe_object and list_objects, though it never names those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: retrieve code when you need the actual script rather than a description. There is no explicit 'use this instead of describe_object' routing, no mention of prerequisites, and no when-not-to-use guidance, even though sibling tools clearly overlap in the object-inspection space.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_failureBRead-only
Return the traceback and the code of a failed run or of a failed candidate of a comparison.
| Name | Required | Description | Default |
|---|---|---|---|
| candidate | No | Name of the failed candidate of a comparison. | |
| object_id | Yes | `details.failure_id` of an error, or the id of a comparison whose candidate failed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | Yes | |
| files | No | |
| candidate | No | |
| text_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and closed-world scope, so the safety profile is covered. The description adds that the payload is a traceback plus code, which is useful content-level context. It does not say what happens if object_id points at a non-failed object, which is the main remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the payload front-loaded ahead of the eligible input types. It is efficiently sized, though the trailing 'or of a failed candidate of a comparison' clause is slightly convoluted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read with an output schema and full parameter documentation, so return-value explanation is unnecessary. The description covers what is fetched and from which object; only the failure case for a successful/non-failed id is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both candidate and object_id are already documented in the schema (failure_id or comparison id). The description restates that a failed comparison candidate is a valid target but adds no format or syntax detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it returns the traceback and the code for a failed run or a failed comparison candidate. That is concrete and distinguishable from the raw code-retrieval sibling get_code. It stops short of explicitly naming when to prefer it over get_code or describe_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative routing. The phrase 'of a failed run or of a failed candidate of a comparison' hints at the eligible inputs but leaves the agent to infer that this is the debugging entry point versus get_code or describe_object.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_objectsCRead-only
List the ids of the objects the server keeps.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Only the objects of this kind. Null for every kind. |
Output Schema
| Name | Required | Description |
|---|---|---|
| objects | Yes | |
| removed | No | |
| max_objects | Yes | |
| max_memory_mb | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered without the description. The one added fact is that only ids (not full objects) are returned, which is useful but thin; no mention of ordering, volume, or empty results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, and the id-only scope is stated up front. It is efficient, though the terseness is part of why scope is unclear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the annotations cover the safety profile, so the description is not required to carry much. Still, for a discovery tool with six possible kinds, the definition leaves the agent guessing what domain it enumerates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `kind` parameter is fully described in-schema ("Only the objects of this kind. Null for every kind."), so the schema carries the burden. The description adds nothing about the filter or kind values, leaving this at the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("List the ids of the objects"), but "the objects the server keeps" never says what an object is here. Sibling tools (profile, plan, cv, backtest, comparison, forecast) imply the domain, yet the description does not name any of them or distinguish itself from describe_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no named alternative. An agent wanting object details rather than ids gets no routing hint toward describe_object, and there is no statement of prerequisites or expected result size.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
planA
Build a forecasting plan (lags, window features, metric, preprocessing, interval) from a profile and a horizon. Returns a plan id.
| Name | Required | Description | Default |
|---|---|---|---|
| lags | No | Lags: an integer n for 1..n, or a list of distinct positive integers. Null for the selection from the partial autocorrelation. | |
| steps | Yes | Forecast horizon: number of steps ahead to predict, from 1 to the length of the longest series (12 for a year of monthly data). | |
| metric | No | Metric, or list of metrics whose first one is the primary metric (the one that ranks); only the ones given are computed. Null for the metric selected from the data (MAE for one series, MASE for several) and its default panel. | |
| interval | No | Prediction interval as two quantiles [lower, upper] with 0 < lower < upper < 1, e.g. [0.1, 0.9] for 80 %. The baseline and ForecasterStats only take symmetric ones (lower + upper = 1). Null for no interval. | |
| use_exog | No | Whether to use the exogenous columns of the data: false leaves them out (forecast then takes no exog_path); true fails when the data has none or the forecaster cannot use them. Null uses them whenever the forecaster can. | |
| estimator | No | Estimator: one of ['CatBoostRegressor', 'HistGradientBoostingRegressor', 'LGBMRegressor', 'RandomForestRegressor', 'Ridge', 'XGBRegressor'] for the machine learning forecasters, 'Arima' for ForecasterStats, or the Hugging Face model id of a foundation model for ForecasterFoundation (default 'autogluon/chronos-2-small'; model id prefixes: ['amazon/chronos-2', 'autogluon/chronos-2', 'google/timesfm-2.5', 'google/timesfm-3.0', 'Salesforce/moirai-2', 'soda-inria/tabicl', 'priorlabs/tabpfn', 'theforecastingcompany/t0', 'Synthefy/Nori', 'taharnbl/TS-ICL']). ForecasterEquivalentDate takes none. Null for the recommendation. | |
| forecaster | No | skforecast forecaster class: ForecasterRecursive or ForecasterDirect (one series, machine learning), ForecasterRecursiveMultiSeries (several series), ForecasterDirectMultiVariate (one series predicted from several), ForecasterStats (Auto-ARIMA), ForecasterFoundation (pre-trained foundation model, no training) or ForecasterEquivalentDate (seasonal naive baseline). Null for the recommendation of the profile. | |
| profile_id | Yes | Id returned by `profile`. | |
| differentiation | No | Order of differencing of the target before training (an integer of at least 1, usually 1 for a trend); predictions are integrated back. Machine learning forecasters only. Null for none. | |
| window_features | No | Rolling features, one entry per window size: {'stats': [...], 'window_size': n}, with stats among ['mean', 'std', 'min', 'max', 'sum', 'median', 'ratio_min_max', 'coef_variation', 'ewm'], e.g. [{'stats': ['mean', 'std'], 'window_size': 7}]. Null for the deterministic selection. | |
| estimator_kwargs | No | Keyword arguments of the estimator, e.g. {'n_estimators': 200}. A foundation model only takes context_length, cross_learning, point_estimate, max_horizon, add_calendar_features and n_fourier_terms. Null for the defaults. | |
| calendar_features | No | Calendar features generated from the dates (an empty list for none); the encoding follows the estimator. A feature whose column is already an exogenous column used by the plan is rejected. Machine learning forecasters with a datetime index only. Null for those selected from the frequency. | |
| dropna_from_series | No | Whether to drop the training rows with missing values; false fails when the data has missing values and the estimator does not accept them. Machine learning forecasters only. Null for the rule. | |
| target_transformer | No | Scaler of the target: 'StandardScaler', or 'none' for no scaling. Machine learning forecasters only. Null for the rule. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cost | No | |
| kind | Yes | |
| files | No | |
| links | No | |
| notices | No | |
| summary | Yes | |
| changeable | No | |
| notices_omitted | No | |
| values_included | No | |
| summary_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate it is not read-only and not destructive, so the agent knows it creates a persistent artifact. The description adds that it returns a plan id, which is useful for chaining. However, it does not disclose any side effects, storage behavior, or whether the plan is mutable later, leaving gaps for a state-changing operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: one sentence for the action and one for the return value. It is front-loaded with the key verb and purpose, with zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (14 parameters, many optional with defaults, and an output schema for the return), the description is nearly complete. It states the required inputs (profile and horizon) and the output (plan id), and the schema covers all parameter details. The only missing piece is the relationship to sibling tools (e.g., that 'forecast' takes the plan id), but the core information for invocation is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the extensive per-parameter documentation in the schema already provides deep semantics (defaults, allowed values, constraints). The description only lists categories of configuration at a high level; it adds no new meaning beyond the schema, which is acceptable given full coverage but offers no extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Build a forecasting plan') and enumerates exactly what the plan captures (lags, window features, metric, preprocessing, interval) from its inputs (a profile and a horizon). It clearly distinguishes the tool from siblings like 'forecast', 'backtest', and 'refine_plan' by naming the building activity and its artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives like 'refine_plan' or directly invoking 'forecast'. The description implies its role as a setup step but does not state prerequisites (e.g., must call 'profile' first) or dependencies (e.g., 'forecast' consumes the returned plan id).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profileA
Profile a CSV file: frequency, series, exogenous columns and the recommended forecaster and estimator. Returns a profile id.
| Name | Required | Description | Default |
|---|---|---|---|
| sep | No | Separator of the fields of the file: ',', ';' or a tabulator. When null, it is detected from the file; pass it only when an error says it cannot be told. | |
| target | No | Column to forecast, or a list of columns (one series each) for wide multi-series data. Null when it is not known: the error lists the columns of the file. | |
| decimal | No | Decimal mark of the file: '.' or ',' (only when the separator is not ','). When null, it is detected from the file. | |
| data_path | Yes | Absolute path of a CSV file ('.csv', '.tsv', '.csv.gz' or '.tsv.gz') inside the directory the server may read. URLs are not accepted. | |
| date_column | No | Column with the dates. When null, the first column holding dates is used. | |
| exog_columns | No | Columns to use as exogenous variables, an empty list for none. When null, every column that is not the target, the date or the series ids. The other columns are not used. | |
| series_id_column | No | Column with the series ids of long multi-series data. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cost | No | |
| kind | Yes | |
| files | No | |
| links | No | |
| notices | No | |
| summary | Yes | |
| changeable | No | |
| notices_omitted | No | |
| values_included | No | |
| summary_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the safety profile is already covered. The description adds that a profile id is produced (a persistent artifact to reuse later), which is useful, but says nothing about side effects, re-profiling the same file, or whether the id is required by siblings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the action and the output front-loaded. Nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter coverage, the description only needs to say what the tool is and what it returns; it does both. The one gap, chaining guidance toward plan/forecast, is minor for a profiling entry point.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are already documented in detail (separator detection, target semantics, exog defaults, date/series-id columns). The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('Profile a CSV file') and enumerates what profiling yields: frequency, series, exogenous columns, and a recommended forecaster and estimator. That distinguishes it from the downstream siblings (plan, forecast, backtest), though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the mention of a 'recommended forecaster and estimator' and the returned profile id suggest this is a precursor step before plan/forecast, but the description never says when to call this versus plan or forecast, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refine_planA
Build a new plan from an existing one, changing some of its decisions. Returns a new plan id; the original plan is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | Yes | Id of the plan to refine. | |
| overrides | Yes | Values to change, e.g. {'estimator': 'Ridge', 'lags': 12}. An omitted key keeps the value of the plan; {'lags': null} selects the lags again and {'interval': null} removes the interval. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| cost | No | |
| kind | Yes | |
| files | No | |
| links | No | |
| notices | No | |
| summary | Yes | |
| changeable | No | |
| notices_omitted | No | |
| values_included | No | |
| summary_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, and the description usefully adds that the operation is non-destructive: it returns a new plan id and leaves the original intact. It does not mention validation failure modes (e.g. incompatible overrides) or any cost, but the key mutation semantics are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero waste, and the return/immutability fact is front-loaded alongside the purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no elaboration, and the description still notes that a new plan id is returned. For a tool whose override semantics live in the schema, this is nearly complete; only guidance on choosing between refine_plan and plan is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the $defs go into deep detail on each override, including null/omitted semantics, so the schema carries the burden. The description adds nothing parameter-specific beyond the example in the schema itself; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: building a new plan derived from an existing one by changing decisions. This implicitly separates it from the `plan` sibling (which builds from scratch), though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'from an existing one' — the agent can infer this is the tool for modifying an already-created plan rather than creating a fresh one, but there is no explicit when-to-use/when-not guidance or reference to `plan`/`forecast` alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
backtest - First observed
compare - First observed
create_cv - First observed
describe_object - First observed
forecast - First observed
get_code - First observed
get_failure - First observed
list_objects - First observed
plan - First observed
profile - First observed
refine_plan
TDQS
Scored across 11 tools
Most tools have clearly distinct purposes: profile builds a profile, plan builds a plan, create_cv builds a CV strategy, and forecast/backtest/compare each run in distinct modes. The main risk is soft overlap between forecast, backtest, and compare (all execute a plan), but their outputs and semantics differ enough to distinguish them.
Names are readable and mostly follow a verb_noun pattern (refine_plan, create_cv, get_code, get_failure, list_objects, describe_object), but several are bare verbs (forecast, backtest, compare, profile, plan), which is a minor deviation. No chaotic mixing of case or conventions.
11 tools is well-scoped for a forecasting workflow server. Each tool maps to a distinct stage (profile, plan, CV, run, compare, inspect) and none feels redundant.
The lifecycle is largely covered: profile -> plan -> create_cv -> forecast/backtest/compare, plus inspection via list_objects, describe_object, get_code, and get_failure, and refinement via refine_plan. Minor gaps exist (no explicit cancel or delete tool despite mentions of cancellation and object storage), but agents can work around these.
Maintenance
Related MCP Connectors
Probabilistic time-series forecasts from zero-shot foundation models: routed, single or ensembled.
PredictOracle - 12 forecasting tools: time-series, scenario analysis, risk projections.
Forecast product demand using historical sales and market signals.
Walk-Forward Efficiency, parameter-stability scoring, and WFO window generation.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnable any AI agent to forecast time-series data (e.g., sales, traffic) using Google's TimesFM or a zero-dependency statistical baseline.3Apache 2.0
- AlicenseNot gradedqualityCmaintenanceLocal MCP server for GPU-backed TimesFM 2.5 forecasting, enabling zero-shot time-series forecasting, covariate forecasting, anomaly detection, and CSV forecasting via MCP tools.2Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables time-series analysis and forecasting through a structured tool catalogue, including data loading, quality repair, diagnostics, and forecasting with ARIMA, exponential smoothing, Chronos-2, Toto 2.0, and AutoML.1MIT
- FlicenseAqualityCmaintenanceEnables demand forecasting and replenishment recommendations using statistical models (Syntetos-Boylan classification, AutoETS, TSB) and provides tools for forecasting, evaluation, and order quantity calculation.6-