Skip to main content
Glama
rapidoddsapi

rapidoddsapi-mcp

Official
by rapidoddsapi

rapidoddsapi-mcp

MCP server for RapidOddsAPI. Gives an AI assistant bookmaker odds, live scores, arbitrage and value bets.

Built on the official rapidoddsapi Python SDK.

Setup

You need an API key from the dashboard. Keys start with oa_.

Claude Desktop

Add this to claude_desktop_config.json:

{
  "mcpServers": {
    "rapidoddsapi": {
      "command": "uvx",
      "args": ["rapidoddsapi-mcp"],
      "env": {
        "RAPIDODDSAPI_API_KEY": "oa_your_api_key_here"
      }
    }
  }
}

The config file lives at ~/Library/Application Support/Claude/ on macOS and %APPDATA%\Claude\ on Windows. Restart Claude Desktop after editing it.

Anything else that speaks MCP

RAPIDODDSAPI_API_KEY=oa_your_api_key_here uvx rapidoddsapi-mcp

It speaks stdio.

Related MCP server: iddaa-mcp

Tools

Tool

Credits

list_sports(sport=)

0

get_odds(sport, market_types=, bookmakers=)

market_types x ceil(bookmakers / 5)

get_results(sport, status=, include=)

1

find_arbitrage(sport, market=, bookmakers=, min_profit=, stake=)

ceil(bookmakers / 5)

find_value_bets(sport, market=, bookmakers=, min_edge=, devig=)

ceil(bookmakers / 5)

Credits are charged only when games come back, so a query that matches nothing is free. Every response ends with what it cost and what is left.

Credits

The free tier is 250 credits for the life of the account, with no monthly reset, so the defaults are deliberately narrow:

  • A sport is always required. There is no way to request every sport at once.

  • Bookmakers default to five, one credit group, chosen for the sport's region.

  • Market types default to one.

That makes a typical question cost 1 credit. Both arguments multiply, so asking for nine market types across eighteen bookmakers is 36. The tool descriptions say so, which is what keeps the model from doing it uninvited.

find_arbitrage and find_value_bets default to ten bookmakers, 2 credits, because both need books that disagree and five rarely spread far enough.

Markets

find_arbitrage and find_value_bets handle any market whose bets have two sides: head_to_head and its period variants, soccer's draw_no_bet, totals, handicaps, team totals and player props. Each line is its own bet, so a totals market can return several results for one game.

Three-way markets return an error explaining why rather than an empty list, since "nothing found" would read as "no opportunities".

find_value_bets takes devig for where the fair price comes from. The default, "all", de-vigs every bookmaker fetched and averages the result, which needs no view on which book is sharp. Naming one, devig="Pinnacle", measures every other book against that one instead: tighter, but only on markets that book prices. A consensus needs four bookmakers on the same line, so on thin markets naming a book finds bets that averaging cannot.

Market keys vary by sport. list_sports(sport) returns the valid ones and costs nothing.

Bookmakers

Names are odds feeds, not brands. Many brands share one feed and quote identical prices, so Ladbrokes covers Neds and Betmakers covers the 26 brands running on it. A brand name that is not a feed returns nothing.

Development

pip install -e ".[dev]"
pytest
ruff check .
mypy src/rapidoddsapi_mcp

License

MIT

Available Tools

5 tools
find_arbitrageA

Find bets where backing both sides at different bookmakers locks in profit.

Fetches odds first, so it costs the same as get_odds: ceil(number of bookmakers / 5) credits for the single market. It defaults to ten bookmakers, 2 credits, because an arbitrage only exists when books disagree and five rarely spread far enough.

Works on any market whose bets have two sides: head_to_head and its period variants, soccer's draw_no_bet, totals, handicaps, team totals and player props. Only three-way markets are rejected, with an explanation rather than silently returning nothing.

On a market with a line each line is a separate bet, so a totals market can return several results for one game. Over 8.5 is never paired with Under 9.5, and a handicap of -1.5 only ever with +1.5.

min_profit is a percentage, default 1.0. Below roughly 1 percent an edge usually disappears while the second leg is being placed. Set it negative to see near misses.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYes
stakeNo
marketNohead_to_head
bookmakersNo
min_profitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so excellently. It discloses credit costs, default bookmaker count, why three-way markets are rejected, how lines are paired (e.g., Over 8.5 never with Under 9.5), and the meaning of min_profit including negative values. This goes far beyond typical descriptions.

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

Conciseness5/5

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

The description is well-structured: purpose first, then cost, market compatibility, line behavior, and parameter specifics. Every sentence adds value with no fluff or repetition. It is appropriately sized for the complexity of the tool.

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

Completeness5/5

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

Despite having 5 parameters, no schema descriptions, and no annotations, the description covers all critical behavioral aspects: cost, defaults, market edge cases, and parameter nuances. The existence of an output schema means return values need not be explained, and the description still achieves high completeness.

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 0%, so the description must compensate. It fully explains min_profit (percentage, default, negative behavior), clarifies the market parameter by listing compatible types, and implicitly covers bookmakers default. However, stake and sport are not elaborated, leaving some ambiguity for those parameters.

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

Purpose5/5

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

The description starts with a specific verb+resource: 'Find bets where backing both sides at different bookmakers locks in profit.' This clearly defines the tool's function and scope, distinguishing it from siblings like get_odds or find_value_bets by focusing on arbitrage.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool (arbitrage detection), explains cost implications relative to get_odds, and details which markets are supported. It lacks an explicit 'when-not-to-use' statement or direct alternative comparison, but the context is strong enough for an agent to make an informed choice.

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

find_value_betsA

Find prices that beat fair value.

Bookmakers price in a margin, so their odds sum to more than certainty. Removing it leaves a fair price, and any book paying more than that is positive expected value.

devig says where the fair price comes from, and is worth explaining to the user rather than just picking:

"all" the default. Every bookmaker fetched is de-vigged on its own and the results averaged. Needs no view on which book is sharp, works on markets Pinnacle does not price, and is the one to use unless there is a reason not to. a book name "Pinnacle" measures every other book against that one. A sharp book runs thin margins and moves fast, so its prices track true probability more closely than an average does. Tighter, but only where that book prices the market, and it cannot itself appear in the results.

Fetches odds first, so it costs the same as get_odds: ceil(number of bookmakers / 5) credits for the single market. Defaults to ten bookmakers, 2 credits. Naming a book puts it in the request automatically, since the calculation is impossible without it.

Same markets as find_arbitrage: head_to_head and its period variants, draw_no_bet, totals, handicaps, team totals and player props.

min_edge is a percentage, default 2.0. Smaller edges are usually inside the error of the fair price rather than real value.

ParametersJSON Schema
NameRequiredDescriptionDefault
devigNoall
sportYes
marketNohead_to_head
min_edgeNo
bookmakersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses cost behavior ('fetches odds first', credit formula), defaults, and that a named devig book is automatically included. It also explains min_edge's statistical rationale. However, it does not mention pagination, error handling, or return structure, though an output schema exists to cover returns.

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

Conciseness5/5

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

The description is front-loaded with a one-sentence summary, followed by logically grouped details (devig, cost, markets, min_edge). Every sentence adds relevant value without fluff. The formatting with code blocks and bullet-like indentation enhances readability.

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?

The tool has 5 parameters and an output schema. The description explains the purpose, costing, devig choices, market scope, and min_edge semantics, making it nearly self-sufficient. It does not explicitly state which sports are supported or how to pass bookmakers, but those may be inferred from the schema and sibling 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 schema provides 0% description coverage, so the description compensates by explaining devig (with distinct modes), min_edge, and bookmakers default. It also lists supported markets, which adds meaning to the market parameter. The sport parameter remains unexplained, but the description covers the other four params effectively.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Find prices that beat fair value') and distinguishes this tool from siblings like get_odds and find_arbitrage by clarifying its focus on positive expected value. It also details the devig methods, which further solidifies its unique purpose.

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

Usage Guidelines4/5

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

The description provides clear context on when to use the 'all' vs. a specific book name for devig, explaining trade-offs and constraints (e.g., a named book cannot appear in results). It mentions same markets as find_arbitrage, but does not explicitly contrast when to use this tool over find_arbitrage or get_odds, so it lacks a direct exclusion clause.

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

get_oddsA

Current bookmaker odds for one sport, live from RapidOddsAPI.

Use this for any question about what a bookmaker is paying right now, or for comparing prices across bookmakers, rather than answering from memory.

sport is required and must be an id from list_sports. There is no option for every sport at once.

Cost: number of market types x ceil(number of bookmakers / 5) credits, charged only when games come back. The defaults, one market across five bookmakers, cost 1 credit. Both arguments multiply, so nine market types across eighteen bookmakers is 36 credits. Widen only when asked to.

market_types defaults to head_to_head, the plain winner market. Soccer has no head_to_head because of the draw, so use head_to_head_3_way or draw_no_bet there. Get exact keys from list_sports(sport).

bookmakers defaults to five that cover the sport's region. To use others, take the names from list_sports(sport), which lists every feed available. Never guess a name: an unknown one returns no prices rather than an error, so guessing is indistinguishable from the sport having no odds, and each guess can cost credits.

Names are odds feeds, not brands. "Ladbrokes" is the feed that also carries Neds, "Betmakers" carries the 26 brands running on it, so a brand name that is not itself a feed returns nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYes
bookmakersNo
market_typesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description discloses costs ('Cost: number of market types x ceil(number of bookmakers / 5) credits'), default behavior ('market_types defaults to head_to_head'), failure modes ('an unknown one returns no prices rather than an error'), and feed semantics ('Names are odds feeds, not brands'). This goes well beyond basic descriptions.

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

Conciseness5/5

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

The description is structured in short, information-dense paragraphs, each covering a distinct aspect (purpose, usage, cost, parameters, naming). No sentence is filler; the length is justified by the tool's complexity.

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

Completeness5/5

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

The description covers all critical aspects: live data source, parameter semantics, defaults, costs, error behavior, and feed-vs-brand distinction. With an output schema present and no annotations, the description bears full responsibility for usage and side effects, and it fulfills that responsibility comprehensively.

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

Parameters5/5

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

Despite 0% schema coverage, the description thoroughly explains all three parameters: sport must come from list_sports; market_types defaults to head_to_head with sport-specific variants; bookmakers default to five regional feeds and warns against guessing names. Concrete examples like 'Ladbrokes is the feed that also carries Neds' add significant meaning.

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

Purpose5/5

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

The description opens with 'Current bookmaker odds for one sport, live from RapidOddsAPI,' clearly stating the verb (get) and resource (current odds for one sport). It distinguishes from siblings by focusing on live odds and comparing bookmakers, not results, sports list, arbitrage, or value bets.

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

Usage Guidelines4/5

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

The description provides explicit usage context: 'Use this for any question about what a bookmaker is paying right now, or for comparing prices across bookmakers, rather than answering from memory.' It also gives operational guidance like 'sport is required and must be an id from list_sports' and cost warnings. However, it does not explicitly name sibling tools as alternatives or provide when-not conditions (e.g., historical odds), so it falls short of the highest bar.

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

get_resultsA

Live scores and player stats for one sport, from RapidOddsAPI.

Use this for current scores, whether a game has finished, and player statistics, rather than answering from memory or searching.

Costs 1 credit, charged only when games come back, whatever the filters.

Results cover fewer sports than odds do. list_sports marks which ones have them; asking for a sport without results coverage returns nothing.

status: all (default), live, concluded or upcoming. include: scores, players, or both (default). A typo is rejected.

A named total such as full_time stays null until that period is complete, so nothing settles early. Sum by_period for a live running total.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportYes
statusNoall
includeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

No annotations are provided, so the description carries full burden. It discloses cost (1 credit, charged only when games come back), error behavior (typo in include is rejected), empty results for unsupported sports, and semantics of named totals (null until complete, sum by_period for running total). This is rich behavioral context beyond the schema.

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?

Every sentence earns its place. The description is compact yet covers purpose, usage, cost, coverage, parameters, and result semantics. It is well-structured with clear line breaks and no redundant information.

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

Completeness5/5

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

Given that an output schema exists, the description need not explain return values in detail. It covers essential operational context: cost, coverage limits, parameter semantics, and the meaning of live totals. This is fully sufficient for an agent to correctly select and invoke the tool.

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 0%, so the description must compensate. It explains status values ('all (default), live, concluded or upcoming') and include ('scores, players, or both (default)') with typo behavior. It references list_sports for valid sport values, though it doesn't enumerate them. This adds substantial meaning beyond the bare schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Live scores and player stats for one sport.' It clearly distinguishes itself from sibling tools like get_odds by noting coverage differences and referencing list_sports for sports that have results. The purpose is unambiguous.

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 to use: 'Use this for current scores, whether a game has finished, and player statistics, rather than answering from memory or searching.' Also provides exclusion context by mentioning that results cover fewer sports than odds and that list_sports marks which ones have them, implying when not to use.

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

list_sportsA

List the sports RapidOddsAPI covers, or one sport's market types.

This is the live coverage list, read from the API. It answers "what sports does RapidOddsAPI have", "which leagues are supported", "does it cover the NFL" and anything similar. Call it rather than answering from memory or searching the web, both of which go stale as coverage changes.

Costs 0 credits, so call it freely. Use it before get_odds whenever the sport id or the market type is not certain, since a guessed market type returns nothing and a guessed sport id is an error.

With no argument: every sport id, plus which of them have live scores. With a sport: that sport's market types, grouped into game, team and player_props, and every bookmaker you can request for it. Any of those market keys is valid as a get_odds market_type, and any of those bookmaker names is valid as a get_odds bookmaker.

Call this before naming bookmakers. Unrecognised names are not an error, they return no prices, so probing to find out which exist looks like a sport simply having no odds and costs credits for each attempt.

A sport being listed means the id is accepted, not that games are on right now. Out of season returns an empty result, which costs nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
sportNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so thoroughly. It discloses that the list is live, costs 0 credits, can return empty results out of season, and that a sport being listed only means the id is accepted—not that games are currently available.

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

Conciseness5/5

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

The description is long but every sentence adds unique value: coverage semantics, cost, use-before-get_odds guidance, bookmaker probing caveats, and seasonality. It is front-loaded with the core purpose and then expands logically into usage and edge cases without repetition.

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

Completeness5/5

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

Given the tool's one optional parameter and the absence of annotations, the description covers everything: what the tool returns in both argument modes, how it interacts with sibling get_odds, cost implications, empty-result behavior, and common failure modes. An output schema is not present, but the narrative return structure is sufficiently detailed.

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

Parameters5/5

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

Despite 0% schema description coverage, the description fully explains the only parameter 'sport': no argument returns all sports, while a sport value returns market types grouped into game/team/player_props and valid bookmaker names. It also clarifies how these returned values relate to get_odds.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'List the sports RapidOddsAPI covers, or one sport's market types.' It clearly distinguishes the tool from siblings by framing it as the live coverage list, explicitly separating it from memory/web lookups and get_odds.

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?

It gives explicit when-to-use guidance: 'Use it before get_odds whenever the sport id or the market type is not certain' and 'Call this before naming bookmakers.' It also explains when not to rely on memory/web and warns that probing unrecognized bookmaker names costs credits, making usage boundaries clear.

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. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedfind_arbitrage
    • First observedfind_value_bets
    • First observedget_odds
    • First observedget_results
    • First observedlist_sports

TDQS

A4.7/5.0
Disambiguation5/5

Each tool has a distinct purpose: one lists coverage, one fetches live scores, one fetches odds, and two analyze odds for arbitrage/value. There is no overlap that could cause an agent to select the wrong tool.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: get_results, list_sports, get_odds, find_arbitrage, find_value_bets. The verbs 'get' and 'find' are both action-oriented and the style is uniform.

Tool Count5/5

Five tools is an appropriate scope for a betting odds API: it covers the core data access (sports, results, odds) and the two main analytical use cases (arbitrage and value betting) without unnecessary bloat.

Completeness5/5

The tool set covers the full lifecycle of the domain: discovering coverage, retrieving live results, pulling current odds, and calculating betting opportunities. There are no obvious missing operations for a read-only odds service.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    MCP-compatible server that gives AI agents access to alternative sports data across 30+ leagues — odds, events, probabilities, settlement, and futures for prediction markets, DFS platforms, and sportsbooks.
    29
    15
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    MCP server that provides structured access to real-time sportsbook data from iddaa, including live events, competitions, and league fixtures with strategy analysis. Designed for AI agents and automation workflows.
    5
    60
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server that connects Claude Desktop to The Odds API, giving Claude real-time access to sports odds, scores, and schedules across 80+ sports and leagues worldwide.
    -
  • A
    license
    A
    quality
    C
    maintenance
    MCP server that connects AI assistants to the Statos football analytics platform, enabling natural language queries for match predictions, betting picks, league information, and admin market-suppression controls.
    7
    23
    MIT

Appeared in Searches

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rapidoddsapi/rapidoddsapi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server