chalktalk
chalktalk
An MCP server for composite NFL questions where the hard part is agreeing on what the words mean.
Status: in progress. Ingest works —
chalktalk buildpulls nflverse into a local DuckDB file. The feature layer, definitions and the server are not built yet. Seedocs/plan/00-index.mdfor the phase ledger.
The problem
Take a real question:
"How many times have star players played fewer than 15 snaps before leaving with injury? Total by season."
Three of those phrases have no corresponding field anywhere in the data:
"star players" — no such marker exists. Prior-season snap share above some percentile? Draft capital? Pro Bowl selection? Contract APY? Each yields a different answer.
"before leaving with injury" — nothing records in-game exits. The injuries table is the weekly report — practice participation and game designation, published before kickoff. Exits have to be inferred.
"fewer than 15 snaps" — the only clean one, and it still needs a decision about whether special teams counts.
A text-to-SQL system will silently pick definitions and return a confident number. chalktalk refuses to do that.
The definition gate
The query tool rejects any call containing an unresolved term:
{ "error": "unresolved_term",
"term": "star_player",
"message": "No definition found. Call propose_definition first.",
"suggestions": ["..."] }propose_definition then returns candidates grounded in what is actually
computable, each tagged with the seasons it covers. You pick or edit. The choice
is saved and reused silently from then on, and every answer states which
definitions produced it.
Over time you accumulate a personal metric vocabulary you never sat down to design. This inverts the usual semantic-layer model, where a data team authors definitions up front.
Install (development)
Requires Python 3.12+ and uv.
uv syncuv run chalktalk doctordoctor prints the resolved paths under CHALKTALK_HOME (default
~/.chalktalk), whether a built database is present, and the versions of duckdb,
nflreadpy and polars it will use.
uv run pytestThe default run is the unit tier and needs no data. Tests that require a built
database are marked data and are opt-in: uv run pytest -m data.
Building the database
uv run chalktalk buildThis downloads every nflverse dataset from the 2013 season on and writes one
immutable ~/.chalktalk/data/nfl-YYYYMMDD.duckdb, then points CURRENT at it.
Roughly a minute and 720 MB. --plan shows what would be downloaded without
downloading anything; --seasons and --only narrow it.
The file is disposable — rebuild it weekly and nothing is lost, because
definitions live outside it under ~/.chalktalk/definitions/.
Design
Architecture and rationale: CLAUDE.md.
Rejected alternatives and why: docs/decision-history.md.
The short version: one process, one DuckDB file on local disk, 2013 season floor, Python. Definitions are stored as specs rather than SQL and live outside the database, which is discarded and rebuilt weekly.
Data and attribution
Data comes from nflverse, via
nflreadpy. chalktalk distributes code, not data — you pull from nflverse
yourself when you build the database.
Two distinct layers, worth keeping separate:
The compiled nflverse dataset is licensed CC BY 4.0 (attribution, no ShareAlike).
The underlying NFL data belongs to its respective owners and is governed by their terms of use. nflverse does not claim to grant rights to it, and neither does this project.
The MIT license on this repository covers this project's code only. It grants no rights to NFL data.
Credits
nflverse for the data infrastructure this is built on.
nfl-mcp(MIT) — the ingest module here is adapted from theirs, with the notice retained. It solves a different problem well: if you want a fantasy football tool, use it rather than this.
License
MIT — see LICENSE.
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/dmalament-wheelsup/chalktalk'
If you have feedback or need assistance with the MCP directory API, please join our Discord server