therundown-data
OfficialA local read-only MCP server for TheRundown Product API that exposes six tools for sports data discovery and odds retrieval using your API key.
List current sports and affiliates with
list_sportsandlist_affiliates.Discover market definitions or date-scoped markets for a sport with
list_markets.Find events for one sport and date with
list_events, including available market/affiliate filters.Fetch open per-affiliate main lines for an exact event ID with
get_main_lines.Read scoped futures competition boards with
list_futures(requires eligible Ultra+ plan).Perform MCP initialization, list tools/resources, and read
therundown://briefwithout a Product API key; product calls requireTHERUNDOWN_API_KEY.
Provides access to MLB sports data, including events, markets, and main lines through the TheRundown API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@therundown-datalist sports and the current main lines for NFL games today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Official TheRundown Data MCP
This is the official TheRundown source repository.
aigeon-ai/therundownis 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 testTo run the checked-out source instead, use Node.js 22+ from this repository:
npm ci --ignore-scripts
npm testFor 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 |
| Lists current public sport IDs and names. | Do not infer that a sport has events or price coverage from its catalog row. |
| 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. |
| Lists market definitions, or date-scoped markets for a sport. | Do not treat definitions as open prices; date-scoped discovery rejects |
| 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. |
| Fetches open per-affiliate main lines for one exact event ID. | Do not call it before |
| 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 toolsget_main_linesGet main linesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| event_id | Yes | Exact event_id from list_events; never a URL. | |
| market_ids | No | Canonical market IDs. Prematch 1/2/3; live 41/42/43. Discover with list_markets. | |
| affiliate_ids | No | Canonical affiliate IDs; defaults to 19 and 23. Discover current IDs with list_affiliates. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| plan | No | |
| empty | No | |
| error | No | |
| usage | No | |
| status | No | |
| message | No | |
| event_id | No | |
| source_url | No | |
| retry_after | No | |
| limit_reason | No | |
| retrieved_at | No | |
| required_plan | No | |
| remaining_points | No | |
| missing_entitlement | No | |
| monthly_remaining_points | No |
TDQS
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.
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.
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.
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.
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.
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 affiliatesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| plan | No | |
| empty | No | |
| error | No | |
| usage | No | |
| status | No | |
| message | No | |
| event_id | No | |
| source_url | No | |
| retry_after | No | |
| limit_reason | No | |
| retrieved_at | No | |
| required_plan | No | |
| remaining_points | No | |
| missing_entitlement | No | |
| monthly_remaining_points | No |
TDQS
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.
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.
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.
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.
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.
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 eventsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Calendar date. Without offset, the day starts at midnight UTC. | |
| page | No | ||
| limit | No | ||
| offset | No | Date-boundary offset in minutes; default UTC. | |
| sport_id | Yes | ||
| market_ids | No | Canonical market IDs. Prematch 1/2/3; live 41/42/43. Discover with list_markets. | |
| affiliate_ids | No | Canonical affiliate IDs; defaults to 19 and 23. Discover current IDs with list_affiliates. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| plan | No | |
| empty | No | |
| error | No | |
| usage | No | |
| status | No | |
| message | No | |
| event_id | No | |
| source_url | No | |
| retry_after | No | |
| limit_reason | No | |
| retrieved_at | No | |
| required_plan | No | |
| remaining_points | No | |
| missing_entitlement | No | |
| monthly_remaining_points | No |
TDQS
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.
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.
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.
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.
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.
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 futuresARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| sport_id | Yes | ||
| market_ids | No | Canonical futures market IDs; defaults to 1141. Discover with list_markets. | |
| affiliate_ids | No | Canonical affiliate IDs; defaults to 19 and 23. Discover current IDs with list_affiliates. | |
| include_settled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| plan | No | |
| empty | No | |
| error | No | |
| usage | No | |
| status | No | |
| message | No | |
| event_id | No | |
| source_url | No | |
| retry_after | No | |
| limit_reason | No | |
| retrieved_at | No | |
| required_plan | No | |
| remaining_points | No | |
| missing_entitlement | No | |
| monthly_remaining_points | No |
TDQS
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.
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.
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.
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.
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.
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 marketsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| live | No | ||
| page | No | ||
| limit | No | ||
| offset | No | Date-boundary offset in minutes; used only with date-based discovery. | |
| sport_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| plan | No | |
| empty | No | |
| error | No | |
| usage | No | |
| status | No | |
| message | No | |
| event_id | No | |
| source_url | No | |
| retry_after | No | |
| limit_reason | No | |
| retrieved_at | No | |
| required_plan | No | |
| remaining_points | No | |
| missing_entitlement | No | |
| monthly_remaining_points | No |
TDQS
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.
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.
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.
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.
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.
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 sportsARead-onlyIdempotentInspect
List current canonical sport IDs and names. Do not use a catalog row as evidence of current events, prices, or plan access.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| plan | No | |
| empty | No | |
| error | No | |
| usage | No | |
| status | No | |
| message | No | |
| event_id | No | |
| source_url | No | |
| retry_after | No | |
| limit_reason | No | |
| retrieved_at | No | |
| required_plan | No | |
| remaining_points | No | |
| missing_entitlement | No | |
| monthly_remaining_points | No |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
- Changed
get_main_lines1 field changed- changed
Output 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" +}
- Changed
list_affiliates1 field changed- changed
Output 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" +}
- Changed
list_events1 field changed- changed
Output 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" +}
- Changed
list_futures1 field changed- changed
Output 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" +}
- Changed
list_markets1 field changed- changed
Output 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" +}
- Changed
list_sports1 field changed- changed
Output 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" +}
6 tool updates
v0.2.1- First observed
get_main_lines - First observed
list_affiliates - First observed
list_events - First observed
list_futures - First observed
list_markets - First observed
list_sports
TDQS
Scored across 6 tools
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.
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.
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.
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
Related MCP Connectors
Official TheRundown API documentation search. No live data or authenticated Product API calls.
NFL/NBA/MLB/NHL/PGA + DFS and prediction-market data. Browse free; query with a free API key.
The hockey data API. Stats, odds, and everything between. REST API and MCP server.
Sports odds, player props and source coverage for AI assistants. Connect with your own API key.
Related MCP Servers
- AlicenseAqualityBmaintenanceProvides read-only access to the Sleeper Fantasy Sports API for league info, rosters, matchups, drafts, transactions, and player data.1870 npm1MIT
- FlicenseNot gradedqualityBmaintenanceProvides read-only access to sports data, odds intelligence, and historical stats via 10 MCP tools, with fast response times through Redis caching.-
- AlicenseAqualityAmaintenanceProvides read-only access to the Handigraphs Stats API v1, enabling discovery of sports resources and querying of protected sports statistics.321 npmApache 2.0
- FlicenseAqualityCmaintenanceEnables 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-