Skip to main content
Glama
christianclaudio

io.github.christianclaudio/espn

🏈 mcp-server-espn

CI PyPI Python License: Apache-2.0 Coverage CodeRabbit Reviews

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

IMPORTANT

Community Project Disclaimer
mcp-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:

  1. Live Game State & Win Probability: Real-time game events (turnovers, scoring plays, pitching changes) shift momentum and expected outcomes dynamically.

  2. Key Player Injuries & Depth Chart Swaps: An in-game injury or substitution fundamentally alters team efficiency and tactical matchups.

  3. 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_*), and espn-news (news_*).

  • Hierarchical Middleware:

    • Parent: ParentAuditMiddleware (timing logs, audit trails, and secret scrubbing) and ReadOnlyGateMiddleware (fail-closed read-only enforcement).

    • Child: GamesDomainGuardMiddleware (query limit validation <= 100) and TeamsDomainGuardMiddleware (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/list by 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_tools takes a query), or regex patterns with --tool-search-backend regex (ESPN_MCP_TOOL_SEARCH_BACKEND=regex; search_tools takes a pattern).


📈 Sports Intelligence Workflows

Workflow 1: Live In-Game Win Probability & Situation Tracking

  1. Poll Active Games: Agent calls games_get_scoreboard(sport="football", league="nfl") to identify close games in the 2nd half.

  2. Fetch In-Game Situation & Win Probability: Call games_get_game_situation(sport="football", league="nfl", event_id="401872947") and games_get_win_probabilities(sport="football", league="nfl", event_id="401872947") to inspect down/distance, red zone state, and live win expectancy curve.

  3. 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

  1. Bio & Career Context: Call teams_get_athlete_bio(sport="football", league="nfl", athlete_id="12483") to retrieve draft capital, college pedigree, and physical metrics.

  2. Recent Gamelog & Splits: Pull teams_get_athlete_gamelog and teams_get_athlete_splits to analyze performance trends against specific defensive schemes and venue conditions.

  3. 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

football

nfl

nfl

National Football League

football

college-football

cfb, ncaa-football, fbs

NCAA College Football

basketball

nba

nba

National Basketball Association

basketball

mens-college-basketball

cbb, ncaa-basketball

NCAA Men's College Basketball

basketball

womens-college-basketball

wbb, ncaa-womens-basketball

NCAA Women's Basketball

basketball

wnba

wnba

Women's National Basketball Association

baseball

mlb

mlb

Major League Baseball

hockey

nhl

nhl

National Hockey League

soccer

eng.1

epl, premier-league

English Premier League

soccer

usa.1

mls

Major League Soccer

soccer

uefa.champions

ucl, champions-league

UEFA Champions League

soccer

esp.1

la-liga

Spanish La Liga

soccer

ita.1

serie-a

Italian Serie A

soccer

ger.1

bundesliga

German Bundesliga

soccer

fra.1

ligue-1

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

games_get_scoreboard

sport, league, date, week, season_type, group, limit

Final scores and results for any date (date=YYYYMMDD), plus live scores, state (pre/in/post), period/clock, TV broadcasts, starting probables. Returns event IDs for other game tools.

Games

games_get_game_summary

sport, league, event_id

Consensus betting lines, matchup predictor win %, ATS, scoring plays, drives, leaders, momentum.

Games

games_get_team_schedule

sport, league, team_id, season, season_type

Season schedule with historical game results and scores: the regular season by default, postseason games with season_type=3.

Games

games_get_standings

sport, league, season

Division, conference, and overall league standings, win-loss records, games back, and win percentages. season is the year the season ends (2016 = the 2015-16 NBA season), or the year it starts for soccer (2026 = the 2026-27 Premier League season); the response echoes requested_season, season, and season_display.

Games

games_get_rankings

sport, league

Top 25 national polls and rankings (AP Top 25, Coaches Poll, College Football Playoff).

Games

games_get_transactions

sport, league, limit

League-wide transactions, roster trades, waivers, signings, and releases.

Games

games_get_leaders_by_athlete

sport, league, limit, category, sort

Statistical leaderboards across players in a league.

Games

games_get_leaders_by_team

sport, league, limit, category, sort

Team statistical rankings and leaderboards.

Games

games_get_league_groups

sport, league

League conference, division, and structural group hierarchies.

Games

games_get_league_events

sport, league, dates

League-wide calendar of scheduled events, optionally filtered by date.

Games

games_get_league_draft

sport, league, season

League draft rounds, team selections, and pick results.

Games

games_get_scoreboard_header

sport, league

Live ticker scoreboard header data across games for a sport and league.

Games

games_get_event_odds

sport, league, event_id, competition_id

Sportsbook consensus and provider odds (spreads, totals, moneylines).

Games

games_get_play_by_play

sport, league, event_id, limit, page

Play-by-play sequence, clock, scoring, and drive events.

Games

games_get_game_situation

sport, league, event_id

Real-time in-game situation (down, distance, yardline, possession, red zone).

Games

games_get_win_probabilities

sport, league, event_id

Live and historical win probability curves across game progression.

Games

games_get_game_predictor

sport, league, event_id

Pre-game and in-game matchup predictor and projection metrics.

Games

games_get_calendar

sport, league, dates

League schedule calendar and active event dates across a season.

Games

games_get_futures

sport, league, season

Season futures betting markets (championship odds, win totals).

Games

games_get_power_index

sport, league, season

Team power index (FPI / BPI) ratings and efficiency metrics.

Teams

teams_search

query, type, limit

Global search for athletes and teams by name/keyword (type="player" or "team").

Teams

teams_list_teams

sport, league

Directory of all franchises/teams in a specified league with IDs, names, and logos.

Teams

teams_get_team

sport, league, team_id

Team detail overview, venue, record, standings summary, and upcoming scheduled event.

Teams

teams_get_team_statistics

sport, league, team_id

Comprehensive team and opponent statistical category splits (passing, rushing, etc.).

Teams

teams_get_team_roster

sport, league, team_id

Full active roster grouped by position, coach info, jersey numbers, and injury status.

Teams

teams_get_team_depth_chart

sport, league, team_id

Positional starter/backup hierarchy (QB1, QB2, etc.) to model injury substitution impacts.

Teams

teams_get_player_stats

sport, league, event_id

Boxscore statistics for individual athletes across game categories.

Teams

teams_get_athlete_overview

sport, league, athlete_id

Athlete biographical info, season/career stats, game logs, next game, and rotowire notes.

Teams

teams_get_athlete_bio

sport, league, athlete_id

Detailed athlete background, draft history, birth details, college pedigree.

Teams

teams_get_athlete_stats

sport, league, athlete_id, season

Full seasonal and career category statistics for an athlete.

Teams

teams_get_athlete_gamelog

sport, league, athlete_id, season

Game-by-game performance log for an athlete across a season.

Teams

teams_get_athlete_splits

sport, league, athlete_id, season

Situational statistical splits (home/away, turf/grass, monthly, vs opponents).

News

news_get_news

sport, league, limit

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-mcp

After 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-espn

3. Run via Docker

docker run --rm -i ghcr.io/christianclaudio/mcp-server-espn:latest

🎛️ Engine Configuration

Variable

CLI Flag

Default

Description

ESPN_BASE_URL

—

https://site.web.api.espn.com

Target ESPN REST CDN base URL (bypasses Akamai TLS filter)

ESPN_TIMEOUT_SECONDS

—

30.0

HTTP request timeout in seconds

ESPN_MCP_AUTH_TOKEN

—

unset

Shared bearer token required on HTTP transports (stdio ignores it)

ESPN_MCP_ALLOW_UNAUTHENTICATED_BIND

—

unset

1 accepts a tokenless HTTP bind to a non-localhost host

ESPN_MAX_RETRIES

—

3

Maximum retry attempts with jittered exponential backoff

ESPN_MCP_READONLY

—

0

Restrict server strictly to read-only inspection tools

ESPN_MCP_PROFILE

--profile

full

Domain sub-server profile: full, games, teams, news, readonly

ESPN_MCP_ENABLE_TOOL_SEARCH

--enable-tool-search

0

Replace flat tool catalog with dynamic search transform (search_tools + call_tool)

ESPN_MCP_TOOL_SEARCH_BACKEND

--tool-search-backend

bm25

Tool Search backend: bm25 (BM25SearchTransform, natural-language ranking; search_tools takes query) or regex (RegexSearchTransform, regex patterns; search_tools takes pattern)


🎮 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-mcp

Add 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 8000

Connect 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 tools
games_get_calendarGames Get CalendarB
Read-onlyIdempotent

Fetch league schedule calendar and active event dates across a season.

ParametersJSON Schema
NameRequiredDescriptionDefault
datesNo
sportYese.g. basketball
leagueYese.g. nba, eng.1

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 OddsB
Read-onlyIdempotent

Fetch sports betting odds, point spreads, over/under, and moneylines across sportsbooks via ESPN Core API.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
event_idYes
competition_idNo

TDQS

B3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 FuturesA
Read-onlyIdempotent

Fetch season futures betting markets (championship odds, conference champions, win totals).

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
seasonNoYear the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. Omit for ESPN's current.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 PredictorB
Read-onlyIdempotent

Fetch ESPN predictive matchup model win percentages, projected margins, and ratings.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
event_idYes
competition_idNo

TDQS

B3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 SituationA
Read-onlyIdempotent

Fetch real-time game situation (down, distance, yardline, possession, red zone, clock) via ESPN Core API.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
event_idYes
competition_idNo

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 SummaryA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
event_idYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 AthleteB
Read-onlyIdempotent

Fetch statistical leaderboards across a league for individual athletes (e.g. passing yards, rushing, points, strikeouts).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo
limitNo
sportYese.g. basketball
leagueYese.g. nba, eng.1
categoryNo

TDQS

B3.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 TeamB
Read-onlyIdempotent

Fetch team statistical leaderboards across a league (e.g. total offense, defensive points allowed, efficiency).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNo
limitNo
sportYese.g. basketball
leagueYese.g. nba, eng.1
categoryNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 DraftB
Read-onlyIdempotent

Fetch league draft rounds, team selections, and pick results for a draft year (e.g. the first overall pick).

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
seasonNoDraft year (the year it's held). Omit for ESPN's current.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 EventsB
Read-onlyIdempotent

Fetch league-wide calendar of scheduled events, optionally filtered by date; without dates it returns the current events.

ParametersJSON Schema
NameRequiredDescriptionDefault
datesNo
sportYese.g. basketball
leagueYese.g. nba, eng.1

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 GroupsB
Read-onlyIdempotent

Fetch league conference, division, and structural group hierarchies.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 PlayB
Read-onlyIdempotent

Fetch granular play-by-play sequence with clock, downs, distances, yardage, and scoring flags via ESPN Core API.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
limitNo
sportYese.g. basketball
leagueYese.g. nba, eng.1
event_idYes
competition_idNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 IndexB
Read-onlyIdempotent

Fetch league team power index (FPI / BPI) ratings and efficiency metrics.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
seasonNoYear the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. Omit for ESPN's current.

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 RankingsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description 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.

Purpose5/5

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.

Usage Guidelines3/5

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 ScoreboardA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYYMMDD, e.g. 20161102; omit for today.
weekNo
groupNo
limitNo
sportYese.g. basketball
leagueYese.g. nba, eng.1
season_typeNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 HeaderB
Read-onlyIdempotent

Fetch live ticker scoreboard header data across games for a sport and league.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportNoe.g. basketballfootball
leagueNoe.g. nba, eng.1nfl

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 StandingsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
seasonNoSeason 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 ScheduleA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
seasonNoYear the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts.
team_idYes
season_typeNo2 or omit: regular season; 3: postseason.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 TransactionsA
Read-onlyIdempotent

Fetch recent league player transactions (trades, free agent signings, waiver claims, roster activations, and injury reserve designations).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sportYese.g. basketball
leagueYese.g. nba, eng.1

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 ProbabilitiesC
Read-onlyIdempotent

Fetch high-density win probability timeline curve samples across an entire game.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sportYese.g. basketball
leagueYese.g. nba, eng.1
event_idYes
competition_idNo

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 NewsB
Read-onlyIdempotent

Fetch recent news headlines, injury updates, breaking analysis, and roster moves for a given sport and league.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sportYese.g. basketball
leagueYese.g. nba, eng.1

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 BioB
Read-onlyIdempotent

Fetch detailed athlete biography including birthplace, college, draft round and pick, experience, physical measurements, and background.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
athlete_idYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 GamelogA
Read-onlyIdempotent

Fetch game-by-game statistical performance log for an athlete across an entire season.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
seasonNoYear the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts.
athlete_idYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 OverviewB
Read-onlyIdempotent

Fetch athlete biographical information, season/career statistical splits, recent individual game logs, rotowire fantasy notes, and next upcoming match.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
athlete_idYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 SplitsA
Read-onlyIdempotent

Fetch situational split statistics for an athlete (home vs away, monthly performance, opponents, and win/loss splits).

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
seasonNoYear the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts.
athlete_idYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 StatsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
seasonNoEchoed only; ESPN returns every season's totals.
athlete_idYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 StatsA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
event_idYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 TeamB
Read-onlyIdempotent

Fetch detailed information for a single team including standing summary, overall record, venue, and next scheduled event.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
team_idYes

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 ChartB
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
team_idYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 RosterB
Read-onlyIdempotent

Fetch active team roster and injury designations grouped by position, including jersey numbers, experience, position abbreviations, and coaching staff.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
team_idYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 StatisticsB
Read-onlyIdempotent

Fetch team and opponent season statistics across offensive, defensive, and special teams categories.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1
team_idYes

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 TeamsA
Read-onlyIdempotent

Fetch all active teams in a given sport and league, returning team IDs, names, abbreviations, locations, and colors.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYese.g. basketball
leagueYese.g. nba, eng.1

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100% and the schema 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.

Purpose4/5

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.

Usage Guidelines3/5

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.

Tool Schema Changelog

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

  1. 32 tool updatesv2.0.0
    • Changedgames_get_calendar2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_event_odds2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_futures3 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / season / description
        Added value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. Omit for ESPN's current."
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_game_predictor2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_game_situation2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_game_summary2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_leaders_by_athlete2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_leaders_by_team2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_league_draft3 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / season / description
        Added value: +"Draft year (the year it's held). Omit for ESPN's current."
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_league_events2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_league_groups2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_play_by_play2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_power_index3 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / season / description
        Added value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts. Omit for ESPN's current."
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_rankings2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_scoreboard3 fields changed
      • addedInput schema / properties / date / description
        Added value: +"YYYYMMDD, e.g. 20161102; omit for today."
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_scoreboard_header2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_standings3 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / season / description
        Added 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."
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_team_schedule4 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / season / description
        Added value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts."
      • addedInput schema / properties / season_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "2 or omit: regular season; 3: postseason."
        +}
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_transactions2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedgames_get_win_probabilities2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changednews_get_news2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_athlete_bio2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_athlete_gamelog3 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / season / description
        Added value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts."
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_athlete_overview2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_athlete_splits3 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / season / description
        Added value: +"Year the season ends (2016 = 2015-16); NFL, MLB: the year played; soccer: the year it starts."
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_athlete_stats3 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / season / description
        Added value: +"Echoed only; ESPN returns every season's totals."
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_player_stats2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_team2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_team_depth_chart2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_team_roster2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_get_team_statistics2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
    • Changedteams_list_teams2 fields changed
      • addedInput schema / properties / league / description
        Added value: +"e.g. nba, eng.1"
      • addedInput schema / properties / sport / description
        Added value: +"e.g. basketball"
  2. 33 tool updatesv1.2.9
    • First observedgames_get_calendar
    • First observedgames_get_event_odds
    • First observedgames_get_futures
    • First observedgames_get_game_predictor
    • First observedgames_get_game_situation
    • First observedgames_get_game_summary
    • First observedgames_get_leaders_by_athlete
    • First observedgames_get_leaders_by_team
    • First observedgames_get_league_draft
    • First observedgames_get_league_events
    • First observedgames_get_league_groups
    • First observedgames_get_play_by_play
    • First observedgames_get_power_index
    • First observedgames_get_rankings
    • First observedgames_get_scoreboard
    • First observedgames_get_scoreboard_header
    • First observedgames_get_standings
    • First observedgames_get_team_schedule
    • First observedgames_get_transactions
    • First observedgames_get_win_probabilities
    • First observednews_get_news
    • First observedteams_get_athlete_bio
    • First observedteams_get_athlete_gamelog
    • First observedteams_get_athlete_overview
    • First observedteams_get_athlete_splits
    • First observedteams_get_athlete_stats
    • First observedteams_get_player_stats
    • First observedteams_get_team
    • First observedteams_get_team_depth_chart
    • First observedteams_get_team_roster
    • First observedteams_get_team_statistics
    • First observedteams_list_teams
    • First observedteams_search

TDQS

B3.2/5.0

Scored across 33 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides 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.
    12
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides 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.
    11
    17 PyPI
    5
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to access comprehensive sports data including football, basketball, American football, and hockey leagues via 11 tools, with no API key required.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    1
    MIT