Fantasy Football Analysis via Model Context Protocol - provides NFL player data, projections, coaching staff, draft assistance, and fantasy football tools
The NFL MCP server provides 9 tools with basic functionality for fantasy football analysis. Naming follows verb_noun conventions (fetch_, lookup_, search_, get_), which is good. Descriptions are present for all tools and generally adequate (range 50-200 chars), meeting minimum standards. However, schema quality is inconsistent: input parameters have type definitions and descriptions, but output schemas are not documented anywhere in the provided code. Parameter descriptions are present but often generic ('The NFLDatabase instance to query' appears 5 times verbatim). Error handling is not visible in the code snippets. The server demonstrates competent engineering (Dockerfile multi-stage build, proper dependencies, async patterns) but falls short on LLM-optimization of tool interfaces and lacks documented output structures. This is solidly mid-tier quality, functional but not production-grade for agentic use.
Fetch all NFL players from Sleeper API and store them in the local database. This tool fetches the complete athlete roster from Sleeper's API and upserts the data into the SQLite database for fast local lookups.
Get all athletes for a specific team. This tool retrieves all athletes associated with a given team ID from the local database.
Get the latest fantasy football player news from CBS Sports. This tool fetches current player news from CBS Sports Fantasy Football section and returns them in a structured format suitable for LLM processing.
Get fantasy football projections from CBS Sports. This tool fetches player projections from CBS Sports Fantasy Football for a specific position, week, and scoring format.
Get the coaching staff for a specific NFL team. The head coach comes from ESPN's Core API (the only coach ESPN exposes). Coordinators are enriched best-effort from the Wikipedia season-page infobox (``off_coach``/``def_coach``) — coverage is partial, so they may be null.
Output schemas completely undocumented. No tool provides documented return structures or field definitions. LLMs cannot plan downstream calls or extract required data from responses.
Generic parameter descriptions repeated verbatim across multiple tools ('The NFLDatabase instance to query' in lookup_athlete, search_athletes, get_athletes_by_team). These provide no LLM-actionable context beyond what the parameter name conveys.
No documented pagination support visible. Tools like get_cbs_player_news and get_draft_board accept a limit parameter but no offset/cursor, and no response documentation indicates whether pagination exists or how to retrieve additional results.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | C | 64 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 50 | - | v1 |
Build a tiered, VBD-ranked draft board (consensus values). Ranked by Value-Based Drafting (value over positional replacement), the ordering that actually wins drafts. Each player shows consensus value, overall/position rank, tier and VBD.
Everything needed to set a lineup for one week, in a single call.
Look up an athlete by their ID. This tool queries the local database for an athlete with the given ID and returns their information including name, team, position, etc.
Search for athletes by name (partial match supported). This tool searches the local database for athletes whose names match the given search term, supporting partial matches.
NFLDatabase is passed as a required parameter to 4 tools but no documentation explains what this object is, how it's initialized, or why it's not managed server-side. Exposes internal database abstraction to LLMs.
No documented error handling. No indication of which tools are idempotent (fetch_athletes is marked WRITE but has no dry-run or confirmation pattern). No recovery guidance provided.
Parameter descriptions lack constraint documentation. get_cbs_projections::position has no enum, get_draft_board::scoring has no enum, and parameter ranges/formats are undocumented.
No tool chaining documentation. If search_athletes returns partial athlete records, it's unclear whether lookup_athlete can be called with the athlete_id from that response. No documented reference fields for downstream calls.