io.github.christianclaudio/espn
This MCP server provides AI agents read-only access to live and historical ESPN sports data across games, teams, and news via 33 tools.
Scores & schedules: fetch scoreboards by date/week/season type (including postseason like Super Bowl/NBA Finals), team season schedules, and league calendars/events.
Game analysis: pull full game summaries with betting lines, matchup predictor, momentum, and injuries; play-by-play; live situation (down/distance/red zone); win probability curves; and FPI/BPI power index.
Betting & predictions: get sportsbook odds (spreads, totals, moneylines), consensus lines, futures markets, and predictive win percentages.
Standings & rankings: retrieve division/conference standings with records and streaks, plus Top 25 polls (AP, Coaches, CFP).
League data: access transactions (trades, signings, waivers), statistical leaderboards by athlete and team, draft results, and league group hierarchies.
Teams: list teams, get team detail (venue, record, next event), rosters with injuries and coaches, depth charts, and team/opponent statistics.
Athletes: search by name for IDs, then fetch bio (draft, college, measurements), season/career stats, game logs, situational splits, overview with fantasy notes, and per-game boxscores.
News: retrieve recent headlines, injury updates, and roster moves per sport/league.
Coverage: supports football (NFL/NCAAF), basketball (NBA/WNBA/NCAAB), baseball (MLB), hockey (NHL), and soccer (EPL, MLS, UCL, La Liga, Serie A, Bundesliga, Ligue 1), plus golf and MMA scoreboards.
Deployment: runs via uvx, pip, or Docker over stdio or authenticated Streamable HTTP, with domain profiles (full/games/teams/news/readonly) and optional tool search.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@io.github.christianclaudio/espnshow me live scores and odds for tonight's NBA games"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🏈 mcp-server-espn
Enterprise-grade Model Context Protocol (MCP) server for live and historical sports analytics, consensus betting odds, and predictions via ESPN.
Equips AI agents with real-time sports intelligence, live win probabilities, in-depth boxscore statistics, roster hierarchies, and matchup analytics.
⚠️ Disclaimers & Fair Use Notice
Community Project Disclaimermcp-server-espn is an independent open-source community project. It is not affiliated with, sponsored by, endorsed by, or supported by ESPN Inc. or The Walt Disney Company. "ESPN" is a trademark of ESPN Inc. All data provided via ESPN's public REST endpoints is intended for educational, research, and personal non-commercial use.
Related MCP server: Sports Betting MCP
💡 Why This Exists
Autonomous sports analysis requires high-velocity, structured, and resilient data feeds:
Live Game State & Win Probability: Real-time game events (turnovers, scoring plays, pitching changes) shift momentum and expected outcomes dynamically.
Key Player Injuries & Depth Chart Swaps: An in-game injury or substitution fundamentally alters team efficiency and tactical matchups.
Consensus Odds & Predictive Models: Aggregating consensus sportsbook lines (DraftKings, Caesars, ESPN BET) alongside predictive metrics (FPI, BPI) powers deep statistical game evaluations.
mcp-server-espn provides a unified, hardened Model Context Protocol interface directly to ESPN's public sports data endpoints.
🏟️ System Architecture
graph TD
Client["AI Agent / MCP Client<br>(Antigravity, Claude, Codex, Cortex)"]
Gateway["Root FastMCP Gateway (espn-mcp)<br>(stdio / Streamable HTTP)"]
ParentMW["Parent Middleware Pipeline<br>(ParentAuditMiddleware & ReadOnlyGateMiddleware)"]
GamesSub["Sub-Server: espn-games<br>(games_* | GamesDomainGuard)"]
TeamsSub["Sub-Server: espn-teams<br>(teams_* | TeamsDomainGuard)"]
NewsSub["Sub-Server: espn-news<br>(news_* | Resources)"]
ClientHandler["Hardened ESPN AsyncClient<br>(Connection Pool & 429 Jitter Backoff)"]
ESPN["ESPN Public REST CDN<br>(https://site.web.api.espn.com)"]
Client <-->|"JSON-RPC (tools/list, tools/call)"| Gateway
Gateway --> ParentMW
ParentMW --> GamesSub
ParentMW --> TeamsSub
ParentMW --> NewsSub
GamesSub & TeamsSub & NewsSub <-->|"API Methods"| ClientHandler
ClientHandler <-->|"HTTPS REST Mirror"| ESPN🚀 FastMCP 4 Server Composition
mcp-server-espn implements canonical FastMCP 4 Server Composition via root.mount(..., namespace="..."):
Domain Sub-Servers: Partitioned into
espn-games(games_*),espn-teams(teams_*), andespn-news(news_*).Hierarchical Middleware:
Parent:
ParentAuditMiddleware(timing logs, audit trails, and secret scrubbing) andReadOnlyGateMiddleware(fail-closed read-only enforcement).Child:
GamesDomainGuardMiddleware(query limit validation <= 100) andTeamsDomainGuardMiddleware(team and athlete identifier validation).
Focused Profiles: Run lightweight surfaces via
--profile full|games|teams|news|readonly(ESPN_MCP_PROFILE):full(default): All 33 domain tools and resources mounted.games: Scores, summaries, schedules, standings, rankings, transactions, league leaders, draft, live play-by-play, situations, odds, probabilities, predictor, calendar, futures, power index (20 tools).teams: Rosters, depth charts, player stats, athlete profiles, bio, stats, gamelog, splits, search, list teams, team detail, team statistics (12 tools).news: League news and reference resources (1 tool).readonly: Read-only enforcement across all routes.
Opt-In Tool Search: Preserves standard flat
tools/listby default for seamless client compatibility, while enabling search transforms via--enable-tool-search(ESPN_MCP_ENABLE_TOOL_SEARCH): BM25 ranking for natural-language queries by default (search_toolstakes aquery), or regex patterns with--tool-search-backend regex(ESPN_MCP_TOOL_SEARCH_BACKEND=regex;search_toolstakes apattern).
📈 Sports Intelligence Workflows
Workflow 1: Live In-Game Win Probability & Situation Tracking
Poll Active Games: Agent calls
games_get_scoreboard(sport="football", league="nfl")to identify close games in the 2nd half.Fetch In-Game Situation & Win Probability: Call
games_get_game_situation(sport="football", league="nfl", event_id="401872947")andgames_get_win_probabilities(sport="football", league="nfl", event_id="401872947")to inspect down/distance, red zone state, and live win expectancy curve.Inspect Play-by-Play: Call
games_get_play_by_play(sport="football", league="nfl", event_id="401872947")for drive-by-drive sequencing and scoring event logs.
Workflow 2: Athlete Deep Dive & Fantasy Valuation
Bio & Career Context: Call
teams_get_athlete_bio(sport="football", league="nfl", athlete_id="12483")to retrieve draft capital, college pedigree, and physical metrics.Recent Gamelog & Splits: Pull
teams_get_athlete_gamelogandteams_get_athlete_splitsto analyze performance trends against specific defensive schemes and venue conditions.League-Wide Leaderboard Standing: Call
games_get_leaders_by_athlete(sport="football", league="nfl", category="passing", sort="yards")to evaluate percentile rankings.
🏟️ Supported Sports & Leagues Reference Matrix
The server supports canonical sport/league slug pairs and auto-normalizes popular shortcuts:
Sport Slug | League Slug | Recognized Shortcuts / Aliases | Common Display Name |
|
|
| National Football League |
|
|
| NCAA College Football |
|
|
| National Basketball Association |
|
|
| NCAA Men's College Basketball |
|
|
| NCAA Women's Basketball |
|
|
| Women's National Basketball Association |
|
|
| Major League Baseball |
|
|
| National Hockey League |
|
|
| English Premier League |
|
|
| Major League Soccer |
|
|
| UEFA Champions League |
|
|
| Spanish La Liga |
|
|
| Italian Serie A |
|
|
| German Bundesliga |
|
|
| French Ligue 1 |
📊 Tool Suite (33 Domain Tools)
All tools implement explicit MCP 2.0 annotations (readOnlyHint=True, idempotentHint=True):
Domain | Tool | Parameters | Description |
Games |
|
| Final scores and results for any date ( |
Games |
|
| Consensus betting lines, matchup predictor win %, ATS, scoring plays, drives, leaders, momentum. |
Games |
|
| Season schedule with historical game results and scores: the regular season by default, postseason games with |
Games |
|
| Division, conference, and overall league standings, win-loss records, games back, and win percentages. |
Games |
|
| Top 25 national polls and rankings (AP Top 25, Coaches Poll, College Football Playoff). |
Games |
|
| League-wide transactions, roster trades, waivers, signings, and releases. |
Games |
|
| Statistical leaderboards across players in a league. |
Games |
|
| Team statistical rankings and leaderboards. |
Games |
|
| League conference, division, and structural group hierarchies. |
Games |
|
| League-wide calendar of scheduled events, optionally filtered by date. |
Games |
|
| League draft rounds, team selections, and pick results. |
Games |
|
| Live ticker scoreboard header data across games for a sport and league. |
Games |
|
| Sportsbook consensus and provider odds (spreads, totals, moneylines). |
Games |
|
| Play-by-play sequence, clock, scoring, and drive events. |
Games |
|
| Real-time in-game situation (down, distance, yardline, possession, red zone). |
Games |
|
| Live and historical win probability curves across game progression. |
Games |
|
| Pre-game and in-game matchup predictor and projection metrics. |
Games |
|
| League schedule calendar and active event dates across a season. |
Games |
|
| Season futures betting markets (championship odds, win totals). |
Games |
|
| Team power index (FPI / BPI) ratings and efficiency metrics. |
Teams |
|
| Global search for athletes and teams by name/keyword ( |
Teams |
|
| Directory of all franchises/teams in a specified league with IDs, names, and logos. |
Teams |
|
| Team detail overview, venue, record, standings summary, and upcoming scheduled event. |
Teams |
|
| Comprehensive team and opponent statistical category splits (passing, rushing, etc.). |
Teams |
|
| Full active roster grouped by position, coach info, jersey numbers, and injury status. |
Teams |
|
| Positional starter/backup hierarchy (QB1, QB2, etc.) to model injury substitution impacts. |
Teams |
|
| Boxscore statistics for individual athletes across game categories. |
Teams |
|
| Athlete biographical info, season/career stats, game logs, next game, and rotowire notes. |
Teams |
|
| Detailed athlete background, draft history, birth details, college pedigree. |
Teams |
|
| Full seasonal and career category statistics for an athlete. |
Teams |
|
| Game-by-game performance log for an athlete across a season. |
Teams |
|
| Situational statistical splits (home/away, turf/grass, monthly, vs opponents). |
News |
|
| Recent news headlines, injury designations, and breaking roster analysis. |
🏃 Quickstart & Installation
1. Run Directly via uvx (Zero Install)
Console scripts in [project.scripts] both call espn_mcp.server:main: espn-mcp (used below) and mcp-server-espn. Install examples stay unpinned. To freeze a release, pin the version from Releases.
uvx --from mcp-server-espn espn-mcpAfter an upgrade, reload the MCP host so the live process start time is after the new binary mtime (stale process ≠ new package).
2. Install via pip or uv
# Using pip
pip install mcp-server-espn
# Using uv
uv add mcp-server-espn3. Run via Docker
docker run --rm -i ghcr.io/christianclaudio/mcp-server-espn:latest🎛️ Engine Configuration
Variable | CLI Flag | Default | Description |
| — |
| Target ESPN REST CDN base URL (bypasses Akamai TLS filter) |
| — |
| HTTP request timeout in seconds |
| — | unset | Shared bearer token required on HTTP transports (stdio ignores it) |
| — | unset |
|
| — |
| Maximum retry attempts with jittered exponential backoff |
| — |
| Restrict server strictly to read-only inspection tools |
|
|
| Domain sub-server profile: |
|
|
| Replace flat tool catalog with dynamic search transform ( |
|
|
| Tool Search backend: |
🎮 Client Integration Guides
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"],
"env": {
"ESPN_TIMEOUT_SECONDS": "20.0"
}
}
}
}For Claude Code CLI:
claude mcp add espn -- uvx --from mcp-server-espn espn-mcpAdd to .agents/mcp_config.json or ~/.gemini/config/mcp_config.json:
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"],
"env": {
"ESPN_TIMEOUT_SECONDS": "20.0"
},
"lazy": true
}
}
}Add to ~/.snowflake/cortex/mcp.json:
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"],
"env": {
"ESPN_TIMEOUT_SECONDS": "20.0"
},
"lazy": true
}
}
}Add to .cursor/mcp.json:
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"]
}
}
}Add to cline_mcp_settings.json or .vscode/settings.json:
{
"mcpServers": {
"espn": {
"command": "uvx",
"args": ["--from", "mcp-server-espn", "espn-mcp"]
}
}
}Launch the FastMCP server over modern Streamable HTTP:
uvx --from mcp-server-espn espn-mcp --transport streamable-http --host 127.0.0.1 --port 8000Connect Streamable HTTP clients to http://127.0.0.1:8000/mcp (FastMCP's default Streamable HTTP path).
In the default (stateful) HTTP mode, a session idle for 30 minutes expires: its next request gets HTTP 404 and the client must start a new session. Change this with FastMCP's session_idle_timeout (on http_app()) or FASTMCP_HTTP_SESSION_IDLE_TIMEOUT (seconds, or none to never expire); see the FastMCP 4.1.0 release and #5229.
HTTP authentication. Set ESPN_MCP_AUTH_TOKEN to require Authorization: Bearer <token> on every HTTP request; a missing or wrong token gets 401. The token is stripped, and a blank value counts as unset. It is attached when the server is built, so espn-mcp, fastmcp run and an ASGI host mounting mcp.http_app() all enforce it. stdio never uses it.
With no token, espn-mcp refuses an HTTP bind to any host other than 127.0.0.1, ::1 or localhost and exits with code 2. Set the token, bind to localhost, or set ESPN_MCP_ALLOW_UNAUTHENTICATED_BIND=1 to accept an unauthenticated public bind. Other entry points get the token but not the localhost check: fastmcp run and http_app() do not go through espn-mcp's main(), so a bind to 0.0.0.0 with no token there is not refused and serves without authentication. The host or its process manager owns the bind address, so set ESPN_MCP_AUTH_TOKEN there.
To serve the image over HTTP, pass the token from your shell or an env file (never a fixed value) and name the public host clients use:
PUBLIC_HOST=mcp.example.com # the host name clients use
export ESPN_MCP_AUTH_TOKEN="$(openssl rand -hex 32)" # or keep it in an env file
docker run --rm -p 8000:8000 -e ESPN_MCP_AUTH_TOKEN \
ghcr.io/christianclaudio/mcp-server-espn:latest \
--transport streamable-http --host 0.0.0.0 --allowed-host "$PUBLIC_HOST"
# with an env file instead: docker run --rm -p 8000:8000 --env-file espn.env ...📚 Canonical Documentation & Live Doc MCPs
When developing, hardening, or extending MCP servers, consult the official framework and protocol references:
FastMCP 4 Framework Reference:
https://gofastmcp.com/llms.txt— Server composition (mount), hierarchical middleware, transforms (ToolTransform,ToolSearch), lifespans, and in-memory test clients.Model Context Protocol Specification:
https://modelcontextprotocol.io/llms.txt— Official Spec (2026-07-28), wire-level JSON-RPC schemas, annotations, and transport framing.
Live Documentation MCP Endpoints (SSE / Streamable HTTP)
Connect your AI coding agent directly to live documentation servers:
FastMCP Documentation Server:
https://gofastmcp.com/mcp(Tools:search_fast_mcp,query_docs_filesystem_fast_mcp,submit_feedback)Anthropic MCP Documentation Server:
https://modelcontextprotocol.io/mcp(Tools:search_model_context_protocol,query_docs_filesystem_model_context_protocol,submit_feedback)
{
"mcpServers": {
"fastmcp-docs": { "type": "sse", "url": "https://gofastmcp.com/mcp" },
"mcp-official-docs": { "type": "sse", "url": "https://modelcontextprotocol.io/mcp" }
}
}🏆 Verification & Quality Gates
# Run unit test suite (100% statement coverage enforced)
pytest
# Static type safety & formatting
mypy --strict src/
ruff check --fix .
ruff format .
# Tool contract, drift & protocol conformance audits
python scripts/check_tool_contract.py
python scripts/check_openapi_drift.py
./scripts/check_conformance.sh📜 License
Distributed under the Apache-2.0 License.
Available Tools
33 toolsgames_get_calendarGames Get CalendarBRead-onlyIdempotent
Fetch league schedule calendar and active event dates across a season.
| Name | Required | Description | Default |
|---|---|---|---|
| dates | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds only the season-scope context and says nothing about response shape or whether the calendar is a fixed set of dates, which with no output schema is a modest gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb and scope come first. It is efficient, though it errs toward under-specification rather than conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with rich annotations and no output schema, the definition covers the essentials but omits the one param not documented in the schema (dates) and provides no differentiation from the league-events sibling. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: sport and league carry example values in the schema, while 'dates' is undocumented in both schema and description. The phrase 'active event dates across a season' only loosely gestures at the dates parameter, so the description adds little meaning beyond the schema. Baseline 3 for partial coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch) and resource (league schedule calendar / active event dates across a season), which distinguishes it from team-scoped tools like games_get_team_schedule. However, the boundary against close siblings such as games_get_league_events and games_get_scoreboard is left implicit, since 'calendar' vs 'events' is not differentiated in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use or when-not-to-use guidance and names no alternative, despite ~32 sibling games_* tools including games_get_league_events and games_get_team_schedule. An agent must infer the selection rule entirely from the one-sentence purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_event_oddsGames Get Event OddsBRead-onlyIdempotent
Fetch sports betting odds, point spreads, over/under, and moneylines across sportsbooks via ESPN Core API.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| event_id | Yes | ||
| competition_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds value by naming the data categories and the ESPN Core API source, but says nothing about auth requirements, rate limits, or coverage of sportsbooks — a modest addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the resource first and lists the returned data types. Efficient and easy to scan, though the trailing 'via ESPN Core API' is minor filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned data types. But for a 4-parameter tool at 50% schema coverage, it leaves key parameters (notably event_id and competition_id) unexplained, so it is only adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, and event_id and competition_id are effectively undocumented (competition_id appears in neither schema nor description). The description mentions no parameters at all, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (Fetch) and resource (sports betting odds) plus the specific data types returned (point spreads, over/under, moneylines). However, it does not differentiate itself from the sibling games_get_futures, which is also odds-related, leaving potential ambiguity for an agent choosing between them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisites, and no mention of the closest alternative (games_get_futures for future/prop odds). Usage must be inferred entirely from the name and resource type.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_futuresGames Get FuturesARead-onlyIdempotent
Fetch season futures betting markets (championship odds, conference champions, win totals).
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season | No | Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. Omit for ESPN's current. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds only the market types returned; it does not mention rate limits, data source, or availability constraints. With annotations carrying the behavioral load, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The verb and resource come first and the parenthetical examples earn their place by clarifying scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, no-output-schema fetch tool, the description names the returned market categories, which is the key information an agent needs to judge relevance. The one real gap is the missing contrast with games_get_event_odds among a large sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the season parameter documentation is notably dense (year-end convention per sport, defaults to ESPN's current season), so the schema does the heavy lifting. The description adds no parameter syntax or format meaning beyond that, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('season futures betting markets') and concretizes it with three examples of market types (championship odds, conference champions, win totals). It does not, however, distinguish itself from the closest sibling games_get_event_odds, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The qualifier 'season futures' implicitly routes the agent away from event-level odds toward season-long markets, but there is no explicit statement of when to use this tool versus games_get_event_odds or what sport/league prerequisites apply. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_game_predictorGames Get Game PredictorBRead-onlyIdempotent
Fetch ESPN predictive matchup model win percentages, projected margins, and ratings.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| event_id | Yes | ||
| competition_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered without the description. The description adds the nature of the payload (predictive model outputs vs. live/actual results), which is useful, but says nothing about rate limits, freshness, or availability constraints. A 3 is appropriate given annotations carry the behavioral load.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste; the payload contents come first. It is efficient, though its brevity borders on under-specification rather than true conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description does tell the agent what data comes back, so the return-value burden is partially met. However, for a 4-parameter required-key read tool sitting among a dozen similar games_* endpoints, the absence of any disambiguation or parameter context leaves it only minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: sport and league have examples, but event_id and competition_id are undocumented and the description adds no meaning for any of the four. With low coverage the description should compensate, and it does not explain what competition_id selects or what event_id format is expected.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Fetch) plus a clearly named resource (ESPN predictive matchup model) and the exact outputs it returns: win percentages, projected margins, ratings. It reads distinctly from games_get_event_odds or games_get_power_index, though it never explicitly contrasts itself with the neighboring games_get_win_probabilities tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this versus the many near-siblings that also return game-level numbers (win_probabilities, power_index, event_odds). No prerequisites, no exclusions, no selection context — the agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_game_situationGames Get Game SituationARead-onlyIdempotent
Fetch real-time game situation (down, distance, yardline, possession, red zone, clock) via ESPN Core API.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| event_id | Yes | ||
| competition_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint, destructiveHint=false). The description adds two useful bits beyond that: the data is real-time and sourced via the ESPN Core API. It says nothing about behavior when a game is not live, auth needs, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the field list is the most informative part and appears immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields, substituting for a schema. The remaining gaps — undocumented event_id/competition_id and no behavior for non-live games — are minor but real for a 4-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: sport and league carry examples, but event_id and competition_id are undocumented. The description mentions no parameters at all, so it does not compensate for the gap — notably it never explains the event_id/competition_id relationship or the ESPN league-slug format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Fetch') plus resource ('real-time game situation') with the exact fields returned enumerated (down, distance, yardline, possession, red zone, clock). This clearly separates it from siblings like games_get_play_by_play, games_get_scoreboard, and games_get_win_probabilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Real-time' implies this is for in-progress games, which is implicit usage context, but the description never states when to prefer this over games_get_scoreboard, games_get_play_by_play, or games_get_game_summary. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_game_summaryGames Get Game SummaryARead-onlyIdempotent
Fetch comprehensive game summary for an event ID, including consensus betting lines (spread, moneyline, over/under from DraftKings/Caesars/ESPN BET), matchup predictor (FPI/BPI win probabilities), live win probability curve, season head-to-head series, last 5 games momentum, team statistics, and in-game injuries.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| event_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds that data includes live win probability and in-game injuries, implying fresh content, but does not disclose auth needs, rate limits, caching, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single front-loaded sentence with no filler. The content list is dense but every item is informative, though the sentence is slightly run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description usefully enumerates the returned sections. Annotations cover the safety profile, and the three-parameter input is simple. It lacks guidance on obtaining or formatting event_id and omits when-to-use context, but is otherwise sufficient to invoke.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and the description only echoes 'event ID'; it adds no format, acceptable values, or relationship among sport, league, and event_id beyond what the schema already provides. It does not compensate for the undocumented event_id parameter or clarify dependencies between parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('comprehensive game summary') for an event ID. The enumerated contents (betting lines, matchup predictor, win probability, injuries) make clear this is the aggregate endpoint rather than narrower siblings such as games_get_event_odds or games_get_win_probabilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternative-naming guidance is provided. However, the word 'comprehensive' and the list of included sections imply the tool is for a one-stop game overview rather than individual specialized endpoints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_leaders_by_athleteGames Get Leaders By AthleteBRead-onlyIdempotent
Fetch statistical leaderboards across a league for individual athletes (e.g. passing yards, rushing, points, strikeouts).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ||
| limit | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint, so the safety profile is covered. The description adds only illustrative stat names; it says nothing about pagination, result ordering, or how the default limit of 10 behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence front-loads the core purpose with no filler. It is efficient, though slightly under-specified rather than overly long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with 40% schema coverage and no output schema, the description leaves the sort, limit, and category parameters entirely unexplained and gives no return-shape context. The annotations cover safety, but the parameter gap is significant for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40% — sport and league are the sole described parameters, while sort, limit, and category carry no description anywhere. The listed stat examples (passing yards, points, strikeouts) loosely hint at category values but are not tied to the parameter, leaving the sort/limit semantics undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch) and resource (statistical leaderboards) scoped to individual athletes, with concrete stat examples. The 'by athlete' scope implicitly separates it from the sibling games_get_leaders_by_team, though the contrast is never made explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the athlete-scoped leaderboard framing, which steers an agent away from team-level or game-level siblings. However, it never states when to reach for this versus games_get_leaders_by_team, games_get_standings, or teams_get_athlete_stats.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_leaders_by_teamGames Get Leaders By TeamBRead-onlyIdempotent
Fetch team statistical leaderboards across a league (e.g. total offense, defensive points allowed, efficiency).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ||
| limit | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description only adds that results span a whole league and are stat-category based; it says nothing about pagination, ordering behavior, or how 'limit' interacts with the leaderboard size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and resource first and concrete examples at the end. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description need not explain return values, and annotations cover safety. However, with three of five parameters undocumented and no guidance on how category/sort/limit shape the leaderboard, the definition is adequate but leaves real gaps for an agent invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40% — sport and league are documented, while sort, limit, and category are not. The examples (total offense, defensive points allowed, efficiency) give at least suggestive values for the otherwise undocumented 'category' parameter, which partially compensates, but sort/limit remain unclarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') plus a clearly scoped resource ('team statistical leaderboards across a league') and illustrates the kind of stats returned. The team-vs-athlete split is only implied by the name relative to the sibling games_get_leaders_by_athlete, so the differentiation is not explicit in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states what it returns but never says when to choose it over the closely related games_get_leaders_by_athlete, games_get_standings, games_get_rankings, or teams_get_team_statistics. No prerequisites or exclusions are given, so an agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_league_draftGames Get League DraftBRead-onlyIdempotent
Fetch league draft rounds, team selections, and pick results for a draft year (e.g. the first overall pick).
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season | No | Draft year (the year it's held). Omit for ESPN's current. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds the useful detail of what data comes back (rounds, selections, pick results), but says nothing about response shape, pagination, or behavior when the draft year is absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and resource first and a parenthetical example at the end. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with complete schema coverage, no output schema, and clear annotations, the description covers the essential content of the return. It is only minimally thin on the draft-year edge cases (e.g. invalid/absent year), which the schema partly handles.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so sport, league, and season are already documented in the schema, including the note to omit season for ESPN's current data. The description's mention of a 'draft year' loosely mirrors the season parameter but adds no format or semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (fetch) and a precise resource (league draft rounds, team selections, pick results for a draft year), and the concrete example ('the first overall pick') sharpens the mental model. No other sibling tool covers drafts, so the resource itself differentiates it, though the description never explicitly contrasts with siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states what the tool returns but never says when to reach for it versus alternatives (e.g. games_get_league_events or games_get_transactions for related league data), nor any prerequisite or exclusion. Usage is only inferable from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_league_eventsGames Get League EventsBRead-onlyIdempotent
Fetch league-wide calendar of scheduled events, optionally filtered by date; without dates it returns the current events.
| Name | Required | Description | Default |
|---|---|---|---|
| dates | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered. The description adds one useful behavioral fact – the default returns current events when no date is given – but nothing about return shape, pagination, or date semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The default-behavior clause is appended efficiently, though the compound structure slightly blurs the primary verb+resource statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, annotated tool with no output schema, the description covers purpose and the optional filter adequately. It omits the date format and any hint of what the returned event objects contain, which matters given the undocumented string parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (sport and league carry 'e.g.' examples), so structured data does much of the work. The description only clarifies the 'dates' parameter's filtering role and default behavior; it never specifies the accepted date format, leaving that string parameter ambiguous in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Fetch league-wide calendar of scheduled events'. The word 'league-wide' implicitly distinguishes it from games_get_team_schedule, but it never explicitly names a sibling or clarifies its relation to games_get_calendar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'optionally filtered by date; without dates it returns the current events' gives clear context for how the dates parameter selects behavior. However, it offers no guidance on when to choose this over games_get_calendar, games_get_team_schedule, or games_get_scoreboard.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_league_groupsGames Get League GroupsBRead-onlyIdempotent
Fetch league conference, division, and structural group hierarchies.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, covering the safety profile. The description adds that the tool returns conference, division, and structural group hierarchies, which is useful content context but does not describe return format, pagination, or other behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the verb and resource with no wasted words. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations and full schema coverage, the description states the data domain clearly. However, with no output schema, it could better describe the return structure, leaving a minor gap for an agent that needs to know the response shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both sport and league have descriptions with examples. The description adds no parameter-level detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and the resource ('league conference, division, and structural group hierarchies'), which clearly conveys the tool's function. It is less explicit about how it differs from related sibling tools like games_get_standings or games_get_rankings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternatives are provided. The purpose hints at its use for retrieving structural hierarchies, but there is no explicit context for selecting it over siblings like games_get_standings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_play_by_playGames Get Play By PlayBRead-onlyIdempotent
Fetch granular play-by-play sequence with clock, downs, distances, yardage, and scoring flags via ESPN Core API.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| event_id | Yes | ||
| competition_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety profile (readOnly, idempotent, openWorld, non-destructive). The description adds value by disclosing the granular content fields returned (clock, downs, distances, yardage, scoring flags), but does not mention pagination behavior despite page/limit parameters, nor auth or rate limits. Adds useful context beyond annotations but not rich behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence that front-loads the action and resource. Every phrase earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations carry the safety profile and the description lists returned data, but with 33% schema coverage, no output schema, and no usage guidance, missing parameter explanations (especially pagination and optional identifiers) leave gaps for a 6-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (sport and league only), leaving event_id, page, limit, and competition_id undocumented. The description does not explain any input parameter or compensate for the coverage gap, instead listing output fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('granular play-by-play sequence') with concrete details (clock, downs, distances, yardage, scoring flags). No sibling tool in the list covers play-by-play, so it is inherently distinguished from scoreboard, summary, situation, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no explicit guidance on when to use this tool versus alternatives, nor any prerequisites. The phrase 'via ESPN Core API' is source context, not usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_power_indexGames Get Power IndexBRead-onlyIdempotent
Fetch league team power index (FPI / BPI) ratings and efficiency metrics.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season | No | Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. Omit for ESPN's current. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds only that the payload contains FPI/BPI ratings and efficiency metrics, with no mention of coverage, freshness, or rate limits, so added value beyond structured data is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence naming the verb and the exact metrics returned. No filler, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description is the only place return content can be characterized, and it does indicate the metric families (FPI/BPI, efficiency). It does not say what entities or granularity come back (per team? per league? sorted how?), which leaves a modest gap for a read tool with three parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: sport, league and season are each documented in the schema, including the season-year convention. The description adds no parameter-level meaning, which is the expected baseline when the schema already does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Fetch') and resource ('league team power index (FPI / BPI) ratings and efficiency metrics'), so an agent knows it returns analytic power ratings rather than raw records. It does not name or distinguish itself from plausible siblings such as games_get_rankings or games_get_game_predictor, so the differentiation is implicit at best.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to choose this tool over the many other league-level siblings (standings, rankings, predictors, futures). Usage is only inferable from the resource name, and with 30+ sibling tools the absence of any routing guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_rankingsGames Get RankingsARead-onlyIdempotent
Fetch Top 25 national polls and rankings (AP Top 25, Coaches Poll, College Football Playoff rankings) for college sports like NCAAF and NCAAB, including current and previous ranks, votes, and records.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful content context (which polls and fields come back), which matters since there is no output schema, but it discloses nothing about scope limits or freshness of the polls beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that promptly identifies the verb, the resource, and the concrete polls returned. The parenthetical poll list is slightly dense but every element earns its place by disambiguating scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with no output schema, the description adequately describes what comes back (current and previous ranks, votes, records) and which sports are covered. The only gap is the absence of any guidance on sibling disambiguation for ranking-adjacent tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description contributes sport examples (NCAAF, NCAAB) that go beyond the schema's terse 'e.g. basketball' and 'e.g. nba, eng.1' examples, though those schema examples actually point at pro leagues, leaving the intended sport/league vocabulary mildly ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (fetch) and resource (Top 25 national polls and rankings), and enumerates the exact polls returned (AP Top 25, Coaches Poll, CFP rankings). This clearly separates it from siblings like games_get_standings and games_get_power_index, which describe different ranking concepts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage context by naming the polls and sports covered, but never says when to choose this over games_get_standings, games_get_power_index, or other ranking-like siblings. No explicit exclusions or prerequisites are given, so routing must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_scoreboardGames Get ScoreboardARead-onlyIdempotent
Fetch final scores and results for any date, including postseason games such as the Super Bowl, World Series, or NBA Finals, plus live scores, game status, periods/innings, clocks/outs, TV broadcasts, and probable starters. Returns each game's event ID. Filter by date, week, season type, or Top 25 group. Sports: football, basketball, baseball, hockey, soccer, golf, mma.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYYMMDD, e.g. 20161102; omit for today. | |
| week | No | ||
| group | No | ||
| limit | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower, and the description adds genuine behavioral context: it returns both historical finals and live in-progress data with periods/innings/clocks/outs, and it discloses that each game's event ID is returned. No auth or rate-limit details are provided, but the added payload context is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the returned fields and the filter/sport list. The enumeration of payload fields is dense but earns its place for a tool with no output schema; slightly trimmable but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers what the tool returns, the sports supported, the filter dimensions, and the event ID output, which compensates for the absence of an output schema. The main omissions are the meaning of season_type and any pagination behavior for 'limit', which an agent with 7 parameters would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 43% (date, sport, league documented; week, group, limit, season_type bare). The description partially compensates by naming week, season_type, and 'Top 25 group' as filters, but it omits limit entirely and does not explain season_type values (e.g., preseason/regular/postseason codes), leaving real gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch final scores and results') and enumerates what the payload contains (status, periods/innings, clocks/outs, TV broadcasts, probable starters), which implicitly separates it from detail-oriented siblings like games_get_game_summary and games_get_play_by_play. It never names those siblings, so the differentiation is inferable rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case ('final scores and results for any date', 'plus live scores', postseason examples) and lists the filter axes, but gives no when-to-use/when-not guidance and no alternative tool is referenced among the many score/game siblings. Usage is implied rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_scoreboard_headerGames Get Scoreboard HeaderBRead-onlyIdempotent
Fetch live ticker scoreboard header data across games for a sport and league.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | No | e.g. basketball | football |
| league | No | e.g. nba, eng.1 | nfl |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the useful context that this is live ticker header data, but does not describe return shape, rate limits, authentication needs, or how the header field relates to full scoreboard data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It states the action, object, and scope efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter schema and rich annotations, the description covers the basic purpose. However, with no output schema and many sibling scoreboard-related tools, it does not clarify when this header-specific tool is preferable or what the returned header data contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters documented, including defaults and examples. The description only restates that the tool operates for a sport and league, adding no syntax or format details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: fetching live ticker scoreboard header data, scoped to a sport and league. It is clear and actionable, though it does not explicitly distinguish itself from the closely named sibling games_get_scoreboard.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool instead of alternatives such as games_get_scoreboard or games_get_game_summary, nor any exclusions or prerequisites. The agent must infer usage from the tool name and description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_standingsGames Get StandingsARead-onlyIdempotent
Fetch current or historical regular-season division, conference, and league standings (e.g. which team had the best record): win-loss records, win percentages, games back, streaks, and differential. Echoes the season ESPN returned.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season | No | Season by the year it ends, e.g. 2016 for the 2015-16 NBA or NHL season; NFL and MLB: the year played; soccer: the year it starts, e.g. 2026 for the 2026-27 Premier League. Omit for the current season. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld, so the safety profile is fully covered. The description adds a useful business detail — 'Echoes the season ESPN returned' — but nothing about rate limits, auth, or pagination, so it stays at the baseline-plus level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the verb and resource, then the returned contents. Every clause carries information and nothing is redundant, though the parenthetical example is slightly padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description partially compensates by listing the fields returned (records, percentages, games back, streaks, differential). Combined with full parameter coverage, an agent has enough to invoke and interpret results correctly, though the shape of the standings (grouped by division/conference) is only implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with sport, league, and season each thoroughly documented (including the season-end-year convention per sport). The description adds no further parameter semantics, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (regular-season standings), and enumerates the returned metrics (win-loss records, win %, games back, streaks, differential), which strongly implies a distinct function from rankings or power-index siblings. It does not explicitly name an alternative tool, so differentiation from games_get_rankings is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Current or historical' and the season parameter note convey when the tool applies, but there is no explicit routing between this and siblings like games_get_rankings, games_get_power_index, or games_get_futures. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_team_scheduleGames Get Team ScheduleARead-onlyIdempotent
Fetch a team's season schedule and results: opponents, scores, dates, home/away, and event IDs. Regular season by default; season_type=3 for postseason games (e.g. the World Series, NBA Finals, or Super Bowl).
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season | No | Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. | |
| team_id | Yes | ||
| season_type | No | 2 or omit: regular season; 3: postseason. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, covering the safety profile. The description adds the default scope (regular season) and the season_type=3 postseason switch, plus the returned data fields, but says nothing about pagination, rate limits, or authentication needs. This is useful but modest added context given the rich annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core operation and return fields, followed by the season_type default. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only schedule tool with no output schema, the description helpfully lists the returned fields and explains the season_type default. The main gap is that team_id format or source is never mentioned, even though it is required. Otherwise the definition is complete enough given the annotations and schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents sport, league, season, and season_type. The description mostly duplicates that information with postseason examples and adds no format guidance for team_id, which remains undocumented in both schema and description. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and resource ('team's season schedule and results'), and enumerates the returned fields (opponents, scores, dates, home/away, event IDs). This makes it clearly distinct from sibling tools like games_get_scoreboard or games_get_game_summary without needing to name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives usage context for the season_type parameter ('Regular season by default; season_type=3 for postseason games'), but it never says when to choose this tool over siblings like games_get_scoreboard or games_get_league_events. Usage is implied by the tool's purpose, but there is no explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_transactionsGames Get TransactionsARead-onlyIdempotent
Fetch recent league player transactions (trades, free agent signings, waiver claims, roster activations, and injury reserve designations).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description usefully clarifies the scope of "transactions" by listing the five event types, but says nothing about ordering, time window, or result volume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the parenthetical enumeration of transaction types earns its place by defining the ambiguous term "transactions."
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read tool with no output schema, the definition is minimally adequate: it covers purpose and data scope but leaves the limit parameter, result ordering, and temporal coverage unexplained. An agent could invoke it correctly but cannot predict the shape or recency of the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%: sport and league carry example values in the schema, while limit has only a default of 25 with no description. The description adds no syntax, format, or meaning for any parameter — notably not explaining what limit truncates or whether results are ordered newest-first.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Fetch recent league player transactions") and enumerates the transaction types covered (trades, signings, waiver claims, activations, IR). It is clearly distinguishable from siblings since no other tool in the list covers transactions, though "recent" is left undefined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage — retrieve league transaction activity — but never states when to use this versus alternatives or any prerequisite conditions (e.g., whether a league must be in season, how far back the data goes). Usage must be inferred from the name and enumerated types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
games_get_win_probabilitiesGames Get Win ProbabilitiesCRead-onlyIdempotent
Fetch high-density win probability timeline curve samples across an entire game.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| event_id | Yes | ||
| competition_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds a useful hint about the data shape ('high-density timeline curve samples across an entire game'), but says nothing about ordering, coverage, or how the limit default of 50 interacts with a claim of covering the whole game.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though 'high-density ... curve samples' is slightly jargon-heavy for the amount of information conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter tool with no output schema and 40% schema coverage, the description leaves too much open: what the returned samples look like, how limit is applied, and whether 'entire game' is guaranteed. A one-line description cannot carry this tool's requirements on its own.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Five parameters and only 40% schema description coverage, yet the description mentions no parameter at all. sport, league and event_id have to be inferred from the schema alone, and limit and competition_id are entirely undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: fetching win probability timeline curve samples for a game. That is enough to separate it from siblings like games_get_play_by_play or games_get_game_summary, though it never explicitly contrasts itself with the adjacent games_get_game_predictor, which an agent could easily confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, nor any prerequisites (e.g. which leagues/sports are supported). The only usage signal is the implicit 'across an entire game', which the agent must infer from the required event_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
news_get_newsNews Get NewsBRead-onlyIdempotent
Fetch recent news headlines, injury updates, breaking analysis, and roster moves for a given sport and league.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety and idempotency profile is fully covered. The description adds that results are 'recent', implying freshness, but says nothing about result volume, ordering, pagination, or what the 'limit' cap does. With annotations carrying the safety burden, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the verb front-loaded and no filler. The enumerated content types (headlines, injury updates, analysis, roster moves) each convey distinct value, though the list is slightly long for what could be summarized as 'news'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter, no-output-schema, read-only tool whose annotations cover the safety profile, the description is functionally complete enough to invoke. It leaves gaps on limit semantics and whether results are paginated or time-bounded, which an agent would need to call it well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: 'sport' and 'league' carry example values ('basketball', 'nba, eng.1'), while 'limit' is undocumented in both schema and description. The description only restates that sport and league are inputs, adding no format, casing, or accepted-values guidance (e.g. that 'eng.1' implies soccer league slugs) beyond the schema examples. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('news headlines, injury updates, breaking analysis, and roster moves'), scoped to sport and league. It is clearly distinguishable from the games_* and teams_* siblings, which return scores, rosters, and stats rather than editorial content. It stops short of naming a sibling, but the domain separation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'recent news' framing implies usage (when you need current headlines or injury/roster updates), and it is the only news tool among the siblings, so the choice is implied. There is no explicit when-to-use statement, no guidance on how this differs from, say, games_get_transactions for roster moves, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_athlete_bioTeams Get Athlete BioBRead-onlyIdempotent
Fetch detailed athlete biography including birthplace, college, draft round and pick, experience, physical measurements, and background.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| athlete_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds the useful context that the payload is biographical fields, but says nothing about how current the data is, what happens when an athlete_id is unknown, or response shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the field enumeration is dense but directly useful. It could be trimmed only marginally.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned biography fields, which is the main thing an agent needs to decide relevance. The missing athlete_id guidance and lack of sibling routing keep it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: sport and league carry example values, but athlete_id has no description at all and the description text adds no parameter detail. Baseline 3 is appropriate since the schema does most of the work but one required parameter remains undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and resource (athlete biography) and enumerates the returned fields, which visibly distinguishes it from siblings like teams_get_athlete_stats, teams_get_athlete_gamelog and teams_get_athlete_overview. It does not explicitly name the nearest siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no comparison to the adjacent teams_get_athlete_overview, stats, gamelog or splits tools. The agent must infer from the name alone that 'bio' means biographical background rather than performance data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_athlete_gamelogTeams Get Athlete GamelogARead-onlyIdempotent
Fetch game-by-game statistical performance log for an athlete across an entire season.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season | No | Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. | |
| athlete_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the useful scope constraint of a full-season game log, but does not mention pagination, return format, or other behavioral details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every word contributes to defining the resource and scope.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The purpose and seasonal scope are clear, and annotations cover safety. However, with many sibling athlete-stat tools and no output schema, the description leaves the agent without selection guidance among competitors like athlete_stats or splits and adds no parameter context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, and the schema already documents sport, league, and season semantics. The description does not add syntax or meaning for athlete_id or any other parameter, so it performs at the baseline level when structured fields do most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch), resource (game-by-game statistical performance log), and scope (for an athlete across an entire season). This clearly distinguishes it from aggregate-stat siblings like teams_get_athlete_stats or teams_get_athlete_splits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool returns but gives no when-to-use guidance, no alternatives, and no exclusions. There are many athlete-stat sibling tools, so routing guidance would be valuable here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_athlete_overviewTeams Get Athlete OverviewBRead-onlyIdempotent
Fetch athlete biographical information, season/career statistical splits, recent individual game logs, rotowire fantasy notes, and next upcoming match.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| athlete_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered without description help. The description adds moderate value by enumerating the returned sections, but says nothing about authentication requirements, rate limits, payload size, or pagination. With annotations carrying the behavioral load, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the verb and packs the returned sections into one dense list with no filler. Slightly run-on, but every clause names a concrete returned artifact, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially compensates by enumerating the five returned sections, which tells the agent what payload to expect. However, it omits any guidance on how this aggregates the granular sibling tools and says nothing about the three parameters, leaving meaningful gaps for an overview-style endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with sport and league carrying example values while athlete_id is undocumented. The description adds no additional parameter meaning, no format hints for athlete_id, and no indication of how sport/league constrain the lookup. Baseline 3 is correct when the schema does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and an enumerable resource: bio, statistical splits, game logs, fantasy notes, and next match. The enumerated contents map directly onto sibling tools (teams_get_athlete_bio, teams_get_athlete_stats, teams_get_athlete_gamelog, teams_get_athlete_splits), so an agent can infer this is an aggregate. It never explicitly says it is the all-in-one version of those siblings, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not, or alternative guidance is given despite four close siblings that each return a subset of this payload. The agent is left to infer that this is the comprehensive snapshot rather than calling the narrower bio/stats/gamelog/splits tools. No exclusions or routing conditions are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_athlete_splitsTeams Get Athlete SplitsARead-onlyIdempotent
Fetch situational split statistics for an athlete (home vs away, monthly performance, opponents, and win/loss splits).
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season | No | Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. | |
| athlete_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds the shape of the returned data (the split categories), but says nothing about rate limits, authentication, or pagination on top of what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the tool's purpose front-loaded and zero filler. The parenthetical enumeration is dense but earns its place by defining the split taxonomy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description helpfully names what split categories are returned, which is the main missing piece for this read-only tool. Coverage is good for calling the tool correctly, though the required athlete_id is undocumented anywhere and no indication of result size or granularity is given.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% (sport, league, season documented; athlete_id is bare), so the schema carries most parameter meaning. The description lists return categories but adds no syntax, format, or semantics for any of the four parameters, so it does not compensate for the athlete_id gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Fetch) plus a precisely scoped resource (situational split statistics for an athlete), and the parenthetical enumerates the split dimensions returned (home/away, monthly, opponents, win/loss). This distinguishes it from the sibling athlete_stats/gamelog tools by scope, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'situational split statistics' plus the enumerated split types implies the analytical use case, but there is no explicit when-to-use guidance and no mention of when to prefer it over teams_get_athlete_stats or teams_get_athlete_gamelog. Usage must be inferred from the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_athlete_statsTeams Get Athlete StatsARead-onlyIdempotent
Fetch an athlete's season totals (e.g. a quarterback's passing yards for a season) and career totals and averages. Find the athlete_id with teams_search.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| season | No | Echoed only; ESPN returns every season's totals. | |
| athlete_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is fully covered and the description adds nothing there. What it does add is a rough sketch of the returned payload (season totals, career totals, averages), which matters since there is no output schema, but it omits notable behavior such as the season parameter being echo-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the scope and return content, followed immediately by the prerequisite. Nothing is wasted and there is no boilerplate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Absent an output schema, the description usefully states what comes back, and it closes the athlete_id discovery gap. It stops short of explaining how season affects results or clarifying overlap with the gamelog/splits siblings, but nothing essential for a correct single call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description compensates for the one undocumented parameter by telling the agent how to obtain athlete_id through teams_search. It adds real operational meaning beyond the schema for that gap, though it says nothing about sport/league value formats (which the schema does cover with examples).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear specific verb+resource with an illustrative example ('a quarterback's passing yards for a season') and explicit scope (season totals plus career totals and averages). It distinguishes itself from stat siblings like teams_get_athlete_gamelog or teams_get_athlete_splits by naming the aggregate scope, though it never names those siblings directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides one piece of actionable setup guidance -- resolve athlete_id via teams_search -- which is genuinely useful. However, it gives no when-to-use vs when-not guidance against the many stat-related siblings (teams_get_player_stats, teams_get_athlete_splits, teams_get_athlete_gamelog), leaving the agent to infer which stats tool fits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_player_statsTeams Get Player StatsARead-onlyIdempotent
Extract detailed individual player boxscores and performance metrics for a game (e.g., Strikeouts and Innings Pitched for MLB pitchers; Points, Rebounds, Assists for NBA/WNBA; Passing, Rushing, Receiving for NFL/NCAAF; Goals and Assists for Soccer/NHL).
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| event_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the description need not restate that. It adds useful context about what data is returned per sport, but says nothing about pagination, response shape, or authentication, which would round out the picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence states the core action before the long parenthetical. The per-sport examples are verbose but each earns its place by clarifying scope across sports.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, non-destructive stats tool with annotations covering safety and no output schema, the description adequately conveys what is returned via per-sport metric examples. Missing return format and event_id semantics are minor gaps but not blockers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: sport and league carry example descriptions while event_id has none. The description indirectly helps by naming leagues/sports (MLB, NBA, WNBA, NFL, NCAAF, Soccer, NHL) that inform the sport/league values, but it adds no syntax or format detail and leaves event_id undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (extract) and resource (individual player boxscores and performance metrics) scoped to a single game, with concrete per-sport metric examples. This distinguishes it reasonably from career-oriented siblings like teams_get_athlete_stats, but it never names those siblings or explicitly contrasts per-game vs. season scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the 'for a game' scope and the metric examples; there is no explicit when-to-use guidance, no statement of when to prefer this over teams_get_athlete_gamelog or teams_get_athlete_stats, and no prerequisites called out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_teamTeams Get TeamBRead-onlyIdempotent
Fetch detailed information for a single team including standing summary, overall record, venue, and next scheduled event.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| team_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety and determinism are covered. With no output schema, the description usefully sketches the return payload categories, but adds nothing about auth, rate limits, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the resource and its contents arrive immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only fetch whose annotations cover the safety profile, the description is sufficient — it tells the agent what comes back. Only the undocumented team_id format and the absence of any sibling routing leave a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; 'sport' and 'league' carry examples ('basketball', 'nba, eng.1') but 'team_id' has no description anywhere. The description adds no parameter guidance, so it neither compensates for the gap nor improves on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('fetch') and resource (single team), then enumerates the payload: standing summary, overall record, venue, next scheduled event. This clearly separates it from roster/statistics siblings, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no routing to alternatives such as teams_get_team_statistics, teams_get_team_roster, or teams_list_teams. The agent must infer selection from the payload list alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_team_depth_chartTeams Get Team Depth ChartBRead-onlyIdempotent
Fetch team depth chart showing positional starter and backup hierarchies (e.g. QB1, QB2, RB1, RB2) to evaluate starting status and backup substitution impacts.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| team_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds the shape of the returned data (starter/backup positional hierarchies), but says nothing about coverage, freshness, or auth needs beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the core purpose front-loaded and no filler. It could be marginally improved by appending the team_id/sport/league expectations, but it wastes nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description valuably describes the return structure (QB1/QB2 hierarchies). Combined with annotations covering the safety profile, an agent has enough to call it, though the undocumented team_id parameter is a residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Three required parameters (sport, league, team_id) at 67% schema coverage, yet the description mentions none of them. With team_id undocumented in the schema, the description should have compensated by clarifying identifier expectations, but adds no parameter meaning at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Fetch team depth chart') and clarifies the payload with concrete examples like QB1/QB2, RB1/RB2. It is clearly distinguishable from teams_get_team_roster, though it never names that sibling explicitly to sharpen the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an intended purpose ('to evaluate starting status and backup substitution impacts'), which implies when the tool is useful. However, it offers no explicit when/when-not guidance or alternatives against nearby roster/stat tools, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_team_rosterTeams Get Team RosterBRead-onlyIdempotent
Fetch active team roster and injury designations grouped by position, including jersey numbers, experience, position abbreviations, and coaching staff.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| team_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that results are grouped by position and include injury/coaching data, which is useful behavioral context, but omits anything about refresh timing, data source, or limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and its contents are stated immediately. Slightly dense but every clause adds concrete information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does list the primary returned fields (jersey numbers, experience, position abbreviations, coaching staff). It is reasonably complete, though it could note the response grouping format more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with sport and league carrying brief examples ('basketball', 'nba, eng.1') and team_id undocumented. The description adds no parameter-level meaning beyond what the schema already states, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('team roster'), plus concrete contents (injury designations, jersey numbers, experience, coaching staff). This clearly separates it from siblings like teams_get_team_statistics or teams_get_team_depth_chart, though it never names those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says nothing about when to use this tool versus alternatives like teams_get_team_depth_chart, teams_get_team_statistics, or teams_get_team. No prerequisites or context are provided; the agent must infer usage entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_get_team_statisticsTeams Get Team StatisticsBRead-onlyIdempotent
Fetch team and opponent season statistics across offensive, defensive, and special teams categories.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 | |
| team_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context about the data categories returned (offensive/defensive/special teams, team and opponent), but says nothing about auth, rate limits, or whether the season is inferred.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler — the resource and its scope are stated immediately and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry more of the return-value burden; it names the statistical categories but not the response shape, granularity (per-game vs totals), or how the season is determined given no season parameter exists. Adequate but leaves real gaps for an agent to guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%; sport and league carry example values ('basketball', 'nba, eng.1') while team_id has no schema description. The description mentions 'team' but adds no format or value guidance for any parameter, so it does not compensate for the gap. Baseline 3 for moderate coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and a well-scoped resource ('team and opponent season statistics across offensive, defensive, and special teams categories'). This is clearly distinguishable from siblings like teams_get_team (metadata), teams_get_team_roster, and teams_get_player_stats, though it does not name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance, prerequisites, or alternatives. An agent gets no signal on how this differs in intent from teams_get_player_stats or teams_get_team — only the phrase 'team and opponent' implicitly narrows it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_list_teamsTeams List TeamsARead-onlyIdempotent
Fetch all active teams in a given sport and league, returning team IDs, names, abbreviations, locations, and colors.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | e.g. basketball | |
| league | Yes | e.g. nba, eng.1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds useful behavioral context by enumerating returned fields (IDs, names, abbreviations, locations, colors), though it omits pagination or invalid-input behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and scope, followed by a concise return-field list. No redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter list endpoint with no output schema and rich annotations, the description is complete enough: it covers scope, required inputs, and return fields. Minor omissions like pagination or invalid-input handling are not critical for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema provides examples for both required parameters ('basketball', 'nba, eng.1'). The description restates the sport/league scope but adds no semantics beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Fetch') and resource ('all active teams') with scope qualifiers ('in a given sport and league'). It distinguishes itself from 'teams_get_team' (single team) and 'teams_search' (query-based) by promising all active teams for a sport/league, though it does not name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance or mention of alternatives like teams_search or teams_get_team. The phrase 'in a given sport and league' implies the required context, but an agent still must infer when this list is preferable to other team-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
teams_searchTeams SearchARead-onlyIdempotent
Search ESPN's entity index by name to find an athlete ID or team ID, or a league. Returns IDs, display names, and metadata needed to call other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | player | |
| limit | No | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive behavior. The description adds that it searches an index by name and returns IDs, display names, and metadata needed for other tools. This is useful added context beyond the structured annotations, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose followed by return details. Every word earns its place and the size is appropriate for a simple search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so describing the returned IDs, names, and metadata is helpful. However, with three undocumented parameters and no schema descriptions, the agent remains unclear on how to set 'type' and 'limit', leaving a meaningful gap in parameter usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%. The description hints that 'query' is a name and that results can be an athlete, team, or league, but it never names the 'type' or 'limit' parameters, their defaults, or accepted values. It does not compensate for the complete lack of schema parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'Search' and resource 'ESPN's entity index', plus what can be found (athlete ID, team ID, league). Clear purpose, but it does not explicitly contrast with sibling get/list tools, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains that the tool is used to find IDs needed to call other tools, giving a clear usage context. It lacks explicit when-not-to-use guidance or named alternatives, but the intended use case is evident.
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.
32 tool updates
v2.0.0- Changed
games_get_calendar2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_event_odds2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_futures3 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / season / descriptionAdded value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. Omit for ESPN's current." - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_game_predictor2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_game_situation2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_game_summary2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_leaders_by_athlete2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_leaders_by_team2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_league_draft3 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / season / descriptionAdded value: +"Draft year (the year it's held). Omit for ESPN's current." - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_league_events2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_league_groups2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_play_by_play2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_power_index3 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / season / descriptionAdded value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. Omit for ESPN's current." - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_rankings2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_scoreboard3 fields changed- added
Input schema / properties / date / descriptionAdded value: +"YYYYMMDD, e.g. 20161102; omit for today." - added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_scoreboard_header2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_standings3 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / season / descriptionAdded value: +"Season by the year it ends, e.g. 2016 for the 2015-16 NBA or NHL season; NFL and MLB: the year played; soccer: the year it starts, e.g. 2026 for the 2026-27 Premier League. Omit for the current season." - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_team_schedule4 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / season / descriptionAdded value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts." - added
Input schema / properties / season_typeAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "2 or omit: regular season; 3: postseason." +} - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_transactions2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
games_get_win_probabilities2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
news_get_news2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_athlete_bio2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_athlete_gamelog3 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / season / descriptionAdded value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts." - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_athlete_overview2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_athlete_splits3 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / season / descriptionAdded value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts." - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_athlete_stats3 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / season / descriptionAdded value: +"Echoed only; ESPN returns every season's totals." - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_player_stats2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_team2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_team_depth_chart2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_team_roster2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_get_team_statistics2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
- Changed
teams_list_teams2 fields changed- added
Input schema / properties / league / descriptionAdded value: +"e.g. nba, eng.1" - added
Input schema / properties / sport / descriptionAdded value: +"e.g. basketball"
33 tool updates
v1.2.9- First observed
games_get_calendar - First observed
games_get_event_odds - First observed
games_get_futures - First observed
games_get_game_predictor - First observed
games_get_game_situation - First observed
games_get_game_summary - First observed
games_get_leaders_by_athlete - First observed
games_get_leaders_by_team - First observed
games_get_league_draft - First observed
games_get_league_events - First observed
games_get_league_groups - First observed
games_get_play_by_play - First observed
games_get_power_index - First observed
games_get_rankings - First observed
games_get_scoreboard - First observed
games_get_scoreboard_header - First observed
games_get_standings - First observed
games_get_team_schedule - First observed
games_get_transactions - First observed
games_get_win_probabilities - First observed
news_get_news - First observed
teams_get_athlete_bio - First observed
teams_get_athlete_gamelog - First observed
teams_get_athlete_overview - First observed
teams_get_athlete_splits - First observed
teams_get_athlete_stats - First observed
teams_get_player_stats - First observed
teams_get_team - First observed
teams_get_team_depth_chart - First observed
teams_get_team_roster - First observed
teams_get_team_statistics - First observed
teams_list_teams - First observed
teams_search
TDQS
Scored across 33 tools
Several tools overlap significantly, especially the athlete-stat cluster (athlete_overview, athlete_stats, athlete_gamelog, athlete_splits, player_stats) and the game-detail cluster (game_summary supersets win_probabilities, game_predictor, and parts of play_by_play). Descriptions do help differentiate granularity and scope, but the superset relationships create real risk of misselection.
Most tools follow a clear snake_case domain_verb_noun pattern (e.g., games_get_scoreboard, teams_get_team_roster, news_get_news). Minor deviations like teams_search lacking a noun and the redundant news_get_news keep it from being perfectly uniform, but it remains readable and predictable.
33 tools is heavy for an MCP server and exceeds the typical 3-15 well-scoped range. While the ESPN domain is broad, many tools are granular and overlapping, increasing cognitive load and selection complexity beyond what is ideal.
Coverage is broad across scores, stats, standings, odds, news, rosters, drafts, and transactions, with no severe dead ends for common workflows. Minor gaps exist, such as no team- or athlete-specific news endpoint, no explicit league listing tool, and limited historical season filters on some endpoints.
Maintenance
Related MCP Connectors
Live sports stats and pre-computed analysis for AI assistants across NBA, MLB, NFL, and NHL.
Sports odds, player props and source coverage for AI assistants. Connect with your own API key.
- NFL MCPOAuthcom.nflmcp
NFL analytics tools for AI agents: stats, fantasy, injuries, schedules, and advanced analysis.
Sports prediction markets for AI agents — live prices, quotes, orders, and positions.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides access to comprehensive sports data from 5 major leagues (NBA, NFL, MLB, EPL, NHL) including teams, players, games, statistics, standings, injuries, and betting odds through 67+ endpoints. Enables users to query sports information and analytics through natural language.12MIT
- AlicenseAqualityDmaintenanceProvides AI-powered sports betting intelligence including live odds, injury reports, and documented picks for NBA, NHL, and NCAAB. It enables AI agents to analyze line movements, win rates, and betting edges using real-time data from sportsbettingaianalyzer.com.1117 PyPI5MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to access comprehensive sports data including football, basketball, American football, and hockey leagues via 11 tools, with no API key required.MIT
- AlicenseNot gradedqualityBmaintenanceEnables fetching sportsbook odds, live scores, and event information across 70+ books and 30+ leagues, with tools to list sports, get scores, and discover events.15 npm1MIT