Skip to main content
Glama
jameselle

sockodds-mcp

by jameselle

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_event with { "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_odds with { "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 UTC

Claude: 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

list_leagues

Leagues SockOdds carries and whether your key's plan can read each one

find_event

Turns "Broncos v Bulldogs" or "AFL grand final" into events with start times and event IDs

get_odds

Every bookmaker's decimal prices for head to head, line and total, each with the time it was read

best_price

Best price for one side of one market, plus the field; suspended prices and other lines are left out

fair_odds

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 build

Claude Code

claude mcp add sockodds --env SOCKODDS_API_KEY=your-key -- node /full/path/to/sockodds-mcp/dist/src/index.js

Once the package is on npm you can use npx instead:

claude mcp add sockodds --env SOCKODDS_API_KEY=your-key -- npx -y sockodds-mcp

To 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.md

Claude 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

SOCKODDS_API_KEY

none

Your SockOdds key. Sent only in the x-api-key header. Without it the odds tools explain how to get one.

SOCKODDS_DEMO

off

Set to 1 to try the tools with invented sample data and no key. Ignored when a key is set.

SOCKODDS_TIMEZONE

Australia/Sydney

Time zone for start times (UTC is always shown too)

SOCKODDS_BASE_URL

https://api.sockodds.com/v2

API base URL

Develop

npm install
npm test

Tests 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 tools
best_priceBest priceA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineNoCompare at this line. For a line market this is the chosen side's own handicap, for example -2.5
sideNohome or away (h2h, line), draw (h2h_3way), over or under (total)
marketNoh2h, h2h_3way, line or total
odd_idNoExact oddID from get_odds instead of market and side, for any market
event_idYesEvent ID from find_event

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 oddsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineNoLine to use: the home team's handicap for a line market, the total for a total market
marketNoh2h, h2h_3way, line or total
pricesNoCalculate by hand from these decimal prices instead of calling the API
event_idNoEvent ID from find_event (with market)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMost events to fetch. Default 25 with a league, 50 without.
queryYesPlain question or team names, for example 'Broncos v Bulldogs' or 'AFL grand final'
league_idNoLeague, for example AFL, NRL, NFL, MLB. Strongly recommended.
days_aheadNoOnly events starting within this many days. Default 14.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesEvent ID from find_event, for example afl_2026-09-12_brisbane_lions_vs_adelaide_crows
bookmakersNoOptional comma separated bookmakerIDs, for example sportsbet,tab
all_marketsNoInclude every priced market, not just head to head, line and total

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 leaguesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sport_idNoOptional sportID filter, for example AUSSIE_RULES or RUGBY_LEAGUE

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.1.0
    • First observedbest_price
    • First observedfair_odds
    • First observedfind_event
    • First observedget_odds
    • First observedlist_leagues

TDQS

A4/5.0

Scored across 5 tools

Disambiguation4/5

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'.

Naming Consistency3/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to access sports betting odds data from 265+ bookmakers across 34 sports, including events, odds, historical data, arbitrage, and value bets.
    22
    128 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to query live sports betting data including odds, edges, arbitrage opportunities, player/team stats, and reference data using the SportWizzard API.
    20
    50 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Props-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