SportIQ
SportIQ is a read-only sports-analyst MCP server that gives AI assistants 46 tools for FIFA World Cup 2026 football, Formula 1, and IPL cricket — combining raw data retrieval with modelling/simulation.
Football (WC 2026): fetch groups, fixtures, standings, squads, match stats, top scorers, and odds; list paged results.
Football intelligence: xG model, match predictor, group/bracket Monte Carlo simulations, knockout-path probabilities, form trends, and what-if replays.
Betting analysis (football): detect value bets by de-vigging market odds against model probabilities, and build accumulators from top edges.
F1 data: sessions, drivers, lap times, standings, race results, and weather, with paging.
F1 intelligence: tyre-degradation modelling, undercut-window viability, pace comparisons, qualifying analysis, weather-strategy impact, and optimal pit-strategy prediction.
Cricket (IPL) data: live matches, scorecards, points tables, schedules, squads, and live odds.
Cricket intelligence: Dream11 XI solver (captain/VC, credit caps), captain recommendations, differential picks, player form index, pitch reports, head-to-head, and player matchups.
Cross-sport: build accumulators spanning football and cricket.
Health/ops: check cache backend, per-adapter health, and API quota status via
sportiq_health.Output metadata: every response flags staleness/data age, source adapter, and estimated-model status.
Integrates with FIFA World Cup 2026 data to provide tools for group stage analysis, knockout bracket simulation, match predictions, and tournament statistics.
Integrates with RapidAPI Hub to access external sports data APIs, including Sportspage Feeds, Football Prediction, and Live Sports Odds, for enriched data sources.
sportiq-mcp
MCP server that turns any AI assistant into a sports analyst across FIFA World Cup 2026 football, Formula 1, and IPL cricket — 46 AI-callable tools.

SportIQ running live in Claude — Monte Carlo World Cup bracket, F1 pit strategy, and Dream11 optimisation, each a visible MCP tool call. (1-min demo)
Every tool is free to use — the three flagships and everything in the INTEL columns below have no SportIQ paywall or account requirement. Live/provider-backed data still depends on the keys and quota available to the host or local operator. If SportIQ is useful to you, sponsor the project to support ongoing development.
What's new in v0.4.0
Two new tools (46 total):
f1_simulate_championship: a title-race Monte Carlo with exact elimination maths.football_what_if: replays World Cup 2026 from any stage, optionally flipping one real knockout result.
Completed-tournament mode: World Cup tools now answer from the real 2026 results (Spain won the final 1–0 after extra time) instead of re-simulating.
7 MCP resources: static reference data (the WC draw, team codes, F1 circuits, IPL venues and teams, the Dream11 scoring profile) plus the instructions.
Accuracy fixes:
Official Dream11 T20 scoring and IPL squads generated from Cricsheet.
An F1 pit model that sums the whole remaining race, legal compound sequences and the regulation race distance.
Positive-EV value bets only.
Extra-time and penalty results kept, team-name and venue resolution, and many more.
Reliability:
A fix for a cache bug that wiped the cache about once a minute.
No more per-request teardown errors.
A
/healthzliveness route.A 30 s per-tool deadline (
TOOL_DEADLINE_SECONDS) and a 15 s budget per data chain.API keys no longer appear in logs.
Upgrade:
uvx sportiq-mcp@latestpicks up 0.4.0. The hosted connector URL stays the same.
Related MCP server: oraclaw-mcp-server
What it does
Raw-data tools are table stakes; the intelligence layer is the product. Three flagships:
football_simulate_bracket— Monte Carlo with Poisson xG over the 48-team WC 2026 format → per-team round + title probabilities.f1_predict_pit_strategy— tyre-degradation model on OpenF1 telemetry → optimal stop laps + compound sequence.cricket_build_dream11_team— PuLP constraint solver → a valid fantasy XI under credit/role/team caps.
Tools (46 total)
Sport | RAW data | INTEL |
Football (WC 2026) | groups, fixtures, standings, squad, match stats, top scorers, odds | xg_model, match_predictor, simulate_group, simulate_bracket, knockout_path, form_trends, find_value_bets, build_accumulator, what_if |
F1 | sessions, drivers, lap_times, standings, race_results, weather | tyre_degradation, undercut_window, head_to_head_pace, weather_strategy_impact, qualifying_analysis, race_pace_compare, predict_pit_strategy, simulate_championship |
Cricket (IPL) | live_matches, scorecard, points_table, schedule, squad, live_odds | build_dream11_team, captain_recommendation, differential_picks, player_form_index, pitch_report, head_to_head, player_matchup, find_value_bets |
Cross-sport | — | build_accumulator |
Plus sportiq_health (included in the 46; cache backend + per-adapter status and remaining API quota).
MCP resources (static JSON, readable without a tool call): sportiq://instructions, sportiq://football/wc2026/draw, sportiq://football/team-codes, sportiq://f1/circuits, sportiq://cricket/venues, sportiq://cricket/teams, sportiq://cricket/scoring-profile.
Data sources (per chain, with keyless fallbacks): football → API-Football → football-data.org → openfootball (keyless) → bundled wc2026.json; standings fall back to a table derived from fixture results. F1 → OpenF1 → Jolpica → fastf1. Cricket → CricAPI → RapidAPI Cricbuzz (paid fallback) + static seeds (NDTV/Cricbuzz scrapers opt-in). Odds (football + cricket) → The Odds API.
Where it works
Anywhere that speaks MCP — Claude (Desktop + web), ChatGPT, Cursor, and any MCP client. Two ways to run it:
Hosted (no install): add a custom connector — works in claude.ai web & ChatGPT.
Local (
uvx/Desktop config/IDEs): install from PyPI.
How it works
Hosted — no install
A public instance runs on the home server behind Cloudflare. Add this as a custom connector with No authentication:
https://sportiq.utkarshgupta.org/mcpHosting history (GCP Cloud Run → home server): docs/wiki/findings/product-hosting-arc.md. Old *.run.app connector URLs are gone.
claude.ai (web): Settings → Connectors → Add custom connector → paste URL → Save.
ChatGPT: Settings → Apps & Connectors → enable Developer mode → Create app (MCP) → paste URL → No authentication → Connect.
All 46 tools register on the plain URL. Whether a live/provider-backed call can return current data depends on the credentials, quota, and fallbacks available to the hosted operator; the repository does not claim the public instance's current key inventory.
Mode | What is available |
Hosted | All tools register; live/provider-backed results depend on the host's current keys, quota, and fallbacks. |
Local, keyless | All tools register; bundled seeds and keyless sources work where supported, while credential-only live sources are skipped. |
Local, BYO keys | The same tools can use the configured providers for fresher/live data, subject to provider quota. |
The hosted HTTP boundary rejects request bodies over 1 MiB, limits traffic to 60 requests per client and 300 total requests per minute, and permits at most two concurrent expensive model/solver calls. These counters are per process, so the home-server Compose stack runs one replica (always-on idle; no scale-to-zero).
Local install
uvx sportiq-mcp # from PyPI
# or from source:
git clone https://github.com/Ninjabeam20/SportIQ-MCP && cd SportIQ-MCP
uv sync --extra dev && uv run python -m sportiq.server # --extra dev = pytest/ruff for contributorsClaude Desktop config:
{
"mcpServers": {
"sportiq": {
"command": "uvx",
"args": ["sportiq-mcp"],
"env": {
"CRICAPI_KEY": "your_cricapi_key",
"APIFOOTBALL_KEY": "your_apifootball_key",
"THEODDS_KEY": "your_theodds_key"
}
}
}
}The server boots and registers every tool without keys. Seed/keyless fallbacks and the intelligence layer work where their required inputs are available; provider keys add fresher/live sources and quota rather than unlocking a separate paid tool tier.
Var | Unlocks | Free tier |
| Live football fixtures / standings / squads / scorers | 100 req/day |
| Market odds (football + cricket probability tools) | 500 req/month |
| football-data.org fallback — required for World Cup endpoints (they return 403 without it) | 10 req/min, 100/day |
| Live cricket scores / scorecards / schedules / squads | 100 req/day |
| Paid Cricbuzz fallback (player career stats) | plan-dependent |
| Opt-in cricket scrapers (off by default — ToS) | — |
| Shared cache backend (defaults to local diskcache) | — |
|
| — |
| Per-tool deadline (default 30); a slower call returns | — |
macOS arm64: the Dream11 solver needs CBC —
brew install cbc(the binary bundled with PuLP is x86-only).
Self-host
Set SPORTIQ_TRANSPORT=http and the server serves the MCP endpoint at /mcp (binds 0.0.0.0:$PORT). GET /healthz returns 200 ok for liveness only (it never touches the cache, chains or network). A ready-to-build Dockerfile and home-server docker-compose.yml are included. cloud.md is the old Cloud Run runbook (historical). With your own keys set, the live-score and odds tools come online too.
Support SportIQ
Every tool is free and open source — the raw-data tools, sportiq_health, and the full intelligence layer (the three flagships + everything in the INTEL columns). SportIQ has no paid feature gate; provider-backed data can still require operator credentials and quota.
If SportIQ saves you time, sponsor the project at github.com/sponsors/Ninjabeam20 to help fund hosting and ongoing development. It's a voluntary donation — you get the same fully-unlocked server either way.
Is it safe?
Open source, MIT licensed, published on PyPI with signed build attestations — read the code before you connect it.
Read-only. Tools only fetch and analyse public sports data — no write, delete, payment, email, or file-system tools.
Limited operational telemetry. HTTP mode logs client software name/version, User-Agent, tool name, outcome, latency, selected source, and staleness. The public host (Dell) can persist
tool_call/mcp_requestlines to a local JSONL volume. Local stdio emits local logs but sends no telemetry to a SportIQ-hosted service.Hosted abuse controls. HTTP POST bodies are capped at 1 MiB; requests are limited to 60/client/minute and 300/process/minute; the seven expensive simulation/strategy/solver tools share a concurrency limit of two; every tool call has a 30 s deadline (
TOOL_DEADLINE_SECONDS) and each fallback chain a 15 s total budget.Credential-aware. A hosted operator may configure provider credentials; the repository does not claim the public instance's current key inventory. Keys are redacted from application logs and envelopes.
Historical automated AI code-review results are documented in
SECURITY.md; they are not a current third-party certification.
Every response carries a meta.is_stale flag + data age, so the AI tells you how fresh each answer is. Cricket live scores refresh ~30s, F1 completed-session laps/stints ~24h, standings ~10min, football fixtures ~6h (the WC 2026 is over).
Develop
uv sync --extra dev --extra analytics # always both extras: dev = pytest/ruff, analytics = the dashboard's GCP libs
uv run pytest
uv run ruff check .
npx @modelcontextprotocol/inspector uv run python -m sportiq.serverAnalytics dashboard (read-only local usage view — Dell JSONL / archived GCP / PyPI / GitHub). Same setup as above, then just run it:
uv run python scripts/dashboard.py # writes dashboard.html and opens it; GITHUB_TOKEN optional (Sponsors panel)Note: the dashboard's HTML template (
scripts/dashboard_template.html) is currently local-only maintainer tooling, so a fresh clone can't render it yet.
Repository layout: src/ is the MCP server (published to PyPI, hosted on the Dell at https://sportiq.utkarshgupta.org/mcp); website/ is the Next.js marketing site deployed to Vercel. The two ship independently — website/ is excluded from the Python package and the backend container.
See CLAUDE.md for collaboration rules and docs/index.md for the wiki entry point.
Data sources & credits
SportIQ derives some model constants offline from open datasets. Raw datasets are never shipped or fetched at runtime — only small derived seeds (circuits.json, venues.json, elo_seed.json) are committed.
F1DB (CC BY 4.0) — per-circuit stop counts + lap lengths; pit loss measured offline from OpenF1 laps.
Cricsheet — ball-by-ball IPL data → derived venue scoring priors (
venues.json).martj42 international football results (CC0) — Elo backtesting.
OpenF1 — F1 timing data (runtime source). Historical sessions are keyless; live-session telemetry needs paid auth, which SportIQ does not wire.
football-data.org — free football data (runtime source).
License & author
Created and maintained by Utkarsh Gupta (@Ninjabeam20). Licensed under the MIT License — © 2026 Utkarsh Gupta. Canonical package: sportiq-mcp on PyPI / io.github.Ninjabeam20/sportiq-mcp in the official MCP registry.
Available Tools
46 toolscricket_build_dream11_teamARead-onlyIdempotentInspect
Recommend an optimal fantasy XI + captain + vice-captain for one fixture.
Args:
match_id: CricAPI match identifier; resolves team_a/team_b/venue automatically.
team_a: First team code/name (e.g. MI). Required if match_id is absent.
team_b: Second team code/name (e.g. CSK). Required if match_id is absent.
venue: Venue key/name (e.g. wankhede). Required if match_id is absent.
strategy: "balanced" only in Phase 2; future variants reserved.
Returns: data.players: 11 picked players with name/role/credits/team/projected_points. data.captain: name of the chosen captain. data.vice_captain: name of the chosen VC. data.total_credits: sum of credits used (<= 100). data.total_projected_points: fantasy points including C x2 and VC x1.5 boosts. meta.estimated: true — projections are model output, not a fantasy oracle. meta.form_source: "default_neutral" (role-based projections; see meta.note). meta.scoring_profile: the Dream11 T20 points profile id. meta.excluded_missing_credits: players dropped for having no contest credits.
Example: cricket_build_dream11_team(team_a="MI", team_b="CSK", venue="wankhede") cricket_build_dream11_team(match_id="abc123")
| Name | Required | Description | Default |
|---|---|---|---|
| venue | No | Venue key/name (e.g. ``wankhede``). Required if match_id is absent. | |
| team_a | No | First team code/name (e.g. ``MI``). Required if match_id is absent. | |
| team_b | No | Second team code/name (e.g. ``CSK``). Required if match_id is absent. | |
| match_id | No | CricAPI match identifier; resolves team_a/team_b/venue automatically. | |
| strategy | No | ``"balanced"`` only in Phase 2; future variants reserved. | balanced |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive, open-world operation. The description adds useful behavioral context: projections are model estimates rather than guarantees, default form source is neutral, the scoring profile is identified, and players lacking contest credits are excluded.
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?
The description is front-loaded and well organized, but it includes an Args section that duplicates the fully covered input schema and a Returns section despite an existing output schema. The example is helpful, but parts of the text do not add much beyond structured fields.
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 definition is complete for an agent to call it correctly: it explains the match_id-versus-explicit-fixture input paths, summarizes the return payload, notes model-estimate caveats, and provides examples. Given the rich schema and annotations, no important calling context 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%, so all five parameters are already documented in the schema. The description repeats the same parameter meanings but does not add substantially new interpretation beyond the schema, so 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 states a specific verb and resource: recommend an optimal fantasy XI plus captain and vice-captain for one fixture. This is specific enough to distinguish it from siblings like cricket_captain_recommendation and cricket_differential_picks, which cover narrower selection tasks.
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?
The description gives the required input combinations, notably that match_id resolves teams and venue automatically while team_a/team_b/venue are needed if match_id is absent. However, it does not explicitly say when to use this tool instead of sibling tools such as cricket_captain_recommendation or cricket_differential_picks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_captain_recommendationARead-onlyIdempotentInspect
Return the top-3 captain candidates ranked by projected points.
IPL venues only (pitch seed is IPL grounds). Test/international matches and unknown venues fail rather than inventing a ranking. Same-role players often tie: projections use default form 55 and default opposition 0.5, not per-player history.
Args:
match_id: CricAPI match identifier; resolves team_a/team_b/venue automatically.
team_a: First team code/name. Required if match_id is absent.
team_b: Second team code/name. Required if match_id is absent.
venue: Venue key/name (IPL ground, e.g. wankhede). Required if match_id is absent.
Returns: data.candidates: list of 3 dicts with name/role/team/projected_points. meta.source: model:captain_score. meta.estimated: true. meta.form_source: "default_neutral".
| Name | Required | Description | Default |
|---|---|---|---|
| venue | No | Venue key/name (IPL ground, e.g. ``wankhede``). Required if match_id is absent. | |
| team_a | No | First team code/name. Required if match_id is absent. | |
| team_b | No | Second team code/name. Required if match_id is absent. | |
| match_id | No | CricAPI match identifier; resolves team_a/team_b/venue automatically. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, the description discloses important behavior: only three candidates are returned, non-IPL venues fail instead of fabricating results, ties are common, and projections use default form 55 and opposition 0.5 rather than per-player history.
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?
The description is front-loaded with the core purpose, then constraints, args, and returns. The Args section largely duplicates schema information, but the overall structure is efficient and readable.
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?
For a read-only recommendation tool with an output schema, the description covers output shape, fallback behavior, venue limitations, tie caveats, and metadata sources. Nothing critical for correct invocation 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%, so the schema already documents each parameter. The description largely repeats those parameter semantics, though it usefully reiterates that match_id resolves team_a/team_b/venue automatically.
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 and output: return the top-3 captain candidates ranked by projected points. The IPL-only scope and failure behavior make it distinguishable from broader team-building or pick 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 clearly states when the tool applies (IPL venues) and when it does not (Test/international matches and unknown venues fail rather than inventing a ranking). It does not explicitly compare against sibling tools such as cricket_differential_picks or cricket_build_dream11_team.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_differential_picksARead-onlyIdempotentInspect
Suggest low-ownership picks with positive projected upside.
Ownership is estimated — proxied by credit weight (lower-credit players
tend to have lower ownership), not real ownership data. Flagged
estimated: true in the response.
Args: match_id: CricAPI match identifier; resolves team_a/team_b/venue automatically. team_a: First team code/name. Required if match_id is absent. team_b: Second team code/name. Required if match_id is absent. venue: Venue key/name. Required if match_id is absent. ownership_threshold: percent ownership cap; affects estimated label.
Returns: data.picks: list of {name, role, team, credits, projected_points, estimated_ownership_pct, ownership_pct_estimated}. meta.source: model:captain_score (filtered). meta.estimated: true. meta.ownership_source: "heuristic_from_credits". meta.form_source: "default_neutral".
| Name | Required | Description | Default |
|---|---|---|---|
| venue | No | Venue key/name. Required if match_id is absent. | |
| team_a | No | First team code/name. Required if match_id is absent. | |
| team_b | No | Second team code/name. Required if match_id is absent. | |
| match_id | No | CricAPI match identifier; resolves team_a/team_b/venue automatically. | |
| ownership_threshold | No | percent ownership cap; affects estimated label. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, so the description focuses its effort on genuinely additive disclosure: that ownership is a heuristic proxy from credit weight, that responses are flagged estimated: true, and that form data is default_neutral. That is exactly the caveat an agent needs before trusting the output.
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?
The purpose and estimation caveat are front-loaded in the first two sentences, which is the right ordering. The Returns block restates information already available in the output schema, so it is slightly redundant but still scannable.
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?
For a read-only analytical tool with full schema coverage and a populated output schema, the definition supplies the key provenance caveats an agent needs. It could be stronger only by explicitly routing to or away from its closest siblings.
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 description largely repeats the schema text for match_id/team_a/team_b/venue. The only added nuance is that match_id auto-resolves the other fields and that ownership_threshold is a percent cap affecting the estimated label — helpful but marginal.
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 combination: suggesting low-ownership picks with positive projected upside. 'Low-ownership' and 'projected upside' clearly differentiate it from sibling tools like cricket_captain_recommendation and cricket_build_dream11_team, though those siblings are never named.
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 by the stated goal (differential/low-owned picks), but there is no explicit guidance on when to prefer this over cricket_find_value_bets or cricket_captain_recommendation, nor any stated prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_find_value_betsARead-onlyIdempotentInspect
Compare model probabilities against market-implied IPL odds. Requires THEODDS_KEY.
NOTE: cricket has no calibrated team-strength model wired yet (unlike the
football Elo/Poisson path), so this tool currently returns an EMPTY
value_bets list — scoring an edge against a neutral 50/50 prior would flag
every market underdog, which would be misleading. It
still reports how many events were screened so callers know odds were
available. For raw de-vigged prices use cricket_get_live_odds. Real edge
detection lands when a cricket win model is wired (see cricket_head_to_head);
it will flag outcomes where the model beats the de-vigged market by
min_edge and the offered price has positive expected value.
Args: team: Optional team name to filter events (case-insensitive substring). Omit to scan every IPL odds event. min_edge: Minimum edge (model_prob - devigged_market_prob), 0..1. Default 0.05. Currently informational only (no bets emitted).
Returns:
data.value_bets: always [] until a cricket model is wired.
data.events_analysed: count of not-yet-started events screened (both teams present).
data.model: "neutral_baseline". data.note: why no bets are emitted.
meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Optional team name to filter events (case-insensitive substring). Omit to scan every IPL odds event. | |
| min_edge | No | Minimum edge (model_prob - devigged_market_prob), 0..1. Default 0.05. Currently informational only (no bets emitted). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the read-only annotations by disclosing the THEODDS_KEY requirement, the current empty value_bets behavior, the neutral_baseline model, and the estimated flag. This prevents an agent from misinterpreting an empty result as a bug or as evidence of no value bets.
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?
The description is long but mostly justified because the empty-result caveat is essential. The Returns section overlaps with the output schema and could be tighter, but the front-loaded purpose and limitation make the overall structure effective.
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 tool's unusual current behavior, the description provides the missing context an agent needs: why results are empty, what is still returned, and when real edge detection will be available. Together with the existing output schema, nothing important is omitted.
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%, so the schema already documents team and min_edge thoroughly. The description adds useful context that min_edge is currently informational only and that omitting team scans every IPL odds event, which is slightly beyond the schema text.
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 action: comparing model probabilities against market-implied IPL odds. It clearly distinguishes itself from cricket_get_live_odds by noting that raw de-vigged prices belong to that sibling, and it explicitly explains the current neutral-baseline limitation.
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 tells the caller exactly when to use the alternative: use cricket_get_live_odds for raw de-vigged prices. It also explains the current limitation of this tool and what it still returns, so an agent can decide whether to call it at all rather than inferring from a misleading name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_get_live_matchesARead-onlyIdempotentInspect
Return all currently live cricket matches across all series.
Returns: data.matches: list of live match objects (team names, score, status). meta.source: which adapter served the response. meta.is_stale: true if data is from stale cache.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior, so the description does not need to repeat those. It adds useful behavioral context by documenting meta.source (adapter provenance) and meta.is_stale (stale cache indication), which are not visible from annotations or schema alone.
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?
The description is compact and front-loaded with the primary purpose. The Returns section is clearly structured and provides just enough detail about the response shape without unnecessary fluff. Every sentence 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?
For a zero-parameter, read-only live-matches listing tool, this description is complete. It explains what data is returned (matches array with teams, score, status) and includes metadata fields that could affect interpretation (source, staleness). The annotations cover safety semantics, and the output schema is available, so no further detail is needed.
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?
The tool has zero parameters, and the schema coverage is 100%, so there is no parameter ambiguity. The description correctly notes that it returns live matches 'across all series', implying no filtering is needed. A baseline of 4 is appropriate for a no-parameter tool.
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 and resource: 'Return all currently live cricket matches across all series.' It clearly distinguishes this from sibling tools like schedule, scorecard, and points table by focusing on live matches. The scope is unambiguous.
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?
The intended use is implied by the phrase 'currently live cricket matches' — an agent would know to call this when live match data is needed. However, there is no explicit guidance about when not to use it or which sibling tool would be a better alternative for scheduled, completed, or match-detail queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_get_live_oddsARead-onlyIdempotentInspect
Return live market head-to-head odds for upcoming/live IPL matches.
IPL only (~March-May). An empty events list outside that window is a
successful empty market, not an outage. Not international/Test/other T20
leagues. For World Cup 2026 football odds use football_get_odds.
Sourced from The Odds API (requires THEODDS_KEY). Without a key the call returns a clean ALL_SOURCES_FAILED envelope rather than crashing.
Args: team: Optional team name to filter events (case-insensitive substring, matched against both sides). Omit to return every IPL event. The Odds API uses its own opaque event ids, so a CricAPI match_id cannot be resolved to an event yet — filtering is by team name.
Returns: data.events: list of {event_id, home, away, commence_time, bookmakers: [{name, home, away}]} with decimal h2h prices per bookmaker. Empty when no IPL events are listed (typical off-season). meta.source: adapter that served the data (theodds / cache:stale).
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Optional team name to filter events (case-insensitive substring, matched against both sides). Omit to return every IPL event. The Odds API uses its own opaque event ids, so a CricAPI match_id cannot be resolved to an event yet — filtering is by team name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, open-world, idempotent, and non-destructive behavior. The description adds valuable extras: the dependency on THEODDS_KEY, the clean ALL_SOURCES_FAILED envelope without a key, the source adapter in meta, and the seasonality of empty results. No contradiction 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear lead, contextual usage notes, argument semantics, and return format. Each sentence serves a distinct purpose—seasonality, alternative routing, error behavior, API key requirement—without redundant 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?
For a single-parameter read-only tool, the description covers source dependency, failure behavior, seasonal empty states, event-id limitations, and the output shape. The output schema exists, but the explicit Returns section still usefully documents the nested event and bookmaker structure. Nothing needed to call it correctly 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?
The single team parameter has 100% schema coverage, and the description's Args section mostly restates the schema's description. It adds minor operational context ('Omit to return every IPL event' and the CricAPI match_id limitation), but does not materially go beyond the schema.
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 opens with a specific verb and resource: 'Return live market head-to-head odds for upcoming/live IPL matches.' It clearly distinguishes this tool from the football_get_odds sibling and from non-IPL cricket coverage, so an agent can identify its exact scope without inspecting 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?
The description explicitly scopes the tool to IPL only, names an alternative ('For World Cup 2026 football odds use football_get_odds'), and explains that empty results are expected off-season rather than a failure. This gives clear 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.
cricket_get_pitch_reportARead-onlyIdempotentInspect
Summarise pitch characteristics for a venue.
Args:
venue: Venue key (e.g. wankhede), official name, or city.
Returns: data: {batting_friendly 0..1, expected_first_inn, recommendation, venue, pitch_type}. meta.source: which adapter served the venue record.
| Name | Required | Description | Default |
|---|---|---|---|
| venue | Yes | Venue key (e.g. ``wankhede``), official name, or city. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral detail about the return shape: batting_friendly score scale 0..1, expected_first_inn, recommendation, venue, pitch_type, and meta.source. This goes beyond the annotations without contradicting them.
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?
The description is compact and well-structured with a one-sentence summary followed by clear Args and Returns sections. Every line earns its place, and the most important information is front-loaded. There is no unnecessary prose.
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?
For a simple single-parameter read-only reporting tool, the description is complete: it explains the input, the output fields, and the meaning of score ranges. The output schema presence plus the documented return structure leaves little ambiguity for an agent selecting or invoking this tool. No critical information 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 single parameter 'venue' is described identically in both the schema and tool description. The description adds no meaning beyond what the schema already provides, such as disambiguation rules or formatting constraints. Baseline 3 is appropriate given the high schema coverage.
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 ('Summarise') and resource ('pitch characteristics for a venue'), making the tool's function immediately clear. It is clearly distinct from sibling cricket tools like scores, squads, or odds. The one-line summary is not a tautology and accurately names the domain.
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?
The description implies the tool should be used when pitch-related context for a venue is needed, and the venue parameter guidance is helpful. However, it does not explicitly state when to prefer this tool over alternatives or mention any exclusions or sibling tools. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_get_points_tableARead-onlyIdempotentInspect
Return the points table / standings for a cricket series.
Args: series_id: The series identifier (e.g. IPL 2026 series ID from CricAPI).
Returns: data: points table rows with team, P, W, L, NRR, Points. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| series_id | Yes | The series identifier (e.g. IPL 2026 series ID from CricAPI). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate read-only, idempotent, non-destructive behavior. The description adds value by describing the return contract: rows with team, P, W, L, NRR, Points, and meta.source indicating which adapter served the data. This goes beyond the annotation-only picture without contradicting it.
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?
The core statement is concise and front-loaded, and the Returns section adds useful behavioral detail. The Args section is somewhat redundant with the schema, but the overall length and structure remain clean and scannable.
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?
For a one-parameter, read-only tool with full schema coverage and an output schema, the description is complete enough. It explains what data the caller receives and which adapter produced it. Nothing essential for selecting and invoking the tool correctly 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 description's Args section merely restates the schema's series_id description. It adds no additional parameter-level insight beyond what the schema already provides, so it meets the baseline but does not exceed it.
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 opens with 'Return the points table / standings for a cricket series,' which states a specific verb and resource. It also distinguishes itself from sibling standings tools like football_get_standings and f1_get_standings by specifying 'cricket' and 'series.'
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?
The description clearly establishes when to use it: when a cricket series points table is needed, with a series_id provided. It does not explicitly discuss exclusions or alternatives, but among the cricket sibling tools there is no overlapping standings tool, so the practical ambiguity is low.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_get_scheduleARead-onlyIdempotentInspect
Return the upcoming match schedule, optionally filtered by series.
Args: series_id: Optional. Filter to a specific series. If omitted, returns all upcoming fixtures across all active series. limit: Max matches to return, 1..200 (default 50). offset: Number of matches to skip for paging (default 0).
Returns:
data.matches: page of matches dated today (UTC) or later, with teams,
date, venue; filtered to series_id when the source labels series.
data.pagination: {total, count, offset, limit, has_more, next_offset}.
meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max matches to return, 1..200 (default 50). | |
| offset | No | Number of matches to skip for paging (default 0). | |
| series_id | No | Optional. Filter to a specific series. If omitted, returns all upcoming fixtures across all active series. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the date boundary is UTC-based and inclusive of today, and series filtering only applies 'when the source labels series', which warns of imperfect filtering. It doesn't mention rate limits or data freshness, keeping it below 5.
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?
Front-loaded purpose sentence is good, but the Args section duplicates the input schema word-for-word and contributes nothing, while the Returns section restates an output schema that already exists. Roughly half the text fails to earn 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, so re-explaining return fields is redundant but harmless; the description's real contributions—UTC/today-inclusive boundary and the source-labeling caveat for series filters—fill gaps the schema can't express. Nothing critical is missing for a read-only list tool.
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 Args block repeats the schema's parameter text almost verbatim (limit 1..200, offset paging, optional series_id), adding no new semantics. Baseline 3 is appropriate for a fully documented schema with no compensating detail.
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 ('Return the upcoming match schedule') plus its optional filter, which separates it from cricket_get_live_matches (in-progress) among the siblings. It stops short of naming those siblings explicitly, so the differentiation is inferable rather than stated.
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?
The description clarifies the consequence of omitting series_id ('returns all upcoming fixtures across all active series') and the 'today (UTC) or later' window, which implies when the tool applies. However, it never tells the agent when to prefer it over cricket_get_live_matches or football_get_fixtures, and gives no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_get_scorecardARead-onlyIdempotentInspect
Return the full scorecard for a specific match.
Args: match_id: The match identifier (e.g. from cricket_get_live_matches).
Returns: data: full scorecard with innings, partnerships, bowling figures. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | The match identifier (e.g. from cricket_get_live_matches). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, lowering the burden. The description adds useful context about the scope of 'full scorecard' and the meta.source adapter field, but does not go deeper into data freshness or error behavior. This is on par with the calibrated baseline for annotation-carrying tools.
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?
The description is concise and well-structured with clear Args and Returns sections. The core purpose is front-loaded in a single sentence, and every listed item adds useful information without filler or redundancy.
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 takes a single required parameter, has 100% schema coverage, an output schema, and strong safety annotations. The description supplies the only missing workflow detail—how to source the match_id—making it fully complete for an agent to invoke correctly.
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 tool description repeats the same match_id explanation (including the reference to cricket_get_live_matches). The description does not add any semantic detail beyond what the input schema already provides, so the baseline score of 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?
Description opens with 'Return the full scorecard for a specific match', a specific verb and resource, and the Returns section details exactly what a scorecard contains (innings, partnerships, bowling figures). This clearly distinguishes it from siblings like cricket_get_live_matches, cricket_get_squad, and cricket_get_pitch_report.
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?
The description provides a clear prerequisite by noting the match_id is obtained from cricket_get_live_matches, which establishes when this tool is appropriate. It does not explicitly name alternatives or exclusion cases, but the narrow scope of 'scorecard for a specific match' makes those unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_get_squadARead-onlyIdempotentInspect
Return the squad roster for a cricket team, optionally for a specific series.
Args: team: Team code or name (e.g. "MI", "CSK", "IND", "AUS"). series_id: Optional. Series ID to pull the tournament-specific squad. If omitted, falls back to static seed data.
Returns: data.players: list of players with name, role, and credits. meta.source: adapter that served the data (cricapi / static_seed).
| Name | Required | Description | Default |
|---|---|---|---|
| team | Yes | Team code or name (e.g. "MI", "CSK", "IND", "AUS"). | |
| series_id | No | Optional. Series ID to pull the tournament-specific squad. If omitted, falls back to static seed data. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations by disclosing the fallback to static seed data and the meta.source adapter behavior, which helps the agent understand possible data provenance.
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?
The description is concise and well-structured with a clear one-line purpose, Args section, and Returns section. Every sentence provides useful information, and the most important statement is front-loaded. There is no redundant or filler content.
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?
For a simple two-parameter, read-only tool with full schema coverage, an output schema, and rich annotations, the description is fully sufficient. It explains the optional behavior, fallback source, and return fields, leaving no important operational gap for an agent to call it correctly.
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 both parameters. The description repeats the examples and fallback explanation without adding significant new meaning beyond the schema. This matches the baseline of 3 for fully covered parameters.
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 opens with a clear, specific verb and resource: 'Return the squad roster for a cricket team'. It clearly differentiates this tool from the many other cricket and football tools by naming the exact data domain. The optional series scoping is also stated immediately.
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?
The description provides clear context for when to supply series_id and what happens when it is omitted, falling back to static seed data. It does not explicitly name alternatives or exclusions, but the purpose and optional parameter behavior are clear enough for an agent to decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_head_to_headARead-onlyIdempotentInspect
Compare two cricket teams head-to-head using squad form and player stats.
Args: team_a: First team code or name (e.g. "MI", "India"). team_b: Second team code or name (e.g. "CSK", "Australia").
Returns: data: {team_a, team_b, team_a_edge_count, team_b_edge_count, key_players_a, key_players_b, h2h_win_rate_a, h2h_win_rate_b, win_prob_a, win_prob_b}. meta.estimated: true. meta.estimate_quality: "uninformative" when no player stats were available (both sides at default form), else "player_stats".
| Name | Required | Description | Default |
|---|---|---|---|
| team_a | Yes | First team code or name (e.g. "MI", "India"). | |
| team_b | Yes | Second team code or name (e.g. "CSK", "Australia"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond simple input/output by detailing the meta-data nature of the results, specifically 'meta.estimated' and the conditional 'estimate_quality' field. This is crucial behavioral context that tells an agent when the data is reliable (i.e., when player stats are missing).
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?
While the core concept is concise, the description is structurally compromised by including the literal input arguments and return schema structure within the free-text description. This makes the description dense and less readily digestible for an AI agent.
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 output structure, the description is highly complete. It not only covers the inputs and the primary goal but also explicitly defines the quality and estimated nature of the return values, which is essential for agent reasoning.
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?
Since the schema coverage is 100%, the structured data fully describes the parameters. The description provides no semantic information regarding the arguments that is not already covered in the input schema descriptions.
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 purpose is exceptionally clear: 'Compare two cricket teams head-to-head.' It specifies the method used ('using squad form and player stats') and immediately sets it apart from simpler squad or match detail retrieval 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?
The description focuses entirely on *how* the tool works rather than *when* to use it. It provides no guidance on scenarios where this tool would be preferred over other H2H tools like cricket_player_matchup or cricket_differential_picks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cricket_player_form_indexARead-onlyIdempotentInspect
Report a 0-100 form score for a player using the player_stats chain.
Args: player_id: Upstream player identifier (CricAPI/Cricbuzz id).
Returns: data.form_score: 0..100 indicator. data.trend: "rising" / "stable" / "falling". data.samples: how many recent innings were available. meta.source: which adapter served the underlying stats. meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| player_id | Yes | Upstream player identifier (CricAPI/Cricbuzz id). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, non-destructive, and idempotent behavior. The description adds meaningful behavioral context: the result is estimated (meta.estimated true), the score range is 0-100, and it reveals the underlying player_stats chain and adapter sourcing.
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?
The structure is clear and front-loaded with the core purpose, followed by concise Args and Returns sections. It is slightly repetitive of the schema, but every included detail serves a purpose and there is no fluff.
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?
For a single-parameter, read-only tool with an output schema, the description is sufficiently complete. It covers the score, trend direction, sample size, source adapter, and estimation flag, giving an agent enough context to invoke the tool correctly.
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%, so the baseline is 3. The description's Args section duplicates the schema's player_id description rather than adding new meaning such as examples, formats, or acceptable identifier variants.
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 clearly states the tool's purpose: reporting a 0-100 form score for a player. It names the resource ('player') and the specific output ('form score'), which distinguishes it from other cricket tools focused on scorecards, matchups, or recommendations.
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?
The usage context is implied: call this tool when a numeric player form score or trend is needed. However, it does not explicitly contrast itself with sibling tools like cricket_player_matchup or football_form_trends, nor provide 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.
cricket_player_matchupARead-onlyIdempotentInspect
Analyse the head-to-head matchup between two cricket players based on role and career stats.
Args: player_a: CricAPI player ID for the first player (names are not resolved). player_b: CricAPI player ID for the second player (names are not resolved).
Returns: data: {matchup_type, edge_holder, edge_reason, signals, role_a, role_b}. meta.estimated: true — heuristic model, not ball-by-ball H2H data.
| Name | Required | Description | Default |
|---|---|---|---|
| player_a | Yes | CricAPI player ID for the first player (names are not resolved). | |
| player_b | Yes | CricAPI player ID for the second player (names are not resolved). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description is free to add the genuinely important disclosure: meta.estimated is true and this is a heuristic model, not ball-by-ball H2H data. That caveat materially changes how an agent should present results, and it goes well beyond the structured fields.
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?
The purpose is front-loaded in a single sentence, followed by a compact Args/Returns block with no filler. The Returns section is somewhat redundant given an output schema exists, but it is short enough not to be a real cost.
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?
For a simple two-parameter read tool with full schema coverage, an output schema, and rich annotations, the description covers purpose, inputs and the heuristic caveat. The only real omission is positioning against the cricket_head_to_head sibling, which matters for correct tool selection.
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 two Args lines simply restate the schema wording verbatim, including the 'names are not resolved' warning. No additional meaning (ID format, where to obtain IDs, behaviour on invalid IDs) is contributed 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?
The description names a specific verb ('Analyse') and a specific resource ('head-to-head matchup between two cricket players'), and scopes it to role and career stats. It is clearly distinct from team/match-level siblings, though it never names cricket_head_to_head or cricket_player_form_index, so the differentiation is left implicit.
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 or when-not-to-use guidance and no reference to any alternative. Given the sibling list contains both cricket_head_to_head and cricket_player_form_index, an agent has to guess which tool the player-vs-player question belongs to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cross_sport_build_accumulatorARead-onlyIdempotentInspect
Model the joint probability of multiple outcomes across football and cricket.
Args: legs: Total legs across both sports (2-8). Default 3. min_edge: Minimum edge per leg. Default 0.05.
Returns: data: same shape as football_build_accumulator, with sport field per leg. meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| legs | No | Total legs across both sports (2-8). Default 3. | |
| min_edge | No | Minimum edge per leg. Default 0.05. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds useful behavioral context: return data has the same shape as football_build_accumulator with a per-leg sport field, and meta.estimated is true. This goes beyond the annotations and helps the agent understand the output before invoking.
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?
The description is short and front-loaded with the purpose, followed by a clean Args/Returns structure. The Args section is redundant with the schema, which slightly reduces efficiency, but overall there is no fluff and it remains easy to scan.
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 annotations describing the tool as read-only, idempotent, and non-destructive, the description is mostly complete. It clarifies the return shape and the estimated flag, which are not in the annotations. A small gap is that it relies on knowledge of football_build_accumulator's shape, but that is acceptable given the output schema 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?
Schema description coverage is 100%, so the schema already documents both parameters with defaults and constraints. The description's Args section repeats this information without adding new meaning. The parameter semantics are adequately covered by the schema, and the description adds no extra value here.
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 clearly states the tool models joint probability of outcomes across football and cricket, which distinguishes it from single-sport siblings like football_build_accumulator. The verb 'model' is somewhat abstract, but the resource and scope are explicit. It does not explicitly name an alternative, but the cross-sport scope is clear.
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?
The phrase 'across football and cricket' implies this is for multi-sport accumulators, and referencing football_build_accumulator's shape hints at a relationship. However, it never explicitly says when to use this tool versus a single-sport alternative, nor does it state any exclusions or prerequisites. Usage context is implied, not clearly directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_get_driversARead-onlyIdempotentInspect
Return driver list for a specific F1 session.
Args: session_key: OpenF1 session identifier.
Returns: data.drivers: list of driver objects with driver_number, full_name, team. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| session_key | Yes | OpenF1 session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds modest context by documenting the response shape (data.drivers with specific fields, meta.source), but since an output schema exists, this adds limited value beyond the structured data. No contradiction 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured with clear Args/Returns sections, and the purpose is front-loaded. One minor deduction: the Args section duplicates the schema exactly, which adds no value beyond the structured field.
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?
For a simple one-parameter, read-only tool with full schema coverage, an output schema, and complete safety annotations, the description is nearly sufficient. The only gap is routing guidance—how to acquire the session_key and when to prefer this tool over sibling tools—which is a minor omission given the simplicity.
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%, so the schema already fully documents session_key as 'OpenF1 session identifier.' The description merely repeats this verbatim, adding no additional meaning about format, source, or how to obtain a valid value. 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 first sentence states a specific verb ('Return'), a specific resource ('driver list'), and a precise scope ('for a specific F1 session'). Combined with the Returns section listing driver_number, full_name, and team, an agent can unambiguously distinguish this from siblings like f1_get_standings or f1_get_race_results.
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?
The requirement of a session_key implies the agent must first obtain one (likely from f1_get_sessions), but this is never stated. There is no explicit guidance on when to choose this tool over the many F1 siblings that also return driver-related data, such as f1_get_standings or f1_get_race_results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_get_lap_timesARead-onlyIdempotentInspect
Return lap times for a driver in a specific F1 session.
Args: session_key: OpenF1 session identifier. driver_number: Driver's race number (driver numbers change by season; use f1_get_drivers). limit: Max laps to return, 1..200 (default 100 — covers most full races). offset: Number of laps to skip for paging (default 0).
Returns: data.laps: page of lap objects with lap_number and lap_duration. OpenF1 does not put compound/tyre_life here — those live on the stints endpoint. data.pagination: {total, count, offset, limit, has_more, next_offset}. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max laps to return, 1..200 (default 100 — covers most full races). | |
| offset | No | Number of laps to skip for paging (default 0). | |
| session_key | Yes | OpenF1 session identifier. | |
| driver_number | Yes | Driver's race number (driver numbers change by season; use f1_get_drivers). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive, open-world operation. The description adds useful behavioral detail: pagination fields, what the lap objects contain, and explicitly that compound/tyre_life data is not included and lives on the stints endpoint.
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?
The definition is front-loaded and organized into Args and Returns sections. It is efficient overall, though the detailed Returns section is somewhat redundant because 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?
For a simple read-only lap-times endpoint, the description covers required identifiers, pagination behavior, return shape, and an important data limitation. With annotations and an output schema also present, an agent has everything needed to call it correctly.
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 four parameters. The description repeats the same parameter meanings and adds only light context, such as limit covering most full races, so the baseline of 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 opens with a specific verb and resource: 'Return lap times for a driver in a specific F1 session.' This clearly distinguishes it from aggregate tools like f1_race_results or f1_qualifying_analysis, though it does not explicitly name sibling alternatives.
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 by the purpose, and there is a helpful pointer to f1_get_drivers for driver numbers. However, the description does not state when to choose this tool over related siblings such as f1_race_results or f1_head_to_head_pace.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_get_race_resultsARead-onlyIdempotentInspect
Return the final classification for one F1 race, keyed by year and round.
Args: year: Championship year (e.g. 2025). round: Round number within the season (1-based; e.g. 1 for the opener).
Returns: data.results: Ergast/Jolpica RaceTable payload — finishing order, times, grid positions, points, and fastest laps for the race. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Championship year (e.g. 2025). | |
| round | Yes | Round number within the season (1-based; e.g. 1 for the opener). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful context about the returned payload: finishing order, times, grid positions, points, fastest laps, and the meta.source adapter. It does not detail rate limits or errors, but it does not contradict any annotation and provides meaningful behavioral detail.
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?
The description is concise and well-structured: a one-sentence purpose, clear Args, and a Returns section. Every sentence carries useful information with no fluff, and the core purpose is front-loaded.
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?
For a simple two-parameter, read-only tool with full schema coverage and an output schema, the description is complete. It covers what the tool returns, the key parameters, and the data source, leaving no critical gaps for an agent to invoke it correctly.
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 description's Args section essentially mirrors the schema's parameter descriptions. It adds no extra semantic meaning beyond the schema, so the baseline of 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 states a specific verb and resource: 'Return the final classification for one F1 race, keyed by year and round.' It clearly differentiates from sibling tools like f1_get_lap_times, f1_get_sessions, and f1_get_standings by focusing on a single race's final classification.
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?
The description clearly implies when to use this tool: when you need the final classification/results of one specific race. It does not explicitly name alternatives or exclusion conditions, but the resource scope ('one F1 race') provides clear context among the F1 sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_get_sessionsARead-onlyIdempotentInspect
Return F1 sessions for a given year, optionally filtered by country or session name.
Args: year: Championship year (e.g. 2026). country: Optional country name to filter (e.g. "Netherlands"). session_name: Optional session name to keep, case-insensitive (e.g. "Race", "Qualifying", "Sprint"). latest_completed: When true, return only the single session that ended most recently (greatest date_end before now, UTC) — e.g. with session_name="Race", the latest finished Grand Prix.
Returns: data.sessions: list of session objects with session_key, session_type, date. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Championship year (e.g. 2026). | |
| country | No | Optional country name to filter (e.g. "Netherlands"). | |
| session_name | No | Optional session name to keep, case-insensitive (e.g. "Race", "Qualifying", "Sprint"). | |
| latest_completed | No | When true, return only the single session that ended most recently (greatest date_end before now, UTC) — e.g. with session_name="Race", the latest finished Grand Prix. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description still adds real behavioral detail beyond them: filtering is case-insensitive, and latest_completed selects the greatest date_end strictly before now in UTC. The Returns section duplicates the output schema, which is minor redundancy rather than a 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?
The opening sentence is well front-loaded and zero-waste, but the Args and Returns blocks are a docstring that repeats structured schema and output-schema content almost one-for-one. Those lines do not earn their place for an agent that already receives the schema.
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?
This is a low-complexity lookup with four fully documented parameters, complete annotations, and an output schema, so the description does not need to explain return shapes. What is missing is only cross-tool routing guidance, e.g. that session keys obtained here feed f1_get_race_results or f1_get_lap_times.
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 four parameters, and the Args block largely restates those same descriptions verbatim. The one marginal addition, case-insensitivity of session_name, also appears in the schema. Baseline 3 is appropriate 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?
The first sentence names a specific verb and resource (return F1 sessions) and states the required scope (a given year) plus the optional filters. It is distinguishable from siblings like f1_get_race_results or f1_get_drivers, but it does not explicitly contrast itself with them, 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?
The description explains how to narrow results via country, session_name, and latest_completed, including a concrete example ('with session_name="Race", the latest finished Grand Prix'). However, it never states when to use this tool versus alternatives such as f1_get_race_results, nor any prerequisites, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_get_standingsARead-onlyIdempotentInspect
Return F1 driver and constructor championship standings for a year.
Use this for "who is leading / who will win the F1 championship this year". For title probabilities use f1_simulate_championship. This is not a cricket or football tool.
Args: year: Championship year (e.g. 2026).
Returns: data.season / data.round: season and the last round counted. data.drivers: [{position, driver_number, code, name, team, points, wins}] (points are season totals). data.constructors: [{position, team, points, wins}]. Same shape from every source (Jolpica primary; the FastF1 fallback sums per-race points and omits sprint points). meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | Championship year (e.g. 2026). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so safety is covered; the description adds real non-schema behavior: Jolpica is primary and a FastF1 fallback sums per-race points and omits sprint points, which affects interpretation of totals. It stops short of rate limits or staleness/freshness semantics, so not a 5.
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?
Front-loaded with purpose and routing rules in two tight sentences. The Returns block largely duplicates the existing output schema, which is some wasted weight, though the source-adapter line is genuinely additive.
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?
For a one-parameter read tool with full annotation coverage and an output schema, the description supplies everything else an agent needs: the use case, the sibling alternative, sport scoping, and the source-fallback caveat that no structured field expresses.
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?
Single required parameter with 100% schema description coverage, so the schema already carries the meaning. The description only restates the example year (2026) without adding format or range constraints.
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?
Specific verb (return) plus resource (F1 driver and constructor championship standings) scoped to a year. It also explicitly disclaims cricket/football and names the adjacent simulation sibling, so it is distinguishable without opening a 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?
Gives an explicit use trigger ("who is leading / who will win the F1 championship this year") and routes the probability question to f1_simulate_championship, plus a hard negative boundary against cricket/football tools. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_get_weatherARead-onlyIdempotentInspect
Return weather data for a specific F1 session.
Args: session_key: OpenF1 session identifier.
Returns: data.weather: list of weather snapshots with temperature, rainfall, wind. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| session_key | Yes | OpenF1 session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe, read-only, idempotent operation. The description adds meaningful behavioral detail by specifying the return shape: a list of weather snapshots with temperature, rainfall, and wind, plus a meta.source field. This goes beyond the annotation-only baseline without contradicting any hints.
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?
The description is reasonably concise, front-loads the core purpose in the first sentence, and uses an Args/Returns structure that is easy to parse. It slightly redundantly repeats the parameter description from the schema, but overall it is efficient and well organized.
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?
For a single-parameter, read-only data retrieval tool with a known output schema, the description covers the essential inputs and return fields. It is complete enough for an agent to call correctly, though it could optionally note that session_key comes from f1_get_sessions. The presence of an output schema reduces the need to document return values in detail.
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 session_key as an OpenF1 session identifier. The description repeats the exact same phrase, adding no new semantic meaning. The baseline of 3 is appropriate since the schema fully handles parameter documentation.
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 opens with a specific verb and resource: 'Return weather data for a specific F1 session.' It clearly distinguishes from sibling tools like f1_weather_strategy_impact (which analyzes strategy impact) and f1_get_sessions (session metadata), making the tool's function unambiguous.
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?
The description explains what the tool does but provides no guidance on when to use it versus alternatives. It does not mention that a session_key must first be obtained via f1_get_sessions, nor does it contrast with f1_weather_strategy_impact, which would help an agent choose the right weather-related tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_head_to_head_paceARead-onlyIdempotentInspect
Compare lap-time pace distribution between two drivers in a session.
Args: session_key: OpenF1 session identifier. driver_a: First driver's race number. driver_b: Second driver's race number.
Returns: data: {driver_a_avg_s, driver_b_avg_s, delta_s, faster_driver}. The "avg" values are median lap times after dropping pit-out laps and slow outliers (safety-car / in-laps). meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| driver_a | Yes | First driver's race number. | |
| driver_b | Yes | Second driver's race number. | |
| session_key | Yes | OpenF1 session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive, open-world operation. The description adds useful methodological context beyond the annotations: medians are used after dropping pit-out laps and slow outliers such as safety-car or in-laps, and meta.estimated is true.
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?
The description is front-loaded with the core comparison purpose and then uses compact Args/Returns sections. The Args section largely repeats schema descriptions, but the overall text remains efficient and easy to scan.
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 has a simple three-parameter input, full schema coverage, annotations, and an output schema. The description adds the important estimation caveat and filtering methodology, making it sufficiently complete for an agent to invoke and interpret the result, though sibling differentiation is still 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 input schema already documents all three parameters. The description repeats the schema meanings for session_key and driver race numbers without adding meaningful input semantics beyond what is already structured.
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 and resource: compare lap-time pace distribution between two drivers in a session. It is clear enough to distinguish the operation from generic lap-time retrieval, but it does not explicitly differentiate itself from the sibling f1_race_pace_compare tool.
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?
The description explains what the tool does but gives no guidance on when to use it versus alternatives such as f1_race_pace_compare, f1_get_lap_times, or f1_qualifying_analysis. There are no exclusions, prerequisites, or scenario-based routing cues.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_predict_pit_strategyARead-onlyIdempotentInspect
Predict the optimal pit-stop strategy for a driver in an F1 race session.
Args: session_key: OpenF1 session identifier for a recorded race. driver_number: Driver's race number (driver numbers change by season; use f1_get_drivers). current_lap: Current lap to project from (default 1 = full race ahead). total_laps: Total race laps. If omitted, estimated from the regulation minimum race distance (305 km; Monaco 260 km) over the circuit's lap length; INVALID_INPUT when the circuit is unknown. An explicit value always wins.
Returns: data.stop_laps: recommended pit laps. data.compound_sequence: tyre compounds for each stint. data.expected_finish_position: currently always None (not modelled). data.confidence: 0.0-1.0 model confidence. data.net_saving_s: stay-out time minus the best one-stop time (seconds). data.current_tyre_age: laps on the current tyre set at current_lap. meta.total_laps: race length used. meta.total_laps_source: "explicit" or "regulation_estimate". meta.estimated: true.
Example: f1_predict_pit_strategy(session_key=11353, driver_number=1, total_laps=72) f1_predict_pit_strategy(session_key=11353, driver_number=1, current_lap=20)
| Name | Required | Description | Default |
|---|---|---|---|
| total_laps | No | Total race laps. If omitted, estimated from the regulation minimum race distance (305 km; Monaco 260 km) over the circuit's lap length; INVALID_INPUT when the circuit is unknown. An explicit value always wins. | |
| current_lap | No | Current lap to project from (default 1 = full race ahead). | |
| session_key | Yes | OpenF1 session identifier for a recorded race. | |
| driver_number | Yes | Driver's race number (driver numbers change by season; use f1_get_drivers). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower. The description still adds real value: it discloses the regulation-distance fallback for total_laps, the INVALID_INPUT failure mode on unknown circuits, explicit-wins precedence, and that expected_finish_position is always None — an honest limitation disclosure. It does not mention cost or latency, but nothing material is hidden.
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?
Front-loaded with a one-sentence purpose, then Args/Returns/Example in a scannable structure. The Returns section is long but each field is load-bearing for interpreting results. Slight repetition between the Args text and the schema descriptions is the main inefficiency.
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?
For a predictive tool with four parameters and an output schema, the description covers inputs, the fallback logic, key output fields, a caveat field, and two concrete call examples. An agent can call it correctly from this alone; the only gap is routing guidance against related strategy tools.
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%, so the schema already documents all four parameters and the description's Args block is largely a restatement. The only marginal addition is the default-1 meaning 'full race ahead', which is close to what the schema says. 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?
States a specific verb and resource: predicting an optimal pit-stop strategy for a named driver in a recorded race session. The scope ('session + driver + current lap') is precise enough to distinguish it from data-retrieval siblings like f1_get_lap_times. However, it never names or contrasts itself with strategy-adjacent siblings such as f1_undercut_window, f1_tyre_degradation, or f1_weather_strategy_impact.
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?
The description implies the usage context ('recorded race', 'use f1_get_drivers' to obtain driver numbers), which gives the agent a prerequisite hint. But it offers no guidance on when to choose this tool versus f1_undercut_window, f1_tyre_degradation, or f1_weather_strategy_impact — the alternatives an agent would most plausibly confuse it with.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_qualifying_analysisARead-onlyIdempotentInspect
Analyse a qualifying session: best lap per driver, gap to pole, projected grid.
Args: session_key: OpenF1 session identifier for a Qualifying session.
Returns: data.grid: [{position, driver_number, full_name, team_name, best_lap_gap_s}]. data.pole_time_s: pole lap duration in seconds. data.drivers_analysed: count of drivers with valid laps. meta.estimated: true — grid derived from session laps, not official timing.
| Name | Required | Description | Default |
|---|---|---|---|
| session_key | Yes | OpenF1 session identifier for a Qualifying session. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses that the returned grid is estimated and derived from session laps, not official timing ('meta.estimated: true — grid derived from session laps'), and defines drivers_analysed as valid laps only. This adds meaningful non-obvious behavior while annotations already cover read-only/idempotent safety.
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?
The description is compact and front-loaded with a one-line summary, followed by a short Args block and a clearly structured Returns list. Every line earns its place, including the estimated-grid caveat.
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?
For a single-parameter analytical tool with read-only/idempotent annotations and an output schema, this description fully covers input requirements, return fields, and the key estimation caveat. Nothing needed to invoke the tool correctly 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 coverage is 100%, and the single parameter's schema description already provides 'OpenF1 session identifier for a Qualifying session.' The description merely repeats that wording without adding format, source, or examples, so it adds no semantic value beyond the schema.
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?
Description opens with a specific verb and resource: 'Analyse a qualifying session', then lists concrete outputs (best lap per driver, gap to pole, projected grid). This clearly distinguishes it from sibling f1_get_* tools, which return raw sessions, laps, or results rather than a derived grid.
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?
The description states the intended context: use it to analyse a qualifying session, and the schema/Args reinforce that session_key must identify a Qualifying session. It does not explicitly name alternative tools for official timing or race analysis, so it stops short of a 5, but the qualifying-only scope is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_race_pace_compareARead-onlyIdempotentInspect
Compare race-pace and tyre degradation between two F1 drivers in a session.
Args: session_key: OpenF1 session identifier. driver_a: First driver's race number. driver_b: Second driver's race number.
Returns: data: {by_compound, overall_faster, compounds_compared}. meta.estimated: true — degradation model fit, not official timing.
| Name | Required | Description | Default |
|---|---|---|---|
| driver_a | Yes | First driver's race number. | |
| driver_b | Yes | Second driver's race number. | |
| session_key | Yes | OpenF1 session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, read-only, idempotent operation. The description adds valuable transparency by explicitly stating that the result is a degradation model fit, not official timing (meta.estimated: true). This goes beyond the annotations and informs the agent that output is estimated.
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?
The description is compact and front-loaded with a clear one-sentence summary. The Args block is redundant with the schema, but the Returns section adds useful structure about the output, making the overall definition efficient and scannable.
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 rich annotations, 100% schema coverage, and presence of an output schema, the description provides sufficient context for correct invocation. It also highlights the estimated nature of the results. A small gap is the lack of differentiation from f1_head_to_head_pace, but this does not critically impair completeness.
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 description's Args section essentially repeats the schema's parameter descriptions without adding new meaning. It correctly identifies session_key, driver_a, and driver_b, but adds no extra semantic detail, so the baseline of 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 states a specific action ('Compare race-pace and tyre degradation') and a clear resource scope ('between two F1 drivers in a session'). It is distinguishable from generic F1 tools, though it does not explicitly differentiate itself from the closely related sibling f1_head_to_head_pace.
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?
The intended use is implied by the first sentence: use this when comparing two drivers' race pace and tyre degradation. However, there is no explicit 'when to use' vs 'when not to use' guidance, nor any mention of alternatives among the many F1 sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_simulate_championshipARead-onlyIdempotentInspect
Estimate each driver's F1 drivers' title probability for the rest of a season.
Monte Carlo over the remaining races and sprints (Plackett-Luce finishing orders weighted by each driver's season points rate), plus exact elimination maths: a driver who cannot catch the leader's current points even by winning every remaining race and sprint has title_prob 0.0. This is not a cricket or football tool.
Args: year: Championship season (2018-2030, default 2026). iterations: Monte Carlo iterations, clamped to 1000-20000 (default 10000). seed: Optional RNG seed for reproducible probabilities.
Returns: data.drivers: [{code, points_now, title_prob, expected_points, eliminated, max_possible}] sorted by title_prob. data.max_remaining_points: most points one driver can still score. data.rounds_remaining: races left after the last completed round. meta.estimated: true. meta.model: "plackett-luce-points-rate". meta.is_stale: true if standings or schedule came from stale cache.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Optional RNG seed for reproducible probabilities. | |
| year | No | Championship season (2018-2030, default 2026). | |
| iterations | No | Monte Carlo iterations, clamped to 1000-20000 (default 10000). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), and the description goes well beyond them: it names the simulation method (Plackett-Luce weighted Monte Carlo), discloses the exact-elimination rule producing title_prob 0.0, documents iteration clamping, and flags meta.is_stale for cached standings/schedule. That is the kind of caveat an agent needs to interpret results correctly.
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?
Purpose and caveats are front-loaded and the argument list is compact. The Returns block duplicates what the output schema already declares, which is mild waste, though the model/staleness meta notes do earn their 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?
With annotations, a full output schema, and 100% parameter coverage, the description supplies everything essential: scope, method, edge cases, and cache caveats. The only soft gaps are the odd sport disambiguation line and no note on latency or what to do when is_stale is true.
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 Args block largely restates the schema text (year range, iteration clamp, seed purpose) rather than adding new meaning. Baseline 3 is appropriate since the schema already carries the semantics.
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 ('Estimate each driver's F1 drivers' title probability for the rest of a season') and immediately names the model behind it. The explicit 'This is not a cricket or football tool' line, plus the F1-season framing, separates it from both the cross-sport siblings and the F1 data-only 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?
Usage is implied by 'for the rest of a season', and elimination maths shows one case where output is degenerate. But there is no explicit when-to-use vs. f1_get_standings (current table) or guidance on whether to call this before/after f1_get_race_results; the agent has to infer the fit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_tyre_degradationARead-onlyIdempotentInspect
Fit a tyre degradation model for a driver + compound in a session.
Args: session_key: OpenF1 session identifier. driver_number: Driver's race number. compound: Tyre compound (SOFT, MEDIUM, HARD, INTER, WET; "INTERMEDIATE" = INTER).
Returns: data: {intercept, slope, residual_std, sample_count}. meta.estimated: true — model output, not telemetry oracle.
| Name | Required | Description | Default |
|---|---|---|---|
| compound | Yes | Tyre compound (SOFT, MEDIUM, HARD, INTER, WET; "INTERMEDIATE" = INTER). | |
| session_key | Yes | OpenF1 session identifier. | |
| driver_number | Yes | Driver's race number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds meaningful behavioral context by stating that the output is an estimated model result, not a telemetry oracle, and by listing the returned model components.
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?
The description is front-loaded with the core purpose and then cleanly separates Args and Returns. It is appropriately sized, though the Args block largely duplicates schema descriptions rather than adding new information.
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?
For a read-only model-fitting tool with full schema coverage and an output schema, the description supplies enough context to call it correctly and interpret the model output. The explicit estimated-model caveat is especially helpful.
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%, so the parameter meanings are already fully documented in the schema. The description repeats the same definitions for session_key, driver_number, and compound without adding syntax, format, or validation detail beyond the schema.
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 and resource: fit a tyre degradation model for a driver and compound in a session. That is clearly distinct from sibling F1 tools such as lap-time retrieval, pace comparison, and pit-strategy prediction.
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?
The purpose implies when the tool is useful, but the description does not explicitly state when to use it versus alternatives like f1_race_pace_compare or f1_predict_pit_strategy. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_undercut_windowBRead-onlyIdempotentInspect
Estimate whether an undercut is viable for the attacker against the target.
Args: session_key: OpenF1 session identifier. attacker_number: Attacking driver's race number. target_number: Target driver's race number. current_lap: Current lap number in the race.
Returns: data: {laps_to_clear, viable, marginal}. meta.gap_to_target_s: attacker-minus-target race time at current_lap. meta.gap_source: "cumulative_lap_time", or "default" (assumed 2.0 s, also in meta.assumed_gap_s) when either driver lacks a full lap history. meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| current_lap | Yes | Current lap number in the race. | |
| session_key | Yes | OpenF1 session identifier. | |
| target_number | Yes | Target driver's race number. | |
| attacker_number | Yes | Attacking driver's race number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's real contribution is the disclosure that the result is an estimate and that a fallback constant of 2.0 s is substituted when either driver lacks a full lap history, surfaced via meta.gap_source and meta.assumed_gap_s. That is exactly the kind of silently-degraded-output warning an agent needs and cannot get from annotations. Only the absence of any note on data requirements or cost keeps it from a 5.
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?
The purpose sentence is correctly front-loaded, but the four-line Args block is pure duplication of a 100%-covered schema, and the Returns block partly restates an output schema that already exists. The useful content (gap_source fallback semantics) is buried in the middle of the Returns section rather than promoted.
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 description needn't enumerate return fields, and it adds genuinely non-derivable context about the estimated result and the 2.0 s default gap. What is missing is the data prerequisite (both drivers need lap history for a non-default gap) stated as a precondition rather than buried in the return narrative, and any routing versus sibling strategy tools.
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 per the rubric the baseline is 3. The Args block restates each parameter's schema description almost verbatim ('Attacking driver's race number' etc.) without adding format, range, or validation meaning (e.g., whether attacker_number must differ from target_number, or whether current_lap must be >= 2).
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 first line states a specific verb and resource ('Estimate whether an undercut is viable') and names both actors (attacker, target), so an agent knows exactly what question is being answered. It does not distinguish itself from the nearest F1 siblings such as f1_predict_pit_strategy or f1_race_pace_compare, which keeps it out of 5 territory.
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 'when to use' guidance at all: no statement of prerequisites (lap history needed), no mention of when to prefer f1_predict_pit_strategy or f1_race_pace_compare, and no exclusion conditions. Usage must be inferred entirely from the tool name and the one-line purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
f1_weather_strategy_impactARead-onlyIdempotentInspect
Analyse weather data and recommend compound or pit-window adjustments.
Args: session_key: OpenF1 session identifier.
Returns: data: {has_rain, avg_track_temp_c, compound_recommendation, recommendation}. meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| session_key | Yes | OpenF1 session identifier. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety behavior is covered. The description adds useful context by listing the returned fields and stating 'meta.estimated: true', which signals the output includes estimates. No contradiction exists between the description and annotations.
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?
The description is compact and well-structured: a one-sentence purpose statement followed by concise Args and Returns blocks. Every element adds information, and the key action is front-loaded in the first sentence, making the tool's purpose immediately scannable.
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?
For a single-parameter, read-only tool with strong annotations and an explicit return shape, the description is largely complete. It covers what the tool does, the required input, and the output structure. It would be more complete if it clarified when to prefer this over sibling strategy tools, but nothing critical for invoking it correctly 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%: the only parameter, session_key, is described in the schema as 'OpenF1 session identifier.' The description repeats this exact meaning without adding further semantic detail such as accepted session types, format, or example values, so the baseline score of 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 opens with a specific verb ('Analyse'), a clear resource ('weather data'), and an explicit outcome ('recommend compound or pit-window adjustments'). This distinguishes it from raw-data tools like f1_get_weather and makes the tool's function obvious, though it does not explicitly separate it from closely-related strategy tools like f1_predict_pit_strategy or f1_undercut_window.
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?
The intended use case is implied: call this when you need weather-based compound or pit-window recommendations. However, there is no explicit when-to-use guidance, no mention of when not to use it, and no reference to alternative F1 strategy or weather tools, so an agent must infer the boundary from the name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_build_accumulatorARead-onlyIdempotentInspect
Model the joint probability of several match outcomes from the top model-vs-market gaps.
Calls football_find_value_bets internally to fetch live odds, then selects
the strongest legs and combines them under the joint-probability model.
Args: legs: Number of legs (2-8). Default 3. min_edge: Minimum edge threshold per leg. Default 0.05.
Returns: data: {legs, legs_used, combined_odds, combined_model_prob, combined_edge, risk_flag, independence_warning}. meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| legs | No | Number of legs (2-8). Default 3. | |
| min_edge | No | Minimum edge threshold per leg. Default 0.05. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, open-world, and idempotent, and the description adds meaningful context beyond that: it relies on a live internal call to football_find_value_bets, selects the strongest legs, and returns risk_flag and independence_warning alongside meta.estimated=true. This gives an agent a solid model of execution behavior and output caveats without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-organized: a one-sentence purpose, a two-sentence mechanism, then clearly labeled Args and Returns. Every sentence contributes useful information, and the internal dependency 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?
For a read-only combinatorial modeling tool, the description is complete: it explains how legs are sourced, what parameters control the behavior, what the return object contains, and that the result is estimated. The presence of an output schema further reduces the burden, and no critical operational gap remains.
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 baseline is 3. The Args section largely repeats the schema's parameter descriptions ('Number of legs (2-8). Default 3.' and 'Minimum edge threshold per leg. Default 0.05.'), adding no notably deeper semantic context beyond what the structured schema already provides.
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 opens with a specific verb-resource pair: 'Model the joint probability of several match outcomes from the top model-vs-market gaps.' It then clarifies the workflow by stating it calls football_find_value_bets internally and combines selected legs, which clearly distinguishes it from the single-value-bet sibling and the cross-sport accumulator.
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?
The intended context is clear: build an accumulator from strong model-vs-market edges using live odds fetched via football_find_value_bets. It does not explicitly state when not to use it or name alternatives such as cross_sport_build_accumulator, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_find_value_betsARead-onlyIdempotentInspect
Surface the largest gaps between the model's win probability and the market.
De-vigs each market's 1X2 decimal odds (removes the margin so implied
probabilities sum to 1) and compares them to this server's own match-outcome
probabilities — the same Elo/Poisson path football_match_predictor uses.
Flags outcomes where the model beats the de-vigged market by min_edge
and the offered price has positive expected value, with the edge, the
expected value and the model's fair odds. Events that have already started
are skipped.
Args: team: Optional FIFA code or team name to filter events (matched against both sides; an unrecognised value falls back to a case-insensitive substring match). Omit to scan every WC 2026 odds event. min_edge: Minimum edge (model_prob - devigged_market_prob), 0..1. Default 0.05 (5 percentage points).
Returns: data.value_bets: list of {event_id, home, away, outcome, model_prob, fair_odds, market_odds, edge, ev_pct, bookmaker, price_updated_at}, sorted by edge descending. data.events_analysed: not-yet-started events with both teams in the draw. meta.estimated: true. meta.is_stale reflects the odds freshness.
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Optional FIFA code or team name to filter events (matched against both sides; an unrecognised value falls back to a case-insensitive substring match). Omit to scan every WC 2026 odds event. | |
| min_edge | No | Minimum edge (model_prob - devigged_market_prob), 0..1. Default 0.05 (5 percentage points). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description discloses the de-vigging methodology, the condition that min_edge and positive EV must both be met, and that started events are skipped. It also notes `meta.estimated: true` and `meta.is_stale` for odds freshness, giving useful behavioral context.
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?
The description is front-loaded with purpose and methodology, then structured into Args and Returns. It is generally efficient, though the Returns section overlaps with the existing output schema.
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 rich annotations, full schema coverage, and an output schema, the description supplies enough context to call the tool correctly. It covers the methodology, filtering behavior, edge threshold, skipped events, and freshness metadata.
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 parameters are already documented in the schema. The description repeats the `team` fallback behavior and the `min_edge` formula, but adds no additional parameter semantics beyond what the schema provides.
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 and resource: it surfaces value bets by comparing model win probabilities against de-vigged market odds. It also explains how this differs from related tools through the de-vig and Elo/Poisson model path, making the tool's distinct function clear.
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?
The description gives clear usage context: omit `team` to scan every WC 2026 odds event, and events that have already started are skipped. It does not explicitly say when to use this instead of `football_get_odds` or `football_match_predictor`, so it lacks full alternative routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_form_trendsARead-onlyIdempotentInspect
Return rolling form, goal record, and xG trend for a football team.
Args: team: FIFA code (e.g. ARG) or name (e.g. "Argentina", "South Korea").
Returns: data: {form_string, wins, draws, losses, goals_scored, goals_conceded, xg_for, xg_against, recent_trend, matches_analysed}. meta.estimated: true — derived from available fixture data.
| Name | Required | Description | Default |
|---|---|---|---|
| team | Yes | FIFA code (e.g. ARG) or name (e.g. "Argentina", "South Korea"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds one genuinely useful behavioral fact: 'meta.estimated: true — derived from available fixture data', disclosing that values are estimates. It says nothing about match window or competition scope, which matters for a form metric.
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?
Front-loaded purpose sentence followed by compact Args/Returns blocks with zero filler. Minor waste in the Args block, which restates the schema description word for word.
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 the return-value listing is redundant but harmless, and the estimated-data caveat covers the key trust question for this kind of derived metric. It stops short of stating the match window or whether club and international fixtures are both in scope.
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 single 'team' parameter is documented there. The Args block in the description repeats that schema text verbatim, adding no new meaning; 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: 'Return rolling form, goal record, and xG trend for a football team', and enumerates the returned metrics. An agent immediately understands the resource, though nothing distinguishes it from overlapping siblings such as football_xg_model or football_match_predictor.
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 'rolling form' and by the returned metrics; there is no explicit when-to-use, when-not-to-use, or named alternative. With football_xg_model also producing xG data, the absence of routing guidance leaves real ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_get_fixturesARead-onlyIdempotentInspect
Return World Cup 2026 fixtures (live providers, else the group schedule).
Args: limit: Max fixtures to return, 1..200 (default 50). offset: Number of fixtures to skip for paging (default 0).
Returns: data.fixtures: page of {home, away, date/group, status, home_goals, away_goals}. data.pagination: {total, count, offset, limit, has_more, next_offset}. meta.source: adapter that served the data (static_seed = group schedule only).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max fixtures to return, 1..200 (default 50). | |
| offset | No | Number of fixtures to skip for paging (default 0). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the burden is lower. The description adds meaningful behavioral context by disclosing that results may come from a static_seed adapter (group schedule only) when live providers are unavailable, and it outlines the response fields including pagination and meta.source. This goes beyond the annotations without contradicting them.
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?
The description is well-structured with a front-loaded purpose sentence followed by Args and Returns sections. Some redundancy exists because the Args block duplicates the schema and the output schema already documents return values, but overall it remains compact and readable.
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?
For a simple paginated read-only fixture tool, the description is complete: it explains the data source fallback, pagination semantics, and return shape via structured sections. With annotations covering safety and an output schema present, an agent has everything needed to invoke it correctly.
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 description repeats the limit and offset documentation almost verbatim. It adds no new meaning beyond what the input schema already provides, so the baseline of 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 opens with a specific verb and resource: 'Return World Cup 2026 fixtures', which clearly identifies the tool's purpose. The parenthetical 'live providers, else the group schedule' adds useful scoping, though it does not explicitly contrast with sibling tools like football_get_groups or football_get_standings.
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?
The description gives a clear context for use: it is the fixture-list tool, with the data source conditionally explained as live providers or the group schedule. It does not name alternatives or exclusions, but among the football siblings there is no other direct 'get fixtures' tool, so the intended usage is reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_get_groupsARead-onlyIdempotentInspect
Return the FIFA World Cup 2026 group draw and advancement format.
Returns: data.groups: {group_letter: [4 team codes]} for all 12 groups. data.format: 48-team / 12-group / top-2 + 8-best-thirds rule. data.teams: team-code -> {name, fifa_code} metadata. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds useful context about the returned data structure and the meta.source adapter, but it does not disclose potential limitations such as data freshness, whether the draw is final, or how the adapter behaves if data is unavailable.
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?
The description is concise and logically structured with a brief summary followed by a clear Returns breakdown. It is slightly verbose in re-specifying output schema details that the output schema already provides, but every line is informative and no filler 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?
For a zero-parameter, read-only tool with rich annotations and an output schema, the description fully covers what the agent needs: what the tool returns, the exact group structure, the format rule, and team metadata. There is no missing essential context for correct invocation.
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?
The tool has zero parameters and schema coverage is 100%, so there is no parameter documentation burden on the description. Per the rubric, a zero-parameter tool gets a baseline of 4, and the description confirms the tool takes no input.
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 ('Return') and a specific resource ('FIFA World Cup 2026 group draw and advancement format'). It clearly differentiates this tool from siblings like football_simulate_group or football_get_standings by naming the actual draw and format as the subject.
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?
The intended use is implied by the tool's scope: an agent needing the actual 2026 World Cup group composition and format should call this. However, the description does not explicitly mention when not to use it or point to alternatives like football_simulate_group for hypothetical scenarios, leaving some routing judgment to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_get_match_statsARead-onlyIdempotentInspect
Return a team's aggregate World Cup tournament statistics.
Network-only enrichment: requires a configured API-Football (or football-data.org) key. There is no offline static fallback, so without a key the call returns a clean ALL_SOURCES_FAILED envelope.
Args: team: API-Football numeric team id (not a country code).
Returns: data.team_stats: {team, played, wins, goals_for, goals_against}. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| team | Yes | API-Football numeric team id (not a country code). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (read-only, idempotent, non-destructive), the description adds substantial behavioral detail: it is network-only with no offline fallback, returns a clean ALL_SOURCES_FAILED envelope when no key is configured, and describes the exact return shape plus the meta.source adapter. This gives an agent full transparency about failure modes and response structure.
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?
The description is compact and well-structured with clear sections for purpose, network requirements, args, and returns. Every line earns its place, and the primary purpose is front-loaded. No redundant or filler content.
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?
For a single-parameter tool, this description is complete. It explains the data requirement, the failure envelope, the return fields, and the source adapter. Even though an output schema exists, the description's return breakdown adds practical clarity, and nothing an agent needs to call it correctly 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?
The input schema already covers the single parameter 'team' with a clear description ('API-Football numeric team id (not a country code)') and 100% coverage. The description repeats this information in the Args section without adding any new semantic meaning, so it meets the baseline for high schema coverage.
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 opens with a specific verb ('Return') and an unambiguous resource ('a team's aggregate World Cup tournament statistics'), which clearly distinguishes it from sibling tools that return fixtures, standings, or individual match data. Even though the tool name says 'match_stats', the description clarifies it is aggregate tournament statistics, so an agent knows exactly what it gets.
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?
The description implies when to use the tool: whenever a team's aggregate World Cup statistics are needed. However, it does not explicitly state when not to use it or name alternatives among the many football sibling tools. It does add a practical usage constraint (requires an API key and only works in network-enabled contexts), which supports usage decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_get_oddsARead-onlyIdempotentInspect
Return market head-to-head odds for any World Cup 2026 events the odds feed still lists.
Sourced from The Odds API (requires THEODDS_KEY). Without a key the call returns a clean ALL_SOURCES_FAILED envelope rather than crashing. The tournament ended with the 2026-07-19 final, so the feed is normally empty.
Args: team: Optional team name to filter events (case-insensitive substring, matched against both sides). Omit to return every WC event.
Returns: data.events: list of {event_id, home, away, commence_time, bookmakers: [{name, home, draw, away, last_update}]} with decimal 1X2 prices per bookmaker. meta.source: adapter that served the data (theodds / cache:stale).
| Name | Required | Description | Default |
|---|---|---|---|
| team | No | Optional team name to filter events (case-insensitive substring, matched against both sides). Omit to return every WC event. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, and non-destructive behavior, and the description adds meaningful context beyond them: THEODDS_KEY is required, missing keys return an ALL_SOURCES_FAILED envelope, and meta.source can indicate theodds or cache:stale. These are exactly the behavioral details an agent needs before invoking the tool.
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?
The first sentence front-loads purpose and scope, and the subsequent sections efficiently cover key requirements, failure behavior, arguments, and return shape. The structure is clear and every section adds operational value.
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 tool has an output schema, the description does not need to explain return values in depth, yet it still covers the important edge cases: missing API key, empty feed after tournament end, and optional filtering. It is complete for correct invocation.
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 description’s team-argument explanation largely repeats the schema text rather than adding new semantics. With the schema already documenting the optional filter, a 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 states a specific verb and resource: returns market head-to-head odds for World Cup 2026 events. Scope is clear, but it does not explicitly differentiate itself from football siblings such as football_find_value_bets or football_build_accumulator.
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 gives useful operational context, including the key requirement, the normally empty feed after the final, and the team-filter behavior. However, it does not explicitly say when to use this instead of sibling odds-related tools or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_get_squadARead-onlyIdempotentInspect
Return a national team's World Cup squad.
Args: team: Team code or name (e.g. "ARG"). Live rosters need an API-Football key; without one the static seed serves an empty-but-valid squad (no rosters are bundled).
Returns: data.squad: list of {name, number, position, age} (empty from the seed). meta.source: adapter that served the data. meta.note: present when the seed served it — how to get live squads.
| Name | Required | Description | Default |
|---|---|---|---|
| team | Yes | Team code or name (e.g. "ARG"). Live rosters need an API-Football key; without one the static seed serves an empty-but-valid squad (no rosters are bundled). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as a read-only, idempotent, open-world operation, so the description does not need to restate safety. It adds valuable behavioral context by disclosing that live rosters require an API-Football key and that without one the static seed returns an empty-but-valid squad with a meta.note explaining how to get live data.
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?
The core purpose is front-loaded in the first sentence, followed by clearly structured Args and Returns sections. It is generally efficient, though the team parameter text is duplicated from the schema and could have been omitted without loss.
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?
Although an output schema exists, the description still helpfully explains the relevant return fields: data.squad, meta.source, and meta.note. Combined with the fallback-behavior disclosure, it gives an agent everything needed to call the tool and interpret an empty squad correctly.
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 carries the full parameter definition. The Args section repeats the same team description almost verbatim and adds no syntax, format, or validation detail beyond what the schema provides, making 3 the correct baseline.
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 opens with a specific verb and resource: "Return a national team's World Cup squad." That is precise enough to distinguish it from football siblings like football_get_standings or football_get_top_scorers, which cover different resources.
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?
The description makes the use case clear by naming the World Cup squad as the target resource, but it does not explicitly state when to use this tool instead of adjacent football tools or what prerequisites exist beyond the API-key caveat. Usage is therefore implied rather than actively guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_get_standingsARead-onlyIdempotentInspect
Return current World Cup 2026 group standings.
Args: limit: Max standing rows to return, 1..200 (default 50). offset: Number of rows to skip for paging (default 0).
Returns: data.standings: page of {rank, team, group, points, played, goals_diff}. data.pagination: {total, count, offset, limit, has_more, next_offset}. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max standing rows to return, 1..200 (default 50). | |
| offset | No | Number of rows to skip for paging (default 0). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds value beyond annotations by disclosing pagination behavior, return envelope shape, and the meta.source adapter detail. No contradiction exists.
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?
The description is well-structured and front-loaded with the core purpose. The Args block is redundant given the input schema, but the Returns section justifies its presence. Overall it is concise with no filler, though a bit repetitive.
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 tool's simplicity, the rich annotations, and the presence of an output schema, the description is complete. It documents the pagination contract, the return fields, and the source metadata. Nothing essential for an agent to call it correctly 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%, so the baseline is 3. The Args section simply restates the schema descriptions for limit and offset without adding new semantic detail. The Returns section indirectly clarifies paging behavior but does not enhance parameter meanings beyond what the schema already provides.
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 first sentence states a specific verb ('Return'), a precise resource ('World Cup 2026 group standings'), and implicitly distinguishes the tool from siblings like football_get_groups or football_get_fixtures. The resource scope is unambiguous and cannot be confused with any other listed tool.
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?
The description clearly implies the tool should be used when a caller needs current World Cup 2026 group standings. It provides no explicit exclusion or alternative routing, but the context is strong enough for an agent to select it appropriately among football-related list tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_get_top_scorersARead-onlyIdempotentInspect
Return the World Cup 2026 top scorers.
Returns: data.scorers: list of {name, team, goals, assists}. meta.source: adapter that served the data.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the tool read-only, idempotent, open-world, and non-destructive, which covers the safety profile. The description adds return structure details (scorers list, meta.source), which is useful but does not disclose additional behavior such as data freshness, ordering, or limits. This meets the minimum bar without exceeding it.
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?
The description is compact and front-loaded with the main action. The Returns block is structured clearly and adds useful detail without redundancy or fluff.
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?
For a zero-parameter read-only tool with a full output schema and safety annotations, the description is nearly complete. The only minor gap is not stating how many scorers are included (e.g., top 10 vs. all), but this is unlikely to mislead an agent given the output schema.
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?
The input schema has zero parameters, and the description correctly makes no parameter claims. With 0 params, the baseline is 4, and there are no missing parameter explanations to penalize.
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?
Description states a specific verb ('Return') and a precise resource ('World Cup 2026 top scorers'), and the output shape is explicitly named. The tool's name and description uniquely identify it among siblings like football_get_standings and football_get_groups, leaving no ambiguity.
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?
The purpose is so specific that the intended usage ('when you need top scorer data') is obvious from the name and description. However, the description does not explicitly mention when not to use it or compare it to another tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_knockout_pathARead-onlyIdempotentInspect
Round-by-round survival probabilities for one team in the full sim.
Args: team: FIFA code or name (e.g. "FRA" or "France"). iterations: Number of tournament simulations (clamped to 100..20000). seed: Optional RNG seed.
Returns: data: {team, reach_r32, reach_r16, reach_qf, reach_sf, reach_final, win}. meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Optional RNG seed. | |
| team | Yes | FIFA code or name (e.g. "FRA" or "France"). | |
| iterations | No | Number of tournament simulations (clamped to 100..20000). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the useful disclosure that results are simulation-based via 'meta.estimated: true', but doesn't explain what 'estimated' entails, whether results vary run-to-run without a seed, or cost/latency for 20k iterations.
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?
The one-line summary is front-loaded and the Args/Returns blocks are compact and scannable with no filler. It is slightly padded by restating schema descriptions, but nothing is genuinely wasted.
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?
For a read-only simulation tool with full schema annotations and an output schema, the definition covers the essential contract, including the shape of the returned data keys and the estimated flag. The main remaining gap is guidance on variability and choosing iteration counts, which is minor.
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 description repeats the same parameter text verbatim (team codes, clamped iteration range, optional seed) rather than adding new semantics such as seed determinism or what team-name matching tolerates. Baseline 3 applies when the schema already documents every parameter.
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 and resource: round-by-round survival probabilities for a single team from Monte Carlo simulation of the tournament. It implicitly contrasts with football_simulate_bracket (whole bracket) by emphasizing 'one team', but doesn't name that sibling 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 'one team in the full sim'; there is no explicit statement of when to pick this over football_simulate_bracket, football_simulate_group, or football_match_predictor. An agent must infer the choice from the wording alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_match_predictorARead-onlyIdempotentInspect
Predict a single match: most likely scoreline + outcome probabilities.
Args: home_team: First team, FIFA code or name (e.g. "ESP" or "Spain"). away_team: Second team, FIFA code or name. neutral: True for a neutral venue (World Cup default).
Returns: data: {most_likely_score, home_win, draw, away_win, predicted_winner}. meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| neutral | No | True for a neutral venue (World Cup default). | |
| away_team | Yes | Second team, FIFA code or name. | |
| home_team | Yes | First team, FIFA code or name (e.g. "ESP" or "Spain"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is covered. The description adds one genuinely useful trait, meta.estimated: true, which tells the agent outputs are model estimates, but the rest of the Returns block largely restates what the output schema provides.
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?
Front-loaded one-line summary followed by a compact Args/Returns block. Slightly redundant with the input and output schemas, but nothing is padded or confusing.
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 spelled out, and annotations cover safety, so the description is close to sufficient. The only gap is the absence of guidance on venue/neutral semantics or distinctness from sibling prediction tools.
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%, so all three parameters are already documented, and the description repeats the same wording (including the "ESP"/"Spain" example) rather than adding new semantics. Baseline 3 applies 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 and resource: predicting one match's scoreline and outcome probabilities. The phrase "a single match" implicitly distinguishes it from siblings like football_simulate_bracket or cross_sport_build_accumulator, 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 the scope words "single match" and the neutral-venue default. There is no explicit when-to-use or when-not-to-use guidance versus football_xg_model, football_simulate_group, or football_simulate_bracket, leaving the agent to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_simulate_bracketARead-onlyIdempotentInspect
Monte Carlo the full World Cup 2026 — per-team round + title probabilities.
Simulates all 12 groups, advances the top 2 + 8 best third-placed teams to a
32-team knockout, and plays it to a champion, iterations times.
Args: iterations: Number of tournament simulations (clamped to 100..20000; ~10000 gives stable ±2% probabilities). seed: Optional RNG seed for reproducible output.
Returns: data.teams: {code: {reach_r32, reach_r16, reach_qf, reach_sf, reach_final, win}} sorted by win probability descending. data.champion: most likely winner. data.iterations: iterations run. meta.estimated: true. meta.conditioned_matches: completed matches locked in (played group results fixed, decided knockout ties locked).
Example: football_simulate_bracket() football_simulate_bracket(iterations=20000, seed=42)
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Optional RNG seed for reproducible output. | |
| iterations | No | Number of tournament simulations (clamped to 100..20000; ~10000 gives stable ±2% probabilities). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: the simulation is stochastic, iterations are clamped, probabilities are estimates, and completed matches are locked in via meta.conditioned_matches. It also explains reproducibility via the RNG seed, which 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?
The description is well-organized with a front-loaded summary, structured Args/Returns sections, and a compact example. Every sentence contributes useful information, and the formatting makes the tool's behavior easy to parse quickly.
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?
For a probabilistic simulation tool, the description covers the tournament structure, parameter constraints, state conditioning, return shape, and example calls. The output schema already exists, and the Returns section adds enough detail for an agent to understand what will come back.
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%, so the schema already documents both parameters. The description adds value with the recommendation that ~10000 iterations gives stable ±2% probabilities and provides concrete usage examples that clarify optionality and seeding.
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 uses a specific verb ('simulates') and a precise resource ('the full World Cup 2026'), and details the full scope: all 12 groups, knockout advancement, and a champion. This clearly differentiates it from siblings like football_simulate_group by covering the entire tournament rather than just one group.
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?
The intended use is strongly implied by the simulation scope and examples, but the description never explicitly states when to prefer this tool over alternatives such as football_simulate_group or football_knockout_path. It provides clear context but no explicit exclusions or routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_simulate_groupARead-onlyIdempotentInspect
Monte Carlo one group within the full 12-group qualification context.
Args: group: Group letter A-L (also accepts "Group A"). iterations: Number of simulations (clamped to 100..20000).
Returns: data.teams: Per-team position probabilities, p_auto_advance, p_best_third_advance, truthful combined p_advance, and avg_points. data.iterations: iterations actually run. meta.estimated: true. meta.conditioned_matches: completed matches locked in.
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | Group letter A-L (also accepts "Group A"). | |
| iterations | No | Number of simulations (clamped to 100..20000). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety bar is low, but the description adds real behavioral context: results are estimates (meta.estimated), completed matches are locked in (meta.conditioned_matches), and iterations are clamped to 100..20000. These traits are not derivable from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose in one sentence, then cleanly separated Args/Returns blocks. Slightly verbose in repeating schema text, but every line is dense and scannable with 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 only two parameters and an output schema present, the description is nearly complete; it even explains the semantics of meta.estimated and meta.conditioned_matches rather than leaving them opaque. The remaining gap is the lack of routing guidance relative to sibling simulation tools.
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 Args section restates the same two parameter descriptions verbatim ('Group letter A-L', 'clamped to 100..20000'). It adds no meaning 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+resource: a Monte Carlo simulation of one group within the 12-group qualification context. The scope ('one group' vs the full 12-group context) implicitly separates it from football_simulate_bracket and football_what_if, 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 the scope wording; there is no explicit 'use this when…' or 'use X instead for…' The agent must infer that per-group simulation is the alternative to the bracket-level sibling tool, and no prerequisites (e.g., needing group data loaded first) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_what_ifARead-onlyIdempotentInspect
Replay World Cup 2026 from a chosen stage, optionally flipping one real knockout result.
Keeps every real result played before replay_from and Monte-Carlos the
rest of the tournament from there. flip_winner_of makes one decided
knockout tie in the kept results go the other way first.
Args:
replay_from: Stage to re-simulate from: "group" (whole tournament, no
real results kept), "r32", "r16", "qf", "sf" or "final" (keeps every
result before the final and simulates only the final).
flip_winner_of: Optional tie to flip, as two FIFA codes or names joined
by a hyphen in any order (e.g. "ESP-FRA"). It must be a decided
knockout tie before replay_from.
iterations: Number of tournament simulations (clamped to 100..20000).
seed: Optional RNG seed for reproducible output.
Returns: data.teams: {code: {reach_r32, reach_r16, reach_qf, reach_sf, reach_final, win}} sorted by win probability descending. data.champion: most likely winner. data.iterations: iterations run. meta.mode: "what_if". meta.replay_from: the stage. meta.flipped: {tie: [code_a, code_b], winner: code} or null. meta.estimated: true.
Example: football_what_if(replay_from="qf") football_what_if(replay_from="final", flip_winner_of="ESP-FRA", seed=7)
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | Optional RNG seed for reproducible output. | |
| iterations | No | Number of tournament simulations (clamped to 100..20000). | |
| replay_from | No | Stage to re-simulate from: "group" (whole tournament, no real results kept), "r32", "r16", "qf", "sf" or "final" (keeps every result before the final and simulates only the final). | group |
| flip_winner_of | No | Optional tie to flip, as two FIFA codes or names joined by a hyphen in any order (e.g. "ESP-FRA"). It must be a decided knockout tie before ``replay_from``. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent and non-destructive, so the safety bar is low. The description still goes well beyond them: it discloses the hybrid mechanic (real results before replay_from are preserved, the remainder is Monte-Carlo simulated), the flip precondition ('must be a decided knockout tie before replay_from'), the iteration clamp of 100..20000, and seed-driven reproducibility.
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?
Front-loaded with the one-sentence purpose, then Args, Returns and Examples in a scannable order with no filler prose. The Returns block is somewhat redundant given a real output schema exists, which keeps it from a 5, but every line is legible and purposeful.
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?
For a 4-parameter, zero-required simulation tool with annotations and an output schema, the description covers the simulation contract, flip constraints, reproducibility via seed, iteration bounds, and result shape — more than an agent needs to invoke it correctly.
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%, so baseline is 3. The Args block largely restates the schema descriptions verbatim (replay_from stage meanings, flip_winner_of format, iterations clamping), adding little new semantics; the one genuinely additive detail is the 'any order' note on team ordering in flip_winner_of, which mirrors the schema anyway.
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 first sentence names a specific verb (replay) and resource (World Cup 2026 tournament) plus the distinctive what-if twist of flipping one knockout result, so an agent knows exactly what capability this is. It does not, however, contrast itself with close siblings such as football_simulate_bracket, football_simulate_group, or football_knockout_path, which is the only thing separating a 4 from a 5 here.
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?
The mechanics of when replay_from and flip_winner_of apply are explained in detail, and the two examples show realistic invocations. But there is no explicit routing guidance — nothing says to pick this over football_simulate_bracket when the agent wants a plain simulation, or over football_knockout_path when it just wants the real bracket.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
football_xg_modelBRead-onlyIdempotentInspect
Estimate a match's expected goals and win/draw/loss probabilities.
Args: home_team: First team, FIFA code or name (e.g. "ARG" or "Argentina"). away_team: Second team, FIFA code or name (e.g. "BRA" or "Brazil"). neutral: True for a neutral venue (no home advantage). World Cup default.
Returns: data: {expected_home_goals, expected_away_goals, home_win, draw, away_win}. meta.estimated: true.
| Name | Required | Description | Default |
|---|---|---|---|
| neutral | No | True for a neutral venue (no home advantage). World Cup default. | |
| away_team | Yes | Second team, FIFA code or name (e.g. "BRA" or "Brazil"). | |
| home_team | Yes | First team, FIFA code or name (e.g. "ARG" or "Argentina"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds that results include meta.estimated=true, but does not explain model limitations, assumptions, or when estimates may be unreliable.
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?
The description is structured and front-loaded, with purpose first and Args/Returns sections afterward. It has minor redundancy with the schema but no wasted prose.
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 and an output schema present, the description is sufficient to invoke the tool correctly and understand the returned fields. The main remaining gap is lack of sibling differentiation, which affects selection more than invocation.
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 description repeats the same parameter meanings and examples already present in the schema. It adds no meaningful semantics beyond what the schema provides, 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 states a specific action and output set: estimating expected goals and win/draw/loss probabilities for a match. It is clear what the tool does, but it does not distinguish itself from close siblings such as football_match_predictor or football_what_if.
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 gives no explicit guidance on when to use this tool versus alternatives like football_match_predictor. The note about neutral venue is parameter context, not usage guidance or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sportiq_healthARead-onlyIdempotentInspect
Report cache backend, per-adapter healthcheck, and quota status.
Returns:
HealthReport-shaped dict with cache_backend, cache_ok,
adapters (per-source ok/detail), and quotas.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| meta | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds useful context by specifying the report shape and the per-adapter detail, which goes beyond what the annotations alone convey. No contradictions exist.
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?
The description is compact and front-loaded with the core purpose, then provides a structured return summary. Every sentence adds value and there is no redundant or promotional text.
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 zero parameters, a present output schema, and annotations covering safety semantics, the description is complete for invoking this tool correctly. It names the key output fields and the overall report shape, which is sufficient for an agent to know what to expect.
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?
The tool takes zero parameters, and the baseline for no-parameter tools is 4. There is no parameter detail needed, and the description does not need to compensate for undocumented inputs.
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 uses the specific verb 'Report' and names three concrete resources: cache backend, per-adapter healthcheck, and quota status. It is clearly distinct from the sibling sports-data tools, as it targets system health rather than sport-specific content.
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?
The description clearly establishes that this tool is for health and quota reporting, and no sibling tool competes for that role. It does not explicitly state when not to use it, but the context is unambiguous given the tool's unique purpose.
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.
16 tool updates
v0.4.0- Changed
cricket_captain_recommendation1 field changed- changed
Input schema / properties / venue / descriptionPrevious value: -"Venue key/name. Required if match_id is absent."New value: +"Venue key/name (IPL ground, e.g. ``wankhede``). Required if match_id is absent."
- Changed
cricket_player_matchup2 fields changed- changed
Input schema / properties / player_a / descriptionPrevious value: -"Player ID or name for the first player."New value: +"CricAPI player ID for the first player (names are not resolved)." - changed
Input schema / properties / player_b / descriptionPrevious value: -"Player ID or name for the second player."New value: +"CricAPI player ID for the second player (names are not resolved)."
- Changed
f1_get_lap_times1 field changed- changed
Input schema / properties / driver_number / descriptionPrevious value: -"Driver's race number (e.g. 1 for Verstappen)."New value: +"Driver's race number (driver numbers change by season; use f1_get_drivers)."
- Changed
f1_get_sessions4 fields changed- changed
Input schema / properties / country / descriptionPrevious value: -"Optional country name to filter (e.g. \"Monaco\")."New value: +"Optional country name to filter (e.g. \"Netherlands\")." - added
Input schema / properties / latest_completedAdded value: +{ + "default": false, + "description": "When true, return only the single session that ended most recently (greatest date_end before now, UTC) — e.g. with session_name=\"Race\", the latest finished Grand Prix.", + "title": "Latest Completed", + "type": "boolean" +} - added
Input schema / properties / session_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional session name to keep, case-insensitive (e.g. \"Race\", \"Qualifying\", \"Sprint\").", + "title": "Session Name" +} - changed
Input schema / properties / year / descriptionPrevious value: -"Championship year (e.g. 2025)."New value: +"Championship year (e.g. 2026)."
- Changed
f1_get_standings1 field changed- changed
Input schema / properties / year / descriptionPrevious value: -"Championship year (e.g. 2025)."New value: +"Championship year (e.g. 2026)."
- Changed
f1_predict_pit_strategy2 fields changed- changed
Input schema / properties / driver_number / descriptionPrevious value: -"Driver's race number (e.g. 1 for Verstappen)."New value: +"Driver's race number (driver numbers change by season; use f1_get_drivers)." - changed
Input schema / properties / total_laps / descriptionPrevious value: -"Total race laps. If omitted, inferred from the highest observed lap_number in the fetched laps (correct for Monaco 78 / Spa 44), falling back to 57 when no laps are available. An explicit value always wins."New value: +"Total race laps. If omitted, estimated from the regulation minimum race distance (305 km; Monaco 260 km) over the circuit's lap length; INVALID_INPUT when the circuit is unknown. An explicit value always wins."
- Added
f1_simulate_championship - Changed
f1_tyre_degradation1 field changed- changed
Input schema / properties / compound / descriptionPrevious value: -"Tyre compound (SOFT, MEDIUM, HARD, INTER, WET)."New value: +"Tyre compound (SOFT, MEDIUM, HARD, INTER, WET; \"INTERMEDIATE\" = INTER)."
- Changed
football_find_value_bets1 field changed- changed
Input schema / properties / team / descriptionPrevious value: -"Optional team name to filter events (case-insensitive substring, matched against both sides). Omit to scan every WC 2026 odds event."New value: +"Optional FIFA code or team name to filter events (matched against both sides; an unrecognised value falls back to a case-insensitive substring match). Omit to scan every WC 2026 odds event."
- Changed
football_form_trends1 field changed- changed
Input schema / properties / team / descriptionPrevious value: -"Team name (e.g. \"Brazil\", \"Argentina\")."New value: +"FIFA code (e.g. ARG) or name (e.g. \"Argentina\", \"South Korea\")."
- Changed
football_get_squad1 field changed- changed
Input schema / properties / team / descriptionPrevious value: -"Team code or name (e.g. \"ARG\"). Without an API-Football key, the static seed serves an empty-but-valid squad (rosters are a follow-up)."New value: +"Team code or name (e.g. \"ARG\"). Live rosters need an API-Football key; without one the static seed serves an empty-but-valid squad (no rosters are bundled)."
- Changed
football_knockout_path1 field changed- changed
Input schema / properties / team / descriptionPrevious value: -"Team code (e.g. \"FRA\")."New value: +"FIFA code or name (e.g. \"FRA\" or \"France\")."
- Changed
football_match_predictor2 fields changed- changed
Input schema / properties / away_team / descriptionPrevious value: -"Second team code."New value: +"Second team, FIFA code or name." - changed
Input schema / properties / home_team / descriptionPrevious value: -"First team code."New value: +"First team, FIFA code or name (e.g. \"ESP\" or \"Spain\")."
- Changed
football_simulate_group1 field changed- changed
Input schema / properties / group / descriptionPrevious value: -"Group letter A-L."New value: +"Group letter A-L (also accepts \"Group A\")."
- Added
football_what_if - Changed
football_xg_model2 fields changed- changed
Input schema / properties / away_team / descriptionPrevious value: -"Second team code (e.g. \"BRA\")."New value: +"Second team, FIFA code or name (e.g. \"BRA\" or \"Brazil\")." - changed
Input schema / properties / home_team / descriptionPrevious value: -"First team code (e.g. \"ARG\")."New value: +"First team, FIFA code or name (e.g. \"ARG\" or \"Argentina\")."
44 tool updates
v0.3.1- First observed
cricket_build_dream11_team - First observed
cricket_captain_recommendation - First observed
cricket_differential_picks - First observed
cricket_find_value_bets - First observed
cricket_get_live_matches - First observed
cricket_get_live_odds - First observed
cricket_get_pitch_report - First observed
cricket_get_points_table - First observed
cricket_get_schedule - First observed
cricket_get_scorecard - First observed
cricket_get_squad - First observed
cricket_head_to_head - First observed
cricket_player_form_index - First observed
cricket_player_matchup - First observed
cross_sport_build_accumulator - First observed
f1_get_drivers - First observed
f1_get_lap_times - First observed
f1_get_race_results - First observed
f1_get_sessions - First observed
f1_get_standings - First observed
f1_get_weather - First observed
f1_head_to_head_pace - First observed
f1_predict_pit_strategy - First observed
f1_qualifying_analysis - First observed
f1_race_pace_compare - First observed
f1_tyre_degradation - First observed
f1_undercut_window - First observed
f1_weather_strategy_impact - First observed
football_build_accumulator - First observed
football_find_value_bets - First observed
football_form_trends - First observed
football_get_fixtures - First observed
football_get_groups - First observed
football_get_match_stats - First observed
football_get_odds - First observed
football_get_squad - First observed
football_get_standings - First observed
football_get_top_scorers - First observed
football_knockout_path - First observed
football_match_predictor - First observed
football_simulate_bracket - First observed
football_simulate_group - First observed
football_xg_model - First observed
sportiq_health
TDQS
Scored across 46 tools
Most tools are scoped by sport and action, but several clusters overlap meaningfully: f1_head_to_head_pace vs f1_race_pace_compare both compare two drivers' pace (the latter adding degradation, which f1_tyre_degradation also models), and football_xg_model vs football_match_predictor both output W/D/L probabilities. The four football tournament-simulation tools (simulate_group, simulate_bracket, knockout_path, what_if) are distinguishable but require careful reading of descriptions, and the fantasy trio (dream11_team, captain_recommendation, differential_picks) shares nearly identical inputs.
A predictable sport-prefixed convention runs throughout (football_*, cricket_*, f1_*, cross_sport_*), usually verb_noun like football_get_fixtures or cricket_build_dream11_team. A few outliers use noun-only forms (football_xg_model, f1_undercut_window, cricket_player_form_index, f1_weather_strategy_impact), but the prefixing keeps the set readable.
46 tools across four domains is heavy; per-sport sub-surfaces are reasonable, but the combined set is well past the 15-tool guideline. Low-value or stub entries (cricket_find_value_bets that always returns [], football_get_odds that is normally empty) inflate the count without adding capability.
Core lifecycle coverage exists per sport (fixtures, standings, squads, scorecards, sessions, results, simulations, odds). However several tools are effectively dead ends — cricket_find_value_bets always returns no bets, football_get_squad serves an empty seed without a key, and football_get_match_stats demands an opaque numeric team id with no key fallback — leaving agents without paths for real cricket betting edges or offline football stats.
Maintenance
Related MCP Connectors
Package intelligence MCP for AI agents — 22 tools, 19 ecosystems, AGPL SDK, free.
Free public MCP for AI agents — 193 tools, 44 workflows. No API key.
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for FIFA World Cup 2026 data: matches, teams, venues, city guides, fan zones, visa info, injuries, odds, standings, bracket, and historical matchups. 18 tools, zero external API dependencies.18227 npm34MIT
- AlicenseAqualityAmaintenance17 decision intelligence algorithms as MCP tools for AI agents. Bandits (UCB1, Thompson), LP/MIP solver (HiGHS), Monte Carlo simulation, Bayesian inference, graph analytics (PageRank, Louvain), genetic algorithms, CMA-ES, anomaly detection, time series forecasting, and more. All under 25ms, deterministic, zero LLM cost.1713MIT

Parlayofficial
AlicenseNot gradedqualityBmaintenanceRemote MCP server for prediction markets — search and compare live odds across Polymarket, Kalshi, and Limitless from Claude, ChatGPT, or Gemini. Six read-only tools, free tier available.6MIT- AlicenseAqualityCmaintenance29 MCP tools for IPL 2026, IPL historical (18 seasons), and Major League Cricket. Free, no API key.5767 npm2MIT