Skip to main content
Glama

tslab-mcp

An MCP server that exposes deterministic time-series forecasting as tools, so your agent is the reasoning engine and every number comes from ordinary, reproducible Python.

No LLM is called anywhere in this package. No API key is required (unless you ask for TimeGPT, which calls the Nixtla API).

Why

Some forecasting libraries ship an agent that reads features, picks a model, and explains the result with an LLM in the loop. Calling one of those from your own agent nests an agent inside an agent — two prompts, two bills, two sources of nondeterminism, and an opaque middle layer that makes the model-selection rationale unauditable.

So control is inverted here: the forecasting library is the tool, and your agent is the one reasoning. It reads the features, argues for a model family, cross-validates the candidates, and writes the rationale into a manifest. Every number on the way is produced by a library call you can rerun without an LLM in the path.

That split carries into how the package itself is built. The base install runs eleven statistical models — AutoARIMA, AutoETS, Theta, CrostonClassic and friends — through statsforecast: roughly 340 MB, no PyTorch, and it starts in seconds. An optional foundation extra adds TimeCopilot's pretrained models — Chronos, Moirai, TimesFM, TiRex, Toto and others — plus Prophet, for when a statistical baseline isn't enough. A request that only names statistical models never imports TimeCopilot or torch; a request that names even one foundation model runs entirely through TimeCopilot, which carries the statistical models too. Either way tsf_list_models reports what's actually installed before you commit to a model.

Related MCP server: forecast-mcp

Install

Requires Python 3.10+ (3.13 recommended, see Python version).

Until the first package release, run the current GitHub revision directly:

uvx --from git+https://github.com/pedrobtz/tslab-mcp tslab-mcp
uv tool install git+https://github.com/pedrobtz/tslab-mcp

After 0.1.0 is published, the shorter PyPI commands will work:

uvx tslab-mcp
uv tool install tslab-mcp

The base install runs the eleven statistical models through statsforecast: roughly 340 MB, no PyTorch, and it starts instantly. For the pretrained foundation models — Chronos, Moirai, TimesFM, Toto, TiRex — and Prophet, add the extra:

uvx --from 'tslab-mcp[foundation] @ git+https://github.com/pedrobtz/tslab-mcp' tslab-mcp

The foundation extra pulls TimeCopilot, which brings torch, transformers and lightning: roughly 2 GB on first install, and the first tool call that touches it spends ~30 seconds importing. Both are one-off, and neither is paid unless you ask for a model that needs them. The base install works on Intel Macs, but the foundation extra does not: TimeCopilot currently requires a PyTorch release for which PyTorch publishes no macOS x86_64 wheel. Use Apple silicon, Linux, or Windows for foundation models.

From GitHub

uv and uvx both accept a git URL in place of a package name, which installs the current main without waiting for a release:

uvx --from git+https://github.com/pedrobtz/tslab-mcp tslab-mcp
uv tool install git+https://github.com/pedrobtz/tslab-mcp        # or install the CLI

# with the foundation extra
uvx --from 'tslab-mcp[foundation] @ git+https://github.com/pedrobtz/tslab-mcp' tslab-mcp

Pin a ref for anything other than casual testing — the branch head can move under you otherwise. A commit works today; a version tag will too once one is cut:

uv tool install "git+https://github.com/pedrobtz/tslab-mcp@136824c1cc2a"

From a checkout

git clone https://github.com/pedrobtz/tslab-mcp
cd tslab-mcp
uv sync                              # base
uv sync --extra foundation           # with the pretrained models
uv run tslab-mcp

Configure

Add the server to your MCP client's configuration. The file differs per client — often .mcp.json in the project root — but the entry itself is the same shape:

{
  "mcpServers": {
    "tslab": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/pedrobtz/tslab-mcp", "tslab-mcp"],
      "env": {
        "TSLAB_MCP_HOME": "~/.tslab-mcp"
      }
    }
  }
}

TSLAB_MCP_HOME sets where artifacts are written; it defaults to ~/.tslab-mcp, and run outputs land in <home>/runs.

Transport is stdio only, by design: your data is assumed sensitive and never leaves the machine. The server makes no outbound requests except the model weight downloads TimeCopilot itself performs for foundation models, and the Nixtla API calls TimeGPT makes if you ask for it specifically.

GitHub Copilot

Copilot discovers MCP servers from an mcp.json file and exposes their tools in agent mode — the tools do not appear in ask or edit mode.

This repository now includes a ready-made TSLab Forecaster custom agent and portable VS Code MCP configuration. For the shortest setup, follow the GitHub Copilot quickstart; it finishes with an end-to-end AirPassengers verification prompt. The custom agent is deliberately scoped to read/search tools and tslab/*. To add the same integration to a different repository, copy the ready-made integrations/github-copilot bundle.

VS Code. Put the server in .vscode/mcp.json to share it with the repo, or run MCP: Open User Configuration from the Command Palette to keep it in your own profile across every workspace. Note the key is servers, not mcpServers:

{
  "servers": {
    "tslab": {
      "type": "stdio",
      "command": "uvx",
      "args": ["--from", "git+https://github.com/pedrobtz/tslab-mcp", "tslab-mcp"],
      "env": {
        "TSLAB_MCP_HOME": "${userHome}/.tslab-mcp"
      }
    }
  }
}

From a checkout, point it at the working tree instead:

{
  "servers": {
    "tslab": {
      "type": "stdio",
      "command": "uv",
      "args": ["run", "--directory", "${workspaceFolder}", "tslab-mcp"]
    }
  }
}

Then: open Chat, switch the mode selector to Agent, and use the Tools button to confirm the nine tsf_* tools are listed and enabled. MCP: List Servers shows the server's status and its logs, which is where a failed start is explained. Copilot caps how many tools can be active at once, so if you run several MCP servers you may need to deselect some to fit all nine.

Visual Studio. Same JSON shape, in .mcp.json at the solution root (or %USERPROFILE%\.mcp.json for all solutions), then enable the tools from the Copilot Chat agent-mode tool picker.

JetBrains, Eclipse, and Xcode. Open the Copilot Chat agent-mode tool picker, choose Edit MCP configuration, and add the same servers entry to the mcp.json it opens.

Copilot coding agent (the cloud agent on github.com) is a poor fit for this server: it runs your MCP servers inside an ephemeral GitHub Actions environment, which means paying the ~2 GB TimeCopilot install on every run, and it has no access to local data files. Use it from your editor instead.

Tools

Tool

Purpose

Returns

tsf_load_series

Read CSV/Parquet, validate values and frequency, report gaps, register a handle

JSON summary + SHA-256

tsf_describe_series

Per-series features for choosing a model family

Markdown table or JSON, row-capped

tsf_list_models

Probe which models actually import here

{available, statistical, foundation, unavailable}

tsf_cross_validate

Rolling-origin comparison across models

Metric table, ranking, parquet path

tsf_select_model

Validate the agent's proposal against CV evidence and SeasonalNaive

Structured decision or retry/fallback instruction

tsf_forecast

Fit and forecast with prediction intervals

Parquet path + bounded preview

tsf_detect_anomalies

Cross-validated interval flagging

Counts, capped flag list, parquet path

tsf_export_run

Pin the session to a re-runnable manifest

Manifest path

tsf_export_report

Render every step as a readable report

HTML or Markdown path

The annotations follow actual side effects: only tsf_list_models is read-only. Loading mutates the handle registry, describing appends evidence to the run log, and the compute/export tools create additive artifacts. Loading is marked potentially destructive because deliberately reusing a handle replaces its old in-memory panel and run log. Forecasting, CV, and anomaly detection are conservatively open-world because a foundation model may download weights and TimeGPT calls an API. Nothing deletes filesystem artifacts, so cleaning up ~/.tslab-mcp/runs remains your responsibility.

Data integrity and prediction intervals

Loading rejects missing/blank IDs, missing or invalid timestamps, non-numeric or non-finite targets, duplicate keys, and invalid explicit frequency aliases. It also compares every series with the declared frequency and reports missing and off-grid timestamps under integrity. An irregular panel can be loaded so you can inspect that diagnosis, but describe/CV/forecast/anomaly calls stop with an actionable error until the source is regularized. The server never fills or imputes observations silently.

Before fitting, statistical-model requests check that every series has enough history for the horizon, rolling windows, model-specific minimum, seasonality, and interval calibration. Backend results must contain canonical model columns and finite values before an artifact or successful run record is written.

StatsForecast models with native intervals use them. ADIDA, IMAPA, and CrostonClassic have no native intervals, so the base backend supplies deterministic conformal-distribution intervals using two calibration windows. That configuration is recorded in forecast and anomaly run entries.

Starting a session

The server sends every MCP client a canonical agent_workflow.md instruction contract. For end-to-end analysis it directs the external agent through the same core loop as an embedded forecasting agent: feature analysis, feature-informed candidate selection, rolling cross-validation against SeasonalNaive, evidence-based model selection, forecasting, anomaly detection, and a reproducible manifest/report. Explicitly narrower user requests still take precedence, so asking only to load or describe data does not trigger an unsolicited full analysis.

The complete sequence is agent-directed, but the selection checkpoint is enforced: once tsf_select_model validates a winner, tsf_forecast rejects a different model unless the caller marks an explicit override. An opening prompt still establishes the user's scope and turns the nine callable functions into an analysis. Something like this works well:

Use the tslab tools to forecast the series in /Users/me/data/deposits.csv, 12 months ahead.

Work in this order and show your reasoning at each step:

  1. Load the file and tell me what you found — how many series, what frequency, any gaps or missing values.

  2. Describe the features, and say which model families they argue for, and why.

  3. Check which models are actually installed before proposing any.

  4. Cross-validate your shortlist against a SeasonalNaive baseline over 4 windows. Statistical models only for now.

  5. Propose the lowest-MASE model and validate it with tsf_select_model. If nothing beats the baseline, follow its retry/fallback result.

  6. Forecast with the validated model, with 80% and 95% intervals.

  7. Export a run manifest and an HTML report, and put the model-selection rationale in the note: what you chose, what the metric table showed, and what you rejected.

Summarise results and give me the parquet paths — don't paste whole frames into the chat.

Four things in that prompt are doing real work:

  • An absolute path. Relative paths resolve against the server's working directory, which your MCP client chooses and you generally cannot predict.

  • A horizon that matches the decision. h drives both the forecast and how much history each CV window consumes; 12 monthly steps is a year of planning, not an arbitrary default.

  • "Statistical models only for now." Without it, an agent may reach for a foundation model and spend several minutes downloading weights to answer a question AutoETS would have settled in seconds. Lift the restriction once the cheap models have set a floor.

  • Asking for the rationale in the manifest note. The chat transcript is disposable; the manifest is the part someone can rerun and audit. If the reasoning only exists in the conversation, it is effectively lost.

Shorter openers, when you know what you want:

Load /Users/me/data/sales.parquet and describe the features. Don't forecast yet — I want to see what we're dealing with first.

Compare SeasonalNaive, AutoETS and AutoARIMA on the loaded deposits handle, over 6 windows at h=12, then tell me whether anything beats the baseline by enough to be worth the extra complexity.

Statistical-only calls answer in seconds. The first call that names a foundation model spends ~30 seconds importing TimeCopilot before it does anything else — that pause is expected, not a hang, and it only happens if the foundation extra is installed and a request actually reaches for one.

A worked session

For a complete copy-paste chat walkthrough using the classic AirPassengers dataset, see examples/air-passengers-chat.md. For a multivariate macroeconomic example, see examples/us-inflation-forecast-chat.md, which compares inflation forecasts with and without four lagged FRED regressors.

Start from a CSV in Nixtla long format:

unique_id,ds,y
branch_01,2018-01-01,1043.2
branch_01,2018-02-01,1102.7
...

Additional numeric columns are treated as historical regressors. Statistical AutoARIMA consumes them; the other statistical models ignore them and can serve as univariate benchmarks in the same cross-validation. Forecasting with AutoARIMA then requires future_regressors_path: a CSV or Parquet file with unique_id, ds, the identical regressor columns, and exactly h future rows per series. The forecast run records that file's path and SHA-256.

1. Load it. The panel stays in the server process; the handle is all the session carries.

{"handle": "deposits", "n_series": 12, "n_obs": 864, "freq": "MS",
 "start": "2018-01-01T00:00:00", "end": "2023-12-01T00:00:00",
 "obs_per_series": {"min": 72, "median": 72, "max": 72},
 "n_missing_y": 0,
 "integrity": {"is_regular": true, "n_missing_timestamps": 0,
               "n_off_grid_timestamps": 0, "n_series_affected": 0},
 "sha256": "9f2c…"}

2. Describe it. These are the numbers you reason over.

| id        | n  | mean   | cv    | %zero | trend | seasonal | acf1(diff) |
|-----------|----|--------|-------|-------|-------|----------|------------|
| branch_01 | 72 | 1180.4 | 0.112 | 0.0   | 0.83  | 0.62     | -0.31      |

High seasonal strength and a clear trend argue for AutoETS and AutoARIMA over a naive baseline; a high %zero would have argued for ADIDA or CrostonClassic instead.

seasonal is an STL strength — the seasonal component measured against what remains once the trend is removed — so a growing series still reports its seasonality honestly. It carries a noise floor of roughly 0.3–0.5: scores in that band mean "no evidence", not "mildly seasonal".

3. Check what is installed with tsf_list_models, so you never propose a model this machine cannot run.

4. Cross-validate the candidates — always including SeasonalNaive, since a model that cannot beat it is not worth deploying:

{"kind": "cross_validation", "models": ["SeasonalNaive", "AutoETS", "AutoARIMA"],
 "h": 12, "n_windows": 4, "seasonality_used_for_mase": 12,
 "metrics": {"mase": {"SeasonalNaive": 1.0, "AutoETS": 0.71, "AutoARIMA": 0.68}},
 "ranking": {"mase": ["AutoARIMA", "AutoETS", "SeasonalNaive"]},
 "artifact": "~/.tslab-mcp/runs/cv_deposits_3f1a9c02.parquet"}

5. Validate the proposed winner with tsf_select_model. The tool verifies the proposal against the latest metric table and records the checkpoint:

{"kind": "model_selection", "proposed_model": "AutoARIMA",
 "primary_metric": "mase", "baseline_score": 1.0,
 "best_challenger_score": 0.68, "status": "validated_challenger",
 "selected_model": "AutoARIMA", "requires_additional_comparison": false}

If no challenger qualifies, it requests one broader comparison or validates SeasonalNaive as an explicit final fallback.

6. Forecast with the validated winner. The full frame goes to parquet; the response carries the path, the columns, and a short preview.

7. Export the run and the report. Write down why, in the note — it is the only part of your reasoning that outlives the conversation:

{"manifest": "~/.tslab-mcp/runs/manifest_deposits_77b0e415.json", "n_runs": 4,
 "kinds": ["cross_validation", "features", "forecast", "model_selection"]}

The manifest holds the source path and hash, the frequency, every call with its arguments and artifact paths, the pinned versions of whatever's actually installed — statsforecast, pandas and Python always; TimeCopilot and torch too if the foundation extra is in — and your note. It is sufficient to reproduce the numbers with the server stopped.

tsf_export_report turns that same manifest into something a person reads — features, metric tables ordered best-first, forecasts, anomalies and the environment, in the order they happened:

{"report": "~/.tslab-mcp/runs/report_deposits_5c31d0a7.html",
 "format": "html", "n_steps": 4,
 "steps": ["features", "cross_validation", "model_selection", "forecast"]}

The report is a pure function of the manifest: it reads no parquet and calls no model, so tsf_export_report with manifest_path re-renders a run from months ago with nothing loaded. The HTML embeds its own CSS and references no external script, stylesheet or font, so it still opens correctly offline.

Design

Four invariants, and the reasons they exist:

Handles, not dataframes. One cross-validation frame is n_series × h × n_windows × n_models rows. Serialising it into a tool result exhausts the session's context on the first call and makes every later turn worse. Tools take a handle and return summaries, aggregates, and file paths; every bulk path is capped and reports what it omitted, so the session knows to read the parquet rather than ask again.

Blocking work never touches the event loop. Cross-validating several models over a large panel is minutes of CPU. Every tool body is a synchronous closure dispatched through anyio.to_thread.run_sync, so the stdio transport keeps answering and the client does not drop the server mid-run.

The environment is discovered, not assumed. Models are imported lazily and probed, never assumed present. tsf_list_models reports what actually resolved here, so asking for Chronos without the extra returns a message naming the extra rather than a traceback ten minutes into a run.

The backend is chosen by what you ask for: a request whose models are all statistical runs through statsforecast, and only a request that needs a pretrained model reaches for TimeCopilot. Statistical runs therefore never import torch, and the server starts instantly either way.

statsforecast is left at its default n_jobs=1 deliberately. Its parallel mode spawns worker processes that re-import the entry module, which inside an MCP server buys contention and a stdout hazard rather than speed.

The manifest is the artifact of record. Prose in the conversation is commentary. The manifest is what someone reruns in six months, and what a reviewer reads to see which models were compared and on what basis.

Python version

TimeCopilot gates several models on the interpreter version, and on Python < 3.13 it pins tabpfn-time-series, which caps pandas below 2.2.

Python

Models

pandas

3.13

everything except TabPFN and Sundial

≥ 2.2

3.10–3.12

adds TabPFN, Sundial

< 2.2

3.13 is the recommended target. Either way, tsf_list_models reports what actually resolved, with the reason for anything that did not. This table assumes a platform supported by TimeCopilot's PyTorch dependency; the foundation extra is unavailable on macOS x86_64, while the statistical base install remains supported there.

Development

uv sync --all-groups
uv run pytest                  # fast suite
uv run pytest -m slow          # exercises TimeCopilot; slower, no weight downloads
uv run ruff check src tests
uv run mypy

Inspect the tool surface with the MCP Inspector:

npx @modelcontextprotocol/inspector uv run tslab-mcp

License

MIT

Available Tools

8 tools
tsf_cross_validateA
Read-onlyIdempotent

Compare models by rolling-origin cross-validation.

This is the tool that replaces guesswork about model choice: it produces the evidence, you read the table and decide. Always include SeasonalNaive as the baseline -- a model that cannot beat it is not worth deploying.

Returns a per-model metric table aggregated over series and windows, a best-first ranking per metric, and the parquet path holding every per-window prediction. LONG-RUNNING: seconds for statistical models, many minutes for foundation models on a large panel. Start with statistical models on the real horizon before reaching for anything pretrained.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, idempotent, non-destructive behavior. The description adds crucial behavioral context: runtime warning ('LONG-RUNNING'), output description (aggregated table, ranking, parquet path), and implicitly that it is safe but compute-intensive. This goes well beyond the annotations and aids agent expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short, purposeful paragraphs. The first sentence immediately states the tool's function. Each subsequent section (usage advice, output details, runtime warning) earns its place with no redundancy. It is front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (cross-validation, multiple models, windows, output schema exists), the description covers purpose, usage, baseline recommendation, output contents (aggregated metrics, rankings, prediction parquet), and runtime behavior. It is sufficiently complete for an agent to understand when and how to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The nested input schema (CrossValidateInput) already provides parameter descriptions (e.g., models, metrics). The description adds high-level advice (like horizon matching the decision, baseline recommendation) but no new parameter-level semantics beyond what the schema offers. Schema coverage is effectively high despite the 0% top-level stat, so the description's incremental value here is moderate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource combination ('Compare models by rolling-origin cross-validation') and clearly distinguishes this tool from siblings like tsf_forecast (single model forecast) and tsf_list_models (model names). It states it replaces guesswork about model choice, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: 'Always include SeasonalNaive as the baseline' and 'Start with statistical models on the real horizon before reaching for anything pretrained.' It also explains that the tool produces evidence for model selection. However, it does not explicitly state when not to use this tool (e.g., for final forecasts) or name alternatives, slightly reducing completeness.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tsf_describe_seriesA
Read-onlyIdempotent

Compute the per-series features that decide which model family to try.

Returns length, mean, sd, coefficient of variation, share of zeros, trend strength (R-squared against time), seasonal strength (variance explained by the period means), and lag-1 autocorrelation of the differenced series.

Read it as evidence, not as an answer: high seasonal_strength argues for SeasonalNaive or AutoETS; a high pct_zero argues for the intermittent-demand models (ADIDA, IMAPA, CrostonClassic); high cv with low structure argues for keeping expectations modest. Cheap -- returns in under a second.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and nondestructive nature. The description adds 'Cheap -- returns in under a second' and 'Read it as evidence, not as an answer,' providing behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with five sentences, front-loaded with purpose, and every sentence adds value. No redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the existence of an output schema (not shown but present), the description covers the semantic meaning of the features and how to interpret them. It also provides cost and time estimates, making it self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already has detailed descriptions for all three parameters (handle, max_series, response_format). The tool description focuses on output features and usage advice, not parameter details. Since schema coverage is high, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a clear verb-resource pair: 'Compute the per-series features that decide which model family to try.' It lists the specific features computed, distinguishing this diagnostic tool from siblings like tsf_forecast or tsf_load_series.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit decision rules: 'high seasonal_strength argues for SeasonalNaive or AutoETS; a high pct_zero argues for the intermittent-demand models...' and positions the tool as 'evidence, not an answer.' This clearly guides when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tsf_detect_anomaliesA
Read-onlyIdempotent

Flag historical points that fall outside a cross-validated prediction interval.

The detector model defines what "expected" means, so pick one that fits the series: a weak detector flags its own errors rather than real anomalies. Run tsf_describe_series or tsf_cross_validate first.

Returns flagged counts per series, a capped list of flagged rows, and the parquet path with the full result.

LONG-RUNNING, and the default is the expensive one: leaving n_windows unset refits the model once per observation across the whole history, which takes minutes even for a statistical model. Pass n_windows (e.g. 12) unless you genuinely need every point tested.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses long-running nature and expensive default (n_windows unset refits per observation, taking minutes). Annotations (readOnlyHint, idempotentHint) are consistent; description adds critical performance context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Compact four paragraphs with clear structure: purpose, prerequisites, output summary, performance warning. No redundant sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given tool complexity (cross-validation, long-running, return includes parquet path and capped list), the description covers prerequisites, output, and performance. Output schema exists, so return values are adequately summarized.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds meaning beyond schema by explaining the default slowness of n_windows and the risk of weak models. Schema already has clear descriptions, but description provides crucial usage context for these parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it flags historical points outside a cross-validated prediction interval, distinguishes from sibling tools (tsf_describe_series, tsf_cross_validate, etc.), and warns about weak detectors.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises running tsf_describe_series or tsf_cross_validate first, warns against weak detectors, and gives concrete guidance on setting n_windows to avoid slow default behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tsf_export_reportA

Render every step of the analysis as a report someone can read.

Covers the input and its hash, the features, each cross-validation with its metric table and ranking, the forecasts, any anomaly runs, and the pinned environment -- in the order they happened. HTML is self-contained, with no external stylesheet or script, so it opens correctly years later.

Call it after tsf_export_run at the end of an analysis. Pass a note: the report headlines it as the rationale, and a table of numbers without the reasoning is what makes a reviewer ask for the whole thing again.

Report from manifest_path instead of handle to re-render an older run -- it needs nothing but the manifest file.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal (all hints false), so the description carries the burden. It discloses that HTML output is 'self-contained, with no external stylesheet or script' and that the report covers steps 'in the order they happened.' However, it does not clarify whether the tool writes a file to disk, returns the report content, or has other side effects. The output schema exists but is not described in the tool description, leaving behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a lead sentence defining the tool, then a list of contents, then usage order, then note advice, then alternative invocation. It is informative without being verbose. Minor inefficiency: 'a table of numbers without the reasoning is what makes a reviewer ask for the whole thing again' is slightly colorful but still earns its place. Could be tighter, but overall effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 optional parameters and an output schema (which handles return value documentation), the description covers its purpose, contents, usage order, and parameter trade-offs. It does not explain what happens if both handle and manifest_path are provided (mutual exclusion handled by schema? not specified). It also assumes the agent knows tsf_export_run was called, which is implied by 'at the end of an analysis.' Overall adequately complete for an AI agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has detailed descriptions for all parameters (note, format, handle, manifest_path), so baseline is 3. The description goes beyond by explaining the semantic purpose of note ('headlines it as the rationale') and the trade-off between handle and manifest_path ('re-renders an older run -- it needs nothing but the manifest file'). This adds actionable context for parameter selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description starts with a specific verb ('Render every step of the analysis as a report') and enumerates the exact contents (input hash, features, cross-validation, forecasts, anomalies, pinned environment). This immediately distinguishes it from sibling tools like tsf_export_run (which exports run data) and tsf_forecast (which only forecasts). The purpose is unambiguous and comprehensive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states ordering: 'Call it after tsf_export_run at the end of an analysis.' Provides clear alternatives: 'Report from manifest_path instead of handle to re-render an older run.' Also advises on best practice for the note parameter: 'a table of numbers without the reasoning is what makes a reviewer ask for the whole thing again.' This gives the agent concrete when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tsf_export_runA

Write a JSON manifest of everything done to this handle.

Records the source path and SHA-256, the frequency, every call with its arguments and artifact paths, the pinned package versions, and your note. This is the artifact of record: your prose in the conversation is lost, this file is not. Write the note -- say which model you picked, what the metric table showed, and what you rejected.

Call it at the end of any analysis someone might have to defend or rerun. Writes a file, so it is not read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and destructiveHint=false. The description adds valuable context: 'Writes a file, so it is not read-only' and lists everything included in the manifest. It also emphasizes that the note is the only place a reasoning trace survives, which is important behavioral insight. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: starts with the core purpose, then enumerates contents, gives usage advice, and closes with a note about file writing. It is not overly long; every sentence contributes. A slight trim could improve conciseness, but it remains clear and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description correctly omits return value details. It covers when to call, what the manifest contains, and the critical role of the note. The only minor gap is no mention of potential side effects (e.g., overwriting existing files), but overall it is sufficiently complete for a tool with good annotations and schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already contains descriptions for both parameters: handle ('Handle whose run log should be pinned to a manifest') and note (detailed explanation of what to write). The tool description adds further guidance for the note, specifically: 'Write the note -- say which model you picked, what the metric table showed, and what you rejected.' This enhances the schema's descriptions, making it clear how to use the note parameter effectively.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence 'Write a JSON manifest of everything done to this handle' clearly states the verb (write a manifest) and the resource (handle). The description further details what the manifest includes (source path, SHA-256, calls, arguments, artifact paths, pinned package versions, note), differentiating it from sibling tools like 'tsf_export_report' or 'tsf_describe_series'. This makes the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to call it: 'Call it at the end of any analysis someone might have to defend or rerun.' This provides clear context for use. It does not explicitly state when not to use it or name alternatives, but for a specialized export tool the guidance is sufficient and well-placed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tsf_forecastA
Read-onlyIdempotent

Fit on the full history and forecast h periods ahead with intervals.

Use after tsf_cross_validate has justified the model choice. The full forecast goes to parquet; the response carries the path, the column list, the row count and a small preview. Read the parquet for anything more -- raising max_preview_rows to dump the frame into the conversation is the one thing that reliably ruins a long session.

LONG-RUNNING for foundation models.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the bar is lowered. The description adds valuable context: the full forecast goes to parquet, the response carries path/column list/row count/preview, warns against raising max_preview_rows, and flags 'LONG-RUNNING for foundation models' — all beyond what annotations provide. No contradictions with annotations (readOnlyHint=true is consistent with generating forecasts without mutating data).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise: a terse three-sentence explanation that front-loads the core action, then adds usage guidance and behavioral warnings. Every sentence adds essential information without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (forecasting with multiple models and intervals), the output schema exists, so return values don't need elaboration. The description covers the critical workflow (use after cross-validation), output format (parquet with preview), and a key gotcha (don't dump full frame). It lacks explicit error conditions or prerequisite checks, but for the scope, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the schema provides no parameter descriptions — so the description must compensate. Although the main description does not detail parameters, the parameter `max_preview_rows` receives meaningful context: 'Rows of the forecast to inline... read that instead of raising this.' Other parameters (handle, models, h, level) have descriptions in the schema via the JSON Schema, but since coverage is 0% (likely meaning no separate param list in the description), the main text does not clarify their meaning beyond what the schema already provides. Baseline 3 is appropriate as the description adds some context for max_preview_rows but not for others.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool fits on full history and forecasts h periods ahead with intervals. It uses specific verbs like 'fit' and 'forecast' and explicitly identifies the resource as the time series forecast. However, it does not directly differentiate from siblings like tsf_cross_validate, though the usage guideline addresses that.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use after tsf_cross_validate has justified the model choice,' providing clear sequencing context and an alternative (cross-validation). It does not mention when not to use it or list specific alternatives for other tasks like anomaly detection, but the primary usage guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tsf_list_modelsA
Read-onlyIdempotent

Probe which models actually import in this environment.

Call this before cross-validating so you never propose a model that cannot run here. Returns {available, statistical, foundation, unavailable}, where each unavailable entry carries the real reason -- some models are gated on the Python version, not merely absent.

The first call imports TimeCopilot and can take ~30 seconds; later calls are instant.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as readOnly, idempotent, and non-destructive. The description adds important behavioral details beyond that: the first call may take ~30 seconds to import TimeCopilot, later calls are instant; it returns structured output with real reasons for unavailability (including Python version gating). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and structured: first sentence states purpose, second gives usage guidance, third explains return structure, and fourth notes startup latency. Every sentence adds essential information, with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists (the agent can rely on structured return type details), the description covers all necessary context: what the tool does, when to use it, its runtime behavior (latency), and the high-level shape of results. No gaps remain for a list/probe tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema contains descriptions for both parameters (family and include_unavailable) that are self-explanatory. The tool description does not add new parameter information—it only repeats that statistical models are cheap and always installed, which already appears in the schema. Schema coverage via inline descriptions is present, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Probe which models actually import in this environment' and specifies the tool's role in preventing proposal of non-running models. It clearly distinguishes itself from siblings like cross_validate by giving a precise pre-check use case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description contains an explicit directive: 'Call this before cross-validating so you never propose a model that cannot run here.' It also notes that statistical models are always installed, which helps with decision-making. No alternatives are listed, but the use case is crystal clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tsf_load_seriesA
Read-onlyIdempotent

Read a CSV or Parquet panel from disk and register it under a handle.

Call this first; every other tool takes the handle it returns. The file must be in Nixtla long format (unique_id, ds, y). Returns a compact JSON summary -- series count, inferred frequency, date range, missing values, and the SHA-256 of the source -- and nothing else: the data stays in the server so it never consumes your context.

Read the summary before choosing a horizon. If obs_per_series.min is small, a long horizon or many CV windows will not fit.

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnly, idempotent, non-destructive), the description reveals that data stays server-side ('never consumes your context') and that the return is a compact summary with specific fields. It also hints at the side effect of reusing a handle (replacing the panel). No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, each serving a distinct purpose: purpose, ordering, format, return details, caution. Front-loaded with the core action. No superfluous words; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's role as the entry point for a time series workflow, the description covers purpose, required file format, return value (with summary contents), and a concrete usage caution. With an output schema present, the lack of detailed return structure is acceptable. The description is complete enough for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides detailed descriptions for all three parameters. The tool description adds the critical constraint that the file must be in 'Nixtla long format (unique_id, ds, y)', which is not in the schema. This adds meaningful value beyond the schema, justifying a score above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action: 'Read a CSV or Parquet panel from disk and register it under a handle.' It distinguishes from sibling tools by explicitly saying 'Call this first; every other tool takes the handle it returns.' This makes the purpose unambiguous and contextually positioned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit ordering ('Call this first'), explains the handle's role in subsequent tools, and gives a practical caution about horizon choices based on the summary output. This equips the agent with clear when-to-use and how-to-use guidance.

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.

  1. 8 tool updatesv0.1.0
    • First observedtsf_cross_validate
    • First observedtsf_describe_series
    • First observedtsf_detect_anomalies
    • First observedtsf_export_report
    • First observedtsf_export_run
    • First observedtsf_forecast
    • First observedtsf_list_models
    • First observedtsf_load_series

TDQS

A4.6/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a distinct and well-defined purpose within the time series forecasting workflow: loading, describing, listing models, cross-validating, forecasting, detecting anomalies, and exporting results. There is no overlap or ambiguity between tools.

Naming Consistency5/5

All tools follow a consistent pattern: the prefix 'tsf_' followed by a verb (and optional noun), all in snake_case. Examples include tsf_load_series, tsf_describe_series, tsf_cross_validate, and tsf_export_report. The naming is predictable and uniform.

Tool Count5/5

With 8 tools, the server covers a complete analysis pipeline without excess. Each tool is necessary and corresponds to a clear step in the workflow, from data loading to report generation. The count is well-scoped for the domain.

Completeness5/5

The tool surface covers the full lifecycle of a typical time series analysis: load data, explore features, check available models, cross-validate, forecast, detect anomalies, and export manifests/reports. There are no obvious gaps; the workflow feels self-contained and actionable.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server powered by Meta's Prophet that enables LLMs to perform time-series forecasting, trend analysis, and predictive modeling on historical data. It provides LLM-friendly statistical summaries, automated business-rule validation, and ready-to-render Chart.js visualizations.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Deterministic time-series statistics for AI agents. This MCP server gives any LLM agent unit-tested statistical tools — anomaly detection, changepoint detection, seasonal decomposition, stationarity/trend tests, data-quality audits, baseline forecasts — with schema-validated structured output and no arbitrary code execution.
    17
    MIT