sleeper-draft-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sleeper-draft-mcpWhose turn is it in draft 1234567890? Show available RBs and my roster needs."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 logicRun it directly during development (no build step) with:
npm run devMCP 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 |
|
| Resolved |
|
|
|
|
| Ordered picks so far: |
|
| Undrafted players (cache minus picks), sorted by Sleeper's |
|
| The pick on the clock (computed from pick count via snake math), the next few picks, and — with |
|
| Your picks so far vs. the league's required starting slots, with thin positions flagged. FLEX / SUPER_FLEX / REC_FLEX aware. |
|
| Sleeper's most-added / most-dropped players. Rough signal only — not rankings. |
| — | Force a re-download of |
Typical flow
get_leaguewith your Sleeper username → pick yourleague_id.get_draft_infowith thatleague_id→ get thedraft_id, confirm draft type, and find yourroster_idin the draft-order table.During the draft, loop on
get_draft_picks/whose_turn(with yourmy_roster_id), andget_available_players/get_my_roster_needswhen 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..Nstandard snake — odd rounds
1..N, even roundsN..1third-round reversal (
settings.reversal_round, "3RR") — the flip that would normally happen entering roundreversal_roundis 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.jsWeb 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
localStoragefor 24h. "↻ players" forces a refresh. "You are" and recent drafts also persist inlocalStorage. For ESPN drafts the pool is ESPN's top ~400 by PPR draft rank (viakona_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(keysleeper_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 aPLAN:line when it deviates. "Use template" drops in a starting point.Set key stores an Anthropic API key in this browser's
localStorageonly (keysleeper_anthropic_key). It is never committed, never in the deployed JS, and is sent only toapi.anthropic.com(over HTTPS, with theanthropic-dangerous-direct-browser-accessheader). 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); changeMODELinweb/lib/advisor.jstoclaude-opus-5for 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:8777Deploy to GitHub Pages
Push this repo to GitHub (default branch
main).Settings → Pages → Build and deployment → Source: GitHub Actions.
The included workflow (
.github/workflows/pages.yml) publishesweb/on every push that touches it. The site lands athttps://<user>.github.io/<repo>/.Edit
REPO_URLat the top ofweb/app.jsso 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 draftAvailable Tools
8 toolsget_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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No | Case-insensitive name substring filter. | |
| draft_id | Yes | ||
| position | No | Filter to a single position, e.g. RB, WR, QB, TE, K, DEF. | |
| include_idp | No | Include IDP defensive positions (DL/LB/DB). | |
| include_unranked | No | Include players with no search_rank (retired/deep roster). |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | No | Use this to target a specific draft; otherwise the league's most recent draft is used. | |
| league_id | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Only return the most recent N picks. | |
| draft_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| season | No | Season year, e.g. 2026. Defaults to the current NFL season. | |
| username | Yes | Sleeper username (not display name) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | No | ||
| league_id | No | ||
| my_roster_id | Yes | Your roster_id in the league. |
TDQS
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.
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.
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.
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.
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.
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.
get_trending_playersTrending adds/dropsB
Sleeper's trending players (most added or dropped across all leagues in the lookback window). Rough signal only — NOT rankings or ADP.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | add | |
| limit | No | ||
| lookback_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It discloses that the data is a rough signal and explicitly not rankings/ADP, which sets expectations about data quality. However, it does not mention any other behavioral aspects such as data freshness, rate limits, or return format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise—two sentences—and front-loads the core functionality. The caveat about being a rough signal immediately follows the primary purpose. Every word adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no output schema or annotations, the description provides the core purpose but lacks guidance on parameter usage, expected return shape, and when to choose this tool over siblings. The tool is easy to understand but incompletely documented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'added or dropped' and 'lookback window', which indirectly hints at the 'type' and 'lookback_hours' parameters, but does not explicitly describe any of the three parameters or their constraints. The description adds minimal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: retrieving Sleeper's trending players (most added or dropped) within a lookback window. It explicitly differentiates the tool from rankings or ADP, which helps distinguish it from potential alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives is provided. The phrase 'Rough signal only' implies it is not a precise source, but there is no mention of sibling tools or specific use cases.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| draft_id | Yes | ||
| my_roster_id | No | Your roster_id in the league; enables the 'you' fields. |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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
Read-only ESPN, Sleeper, and Fantrax fantasy leagues for Claude, ChatGPT, and other AI tools.
The full 2026 fantasy draft board, free to any AI agent. No key, no email, no signup.
NFL analytics tools for AI agents: stats, fantasy, injuries, schedules, and advanced analysis.
Read-only fantasy analysis for ESPN, Yahoo, and Sleeper leagues via MCP
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceThis 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
- AlicenseNot gradedqualityBmaintenanceEnables AI models to manage and query fantasy sports leagues through the Sleeper API, supporting tasks like player lookups, league activity, and draft management.71MIT
- FlicenseAqualityCmaintenanceEnables natural language interaction with Sleeper Fantasy Football API data, allowing queries about leagues, players, matchups, draft results, and trade analysis.1315
- FlicenseNot gradedqualityBmaintenanceEnables Claude to securely read Sleeper fantasy football league data over the internet via the public API, supporting access from both Claude Desktop and mobile devices.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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