Skip to main content
Glama

chalktalk

An MCP server for composite NFL questions where the hard part is agreeing on what the words mean.

Status: working. Ingest, the feature layer, definitions and the MCP server are in place. See docs/plan/00-index.md for 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.

Related MCP server: mdx-mcp

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 sync
uv run chalktalk doctor

doctor 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 pytest

The 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.

Once a database exists, install the shipped vocabulary:

uv run chalktalk defs install

That is 45 definitions — early_exit, blowout, heavy_carries and so on — all ordinary specs you can read with chalktalk defs show NAME and change. star_player is deliberately not among them.

Building the database

uv run chalktalk build

This 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/.

Connect

Build the database first, then point an MCP client at the server.

claude mcp add chalktalk -- uv --directory /path/to/chalktalk run chalktalk serve

For Claude Desktop, the equivalent in claude_desktop_config.json:

{
  "mcpServers": {
    "chalktalk": {
      "command": "/absolute/path/to/uv",
      "args": ["--directory", "/path/to/chalktalk", "run", "chalktalk", "serve"],
      "env": { "CHALKTALK_HOME": "/Users/you/.chalktalk" }
    }
  }
}

Give command the absolute path to uvwhich uv will tell you, commonly ~/.local/bin/uv. A bare "uv" works for claude mcp add, which inherits your shell, but Claude Desktop is launched by the OS and does not get your PATH; it fails to start the server with an error that does not mention PATH. Quit Desktop completely and reopen it after editing the file — closing the window is not enough.

CHALKTALK_HOME defaults to ~/.chalktalk and holds the database, your definitions and the audit log. Pass it explicitly if you keep them elsewhere.

The server exposes eleven tools. The ones that matter to a person: propose_definition when a word has no agreed meaning yet, save_definition once you have chosen, query to ask, and raw_sql for the questions the tool surface cannot yet express. Every query answer carries the definitions it used, the seasons it covered, a sample of matched rows and the SQL.

What a session looks like:

you   How many times have star players played fewer than 15 snaps
      before leaving with injury? By season.

      → unresolved_term: star_player
          star_by_snaps     top 10% of snap share last season, within position group
          star_by_contract  top 10% of pay as a share of the cap, within position group
          star_by_draft     a first-round pick

you   the contract one

      → saved star_player, copied from star_by_contract
      → Count of player-games (REG, 2013–2025) where star_player [prior season]
        and early_exit and snaps_unit < 15, by season.

        2013  2    2016  5    2019  3    2022  6
        2014  4    2017  7    2020  4    2023  5
        …

        definitions used: star_player, early_exit, played, regular, left_early,
        snap_drop, exit_evidence, listed_injured_next, on_reserve_soon,
        started, missed_next_game_as_starter, exit_corroborated
        warning: participation evidence is unavailable before 2016; snap_drop
                 carries the evidence in 2013–2015

The refusal is the point. Ask again next week and it answers straight away, because star_player now means the thing you chose — and every answer says so.

Three things always come back with the number: the definitions behind it, the seasons it could actually cover, and a sample of the matched rows. That last one matters more than it sounds. A rested starter in the final week looks identical in the data to an injury exit, so the rows are how you catch a wrong one.

Your definitions

They live in $CHALKTALK_HOME/definitions/, one JSON file each, outside the database — which is discarded and rebuilt every week. Losing them to a data refresh would be the worst bug this could have, so they are kept somewhere a rebuild cannot reach.

cd ~/.chalktalk/definitions && git init && git add -A && git commit -m "my vocabulary"

That is the whole backup story: they are plain JSON, so they diff, they merge, and you can edit one by hand and the server picks it up. Previous versions are kept under .history/ whenever you overwrite or delete one.

uv run chalktalk defs list              # what you have
uv run chalktalk defs show early_exit   # what it means, all the way down
uv run chalktalk defs export ~/backup   # or import, for sharing a set

chalktalk logs terms tells you which of them you actually reach for, and which raw fields you keep spelling out instead of naming.

Rebuilding

The database is disposable and versioned by date. Rebuild it weekly during the season — the whole thing takes about a minute and the old artifact stays on disk.

0 6 * * 3 /Users/you/.local/bin/uv --directory /path/to/chalktalk run chalktalk build

On macOS, launchd is more reliable than cron for a laptop that sleeps. Save this as ~/Library/LaunchAgents/com.chalktalk.build.plist and launchctl load it:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0"><dict>
  <key>Label</key><string>com.chalktalk.build</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/you/.local/bin/uv</string>
    <string>--directory</string><string>/path/to/chalktalk</string>
    <string>run</string><string>chalktalk</string><string>build</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict><key>Weekday</key><integer>3</integer><key>Hour</key><integer>6</integer></dict>
  <key>StandardErrorPath</key><string>/tmp/chalktalk-build.log</string>
</dict></plist>

Rollback is editing one file. data/CURRENT holds the filename the server opens; point it at the previous artifact and the next tool call picks it up without a restart.

ls ~/.chalktalk/data/                       # the last three builds are kept
echo nfl-20260901.duckdb > ~/.chalktalk/data/CURRENT

chalktalk doctor will tell you what is currently loaded, how old it is, and whether any of your definitions stopped compiling against it.

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.

Available Tools

11 tools
build_statusA

What this server is running on: which database artifact, when it was built, the seasons it holds, whether the latest is still in progress, how many definitions exist and how many are broken.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

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

There are no annotations, so the description carries the behavioral burden. It strongly implies a read-only informational call through the phrase 'what this server is running on' and the listed status fields, but it does not explicitly state side effects, permissions, or caching behavior.

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 sentence that packs the essential status categories into a concise, scannable list. There is no filler or redundant information.

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?

With zero parameters and an output schema available, the description covers the key semantic categories: artifact, build time, seasons, progress, and definition health. An agent has enough context to invoke and understand the tool correctly.

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?

The tool has zero parameters, so the schema trivially covers everything. The description adds meaningful context about the actual status fields returned, which helps an agent interpret the output without needing parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly explains what build_status provides: database artifact, build time, seasons, progress state, and definition counts. It is specific enough to distinguish it from sibling tools like coverage or describe_schema, though it lacks a direct verb phrase.

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 this tool is for inspecting server build/status information, but it does not explicitly state when to use it instead of alternatives such as coverage or describe_schema. No exclusions or alternative routing are provided.

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

coverageA

The seasons a thing can answer for. Accepts table.column, entity.attribute, or the name of a definition. A query is refused when what it asks for reaches outside this window, so check here before promising a range.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral disclosure burden. It reveals that the tool accepts three ref formats and ties the coverage window to query refusal, which is useful context. However, it does not describe what the tool returns, whether it is read-only, or what happens on invalid references, leaving meaningful gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and each sentence contributes: the core concept, accepted input forms, and a usage directive. The first sentence is slightly cryptic, but the overall structure is efficient and free of filler.

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 single-parameter tool, the description covers the accepted ref formats and the key use case of checking coverage before promising a range. An output schema is present, so the lack of return-value details in the description is acceptable, though a short example would make it even more complete.

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?

The input schema only provides the parameter name 'ref' with no description, so the description adds essential meaning by specifying that ref can be a table.column, entity.attribute, or definition name. This is strong value beyond the sparse schema, though it stops short of giving concrete examples or formatting rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description defines coverage as 'the seasons a thing can answer for' and lists accepted reference forms, which conveys that the tool returns or checks time coverage. However, it never uses an explicit verb like 'returns' or 'checks,' and the metaphorical 'seasons' language is vaguer than needed to distinguish the tool's exact function clearly.

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 gives concrete usage guidance: 'check here before promising a range' and explains that queries are refused when they fall outside the coverage window. It clearly communicates when the tool should be called, even though it does not explicitly name alternative tools for other scenarios.

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

delete_definitionA

Delete a definition. Its previous version is kept in history, so this is recoverable. Anything built on top of it becomes broken until it is replaced.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations present, the description carries the full burden of disclosing behavior. It does so meaningfully: it states that deletion is recoverable because the previous version is kept in history, and it warns that dependent artifacts become broken until replaced. This goes well beyond a generic 'deletes a definition' statement.

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 two short sentences with no filler. The core action is front-loaded, and the second sentence adds valuable consequence information that earns its place.

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 this is a destructive tool with no annotations, the description covers the two most important contextual aspects: recoverability and downstream breakage. The output schema exists so return-value details are not required. It is slightly incomplete in not framing when to prefer this over alternatives, but it is otherwise sufficient for a single-parameter deletion tool.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explain the 'name' parameter beyond what the schema already shows. The parameter is simple and self-descriptive to some degree, but the description adds no clarification about what name refers to or any format/constraints, leaving the full burden on a schema that contains no descriptions.

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 names a specific verb ('Delete') and resource ('a definition'), making the tool's purpose immediately clear. It also distinguishes this from sibling tools like save_definition, get_definition, and list_definitions by stating it is the removal operation.

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 helpful context about the consequences of deleting, but it does not explicitly state when to use this tool versus alternatives or when not to use it. Usage is implied by the tool name and the CRUD-style sibling set, but no direct routing or exclusions are provided.

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

describe_schemaA

Describe what can be queried: the six entities (game, team_game, team_season, player_game, player_season, play), their namespaces (e.g. prior., game., next.), and every attribute with its coverage window. Attributes are the only raw fields a plan may reference. Anything that is a concept rather than a field — "star", "starter", "injury", "blowout" — must be a term: see list_definitions and propose_definition.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityNo
include_play_columnsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and does a good job: it states what the tool returns—entities, namespaces, attributes, and coverage windows—and reveals a key domain rule that attributes are the only raw fields a plan may reference. It does not explicitly discuss output format or side effects, but 'Describe' and the output schema make the read-only nature sufficiently clear.

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 two dense, purposeful sentences with no filler. The main capability is front-loaded, and the second sentence adds a crucial caveat with concrete sibling pointers. Every sentence earns its place.

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 an output schema exists and this is a read-only descriptive tool, the description sufficiently covers what the agent learns and when to route to definition tools instead. The only meaningful gap is the undocumented include_play_columns parameter, but the overall guidance is strong enough for correct invocation.

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

Parameters2/5

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

The input schema has 0% description coverage, so the description must compensate. It does provide the valid domain for the entity parameter by listing the six entity names, but it says nothing about include_play_columns, its default behavior, or how filtering by entity affects the result. One parameter remains essentially undocumented.

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 the specific verb 'Describe' and identifies a precise resource: what can be queried, including the six entities, their namespaces, and every attribute with its coverage window. This immediately distinguishes it from definition-related tools like list_definitions and propose_definition.

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 gives a clear decision rule: raw fields belong to this schema, while concepts such as 'star' or 'injury' must be terms looked up via list_definitions and propose_definition. It does not cover all sibling alternatives, but the most important schema-vs-definition distinction is explicit.

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

explain_queryA

Dry run. Shows the English reading of the plan, which definitions it will use, the seasons it will cover, warnings, and the SQL. Use it to confirm your interpretation with the user before running an expensive or ambiguous query.

ParametersJSON Schema
NameRequiredDescriptionDefault
planYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden. 'Dry run' and 'before running' strongly communicate that this tool does not execute the query, and the description details the informational output it produces. It could be more explicit about side-effect-free behavior, but the dry-run framing is sufficient.

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 two short sentences with no filler. The first sentence front-loads the core behavior, and the second adds a concrete usage scenario. Every word earns its place.

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?

The description adequately explains what the tool does, what it returns, and when to use it, and an output schema exists so return-value details are less critical. However, because the plan parameter is a complex nested object with no schema descriptions, the description leaves the main invocation detail under-specified.

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

Parameters2/5

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

The only parameter, plan, is an object with additionalProperties allowed and 0% schema description coverage. The description repeatedly references 'the plan' and implies it is a query plan, but it provides no structural guidance about what fields the plan object should contain or how to construct it.

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 and resource: it 'Shows the English reading of the plan' and lists the concrete contents shown (definitions, seasons, warnings, SQL). It also distinguishes itself from executing siblings like query and raw_sql by explicitly labeling the operation a 'Dry run', making its non-execution role clear.

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 gives explicit usage context: 'Use it to confirm your interpretation with the user before running an expensive or ambiguous query.' This clearly tells an agent when to invoke it, though it does not name alternatives or explicitly say when not to use it.

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

get_definitionA

Everything about one definition: its spec, a nested English explanation of the definitions it is built from, the attributes it uses as evidence, its coverage, and its previous versions.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the transparency burden and does a solid job by disclosing the specific components of the result: spec, nested English explanation of dependencies, evidence attributes, coverage, and previous versions. It does not discuss failure modes or read-only guarantees, but 'get' plus the enumerated return content makes the behavior clear for a retrieval operation.

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 front-loaded sentence that conveys the tool's full scope via a colon-separated list. Every listed item earns its place, and there is no filler.

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 one-parameter read operation with an output schema, the description is nearly sufficient. It names the major result categories and implies the domain. It misses only a small amount of context, such as explicitly linking the `name` parameter to the definition identifier, so it is not a 5.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not explicitly explain that the required `name` parameter is the identifier of the definition to retrieve or what format/valid values it accepts. The tool name and 'one definition' provide weak inference, but the description does not compensate for the schema's lack of documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (one definition) and enumerates the content areas returned: spec, nested English explanation, evidence attributes, coverage, and previous versions. It stops short of a 5 because it lacks an explicit verb like 'retrieves' or 'returns' and does not directly distinguish itself from the coverage or list_definitions siblings beyond the 'one definition' scope.

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 a clear use case: when an agent needs comprehensive details about a single definition. It does not explicitly name alternatives or exclusions, but the 'everything about one definition' framing distinguishes it from list-oriented siblings such as list_definitions.

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

list_definitionsC

The user's vocabulary. Every term used in a query must be here. Broken definitions (a column they depend on disappeared) are listed with the reason and cannot be used until fixed.

ParametersJSON Schema
NameRequiredDescriptionDefault
familyNo
include_brokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.2/5.0
Behavior2/5

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

No annotations are provided, and the description does not state whether this operation is read-only or has side effects. It does not disclose any behavioral details beyond listing definitions and noting broken ones.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively short but includes extraneous phrasing (e.g., 'Every term used in a query must be here') that does not directly explain the tool's function. It is not overly verbose, but it could be more streamlined and front-loaded.

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

Completeness2/5

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

The description does not explain what the tool returns, how the parameters affect results, or the context of use relative to the other tools. Given the simplicity of the schema, the lack of detail leaves significant gaps for an agent trying to invoke it correctly.

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

Parameters1/5

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

The input schema includes 'family' and 'include_broken', but the description provides no explanation of these parameters or their impact. The schema itself has no descriptions, so the meaning of the parameters is completely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description implies listing definitions ('Broken definitions ... are listed') and mentions the vocabulary concept, but it does not explicitly state a clear verb like 'list' or 'retrieve'. It is not a tautology, but it is somewhat indirect and could be clearer.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like get_definition, query, or delete_definition. The statement about every term being in the vocabulary hints at a use case but does not explicitly contrast with sibling tools.

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

propose_definitionA

Call this when a query needs a concept that has no definition yet, or when query returns unresolved_term. Returns existing near-matches, ready-to-save candidate definitions grounded in what the data can compute (each with an English explanation and coverage), related attributes, and the five signal schemas for composing something new. Present the candidates to the user and let them choose or adjust. Do not pick one silently.

ParametersJSON Schema
NameRequiredDescriptionDefault
termYes
entityNo
contextNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/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, and it is mostly strong: it discloses that candidates are grounded in computable data, include explanations/coverage, and must not be selected silently. It doesn't explicitly state that nothing is saved yet, though 'ready-to-save' and 'present to the user' strongly imply it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the usage trigger and is only three sentences. The first sentence is long and list-heavy, but every part adds useful guidance.

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?

It covers the main workflow and output well, and an output schema exists, but it omits the optional parameters and does not clarify follow-up tool calls such as save_definition after user approval. This is acceptable for a tool with only one required parameter but not fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description should compensate by explaining the parameters. It only implicitly covers term; entity and context are completely unexplained, leaving the agent to guess whether or when to populate them.

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 opens with an explicit trigger: call when a concept lacks a definition or when query returns unresolved_term. It also names the concrete outputs (near-matches, candidate definitions, coverage, related attributes) and makes the tool's role clear relative to plain query or lookup tools.

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 tells exactly when to call the tool and instructs the agent to present candidates to the user rather than choosing silently. It does not explicitly name alternatives like get_definition or save_definition, but the no-definition/unresolved-term condition implicitly separates it from those.

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

queryA

Run a structured query. plan is {entity, where, seasons, game_types, group_by, metrics, order_by, limit, allow_partial_coverage, sample_rows, question}; where clauses are {"term": name} for concepts, {"attr": name, "op": …, "value": …} for raw fields, and {"not"|"any_of"|"all_of": …} to combine. Every fuzzy word in the user's question must be a term. If a term has no definition this tool returns unresolved_term — do not replace it with an attribute rule to get past the error; call propose_definition and ask the user. The result includes definitions_used, the seasons actually covered, a sample of matched rows and the SQL; report the definitions and coverage alongside the number, because the number is not meaningful without them. If warnings mention evidence unavailable for early seasons, say so.

ParametersJSON Schema
NameRequiredDescriptionDefault
planYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/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 the unresolved_term return, the instruction not to work around it, the result contents (definitions_used, seasons covered, sample, SQL), the caveat that the number is not meaningful without definitions/coverage, and the meaning of warnings.

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 dense but every sentence adds necessary operational detail. Inline code keeps the plan and where syntax scannable, and the warnings/error-handling instructions are placed where they matter.

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 complex query tool with one unstructured parameter, the description provides solid coverage of plan structure, error handling, result contents, and warning interpretation. It remains slightly vague about allowed operator values for op and the exact semantics of each metric/grouping field, though an output schema may fill that gap.

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

Parameters5/5

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

Schema coverage is 0%, but the description fully compensates by enumerating every plan field and explaining where-clause syntax for concepts, raw fields, and boolean combinators. Without this, the single opaque plan object would be unusable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool runs a structured query and explains the plan object, so the agent knows its core function. It does not explicitly contrast itself with sibling tools like raw_sql or explain_query, but the structured query framing distinguishes it reasonably.

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 gives concrete guidance: every fuzzy word must be a term, and on unresolved_term the agent should call propose_definition and ask the user rather than substituting an attribute rule. It does not explicitly state when to choose query over raw_sql or explain_query, but the error-handling guidance is strong.

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

raw_sqlA

Escape hatch: read-only SQL over every raw and derived table (see describe_schema and coverage). A single SELECT or WITH statement, row cap, timeout, no file or network access. Results carry no definitions — prefer query for anything involving a concept, and tell the user when a number came from raw SQL. Every call is logged; recurring raw queries are how new attributes get prioritised.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYes
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses read-only access, no file or network access, single SELECT/WITH statements, row caps, timeouts, lack of definitions in results, and logging behavior—far beyond what the schema alone provides.

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 dense but every sentence earns its place: purpose, constraints, alternative tool guidance, and operational side effects are all packed into a highly readable format. The most important distinguishing information is front-loaded.

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?

Given the tool's complexity and the presence of an output schema, the description is fully sufficient. It covers scope, safety, usage boundaries, logging, and fallback behavior without needing to describe return values, which the output schema already handles.

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?

Schema description coverage is 0%, so the description must compensate for missing parameter documentation. It adds meaning by specifying that `sql` must be a single SELECT or WITH statement and implying `limit` through the row-cap constraint, though it does not explicitly name the limit parameter.

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 opens with 'Escape hatch: read-only SQL over every raw and derived table,' which clearly states the tool's function, scope, and constraints. It also distinguishes itself from `query` by noting that raw SQL results carry no definitions and that `query` should be preferred for concept-based work.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when to use this tool versus `query`, directing concept-related queries to `query` and raw/derived table access here. It also provides practical guidance such as telling the user when a number came from raw SQL and noting that recurring raw queries drive attribute prioritization.

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

save_definitionB

Save a definition the user has chosen. copy_of copies an existing definition (e.g. star_by_snaps) under a new name. Saving is versioned; previous versions are kept. Tell the user what was saved in plain English — the returned explanation is written for that.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
basisNo
entityNo
paramsNo
signalNo
aliasesNo
copy_ofNo
overwriteNo
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

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

With no annotations, the description carries the responsibility for behavior. It usefully discloses that saving is versioned and previous versions are kept, and that the returned explanation is meant for telling the user what was saved in plain English. It does not cover permissions or the exact effect of overwrite, but what it does disclose is substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler, covering the core action, a key parameter, versioning, and user-facing output in a compact structure. It is front-loaded with the main purpose and remains readable.

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

Completeness2/5

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

The tool has nine parameters and no annotations, and the output schema only covers the return shape. The description addresses only a small fraction of the parameter space, leaving most inputs ambiguous. An agent could handle the simplest save but would be under-equipped for complex definitions or overwrite semantics.

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

Parameters2/5

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

Schema description coverage is 0%, so the description needs to compensate, but it only explains `copy_of`. The other eight parameters, including basis, entity, params, signal, aliases, overwrite, and description, remain unexplained. This leaves the agent guessing about most of the input semantics.

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 clear verb, 'save', and resource, 'definition', and specifies it saves the definition the user has chosen. It also distinguishes the copy_of sub-behavior with a concrete example. This clearly separates it from sibling tools like list_definitions or delete_definition.

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

Usage Guidelines2/5

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

The description implies usage when the user has chosen a definition to save, but provides no explicit when-to-use or when-to-avoid guidance. It does not mention alternatives such as propose_definition, nor does it clarify when to use copy_of versus a fresh save beyond one line.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updatesv0.1.0
    • First observedbuild_status
    • First observedcoverage
    • First observeddelete_definition
    • First observeddescribe_schema
    • First observedexplain_query
    • First observedget_definition
    • First observedlist_definitions
    • First observedpropose_definition
    • First observedquery
    • First observedraw_sql
    • First observedsave_definition

TDQS

A3.7/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct facet: schema/coverage metadata, definition management, query execution, and operational status. There is no functional overlap; query and explain_query are clearly separated as execution vs. dry run.

Naming Consistency4/5

Most tools follow a verb_noun pattern in snake_case (describe_schema, list_definitions, save_definition). Minor outliers like query, raw_sql, coverage, and build_status break the strict pattern but remain perfectly readable.

Tool Count5/5

Eleven tools is well within the ideal range and each one earns its place: two for metadata, five for definition lifecycle, three for querying, and one for status. The count matches the server's scope with no redundancy.

Completeness5/5

The surface covers discovery, definition management (create, read, update via versioned save, delete), and all query modes (dry run, structured, raw). Build status adds operational completeness, and versioning covers recovery.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables natural language querying of OLAP/SSAS cubes with verified MDX generation, self-consistency checks, and honest abstention when queries are ambiguous.
    4
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables natural-language querying of a local DuckDB warehouse of NFL play-by-play data, converting questions into SQL and returning results.
    19
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables natural-language queries over data warehouses with catalog-grounded semantics and per-query authorization, returning answers with attached reasoning.
    Apache 2.0