# dev.infersports/infersports (remote · api.infersports.dev)

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

- Trust score: 60/100 (medium)
- Change this week: +6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `api.infersports.dev`: 60/100 (this document), [markdown](https://verifymcp.io/servers/dev-infersports-infersports/api.md), [page](https://verifymcp.io/servers/dev-infersports-infersports/api)

## Channel facts

- Endpoint: `https://api.infersports.dev/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 17 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4611 tokens (~271/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 67/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http dev-infersports-infersports https://api.infersports.dev/mcp
```

### Codex

```toml
[mcp_servers.dev-infersports-infersports]
url = "https://api.infersports.dev/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "dev-infersports-infersports": {
      "type": "remote",
      "url": "https://api.infersports.dev/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add dev-infersports-infersports --url https://api.infersports.dev/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  dev-infersports-infersports:
    url: "https://api.infersports.dev/mcp"
```

### Other

```json
{
  "mcpServers": {
    "dev-infersports-infersports": {
      "type": "http",
      "url": "https://api.infersports.dev/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 60, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 59, +3)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 56, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 56, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 55, +1)

- [functional] Server version: 1.0.0+80220e1 → 1.0.0+b0243cb

### 2026-07-27 (score 54, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 54)

First indexed and scored.

## MCP tools (17)

### `get_sharp_line` (~396 tokens)

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.

Input parameters:

- `date`
- `format` (string)
- `market_type` (string)
- `period` (string)
- `query` (string, required)
- `sport`
- `verbosity` (string)

### `find_match` (~193 tokens)

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

Input parameters:

- `date`
- `query` (string, required)
- `sport`

### `get_match_odds` (~160 tokens)

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.

Input parameters:

- `bookmakers`
- `event_id` (string, required)
- `format` (string)
- `markets`
- `period`

### `compare_lines` (~225 tokens)

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

Input parameters:

- `event_id` (string, required)
- `format` (string)
- `market_type` (string)
- `period` (string)
- `verbosity` (string)

### `explain_handicap` (~86 tokens)

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.

Input parameters:

- `line` (number, required)

### `list_today_matches` (~272 tokens)

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.

Input parameters:

- `league`
- `limit` (integer)
- `sport`
- `status`
- `timezone`

### `list_events` (~411 tokens)

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

Input parameters:

- `date` (string, required)
- `date_to`
- `league`
- `limit` (integer)
- `sport`
- `status`
- `timezone`

### `match_info` (~309 tokens)

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

Input parameters:

- `date`
- `query` (string, required)
- `sport`
- `timezone`

### `list_bookmakers` (~91 tokens)

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.

### `get_opening_line` (~356 tokens)

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.

Input parameters:

- `bookmakers`
- `date`
- `format` (string)
- `markets`
- `period`
- `query` (string, required)
- `sport`

### `find_value` (~344 tokens)

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.

Input parameters:

- `date`
- `format` (string)
- `markets`
- `min_edge_pct` (number)
- `period`
- `query` (string, required)
- `sport`

### `compare_prob` (~496 tokens)

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.

Input parameters:

- `date`
- `external_label`
- `external_prob` (number, required)
- `market_type` (string)
- `outcome` (string)
- `period` (string)
- `query` (string, required)
- `sport`

### `score_prob` (~256 tokens)

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

Input parameters:

- `date`
- `query` (string, required)
- `sport`
- `top` (integer)

### `find_arbitrage` (~325 tokens)

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.

Input parameters:

- `date`
- `format` (string)
- `markets`
- `min_margin_pct` (number)
- `period`
- `query` (string, required)
- `sport`

### `scan_slate` (~419 tokens)

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

Input parameters:

- `format` (string)
- `league`
- `limit` (integer)
- `markets`
- `min_edge_pct` (number)
- `min_margin_pct` (number)
- `only_signal` (boolean)
- `period`
- `sport`
- `status`

### `list_results` (~174 tokens)

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

Input parameters:

- `date`
- `league`
- `limit` (integer)
- `team`

### `get_result` (~98 tokens)

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.

Input parameters:

- `event_id` (string, required)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/dev-infersports-infersports/api#diagnostics

## Score history

- 2026-08-03: 60
- 2026-08-02: 60
- 2026-08-01: 59
- 2026-07-31: 59
- 2026-07-30: 56
- 2026-07-29: 56
- 2026-07-28: 55
- 2026-07-27: 54
- 2026-07-26: 54

## Links

- Remote endpoint: https://api.infersports.dev/mcp
- Website: https://infersports.dev/
- Changelog RSS feed: https://verifymcp.io/servers/dev-infersports-infersports/api/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/dev-infersports-infersports/api/changelog.json
- HTML version of this page: https://verifymcp.io/servers/dev-infersports-infersports/api
