Skip to main content
Glama
travispotterAZ

sleeper-draft-mcp

sleeper-draft-mcp

A local MCP server that gives an AI assistant live visibility into a Sleeper fantasy football draft: who's been picked, who's available, whose turn it is, and where your roster is thin.

It uses only Sleeper's public, keyless REST API (https://api.sleeper.app/v1). No login, no API key, no third-party hosting. See Auth below.

There's also a static web app in web/ — a browser draft room (paste a Sleeper draft ID or an ESPN draft link → live picks / available players / whose turn / roster needs) that talks to Sleeper and ESPN directly and deploys to GitHub Pages.

Requirements

  • Node.js >= 22 (uses the built-in fetch, the test runner, and --experimental-strip-types). Developed on Node 24.

Related MCP server: sleeper-mcp

Install & build

npm install
npm run build      # tsc -> dist/
npm test           # unit tests for the draft math + roster-needs logic

Run it directly during development (no build step) with:

npm run dev

MCP client config

Point your MCP client at the built server over stdio:

{
  "mcpServers": {
    "sleeper-draft": {
      "command": "node",
      "args": ["C:/Users/tsjsp/sleeper-draft-mcp/dist/server.js"]
    }
  }
}

(There's a copy of this at mcp.config.example.json.) Use an absolute path to dist/server.js. Optionally set SLEEPER_CACHE_DIR in an "env" block to move the player cache.

Tools

Tool

Input

What it returns

get_league

username, season?

Resolved user_id + the user's NFL leagues (league_id, name, status, scoring, draft_id). Season defaults to the current NFL season.

get_draft_info

league_id or draft_id

draft_id, type (snake/linear/auction), status, team count, rounds, third-round-reversal flag, and the slot → roster → owner mapping.

get_draft_picks

draft_id, limit?

Ordered picks so far: pick_no, round, slot, roster_id, and the resolved player name / position / team. Poll this every 5–10s during a live draft.

get_available_players

draft_id, position?, search?, limit?, include_unranked?, include_idp?

Undrafted players (cache minus picks), sorted by Sleeper's search_rank (rough ADP). Fantasy positions only and ranked-only by default.

whose_turn

draft_id, my_roster_id?

The pick on the clock (computed from pick count via snake math), the next few picks, and — with my_roster_id — an on_the_clock flag plus picks-until-your-next-turn.

get_my_roster_needs

league_id/draft_id, my_roster_id

Your picks so far vs. the league's required starting slots, with thin positions flagged. FLEX / SUPER_FLEX / REC_FLEX aware.

get_trending_players

type (add/drop), lookback_hours?, limit?

Sleeper's most-added / most-dropped players. Rough signal only — not rankings.

refresh_player_cache

Force a re-download of /players/nfl and rewrite the disk cache.

Typical flow

  1. get_league with your Sleeper username → pick your league_id.

  2. get_draft_info with that league_id → get the draft_id, confirm draft type, and find your roster_id in the draft-order table.

  3. During the draft, loop on get_draft_picks / whose_turn (with your my_roster_id), and get_available_players / get_my_roster_needs when you're on the clock.

Player cache

/players/nfl is a ~5 MB JSON blob, so it's fetched once and written to cache/players.json (override with SLEEPER_CACHE_DIR). It's refreshed automatically when the file is missing or older than 24h; refresh_player_cache forces it. The server also warms the cache in the background on startup.

Snake-draft math

src/snake.ts is pure and unit-tested (test/snake.test.ts). It handles:

  • linear drafts — every round runs slots 1..N

  • standard snake — odd rounds 1..N, even rounds N..1

  • third-round reversal (settings.reversal_round, "3RR") — the flip that would normally happen entering round reversal_round is applied one round early, then alternates from there.

whose_turn reads draft.type and draft.settings.reversal_round from Sleeper rather than assuming pure snake. Auction drafts are detected and reported as "no turn order".

Auth — does any of this need a key?

No. Every endpoint used here is public and unauthenticated:

GET /state/nfl
GET /user/{username}
GET /user/{user_id}/leagues/nfl/{season}
GET /league/{league_id}
GET /league/{league_id}/drafts
GET /league/{league_id}/users
GET /league/{league_id}/rosters
GET /draft/{draft_id}
GET /draft/{draft_id}/picks
GET /players/nfl
GET /players/nfl/trending/{add|drop}

The Sleeper client (src/sleeper.ts) treats any 401/403 as a hard error that tells you to flag it — so if Sleeper ever starts requiring a key on one of these, you'll hear about it loudly instead of silently.

Rate limit: stay under ~1000 calls/min. Polling picks every 5–10s during a live draft is well within that.

Dev smoke test

smoke.mjs drives the built server through the MCP client SDK:

node smoke.mjs dist/server.js
# optionally exercise the live-draft tools:
SLEEPER_USER=your_username SLEEPER_DRAFT=some_draft_id node smoke.mjs dist/server.js

Web app

web/ is a dependency-free static site (vanilla ES modules, no build step). It calls the Sleeper and ESPN read APIs straight from the browser — both send permissive CORS headers, so no proxy or server is needed.

  • Home — one input. Paste a Sleeper draft ID / league ID / username, a sleeper.com/draft/… URL, or an ESPN draft link (fantasy.espn.com/football/draft?leagueId=…&teamId=…, mock-draft-lobby leagues included — the league must be public). Sleeper numeric input is tried as a draft, then as a league; a username lists that user's leagues to pick from.

  • Draft room (#/draft/<id>, or #/draft/espn_<leagueId>_<teamId>):

    • On the clock banner — team, round/pick, on-deck, and (once you pick your team) "your next pick is N away". Snake / linear / 3RR aware.

    • Available players — trimmed player list minus picks, sorted by search_rank (ESPN: PPR draft rank), with position chips + name search. Once you've picked your team this panel switches to Your picks, listed in draft order.

    • Recent picks — reverse-chronological, your picks highlighted.

    • Your roster & needs — counts by position vs. the league's required starters (FLEX/SUPER_FLEX/REC_FLEX aware).

    • Draft board — toggleable snake-aware grid, current pick outlined.

    • auto-refresh every 6s (toggle), plus a manual refresh. Poll requests are cache-busted so Sleeper's CDN can't serve a stale/empty pick list.

  • Player dictionary (~5 MB) is fetched once, trimmed to fantasy-relevant players (~tens of KB), and cached in localStorage for 24h. "↻ players" forces a refresh. "You are" and recent drafts also persist in localStorage. For ESPN drafts the pool is ESPN's top ~400 by PPR draft rank (via kona_player_info), cached per league for 6h.

AI pick suggestions (optional, bring-your-own-key)

The "Claude's pick" panel in the draft room can call the Anthropic API for a live recommendation. It bundles the current state — league format, your roster, roster needs, top ~30 available by ADP, and recent picks — into one prompt and shows Claude's suggested pick plus alternatives.

  • Draft plan (the collapsible in that panel) is free text saved to localStorage (key sleeper_draft_plan, shared across drafts). Put your round targets, mid/late targets, and position tactics there — e.g. "Puka in R1", "Kittle rounds 8–10", "no QB before R9", "2 WR + 2 RB by end of R4". It's sent with every ask as strategic guidance; Claude follows it when it can and flags a PLAN: line when it deviates. "Use template" drops in a starting point.

  • Set key stores an Anthropic API key in this browser's localStorage only (key sleeper_anthropic_key). It is never committed, never in the deployed JS, and is sent only to api.anthropic.com (over HTTPS, with the anthropic-dangerous-direct-browser-access header). Clearing the field removes it.

  • Put a spend cap on the key. Create a dedicated key in the Anthropic console with a low monthly limit and delete it after draft season — that caps the worst case if the browser it's stored in is ever compromised.

  • The CSP header restricts outbound requests to Sleeper and Anthropic, so a stray/injected script can't exfiltrate the key elsewhere.

  • Model is claude-sonnet-5 (fast, ~pennies per draft); change MODEL in web/lib/advisor.js to claude-opus-5 for deeper reasoning. Auction drafts aren't supported by the advisor.

Run it locally

cd web && python -m http.server 8777   # or any static server
# open http://localhost:8777

Deploy to GitHub Pages

  1. Push this repo to GitHub (default branch main).

  2. Settings → Pages → Build and deployment → Source: GitHub Actions.

  3. The included workflow (.github/workflows/pages.yml) publishes web/ on every push that touches it. The site lands at https://<user>.github.io/<repo>/.

  4. Edit REPO_URL at the top of web/app.js so the footer "Source" link points at your repo.

Hash-based routing (#/draft/…) means no Pages redirect config is needed and draft-room URLs are shareable.

Project layout

src/                 MCP server (TypeScript, compiled to dist/)
  server.ts    MCP server + tool definitions (stdio transport)
  sleeper.ts   keyless Sleeper REST client + response types
  context.ts   draft_id/league_id -> resolved draft context (slots, owners, settings)
  players.ts   disk cache + player-id / name-search indexes
  snake.ts     pure draft-position math (snake / linear / 3RR)
  needs.ts     roster-needs vs. required-starters math
web/                 static browser app (deployed to Pages)
  index.html
  app.js       router + home + draft-room views
  styles.css
  lib/         sleeper.js (browser API client), snake.js, needs.js, players.js
test/                MCP server unit tests (node:test)
  snake.test.ts
  needs.test.ts
web-tests/           web-app checks (run by `npm test`)
  logic.mjs    snake.js port parity vs. known results
  render.mjs   mounts app.js in jsdom against a stubbed draft

Available Tools

8 tools
get_available_playersGet undrafted playersA

Players not yet drafted in this draft, from the cached dictionary minus the picks made. Sorted by Sleeper's search_rank (rough ADP; lower is better). Defaults to fantasy positions only and drops unranked players.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
searchNoCase-insensitive name substring filter.
draft_idYes
positionNoFilter to a single position, e.g. RB, WR, QB, TE, K, DEF.
include_idpNoInclude IDP defensive positions (DL/LB/DB).
include_unrankedNoInclude players with no search_rank (retired/deep roster).

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden and does disclose key behaviors: data source (cached dictionary minus picks), sorting (search_rank), and default filters. However, it does not mention cache staleness, potential pagination, or that limit defaults to 40, leaving some behavioral aspects undisclosed.

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 dense sentences provide high-value information without filler. Every sentence adds functional detail: data source, computation, sorting, and default exclusions.

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 list-with-filters tool with no output schema, the description explains the core behavior, default filtering, and sorting. It lacks explicit statement about the return type (player list) but that is inferable. Overall sufficient for correct invocation.

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%, so some parameters (limit, draft_id) lack schema descriptions. The description does not explain limit or draft_id, but it does clarify the meaning of include_idp and include_unranked via defaults. It partially compensates but does not fully cover the undocumented 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?

Description clearly states the action: fetching players not yet drafted in this draft, computed from the cached dictionary minus picks. It adds sorting and default filtering details that distinguish it from siblings like get_draft_picks or get_trending_players.

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?

The description specifies default behavior (fantasy positions only, drops unranked players) and context (during a draft, available players). It does not explicitly mention when to prefer this over siblings, but the tool's purpose is self-evident and no alternative routing is ambiguous enough to require exclusion.

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

get_draft_infoGet draft metadataA

Draft settings for a league (or an explicit draft_id): draft type (snake/linear/auction), status, team count, rounds, third-round-reversal flag, the slot -> roster -> owner mapping, and the league's required starting slots.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idNoUse this to target a specific draft; otherwise the league's most recent draft is used.
league_idNo

TDQS

A3.8/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 disclosure burden. It details what fields are returned, which is helpful, but it doesn't mention whether this is a read-only operation (likely safe), what happens if no draft exists, or any rate limits or side effects. It adds reasonable contextual value but leaves some behavioral gaps given no 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?

The description is a single, dense sentence that front-loads the main resource (draft settings) and enumerates the specific fields returned. Every clause adds information, and there is no fluff or repetition. It is well-structured and efficient.

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 that there is no output schema and no annotations, the description does a solid job of listing the return contents and clarifying the draft_id vs league_id fallback behavior. Minor missing context includes the default behavior when neither parameter is provided (likely 400 or error) and whether the operation is read-only, but overall it is fairly complete for a metadata retrieval tool.

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 50%: draft_id is well-documented, but league_id has no description. The description explains that league_id targets the league's most recent draft implicitly, but doesn't add much beyond the schema for draft_id. The tool description does clarify the relationship between draft_id and league_id, which helps, but league_id semantics remain thin.

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 clearly states the tool retrieves draft settings, lists specific fields (draft type, status, team count, rounds, third-round-reversal flag, slot->roster->owner mapping, required starting slots), and mentions an explicit draft_id or league default. It distinguishes itself from siblings like get_draft_picks by focusing on metadata and settings, making its purpose unmistakable.

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 context: it returns draft settings for a league's most recent draft or a specific draft via draft_id. It does not explicitly state when to use this over siblings like get_league or get_draft_picks, nor does it mention prerequisites or exclusions. The context is clear but lacks explicit alternative guidance.

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

get_draft_picksGet picks made so farA

Ordered list of picks already made in a draft. Poll this every 5-10s during a live draft. Player names/positions/teams are resolved from the cached player dictionary (falling back to pick metadata).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoOnly return the most recent N picks.
draft_idYes

TDQS

A4.2/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 full burden for behavioral disclosure. It reveals that player data is resolved from a cached player dictionary with fallback to pick metadata, hinting at potential data staleness, and it specifies a polling interval. This is useful context, though it omits any explicit statement of side-effect freedom or response 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?

Two sentences, each carrying essential information: the result type, the polling guidance, and the data resolution behavior. The most usable information is front-loaded and there is no redundancy with the schema. This is model conciseness.

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 must convey enough about the return value. It communicates an ordered list of picks and the fact that player names, positions, and teams are resolved, giving the agent a mental model of each pick's contents. While the exact fields of a pick object are not enumerated, the stated ordering and fallback behavior are sufficient for a simple polling tool.

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?

The schema documents the optional limit parameter as returning the most recent N picks, while draft_id is only typed as a string with no description. The tool description adds no detail about either parameter and thus doesn't compensate for the missing draft_id semantics. Since draft_id is self-evident from the tool name and limit is already well-described, this is adequate but not exceptional.

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 the tool returns an ordered list of draft picks already made, which clearly identifies the resource and behavior. It distinguishes itself from sibling tools like get_available_players (unpicked players) and whose_turn (next pick) by focusing on completed picks. The title 'Get picks made so far' reinforces this precision.

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

Usage Guidelines4/5

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

It gives explicit advice to poll every 5–10 seconds during a live draft, which defines a concrete use case and cadence. It does not explicitly contrast with alternatives, but the mention of live polling and cached resolution implies when it is appropriate. Without exclusions or named fallback tools, it falls just short of the strongest guidance.

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

get_leagueGet leagues for a userA

Resolve a Sleeper username to a user_id and list that user's NFL leagues for a season (defaults to the current NFL season). Use the returned league_id with the other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
seasonNoSeason year, e.g. 2026. Defaults to the current NFL season.
usernameYesSleeper username (not display name)

TDQS

A4.2/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 behavioral burden. It discloses a two-step behavior (username resolution before listing), the default season behavior, and that the output contains league_id for reuse. It does not mention error cases, but the disclosed behavior is sufficient for a read-only lookup.

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 with no redundancy: the first states the operation and default, the second explains how to use the result. The key workflow constraint (league_id reuse) is front-loaded.

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 resolver with no output schema, the description provides the essential context: what the tool returns (a list of leagues with league_id) and how the result fits into the wider toolset. It omits error behavior, but that is a minor gap for this straightforward lookup.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents username and season. The description restates the default season and refers to username resolution but adds no new parameter-level detail beyond the schema. Baseline 3 is appropriate.

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 action: resolve a Sleeper username to a user_id and list that user's NFL leagues for a season. It also clarifies the tool's role in the workflow by telling the agent to use the returned league_id with other tools, distinguishing it from the sibling tools that handle players, drafts, and rosters.

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?

The description implies the tool is the entry point for user-league lookups: it resolves the username, lists leagues, and returns league_id for downstream tools. It does not explicitly name alternative tools or when not to use it, but the context is clear because the siblings serve different purposes.

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

get_my_roster_needsRoster needs vs. required startersA

Compare the players a roster has drafted so far against the league's required starting lineup and flag thin positions. Needs the league's roster_positions, so pass league_id (or a draft_id whose league is known).

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idNo
league_idNo
my_roster_idYesYour roster_id in the league.

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries full burden. It explains the core analysis behavior but does not disclose side effects (e.g., read-only nature), permission requirements, error handling if roster_positions is missing, or return format. For a tool named 'get', read-only is implied but never stated.

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 with no superfluous content. The first sentence explains the purpose, the second gives essential usage context and parameter guidance. Highly efficient and front-loaded.

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 simple 3-parameter tool with no output schema, the description covers functionality, dependencies, and parameter selection. Missing details like return values or failure modes are not critical but would make it fully complete. Overall, sufficient for an agent to invoke correctly.

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

Parameters3/5

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

Schema description coverage is only 33% (my_roster_id is described in the schema). The description adds meaning for league_id and draft_id by explaining their role in locating roster_positions, but it does not clarify their format or relationship beyond 'or' — nor does it elaborate on the required my_roster_id beyond the schema's brief note. Partial compensation for low schema coverage.

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 uses a specific verb ('compare') and resource ('players a roster has drafted so far against the league's required starting lineup') and states the outcome ('flag thin positions'). It clearly differentiates from sibling tools like get_draft_info or get_draft_picks, which focus on draft data rather than roster needs analysis.

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?

The description explicitly states a prerequisite ('Needs the league's roster_positions') and provides the required parameter guidance ('pass league_id (or a draft_id whose league is known)'). It does not explicitly mention when to avoid this tool, but the context is clear for a roster analysis use case.

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

refresh_player_cacheForce-refresh the player cacheA

Re-download Sleeper's /players/nfl dictionary (~5MB) and rewrite the disk cache. Normally automatic (daily); use this if names look stale.

ParametersJSON Schema
NameRequiredDescriptionDefault

No 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 burden. It discloses the key behavioral trait: re-downloading a ~5MB dictionary and rewriting disk cache. It does not mention potential latency or network dependency, but the core side effect is clearly stated.

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 with no wasted words. The action is stated first, followed by context and usage condition. Every word contributes.

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

Completeness5/5

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

For a zero-parameter, no-output-schema maintenance tool, the description provides complete context: what it does, data size, frequency, and when to invoke manually. Nothing essential 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?

Tool has zero parameters, so schema coverage is complete and no parameter descriptions are needed. Baseline of 4 is appropriate; description need not add parameter meaning.

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?

Description states a specific verb ('Re-download') and resource (Sleeper's /players/nfl dictionary), with clear action (rewrite disk cache). It is clearly distinct from sibling query tools like get_available_players or get_trending_players, which all retrieve data rather than refresh a cache.

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?

Explicitly says when to use: 'use this if names look stale' and notes the normal automatic daily behavior. It doesn't mention when not to use it, but no alternative tool performs this refresh function, so the guidance is sufficient.

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

whose_turnWhose pick is itA

Compute the pick currently on the clock from the number of picks made, using snake-draft math (honours linear drafts and third-round reversal). Pass my_roster_id to get an on_the_clock flag and picks-until-your-next-turn.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYes
my_roster_idNoYour roster_id in the league; enables the 'you' fields.

TDQS

A3.7/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 burden. It discloses the calculation logic and special cases (linear, third-round reversal), and explains the optional flag behavior. However, it does not state whether the tool is read-only, what happens if draft_id is invalid or draft is complete, or describe the return format/side effects.

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 with no fluff. The primary purpose is front-loaded, and the optional parameter behavior is logically placed second. Every clause contributes meaningful information.

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 simple two-parameter computation tool, the description covers the core purpose and optional behavior but lacks important context: there is no output schema, no note about error conditions (e.g., draft finished), no mention of whether this function is deterministic from the given inputs, and no cross-reference to related draft tools. This leaves some ambiguity for correct invocation.

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 50%: my_roster_id has a schema description and the description adds specific meaning ('on_the_clock flag and picks-until-your-next-turn'), but draft_id is only named, not explained. The description does not clarify that draft_id is used to fetch the draft state, relying on the agent's inference.

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 clearly states a specific verb ('Compute') and resource ('the pick currently on the clock'), and explains the mathematical approach (snake-draft, linear drafts, third-round reversal). It distinguishes itself from sibling tools like 'get_draft_picks' by focusing on current turn calculation rather than listing picks.

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 context for when the tool is useful (knowing whose pick it is) and how to use the optional my_roster_id, but it does not explicitly compare to alternatives or state when not to use it. Usage is implied rather than clearly scoped against siblings.

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

TDQS

A4/5.0
Disambiguation5/5

Each tool targets a clearly distinct task: market trends, cache refresh, on-the-clock computation, roster needs, league resolution, draft settings, draft picks list, and available players. While whose_turn and get_draft_picks both relate to draft state, their descriptions separate the calculation from the raw list, eliminating ambiguity.

Naming Consistency4/5

Six of eight tools follow the get_<noun> snake_case pattern, but refresh_player_cache uses a different verb and whose_turn is a sentence fragment rather than a verb_noun action. The inconsistency is minor and naming remains predictable overall.

Tool Count5/5

Eight tools form a focused and well-scoped set for live-draft assistance, covering data acquisition, draft configuration, pick tracking, turn calculation, and roster analysis without bloat. The cache refresh tool, though maintenance-oriented, is justified by the large player dictionary requirement.

Completeness5/5

The tool surface covers the full workflow for preparing and executing a draft: resolve a user's league, fetch draft settings, poll picks, determine whose turn it is, evaluate roster needs, and list undrafted players. No essential draft-related operation is missing, and the trending players tool adds useful pre-draft signal.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    This Model Context Protocol server provides access to the Sleeper Fantasy Football API, enabling agents to fetch data about users, leagues, drafts, rosters, matchups, and player information without requiring an API key.
    6
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI models to manage and query fantasy sports leagues through the Sleeper API, supporting tasks like player lookups, league activity, and draft management.
    71
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Enables natural language interaction with Sleeper Fantasy Football API data, allowing queries about leagues, players, matchups, draft results, and trade analysis.
    13
    15

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/travispotterAZ/sleeper-draft-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server