Sports Probabilities MCP

Probabilidades de playoffs, título y descenso por Monte Carlo para la NFL, MLB, NHL, NBA y 17 ligas de fútbol, más la ventaja del modelo frente al mercado contra los precios en vivo de Kalshi.

Documentación

Sports Probabilities MCP - NFL, MLB, NHL, NBA & Soccer Odds (commodus67/sports-probabilities-mcp) Actor

Monte Carlo win, playoff and title probabilities for NFL, MLB, NHL, NBA and soccer, plus model-vs-market edge vs live Kalshi prices. Ask in plain language from Claude, ChatGPT or Cursor. No API key.

Pricing

from $50.00 / 1,000 probability reads

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes. In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours, and optionally produces a well-defined JSON output, datasets with results, or files in key-value store. In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects. You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the API section below.

Each client library has reference documentation the quickstart does not restate: JavaScript/TypeScript (npm install apify-client) and Python (pip install apify-client).

README

Sports Probabilities MCP — NFL, MLB, NHL, NBA & Soccer Odds for AI Agents

Ask your AI assistant what a team's odds actually are, and get a number that came from a simulation rather than a guess.

This is a Model Context Protocol (MCP) server. Connect it to Claude, ChatGPT, Cursor or any other MCP client and you can ask, in plain language:

  • "What are the Chiefs' playoff odds right now?"
  • "Rank the Premier League by title probability, not by points."
  • "Which NBA teams are most likely to end up in the play-in?"
  • "Where does your model disagree most with Kalshi on NFL playoff qualifiers?"
  • "Re-run the NFL model trusting current records more and show me who moves."

Behind it sit five published Monte Carlo Actors that replay every remaining game on the real schedule, tens of thousands of times. This server is the conversational front door to them, so the numbers you get here are the same numbers those Actors produce — there is no second, divergent model hiding in here.

No API key for any sports data provider. No scraping on your side. Just standings, schedules and probabilities.

What it covers

SportTeamsProbabilities
NFLall 32playoffs, division, wild card, No. 1 seed
MLBall 30postseason, division, wild card, top seed
NHLall 32playoffs, division, wild card, conference top seed, Presidents' Trophy
NBAall 30playoffs, play-in, top six, division, best record, conference finals, conference title, championship
Soccer17 leaguestitle, top four, continental qualification, playoff, relegation

Soccer leagues: Premier League, EFL Championship, LaLiga, Serie A, Bundesliga, Ligue 1, Eredivisie, Primeira Liga, Süper Lig, Belgian Pro League, Scottish Premiership, Brasileirão, Liga MX, Liga Profesional (Argentina), Primera A (Colombia), MLS, Austrian Bundesliga. Any other ESPN soccer slug works too.

Tools

ToolWhat it answers
get_team_probabilitiesOne team: every probability, current record, projected finish, and where it ranks.
get_league_probabilitiesThe whole league ordered by probability instead of by points or record.
compare_model_vs_marketWhere the model disagrees with live Kalshi prices, with net edge after fees and a quarter-Kelly stake.
run_scenarioA fresh simulation under your own model assumptions, showing who moves and by how much.
get_probability_historyHow a team's probability moved across the season, from an archived run history.

Model vs market

compare_model_vs_market pulls live contract prices from Kalshi's public API — KXNFLPLAYOFF for the NFL and KXMLBPLAYOFFS for MLB, KXNHLPLAYOFF for the NHL and KXNBAPLAYOFF for the NBA — and for every team reports:

  • the model probability and the market's implied probability, and the gap between them;

  • which side of the contract is better value, YES or NO;

  • the fee, using Kalshi's taker schedule (a parabola in the contract price, largest at 50 cents);

  • expected value per contract net of that fee, and the break-even probability;

  • a quarter-Kelly stake, clipped by a per-position ceiling and then by a portfolio ceiling, so the suggested positions actually fit inside one bankroll.

    For the NHL and NBA, value calls and stakes stay switched off until teams have played ten games, exactly as in the underlying Actors. Before that the model is mostly last season carried forward, and the biggest gaps it finds are the offseason moves it cannot see. Edges are still reported in full.

For soccer, or to compare against a bookmaker instead of an exchange, pass your own prices in marketProbabilities and the same arithmetic runs on those.

This is research output, not betting advice. Probabilities are estimates from a model, market prices move, and nothing here knows anything about your circumstances.

Connecting it

Add the Actor's Standby URL to your MCP client, with an Apify API token as a bearer token:

{
  "mcpServers": {
    "sports-probabilities": {
      "url": "https://commodus67--sports-probabilities-mcp.apify.actor/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_API_TOKEN"
      }
    }
  }
}

The transport is Streamable HTTP and the server is stateless, so any instance can answer any request.

Running it as an ordinary Actor

Starting it as a normal run — not in Standby — answers one question and writes it to the dataset. It is a quick way to check a build, and it is useful on a schedule:

{ "sport": "nfl", "limit": 40 }
{ "sport": "soccer", "league": "Premier League", "metric": "relegation" }
{ "sport": "nba", "metric": "playIn" }

How fresh the numbers are

Simulations are cached for a few hours and shared across every instance of the server, because probabilities barely move between games. Every answer carries a source block telling you when the model actually ran, how many simulations it used, and whether the answer came from cache. A run_scenario call always runs a fresh simulation.

FAQ

What is a sports probabilities MCP server?

An MCP (Model Context Protocol) server gives an AI assistant tools it can call. This one lets the assistant ask five Monte Carlo simulators for playoff, title, wild card, play-in and relegation probabilities, instead of making numbers up. Every answer comes with a source block that says when the simulation ran and how many seasons it replayed.

Which sports and leagues does it cover?

NFL (32 teams), MLB (30), NHL (32), NBA (30) and 17 soccer leagues, including the Premier League, LaLiga, Serie A, Bundesliga, Ligue 1, MLS, Liga MX and the Brasileirão. Any other ESPN soccer league slug can be passed too.

Which AI clients can use it?

Any MCP client that supports remote servers over Streamable HTTP, such as Claude, ChatGPT and Cursor. In Claude you can add it as a custom connector with the URL https://commodus67--sports-probabilities-mcp.apify.actor/mcp; the server advertises OAuth, so you sign in with your Apify account instead of pasting a token.

Do I need an API key?

You need an Apify account. Clients that support OAuth sign in with it; other clients send an Apify API token as a bearer token, as shown in Connecting it. No ESPN or Kalshi keys are needed.

How much does it cost?

It is pay per event, charged per tool call: a probability read (get_team_probabilities, get_league_probabilities) and a history read cost $0.05, a model-vs-market comparison $0.10, and a what-if simulation $0.25. See the Pricing tab for the current table.

Where do the numbers come from?

From the same published Actors that sell these probabilities on their own — the NFL, MLB, NHL, NBA and soccer Monte Carlo simulators. The server calls them and caches the result; it does not run a second model, so an answer here matches what the Actor itself returns.

Can it compare the model with Kalshi prices?

Yes. compare_model_vs_market pulls live Kalshi contracts for the NFL, MLB, NHL and NBA and returns the gap, expected value after the taker fee and a quarter-Kelly stake. For soccer, or to compare with a bookmaker, pass your own prices in marketProbabilities.

How fresh are the probabilities?

Simulations are cached for a few hours, because probabilities barely move between games. The source block tells you the age of the answer and whether it came from cache; run_scenario always runs a fresh simulation.

Is this betting advice?

No. It is research output from a statistical model.

Keywords

sports probabilities API, NFL playoff odds, MLB playoff odds, soccer title odds, Monte Carlo simulation, prediction markets, Kalshi, model vs market edge, Kelly criterion, MCP server, AI agent tools, sports analytics, betting odds research, relegation odds, wild card odds, NHL playoff odds, NBA playoff odds, NBA play-in odds.

Actor input Schema

sport (type: string):

Which model to ask. NFL, MLB, NHL and NBA cover every team in the league; soccer covers 17 competitions, chosen with the league field below.

team (type: string):

Leave empty to get the whole league ranked by probability. Put a team name, city or abbreviation here to get just that team, for example Chiefs, KC or Arsenal.

league (type: string):

Soccer only, ignored for every other sport. A league name or an ESPN slug: Premier League or eng.1, LaLiga or esp.1, Serie A, Bundesliga, Ligue 1, Liga MX, Brasileirao, MLS, and more.

metric (type: string):

Which probability orders the table. NFL and MLB: playoff, division, wildCard, topSeed. NHL: the same plus bestRecord (Presidents Trophy). NBA: playoff, playIn, topSix, division, bestRecord, conferenceFinals, conference, title. Soccer: title, top4, qualify, playoff, relegation.

season (type: integer):

NFL, MLB, NHL and NBA only. Leave empty for the current season, or set a past year to project that season from where it stood, which is useful for backtesting. NHL and NBA seasons are named by the year they end, so 2027 means 2026-27.

limit (type: integer):

How many teams come back when no single team is named.

holdSeconds (type: integer):

Advanced, and only for an ordinary run. Leave at 0 for a normal smoke test. Set it to something like 120 and the run keeps its web server alive for that long, so you can POST the MCP endpoint on the run's live view URL and check the protocol before connecting a client to Standby.

Actor input object example

{
  "sport": "nfl",
  "league": "eng.1",
  "limit": 40,
  "holdSeconds": 0
}

Actor output Schema

probabilities (type: string):

One row per team from the current Monte Carlo run, with the probabilities, the current record and the projected finish.

API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

JavaScript example

import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("commodus67/sports-probabilities-mcp").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

Python example

from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("commodus67/sports-probabilities-mcp").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

CLI example

echo '{}' |
apify call commodus67/sports-probabilities-mcp --silent --output-dataset

MCP server setup

{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,commodus67/sports-probabilities-mcp"
        }
    }
}

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an Authorization: Bearer <APIFY_API_TOKEN> header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ApH4kzaZfAR5j80o4/builds/rzoxZbV8SFjWBXCAe/openapi.json