Skip to main content
Glama
jmercer187

sleeper-mcp

by jmercer187

sleeper-mcp

MCP server + AI draft simulator for Sleeper fantasy football.

Unofficial project. Not affiliated with or endorsed by Sleeper. Uses the public Sleeper API read-only — no credentials required.

What it does

  • MCP server (stdio) exposing your Sleeper league, rosters, draft, and picks to any MCP client (Claude Code, Claude Desktop, opencode, etc.)

  • Full NFL player database (~12k players) with local TTL caching and fast name/team/position search

  • Normalized draft state: one clean JSON view of who's on the clock, what round, who has picked — works for snake, linear, keeper, and mid-draft states

  • Local draft simulator: run AI-vs-AI mock drafts (snake or linear) against real Sleeper league settings, with pluggable agent strategies

Related MCP server: Sleeper Fantasy Football MCP

Installation

Run directly with uvx (no install)

uvx sleeper-mcp          # starts the MCP stdio server
uvx sleeper-mcp --help   # CLI usage

pip / uv

pip install sleeper-mcp     # or: uv add sleeper-mcp
sleeper-mcp                 # bare invocation = MCP server
sleeper-mcp search "josh allen"

From source

cd /path/to/sleeper-mcp
uv sync --extra dev
uv run sleeper-mcp --help

MCP setup

Add to your MCP client config (e.g. ~/.config/opencode/opencode.json, Claude Desktop claude_desktop_config.json):

{
  "mcpServers": {
    "sleeper": {
      "command": "uvx",
      "args": ["sleeper-mcp"]
    }
  }
}

Or with pip-installed binary:

{
  "mcpServers": {
    "sleeper": {
      "command": "sleeper-mcp"
    }
  }
}

MCP tools

Tool

Description

get_league

League settings: roster positions, scoring, draft type

get_rosters

All rosters with players and owners

get_draft

Draft config: order, slots, type, status

get_draft_picks

All picks taken so far (or full completed draft)

search_players

Search the NFL player DB by name/team/position (cached locally)

get_player

Full player record by Sleeper player ID

get_draft_state

Normalized on-the-clock view: current round, pick number, team on the clock, their roster so far, remaining picks per team

refresh_players

Force-refresh the local player cache

Example — ask your AI client: "Who's on the clock in my Sleeper league and what have they drafted?" and it will call get_draft_state.

CLI

sleeper-mcp league 1234567890          # league settings
sleeper-mcp rosters 1234567890         # all rosters + owners
sleeper-mcp draft 1234567890           # draft config (league ID or draft ID)
sleeper-mcp picks 1234567890           # raw picks
sleeper-mcp state 1234567890           # normalized on-the-clock state (JSON)
sleeper-mcp search "buf qb"            # search players (name/team/position tokens)
sleeper-mcp player "Josh Allen"        # player by name or ID
sleeper-mcp refresh-players            # force player cache refresh
sleeper-mcp simulate --help            # AI-vs-AI mock draft

get_draft_state output (abridged)

{
  "league_id": "1234567890",
  "draft_id": "1234567891",
  "draft_type": "snake",
  "status": "in_draft",
  "current_round": 3,
  "pick_number": 22,
  "team_on_clock": {
    "roster_id": 10,
    "user_id": "u1",
    "display_name": "Alice",
    "slot": 1
  },
  "team_on_clock_roster": [
    {"player_id": 4984, "full_name": "Josh Allen", "position": "QB", "round": 2}
  ],
  "teams": [ ... ],
  "picks_taken": 21,
  "total_picks": 240
}

Architecture

MCP client (Claude Code, etc.)
        │ stdio / JSON-RPC
        ▼
sleeper_mcp.server   FastMCP tools (8)
        │
        ├── SleeperClient (async httpx) ──► api.sleeper.app  (public, read-only)
        ├── PlayerDatabase  ──► local TTL file cache (~12k players)
        ├── build_draft_state()  normalizes league+rosters+draft+picks
        └── DraftSimulation  in-memory snake/linear simulator (Python API + CLI)
  • No auth: the Sleeper public API requires no keys for league/draft/player reads.

  • Caching: player DB cached to disk (default TTL 24h); draft state cached in memory (default 30s) so repeated MCP calls during a live draft stay fast without hammering the API.

Configuration (env vars)

Variable

Default

Purpose

SLEEPER_API_BASE_URL

https://api.sleeper.app/v1

API base

SLEEPER_PLAYER_CACHE_TTL

86400

Player cache TTL (seconds)

SLEEPER_PLAYER_CACHE_PATH

platform cache dir

Player cache file location

SLEEPER_STATE_CACHE_TTL

30

In-memory draft-state TTL (seconds)

SLEEPER_HTTP_TIMEOUT

30

HTTP timeout (seconds)

Sleeper API limitations handled

  • /v1/players/nfl returns a dict keyed by player ID; team vs team_abbr field inconsistency is normalized.

  • pick_no is overall in recent payloads but per-round in older ones — both are detected and normalized.

  • Keeper/irregular draft orders get an approximate on-the-clock note when the order can't be fully derived from the API.

AI-assisted live drafting

Point your MCP client at the server, then during a real Sleeper draft ask things like:

  • "Who's on the clock and what do they have so far?"

  • "Search for available RBs on Buffalo and rank them by position scarcity in my league settings."

  • "Show me my roster after this pick — who's my best flex?"

The agent composes get_draft_state + search_players + get_league to reason about value. The server is read-only; it never takes picks for you.

AI-vs-AI mock drafts

examples/ai_vs_ai_draft.py runs full simulated drafts using real league settings (or defaults) and the local player DB:

uv run python examples/ai_vs_ai_draft.py --teams 4 --rounds 3
uv run python examples/ai_vs_ai_draft.py --league 1234567890 --strategy mixed
uv run python examples/ai_vs_ai_draft.py --type linear --out draft.json --verbose

Eight heuristic agents ship in the box: position_priority, aggressive_qb, zero_rb, hero_rb, wr_heavy, upside, conservative, contrarian. Write your own by implementing one method:

from examples.ai_vs_ai_draft import DraftAgent, DraftSimulation

class MyAgent(DraftAgent):
    name = "my_agent"

    def pick(self, sim: DraftSimulation, team_id: int) -> str:
        available = sim.available_players()
        # ... your strategy ...
        return chosen_player.player_id

The simulator (sleeper_mcp.simulator.DraftSimulation) is also importable directly for custom harnesses — it enforces snake/linear order, slot eligibility (including FLEX/SUPER_FLEX), and duplicate-player rejection.

Development

uv sync --extra dev
uv run pytest -q        # fully mocked; no network required
uv run sleeper-mcp --help

Layout:

sleeper_mcp/
  client.py       async httpx client + error hierarchy
  models.py       Pydantic models
  cache.py        player DB cache + search
  slots.py        slot assignment (starters/FLEX/SUPER_FLEX/bench)
  draft_state.py  normalization: on-the-clock, order, picks
  simulator.py    in-memory draft simulation
  server.py       FastMCP tools (stdio)
  cli.py          typer CLI; bare invocation = MCP server
tests/            pytest suite with httpx.MockTransport fakes
examples/         ai_vs_ai_draft.py

Roadmap / intentionally deferred

  • External data providers (ADP rankings, projections, news) — the search API is the extension seam; plug in any source

  • Batch multi-draft runner / league-wide tournament simulation

  • Streamable HTTP transport (stdio is sufficient for local MCP clients today)

License

MIT — see LICENSE.

Available Tools

8 tools
get_draftB

Fetch a Sleeper draft's metadata (type, status, rounds, team count).

Args: draft_id: The Sleeper draft ID (numeric string).

NameRequiredDescriptionDefault
draft_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden; 'Fetch' implies read-only, and naming the returned fields adds some behavioral context. It says nothing about behavior for an invalid or nonexistent draft_id, rate limits, or whether a live draft's data is fresh — gaps that matter for a stateful sports API.

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 tight sentences with the purpose front-loaded and no wasted prose. The 'Args:' block is slightly boilerplate against a one-parameter schema, but the format hint inside it earns its place.

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?

An output schema exists, so return values needn't be explained, and the tool is a simple one-parameter read. However, the presence of get_draft_state and get_draft_picks makes disambiguation essential and it is absent, leaving an agent to guess which call yields draft status versus picks.

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 0% (the schema only repeats 'Draft Id'), but the description compensates partially by specifying 'numeric string', which is genuinely useful format info. It does not say where to obtain the ID or what happens if it is malformed, so compensation is incomplete.

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+resource ('Fetch a Sleeper draft's metadata') with the returned fields enumerated (type, status, rounds, team count). It does not differentiate itself from the close siblings get_draft_state and get_draft_picks, whose scope overlaps on 'status' and draft data.

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 statement of when to use this versus get_draft_state or get_draft_picks, and no prerequisites (e.g., needing a valid league/draft ID from another call). Usage is only implied by the word 'metadata'.

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

get_draft_picksA

Fetch every pick in a draft, joined with player names and positions.

Args: draft_id: The Sleeper draft ID (numeric string).

NameRequiredDescriptionDefault
draft_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations at all, the description carries the full burden. It does disclose the shape of the result (picks joined with player names and positions) and the read-only nature is inferable from "Fetch," but nothing is said about ordering, completeness across rounds, pagination, or authentication requirements.

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 short sentences with the purpose front-loaded and the single parameter documented in a compact args block. The docstring-style formatting is slightly noisy but nothing is wasted and there is no filler.

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?

This is a simple single-parameter read tool with an output schema, so the description only needs to convey purpose and the parameter's format, both of which it does. The remaining gap — ordering/pagination of the returned picks — is minor given the output schema exists.

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

Parameters4/5

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

Schema description coverage is 0% and the schema only gives the title "Draft Id," so the description meaningfully compensates by specifying it is the Sleeper draft ID and that it is a numeric string. It stops short of an example value or where to obtain the ID, which is why this is a 4 rather than a 5.

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 every pick in a draft") and adds that results are enriched with player names and positions, which distinguishes it from get_draft and get_draft_state by implication. It never names those siblings explicitly, so differentiation is clear but not spelled out.

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 "every pick in a draft" implies the use case (full pick-by-pick retrieval rather than draft metadata or live state), but there is no explicit when-to-use guidance, no mention of get_draft/get_draft_state as alternatives, and no prerequisites or exclusions stated.

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

get_draft_stateA

Fetch the full normalized draft board for a Sleeper draft.

This is the primary tool for live-draft assistance. It combines the league settings (scoring, starting lineup), the draft metadata, the team on the clock, recent picks, every roster with slot assignments, all drafted player IDs and position counts into one compact payload.

Args: draft_id: The Sleeper draft ID (numeric string).

NameRequiredDescriptionDefault
draft_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose the composition of the payload and that it is 'normalized' and 'compact', and 'Fetch' makes the read-only nature clear, but it says nothing about data freshness (critical for a live draft), whether calls are rate-limited, or any auth/prerequisite requirements.

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 purpose, followed by the payload breakdown and a short args block. Every sentence carries information; only the Args section partially restates the schema, but it adds the numeric-string format so it still 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?

An output schema exists, so return values needn't be re-explained, and the single required parameter is documented. The only gap is behavioral context an aggregating live tool should mention (freshness/latency), which keeps it from a 5.

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 0% (the single property has no description), so the description must compensate — and it does, specifying 'The Sleeper draft ID (numeric string)', which adds a format constraint the schema does not encode. That is the only parameter, and it is fully explained.

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

Purpose5/5

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

States a specific verb and resource ('Fetch the full normalized draft board for a Sleeper draft') and immediately scopes it further as the primary live-draft tool. The aggregation sentence ('combines league settings, draft metadata, team on the clock, recent picks, every roster... into one compact payload') implicitly differentiates it from get_draft, get_draft_picks, get_rosters and get_league by showing it supersedes them.

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

Usage Guidelines4/5

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

'This is the primary tool for live-draft assistance' gives an explicit use context that an agent can act on. It stops short of naming when to prefer the narrower siblings (e.g. get_draft_picks) instead, so it lacks explicit alternatives or exclusions.

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

get_leagueA

Fetch a Sleeper league's settings.

Returns the league name, season, status, scoring settings (non-zero values only), starting lineup positions, bench/IR sizes and the league's draft_id.

Args: league_id: The Sleeper league ID (numeric string).

NameRequiredDescriptionDefault
league_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden, and it does disclose concrete return semantics — non-zero scoring values only, lineup positions, bench/IR sizes, and draft_id — which tell the agent what will and won't be present. "Fetch" implies a read-only operation, though the description says nothing about failure modes for an invalid or unknown league_id.

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?

Purpose is front-loaded in a single sentence, followed by a compact return summary and a short Args block. Every line is short and readable with no wasted prose.

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

Completeness4/5

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

An output schema exists, so the somewhat lengthy return-value enumeration is partially redundant, but it usefully flags the "non-zero values only" filtering that a schema alone may not communicate. Combined with the explicit league_id format, the definition is sufficient to invoke the tool correctly, missing only error-condition guidance.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate, and it does: it identifies league_id as a Sleeper league ID and specifies the numeric-string format, which the bare schema (type string, title "League Id") does not convey. With only one parameter there is little more to document.

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 opens with a specific verb and resource ("Fetch a Sleeper league's settings") and immediately enumerates the data returned, so the agent knows exactly what it gets. It does not explicitly contrast itself with siblings like get_rosters or get_draft, but the resource boundary is clear from the wording.

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: this is the entry point for league-level metadata, distinct from roster/draft tools. There is no explicit "use this when..." statement, no mention of what to call first (e.g., to obtain a league_id) and no exclusions or alternatives named.

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

get_playerA

Look up a single player by Sleeper player ID.

Args: player_id: The Sleeper player ID (numeric string).

NameRequiredDescriptionDefault
player_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral burden. The phrase 'Look up' implies a non-destructive read, and the parameter note mentions 'numeric string,' but the description does not disclose not-found behavior, authentication 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.

Conciseness4/5

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

The description is short and front-loaded with the main purpose. The Args section adds meaningful parameter detail, though it is slightly redundant in format with the schema.

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 tool is simple, has one required parameter, and has an output schema, so return values need not be explained. Still, with no annotations, the description does not explain error/not-found behavior or when to prefer this over search_players, leaving gaps for an agent.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate for the single parameter. It does so by clarifying that player_id is a Sleeper player ID and that it is a numeric string, adding useful meaning beyond the bare schema title.

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: 'Look up a single player by Sleeper player ID.' This clearly identifies a single-record lookup, which implicitly differs from search_players. However, it does not explicitly name or distinguish the sibling alternatives.

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 'Look up a single player by Sleeper player ID,' suggesting this tool is for cases where the ID is already known. It does not explicitly say when to use search_players instead or what to do if only a name is available.

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

get_rostersB

Fetch all rosters in a league with players resolved to names.

Each team lists its starters (with slot assignments) and bench.

Args: league_id: The Sleeper league ID (numeric string).

NameRequiredDescriptionDefault
league_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose the response shape (starters/bench, names resolved), which is genuinely useful. But it says nothing about permissions or auth requirements, rate limiting, behavior for invalid or empty leagues, or whether unrostered players are included.

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

Conciseness4/5

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

The key scope statement is front-loaded and the supporting detail follows in two short sentences with no filler. The Args block is brief and only mildly redundant with the surrounding 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 one-parameter read tool with an output schema present, what remains in the description is largely sufficient; the return shape is described and the parameter format clarified. Missing edge-case behavior (unknown league_id, empty rosters) is the only notable gap.

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 0% and the schema only says 'League Id' with type string, so the description's note that it is a Sleeper league ID in numeric-string form is real added meaning. It stops short of an example value or where to obtain the ID.

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?

A specific verb and resource ('Fetch all rosters in a league') plus the qualifier that players are resolved to names, and a breakdown of the returned shape (starters with slot assignments, bench). It is clearly distinct from siblings like get_league or get_draft, 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 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 tool, when not to, or which sibling to prefer for related data. The only implicit guidance is that a league_id is required, and the reader must infer that get_league is the place to look for that ID.

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

refresh_playersA

Force a refresh of the cached NFL player database from Sleeper.

Normally unnecessary: the cache is valid for 24 hours and refreshed automatically when stale. Use after major roster moves or injuries if you suspect the cached data is wrong.

Returns: Cache metadata: file path, fetch time, player count.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full load and does well: it discloses the 24-hour cache TTL, that refresh happens automatically when stale, and that this forces an out-of-band fetch from Sleeper. It stops short of stating failure behavior or external-API rate limits, which would matter for a network-triggering operation.

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 action, then the caveat, then the return note — a good order with no filler. The 'Returns:' block is partly redundant because an output schema exists, which keeps it from a 5.

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

Completeness4/5

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

For a no-param cache-refresh tool, the description covers purpose, timing, and the effect on cached data, and the output schema handles return shape. The only gap is any note on what happens if the upstream Sleeper call fails or is slow.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. There is nothing to clarify, and the description correctly avoids inventing parameter details.

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

Purpose5/5

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

States a specific verb and resource ('Force a refresh of the cached NFL player database from Sleeper'), making the mutation clear. This contrasts cleanly with read-only siblings like search_players, get_player, and get_rosters without needing to name them.

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

Usage Guidelines5/5

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

Explicitly says when NOT to use it ('Normally unnecessary: the cache is valid for 24 hours') and when to use it ('after major roster moves or injuries if you suspect the cached data is wrong'). This is exactly the when/when-not guidance an agent needs for an optional maintenance call.

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

search_playersA

Search the cached NFL player database by name, team or position.

Matching is fuzzy and case-insensitive (e.g. "josh allen", "Allen", "BUF", "QB"). Returns compact records with player_id, name, position, team and status.

Args: query: Name fragment, team abbreviation, or position. limit: Maximum number of results (default 10).

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden and does well: it discloses fuzzy, case-insensitive matching, the cached data source, and the compact return fields. It does not discuss cache freshness, refresh requirements, or explicit read-only semantics, but the core behavior is clear.

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

Conciseness5/5

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

The description is front-loaded with purpose and matching behavior, then compactly lists parameters. It uses examples efficiently and has no fluff. The return-field sentence is slightly redundant with the output schema but still supports immediate understanding.

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 search tool with an output schema, the description provides enough to invoke it correctly. It explains matching behavior and parameter meanings. The main gap is not routing the agent away from get_player or toward refresh_players when the cache may be stale.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It documents both parameters meaningfully: query as a name fragment, team abbreviation, or position, and limit as the maximum number of results with a default of 10. It could specify more about query edge cases or limit bounds, but the core semantics are covered.

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: "Search the cached NFL player database." It also clarifies the searchable fields (name, team, position) and matching behavior. It does not explicitly differentiate this from siblings like get_player or refresh_players, so it is clear but not sibling-routing.

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 by explaining that queries can be name fragments, team abbreviations, or positions, and gives examples. However, it does not explicitly state when to use this instead of get_player for exact lookup or refresh_players for cache updates.

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

Tool Schema Changelog

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

  1. 8 tool updatesv0.1.0
    • First observedget_draft
    • First observedget_draft_picks
    • First observedget_draft_state
    • First observedget_league
    • First observedget_player
    • First observedget_rosters
    • First observedrefresh_players
    • First observedsearch_players

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation4/5

Most tools target distinct resources and actions, and descriptions clarify the intended use of get_draft_state as a composite live-draft tool versus get_draft and get_draft_picks. There is some overlap because get_draft_state bundles draft metadata, recent picks, and drafted player IDs, so an agent may need to decide when the narrower get_draft/get_draft_picks tools are preferable.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern: get_league, get_rosters, get_draft, get_draft_picks, search_players, get_player, get_draft_state, refresh_players. The convention is predictable throughout, with clear resource-oriented names.

Tool Count5/5

Eight tools is well-scoped for a Sleeper fantasy football league/draft helper. Each tool has a clear role, and the set avoids unnecessary duplication or excessive surface area.

Completeness4/5

The surface covers the core fantasy football league and draft workflows: league settings, rosters, draft metadata, draft picks, player search/lookup, a live draft state aggregate, and cache refresh. Minor gaps remain around related league data such as matchups, standings, transactions, or user league discovery, but the primary draft-assistance purpose is well covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides read-only access to Sleeper fantasy football leagues, enabling team snapshots, available players, matchups, trade context, and league history through standardized MCP tools.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A read-only MCP server that supplies live context from Sleeper fantasy-football leagues, including rosters, trade analysis, draft picks, and league settings via Sleeper's public API.
    11
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only, league-aware Sleeper fantasy football draft context to AI assistants, including live picks, rosters, and player availability over Streamable HTTP MCP.
    100 npm
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server that provides access to public Sleeper NFL fantasy data, including leagues, rosters, matchups, waivers, drafts, and player information. It enables AI clients to retrieve fantasy football details without requiring authentication or account modifications.
    -