sockodds-mcp
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., "@sockodds-mcpwhat are the odds on Broncos v Bulldogs this weekend?"
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.
sockodds-mcp
Ask Claude "what are the odds on X right now" and get every Australian bookmaker's price, the best price and the no-vig fair price, from the SockOdds sports odds API.
A free, open-source MCP server plus a Claude Code skill, built for the "$1M in 365 Days" series. MIT licence.
30-second demo
This transcript uses demo mode (SOCKODDS_DEMO=1), so the prices are invented samples, not real odds.
You: What are the odds on Lions v Crows?
Claude calls
find_eventwith{ "query": "Lions v Crows", "league_id": "AFL" }:1. Brisbane Lions v Adelaide Crows (AFL) Starts: Sat, 12 Sept 2026, 7:35 pm AEST (09:35 UTC) Event ID: afl_2026-09-12_brisbane_lions_vs_adelaide_crows Best head to head: Brisbane Lions 1.95 (Unibet), Adelaide Crows 1.90 (TAB)You: Is 1.95 on the Lions a fair price?
Claude calls
fair_oddswith{ "event_id": "afl_2026-09-12_brisbane_lions_vs_adelaide_crows", "market": "h2h" }:No-vig fair odds: Head to head, from 3 bookmakers Brisbane Lions: fair 2.03 (49.3% chance) Adelaide Crows: fair 1.97 (50.7% chance) Per bookmaker (margin, then its own no-vig prices): Sportsbet: margin 5.3%, 2.03 / 1.97, read 11 Sept 06:00:12 UTC TAB: margin 5.0%, 2.01 / 1.99, read 11 Sept 06:01:40 UTC Unibet: margin 5.3%, 2.05 / 1.95, read 11 Sept 05:59:03 UTCClaude: The best Lions price is 1.95 at Unibet (read 05:59 UTC). With the bookmakers' margins taken out, the Lions come out at about 2.03, so 1.95 is a little shorter than the fair price. Odds change, so check the price at the bookmaker. 18+. Nothing here is a tip. Gamble responsibly: Gambling Help Online 1800 858 858.
Related MCP server: mcp-odds-api
Tools
Tool | What it does |
| Leagues SockOdds carries and whether your key's plan can read each one |
| Turns "Broncos v Bulldogs" or "AFL grand final" into events with start times and event IDs |
| Every bookmaker's decimal prices for head to head, line and total, each with the time it was read |
| Best price for one side of one market, plus the field; suspended prices and other lines are left out |
| No-vig fair price for a two- or three-way market (see the method below); also works by hand with no API call |
How fair_odds works
For each bookmaker that prices every outcome at the same line, each price becomes an implied chance (1 / price). Those chances add up to more than 100%; the extra is the bookmaker's margin. Dividing each chance by the total removes the margin (the proportional method). The tool then averages each bookmaker's margin-free chances and turns them back into prices (1 / chance). It also shows each bookmaker's margin and the combined margin of the best prices.
The free plan's books are retail bookmakers, so this is an estimate of the chance, not a prediction. When your plan includes SockOdds' own fairOdds (built from exchanges and sharp books), the tool shows it too.
No line movement tool
SockOdds has a price history endpoint (/v2/odds/history/), but its homepage and FAQ list recorded price movements as a Pro and Platform feature. The free key cannot read it, so this server does not include an explain_line_movement tool.
Get a free SockOdds key
Get a free SockOdds key. No card needed; the key is shown once, so copy it somewhere safe.
The free Developer plan, as stated on the pricing page, the signup page and the rate limit docs:
2,500 objects a month (one event with all its markets and bookmakers is one object), reset each UTC calendar month
10 requests a minute
About 2 minute update frequency
4 leagues: MLB, NFL, AFL and NRL
3 bookmakers: Sportsbet, TAB and Ladbrokes
To stay inside that, this server caches every response for 60 seconds, never retries a failed request, and after a rate limit error (HTTP 429) refuses further calls until SockOdds' Retry-After time has passed. find_event asks for one league and a date window where it can, and tells you how many objects a search used.
Install
You need Node.js 20 or newer.
From source
git clone https://github.com/jameselle/sockodds-mcp.git
cd sockodds-mcp
npm install
npm run buildClaude Code
claude mcp add sockodds --env SOCKODDS_API_KEY=your-key -- node /full/path/to/sockodds-mcp/dist/src/index.jsOnce the package is on npm you can use npx instead:
claude mcp add sockodds --env SOCKODDS_API_KEY=your-key -- npx -y sockodds-mcpTo add the skill, which tells Claude when to use the tools and how to quote prices, copy the skill folder into your skills directory:
mkdir -p ~/.claude/skills/sockodds-odds
cp skill/SKILL.md ~/.claude/skills/sockodds-odds/SKILL.mdClaude Desktop
Add this to claude_desktop_config.json (Settings, Developer, Edit Config), then restart Claude Desktop:
{
"mcpServers": {
"sockodds": {
"command": "node",
"args": ["/full/path/to/sockodds-mcp/dist/src/index.js"],
"env": {
"SOCKODDS_API_KEY": "your-key"
}
}
}
}Settings
Variable | Default | Meaning |
| none | Your SockOdds key. Sent only in the |
| off | Set to |
|
| Time zone for start times (UTC is always shown too) |
|
| API base URL |
Develop
npm install
npm testTests use Node's built-in test runner. They cover the fair odds maths, best price selection, parsing of the example responses from the SockOdds docs, the missing key and rate limit errors, and the MCP tools end to end. No test calls the live API.
docs/API-NOTES.md lists every endpoint and field this server relies on, with links to the SockOdds docs. fixtures/docs/ holds example responses copied from those docs; fixtures/demo/ holds invented data in the same shape for demo mode.
Gamble responsibly
18+. Odds change all the time and nothing this tool shows is a tip or advice. If gambling is causing you or someone close to you harm, call Gambling Help Online on 1800 858 858 or visit gamblinghelponline.org.au. You can exclude yourself from Australian online bookmakers at BetStop.
Licence
MIT. See LICENSE.
Available Tools
5 toolsbest_priceBest priceARead-only
Find the best (highest) decimal price for one side of one market across bookmakers, and show the rest of the field. Only prices open right now count; suspended or expired prices are listed separately. For line and total markets prices are compared at one line only: the line you give, else SockOdds' consensus line. Give market and side, or an exact odd_id from get_odds. Costs one object.
| Name | Required | Description | Default |
|---|---|---|---|
| line | No | Compare at this line. For a line market this is the chosen side's own handicap, for example -2.5 | |
| side | No | home or away (h2h, line), draw (h2h_3way), over or under (total) | |
| market | No | h2h, h2h_3way, line or total | |
| odd_id | No | Exact oddID from get_odds instead of market and side, for any market | |
| event_id | Yes | Event ID from find_event |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world behavior, so the description only needs to add context, and it does: only currently-open prices count, suspended/expired prices are listed separately, line markets compare at a single line, and the call costs one object (billing). That is meaningful operational detail beyond the annotations, though return shape is only gestured at.
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?
Four sentences, front-loaded with the core purpose, and each sentence carries distinct information (scope, price eligibility, line semantics, billing). Slightly dense but nothing is redundant.
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?
No output schema exists, and the description compensates reasonably by indicating that non-best prices are also shown and that suspended/expired entries are listed separately. Coverage of parameters and behavior is solid for a 5-param read tool, though the exact return structure remains vague.
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 100%, so the baseline is 3, but the description adds real meaning the schema lacks: the consensus-line default for line/total markets and the dependency that market+side is only needed when odd_id is absent. That goes beyond the enum/parameter descriptions without fully documenting every parameter.
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 opening sentence gives a precise verb and resource: it finds the best (highest) decimal price for one side of one market across bookmakers, and it states the secondary output ('show the rest of the field'). The reference to get_odds for odd_id helps separate it from that sibling.
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 clearly explains the two supported invocation routes ('Give market and side, or an exact odd_id from get_odds') and the fallback for line/total markets (your line, else the consensus line). It does not explicitly say when to prefer this over siblings like fair_odds, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fair_oddsNo-vig fair oddsARead-only
Work out the no-vig (margin-free) fair price for a two- or three-way market. Method: for each bookmaker that prices every outcome at the same line, convert prices to implied chances (1 / decimal price), divide by their total so they add to 100% (the proportional method), then average those chances across bookmakers and convert back (1 / chance). Also reports each bookmaker's margin and the combined margin of the best prices. Use event_id and market for live prices, or pass prices to calculate by hand with no API call. The result estimates the chance; it is not a prediction or a tip.
| Name | Required | Description | Default |
|---|---|---|---|
| line | No | Line to use: the home team's handicap for a line market, the total for a total market | |
| market | No | h2h, h2h_3way, line or total | |
| prices | No | Calculate by hand from these decimal prices instead of calling the API | |
| event_id | No | Event ID from find_event (with market) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint=false, and the description adds substantial context beyond that: the full calculation method, the fact that no API call occurs when prices are passed, what is reported (per-bookmaker margin and combined margin of best prices), and the important caveat that the result 'estimates the chance; it is not a prediction or a tip.'
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 purpose is front-loaded in the first sentence and the method, modes, and caveat follow in an orderly way. It is on the longer side and the method walkthrough is dense, but nearly every sentence carries information an agent needs, so little is wasted.
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?
For a four-parameter tool with a nested prices object, no output schema, and only safety annotations, the description supplies what's missing: the algorithm, the two invocation modes, the reported outputs, and the interpretive caveat. Nothing an agent needs to call it correctly is absent.
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 100%, so the baseline is 3, but the description adds real meaning: it ties 'two- or three-way market' to the market enum, clarifies that event_id is used together with market, and frames prices as the by-hand alternative to the API path. It does not add further detail on the line parameter beyond the 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 names a specific verb and resource ('work out the no-vig (margin-free) fair price') and scopes it to two- or three-way markets, then details the exact proportional method used. An agent can tell this is a derived-metric calculator rather than a raw price lookup like get_odds or best_price without opening any schema.
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 clearly states the two operating modes: 'Use event_id and market for live prices, or pass prices to calculate by hand with no API call.' That is explicit when-to-use guidance for each path, but it never names or excludes the sibling tools (get_odds, best_price), so the agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_eventFind an eventARead-only
Find upcoming events (games) from a plain question such as 'Broncos v Bulldogs', 'AFL grand final' or 'Lions Crows'. Returns matching events with start times (local and UTC), event IDs and the best head to head price per side. Pass league_id whenever you know the league (for example AFL, NRL, NFL, MLB): it keeps the search small, because every event returned counts as one object against the key's monthly allowance. With no team named, it lists the soonest events in the league.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most events to fetch. Default 25 with a league, 50 without. | |
| query | Yes | Plain question or team names, for example 'Broncos v Bulldogs' or 'AFL grand final' | |
| league_id | No | League, for example AFL, NRL, NFL, MLB. Strongly recommended. | |
| days_ahead | No | Only events starting within this many days. Default 14. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description adds real value beyond them: it discloses the quota cost model ('every event returned counts as one object against the key's monthly allowance') and the practical effect of omitting league_id. It stops short of disclosing pagination or result ordering beyond the name-free fallback.
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?
Purpose and example queries are front-loaded, followed by return contents and then cost/parameter guidance; every sentence carries information. It is slightly dense but no sentence is redundant.
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 no output schema, the description compensates by enumerating what is returned (start times in local and UTC, event IDs, best head-to-head price per side), plus quota mechanics and the no-team fallback. An agent has enough to call and interpret the tool correctly.
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 100%, so the schema documents defaults for limit and days_ahead; baseline would be 3. The description adds rationale the schema lacks, explaining that passing league_id 'keeps the search small' and what happens with an empty team query, which meaningfully clarifies why the optional parameters matter.
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 (find) and resource (upcoming events/games) and clarifies the input style ('from a plain question such as...'). It is clearly distinguishable from siblings like get_odds, best_price, and list_leagues, which serve different retrieval purposes.
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 concrete when-to-use context: pass league_id whenever the league is known, and it explains the fallback behavior when no team is named. It does not explicitly name the sibling tools or state when to prefer them over find_event, so it stops short of a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_oddsGet odds for an eventARead-only
Get every bookmaker's current decimal prices for one event's main markets: head to head (with the draw where the sport has one), line (handicap) and total points. Each price shows the bookmaker and when it was last seen. Set all_markets to true to include every priced market, such as halves and props. Costs one object.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event ID from find_event, for example afl_2026-09-12_brisbane_lions_vs_adelaide_crows | |
| bookmakers | No | Optional comma separated bookmakerIDs, for example sportsbet,tab | |
| all_markets | No | Include every priced market, not just head to head, line and total |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds real value beyond them by disclosing data freshness ('when it was last seen') and a consumption cost ('Costs one object'). It stops short of describing pagination, response size, or what happens when no bookmaker prices exist.
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?
Four tight sentences, front-loaded with the core purpose, then the default market scope, then the all_markets expansion, then the cost. Every sentence carries information an agent needs; nothing is redundant.
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 no output schema, the description carries the return-shape burden and does so: prices are decimal, per bookmaker, with a last-seen timestamp. Combined with annotations covering the safety profile and full schema coverage on parameters, an agent has what it needs to call this correctly.
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 100%, so the baseline is 3, but the description adds meaning the schema lacks: it defines the default market set and clarifies that all_markets pulls in 'every priced market, such as halves and props'. It says nothing extra about the bookmakers filter or the event_id format, which the schema already documents well.
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 gives a specific verb and resource ('Get every bookmaker's current decimal prices for one event') and enumerates the exact market set covered (head to head, line, total). It implicitly separates itself from siblings like best_price and fair_odds by scoping to all bookmakers and raw prices, but it never names or contrasts those siblings explicitly.
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 tells the agent when to flip all_markets to true (halves and props) and notes the cost ('Costs one object'), which is genuine usage guidance. However it never says when to prefer best_price or fair_odds over this tool, so tool-selection guidance is only implied by scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_leaguesList leaguesARead-only
List the leagues SockOdds carries and whether this API key's plan can read each one. The free Developer plan covers MLB, NFL, AFL and NRL. Use it when you are unsure of a leagueID.
| Name | Required | Description | Default |
|---|---|---|---|
| sport_id | No | Optional sportID filter, for example AUSSIE_RULES or RUGBY_LEAGUE |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful context beyond them: the tool is plan-gated and the free Developer plan only covers MLB, NFL, AFL and NRL, which matters for interpreting results. It says nothing about pagination or ordering, which is a minor gap for a small enumeration.
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 sentences, front-loaded with the core purpose and free of filler; the plan-coverage detail earns its place as gating information. The trailing 'leagueID' reference slightly muddies the message since leagueID is not a parameter of this 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?
For a one-optional-parameter enumeration tool with no output schema, the description covers purpose, usage trigger, and the plan-access behavior an agent needs to interpret results. Only return-shape details (fields, ordering) are omitted, which is acceptable given no output schema exists.
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 100% for the single optional sport_id parameter, including an example value, so baseline is 3. The description mentions 'leagueID' but does not clarify sport_id's filtering semantics beyond what the schema already documents.
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 states a specific verb and resource ('List the leagues SockOdds carries') and adds what the response conveys (plan read-access per league). It is clearly distinct from odds-oriented siblings like get_odds and best_price, though it never names a sibling explicitly.
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 a clear triggering condition: 'Use it when you are unsure of a leagueID.' That tells the agent when this tool is the right entry point, though it does not state when not to use it or name an alternative lookup path.
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.
5 tool updates
v0.1.0- First observed
best_price - First observed
fair_odds - First observed
find_event - First observed
get_odds - First observed
list_leagues
TDQS
Scored across 5 tools
Each tool targets a distinct stage of the workflow: list_leagues and find_event handle discovery, get_odds retrieves all prices for an event, best_price isolates the top price for one side, and fair_odds computes margin-free prices. The only mild overlap is get_odds vs best_price, both returning prices, but the descriptions clearly separate 'all bookmakers/markets' from 'best price for one side'.
All names use consistent snake_case, but the convention is mixed: list_leagues, get_odds and find_event are verb_noun, while best_price and fair_odds are adjective_noun rather than verbs. Readable but not a single predictable pattern.
Five tools is a tight, well-scoped set for a sports-odds API, covering discovery, retrieval and analysis without redundancy. Slightly lean, but every tool earns its place.
The surface covers the core lifecycle: find leagues, find events, fetch odds, find best price and derive fair odds. Minor gaps exist (no bookmaker listing, historical odds, or event detail beyond odds), but main betting workflows are workable.
Maintenance
Related MCP Connectors
Sports odds, player props and source coverage for AI assistants. Connect with your own API key.
Australian sports betting analytics: odds compared, +EV picks, price moves, your bets.
Sportsbook-derived no-vig fair value with confidence, provenance, and history over REST/MCP.
Live odds, cross-book +EV and graded player-prop results across 37 books. Hosted endpoint included.
Related MCP Servers
AlicenseAqualityAmaintenanceEnables AI assistants to access sports betting odds data from 265+ bookmakers across 34 sports, including events, odds, historical data, arbitrage, and value bets.22128 npm1MIT- AlicenseNot gradedqualityBmaintenanceEnables fetching sportsbook odds, live scores, and event information across 70+ books and 30+ leagues, with tools to list sports, get scores, and discover events.191 npm1MIT
- AlicenseAqualityBmaintenanceEnables AI agents to query live sports betting data including odds, edges, arbitrage opportunities, player/team stats, and reference data using the SportWizzard API.2050 npmMIT
- AlicenseNot gradedqualityBmaintenanceProps-first sports odds API with a hosted MCP server. Live odds and player props (moneyline, spreads, totals) across US sportsbooks, normalized to JSON. Tools: get_odds, get_props, get_events, get_books. API-key auth, free tier.MIT No Attribution