rapidoddsapi-mcp
OfficialClick on "Install 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., "@rapidoddsapi-mcpGet odds for NBA 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.
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-mcpIt speaks stdio.
Related MCP server: iddaa-mcp
Tools
Tool | Credits |
| 0 |
|
|
| 1 |
|
|
|
|
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_mcpLinks
License
MIT
Available Tools
5 toolsfind_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.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | ||
| stake | No | ||
| market | No | head_to_head | |
| bookmakers | No | ||
| min_profit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| devig | No | all | |
| sport | Yes | ||
| market | No | head_to_head | |
| min_edge | No | ||
| bookmakers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | ||
| bookmakers | No | ||
| market_types | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | Yes | ||
| status | No | all | |
| include | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sport | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
find_arbitrage - First observed
find_value_bets - First observed
get_odds - First observed
get_results - First observed
list_sports
TDQS
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.
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.
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.
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
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
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
The Odds API MCP — sportsbook odds across 70+ books, 30+ leagues
Sports Game Odds MCP — wraps the Sports Game Odds API (sportsgameodds.com)
MCP server exposing the Backtest360 engine API as tools for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP-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.2915MIT
- AlicenseBqualityCmaintenanceMCP 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.560MIT
- FlicenseNot gradedqualityDmaintenanceAn 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.-
- AlicenseAqualityCmaintenanceMCP 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.723MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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