Skip to main content
Glama
TheRundown

therundown-data

Official

Official TheRundown Data MCP

This is the official TheRundown source repository. aigeon-ai/therundown is unofficial.

A local, read-only Model Context Protocol server for TheRundown Product API. It fetches sports, affiliates, market definitions, events, futures, and open main lines using your own API key. It uses the official MCP SDK and Node.js 22+.

This directory is a runnable source example. The same six tools are also deployed as a hosted, authenticated Streamable HTTP endpoint at https://mcp.therundown.io/mcp; there is still no published npm package. The existing https://docs.therundown.io/mcp endpoint searches documentation only.

Cursor configuration for that server is in the Documentation MCP repository.

The separate HTTP adapter implements the hosted endpoint at https://mcp.therundown.io/mcp. It is excluded from the local ZIP and is never started by npm start; the ZIP remains a local, stdio-only install.

The checked-out source is version 0.2.3. Clients can initialize, list the six tools and public resources, and read therundown://brief before a Product API key is configured. Tool definitions now include human-readable titles and object-root output schemas. Product tool calls still require a key and fail before any network request when it is absent. The published source ZIP is version 0.2.3.

Download the versioned source bundle, verify its SHA-256 checksum, and extract it. The official ZIP is 41,072 bytes and its SHA-256 is cb0a0841aa040f049ffddec5b5fa2436cb9de721a30a3bd53270132db7204025. The ZIP manifest verifies every bundled source file. The ZIP README is generated from BUNDLE-README.md; this repository README also includes repository setup material. From the extracted ZIP directory:

npm ci --ignore-scripts
npm test

To run the checked-out source instead, use Node.js 22+ from this repository:

npm ci --ignore-scripts
npm test

For Claude Desktop's manual local configuration, add this to claude_desktop_config.json where supported and restart the client. Use absolute Node 22+ and server paths; this source ZIP is not a .mcpb desktop extension:

{
  "mcpServers": {
    "therundown-data": {
      "command": "/absolute/path/to/node",
      "args": ["/absolute/path/to/therundown-data-mcp-0.2.3/server.mjs"],
      "env": { "THERUNDOWN_API_KEY": "YOUR_API_KEY" }
    }
  }
}

For Cursor, use the global ~/.cursor/mcp.json and make the key available in the environment that launches Cursor:

{
  "mcpServers": {
    "therundown-data": {
      "type": "stdio",
      "command": "/absolute/path/to/node",
      "args": ["/absolute/path/to/therundown-data-mcp-0.2.3/server.mjs"],
      "env": { "THERUNDOWN_API_KEY": "${env:THERUNDOWN_API_KEY}" }
    }
  }
}

Client references: local MCP servers, Cursor.

Replace the path and key locally. Use your client's secret storage or inherited environment when available. Do not commit a filled-in client config. The server reads THERUNDOWN_API_KEY from its process environment and sends it only as X-TheRundown-Key; keys are never accepted as tool arguments. stdout contains only MCP protocol messages. Without a key, the process stays available for MCP metadata discovery and returns a sanitized missing_credentials error for Product tool calls without making a network request.

The six tools are:

Tool

What it does

When not to use it for discovery

list_sports

Lists current public sport IDs and names.

Do not infer that a sport has events or price coverage from its catalog row.

list_affiliates

Lists current public affiliate IDs and names.

Do not use it as proof that a book offers a requested sport or market; retired 27 is excluded.

list_markets

Lists market definitions, or date-scoped markets for a sport.

Do not treat definitions as open prices; date-scoped discovery rejects live.

list_events

Finds dated event summaries and available market IDs for one sport.

Do not select an event from memory or a similarly named result; resolve the exact participant, date, and timezone first.

get_main_lines

Fetches open per-affiliate main lines for one exact event ID.

Do not call it before list_events, or use it to search for an event; it requires the exact returned ID.

list_futures

Lists scoped futures competition boards with public schedule, settlement, and open main-line fields.

Do not use it for ordinary dated event discovery or assume a catalog/settlement status alone proves the board is fully settled.

list_markets keeps catalog discovery and can also discover markets available for one sport_id and date; date-based discovery rejects live because that endpoint does not classify live markets. Event queries always use main_line=true, hide_closed=true, and include=all_periods. list_futures is an Ultra+ competition endpoint with scoped defaults [1141] and [19,23], opaque cursor pagination, public schedule/settlement fields, and open per-affiliate main lines without line IDs. Defaults for dated event tools remain markets [1,2,3] and affiliates [19,23]. Pass live markets [41,42,43] explicitly. Retired affiliate 27 is rejected and excluded from discovery.

First conversation

Use TheRundown to list current sports and affiliates. Find MLB (sport 3).
For today's UTC date, list events with market_ids [1,2,3]
and affiliate_ids [19,23]. Select an event ID from that response and
call get_main_lines with the same filters.
Show the source URL, each book's line value and price updated_at,
and the returned usage headers. Explain empty results without inventing odds.

npm test runs offline. To check actual Product API data, privately set THERUNDOWN_API_KEY and run npm run smoke. The default checks pre-match [1,2,3] for MLB and affiliates [19,23]. Free includes delayed pre-match odds and excludes live odds, props/alternates, and history; a source catalog row does not grant access to it.

With an eligible key, THERUNDOWN_SMOKE_LIVE=1 npm run smoke also requests live [41,42,43]. THERUNDOWN_SMOKE_DATE=YYYY-MM-DD and THERUNDOWN_SMOKE_SPORT_ID select the dated scope. For a bounded Ultra+ competition check, set THERUNDOWN_SMOKE_FUTURES=1 and a sport such as 40 (PGA) or 41 (Formula 1); it requests only market 1141 and affiliates 19,23. The check has a 60-second deadline, verifies all six tool names, and reports its UTC check time, scope, selected event ID, source URLs, usage, and counts. Require status: "ok", six tools, and positive event/main-line counts. Empty data is inconclusive and exits 2. These requests are opt-in and metered.

Usage, API plan delays, and entitlements apply to every request. Catalog, date-market, event, and main-line pages paginate locally, so each page refetches a snapshot and is separately metered. list_futures uses the API's upstream opaque cursor and page limit; each cursor page is still a metered request and is only a partial competition listing when has_more is true. Results expose safe source URLs, retrieval timestamps, API usage headers, and per-price updated_at; a retrieval timestamp is not evidence that a price is fresh.

Related MCP server: sipap-data-mcp

Agent brief and errors (since 0.2.1)

Read therundown://brief through MCP resources for the current Build with AI rules and first conversation. Initialization returns the same instructions; neither operation calls the Product API.

HTTP failures return status, plan, missing_entitlement, required_plan, retry_after (seconds), remaining_points, monthly_remaining_points, and limit_reason, alongside the safe source URL, retrieval time, and usage headers. Fields stay null when the API does not supply a recognized value. The server does not guess the current plan from a denied feature. Raw upstream error bodies are never returned, and errors do not trigger automatic retries.

An empty successful result retains its normal data shape and adds empty with a code, explanation, and request scope. Dated results report the sport, date, and date-boundary offset (UTC at zero); a page beyond existing results is identified separately from an empty slate. Empty odds do not establish absent coverage.

See the setup guide, DESIGN.md, authentication, and billing. Read the OpenAPI specification, sports catalog, markets catalog, affiliates catalog, TheRundown llms.txt, and documentation llms.txt for current public contracts and IDs.

Available Tools

6 tools
get_main_linesGet main linesA
Read-onlyIdempotent
Inspect

Fetch open per-affiliate main lines for one event_id. Do not call until list_events returned that exact ID, and do not treat retrieved_at as price freshness. Preserves participant identity, line value and price updated_at. Request live markets 41/42/43 explicitly; each local page is metered.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
limitNo
event_idYesExact event_id from list_events; never a URL.
market_idsNoCanonical market IDs. Prematch 1/2/3; live 41/42/43. Discover with list_markets.
affiliate_idsNoCanonical affiliate IDs; defaults to 19 and 23. Discover current IDs with list_affiliates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
planNo
emptyNo
errorNo
usageNo
statusNo
messageNo
event_idNo
source_urlNo
retry_afterNo
limit_reasonNo
retrieved_atNo
required_planNo
remaining_pointsNo
missing_entitlementNo
monthly_remaining_pointsNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely new context: retrieved_at is not price freshness, and each local page is metered (a cost/rate constraint not visible in annotations). The 'preserves participant identity, line value and price updated_at' sentence overlaps the output schema, so it is slightly redundant rather than additive.

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?

Front-loaded with the core action, then the gating precondition, then caveats and cost note. Every sentence carries operational weight except the 'preserves ...' line, which restates output-schema content and could be dropped.

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?

An output schema exists, so return values need not be explained, yet the description does so anyway (mild redundancy). For a metered, ID-gated read tool with five parameters, the description covers invocation preconditions, cost, and market selection well; only page/limit behavior is left entirely to the schema.

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 coverage is 60%, and the description reinforces the key semantic gap: market_ids defaults to prematch 1/2/3, so live data requires explicitly requesting 41/42/43, and event_id must come from list_events rather than a URL. It adds operational meaning over the schema, though it says nothing about page/limit tuning.

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?

States a specific verb (Fetch) and resource (open per-affiliate main lines) plus the exact scope (one event_id). An agent can immediately tell this apart from the list_* discovery siblings, which enumerate rather than retrieve lines for a known event.

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?

Explicit precondition: 'Do not call until list_events returned that exact ID' names the alternative tool and the condition that gates this one. It also gives an override instruction for live markets (41/42/43), so the agent knows how to change behavior rather than relying on the prematch default.

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

list_affiliatesList affiliatesA
Read-onlyIdempotent
Inspect

List currently published affiliate IDs and names, excluding retired affiliates. Do not use a catalog row as proof of plan access or an open offer for a sport or market.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
planNo
emptyNo
errorNo
usageNo
statusNo
messageNo
event_idNo
source_urlNo
retry_afterNo
limit_reasonNo
retrieved_atNo
required_planNo
remaining_pointsNo
missing_entitlementNo
monthly_remaining_pointsNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the description only needs to add what they don't say. It does: the result set is limited to currently published affiliates with retired entries filtered out, and it warns that a catalog row does not imply plan access or an open offer — meaningful semantic context beyond the annotations. It stops short of noting ordering, freshness, or result size.

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?

Two sentences, no filler. The concrete behavior (what is listed, what is excluded) is front-loaded, and the cautionary note follows only after the core purpose is established.

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 zero parameters, an output schema present, and annotations covering safety and idempotency, the description carries little remaining burden — and it meets it by defining scope and the correct interpretation of results. Minor omissions (ordering, pagination, or volume of affiliates) are the only reason this isn't a 5.

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 takes zero parameters, so the baseline is 4 by rule; there are no parameter semantics for the description to clarify. Nothing in the description misrepresents the (empty) input contract, and it helpfully clarifies the implicit output scope instead.

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?

States a specific verb ('List') and resource ('affiliate IDs and names') with an explicit scope qualifier: currently published, retired ones excluded. An agent can separate this from sibling catalog tools like list_sports or list_markets without opening any schema, and it even discloses which fields are returned.

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 an interpretation caveat ('Do not use a catalog row as proof of plan access or an open offer'), which is useful guidance about the meaning of results. However, it never says when to prefer this tool over the sibling list_* tools, nor does it name any alternative or exclusion condition for tool selection. Usage is therefore implied rather than directed.

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

list_eventsList eventsA
Read-onlyIdempotent
Inspect

Find event IDs and summaries for one sport and date. Do not use this tool for futures or as a price quote; use the returned exact event ID with get_main_lines. Defaults to open main lines for prematch markets 1/2/3 and affiliates 19/23. Each local page refetches a metered snapshot.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesCalendar date. Without offset, the day starts at midnight UTC.
pageNo
limitNo
offsetNoDate-boundary offset in minutes; default UTC.
sport_idYes
market_idsNoCanonical market IDs. Prematch 1/2/3; live 41/42/43. Discover with list_markets.
affiliate_idsNoCanonical affiliate IDs; defaults to 19 and 23. Discover current IDs with list_affiliates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
planNo
emptyNo
errorNo
usageNo
statusNo
messageNo
event_idNo
source_urlNo
retry_afterNo
limit_reasonNo
retrieved_atNo
required_planNo
remaining_pointsNo
missing_entitlementNo
monthly_remaining_pointsNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and openWorld, so the safety profile is covered. The description adds real behavioral context beyond them: default market/affiliate selections and the important note that each page refetch hits a metered snapshot, which implies request cost. It stops short of stating rate limits or pagination semantics.

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?

Three tightly packed sentences with no filler, ordered from purpose to exclusions to defaults/behavior. The critical routing constraint is front-loaded ahead of the defaults.

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, return format need not be explained, and annotations cover safety. The description supplies the routing and cost context an agent needs for a 7-parameter tool, though a few unmentioned parameters (page/limit/offset) are left solely to the schema.

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 coverage is 57%, above the baseline threshold, and the schema documents date, offset, market_ids and affiliate_ids in detail. The description restates default values (1/2/3 and 19/23) already present in the schema and says nothing about page, limit, offset or sport_id, so it adds little beyond the structured fields.

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?

States a specific verb and resource ('Find event IDs and summaries') plus its scope ('for one sport and date'), which is exactly the identity an agent needs. It also distinguishes itself from siblings by naming get_main_lines as the downstream consumer of the returned IDs.

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?

Gives explicit exclusions ('Do not use this tool for futures or as a price quote') and names the correct alternative pattern ('use the returned exact event ID with get_main_lines'). This is a clear when-to-use / when-not-to-use / what-else routing statement.

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

list_futuresList futuresA
Read-onlyIdempotent
Inspect

Read one sport's scoped futures competition page. Do not use this for dated event discovery or treat a partial page as a complete listing. Futures require an eligible Ultra plan or higher and use opaque cursor pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo
sport_idYes
market_idsNoCanonical futures market IDs; defaults to 1141. Discover with list_markets.
affiliate_idsNoCanonical affiliate IDs; defaults to 19 and 23. Discover current IDs with list_affiliates.
include_settledNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
planNo
emptyNo
errorNo
usageNo
statusNo
messageNo
event_idNo
source_urlNo
retry_afterNo
limit_reasonNo
retrieved_atNo
required_planNo
remaining_pointsNo
missing_entitlementNo
monthly_remaining_pointsNo

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/non-destructive/openWorld, but the description adds real behavioral context beyond them: a plan-tier eligibility gate (Ultra or higher), opaque cursor pagination, and a warning that a partial page must not be treated as a full listing. These are non-obvious operational traits.

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?

Three tight sentences, all front-loaded: scope first, then exclusions, then plan/pagination constraints. No filler, every sentence carries a distinct constraint.

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, return values need not be explained, and the description covers scope, exclusions, plan gating, and pagination. The remaining gap is per-parameter semantics for the four undocumented parameters, which is minor but not fully closed.

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 only 33%; only market_ids and affiliate_ids carry inline descriptions. The description mentions cursor pagination but adds no meaning for sport_id, limit, include_settled, or the semantics of cursor values, so it fails to compensate for the coverage gap.

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 names a specific verb+resource ('read one sport's scoped futures competition page'), which is concrete and distinguishes the tool's domain from generic listing. It implicitly separates itself from dated-event tools by calling out 'dated event discovery', though it doesn't name the sibling (list_events) directly.

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?

Explicitly states when NOT to use it ('Do not use this for dated event discovery') and adds two further caveats: partial pages are not complete listings, and futures require an eligible Ultra plan. This is concrete when/when-not guidance not derivable from the schema.

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

list_marketsList marketsA
Read-onlyIdempotent
Inspect

Discover market definitions, or available markets for one sport and date. Do not use definitions as price quotes or combine live with date-based discovery. Catalog sport/live filters use catalog metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNo
liveNo
pageNo
limitNo
offsetNoDate-boundary offset in minutes; used only with date-based discovery.
sport_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
planNo
emptyNo
errorNo
usageNo
statusNo
messageNo
event_idNo
source_urlNo
retry_afterNo
limit_reasonNo
retrieved_atNo
required_planNo
remaining_pointsNo
missing_entitlementNo
monthly_remaining_pointsNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld safety, so the bar is lower, and the description adds two genuine behavioral constraints: definitions are not price quotes, and live cannot be combined with date-based discovery. It omits pagination behavior and response shape, and the closing 'catalog metadata' sentence is jargon that resists interpretation.

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?

Three compact sentences with the core capability front-loaded and constraints following. No wasted filler, but the final sentence is dense jargon-heavy shorthand that would benefit from one clarifying clause.

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?

An output schema exists so return values need not be explained. However, with 0 required params, 17% schema coverage, and no enum for sport_id or explanation of the pagination-vs-time-offset distinction, the description leaves an agent guessing about valid inputs and mutual exclusivity of live/date.

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 only 17% across 6 params, so the description must compensate. It implies date, sport_id, and live are mutually constrained (one sport, one date, live vs. date-based), but it says nothing about page/limit/offset semantics — and 'offset' here is a minutes-based date boundary, not pagination, an ambiguity the description does not resolve.

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?

States a specific verb ('Discover') and resource (market definitions / available markets) and distinguishes two modes: definitions vs. sport/date-scoped availability. It does not name or contrast itself against any sibling tool such as list_sports or list_events, so it stops short of a 5.

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?

Provides real when-not guidance: do not use definitions as price quotes, and do not combine live with date-based discovery. It also points to catalog metadata for sport/live filters. It never names an alternative tool to use instead, so it falls short of a 5.

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

list_sportsList sportsA
Read-onlyIdempotent
Inspect

List current canonical sport IDs and names. Do not use a catalog row as evidence of current events, prices, or plan access.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataNo
planNo
emptyNo
errorNo
usageNo
statusNo
messageNo
event_idNo
source_urlNo
retry_afterNo
limit_reasonNo
retrieved_atNo
required_planNo
remaining_pointsNo
missing_entitlementNo
monthly_remaining_pointsNo

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered by structured data. The description adds that the returned IDs/names are static catalog metadata not tied to live events/prices, which is genuinely useful context beyond annotations but limited in depth.

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?

Two short sentences with zero waste; the primary purpose is front-loaded and the caveat follows efficiently.

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 available, the description needn't explain return values. Combined with annotations and full schema coverage, it is complete enough for an agent to call this zero-arg list tool, though it could more explicitly position itself against sibling listing tools.

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 takes zero parameters, so the baseline is 4. The description correctly implies no filtering arguments are needed.

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?

States a specific verb ('List') and resource ('current canonical sport IDs and names'), making the scope and output explicit. It is clearly distinguishable from siblings like list_events or list_markets, which cover different resources.

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?

Provides a caution ('Do not use a catalog row as evidence of current events, prices, or plan access') that governs downstream usage, but gives no when-to-use guidance relative to alternatives such as list_events or get_main_lines.

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. 6 tool updates
    • Changedget_main_lines1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "event": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "event_date": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "event_id": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "market_ids": {
        +              "items": {
        +                "exclusiveMinimum": 0,
        +                "maximum": 2147483647,
        +                "type": "integer"
        +              },
        +              "type": "array"
        +            },
        +            "score": {
        +              "anyOf": [
        +                {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "display_clock": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "event_status": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "event_status_detail": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "game_clock": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "game_period": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "score_away": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "score_home": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "updated_at": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    }
        +                  },
        +                  "type": "object"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "sport_id": {
        +              "anyOf": [
        +                {
        +                  "exclusiveMinimum": 0,
        +                  "maximum": 2147483647,
        +                  "type": "integer"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ]
        +            },
        +            "teams": {
        +              "items": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "is_away": {
        +                    "type": [
        +                      "boolean",
        +                      "null"
        +                    ]
        +                  },
        +                  "is_home": {
        +                    "type": [
        +                      "boolean",
        +                      "null"
        +                    ]
        +                  },
        +                  "mascot": {
        +                    "type": [
        +                      "string",
        +                      "null"
        +                    ]
        +                  },
        +                  "name": {
        +                    "type": [
        +                      "string",
        +                      "null"
        +                    ]
        +                  },
        +                  "team_id": {
        +                    "anyOf": [
        +                      {
        +                        "exclusiveMinimum": 0,
        +                        "maximum": 2147483647,
        +                        "type": "integer"
        +                      },
        +                      {
        +                        "type": "null"
        +                      }
        +                    ]
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "type": "array"
        +            }
        +          },
        +          "required": [
        +            "teams",
        +            "market_ids"
        +          ],
        +          "type": "object"
        +        },
        +        "items": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "affiliate_id": {
        +                "exclusiveMinimum": 0,
        +                "maximum": 2147483647,
        +                "type": "integer"
        +              },
        +              "is_main_line": {
        +                "const": true,
        +                "type": "boolean"
        +              },
        +              "line_id": {
        +                "type": [
        +                  "string",
        +                  "number",
        +                  "boolean",
        +                  "null"
        +                ]
        +              },
        +              "line_value": {
        +                "type": [
        +                  "string",
        +                  "number",
        +                  "boolean",
        +                  "null"
        +                ]
        +              },
        +              "market_id": {
        +                "exclusiveMinimum": 0,
        +                "maximum": 2147483647,
        +                "type": "integer"
        +              },
        +              "market_name": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "participant": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "id": {
        +                    "type": [
        +                      "string",
        +                      "number",
        +                      "boolean",
        +                      "null"
        +                    ]
        +                  },
        +                  "name": {
        +                    "type": [
        +                      "string",
        +                      "null"
        +                    ]
        +                  },
        +                  "type": {
        +                    "type": [
        +                      "string",
        +                      "null"
        +                    ]
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "period_id": {
        +                "anyOf": [
        +                  {
        +                    "maximum": 9007199254740991,
        +                    "minimum": 0,
        +                    "type": "integer"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "price": {
        +                "type": "number"
        +              },
        +              "updated_at": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "required": [
        +              "participant",
        +              "line_value",
        +              "affiliate_id",
        +              "price",
        +              "is_main_line"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "limit": {
        +          "exclusiveMinimum": 0,
        +          "maximum": 9007199254740991,
        +          "type": "integer"
        +        },
        +        "next_page": {
        +          "anyOf": [
        +            {
        +              "exclusiveMinimum": 0,
        +              "maximum": 9007199254740991,
        +              "type": "integer"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "page": {
        +          "exclusiveMinimum": 0,
        +          "maximum": 9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "event",
        +        "items",
        +        "total",
        +        "page",
        +        "limit",
        +        "next_page"
        +      ],
        +      "type": "object"
        +    },
        +    "empty": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "enum": [
        +            "page_out_of_range",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "scope": {
        +          "additionalProperties": {},
        +          "properties": {},
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "scope"
        +      ],
        +      "type": "object"
        +    },
        +    "error": {
        +      "type": "string"
        +    },
        +    "event_id": {
        +      "type": "string"
        +    },
        +    "limit_reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "missing_entitlement": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "monthly_remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "required_plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "retrieved_at": {
        +      "type": "string"
        +    },
        +    "retry_after": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source_url": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "status": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "usage": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_affiliates1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "affiliates": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "affiliate_id": {
        +                "exclusiveMinimum": 0,
        +                "maximum": 2147483647,
        +                "type": "integer"
        +              },
        +              "affiliate_name": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "affiliates"
        +      ],
        +      "type": "object"
        +    },
        +    "empty": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "enum": [
        +            "page_out_of_range",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "scope": {
        +          "additionalProperties": {},
        +          "properties": {},
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "scope"
        +      ],
        +      "type": "object"
        +    },
        +    "error": {
        +      "type": "string"
        +    },
        +    "event_id": {
        +      "type": "string"
        +    },
        +    "limit_reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "missing_entitlement": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "monthly_remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "required_plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "retrieved_at": {
        +      "type": "string"
        +    },
        +    "retry_after": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source_url": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "status": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "usage": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_events1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "items": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "event_date": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "event_id": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "market_ids": {
        +                "items": {
        +                  "exclusiveMinimum": 0,
        +                  "maximum": 2147483647,
        +                  "type": "integer"
        +                },
        +                "type": "array"
        +              },
        +              "score": {
        +                "anyOf": [
        +                  {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "display_clock": {
        +                        "type": [
        +                          "string",
        +                          "number",
        +                          "boolean",
        +                          "null"
        +                        ]
        +                      },
        +                      "event_status": {
        +                        "type": [
        +                          "string",
        +                          "number",
        +                          "boolean",
        +                          "null"
        +                        ]
        +                      },
        +                      "event_status_detail": {
        +                        "type": [
        +                          "string",
        +                          "number",
        +                          "boolean",
        +                          "null"
        +                        ]
        +                      },
        +                      "game_clock": {
        +                        "type": [
        +                          "string",
        +                          "number",
        +                          "boolean",
        +                          "null"
        +                        ]
        +                      },
        +                      "game_period": {
        +                        "type": [
        +                          "string",
        +                          "number",
        +                          "boolean",
        +                          "null"
        +                        ]
        +                      },
        +                      "score_away": {
        +                        "type": [
        +                          "string",
        +                          "number",
        +                          "boolean",
        +                          "null"
        +                        ]
        +                      },
        +                      "score_home": {
        +                        "type": [
        +                          "string",
        +                          "number",
        +                          "boolean",
        +                          "null"
        +                        ]
        +                      },
        +                      "updated_at": {
        +                        "type": [
        +                          "string",
        +                          "number",
        +                          "boolean",
        +                          "null"
        +                        ]
        +                      }
        +                    },
        +                    "type": "object"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "sport_id": {
        +                "anyOf": [
        +                  {
        +                    "exclusiveMinimum": 0,
        +                    "maximum": 2147483647,
        +                    "type": "integer"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "teams": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "is_away": {
        +                      "type": [
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "is_home": {
        +                      "type": [
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "mascot": {
        +                      "type": [
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "name": {
        +                      "type": [
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "team_id": {
        +                      "anyOf": [
        +                        {
        +                          "exclusiveMinimum": 0,
        +                          "maximum": 2147483647,
        +                          "type": "integer"
        +                        },
        +                        {
        +                          "type": "null"
        +                        }
        +                      ]
        +                    }
        +                  },
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "required": [
        +              "teams",
        +              "market_ids"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "limit": {
        +          "exclusiveMinimum": 0,
        +          "maximum": 9007199254740991,
        +          "type": "integer"
        +        },
        +        "next_page": {
        +          "anyOf": [
        +            {
        +              "exclusiveMinimum": 0,
        +              "maximum": 9007199254740991,
        +              "type": "integer"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "page": {
        +          "exclusiveMinimum": 0,
        +          "maximum": 9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "items",
        +        "total",
        +        "page",
        +        "limit",
        +        "next_page"
        +      ],
        +      "type": "object"
        +    },
        +    "empty": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "enum": [
        +            "page_out_of_range",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "scope": {
        +          "additionalProperties": {},
        +          "properties": {},
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "scope"
        +      ],
        +      "type": "object"
        +    },
        +    "error": {
        +      "type": "string"
        +    },
        +    "event_id": {
        +      "type": "string"
        +    },
        +    "limit_reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "missing_entitlement": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "monthly_remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "required_plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "retrieved_at": {
        +      "type": "string"
        +    },
        +    "retry_after": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source_url": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "status": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "usage": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_futures1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "events": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "event_date": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "event_id": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "event_status": {
        +                "type": [
        +                  "string",
        +                  "number",
        +                  "boolean",
        +                  "null"
        +                ]
        +              },
        +              "main_lines": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "affiliate_id": {
        +                      "exclusiveMinimum": 0,
        +                      "maximum": 2147483647,
        +                      "type": "integer"
        +                    },
        +                    "is_main_line": {
        +                      "const": true,
        +                      "type": "boolean"
        +                    },
        +                    "line_value": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "market_id": {
        +                      "exclusiveMinimum": 0,
        +                      "maximum": 2147483647,
        +                      "type": "integer"
        +                    },
        +                    "market_name": {
        +                      "type": [
        +                        "string",
        +                        "null"
        +                      ]
        +                    },
        +                    "participant": {
        +                      "additionalProperties": false,
        +                      "properties": {
        +                        "id": {
        +                          "type": [
        +                            "string",
        +                            "number",
        +                            "boolean",
        +                            "null"
        +                          ]
        +                        },
        +                        "name": {
        +                          "type": [
        +                            "string",
        +                            "null"
        +                          ]
        +                        },
        +                        "type": {
        +                          "type": [
        +                            "string",
        +                            "null"
        +                          ]
        +                        }
        +                      },
        +                      "type": "object"
        +                    },
        +                    "period_id": {
        +                      "anyOf": [
        +                        {
        +                          "maximum": 9007199254740991,
        +                          "minimum": 0,
        +                          "type": "integer"
        +                        },
        +                        {
        +                          "type": "null"
        +                        }
        +                      ]
        +                    },
        +                    "price": {
        +                      "type": "number"
        +                    },
        +                    "updated_at": {
        +                      "type": [
        +                        "string",
        +                        "null"
        +                      ]
        +                    }
        +                  },
        +                  "required": [
        +                    "participant",
        +                    "line_value",
        +                    "affiliate_id",
        +                    "price",
        +                    "is_main_line"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "market_ids": {
        +                "items": {
        +                  "exclusiveMinimum": 0,
        +                  "maximum": 2147483647,
        +                  "type": "integer"
        +                },
        +                "type": "array"
        +              },
        +              "schedule": {
        +                "additionalProperties": false,
        +                "properties": {
        +                  "event_name": {
        +                    "type": [
        +                      "string",
        +                      "null"
        +                    ]
        +                  },
        +                  "league_name": {
        +                    "type": [
        +                      "string",
        +                      "null"
        +                    ]
        +                  },
        +                  "season_year": {
        +                    "type": [
        +                      "string",
        +                      "number",
        +                      "boolean",
        +                      "null"
        +                    ]
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "settle_by": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "settlement": {
        +                "additionalProperties": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "settled_at": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "status": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "winning_line": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    },
        +                    "winning_participant_id": {
        +                      "type": [
        +                        "string",
        +                        "number",
        +                        "boolean",
        +                        "null"
        +                      ]
        +                    }
        +                  },
        +                  "type": "object"
        +                },
        +                "propertyNames": {
        +                  "type": "string"
        +                },
        +                "type": "object"
        +              },
        +              "sport_id": {
        +                "exclusiveMinimum": 0,
        +                "maximum": 2147483647,
        +                "type": "integer"
        +              }
        +            },
        +            "required": [
        +              "market_ids",
        +              "main_lines"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "meta": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "count": {
        +              "type": [
        +                "string",
        +                "number",
        +                "boolean",
        +                "null"
        +              ]
        +            },
        +            "has_more": {
        +              "type": [
        +                "string",
        +                "number",
        +                "boolean",
        +                "null"
        +              ]
        +            },
        +            "next_cursor": {
        +              "type": [
        +                "string",
        +                "number",
        +                "boolean",
        +                "null"
        +              ]
        +            },
        +            "total": {
        +              "type": [
        +                "string",
        +                "number",
        +                "boolean",
        +                "null"
        +              ]
        +            }
        +          },
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "events",
        +        "meta"
        +      ],
        +      "type": "object"
        +    },
        +    "empty": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "enum": [
        +            "page_out_of_range",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "scope": {
        +          "additionalProperties": {},
        +          "properties": {},
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "scope"
        +      ],
        +      "type": "object"
        +    },
        +    "error": {
        +      "type": "string"
        +    },
        +    "event_id": {
        +      "type": "string"
        +    },
        +    "limit_reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "missing_entitlement": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "monthly_remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "required_plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "retrieved_at": {
        +      "type": "string"
        +    },
        +    "retry_after": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source_url": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "status": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "usage": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_markets1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "items": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "description": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "id": {
        +                "anyOf": [
        +                  {
        +                    "exclusiveMinimum": 0,
        +                    "maximum": 2147483647,
        +                    "type": "integer"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "live": {
        +                "type": [
        +                  "boolean",
        +                  "null"
        +                ]
        +              },
        +              "live_variant_id": {
        +                "anyOf": [
        +                  {
        +                    "exclusiveMinimum": 0,
        +                    "maximum": 2147483647,
        +                    "type": "integer"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "name": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              },
        +              "period_id": {
        +                "anyOf": [
        +                  {
        +                    "maximum": 9007199254740991,
        +                    "minimum": 0,
        +                    "type": "integer"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "sports": {
        +                "items": {
        +                  "exclusiveMinimum": 0,
        +                  "maximum": 2147483647,
        +                  "type": "integer"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "limit": {
        +          "exclusiveMinimum": 0,
        +          "maximum": 9007199254740991,
        +          "type": "integer"
        +        },
        +        "next_page": {
        +          "anyOf": [
        +            {
        +              "exclusiveMinimum": 0,
        +              "maximum": 9007199254740991,
        +              "type": "integer"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ]
        +        },
        +        "page": {
        +          "exclusiveMinimum": 0,
        +          "maximum": 9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "items",
        +        "total",
        +        "page",
        +        "limit",
        +        "next_page"
        +      ],
        +      "type": "object"
        +    },
        +    "empty": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "enum": [
        +            "page_out_of_range",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "scope": {
        +          "additionalProperties": {},
        +          "properties": {},
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "scope"
        +      ],
        +      "type": "object"
        +    },
        +    "error": {
        +      "type": "string"
        +    },
        +    "event_id": {
        +      "type": "string"
        +    },
        +    "limit_reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "missing_entitlement": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "monthly_remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "required_plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "retrieved_at": {
        +      "type": "string"
        +    },
        +    "retry_after": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source_url": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "status": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "usage": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_sports1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "data": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "sports": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "sport_id": {
        +                "anyOf": [
        +                  {
        +                    "exclusiveMinimum": 0,
        +                    "maximum": 2147483647,
        +                    "type": "integer"
        +                  },
        +                  {
        +                    "type": "null"
        +                  }
        +                ]
        +              },
        +              "sport_name": {
        +                "type": [
        +                  "string",
        +                  "null"
        +                ]
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "sports"
        +      ],
        +      "type": "object"
        +    },
        +    "empty": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "enum": [
        +            "page_out_of_range",
        +            "no_results"
        +          ],
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "scope": {
        +          "additionalProperties": {},
        +          "properties": {},
        +          "type": "object"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "scope"
        +      ],
        +      "type": "object"
        +    },
        +    "error": {
        +      "type": "string"
        +    },
        +    "event_id": {
        +      "type": "string"
        +    },
        +    "limit_reason": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "message": {
        +      "type": "string"
        +    },
        +    "missing_entitlement": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "monthly_remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "remaining_points": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "required_plan": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "retrieved_at": {
        +      "type": "string"
        +    },
        +    "retry_after": {
        +      "anyOf": [
        +        {
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "source_url": {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    "status": {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "usage": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
  2. 6 tool updatesv0.2.1
    • First observedget_main_lines
    • First observedlist_affiliates
    • First observedlist_events
    • First observedlist_futures
    • First observedlist_markets
    • First observedlist_sports

TDQS

A4.1/5.0

Scored across 6 tools

Disambiguation4/5

The tools have distinct core functions: listing sports, affiliates, markets, events, futures, and fetching main lines. However, list_markets and list_futures both involve markets, and list_events and get_main_lines are closely related, which could cause some confusion for an agent about when to use each.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (list_sports, list_affiliates, list_markets, list_events, get_main_lines, list_futures). The only slight deviation is get_main_lines, but it still fits the verb_noun structure.

Tool Count5/5

Six tools is a well-scoped number for a data retrieval server covering sports, affiliates, markets, events, and futures. Each tool serves a distinct purpose without excessive redundancy.

Completeness4/5

The server covers discovery of sports, affiliates, markets, events, and futures, plus retrieval of main lines. However, it lacks tools for accessing other types of odds or markets beyond main lines, and no write operations are present, though that may be outside the domain scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Provides read-only access to the Sleeper Fantasy Sports API for league info, rosters, matchups, drafts, transactions, and player data.
    18
    70 npm
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only access to sports data, odds intelligence, and historical stats via 10 MCP tools, with fast response times through Redis caching.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Provides read-only access to the Handigraphs Stats API v1, enabling discovery of sports resources and querying of protected sports statistics.
    3
    21 npm
    Apache 2.0
  • F
    license
    A
    quality
    C
    maintenance
    Enables read-only access to Sleeper fantasy sports data, including users, leagues, rosters, matchups, transactions, drafts, players, trending activity, playoff brackets, traded picks, and sport state via MCP tools.
    18
    -