# infersports MCP server

Sharp Asian odds + opening-line (初盘) movement for agents: 6 Asian books + Pinnacle. Read-only.

## Links
- Registry page: https://www.getdrio.com/mcp/dev-infersports-infersports
- Website: https://infersports.dev

## Install
- Endpoint: https://api.infersports.dev/mcp
- Auth: Not captured

## Setup notes
- Remote endpoint: https://api.infersports.dev/mcp

## Tools
- get_sharp_line (Get Sharp Line) - Answer an odds question about a fixture in ONE call (natural language in, worked line out).

    Resolves the fixture, picks the consensus line, the best price per outcome across books, and
    de-vigged fair odds from the sharpest book — returning a ready-to-read ``summary`` plus the
    full ``comparison``. Prefer this over chaining find_match → compare_lines.

    Args:
        query: natural-language fixture, e.g. "Arsenal vs Man City" or a single team.
        market_type: "1x2", "asian_handicap" (default) or "totals".
        period: "full_time" (default) or "half_time".
        format: odds format — decimal | hk | malay | american | indonesian | probability.
        sport: optional filter — "football" or "basketball".
        date: optional UTC date "YYYY-MM-DD" to disambiguate same-name fixtures.
        verbosity: "full" (default) or "terse". "terse" empties the per-book ``books`` array inside
            ``comparison`` to save tokens; the ``summary`` and worked numbers are kept either way.

    On an ambiguous query, ``status`` is "ambiguous" and ``ask_user`` carries a disambiguation
    prompt — do not assume a match; ask the user or re-call with a more specific query. A
    ``decision`` block (``safe_to_proceed`` / ``ask_user`` / ``next_action``) pre-computes the
    go/no-go — branch on it instead of re-judging the result.
     Endpoint: https://api.infersports.dev/mcp
- find_match (Find Match) - Find a football/basketball fixture by natural-language name.

    Args:
        query: e.g. "Man City vs Arsenal" or a single team name.
        sport: optional filter — "football" or "basketball".
        date: optional UTC date "YYYY-MM-DD" to disambiguate same-name fixtures.

    Returns the best-matching event (with id, teams, league, kickoff, live score, the live match
    ``clock`` e.g. "2h 47" or "ht", and a confidence score) plus alternatives. Use the returned
    ``event_id`` with get_match_odds / compare_lines.
    A ``decision`` block tells you whether it's ``safe_to_proceed`` and the suggested
    ``next_action`` (or ``ask_user`` when ambiguous).
     Endpoint: https://api.infersports.dev/mcp
- get_match_odds (Get Match Odds) - Get all current odds for a match across bookmakers.

    Args:
        event_id: event id from find_match / list_today_matches (e.g. "evt_…").
        markets: optional filter — any of "1x2", "asian_handicap", "totals".
        bookmakers: optional filter — bookmaker keys, e.g. ["pinnacle", "crown"].
        period: optional — "full_time" or "half_time" (default: both).
        format: odds format — decimal | hk | malay | american | indonesian | probability.
     Endpoint: https://api.infersports.dev/mcp
- compare_lines (Compare Lines) - Compare one market across all bookmakers for a match.

    Returns each book's quote line-by-line, the consensus line, the best price per outcome, each
    book's overround, and de-vigged fair odds from the sharpest (lowest-margin) book.

    Args:
        event_id: event id (e.g. "evt_…").
        market_type: "1x2", "asian_handicap" (default) or "totals".
        period: "full_time" (default) or "half_time".
        format: display odds format (analytics are computed in decimal regardless).
        verbosity: "full" (default) or "terse". "terse" drops the per-book ``books`` array (the bulk
            of the payload) and returns only the worked answer (best_prices / consensus_line /
            fair_odds / summary).
     Endpoint: https://api.infersports.dev/mcp
- explain_handicap (Explain Asian Handicap) - Explain an Asian handicap line.

    Splits a quarter line into its components (e.g. -0.75 → -0.5 / -1.0) and states the
    full-win / half-win / push / half-loss / full-loss conditions. ``line`` must be a multiple
    of 0.25.
     Endpoint: https://api.infersports.dev/mcp
- list_today_matches (List Today's Matches) - List today's (UTC) fixtures — "what games are on today / right now?".

    Each fixture carries its status, live score, the live match ``clock`` (upstream minute text,
    verbatim e.g. "1h 25" / "2h 47" / "ht") when in-running, and a ready-to-read ``summary`` (live
    score & clock, or the kickoff time). Read ``clock`` for the real minute rather than estimating it
    from kickoff. ``clock`` is null pre-match.

    Args:
        sport: optional filter — "football" or "basketball".
        status: optional filter — "live", "scheduled" or "finished".
        league: optional league filter — a name (fuzzy-matched, e.g. "World Cup") or an external id ("lg_…").
        limit: max fixtures to return (1–200, default 50).
        timezone: optional IANA timezone (e.g. "America/New_York", "Asia/Shanghai") to render each
            fixture's kickoff in its ``summary`` as local time; default UTC.
     Endpoint: https://api.infersports.dev/mcp
- list_events (List Events (day or date range)) - List the fixtures for a calendar day — or a bounded [date, date_to] range.

    Unlike list_today_matches (today + anything still live), this is a strict window for whatever
    ``date`` you ask for. Pass ``date_to`` (inclusive, max 31 days after ``date``) to cover a whole
    tournament window in ONE call — "all group-stage matches June 11–28" needs no per-day loop. UTC
    is canonical: pass an IANA ``timezone`` and the day boundaries are computed in that zone (so
    "June 12 in Shanghai" excludes a match that is still June 11 / already June 13 locally); each
    fixture keeps its UTC ``scheduled_at`` and adds ``scheduled_at_local``. Capped to ``limit``
    (``truncated`` flags overflow) — narrow with sport/status/league rather than paging.

    Args:
        date: REQUIRED calendar day "YYYY-MM-DD" (e.g. "2026-06-12") — the window start.
        date_to: optional inclusive end day "YYYY-MM-DD" (max 31 days after ``date``); omit for a
            single day.
        timezone: optional IANA timezone (e.g. "Asia/Shanghai", "America/New_York") for the day
            boundary; default is the UTC day.
        sport: optional filter — "football" or "basketball".
        status: optional filter — "scheduled", "live" or "finished".
        league: optional league filter — a name (fuzzy-matched, e.g. "World Cup") or an external id ("lg_…").
        limit: max fixtures to return (1–200, default 50).
     Endpoint: https://api.infersports.dev/mcp
- match_info (Match Info) - Get the basics for a match in ONE call: the score, whether it's live, when it kicks off, and who's favored.

    No betting knowledge needed — this answers "who's winning?", "what's the score?", "what time does
    Brazil play (in my timezone)?", "who's the favorite?". Returns the live score + match clock, the
    status, the kickoff time (in ``timezone`` if you pass an IANA name like "America/New_York"), the
    favored team with a plain win probability (de-vigged from the 1x2 line), and a ready-to-read
    ``summary`` you can quote directly.

    Args:
        query: natural-language fixture or team, e.g. "Brazil vs Argentina" or just "Brazil".
        timezone: optional IANA timezone (e.g. "America/New_York", "Asia/Shanghai") for the kickoff
            time; default UTC.
        sport: optional filter — "football" or "basketball".
        date: optional UTC date "YYYY-MM-DD" to disambiguate same-name fixtures.

    On an ambiguous query, ``status`` is "ambiguous" and ``ask_user`` carries a prompt — do not guess.
    ``favorite`` is best-effort (null when no 1x2 is on file for the fixture).
     Endpoint: https://api.infersports.dev/mcp
- list_bookmakers (List Bookmakers) - List the bookmakers available on your tier.

    Returns the curated catalogue (each with ``key``, ``name`` and ``class`` = "sharp" | "asian")
    plus a ``note`` on tier coverage. Free tier excludes the sharp book (Pinnacle). Use the returned
    ``key`` values in the ``bookmakers`` filter of get_match_odds / compare_lines.
     Endpoint: https://api.infersports.dev/mcp
- get_opening_line (Get Opening Line) - Get the opening odds (初盘) for a fixture, paired with the current price, in ONE call.

    Resolves the fixture, then for each book returns its **true opening** (first-seen) quote alongside
    the current quote — so you can read movement directly. For 1x2 that's a price move; for totals/AH
    compare ``line`` (the opening line) vs ``current_line`` to read the line move (the sharp book often
    opens days earlier). A market with no opening yet on file is omitted.

    Args:
        query: natural-language fixture, e.g. "Real Madrid vs Barcelona" or a single team.
        markets: optional filter — any of "1x2", "asian_handicap", "totals".
        bookmakers: optional filter — bookmaker keys, e.g. ["pinnacle", "crown"].
        period: optional — "full_time" or "half_time" (default: both).
        format: odds format — decimal | hk | malay | american | indonesian | probability.
        sport: optional filter — "football" or "basketball".
        date: optional UTC date "YYYY-MM-DD" to disambiguate same-name fixtures.

    On an ambiguous query, ``status`` is "ambiguous" and ``ask_user`` carries a disambiguation
    prompt — do not assume a match. Best-effort: a book/line with no opening on file is omitted.
     Endpoint: https://api.infersports.dev/mcp
- find_value (Find Value Bets) - Find +EV value bets in a fixture — where a book's price beats the sharp fair line — in ONE call.

    Resolves the fixture, de-vigs the sharp book (Pinnacle) at each line to get the fair price, then
    flags every outcome whose best available price across books exceeds that fair price. DETECTION
    ONLY: this surfaces the edge and which book holds it; it does NOT size stakes or link out to bet.

    Args:
        query: natural-language fixture, e.g. "Netherlands vs Algeria" or a single team.
        markets: optional filter — any of "1x2", "asian_handicap", "totals" (default: all).
        period: optional — "full_time" or "half_time" (default: both).
        min_edge_pct: only report outcomes beating fair by at least this % (default 1.0).
        format: odds format — decimal | hk | malay | american | indonesian | probability.
        sport: optional filter — "football" or "basketball".
        date: optional UTC date "YYYY-MM-DD" to disambiguate same-name fixtures.

    On an ambiguous query, ``status`` is "ambiguous" and ``ask_user`` carries a prompt — do not
    guess. Needs the sharp book to de-vig; on the Free tier ``note`` flags that fair is approximate.
     Endpoint: https://api.infersports.dev/mcp
- compare_prob (Compare External Probability) - Judge an external probability (e.g. a Polymarket/Kalshi price) against our sharp fair line — ONE call.

    Resolves the fixture, de-vigs the sharp book to a fair probability (power de-vig for 3-way 1x2),
    and reports the edge ``fair_prob − external_prob`` in percentage points, the ROI, and a verdict
    (good / marginal / no_edge). DETECTION ONLY: InferSports never ingests prediction-market data,
    sizes a stake, or picks — it gives you the sharp reference and the gap; the call is yours.

    Args:
        query: natural-language fixture, e.g. "France vs Argentina" or a single team.
        external_prob: the external implied probability for ``outcome``, in (0,1). Pre-net it for the
            venue's fee/spread (e.g. a Polymarket YES ask of 0.55 → 0.55).
        market_type: "1x2" (default; the prediction-market-comparable moneyline), "asian_handicap"
            (only ±0.5 maps cleanly to a binary), or "totals".
        period: "full_time" (default) or "half_time".
        outcome: which leg the probability is for — home/draw/away (1x2), home/away (AH), over/under.
        external_label: optional source label echoed back, e.g. "polymarket" | "kalshi".
        sport: optional filter — "football" or "basketball".
        date: optional UTC date "YYYY-MM-DD" to disambiguate same-name fixtures.

    Read ``caveats`` before acting: a 1x2 fair is regulation 90-min (a prediction market that includes
    extra time / "to advance" is a different market); quarter/integer AH carries push mass. On an
    ambiguous query ``status`` is "ambiguous" — do not guess. ``status`` is "no_line" when no sharp
    fair is available to judge against.
     Endpoint: https://api.infersports.dev/mcp
- score_prob (Score Probabilities (market-implied)) - Market-implied correct-score probabilities for ONE football match — ONE call.

    Inverts the de-vigged 1x2 (power de-vig) + totals prices into a bivariate-Poisson
    (Dixon-Coles) score grid and returns the top-K scorelines with probabilities, the
    fitted goal rates (lambda_home/lambda_away), and how much probability mass the list
    covers. The asian-handicap fair price is held out of the fit and reported as
    ``ah_ev_check`` (≈0 means the three markets are internally consistent). This is the
    market's own distribution, never an InferSports prediction. Football only, one match
    per call.

    Args:
        query: natural-language fixture, e.g. "Mexico vs South Africa" or a single team.
        sport: optional filter; only "football" is supported by this tool.
        date: optional UTC date "YYYY-MM-DD" to disambiguate same-name fixtures.
        top: how many scorelines to return (default 5, max 10).
     Endpoint: https://api.infersports.dev/mcp
- find_arbitrage (Find Arbitrage) - Find cross-book arbitrage in a fixture — a guaranteed-profit price split — in ONE call.

    Resolves the fixture, then for each market/line takes the best price per outcome across books;
    when the inverse prices sum to < 1 there is a locked margin regardless of result. Reports the
    margin % and which book holds each leg (legs must come from ≥2 distinct books). DETECTION ONLY:
    no stake sizing, no bet links — InferSports is read-only.

    Args:
        query: natural-language fixture, e.g. "Netherlands vs Algeria" or a single team.
        markets: optional filter — any of "1x2", "asian_handicap", "totals" (default: all).
        period: optional — "full_time" or "half_time" (default: both).
        min_margin_pct: only report opportunities with at least this guaranteed margin (default 0).
        format: odds format — decimal | hk | malay | american | indonesian | probability.
        sport: optional filter — "football" or "basketball".
        date: optional UTC date "YYYY-MM-DD" to disambiguate same-name fixtures.

    On an ambiguous query, ``status`` is "ambiguous" and ``ask_user`` carries a prompt — do not guess.
     Endpoint: https://api.infersports.dev/mcp
- scan_slate (Scan Slate) - Scan today's whole slate in ONE call — each fixture with honest status + value/arb signal.

    The batch alternative to looping find_match → get_sharp_line per match. Returns every fixture in
    the filter with its status (finished is excluded from "live"), live score/clock, and a
    pre-computed value/arb signal; value/arb matches are sorted to the top and the list is truncated
    to ``limit`` (so truncation drops the quiet ones). Line movement is NOT included (that needs the
    opening lookup) — drill into a single fixture with get_opening_line. DETECTION ONLY / read-only.

    Args:
        sport: optional filter — "football" or "basketball".
        status: optional filter — "live" | "scheduled" | "finished".
        league: optional league filter — a name (fuzzy-matched, e.g. "World Cup") or an external id (lg_…).
        markets: optional — limit the value/arb scan to "1x2"/"asian_handicap"/"totals" (default all).
        period: optional — "full_time" or "half_time" (default both).
        min_edge_pct: value threshold for the per-match signal (default 1.0).
        min_margin_pct: arbitrage threshold for the per-match signal (default 0.0).
        only_signal: if true, return only fixtures that have a value or arb signal.
        format: odds format — decimal | hk | malay | american | indonesian | probability.
        limit: max entries to return, signal-first (default 20, max 100).
     Endpoint: https://api.infersports.dev/mcp
- list_results (List Results) - Look back at finished-match scores from the 30-day results cache, most-recent-first.

    Results-only: each entry is the final score, red cards and finished time (no odds). Unlike the
    live tools, these survive a restart — use it for "what was the score of X?" or "yesterday's
    results".

    Args:
        date: optional UTC kickoff date "YYYY-MM-DD" — the day the match was played.
        team: optional case-insensitive substring matched against either team name.
        league: optional case-insensitive substring matched against the league name.
        limit: max results to return, most-recent-first (1–200, default 50).
     Endpoint: https://api.infersports.dev/mcp
- get_result (Get Result) - Get the cached final result for ONE finished match by event id.

    Returns the final score, red cards and finished time. ``status`` is "found" or "not_found" (the
    match isn't in the 30-day cache). Results-only — no odds.

    Args:
        event_id: event id (e.g. "evt_…") from find_match / list_results.
     Endpoint: https://api.infersports.dev/mcp

## Resources
Not captured

## Prompts
Not captured

## Metadata
- Owner: dev.infersports
- Version: 1.0.0
- Runtime: Streamable Http
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Jun 6, 2026
- Source: https://registry.modelcontextprotocol.io
