Skip to main content
Glama

Live football scores, fixtures and standings in your terminal and beside your coding agent, for the competition you follow: the World Cup, the Premier League, LALIGA, the Champions League and 12 more. Liga MX, Serie A, the Bundesliga, the Libertadores and the rest are in the table below. No API key, no signup, no account.

Try it

npx @claudinho/cli follow champions-league   # choose your competition once
npx @claudinho/cli today                     # today's matches, in your timezone
npx @claudinho/cli live                      # the matches in play right now

Claudinho needs Node.js 22 or later. That is the oldest line it runs on, not a security level: run a patched release of the Node 22 or 24 line.

Your league instead? follow premier-league, follow liga-mx, follow laliga: every alias is in Competitions. Add --lang es (or pt, fr) for Spanish, and pin your team with follow champions-league --team Arsenal.

Related MCP server: mcp-sports

Pick your setup

Start with the first row and add what you want. Every row but the MCP server needs the claudinho command from the first row. The plugin replaces the Claude Code statusline and the prompt hook: use the plugin or those two rows, not both.

You want

What it changes

Command

Scores in the terminal

installs the claudinho command; it keeps your choice and a cache on your machine (where)

npm i -g @claudinho/cli

The live score under your Claude Code prompt

Claude Code's statusline

claudinho init-statusline

The live score above your Claude Code prompt, a toast and a celebration on a goal, and a match pane

installs a Claude Code plugin

Claude Code plugin

Claude Code to know the live score when you ask it something

adds a prompt hook (the plugin does this too)

claudinho init-hook

The live score in Cursor's terminal agent (Cursor CLI)

Cursor CLI's statusline

claudinho init cursor

To ask your agent about football

adds an MCP server (a set of tools your agent can call)

MCP server

The statusline and the plugin's band read a local cache and never wait on the network. The plugin's match pane is different: it runs claudinho match <id>, which asks the data provider. Off-match, the prompt hook adds nothing to what the model reads.

Competitions

Nothing is followed until you choose one. claudinho follow <alias> saves your choice, and the commands, the statusline, the plugin and the MCP server follow it. Three things stay the World Cup's whatever you follow: claudinho team and the MCP tool get_team read its nations, and the MCP resource fixtures://{date} is its bundled schedule. claudinho team is refused when --competition or CLAUDINHO_COMPETITION chooses another competition. claudinho follow --list lists every alias with what it offers, claudinho follow shows your choice, and claudinho follow off forgets it.

Alias

Competition

Teams

Scores

Next

Standings

Bracket

Markets

world-cup

World Cup

nations

yes

yes

yes

yes

yes

euro

EURO

nations

yes

yes

yes

not yet

not yet

copa-america

Copa América

nations

yes

yes

yes

not yet

not yet

nations-league

UEFA Nations League

nations

yes

yes

yes

not yet

not yet

concacaf-nations-league

Concacaf Nations League

nations

yes

yes

yes

not yet

not yet

gold-cup

Gold Cup

nations

yes

yes

yes

not yet

not yet

premier-league

Premier League

clubs

yes

yes

yes

n/a

not yet

laliga

LALIGA

clubs

yes

yes

yes

n/a

not yet

serie-a

Serie A

clubs

yes

yes

yes

not yet

not yet

bundesliga

Bundesliga

clubs

yes

yes

yes

not yet

not yet

liga-mx

Liga MX

clubs

yes

yes

yes

not yet

not yet

liga-auf

Liga AUF Uruguaya

clubs

yes

yes

yes

not yet

not yet

champions-league

Champions League

clubs

yes

yes

yes

not yet

not yet

libertadores

Libertadores

clubs

yes

yes

yes

not yet

not yet

concacaf-champions-cup

Concacaf Champions Cup

clubs

yes

yes

n/a

not yet

not yet

club-world-cup

Club World Cup

clubs

yes

yes

yes

not yet

not yet

yes offered · not yet not offered yet · n/a the competition has no such thing (a league season with no knockout tie has no bracket; a knockout-only cup has no table).

One competition at a time. A pinned team belongs to its competition: pinning Arsenal in the Premier League does not follow its Champions League matches. Ask another competition for one command with --competition (claudinho --competition champions-league next Arsenal), or set CLAUDINHO_COMPETITION for a shell. Details: the CLI README.

Install

The terminal

npm i -g @claudinho/cli
claudinho follow champions-league --team Arsenal
claudinho today
claudinho next                 # your pinned team's next match, with a countdown
claudinho table
claudinho match <id>           # one match, with its goals and cards
LASK Linz 3–6 Liverpool
  Champions League
  League phase · Raiffeisen Arena (Linz), Linz, Austria
  FT · Kickoff Wed 16:45
  You'll never walk alone!

  22'  ⚽ Goal         LIV  Ronald Araújo
  24'  ⚽ Goal         LIV  Bradley Barcola
  37'  ⚽ Goal         LIV  Bradley Barcola
  51'  ⚽ Goal         LIV  Jeremie Frimpong
  63'  ⚽ Goal         LAS  Robert Ljubicic
  66'  ⚽ Goal         LIV  Bradley Barcola
  72'  ⚽ Goal         LIV  Lewis Koumas
  74'  ⚽ Goal         LAS  Florian Flecker
  77'  ⚽ Goal         LAS  Florian Flecker
  80'  🟨 Yellow card  LAS  Daniel Elfadli

Live data: ESPN
Not affiliated with FIFA, any confederation, league or club, or Anthropic.

This is a capture from Oct 14, 2026. Off the World Cup, match <id> finds a match from yesterday to 14 days ahead, so run it with a current id (claudinho today --json lists each match's id).

The commands, their options and their --json output: the CLI README. To remove it: claudinho follow off (it deletes the saved choice), then npm rm -g @claudinho/cli, then delete the cache folder (the CLI README says where it is).

Claude Code plugin

The plugin shows the live score (or the countdown to the next match) above your prompt, with the score in bold. A toast says what happened (⚽ GOAL! Liverpool · Ronald Araújo 22' · LASK Linz 0–1 Liverpool, or Full time · LASK Linz 3–6 Liverpool · Liverpool win). When your team scores, and when it wins or draws, Anthropic's Claude mascot celebrates in the band for a few seconds. With the toasts option set to all, it also celebrates any goal in a match that is not your team's. /claudinho match opens a pane with the goals and cards. The band, the toasts, the celebration and the pane speak English, Spanish, Portuguese or French (the plugin's language option). A few fixed words stay English; the plugin README lists them.

npm i -g @claudinho/cli
claudinho follow champions-league --team Arsenal   # the toasts and the mascot are for your pinned team by default
claudinho init plugin          # only if Claudinho's statusline or hook is in Claude Code's settings

claudinho init plugin removes, from Claude Code's settings, the statusline whose command is claudinho prompt and the prompt hook whose command is claudinho hook (the commands init claude, init-statusline and init-hook write by default), so the score does not show twice.

Then, in Claude Code in a terminal:

/plugin install claudinho --marketplace arturogarrido/claudinho

While a match is live, the plugin also puts the live score beside each prompt you send, so Claude knows it (from its last reading, when that reading is current and recent). Off-match it adds nothing, and the plugin's context option turns it off. The plugin reads everything from the installed CLI and never fetches anything itself. Options, the desktop app and the details: the plugin README. To get new versions on their own, turn on auto-update for the claudinho marketplace once (/plugin, the Marketplaces tab, Enable auto-update); Claude Code leaves it off by default for this marketplace. A new version then installs after a session starts, and loads in the next session you start or after /reload-plugins. To remove it: claude plugin uninstall claudinho@claudinho.

The CLI it needs. Everything above needs @claudinho/cli 0.12.0 or later. With 0.11.2 the plugin works in part: a toast is ⚽ and the hook's own English line for any score change, the celebration is a ball and a growing "GOAL!", the band's line is plain and English, the match pane says Nothing to show: the CLI's answer is not one this plugin reads., and no full time is said. The language option changes none of it. With a CLI older than 0.11.2 the band shows nothing and nothing toasts.

Claude Code without the plugin

npm i -g @claudinho/cli
claudinho init-statusline      # the live score under the prompt
claudinho init-hook            # optional: Claude knows the live score during a match

Or both at once, plus the MCP line to run: claudinho init claude. Each command backs up ~/.claude/settings.json first (to settings.json.claudinho.bak, once). Restart Claude Code to see it. To remove both: claudinho init plugin. It removes them when their commands are still claudinho prompt and claudinho hook, and keeps every other setting. Running a local build instead of the global command? init-statusline, init-hook and init-cursor-statusline take --command. From the checkout's root, after a build: node packages/cli/dist/index.js init-cursor-statusline --command "node \"$PWD/packages/cli/dist/index.js\" prompt".

Cursor CLI

Cursor CLI is Cursor's agent in the terminal. One command puts the live score in its statusline and prints the MCP config to paste:

npm i -g @claudinho/cli
claudinho init cursor

Restart your agent session to see it. export CLAUDINHO_CURSOR_META=auto adds a second line with the model and the context in use. Prefer to paste the config yourself? claudinho init cursor --print prints it. To remove it: delete the statusLine block from ~/.cursor/cli-config.json (the original is kept as cli-config.json.claudinho.bak). Cursor's prompt hook cannot pass the score to the model yet, so the score-aware hook is Claude Code only.

MCP server (any agent)

The MCP server gives your agent ten read-only tools, among them today's matches, live scores, a team's next match, standings, one match with its goals and cards, and a shareable card. It works in Claude Code, Cursor, Codex, Claude Desktop, Windsurf, Zed, VS Code, and any MCP client that runs a local (stdio) server.

claude mcp add claudinho -- npx -y @claudinho/mcp     # Claude Code
codex mcp add claudinho -- npx -y @claudinho/mcp      # Codex CLI

Most other clients, Cursor included (~/.cursor/mcp.json), take this config. Some (VS Code, Zed) put the same command and args under a key of their own: see your client's MCP docs.

{ "mcpServers": { "claudinho": { "command": "npx", "args": ["-y", "@claudinho/mcp"] } } }

Then ask mid-task. If you have not run claudinho follow, name the competition in your question.

The tools, the prompts and their fields: the MCP README.

What it does

  • Scores, fixtures, standings: today, live, next, table, match <id> with its goals and cards, and bracket for the World Cup. Kickoff times and days are in your timezone (--tz).

  • Four languages: English, Spanish, Portuguese and French (--lang), with a line of commentary on each match line (¡GOOOOL!) and a team's own rally cry when it has one (Mexico's "¿Y si sí?", Pumas' "¡Goya!", Arsenal's "COYG!"). A postponed or cancelled match gets neither. --flavor off turns it off.

  • Clubs and nations: a nation shows with its flag, a club by its name. No crests, kits or photos.

  • Shareable cards: claudinho share next --copy puts a plain-text card for the group chat on your clipboard.

  • Prediction-market odds: for World Cup matches, a "who's favored" line from Polymarket's public data, shown under today, match and on share cards only when a reliable market exists. Informational only, not betting advice. --no-markets hides it there; claudinho markets asks for the odds on purpose.

  • Honest about gaps: when the data provider sends something Claudinho cannot read, the commands and MCP tools that read it, and their share cards, say their data may be incomplete, instead of showing less as if it were all. The statusline and the hook do not.

What stays on your machine

No accounts, no telemetry, no analytics, no Claudinho server. Claudinho asks two public services for data, ESPN for scores and standings and Polymarket for World Cup market odds, with nothing about you attached. The CLI keeps your choice and a small cache on your machine (where); the MCP server writes nothing to disk. The init commands change only the settings file they name, after a one-time backup. Full policy: PRIVACY.md.

FAQ

Do I need an API key or an account? No.

Does it work offline? The World Cup's schedule ships with the package, so its fixtures work offline. Every other competition's schedule, and every live score, comes from the network.

Where does the data come from? Scores and standings from ESPN's public scoreboard (an answer from it says Live data: ESPN), market odds from Polymarket's public data. Rate limits are respected.

Why no crests, kits or player photos? Claudinho shows facts and emoji flags only (and, in the plugin's celebration, Anthropic's Claude mascot). A flag is a nation's, so a club shows by its name.

Flags show as boxed letters (CH, BA)? Some terminals (Warp, some Windows terminals) cannot draw flag emoji. Claudinho detects Warp and drops the flags: the statusline and bracket show 3-letter codes (MEX), and today, live, next, match, table, team and the hook show plain team names. Share cards keep their flags. Force it anywhere with CLAUDINHO_FLAGS=off, or keep the flags with CLAUDINHO_FLAGS=on.

Around the web

Coverage: LinuxLinks and SuperIsland's Live Football extension. Listed in the Official MCP Registry, Glama, MCP.so, cursor.directory and awesome-mcp-servers. The full record: PUBLIC_FOOTPRINT.md.

Smithery stopped accepting updates on October 17, 2026 and ends its accounts, API and CLI on October 31, so Claudinho no longer publishes a Claude Desktop bundle (.mcpb) there. A bundle installed from Smithery stays at the version it was installed with (0.11.1 or older) and gets no newer one: switch to npx -y @claudinho/mcp or the Claude Code plugin.

Why star?

Claudinho is a one-person fan project with no budget. If it earns a place in your terminal, a star helps other developers find it and puts new releases in your feed. Want to help build it? CONTRIBUTING.md has the layout, the dev loop and good first issues.

Security

Found a vulnerability? Please report it privately through GitHub's form, not a public issue. SECURITY.md has the process and the threat model.

License

MIT © 2026 Arturo Garrido.

Independent fan project. Not affiliated with FIFA, any confederation, league or club, or Anthropic.

Built while watching the games. #VibingLaVidaLoca ⚽

Available Tools

10 tools
get_bracketKnockout bracketA
Read-only

Knockout bracket from the Round of 32 through the final, with live scores overlaid. Group slots project from live standings once a group has started; winner slots need a confirmed FT result. Pass an optional stage (R32, R16, QF, SF, 3P, F) to filter one round. partial means the provider sent records that could not be used: the ties shown are the ones read, and may not be all of them. Falls back to structure-only when live data is unavailable. A league season with no knockout tie of its own (the Premier League, LaLiga) answers inapplicable: there is none to show; other club competitions answer unsupported (not offered yet).

NameRequiredDescriptionDefault
tzNoIANA timezone for kickoff times, e.g. America/Mexico_City
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
stageNoKnockout round to show (omit for the full bracket)
flavorNoCommentary flair: off, subtle, full (default: full)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition

Output Schema

NameRequiredDescription
viewYes
sourceNo
partialNoPresent when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss
degradedNo
competitionNoThe competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen
unknownTeamNoPresent (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole
unsupportedNoPresent (true) when this is not available for this competition yet; an empty result then means "unsupported", not "none found"
inapplicableNoPresent (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)
noCompetitionNoPresent (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)
rosterEvidenceNoWith unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)
betweenEditionsNoPresent when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play
rosterIncompleteNoPresent (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name
responseTruncatedNo
standingsDegradedNo
responseTruncationNo

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond readOnlyHint/openWorldHint: discloses that group slots project from live standings, winner slots require a confirmed FT, that 'partial' means unusable provider records and the shown ties may be incomplete, and that it falls back to structure-only when live data is unavailable. These are precisely the behavioral traits annotations cannot convey.

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

Conciseness4/5

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

Front-loads the core purpose and the stage filter before the edge-case states, and every sentence carries information. The final sentence is dense with two response states packed together, but nothing is filler.

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

Completeness5/5

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

With an output schema present, the description need not explain return values, and it still covers the degraded/live-unavailable fallback and the two terminal response states. For a 5-param, zero-required, read-only tool, 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.

Parameters3/5

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 description's stage explanation ('filter one round' vs full bracket) largely restates the schema's own enum description. It adds no detail for tz, lang, or flavor, and the competition fallback chain is already in the schema.

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

Purpose5/5

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

States a specific verb+resource (knockout bracket R32 through final) with the live-score overlay scope, which cleanly separates it from get_standings and get_today. An agent can tell what this returns and its span without opening the schema.

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

Usage Guidelines4/5

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

Explains the optional stage filter for a single round and documents the outcome states (inapplicable vs unsupported for league/club competitions with no knockout tie), which is genuine when-to-use guidance. It stops short of naming alternative sibling tools (e.g. get_standings) for the no-knockout case, so it is not a full routing rule.

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

get_liveLive matchesA
Read-only

Only matches in play right now, each with current score and minute; an empty list means nothing is in play only when the read was whole (neither partial nor degraded says otherwise). Off the World Cup, betweenEditions means the competition's edition has ended and the next has not started. partial means the provider sent records that could not be used: an empty list then means no match in play could be read, not that none is. Use during matches for in-play state; for a full day's schedule including upcoming and finished, use get_today. tz/lang/flavor affect formatting only.

NameRequiredDescriptionDefault
tzNoIANA timezone for kickoff times, e.g. America/Mexico_City
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
flavorNoCommentary flair: off, subtle, full (default: full)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition

Output Schema

NameRequiredDescription
countYes
sourceYes
matchesYes
partialNoPresent when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss
degradedYes
truncatedYes
competitionNoThe competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen
unknownTeamNoPresent (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole
unsupportedNoPresent (true) when this is not available for this competition yet; an empty result then means "unsupported", not "none found"
inapplicableNoPresent (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)
noCompetitionNoPresent (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)
rosterEvidenceNoWith unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)
betweenEditionsNoPresent when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play
rosterIncompleteNoPresent (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name
responseTruncatedNo
responseTruncationNo

TDQS

A4.7/5.0
Behavior5/5

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

Beyond readOnlyHint/openWorldHint, the description explains the semantics of an empty result under whole vs partial/degraded reads, what 'partial' means about provider records, and what 'betweenEditions' means off the World Cup. These are non-obvious behavioral states an agent could not infer from annotations or schema.

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

Conciseness3/5

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

It is front-loaded with purpose and contains no filler, but the parenthetical '(neither partial nor degraded says otherwise)' and the nested conditional about empty lists are hard to parse on first read. Density without clarity costs it here.

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

Completeness5/5

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

With an output schema present, return-shape details are the schema's job, and the description covers the decision-critical edge cases: empty results, partial reads, between-editions, and missing competition. Nothing an agent needs to call this correctly is absent.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3; the description adds that tz/lang/flavor 'affect formatting only', which is meaningful because it prevents the agent from treating them as filters. The competition parameter's fallback chain is handled in the schema rather than the description.

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

Purpose5/5

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

The opening clause states a specific verb and resource with scope: 'Only matches in play right now, each with current score and minute.' It also implicitly separates this from get_today by signaling that upcoming and finished matches are excluded.

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

Usage Guidelines5/5

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

It names the selection condition ('Use during matches for in-play state') and the explicit alternative with its trigger ('for a full day's schedule including upcoming and finished, use get_today'). It further routes the agent away from mismatched expectations by defining the noCompetition and betweenEditions outcomes.

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

get_market_signalPrediction-market signalA
Read-only

Read-only prediction-market signals for a match (by id), a team's current-or-next fixture, or a date (default: today). Returns market-implied percentages with attribution; complete:false means the provider read was incomplete, not that no signal exists; partial says the same of the fixture read behind the answer (the provider sent fixture records that could not be used). Shown only before and during a match: finished matches have no market read. Informational only: relay the numbers factually; do not add betting, trading, or 'value' advice, and do not invent links.

NameRequiredDescriptionDefault
tzNoIANA timezone for kickoff times, e.g. America/Mexico_City
dateNoDate as YYYY-MM-DD (default: today) for all that day's signals
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
teamNo3-letter team code, e.g. MEX; resolves to the team's in-play match when one is live, else their next fixture
flavorNoCommentary flair: off, subtle, full (default: full)
matchIdNoMatch id (most specific)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition

Output Schema

NameRequiredDescription
dateNo
teamNo
countNo
signalNo
matchIdNo
partialNoPresent when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss
signalsNo
completeNoFalse when the market provider did not complete every relevant read
degradedNo
truncatedNo
competitionNoThe competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen
unknownTeamNoPresent (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole
unsupportedNoPresent (true) when this is not available for this competition yet; an empty result then means "unsupported", not "none found"
inapplicableNoPresent (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)
noCompetitionNoPresent (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)
rosterEvidenceNoWith unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)
betweenEditionsNoPresent when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play
rosterIncompleteNoPresent (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name
informationalOnlyYes
responseTruncatedNo
responseTruncationNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare read-only and open-world, and the description adds materially more: the availability window, the meaning of complete:false (provider read incomplete, not absence of signal), and the meaning of partial (unusable fixture records). It also discloses the output-policy constraint about relay style and not inventing links, which no annotation conveys.

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

Conciseness4/5

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

Front-loaded with the resource and addressing modes, and every sentence carries information. The complete/partial explanation is compressed into a dense parenthetical that takes a second read, which costs a point but not much else is wasted.

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

Completeness5/5

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

Although an output schema exists, the description still clarifies the non-obvious flags (complete, partial) and the lifecycle limit on availability, which are the details most likely to cause a misread answer. Nothing an agent needs to call or interpret this tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so all seven parameters, the enum, and the date format are already documented. The description's '(by id)', 'current-or-next fixture', and '(default: today)' restate what the schema says rather than adding precedence rules or interaction behavior across the three addressing modes.

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

Purpose5/5

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

States a specific verb+resource ('prediction-market signals') and enumerates the three addressing modes (match id, team fixture, date). The resource is clearly distinct from every sibling (scores, standings, fixtures, snippets), so an agent can route to it without inspecting other schemas.

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

Usage Guidelines4/5

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

Gives concrete selection modes plus a real exclusion: 'Shown only before and during a match: finished matches have no market read.' It also frames the tool as informational-only with explicit prohibitions on betting/value advice. It stops short of naming sibling alternatives (e.g. get_match for finished matches), which keeps it below a 5.

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

get_matchMatch detailA
Read-only

One match by its id, with live score/minute overlaid when it's in play, and, for a match in play or finished, the provider's goals and cards it could read (minute, kind, side, the player when named; match.events in data), never a claim that the list is every goal. Off the World Cup the id is looked for from yesterday to 14 days ahead: window names the provider days searched when it was not there (not found in that span, not "no such match"), and degraded with a match means its state could not be refreshed. Optional prediction-market enrichment carries marketComplete; false means the read was incomplete, not that no signal exists. Get the id from get_today or get_live; to find a team's match without an id, use get_next_fixture. tz/lang/flavor affect formatting.

NameRequiredDescriptionDefault
idYesMatch id
tzNoIANA timezone for kickoff times, e.g. America/Mexico_City
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
flavorNoCommentary flair: off, subtle, full (default: full)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition

Output Schema

NameRequiredDescription
matchYes
servedNoThe shown fixtures whose record the provider's window held; a shown fixture not among them is the bundled schedule's row, its live state unconfirmed
sourceNo
windowNoOff the World Cup: a whole read of these provider days (YYYY-MM-DD, inclusive) did not hold the match
partialNoPresent when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss
degradedNo
competitionNoThe competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen
unknownTeamNoPresent (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole
unsupportedNoPresent (true) when this is not available for this competition yet; an empty result then means "unsupported", not "none found"
inapplicableNoPresent (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)
marketSignalNo
noCompetitionNoPresent (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)
marketCompleteNoFalse when optional market enrichment did not check this fixture
rosterEvidenceNoWith unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)
betweenEditionsNoPresent when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play
rosterIncompleteNoPresent (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name
responseTruncatedNo
responseTruncationNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint, yet the description discloses a great deal beyond them: the 14-day search window, that "not found in that span" is not "no such match," what a degraded match means, that the goals/cards list is never guaranteed complete, and that marketComplete=false signals an incomplete read rather than an absent signal. This is exactly the kind of provider-quirk disclosure the annotations cannot carry.

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

Conciseness3/5

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

Content mostly earns its place, but it is delivered as one dense run-on paragraph that welds purpose, provider caveats, window semantics, and parameter notes together with dashes and parentheticals. The core action is front-loaded, but the structure makes the caveat clauses hard to parse.

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

Completeness5/5

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

With an output schema present, the description is not obligated to explain return shape, yet it still clarifies the semantic caveats an agent needs (partial event lists, degraded state, marketComplete). Combined with the id-source routing, an agent has everything required to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so all five parameters, including competition's CLAUDINHO_COMPETITION and saved-choice fallback, are already documented. The description adds only a shorthand "tz/lang/flavor affect formatting" rather than new syntax or format detail, so the baseline 3 applies.

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

Purpose5/5

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

The opening clause names a specific resource and scope ("One match by its id") and immediately describes what is overlaid (live score/minute when in play) plus the goals/cards payload. It is plainly distinguishable from siblings like get_today, get_live, and get_next_fixture, which are all named.

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

Usage Guidelines5/5

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

It routes explicitly: "Get the id from get_today or get_live; to find a team's match without an id, use get_next_fixture." That covers both the input source and the alternative path for the adjacent use case, leaving nothing to inference.

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

get_next_fixtureNext fixture for a teamA
Read-only

A team's next match. World Cup: a nation's code or name (MEX, Mexico); a confirmed knockout tie is read from the live overlay, group fixtures from the bundled schedule. A club competition: a club's name or code (Arsenal, ARS), resolved against the competition's roster; its earliest match not yet finished in the 14 days ahead (in play included), with team (the club resolved), candidates when several teams match (no fixture is picked), horizon when none falls in that span, unknownTeam when neither the competition's table (read whole) nor its fixtures over those 14 days hold such a team, rosterIncomplete when the roster could not be read whole and the name (a code or a partial name) could not be resolved without it: ask again with the club's full name. partial means the provider sent records that could not be used: the answer is what was read, and no fixture then does not mean the team is out. With no team: the server's CLAUDINHO_TEAM, else the team the user pinned (claudinho follow --team ) when the request is for that team's competition; a tool error when there is neither.

NameRequiredDescriptionDefault
tzNoIANA timezone for kickoff times, e.g. America/Mexico_City
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
teamNoA team name or code: a club (Arsenal, ARS) or a nation (Mexico, MEX). Omit for the server's CLAUDINHO_TEAM, else the team the user pinned
flavorNoCommentary flair: off, subtle, full (default: full)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition

Output Schema

NameRequiredDescription
teamYes
seasonNo
sourceYes
fixtureYes
horizonNoOff the World Cup: a whole read of this many provider days ahead held no fixture for the team
partialNoPresent when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss
degradedYes
candidatesNoTwo or more teams matched the name: no fixture is picked; ask which one
competitionNoThe competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen
unknownTeamNoPresent (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole
unsupportedNoPresent (true) when this is not available for this competition yet; an empty result then means "unsupported", not "none found"
inapplicableNoPresent (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)
noCompetitionNoPresent (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)
rosterEvidenceNoWith unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)
betweenEditionsNoPresent when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play
rosterIncompleteNoPresent (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name
responseTruncatedNo
responseTruncationNo

TDQS

A4/5.0
Behavior5/5

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

Beyond the readOnlyHint/openWorldHint annotations, it discloses a large amount of behavioral detail: knockout ties come from a live overlay vs. bundled schedule, multiple team matches suppress fixture selection, and it enumerates outcome states (candidates, horizon, unknownTeam, rosterIncomplete, partial) plus a tool error when no team can be resolved. That is substantive context an agent cannot get from annotations or schema.

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

Conciseness3/5

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

The first sentence is front-loaded and the content mostly earns its place, but the remainder is a single dense paragraph of stacked clauses, semicolons and parentheticals that is hard to parse. Size is defensible; readability is not.

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

Completeness5/5

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

For a high-complexity, open-world lookup tool, the description covers resolution ambiguity, all fallback paths, degraded/partial data, and error states, and an output schema already documents return values. Nothing essential to calling it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds resolution semantics the schema does not: how a club name/code is resolved against a competition roster, how nations vs. clubs differ, and the precise ordering of the team and competition fallbacks.

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

Purpose4/5

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

The opening line 'A team's next match' states a specific resource and time scope, and the body clarifies that 'next' means earliest match not yet finished within 14 days. It never names the obvious siblings (get_today, get_live, get_match), so an agent must infer the boundary itself, which keeps this just 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.

Usage Guidelines3/5

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

The description implies usage through its fallback chain (no team -> CLAUDINHO_TEAM -> pinned team) rather than stating when to prefer this tool over get_live or get_today, which also surface adjacent matches. No when-not or alternative selection guidance is given.

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

get_share_snippetShareable match snippetA
Read-only

A polished, copy-pasteable card (plain text) for a match (matchId), a team's next fixture (team), one standings table (group: a table key, e.g. "A", "A1", "A-B" or "LEAGUE"), the knockout bracket (bracket: true), a date (default: today), or live matches (live: true). Returns the ready-to-paste snippet plus structured data: hand the snippet text to the user verbatim. marketComplete:false is stated inside the card as an incomplete optional read; partial (on any match card, live and date included) is stated inside the card too: the provider sent records that could not be used. Off the World Cup a next card names the club resolved, and an empty card says the span searched (horizon, window) or that the competition is between editions. No links; it carries a non-affiliation disclaimer, and any market line stays informational only.

NameRequiredDescriptionDefault
tzNoIANA timezone for kickoff times, e.g. America/Mexico_City
dateNoDate as YYYY-MM-DD (default: today)
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
liveNoSnapshot of matches in play right now
teamNoA team name or code for that team's next fixture: a club (Arsenal) or a nation (MEX)
groupNoTable key for a standings card: a group letter (A), or A1, A-B, LEAGUE
styleNosocial (default, full card) or compact (one line per match)
flavorNoCommentary flair: off, subtle, full (default: full)
bracketNoKnockout bracket card (use with optional knockoutStage)
matchIdNoMatch id (most specific)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition
knockoutStageNoFilter the bracket card to one round
includeHashtagNoInclude the #VibingLaVidaLoca tag (default true)
includeMarketsNoInclude the reliable market line when available (default true)
includeInstallLineNoInclude the "Try it: …" run cue (default true)

Output Schema

NameRequiredDescription
kindYes
teamNo
viewNo
countNo
groupNo
stageNo
styleNo
servedNoThe shown fixtures whose record the provider's window held; a shown fixture not among them is the bundled schedule's row, its live state unconfirmed
sourceNo
tablesNo
targetNo
windowNoOff the World Cup: a whole read of these provider days (YYYY-MM-DD, inclusive) did not hold the match
horizonNoOff the World Cup: a whole read of this many provider days ahead held no fixture for the team
matchesNo
partialNoPresent when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss
snippetNo
degradedNo
truncatedNo
candidatesNoA next card for a name two or more teams match: them, and no fixture is picked
competitionNoThe competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen
unknownTeamNoPresent (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole
unsupportedNoPresent (true) when this is not available for this competition yet; an empty result then means "unsupported", not "none found"
inapplicableNoPresent (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)
marketSignalsNo
noCompetitionNoPresent (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)
marketCompleteNoFalse when optional market enrichment did not check every relevant fixture
rosterEvidenceNoWith unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)
betweenEditionsNoPresent when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play
rosterIncompleteNoPresent (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name
informationalOnlyNo
responseTruncatedNo
responseTruncationNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds real context beyond that: marketComplete:false and partial records are surfaced inside the card as incomplete reads, empty cards state the searched span, no links are emitted, and a non-affiliation disclaimer plus informational-only market line are present. Much of the remainder describes card contents, which the output schema already covers, keeping 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.

Conciseness4/5

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

Purpose is front-loaded and each sentence carries real information about modes or return behavior, with little filler. The first sentence is a very long run-on list of modes that hurts scanability, which keeps it below a 5.

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

Completeness4/5

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

For a 15-parameter, zero-required tool with an output schema, the description covers every mode, the defaults implied by the schema, and the incomplete/partial/empty states an agent must narrate correctly. Remaining gaps (tz, style, flavor, include* flags) are fully specified in the schema, so nothing essential is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 15 parameters including tz, lang, style, flavor and the include* flags. The description adds only light reinforcement (group examples, bracket:true, live:true, date default today) rather than syntax or semantics the schema lacks, matching the baseline for full schema coverage.

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

Purpose4/5

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

The description states a specific verb+resource ('a polished, copy-pasteable card (plain text)') and enumerates the six modes it can produce (matchId, team, group, bracket, date, live), so an agent can tell it apart from raw-data siblings. It never names a sibling tool explicitly, 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.

Usage Guidelines3/5

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

Each mode is tied to a trigger parameter, which implies when each is used, and 'hand the snippet text to the user verbatim' is a usable instruction. However, there is no explicit contrast with get_match/get_today/get_standings, which return the same underlying data unformatted, so the agent must infer that this tool is the formatting path.

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

get_standingsStandingsA
Read-only

Live cumulative standings: omit group for every table, or pass one table's key: a group letter (A–L in the World Cup), A1 for a numbered group, A-B for group B of league A, LEAGUE for a league's single table. Each table that is not a lettered group carries a label (the provider's name) and its title shows the key in parentheses. Returns ranked rows (team, played, W/D/L, goal difference, points). incomplete:true means a table could not be read and the tables returned are not the whole competition; a table with partial is missing rows. Use get_today for fixtures/scores and get_next_fixture for one team. If unavailable, the World Cup returns its roster at zero; competitions without a compatible bundled roster return no tables. Both are flagged degraded.

NameRequiredDescriptionDefault
tzNoIANA timezone for kickoff times, e.g. America/Mexico_City
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
groupNoTable key: a group letter (A), or A1, A-B, LEAGUE (omit for all)
flavorNoCommentary flair: off, subtle, full (default: full)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition

Output Schema

NameRequiredDescription
sourceYes
tablesYes
degradedYes
incompleteNoPresent (true) when the provider sent a table that could not be read: the tables returned are not the whole competition
competitionNoThe competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen
noCompetitionNoPresent (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)
responseTruncatedNo
responseTruncationNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description does add real context beyond them: incomplete:true means a table could not be read and the result is not the whole competition, a table with partial is missing rows, and unavailable competitions return no tables or a zeroed World Cup roster with a degraded flag. That is useful but is largely about edge/return states rather than invocation behavior, so it sits mid-range rather than at the top.

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

Conciseness4/5

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

Front-loads the core purpose and the group-key rule, then degrades into sibling routing and edge-state flags, which is a sensible ordering. It is dense but mostly earns its words, with the label/title-in-parentheses sentence the weakest, since output structure is already covered by the output schema.

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

Completeness5/5

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

Covers the full decision surface for a five-parameter, zero-required tool: key formats, competition fallback chain, degraded/incomplete/partial outcomes, and sibling routing. Output schema exists, yet the agent still gets enough context to interpret the ranked rows and failure modes correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description elaborates the group key vocabulary (A–L in the World Cup, A1, A-B, LEAGUE) and notes the label/title convention, adding some meaning beyond the schema's terse "Table key: a group letter (A), or A1, A-B, LEAGUE", but tz, lang and flavor are left entirely to the schema.

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

Purpose5/5

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

Opens with a specific verb+resource ("Live cumulative standings") and immediately disambiguates scope from siblings by naming get_today and get_next_fixture as the tools for fixtures/scores and single-team lookups. An agent can tell what this returns (ranked table rows) without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit invocation rules: omit group for every table, or pass one table's key, with the accepted key forms enumerated. It also routes alternatives plainly ("Use get_today for fixtures/scores and get_next_fixture for one team"), so the choice between this and its siblings is fully determined.

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

get_teamResolve a teamA
Read-only

The World Cup roster: resolve a nation name or 3-letter code to its FIFA code, flag, and group. Fuzzy and forgiving: accepts "Mexico", "mex", "USA", "DR Congo", "Türkiye"/"Turkey", "Holland", etc. Useful for the 3-letter code get_market_signal needs. It knows no clubs: get_next_fixture and get_share_snippet resolve a club's name themselves. Returns the single confident match (team), plus candidates (matches) when the query is ambiguous (e.g. "south" → South Africa, South Korea). Offline: reads the bundled roster, never the network.

NameRequiredDescriptionDefault
queryYesTeam name or 3-letter code, e.g. "Mexico", "MEX", "DR Congo"

Output Schema

NameRequiredDescription
teamYes
countYes
queryYes
matchesYes
responseTruncatedNo
responseTruncationNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint, openWorldHint=false), so the description's remaining burden is behavioral detail, which it supplies: offline roster reads with no network access, fuzzy/alias acceptance, and the ambiguity contract (single confident 'team' plus 'matches' candidates when the query is loose, e.g. 'south'). That ambiguity behavior is not derivable from the annotations and materially affects how an agent consumes the result.

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

Conciseness4/5

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

Front-loaded with the core action and return payload, and every subsequent sentence carries routing, alias, or ambiguity information. The 'World Cup roster' framing is mild flourish, but the text stays dense and free of filler.

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

Completeness5/5

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

For a one-param resolver, the description covers purpose, routing to and away from siblings, input tolerance, ambiguity handling, and offline behavior. An output schema exists so return structure need not be spelled out, and the description still names the 'team' and 'matches' fields anyway, leaving no gap an agent would need.

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

Parameters4/5

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

Schema coverage is 100% for the single query param, so the baseline is 3. The description goes beyond the schema's three examples by enumerating aliases and fuzzy variants ('mex', 'Türkiye'/'Turkey', 'Holland'), which tells the agent the param is forgiving and need not be normalized — real meaning the schema does not convey.

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

Purpose5/5

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

States a specific verb and resource (resolve a nation name or 3-letter code) and names exactly what it returns: FIFA code, flag, and group. It also draws a hard boundary against siblings, noting that get_next_fixture and get_share_snippet resolve club names themselves, so an agent can pick the right resolver without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use ('Useful for the 3-letter code get_market_signal needs') tied to a named sibling, and an explicit when-not-to-use ('It knows no clubs'), naming the two tools that handle clubs instead. Both the positive and negative routing conditions are stated outright rather than implied.

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

get_todayToday's matchesA
Read-only

All fixtures for a date (default: today), with live score and minute overlaid on any match in play. Optional prediction-market enrichment carries marketComplete; false means the read was incomplete, not that no signal exists. Off the World Cup, betweenEditions means the competition's edition ended before that date. partial means the provider sent records that could not be used: on the World Cup a fixture may then show from the bundled schedule without its live state (the text counts them, and names no provider when none shown was served), and where no bundled schedule was merged, an empty day means no fixture could be read for it, not that none is scheduled. Use this for a whole day's card; for only in-play matches use get_live, for one team's match use get_next_fixture, for a single match's detail use get_match. Kickoffs render in tz; lang localizes the title, dates, status and stage words, the empty and outage sentences, attribution, and commentary (en/es/pt/fr); flavor sets commentary tone.

NameRequiredDescriptionDefault
tzNoIANA timezone for kickoff times, e.g. America/Mexico_City
dateNoDate as YYYY-MM-DD (default: today)
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
flavorNoCommentary flair: off, subtle, full (default: full)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition

Output Schema

NameRequiredDescription
dateYes
countYes
servedNoThe shown fixtures whose record the provider's window held; a shown fixture not among them is the bundled schedule's row, its live state unconfirmed
sourceYes
matchesYes
partialNoPresent when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss
degradedYes
truncatedYes
competitionNoThe competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen
unknownTeamNoPresent (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole
unsupportedNoPresent (true) when this is not available for this competition yet; an empty result then means "unsupported", not "none found"
inapplicableNoPresent (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)
marketSignalsNo
noCompetitionNoPresent (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)
marketCompleteNoFalse when optional market enrichment did not check every relevant fixture
rosterEvidenceNoWith unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)
betweenEditionsNoPresent when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play
rosterIncompleteNoPresent (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name
responseTruncatedNo
responseTruncationNo

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld, so the description carries real weight and delivers: live score and minute overlay, marketComplete=false meaning an incomplete read rather than absent signal, betweenEditions semantics, and a candid account of 'partial' where bundled-schedule fixtures can appear without live state and an empty day is ambiguous rather than confirmed empty. This is exactly the kind of degraded-data disclosure an agent needs to avoid misreporting.

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

Conciseness3/5

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

The purpose is front-loaded, but the body is a dense run-on chain of parentheticals and semicolon-clause caveats that is hard to parse on a single read. Most sentences do convey load-bearing edge-case information, but the packaging is heavier than it needs to be.

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

Completeness5/5

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

With an output schema present, return-value explanation is unnecessary, and the description covers the remaining risk surface: empty-day ambiguity, degraded reads, parameter effects and sibling routing. An agent can call this correctly and interpret an empty or partial result without guessing.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already spells out tz, date format, lang locales and affected surfaces, and the competition alias/default chain. The description largely restates those (tz renders kickoffs, lang localizes, flavor sets tone) rather than adding new constraints, so per the high-coverage baseline a 3 is appropriate.

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

Purpose4/5

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

The opening clause states a concrete scope — all fixtures for a date, defaulting to today — and the routing sentence explicitly separates it from get_live, get_next_fixture and get_match. It loses a point because the purpose is entangled with live-score and market-enrichment detail, and the title ('Today's matches') is narrower than the actual scope (any date).

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

Usage Guidelines5/5

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

It gives an explicit selection rule ('Use this for a whole day's card') plus three named alternatives each paired with the condition that selects them (in-play only, one team, single match detail). No inference is required to pick the right sibling.

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

list_competitionsSupported competitionsA
Read-only

The competitions Claudinho answers for, one per row: the alias every other tool's competition argument takes, the name, the teams (nation or club), the kind (league or cup), and what each surface is (scores, next, standings, bracket, markets: offered, not-offered-yet, or not-applicable), plus current: the competition this request is for. Offline: reads the supported table, never the network. Whether an edition is in season is not listed here; the reads say so (betweenEditions).

NameRequiredDescriptionDefault
langNoLocale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)
competitionNoThe competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition

Output Schema

NameRequiredDescription
currentYesThe competition this request is for (its competition argument, else the server's, else the user's saved choice), as every other tool's data carries it; null when nothing is chosen
competitionsYes
responseTruncatedNo
responseTruncationNo

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so 'Offline: reads the supported table, never the network' largely restates the closed-world hint. The genuinely additive context is the boundary that season status comes from the read tools, not here; the column inventory is covered by the output schema.

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

Conciseness4/5

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

Purpose is front-loaded in the opening clause and every later clause adds column or behavioral detail rather than filler. However, the first sentence is an overlong run-on with stacked parentheticals that hurts scanability.

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

Completeness4/5

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

An output schema exists, so the column enumeration is partly redundant, but the description still supplies the offline guarantee and the betweenEditions routing that the schema and annotations do not. Nothing critical is missing for a reference-listing tool with only two optional params.

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

Parameters3/5

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

Schema description coverage is 100%, so both lang and competition are already documented, including the alias format and fallback behavior. The description only echoes the alias concept and says nothing about lang, so it adds no meaning beyond the schema.

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

Purpose5/5

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

States a specific resource (the supported competitions Claudinho answers for) and enumerates the exact columns returned, including the alias other tools consume. That 'alias every other tool's competition argument takes' framing sharply distinguishes it from the get_* siblings, which are per-competition reads.

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

Usage Guidelines4/5

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

It implies when to reach for it (to discover the alias other tools need) and explicitly routes one question elsewhere: 'Whether an edition is in season is not listed here; the reads say so (betweenEditions).' No explicit when-not for calling it, and no mention of calling it before other tools, so not a full 5.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.12.0
    • Changedget_bracket11 fields changed
      • addedInput schema / properties / competition
        Added value: +{
        +  "description": "The competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition",
        +  "type": "string"
        +}
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"New value: +"Locale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)"
      • addedOutput schema / properties / betweenEditions
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play",
        +  "properties": {
        +    "ended": {
        +      "type": "string"
        +    },
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ended"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / competition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "alias": {
        +          "type": "string"
        +        },
        +        "chosenBy": {
        +          "enum": [
        +            "flag",
        +            "env",
        +            "saved"
        +          ],
        +          "type": "string"
        +        },
        +        "experimental": {
        +          "const": true,
        +          "type": "boolean"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name",
        +        "chosenBy"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen"
        +}
      • addedOutput schema / properties / inapplicable
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / noCompetition
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / partial
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss",
        +  "properties": {
        +    "omitted": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / rosterEvidence
        Added value: +{
        +  "description": "With unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)",
        +  "enum": [
        +    "table",
        +    "bundle"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / rosterIncomplete
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unknownTeam
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unsupported
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this is not available for this competition yet; an empty result then means \"unsupported\", not \"none found\"",
        +  "type": "boolean"
        +}
    • Changedget_live14 fields changed
      • addedInput schema / properties / competition
        Added value: +{
        +  "description": "The competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition",
        +  "type": "string"
        +}
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"New value: +"Locale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)"
      • addedOutput schema / properties / betweenEditions
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play",
        +  "properties": {
        +    "ended": {
        +      "type": "string"
        +    },
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ended"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / competition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "alias": {
        +          "type": "string"
        +        },
        +        "chosenBy": {
        +          "enum": [
        +            "flag",
        +            "env",
        +            "saved"
        +          ],
        +          "type": "string"
        +        },
        +        "experimental": {
        +          "const": true,
        +          "type": "boolean"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name",
        +        "chosenBy"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen"
        +}
      • addedOutput schema / properties / inapplicable
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / matches / items / properties / events
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "added": {
        +        "type": "number"
        +      },
        +      "minute": {
        +        "type": "number"
        +      },
        +      "player": {
        +        "type": "string"
        +      },
        +      "side": {
        +        "type": "string"
        +      },
        +      "teamCode": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / matches / items / properties / home / properties / id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / matches / items / properties / stageLabel
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / noCompetition
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / partial
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss",
        +  "properties": {
        +    "omitted": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / rosterEvidence
        Added value: +{
        +  "description": "With unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)",
        +  "enum": [
        +    "table",
        +    "bundle"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / rosterIncomplete
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unknownTeam
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unsupported
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this is not available for this competition yet; an empty result then means \"unsupported\", not \"none found\"",
        +  "type": "boolean"
        +}
    • Changedget_market_signal12 fields changed
      • addedInput schema / properties / competition
        Added value: +{
        +  "description": "The competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition",
        +  "type": "string"
        +}
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"New value: +"Locale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)"
      • changedInput schema / properties / team / description
        Previous value: -"3-letter team code, e.g. MEX — resolves to the team's in-play match when one is live, else their next fixture"New value: +"3-letter team code, e.g. MEX; resolves to the team's in-play match when one is live, else their next fixture"
      • addedOutput schema / properties / betweenEditions
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play",
        +  "properties": {
        +    "ended": {
        +      "type": "string"
        +    },
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ended"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / competition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "alias": {
        +          "type": "string"
        +        },
        +        "chosenBy": {
        +          "enum": [
        +            "flag",
        +            "env",
        +            "saved"
        +          ],
        +          "type": "string"
        +        },
        +        "experimental": {
        +          "const": true,
        +          "type": "boolean"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name",
        +        "chosenBy"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen"
        +}
      • addedOutput schema / properties / inapplicable
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / noCompetition
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / partial
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss",
        +  "properties": {
        +    "omitted": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / rosterEvidence
        Added value: +{
        +  "description": "With unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)",
        +  "enum": [
        +    "table",
        +    "bundle"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / rosterIncomplete
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unknownTeam
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unsupported
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this is not available for this competition yet; an empty result then means \"unsupported\", not \"none found\"",
        +  "type": "boolean"
        +}
    • Changedget_match14 fields changed
      • addedInput schema / properties / competition
        Added value: +{
        +  "description": "The competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition",
        +  "type": "string"
        +}
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"New value: +"Locale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)"
      • addedOutput schema / properties / betweenEditions
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play",
        +  "properties": {
        +    "ended": {
        +      "type": "string"
        +    },
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ended"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / competition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "alias": {
        +          "type": "string"
        +        },
        +        "chosenBy": {
        +          "enum": [
        +            "flag",
        +            "env",
        +            "saved"
        +          ],
        +          "type": "string"
        +        },
        +        "experimental": {
        +          "const": true,
        +          "type": "boolean"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name",
        +        "chosenBy"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen"
        +}
      • addedOutput schema / properties / inapplicable
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / match / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "away": {
        -        "$ref": "#/properties/match/anyOf/0/properties/home"
        -      },
        -      "group": {
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "home": {
        -        "additionalProperties": true,
        -        "properties": {
        -          "code": {
        -            "type": "string"
        -          },
        -          "flag": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "kickoff": {
        -        "type": "string"
        -      },
        -      "minute": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "score": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": true,
        -            "properties": {
        -              "away": {
        -                "type": "number"
        -              },
        -              "home": {
        -                "type": "number"
        -              }
        -            },
        -            "type": "object"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "shootout": {
        -        "$ref": "#/properties/match/anyOf/0/properties/score/anyOf/0"
        -      },
        -      "stage": {
        -        "type": "string"
        -      },
        -      "status": {
        -        "type": "string"
        -      },
        -      "venue": {
        -        "type": "string"
        -      },
        -      "winnerCode": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "away": {
        +        "$ref": "#/properties/match/anyOf/0/properties/home"
        +      },
        +      "events": {
        +        "items": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "added": {
        +              "type": "number"
        +            },
        +            "minute": {
        +              "type": "number"
        +            },
        +            "player": {
        +              "type": "string"
        +            },
        +            "side": {
        +              "type": "string"
        +            },
        +            "teamCode": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "group": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "home": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "code": {
        +            "type": "string"
        +          },
        +          "flag": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "kickoff": {
        +        "type": "string"
        +      },
        +      "minute": {
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "score": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "properties": {
        +              "away": {
        +                "type": "number"
        +              },
        +              "home": {
        +                "type": "number"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "shootout": {
        +        "$ref": "#/properties/match/anyOf/0/properties/score/anyOf/0"
        +      },
        +      "stage": {
        +        "type": "string"
        +      },
        +      "stageLabel": {
        +        "type": "string"
        +      },
        +      "status": {
        +        "type": "string"
        +      },
        +      "venue": {
        +        "type": "string"
        +      },
        +      "winnerCode": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / noCompetition
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / partial
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss",
        +  "properties": {
        +    "omitted": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / rosterEvidence
        Added value: +{
        +  "description": "With unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)",
        +  "enum": [
        +    "table",
        +    "bundle"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / rosterIncomplete
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / served
        Added value: +{
        +  "description": "The shown fixtures whose record the provider's window held; a shown fixture not among them is the bundled schedule's row, its live state unconfirmed",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / unknownTeam
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unsupported
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this is not available for this competition yet; an empty result then means \"unsupported\", not \"none found\"",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / window
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Off the World Cup: a whole read of these provider days (YYYY-MM-DD, inclusive) did not hold the match",
        +  "properties": {
        +    "from": {
        +      "type": "string"
        +    },
        +    "to": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to"
        +  ],
        +  "type": "object"
        +}
    • Changedget_next_fixture22 fields changed
      • addedInput schema / properties / competition
        Added value: +{
        +  "description": "The competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition",
        +  "type": "string"
        +}
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"New value: +"Locale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)"
      • changedInput schema / properties / team / description
        Previous value: -"3-letter team code, e.g. MEX"New value: +"A team name or code: a club (Arsenal, ARS) or a nation (Mexico, MEX). Omit for the server's CLAUDINHO_TEAM, else the team the user pinned"
      • addedInput schema / properties / team / maxLength
        Added value: +40
      • addedInput schema / properties / team / minLength
        Added value: +1
      • removedInput schema / properties / team / pattern
        Removed value: -"^[A-Za-z]{3}$"
      • removedInput schema / required
        Removed value: -[
        -  "team"
        -]
      • addedOutput schema / properties / betweenEditions
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play",
        +  "properties": {
        +    "ended": {
        +      "type": "string"
        +    },
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ended"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / candidates
        Added value: +{
        +  "description": "Two or more teams matched the name: no fixture is picked; ask which one",
        +  "items": {
        +    "$ref": "#/properties/team/anyOf/1"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / competition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "alias": {
        +          "type": "string"
        +        },
        +        "chosenBy": {
        +          "enum": [
        +            "flag",
        +            "env",
        +            "saved"
        +          ],
        +          "type": "string"
        +        },
        +        "experimental": {
        +          "const": true,
        +          "type": "boolean"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name",
        +        "chosenBy"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen"
        +}
      • changedOutput schema / properties / fixture / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": true,
        -    "properties": {
        -      "away": {
        -        "$ref": "#/properties/fixture/anyOf/0/properties/home"
        -      },
        -      "group": {
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "home": {
        -        "additionalProperties": true,
        -        "properties": {
        -          "code": {
        -            "type": "string"
        -          },
        -          "flag": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "kickoff": {
        -        "type": "string"
        -      },
        -      "minute": {
        -        "type": [
        -          "number",
        -          "null"
        -        ]
        -      },
        -      "score": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": true,
        -            "properties": {
        -              "away": {
        -                "type": "number"
        -              },
        -              "home": {
        -                "type": "number"
        -              }
        -            },
        -            "type": "object"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "shootout": {
        -        "$ref": "#/properties/fixture/anyOf/0/properties/score/anyOf/0"
        -      },
        -      "stage": {
        -        "type": "string"
        -      },
        -      "status": {
        -        "type": "string"
        -      },
        -      "venue": {
        -        "type": "string"
        -      },
        -      "winnerCode": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "away": {
        +        "$ref": "#/properties/team/anyOf/1"
        +      },
        +      "events": {
        +        "items": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "added": {
        +              "type": "number"
        +            },
        +            "minute": {
        +              "type": "number"
        +            },
        +            "player": {
        +              "type": "string"
        +            },
        +            "side": {
        +              "type": "string"
        +            },
        +            "teamCode": {
        +              "type": "string"
        +            },
        +            "type": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "group": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "home": {
        +        "$ref": "#/properties/team/anyOf/1"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "kickoff": {
        +        "type": "string"
        +      },
        +      "minute": {
        +        "type": [
        +          "number",
        +          "null"
        +        ]
        +      },
        +      "score": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": true,
        +            "properties": {
        +              "away": {
        +                "type": "number"
        +              },
        +              "home": {
        +                "type": "number"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "shootout": {
        +        "$ref": "#/properties/fixture/anyOf/0/properties/score/anyOf/0"
        +      },
        +      "stage": {
        +        "type": "string"
        +      },
        +      "stageLabel": {
        +        "type": "string"
        +      },
        +      "status": {
        +        "type": "string"
        +      },
        +      "venue": {
        +        "type": "string"
        +      },
        +      "winnerCode": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / horizon
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Off the World Cup: a whole read of this many provider days ahead held no fixture for the team",
        +  "properties": {
        +    "days": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "days"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / inapplicable
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / noCompetition
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / partial
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss",
        +  "properties": {
        +    "omitted": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / rosterEvidence
        Added value: +{
        +  "description": "With unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)",
        +  "enum": [
        +    "table",
        +    "bundle"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / rosterIncomplete
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / season
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {},
        +  "type": "object"
        +}
      • addedOutput schema / properties / team / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "flag": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / team / type
        Removed value: -"string"
      • addedOutput schema / properties / unknownTeam
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unsupported
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this is not available for this competition yet; an empty result then means \"unsupported\", not \"none found\"",
        +  "type": "boolean"
        +}
    • Changedget_share_snippet30 fields changed
      • addedInput schema / properties / competition
        Added value: +{
        +  "description": "The competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition",
        +  "type": "string"
        +}
      • changedInput schema / properties / group / description
        Previous value: -"Group letter A–L for a standings card, e.g. A"New value: +"Table key for a standings card: a group letter (A), or A1, A-B, LEAGUE"
      • changedInput schema / properties / group / pattern
        Previous value: -"^[A-La-l]$"New value: +"^[A-Za-z0-9-]{1,12}$"
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"New value: +"Locale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)"
      • changedInput schema / properties / team / description
        Previous value: -"3-letter team code for that team's next fixture, e.g. MEX"New value: +"A team name or code for that team's next fixture: a club (Arsenal) or a nation (MEX)"
      • addedInput schema / properties / team / maxLength
        Added value: +40
      • addedInput schema / properties / team / minLength
        Added value: +1
      • removedInput schema / properties / team / pattern
        Removed value: -"^[A-Za-z]{3}$"
      • addedOutput schema / properties / betweenEditions
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play",
        +  "properties": {
        +    "ended": {
        +      "type": "string"
        +    },
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ended"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / candidates
        Added value: +{
        +  "description": "A next card for a name two or more teams match: them, and no fixture is picked",
        +  "items": {
        +    "$ref": "#/properties/team/anyOf/1"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / competition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "alias": {
        +          "type": "string"
        +        },
        +        "chosenBy": {
        +          "enum": [
        +            "flag",
        +            "env",
        +            "saved"
        +          ],
        +          "type": "string"
        +        },
        +        "experimental": {
        +          "const": true,
        +          "type": "boolean"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name",
        +        "chosenBy"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen"
        +}
      • addedOutput schema / properties / horizon
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Off the World Cup: a whole read of this many provider days ahead held no fixture for the team",
        +  "properties": {
        +    "days": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "days"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / inapplicable
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / matches / items / properties / away / $ref
        Previous value: -"#/properties/matches/items/properties/home"New value: +"#/properties/team/anyOf/1"
      • addedOutput schema / properties / matches / items / properties / events
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "added": {
        +        "type": "number"
        +      },
        +      "minute": {
        +        "type": "number"
        +      },
        +      "player": {
        +        "type": "string"
        +      },
        +      "side": {
        +        "type": "string"
        +      },
        +      "teamCode": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / matches / items / properties / home / $ref
        Added value: +"#/properties/team/anyOf/1"
      • removedOutput schema / properties / matches / items / properties / home / additionalProperties
        Removed value: -true
      • removedOutput schema / properties / matches / items / properties / home / properties
        Removed value: -{
        -  "code": {
        -    "type": "string"
        -  },
        -  "flag": {
        -    "type": "string"
        -  },
        -  "name": {
        -    "type": "string"
        -  }
        -}
      • removedOutput schema / properties / matches / items / properties / home / type
        Removed value: -"object"
      • addedOutput schema / properties / matches / items / properties / stageLabel
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / noCompetition
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / partial
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss",
        +  "properties": {
        +    "omitted": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / rosterEvidence
        Added value: +{
        +  "description": "With unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)",
        +  "enum": [
        +    "table",
        +    "bundle"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / rosterIncomplete
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / served
        Added value: +{
        +  "description": "The shown fixtures whose record the provider's window held; a shown fixture not among them is the bundled schedule's row, its live state unconfirmed",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / team / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "properties": {
        +      "code": {
        +        "type": "string"
        +      },
        +      "flag": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / team / type
        Removed value: -"string"
      • addedOutput schema / properties / unknownTeam
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unsupported
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this is not available for this competition yet; an empty result then means \"unsupported\", not \"none found\"",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / window
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Off the World Cup: a whole read of these provider days (YYYY-MM-DD, inclusive) did not hold the match",
        +  "properties": {
        +    "from": {
        +      "type": "string"
        +    },
        +    "to": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "to"
        +  ],
        +  "type": "object"
        +}
    • Changedget_standings7 fields changed
      • addedInput schema / properties / competition
        Added value: +{
        +  "description": "The competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition",
        +  "type": "string"
        +}
      • changedInput schema / properties / group / description
        Previous value: -"Group letter A–L (omit for all)"New value: +"Table key: a group letter (A), or A1, A-B, LEAGUE (omit for all)"
      • changedInput schema / properties / group / pattern
        Previous value: -"^[A-La-l]$"New value: +"^[A-Za-z0-9-]{1,12}$"
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"New value: +"Locale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)"
      • addedOutput schema / properties / competition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "alias": {
        +          "type": "string"
        +        },
        +        "chosenBy": {
        +          "enum": [
        +            "flag",
        +            "env",
        +            "saved"
        +          ],
        +          "type": "string"
        +        },
        +        "experimental": {
        +          "const": true,
        +          "type": "boolean"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name",
        +        "chosenBy"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen"
        +}
      • addedOutput schema / properties / incomplete
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the provider sent a table that could not be read: the tables returned are not the whole competition",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / noCompetition
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)",
        +  "type": "boolean"
        +}
    • Changedget_today15 fields changed
      • addedInput schema / properties / competition
        Added value: +{
        +  "description": "The competition: an alias such as premier-league, or an ESPN slug such as eng.1 (list_competitions lists the aliases). Without it: the server's CLAUDINHO_COMPETITION, else the user's saved choice (claudinho follow); with none, the answer is noCompetition",
        +  "type": "string"
        +}
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"New value: +"Locale for dates, list titles, match status and stage words, a match timeline's kind words (Goal, Yellow card…), the empty and outage sentences, provider attribution, and commentary: en, es, pt, fr (the market copy, a few notes and the disclaimer stay English; other locales fall back to en)"
      • addedOutput schema / properties / betweenEditions
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the competition is between editions: the edition named by label ended on ended (the provider's calendar day, YYYY-MM-DD, the season end it states), and nothing in the read is scheduled or in play",
        +  "properties": {
        +    "ended": {
        +      "type": "string"
        +    },
        +    "label": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "ended"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / competition
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": true,
        +      "properties": {
        +        "alias": {
        +          "type": "string"
        +        },
        +        "chosenBy": {
        +          "enum": [
        +            "flag",
        +            "env",
        +            "saved"
        +          ],
        +          "type": "string"
        +        },
        +        "experimental": {
        +          "const": true,
        +          "type": "boolean"
        +        },
        +        "name": {
        +          "type": "string"
        +        },
        +        "slug": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "slug",
        +        "name",
        +        "chosenBy"
        +      ],
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The competition this answer is for: its ESPN slug, its alias, its name, where the choice came from (flag: the competition argument; env: the server's CLAUDINHO_COMPETITION; saved: the user's saved choice, claudinho follow), and experimental for a slug the supported table does not hold; null with noCompetition when nothing is chosen"
        +}
      • addedOutput schema / properties / inapplicable
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this competition has no such thing at all (a league season with no knockout tie has no knockout tree)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / matches / items / properties / events
        Added value: +{
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "added": {
        +        "type": "number"
        +      },
        +      "minute": {
        +        "type": "number"
        +      },
        +      "player": {
        +        "type": "string"
        +      },
        +      "side": {
        +        "type": "string"
        +      },
        +      "teamCode": {
        +        "type": "string"
        +      },
        +      "type": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / matches / items / properties / home / properties / id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / matches / items / properties / stageLabel
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / noCompetition
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when no competition is chosen (no competition argument, no server CLAUDINHO_COMPETITION, no saved choice): nothing was read, competition is null, and the text says what to do (pass competition, or the user runs claudinho follow <alias>)",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / partial
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present when the provider sent records that could not be used: what is returned is what was read, and may not be the whole answer (absence is not elimination). omitted is how many provider records were left out, when known; they may have lain outside what was asked for, so the count is a bound, not a loss",
        +  "properties": {
        +    "omitted": {
        +      "exclusiveMinimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / rosterEvidence
        Added value: +{
        +  "description": "With unknownTeam: the evidence it rests on, the competition's table and span (table) or the World Cup's bundled nations (bundle)",
        +  "enum": [
        +    "table",
        +    "bundle"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / rosterIncomplete
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the competition's roster could not be read whole and the name could not be resolved without it (no match, or only by a code or a partial name); not an outage: ask with the club's full name",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / served
        Added value: +{
        +  "description": "The shown fixtures whose record the provider's window held; a shown fixture not among them is the bundled schedule's row, its live state unconfirmed",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / unknownTeam
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when the roster the competition has holds no team by that name: the bundled nations on the World Cup; the table read whole and the next 14 days' fixtures elsewhere (a claim about that evidence, not the whole competition: a club out in a qualifying round is in no table). Never stated when the table or the span could not be read whole",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / unsupported
        Added value: +{
        +  "const": true,
        +  "description": "Present (true) when this is not available for this competition yet; an empty result then means \"unsupported\", not \"none found\"",
        +  "type": "boolean"
        +}
    • Addedlist_competitions
  2. 9 tool updatesv0.10.0
    • Changedget_bracket2 fields changed
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_live4 fields changed
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "degraded",
        -  "source",
        -  "count",
        -  "matches"
        -]New value: +[
        +  "degraded",
        +  "source",
        +  "count",
        +  "truncated",
        +  "matches"
        +]
    • Changedget_market_signal5 fields changed
      • addedOutput schema / properties / complete
        Added value: +{
        +  "description": "False when the market provider did not complete every relevant read",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / count
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "type": "boolean"
        +}
    • Changedget_match3 fields changed
      • addedOutput schema / properties / marketComplete
        Added value: +{
        +  "description": "False when optional market enrichment did not check this fixture",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_next_fixture2 fields changed
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_share_snippet5 fields changed
      • addedOutput schema / properties / count
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / marketComplete
        Added value: +{
        +  "description": "False when optional market enrichment did not check every relevant fixture",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "type": "boolean"
        +}
    • Changedget_standings2 fields changed
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_team2 fields changed
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
    • Changedget_today5 fields changed
      • addedOutput schema / properties / marketComplete
        Added value: +{
        +  "description": "False when optional market enrichment did not check every relevant fixture",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncated
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / responseTruncation
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "date",
        -  "degraded",
        -  "source",
        -  "count",
        -  "matches"
        -]New value: +[
        +  "date",
        +  "degraded",
        +  "source",
        +  "count",
        +  "truncated",
        +  "matches"
        +]
  3. 9 tool updatesv0.9.0
    • Changedget_bracket2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for formatting: en, es, pt, fr (other locales fall back to en)"New value: +"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "degraded": {
        +      "type": "boolean"
        +    },
        +    "source": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "standingsDegraded": {
        +      "type": "boolean"
        +    },
        +    "view": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {},
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "view"
        +  ],
        +  "type": "object"
        +}
    • Changedget_live2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for formatting: en, es, pt, fr (other locales fall back to en)"New value: +"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "count": {
        +      "type": "number"
        +    },
        +    "degraded": {
        +      "type": "boolean"
        +    },
        +    "matches": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "away": {
        +            "$ref": "#/properties/matches/items/properties/home"
        +          },
        +          "group": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "home": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "code": {
        +                "type": "string"
        +              },
        +              "flag": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "kickoff": {
        +            "type": "string"
        +          },
        +          "minute": {
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "score": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": true,
        +                "properties": {
        +                  "away": {
        +                    "type": "number"
        +                  },
        +                  "home": {
        +                    "type": "number"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "shootout": {
        +            "$ref": "#/properties/matches/items/properties/score/anyOf/0"
        +          },
        +          "stage": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "venue": {
        +            "type": "string"
        +          },
        +          "winnerCode": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "source": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "degraded",
        +    "source",
        +    "count",
        +    "matches"
        +  ],
        +  "type": "object"
        +}
    • Changedget_market_signal2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for formatting: en, es, pt, fr (other locales fall back to en)"New value: +"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "date": {
        +      "type": "string"
        +    },
        +    "degraded": {
        +      "type": "boolean"
        +    },
        +    "informationalOnly": {
        +      "type": "boolean"
        +    },
        +    "matchId": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "signal": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {},
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "signals": {
        +      "items": {
        +        "$ref": "#/properties/signal/anyOf/0"
        +      },
        +      "type": "array"
        +    },
        +    "team": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "informationalOnly"
        +  ],
        +  "type": "object"
        +}
    • Changedget_match2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for formatting: en, es, pt, fr (other locales fall back to en)"New value: +"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "degraded": {
        +      "type": "boolean"
        +    },
        +    "marketSignal": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {},
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "match": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {
        +            "away": {
        +              "$ref": "#/properties/match/anyOf/0/properties/home"
        +            },
        +            "group": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "home": {
        +              "additionalProperties": true,
        +              "properties": {
        +                "code": {
        +                  "type": "string"
        +                },
        +                "flag": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "kickoff": {
        +              "type": "string"
        +            },
        +            "minute": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "score": {
        +              "anyOf": [
        +                {
        +                  "additionalProperties": true,
        +                  "properties": {
        +                    "away": {
        +                      "type": "number"
        +                    },
        +                    "home": {
        +                      "type": "number"
        +                    }
        +                  },
        +                  "type": "object"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "shootout": {
        +              "$ref": "#/properties/match/anyOf/0/properties/score/anyOf/0"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "venue": {
        +              "type": "string"
        +            },
        +            "winnerCode": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "match"
        +  ],
        +  "type": "object"
        +}
    • Changedget_next_fixture2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for formatting: en, es, pt, fr (other locales fall back to en)"New value: +"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "degraded": {
        +      "type": "boolean"
        +    },
        +    "fixture": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {
        +            "away": {
        +              "$ref": "#/properties/fixture/anyOf/0/properties/home"
        +            },
        +            "group": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "home": {
        +              "additionalProperties": true,
        +              "properties": {
        +                "code": {
        +                  "type": "string"
        +                },
        +                "flag": {
        +                  "type": "string"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "id": {
        +              "type": "string"
        +            },
        +            "kickoff": {
        +              "type": "string"
        +            },
        +            "minute": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "score": {
        +              "anyOf": [
        +                {
        +                  "additionalProperties": true,
        +                  "properties": {
        +                    "away": {
        +                      "type": "number"
        +                    },
        +                    "home": {
        +                      "type": "number"
        +                    }
        +                  },
        +                  "type": "object"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "shootout": {
        +              "$ref": "#/properties/fixture/anyOf/0/properties/score/anyOf/0"
        +            },
        +            "stage": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": "string"
        +            },
        +            "venue": {
        +              "type": "string"
        +            },
        +            "winnerCode": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "team": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "team",
        +    "fixture",
        +    "degraded",
        +    "source"
        +  ],
        +  "type": "object"
        +}
    • Changedget_share_snippet2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for formatting: en, es, pt, fr (other locales fall back to en)"New value: +"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "degraded": {
        +      "type": "boolean"
        +    },
        +    "group": {
        +      "type": "string"
        +    },
        +    "informationalOnly": {
        +      "type": "boolean"
        +    },
        +    "kind": {
        +      "type": "string"
        +    },
        +    "marketSignals": {
        +      "additionalProperties": {
        +        "$ref": "#/properties/tables/anyOf/0"
        +      },
        +      "type": "object"
        +    },
        +    "matches": {
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "away": {
        +            "$ref": "#/properties/matches/items/properties/home"
        +          },
        +          "group": {
        +            "type": [
        +              "string",
        +              "null"
        +            ]
        +          },
        +          "home": {
        +            "additionalProperties": true,
        +            "properties": {
        +              "code": {
        +                "type": "string"
        +              },
        +              "flag": {
        +                "type": "string"
        +              },
        +              "name": {
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "kickoff": {
        +            "type": "string"
        +          },
        +          "minute": {
        +            "type": [
        +              "number",
        +              "null"
        +            ]
        +          },
        +          "score": {
        +            "anyOf": [
        +              {
        +                "additionalProperties": true,
        +                "properties": {
        +                  "away": {
        +                    "type": "number"
        +                  },
        +                  "home": {
        +                    "type": "number"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              {
        +                "type": "null"
        +              }
        +            ]
        +          },
        +          "shootout": {
        +            "$ref": "#/properties/matches/items/properties/score/anyOf/0"
        +          },
        +          "stage": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "venue": {
        +            "type": "string"
        +          },
        +          "winnerCode": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "snippet": {
        +      "type": "string"
        +    },
        +    "source": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "stage": {
        +      "type": "string"
        +    },
        +    "style": {
        +      "type": "string"
        +    },
        +    "tables": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {},
        +          "type": "object"
        +        },
        +        {
        +          "items": {
        +            "$ref": "#/properties/tables/anyOf/0"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "target": {
        +      "type": "string"
        +    },
        +    "team": {
        +      "type": "string"
        +    },
        +    "view": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/properties/tables/anyOf/0"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "kind"
        +  ],
        +  "type": "object"
        +}
    • Changedget_standings2 fields changed
      • changedInput schema / properties / lang / description
        Previous value: -"Locale for formatting: en, es, pt, fr (other locales fall back to en)"New value: +"Locale for dates, provider attribution, and commentary: en, es, pt, fr (the summary scaffold stays English; other locales fall back to en)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "degraded": {
        +      "type": "boolean"
        +    },
        +    "source": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "tables": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": true,
        +          "properties": {},
        +          "type": "object"
        +        },
        +        {
        +          "items": {
        +            "$ref": "#/properties/tables/anyOf/0"
        +          },
        +          "type": "array"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "required": [
        +    "degraded",
        +    "source",
        +    "tables"
        +  ],
        +  "type": "object"
        +}
    • Addedget_team
    • Addedget_today
  4. 1 tool updatev0.8.15
    • Removedget_today
  5. 2 tool updatesv0.8.4
    • Addedget_bracket
    • Changedget_share_snippet2 fields changed
      • addedInput schema / properties / bracket
        Added value: +{
        +  "description": "Knockout bracket card (use with optional knockoutStage)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / knockoutStage
        Added value: +{
        +  "description": "Filter the bracket card to one round",
        +  "enum": [
        +    "R32",
        +    "R16",
        +    "QF",
        +    "SF",
        +    "3P",
        +    "F"
        +  ],
        +  "type": "string"
        +}
  6. 1 tool updatev0.5.0
    • Changedget_share_snippet1 field changed
      • addedInput schema / properties / group
        Added value: +{
        +  "description": "Group letter A–L for a standings card, e.g. A",
        +  "pattern": "^[A-La-l]$",
        +  "type": "string"
        +}
  7. 1 tool update
    • Changedget_market_signal1 field changed
      • changedInput schema / properties / team / description
        Previous value: -"3-letter team code for that team's next fixture, e.g. MEX"New value: +"3-letter team code, e.g. MEX — resolves to the team's in-play match when one is live, else their next fixture"
  8. 7 tool updatesv0.1.0
    • First observedget_live
    • First observedget_market_signal
    • First observedget_match
    • First observedget_next_fixture
    • First observedget_share_snippet
    • First observedget_standings
    • First observedget_today

TDQS

A4.2/5.0

Scored across 10 tools

Disambiguation4/5

Each tool targets a distinct access pattern (whole day, in-play only, single match, one team's next, table, bracket, market, card, roster, competitions), and descriptions explicitly cross-reference the right sibling ("for only in-play matches use get_live", "for a single match's detail use get_match"). The one soft overlap is get_share_snippet, whose date/live/team/matchId modes re-run the same queries as get_today, get_live, get_next_fixture and get_match — differing only in output form, which an agent could occasionally misselect.

Naming Consistency5/5

Nine tools use a clean get_<resource> pattern and the tenth, list_competitions, is the correct verb for an enumeration. No case mixing, no vague verbs like process or handle.

Tool Count5/5

Ten tools for a football data server is well within the sweet spot, and each maps to a distinct surface (fixtures, live, match, standings, bracket, next fixture, markets, share card, roster, competitions). Nothing looks redundant enough to drop.

Completeness4/5

Coverage is broad: fixtures by date, live state, match detail with events, standings, knockout bracket, market signals, plus supporting roster/competition discovery. The main gap is historical per-team access — get_next_fixture yields only one team's next match, and there is no way to list a team's past results, full schedule, or head-to-head, which agents will likely want.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP 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.
    18
    188 npm
    34
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Wraps TheSportsDB API to enable AI agents to query sports data through natural language.
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables querying FIFA World Cup player and team statistics for 2010, 2014, 2018, and 2022 through natural language, providing tools for top scorers, player comparisons, team summaries, and more via a Claude-powered CLI.
    -
  • F
    license
    A
    quality
    D
    maintenance
    MCP server exposing live 2026 FIFA World Cup group standings and Round-of-32 bracket, with confidence classification and stale fallback.
    2
    -