Koskamo

The Odds Gap MCP

An official MCP server provided by The Odds Gap that allows AI agents to query live sports betting odds and prediction market prices. It enables users to find the best price across major US sportsbooks and prediction markets like Kalshi and Polymarket, compare lines, and access historical data without requiring authentication for basic usage.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

The Odds Gap MCP logo, by The Odds GapVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by The Odds Gap
MCP endpoint (Streamable HTTP)
https://theoddsgap.com/assistant/v1/mcp
Vendor documentation

What its tools do

11 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

11 of 11 have a description · 11 of 11 declare behavior hints · 11 of 11 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to theoddsgap.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Find the best price on a specific sports line across multiple books
  • Compare sportsbook odds with prediction market prices
  • Access historical odds data for analysis
  • Query AI assistant for sports betting insights

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
com.theoddsgap/answers 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
11 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Ask The Odds Gap sports betting price questions from your AI assistant. Answers come from prices we collect from US sportsbooks and prediction-market exchanges: which book pays the most for a bet, hedge math, parlay prices, a game's full board, past results and line moves. Every answer shows when the prices were scanned and links to the matching page on theoddsgap.com. Prices are a snapshot and may have moved. Information only: it places no bets and gives no picks. 21+. Gambling problem? Call 1-800-GAMBLER.

Tools

11 advertised

ask — Ask a Betting Price Question
Advertised by the server during the last successful anonymous check.
Advertised read-only

Ask one whole sports betting price question in plain English, the way a person would: which book pays the most for a bet, hedge math on a ticket, a parlay price, a game's board, a past result or how a line has moved. Returns a plain-sentence answer, the time the prices were scanned and a link to the matching page on theoddsgap.com. When a question could mean more than one game, it returns the choices as plain text to ask again with. Prices may have moved since the scan. Information only: it places no bets and gives no picks.

ask input schema
{
  "type": "object",
  "required": [
    "question"
  ],
  "properties": {
    "question": {
      "type": "string",
      "maxLength": 400,
      "description": "One whole question, for example 'where is the best price on the Lions moneyline' or 'hedge my Ravens ticket at +240 for $50'."
    }
  },
  "additionalProperties": false
}
ask output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
ask annotations
{
  "title": "Ask a Betting Price Question",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
calc — Betting Calculator
Advertised by the server during the last successful anonymous check.
Advertised read-only

Runs a betting calculation on numbers you supply: convert odds between formats, implied probability, payout on a stake, the no-vig price of two sides, hold, breakeven, a parlay of typed odds, or an arb or hedge split on typed prices. Uses only the numbers given, no market data.

calc input schema
{
  "type": "object",
  "required": [
    "text"
  ],
  "properties": {
    "text": {
      "type": "string",
      "description": "The reader's words, with their numbers."
    }
  },
  "additionalProperties": false
}
calc output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
calc annotations
{
  "title": "Betting Calculator",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
site_info — How The Odds Gap Works
Advertised by the server during the last successful anonymous check.
Advertised read-only

Explains a betting term or how The Odds Gap works (gap percent, matched lines, the exchange depth rule, Kalshi fees, why offshore books are left out, the site's tools), in the site's own words with a link to the page it comes from.

site_info input schema
{
  "type": "object",
  "required": [
    "text"
  ],
  "properties": {
    "text": {
      "type": "string",
      "description": "The reader's words."
    },
    "topic": {
      "type": "string",
      "description": "A topic key, or omit to read the words."
    }
  },
  "additionalProperties": false
}
site_info output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
site_info annotations
{
  "title": "How The Odds Gap Works",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
slate — Games on the Schedule
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists the games in a window (tonight, tomorrow, a weekday or a date) for a league or one team, with the highest moneyline price we saw on each side and the time it was scanned. Prices may have moved since the scan.

slate input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "team": {
      "type": "string",
      "description": "One team: its upcoming games."
    },
    "text": {
      "type": "string",
      "description": "The reader's words, for the window."
    },
    "when": {
      "type": "string",
      "description": "today, tonight, tomorrow, a weekday, weekend, or YYYY-MM-DD. Default the next 24 hours."
    },
    "books": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The books this person actually has. Omit for the default set."
    },
    "limit": {
      "type": "integer",
      "description": "How many games. Default 8, max 8."
    },
    "sport": {
      "type": "string",
      "description": "League, e.g. nfl or college football."
    }
  },
  "additionalProperties": false
}
slate output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
slate annotations
{
  "title": "Games on the Schedule",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
game_lines — Game Lines
Advertised by the server during the last successful anonymous check.
Advertised read-only

One game's moneyline, spread or total: both sides on the consensus number, or which side the market has as the favorite. Name the game in plain words, for example Lions at Bears. Shows the scan time and a link to the game's page. Prices may have moved since the scan.

game_lines input schema
{
  "type": "object",
  "required": [
    "game"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "The game in plain words, for example 'Lions at Bears' or 'Yankees tonight'."
    },
    "line": {
      "type": "number",
      "description": "The spread or total the bet is at. Omit for a moneyline, or to use the consensus line."
    },
    "side": {
      "enum": [
        "home",
        "away",
        "over",
        "under"
      ],
      "type": "string",
      "description": "home or away for a moneyline or spread; over or under for a total."
    },
    "team": {
      "type": "string",
      "description": "A known team with no game on the board."
    },
    "books": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The books this person actually has. Omit for the default set."
    },
    "market": {
      "enum": [
        "ml",
        "spread",
        "total"
      ],
      "type": "string",
      "description": "ml, spread or total."
    },
    "favored": {
      "type": "boolean",
      "description": "Who the market favors, as a price."
    },
    "markets": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Game-line markets to show, both sides each."
    }
  },
  "additionalProperties": false
}
game_lines output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
game_lines annotations
{
  "title": "Game Lines",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
past_game — Past Game Result
Advertised by the server during the last successful anonymous check.
Advertised read-only

A finished game: the final score, the closing spread and total, and the earliest line we recorded, with a link to the game's page. Never an upcoming game.

past_game input schema
{
  "type": "object",
  "required": [
    "text"
  ],
  "properties": {
    "game": {
      "type": "string",
      "description": "The game in plain words, for example 'Lions at Bears' or 'Yankees tonight'."
    },
    "text": {
      "type": "string",
      "description": "The team or matchup, in the reader's words."
    },
    "list_all": {
      "type": "boolean",
      "description": "Every finished game in the window the words name."
    }
  },
  "additionalProperties": false
}
past_game output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
past_game annotations
{
  "title": "Past Game Result",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
team_record — Team Results on The Odds Gap
Advertised by the server during the last successful anonymous check.
Advertised read-only

A team's finished games tracked on The Odds Gap and its next game. Not an official league record.

team_record input schema
{
  "type": "object",
  "required": [
    "team"
  ],
  "properties": {
    "team": {
      "type": "string",
      "description": "The team as typed."
    },
    "text": {
      "type": "string",
      "description": "The reader's words, for an ATS, over/under or trends record."
    }
  },
  "additionalProperties": false
}
team_record output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
team_record annotations
{
  "title": "Team Results on The Odds Gap",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
futures_odds — Futures Prices
Advertised by the server during the last successful anonymous check.
Advertised read-only

Season-long futures such as the Super Bowl, World Series, Stanley Cup, NBA and college titles: the highest price we saw on a team, or the top of one futures market, with the scan time. Prices may have moved since the scan.

futures_odds input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "team": {
      "type": "string",
      "description": "One entrant, if they named one."
    },
    "text": {
      "type": "string",
      "description": "The person's own words. This is what names the market, because a futures market has no id anybody would ever say out loud."
    },
    "books": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The books this person actually has. Omit for the default set."
    },
    "sport": {
      "type": "string",
      "description": "The league, if no market is named."
    },
    "stake": {
      "type": "number",
      "description": "A stake to pay out at the best price."
    },
    "teams": {
      "type": "array",
      "description": "Two or more entrants asked together."
    },
    "market": {
      "type": "string",
      "description": "A market phrase, if it is separable from the rest of the sentence."
    },
    "compare": {
      "type": "array",
      "description": "Books the person named, to say each one's price."
    }
  },
  "additionalProperties": false
}
futures_odds output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
futures_odds annotations
{
  "title": "Futures Prices",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
player_prop — Player Prop
Advertised by the server during the last successful anonymous check.
Advertised read-only

One player's prop: the line the market is at and the highest price we saw on each side, with the scan time. The player must be on our props board. Prices may have moved since the scan.

player_prop input schema
{
  "type": "object",
  "required": [
    "player"
  ],
  "properties": {
    "line": {
      "type": "number",
      "description": "The line the person named, if they named one."
    },
    "side": {
      "enum": [
        "over",
        "under",
        "yes",
        "no"
      ],
      "type": "string",
      "description": "over, under, yes or no."
    },
    "books": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The books this person actually has. Omit for the default set."
    },
    "market": {
      "type": "string",
      "description": "The prop market key, e.g. player_receptions or pitcher_strikeouts. Omit to be told what the board has for that player."
    },
    "player": {
      "type": "string",
      "description": "The player's name as the person typed it."
    }
  },
  "additionalProperties": false
}
player_prop output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
player_prop annotations
{
  "title": "Player Prop",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
arbs — Arbitrage Spots
Advertised by the server during the last successful anonymous check.
Advertised read-only

Spots where two books' prices on opposite sides of the same bet added up to less than 100 percent implied at the scan, with how a stake would split. Prices may have moved since the scan. An arb can close at any time.

arbs input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "game": {
      "type": "string",
      "description": "The game in plain words, for example 'Lions at Bears' or 'Yankees tonight'."
    },
    "text": {
      "type": "string",
      "description": "The reader's words."
    },
    "books": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The books this person actually has. Omit for the default set."
    },
    "stake": {
      "type": "number",
      "description": "A total stake to split."
    }
  },
  "additionalProperties": false
}
arbs output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
arbs annotations
{
  "title": "Arbitrage Spots",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
middles — Middles
Advertised by the server during the last successful anonymous check.
Advertised read-only

Spread and total middles across sportsbooks at the scan: two numbers far enough apart that both bets could win. Prices may have moved since the scan.

middles input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "game": {
      "type": "string",
      "description": "The game in plain words, for example 'Lions at Bears' or 'Yankees tonight'."
    },
    "pick": {
      "type": "string",
      "description": "A number to put in place of one side of the last middle, for 'what if I took 144.5 instead' (prompt 194)."
    },
    "text": {
      "type": "string",
      "description": "The reader's words."
    },
    "books": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The books this person actually has. Omit for the default set."
    },
    "stake": {
      "type": "number",
      "description": "The stake on each ticket, for hit and miss dollars."
    }
  },
  "additionalProperties": false
}
middles output schema
{
  "type": "object",
  "required": [
    "ok",
    "answer",
    "page",
    "responsible_gambling"
  ],
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "True when the tool produced an answer."
    },
    "card": {
      "type": "object",
      "description": "The same answer, structured, when there is one."
    },
    "page": {
      "type": "string",
      "description": "The matching page on theoddsgap.com."
    },
    "tool": {
      "type": [
        "string",
        "null"
      ]
    },
    "as_of": {
      "type": [
        "string",
        "null"
      ],
      "description": "When the prices were scanned, Eastern Time."
    },
    "stale": {
      "type": "boolean",
      "description": "True when that scan is older than usual for our hourly snapshot."
    },
    "answer": {
      "type": "string",
      "description": "The answer in plain sentences."
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "When the question could mean more than one thing: whole questions to ask again with."
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "state_note": {
      "type": "string",
      "description": "Where to check what is legal for you."
    },
    "decline_kind": {
      "enum": [
        "data",
        "advice",
        "record"
      ],
      "type": "string",
      "description": "Set when the question is one we do not answer, and which kind."
    },
    "free_left_today": {
      "type": [
        "integer",
        "null"
      ]
    },
    "responsible_gambling": {
      "type": "string"
    }
  }
}
middles annotations
{
  "title": "Middles",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
587 ms
95th percentile latency
587 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 587 ms · metadata changed · 11 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http the-odds-gap-mcp https://theoddsgap.com/assistant/v1/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add the-odds-gap-mcp --url https://theoddsgap.com/assistant/v1/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable the-odds-gap-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "the-odds-gap-mcp": {
      "url": "https://theoddsgap.com/assistant/v1/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "the-odds-gap-mcp": {
      "type": "streamableHttp",
      "url": "https://theoddsgap.com/assistant/v1/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start the-odds-gap-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "the-odds-gap-mcp": {
      "type": "http",
      "url": "https://theoddsgap.com/assistant/v1/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http the-odds-gap-mcp https://theoddsgap.com/assistant/v1/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://theoddsgap.com/assistant/v1/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "the-odds-gap-mcp": {
      "serverUrl": "https://theoddsgap.com/assistant/v1/mcp"
    }
  }
}

Let your agent find its tools

Find servers like The Odds Gap MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run The Odds Gap MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing