Skip to main content
Glama

Prediction Markets Quant

NFL Prop Market Board (Kalshi vs the books vs exchanges)

nfl_prop_board
Read-only

Use for "where is the best price on receiving yards" and "is Kalshi cheaper than the books". Best price on every NFL prop this week: Kalshi (fee included) vs five books (DraftKings, FanDuel, BetRivers, Fanatics, ESPN) and the Novig and ProphetX exchanges — the best price per side, how much cheaper Kalshi is than the books, the consensus gap, and the Kalshi close once a strike settles. Filter by team, game, player or stat.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "nfl_prop_board"
  }
}

Input Schema

NameRequiredDescriptionDefault
gameNoGame anchor away-home, e.g. "ne-sea" — rows for that game only.
teamNoTeam abbrev (SEA, NE, LAR, JAX) — rows for that club only.
limitNoMax rows (default 15; 3 when the call has no arguments).
playerNoPlayer name (partial, case-insensitive), e.g. "Nacua".
gapsOnlyNoOnly strikes where Kalshi and the consensus are 5¢+ apart (default false).
positionNoOptional position filter. One of: QB · RB · WR · TE.
statTypeNoOptional prop type filter. One of: pass_yds · pass_tds · rush_yds · rec_yds · receptions · anytime_td.

Output Schema

NameRequiredDescriptionDefault
rowsNoPriced Kalshi prop strikes: player, stat, strike, Kalshi book, consensus, venue quotes, gap, best price per side.
weekNoNFL week.
countNoRows returned.
sourcesNo
summaryNoBoard counts: listed, booked, consensus-priced, gaps, arbs, games.
tell_userNoShow this sentence to the user first.
timestampNo
needs_inputNo
example_callNo
data_freshnessNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / limit / description
      Previous value: -"Max rows (default 15)."New value: +"Max rows (default 15; 3 when the call has no arguments)."
  2. Changed4 schema fields changed
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • changedInput schema / properties / limit / description
      Previous value: -"Max rows (default 15). Values above 50 are clamped to 50."New value: +"Max rows (default 15)."
    • addedInput schema / properties / position
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "enum": [
      +        "QB",
      +        "RB",
      +        "WR",
      +        "TE"
      +      ],
      +      "type": "string"
      +    }
      +  ],
      +  "description": "Optional position filter. One of: QB · RB · WR · TE."
      +}
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
  3. Changed2 schema fields changed
    • removedInput schema / properties / limit / anyOf
      Removed value: -[
      -  {
      -    "anyOf": [
      -      {
      -        "type": "number"
      -      },
      -      {
      -        "type": "string"
      -      }
      -    ]
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / limit / type
      Added value: +[
      +  "number",
      +  "string",
      +  "null"
      +]
  4. Changed4 schema fields changed
    • addedInput schema / properties / statType / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "enum": [
      +      "pass_yds",
      +      "pass_tds",
      +      "rush_yds",
      +      "rec_yds",
      +      "receptions",
      +      "anytime_td"
      +    ],
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / statType / description
      Previous value: -"Optional prop type filter."New value: +"Optional prop type filter. One of: pass_yds · pass_tds · rush_yds · rec_yds · receptions · anytime_td."
    • removedInput schema / properties / statType / enum
      Removed value: -[
      -  "pass_yds",
      -  "pass_tds",
      -  "rush_yds",
      -  "rec_yds",
      -  "receptions",
      -  "anytime_td"
      -]
    • removedInput schema / properties / statType / type
      Removed value: -"string"
  5. Changed6 schema fields changed
    • addedInput schema / properties / limit / anyOf
      Added value: +[
      +  {
      +    "anyOf": [
      +      {
      +        "type": "number"
      +      },
      +      {
      +        "type": "string"
      +      }
      +    ]
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / limit / default
      Removed value: -15
    • changedInput schema / properties / limit / description
      Previous value: -"Max rows (default 15)."New value: +"Max rows (default 15). Values above 50 are clamped to 50."
    • removedInput schema / properties / limit / maximum
      Removed value: -50
    • removedInput schema / properties / limit / minimum
      Removed value: -1
    • removedInput schema / properties / limit / type
      Removed value: -"integer"
  6. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "properties": {
      +    "count": {
      +      "description": "Rows returned."
      +    },
      +    "data_freshness": {},
      +    "example_call": {},
      +    "needs_input": {},
      +    "rows": {
      +      "description": "Priced Kalshi prop strikes: player, stat, strike, Kalshi book, consensus, venue quotes, gap, best price per side."
      +    },
      +    "sources": {},
      +    "summary": {
      +      "description": "Board counts: listed, booked, consensus-priced, gaps, arbs, games."
      +    },
      +    "tell_user": {
      +      "description": "Show this sentence to the user first.",
      +      "type": "string"
      +    },
      +    "timestamp": {
      +      "type": "string"
      +    },
      +    "week": {
      +      "description": "NFL week."
      +    }
      +  },
      +  "type": "object"
      +}
  7. First observed

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description still earns credit for disclosing the fee-inclusive Kalshi price, the specific venue roster (five books plus two exchanges), the per-side best price, the consensus gap, and the post-settlement Kalshi close. It omits freshness/data latency, and the default row cap is only in the schema. No contradiction with the annotations.

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?

It opens with the two use cases before anything else, then a single dense sentence enumerating the data surface, then the filter list. The parenthetical book list is long but carries real information about coverage. No filler sentences and no restatement of the title.

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?

With an output schema present, the description need not explain return values, and it correctly summarizes the board's columns anyway. For a zero-required-parameter read-only board this is nearly sufficient; the only real gap is data recency and how the 'Kalshi close' behaves while a strike is unsettled.

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

Parameters3/5

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

Schema description coverage is 100%, so every one of the seven optional parameters is already documented with formats and examples in the schema itself. The description only says 'filter by team, game, player or stat', which adds no syntax, default, or interaction detail beyond that — notably nothing about gapsOnly or limit. Baseline 3 applies when the schema does the heavy lifting.

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 states a concrete resource ('best price on every NFL prop this week') and the exact comparison set: Kalshi with fees vs five named books and the Novig/ProphetX exchanges. That is far more specific than 'NFL props'. It stops short of 5 because it never positions itself against close siblings like best_price or nfl_prop_edge, leaving the agent to infer that this is the bulk-list board versus a single-line edge calculation.

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?

Two natural-language trigger queries are given ('where is the best price on <player> receiving yards', 'is Kalshi cheaper than the books'), which directly tells the agent what user intent selects this tool. There is no when-not-to-use guidance and no named alternative for cases such as a single strike's edge or a player outlook, so routing away from this tool is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.