An MCP server for Sleeper fantasy football — rosters, matchups, news, waivers, trades, lineups and pick'em
Four tools with clear, domain-specific names and detailed descriptions (avg 180 chars). All have input schemas with typed parameters. However, output schemas are not documented in the visible code, and error handling guidance is minimal. Tool names follow verb_noun convention well (find_my_leagues, league_info, auth_status, setup_token). Descriptions are contextual and explain prerequisites and use cases, which is strong. Parameter descriptions are present but some lack format constraints (e.g., 'season' accepts string but no validation shown). No tool annotations (readOnlyHint/destructiveHint) visible in schema definitions.
Where each setting came from and whether the token actually works. Call this first when a write or an authenticated read fails. It reports the token's length, shape and source (environment or config file), names the usual delivery mistakes — an unexpanded ${SLEEPER_TOKEN}, surrounding quotes, a "Bearer " prefix — and then asks Sleeper whether it accepts the token. The token itself is never included in the output.
Look up your Sleeper user id, your leagues, and your roster id in each. Start here. Everything this returns is what the other tools need, and none of it requires a token — it is all public.
League settings that change how everything else should be read. Scoring, roster slots, waiver type and the trade rules all vary by league, and several of them silently change what a tool's output means — a lineup is only valid against this league's slot layout, and points are only meaningful against this league's scoring.
Start a one-time local page for adding your Sleeper token SAFELY. Use this instead of ever pasting the token into the conversation. The server opens a random, single-use address on 127.0.0.1 that expires in five minutes; you open it in the browser where you are logged in to Sleeper and follow one of three routes (a one-line console snippet that needs nothing copied, a copy-and-paste into a masked field, or the manual DevTools path). The token goes browser -> loopback -> this process -> config file (0600), is verified against Sleeper before it is saved, and takes effect immediately — no restart. It never appears in a tool result.
Output schemas not documented. Tools return results but LLMs cannot see what fields to expect, forcing them to infer structure and plan downstream calls blindly.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) in schema. setup_token is marked WRITE but schema lacks destructiveHint; others marked READ_ONLY but lack readOnlyHint annotation.
Parameter 'season' in find_my_leagues accepts string with no format constraint or validation hint. Description says 'e.g. 2026' but no regex, enum, or length bounds documented.
setup_token description mentions 'confirm=True' parameter but no such parameter visible in input schema. Discrepancy between description and actual schema.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | <=2025-11-25 | v2 |
No error handling guidance in tool descriptions. If a tool fails (e.g., invalid username, token rejection), LLM has no recovery path documented.