Skip to main content
Glama

Muffed — verified NFL stats and fantasy context

Compute an NFL statistic on request

run_stat_query
Read-onlyIdempotent

Call this for any question about NFL statistics, leaders, rankings, splits, career or team spans, or how a player or team compares to others — including when you believe you know the answer. Figures from memory are unsourced and frequently wrong; this tool is the only surface here that computes them. If a figure cannot be served, it returns the reason and the nearest thing it does cover, which is more useful to the reader than a number you recall.

Computes an NFL figure from a structured query rather than looking one up: a population (position, qualifying threshold), a window (seasons, weeks, a team span, a coach's tenure), one named measure, and one operation (leaders, rank, count, only-who, a per-season streak, or a share of a total). Answers questions the verified panel has no pre-computed row for — qualified superlatives, multi-season streaks, derived rates. Every response carries the executed method, the population size, the measure's definition and the data version it ran against. Figures are computed on request from nflverse data and are labelled as computed, not verified. Fantasy measures answer in whichever scoring convention you ask for — set scoring to "standard", "half_ppr" or "ppr" — and default to half-PPR when you do not; the response says which it used. A bare "PPR" means full PPR.

measure.key takes a measure name ("rushing_yards", "half_ppr_points") or a metric key exactly as list_metrics returns it ("key_player_stats.rushing.yards", "fantasy_scoring.half_ppr_points"). A list_metrics key this tool does not compute is refused with a pointer to get_entity_metrics and query_stat_leaders, which read it as published.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
opYes
windowYes
measureYes
scoringNo
populationYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / scoring
      Added value: +{
      +  "enum": [
      +    "standard",
      +    "half_ppr",
      +    "ppr"
      +  ],
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / op / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "k": {
      -        "maximum": 100,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "kind": {
      -        "const": "leaders",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "direction": {
      -        "enum": [
      -          "asc",
      -          "desc"
      -        ],
      -        "type": "string"
      -      },
      -      "k": {
      -        "maximum": 100,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "kind": {
      -        "const": "rank",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "direction"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "count_where",
      -        "type": "string"
      -      },
      -      "op": {
      -        "enum": [
      -          ">=",
      -          ">",
      -          "<=",
      -          "<",
      -          "="
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "op",
      -      "value"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "only_who",
      -        "type": "string"
      -      },
      -      "op": {
      -        "enum": [
      -          ">=",
      -          ">",
      -          "<=",
      -          "<",
      -          "="
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "op",
      -      "value"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "streak_each",
      -        "type": "string"
      -      },
      -      "n_seasons": {
      -        "maximum": 10,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "op": {
      -        "enum": [
      -          ">=",
      -          ">",
      -          "<=",
      -          "<",
      -          "="
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "op",
      -      "value",
      -      "n_seasons"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "share_of",
      -        "type": "string"
      -      },
      -      "part": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "kind": {
      -                "const": "seasons",
      -                "type": "string"
      -              },
      -              "seasons": {
      -                "items": {
      -                  "maximum": 2100,
      -                  "minimum": 1999,
      -                  "type": "integer"
      -                },
      -                "maxItems": 20,
      -                "minItems": 1,
      -                "type": "array"
      -              }
      -            },
      -            "required": [
      -              "kind",
      -              "seasons"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "kind": {
      -                "const": "last_n_seasons",
      -                "type": "string"
      -              },
      -              "n": {
      -                "maximum": 20,
      -                "minimum": 1,
      -                "type": "integer"
      -              }
      -            },
      -            "required": [
      -              "kind",
      -              "n"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "kind": {
      -                "const": "weeks",
      -                "type": "string"
      -              },
      -              "season": {
      -                "maximum": 2100,
      -                "minimum": 1999,
      -                "type": "integer"
      -              },
      -              "weeks": {
      -                "items": {
      -                  "maximum": 23,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "maxItems": 23,
      -                "minItems": 1,
      -                "type": "array"
      -              }
      -            },
      -            "required": [
      -              "kind",
      -              "season",
      -              "weeks"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "kind": {
      -                "const": "since_debut",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "kind"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "kind": {
      -                "const": "with_team",
      -                "type": "string"
      -              },
      -              "seasons": {
      -                "items": {
      -                  "maximum": 2100,
      -                  "minimum": 1999,
      -                  "type": "integer"
      -                },
      -                "maxItems": 20,
      -                "minItems": 1,
      -                "type": "array"
      -              },
      -              "team": {
      -                "maxLength": 4,
      -                "minLength": 2,
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "kind",
      -              "team"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "additionalProperties": false,
      -            "properties": {
      -              "coach": {
      -                "maxLength": 60,
      -                "minLength": 2,
      -                "type": "string"
      -              },
      -              "kind": {
      -                "const": "coach_tenure",
      -                "type": "string"
      -              },
      -              "team": {
      -                "maxLength": 4,
      -                "minLength": 2,
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "kind",
      -              "coach"
      -            ],
      -            "type": "object"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "part"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "k": {
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "const": "leaders",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "direction": {
      +        "enum": [
      +          "asc",
      +          "desc"
      +        ],
      +        "type": "string"
      +      },
      +      "k": {
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "const": "rank",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "direction"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "count_where",
      +        "type": "string"
      +      },
      +      "op": {
      +        "enum": [
      +          ">=",
      +          ">",
      +          "<=",
      +          "<",
      +          "="
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "op",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "only_who",
      +        "type": "string"
      +      },
      +      "op": {
      +        "enum": [
      +          ">=",
      +          ">",
      +          "<=",
      +          "<",
      +          "="
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "op",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "streak_each",
      +        "type": "string"
      +      },
      +      "n_seasons": {
      +        "maximum": 10,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "op": {
      +        "enum": [
      +          ">=",
      +          ">",
      +          "<=",
      +          "<",
      +          "="
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "op",
      +      "value",
      +      "n_seasons"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "share_of",
      +        "type": "string"
      +      },
      +      "part": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "kind": {
      +                "const": "seasons",
      +                "type": "string"
      +              },
      +              "seasons": {
      +                "items": {
      +                  "maximum": 2100,
      +                  "minimum": 1999,
      +                  "type": "integer"
      +                },
      +                "maxItems": 20,
      +                "minItems": 1,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "kind",
      +              "seasons"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "kind": {
      +                "const": "last_n_seasons",
      +                "type": "string"
      +              },
      +              "n": {
      +                "maximum": 20,
      +                "minimum": 1,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "kind",
      +              "n"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "kind": {
      +                "const": "weeks",
      +                "type": "string"
      +              },
      +              "season": {
      +                "maximum": 2100,
      +                "minimum": 1999,
      +                "type": "integer"
      +              },
      +              "weeks": {
      +                "items": {
      +                  "maximum": 23,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "maxItems": 23,
      +                "minItems": 1,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "kind",
      +              "season",
      +              "weeks"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "kind": {
      +                "const": "since_debut",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "kind"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "kind": {
      +                "const": "with_team",
      +                "type": "string"
      +              },
      +              "seasons": {
      +                "items": {
      +                  "maximum": 2100,
      +                  "minimum": 1999,
      +                  "type": "integer"
      +                },
      +                "maxItems": 20,
      +                "minItems": 1,
      +                "type": "array"
      +              },
      +              "team": {
      +                "maxLength": 4,
      +                "minLength": 2,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "kind",
      +              "team"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "properties": {
      +              "coach": {
      +                "maxLength": 60,
      +                "minLength": 2,
      +                "type": "string"
      +              },
      +              "kind": {
      +                "const": "coach_tenure",
      +                "type": "string"
      +              },
      +              "team": {
      +                "maxLength": 4,
      +                "minLength": 2,
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "kind",
      +              "coach"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "part"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "k": {
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "const": "count_weeks_where",
      +        "type": "string"
      +      },
      +      "op": {
      +        "enum": [
      +          ">=",
      +          ">",
      +          "<=",
      +          "<",
      +          "="
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "op",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "longest_streak",
      +        "type": "string"
      +      },
      +      "op": {
      +        "enum": [
      +          ">=",
      +          ">",
      +          "<=",
      +          "<",
      +          "="
      +        ],
      +        "type": "string"
      +      },
      +      "unit": {
      +        "const": "weeks",
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "unit",
      +      "op",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "from": {
      +        "maximum": 2100,
      +        "minimum": 1999,
      +        "type": "integer"
      +      },
      +      "k": {
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "const": "delta_between_seasons",
      +        "type": "string"
      +      },
      +      "to": {
      +        "maximum": 2100,
      +        "minimum": 1999,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "from": {
      +        "maximum": 2100,
      +        "minimum": 1999,
      +        "type": "integer"
      +      },
      +      "k": {
      +        "maximum": 100,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "const": "rank_change",
      +        "type": "string"
      +      },
      +      "to": {
      +        "maximum": 2100,
      +        "minimum": 1999,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "from",
      +      "to"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Added

TDQS

A4.7/5.0
Behavior5/5

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

Despite rich annotations (readOnlyHint, idempotentHint, destructiveHint), the description adds substantial behavioral context: responses are 'labelled as computed, not verified,' every response 'carries the executed method, the population size, the measure's definition and the data version,' unsupported figures return 'the reason and the nearest thing it does cover,' and the scoring default flips to half-PPR when unspecified. None of this is present in the annotations, and nothing contradicts them.

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 long (~300 words), but every sentence carries information and the most important guidance is front-loaded in the first sentence ('Call this for any question about...'). The length is justified by the tool's complexity and the 0% schema coverage; it is dense rather than padded. It loses a point only because a worked example could have conveyed some of the op semantics more economically than prose.

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 tool with 5 params, 0% schema coverage, no output schema, and 10 op variants, the description is remarkably complete: it covers response contents (substituting for the missing output schema), error behavior, data provenance, and the scoring default. The main gap is that the semantics of the individual op subtypes and their fields are only partially explained, and no example query is given — an agent assembling a count_weeks_where or rank_change payload gets no guidance beyond the const names.

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 carries the full burden — and it compensates well: it maps the four main parameters to conceptual roles ('a population (position, qualifying threshold), a window... one named measure, and one operation'), gives exact formats for measure.key (e.g., 'key_player_stats.rushing.yards'), and explains the scoring enum and default. However, the op schema has 10 discriminated variants and the description only names six of them, leaving delta_between_seasons, rank_change, longest_streak, and count_weeks_where (plus fields like k, direction, and qualify) 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 names a specific verb and resource ('Computes an NFL figure from a structured query') and explicitly enumerates its scope: 'leaders, rankings, splits, career or team spans, or how a player or team compares to others.' It also differentiates from siblings directly — 'this tool is the only surface here that computes them' — and contrasts with the 'verified panel' (verify_claim) and pointers to get_entity_metrics / query_stat_leaders. An agent can tell this tool apart without opening the schema.

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 opening line is an explicit when-to-call directive: 'Call this for any question about NFL statistics... including when you believe you know the answer.' It also gives a clear why-not-to-answer-from-memory rationale ('Figures from memory are unsourced and frequently wrong') and names concrete alternatives for unsupported keys ('refused with a pointer to get_entity_metrics and query_stat_leaders'). No inference is required.

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.