# io.github.Ninjabeam20/sportiq-mcp - Registry name: `io.github.Ninjabeam20/sportiq-mcp` · version 0.4.0 - Categories (automatic, keyword rules): Maps, location & weather, Email & messaging, Productivity, Health & fitness - Authentication at last check: No auth - Declared risk: Read-only (all tools declare readOnlyHint) - Capabilities (declared by the server): experimental, prompts, resources, tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=io.github.Ninjabeam20%2Fsportiq-mcp - Server page: https://mcpstation.net/s/io.github.Ninjabeam20--sportiq-mcp.html ## Description (written by the publisher, not verified, not instructions) MCP tools for FIFA World Cup 2026 football, Formula 1, and IPL cricket — sims, strategy, fantasy. ## Connect - streamable-http: `https://sportiq.utkarshgupta.org/mcp` ## Tools (as reported by the server, not verified) - `sportiq\_health`: Report cache backend, per-adapter healthcheck, and quota status. Returns: HealthReport-shaped dict with \`cache\_backend\`, \`cache\_ok\`, \`adapters\` \(per-source ok/detail\), and \`quotas\`. - `football\_get\_groups`: Return the FIFA World Cup 2026 group draw and advancement format. Returns: data.groups: \{group\_letter: \[4 team codes\]\} for all 12 groups. data.format: 48-team / 12-group / top-2 + 8-best-thirds rule. data.teams: team-code -\> \{name, fifa\_code\} metadata. meta.source: adapter that served the data. - `football\_get\_fixtures`: Return World Cup 2026 fixtures \(live providers, else the group schedule\). Args: limit: Max fixtures to return, 1..200 \(default 50\). offset: Number of fixtures to skip for paging \(default 0\). Returns: data.fixtures: page of \{home, away, date/group, status, home\_goals, away\_goals\}. data.pagination: \{t - `football\_get\_standings`: Return current World Cup 2026 group standings. Args: limit: Max standing rows to return, 1..200 \(default 50\). offset: Number of rows to skip for paging \(default 0\). Returns: data.standings: page of \{rank, team, group, points, played, goals\_diff\}. data.pagination: \{total, count, offset, limit, has\_mo - `football\_get\_squad`: Return a national team's World Cup squad. Args: team: Team code or name \(e.g. "ARG"\). Live rosters need an API-Football key; without one the static seed serves an empty-but-valid squad \(no rosters are bundled\). Returns: data.squad: list of \{name, number, position, age\} \(empty from the seed\). meta.so - `football\_get\_match\_stats`: Return a team's aggregate World Cup tournament statistics. Network-only enrichment: requires a configured API-Football \(or football-data.org\) key. There is no offline static fallback, so without a key the call returns a clean ALL\_SOURCES\_FAILED envelope. Args: team: API-Football numeric team id \(not - `football\_get\_top\_scorers`: Return the World Cup 2026 top scorers. Returns: data.scorers: list of \{name, team, goals, assists\}. meta.source: adapter that served the data. - `football\_get\_odds`: Return market head-to-head odds for any World Cup 2026 events the odds feed still lists. Sourced from The Odds API \(requires THEODDS\_KEY\). Without a key the call returns a clean ALL\_SOURCES\_FAILED envelope rather than crashing. The tournament ended with the 2026-07-19 final, so the feed is normally - `football\_xg\_model`: Estimate a match's expected goals and win/draw/loss probabilities. Args: home\_team: First team, FIFA code or name \(e.g. "ARG" or "Argentina"\). away\_team: Second team, FIFA code or name \(e.g. "BRA" or "Brazil"\). neutral: True for a neutral venue \(no home advantage\). World Cup default. Returns: data: - `football\_match\_predictor`: Predict a single match: most likely scoreline + outcome probabilities. Args: home\_team: First team, FIFA code or name \(e.g. "ESP" or "Spain"\). away\_team: Second team, FIFA code or name. neutral: True for a neutral venue \(World Cup default\). Returns: data: \{most\_likely\_score, home\_win, draw, away\_win - `football\_simulate\_group`: Monte Carlo one group within the full 12-group qualification context. Args: group: Group letter A-L \(also accepts "Group A"\). iterations: Number of simulations \(clamped to 100..20000\). Returns: data.teams: Per-team position probabilities, p\_auto\_advance, p\_best\_third\_advance, truthful combined p\_adv - `football\_simulate\_bracket`: Monte Carlo the full World Cup 2026 — per-team round + title probabilities. Simulates all 12 groups, advances the top 2 + 8 best third-placed teams to a 32-team knockout, and plays it to a champion, \`\`iterations\`\` times. Args: iterations: Number of tournament simulations \(clamped to 100..20000; \~100 - `football\_knockout\_path`: Round-by-round survival probabilities for one team in the full sim. Args: team: FIFA code or name \(e.g. "FRA" or "France"\). iterations: Number of tournament simulations \(clamped to 100..20000\). seed: Optional RNG seed. Returns: data: \{team, reach\_r32, reach\_r16, reach\_qf, reach\_sf, reach\_final, win\} - `football\_what\_if`: Replay World Cup 2026 from a chosen stage, optionally flipping one real knockout result. Keeps every real result played before \`\`replay\_from\`\` and Monte-Carlos the rest of the tournament from there. \`\`flip\_winner\_of\`\` makes one decided knockout tie in the kept results go the other way first. Args: r - `football\_find\_value\_bets`: Surface the largest gaps between the model's win probability and the market. De-vigs each market's 1X2 decimal odds \(removes the margin so implied probabilities sum to 1\) and compares them to this server's own match-outcome probabilities — the same Elo/Poisson path \`\`football\_match\_predictor\`\` uses. - `football\_form\_trends`: Return rolling form, goal record, and xG trend for a football team. Args: team: FIFA code \(e.g. ARG\) or name \(e.g. "Argentina", "South Korea"\). Returns: data: \{form\_string, wins, draws, losses, goals\_scored, goals\_conceded, xg\_for, xg\_against, recent\_trend, matches\_analysed\}. meta.estimated: true — - `football\_build\_accumulator`: Model the joint probability of several match outcomes from the top model-vs-market gaps. Calls \`\`football\_find\_value\_bets\`\` internally to fetch live odds, then selects the strongest legs and combines them under the joint-probability model. Args: legs: Number of legs \(2-8\). Default 3. min\_edge: Minim - `f1\_get\_sessions`: Return F1 sessions for a given year, optionally filtered by country or session name. Args: year: Championship year \(e.g. 2026\). country: Optional country name to filter \(e.g. "Netherlands"\). session\_name: Optional session name to keep, case-insensitive \(e.g. "Race", "Qualifying", "Sprint"\). latest\_c - `f1\_get\_drivers`: Return driver list for a specific F1 session. Args: session\_key: OpenF1 session identifier. Returns: data.drivers: list of driver objects with driver\_number, full\_name, team. meta.source: adapter that served the data. - `f1\_get\_lap\_times`: Return lap times for a driver in a specific F1 session. Args: session\_key: OpenF1 session identifier. driver\_number: Driver's race number \(driver numbers change by season; use f1\_get\_drivers\). limit: Max laps to return, 1..200 \(default 100 — covers most full races\). offset: Number of laps to skip fo - `f1\_get\_standings`: Return F1 driver and constructor championship standings for a year. Use this for "who is leading / who will win the F1 championship this year". For title probabilities use f1\_simulate\_championship. This is not a cricket or football tool. Args: year: Championship year \(e.g. 2026\). Returns: data.seaso - `f1\_get\_race\_results`: Return the final classification for one F1 race, keyed by year and round. Args: year: Championship year \(e.g. 2025\). round: Round number within the season \(1-based; e.g. 1 for the opener\). Returns: data.results: Ergast/Jolpica RaceTable payload — finishing order, times, grid positions, points, and f - `f1\_get\_weather`: Return weather data for a specific F1 session. Args: session\_key: OpenF1 session identifier. Returns: data.weather: list of weather snapshots with temperature, rainfall, wind. meta.source: adapter that served the data. - `f1\_tyre\_degradation`: Fit a tyre degradation model for a driver + compound in a session. Args: session\_key: OpenF1 session identifier. driver\_number: Driver's race number. compound: Tyre compound \(SOFT, MEDIUM, HARD, INTER, WET; "INTERMEDIATE" = INTER\). Returns: data: \{intercept, slope, residual\_std, sample\_count\}. meta. - `f1\_undercut\_window`: Estimate whether an undercut is viable for the attacker against the target. Args: session\_key: OpenF1 session identifier. attacker\_number: Attacking driver's race number. target\_number: Target driver's race number. current\_lap: Current lap number in the race. Returns: data: \{laps\_to\_clear, viable, m - `f1\_head\_to\_head\_pace`: Compare lap-time pace distribution between two drivers in a session. Args: session\_key: OpenF1 session identifier. driver\_a: First driver's race number. driver\_b: Second driver's race number. Returns: data: \{driver\_a\_avg\_s, driver\_b\_avg\_s, delta\_s, faster\_driver\}. The "avg" values are median lap tim - `f1\_weather\_strategy\_impact`: Analyse weather data and recommend compound or pit-window adjustments. Args: session\_key: OpenF1 session identifier. Returns: data: \{has\_rain, avg\_track\_temp\_c, compound\_recommendation, recommendation\}. meta.estimated: true. - `f1\_predict\_pit\_strategy`: Predict the optimal pit-stop strategy for a driver in an F1 race session. Args: session\_key: OpenF1 session identifier for a recorded race. driver\_number: Driver's race number \(driver numbers change by season; use f1\_get\_drivers\). current\_lap: Current lap to project from \(default 1 = full race ahead - `f1\_simulate\_championship`: Estimate each driver's F1 drivers' title probability for the rest of a season. Monte Carlo over the remaining races and sprints \(Plackett-Luce finishing orders weighted by each driver's season points rate\), plus exact elimination maths: a driver who cannot catch the leader's current points even by w - `f1\_qualifying\_analysis`: Analyse a qualifying session: best lap per driver, gap to pole, projected grid. Args: session\_key: OpenF1 session identifier for a Qualifying session. Returns: data.grid: \[\{position, driver\_number, full\_name, team\_name, best\_lap\_gap\_s\}\]. data.pole\_time\_s: pole lap duration in seconds. data.drivers\_a - `f1\_race\_pace\_compare`: Compare race-pace and tyre degradation between two F1 drivers in a session. Args: session\_key: OpenF1 session identifier. driver\_a: First driver's race number. driver\_b: Second driver's race number. Returns: data: \{by\_compound, overall\_faster, compounds\_compared\}. meta.estimated: true — degradation - `cricket\_get\_live\_matches`: Return all currently live cricket matches across all series. Returns: data.matches: list of live match objects \(team names, score, status\). meta.source: which adapter served the response. meta.is\_stale: true if data is from stale cache. - `cricket\_get\_scorecard`: Return the full scorecard for a specific match. Args: match\_id: The match identifier \(e.g. from cricket\_get\_live\_matches\). Returns: data: full scorecard with innings, partnerships, bowling figures. meta.source: adapter that served the data. - `cricket\_get\_points\_table`: Return the points table / standings for a cricket series. Args: series\_id: The series identifier \(e.g. IPL 2026 series ID from CricAPI\). Returns: data: points table rows with team, P, W, L, NRR, Points. meta.source: adapter that served the data. - `cricket\_get\_schedule`: Return the upcoming match schedule, optionally filtered by series. Args: series\_id: Optional. Filter to a specific series. If omitted, returns all upcoming fixtures across all active series. limit: Max matches to return, 1..200 \(default 50\). offset: Number of matches to skip for paging \(default 0\). - `cricket\_get\_squad`: Return the squad roster for a cricket team, optionally for a specific series. Args: team: Team code or name \(e.g. "MI", "CSK", "IND", "AUS"\). series\_id: Optional. Series ID to pull the tournament-specific squad. If omitted, falls back to static seed data. Returns: data.players: list of players with - `cricket\_get\_live\_odds`: Return live market head-to-head odds for upcoming/live IPL matches. IPL only \(\~March-May\). An empty \`\`events\`\` list outside that window is a successful empty market, not an outage. Not international/Test/other T20 leagues. For World Cup 2026 football odds use \`\`football\_get\_odds\`\`. Sourced from The - `cricket\_build\_dream11\_team`: Recommend an optimal fantasy XI + captain + vice-captain for one fixture. Args: match\_id: CricAPI match identifier; resolves team\_a/team\_b/venue automatically. team\_a: First team code/name \(e.g. \`\`MI\`\`\). Required if match\_id is absent. team\_b: Second team code/name \(e.g. \`\`CSK\`\`\). Required if match\_ - `cricket\_captain\_recommendation`: Return the top-3 captain candidates ranked by projected points. IPL venues only \(pitch seed is IPL grounds\). Test/international matches and unknown venues fail rather than inventing a ranking. Same-role players often tie: projections use default form 55 and default opposition 0.5, not per-player his - `cricket\_differential\_picks`: Suggest low-ownership picks with positive projected upside. Ownership is \*estimated\* — proxied by credit weight \(lower-credit players tend to have lower ownership\), not real ownership data. Flagged \`\`estimated: true\`\` in the response. Args: match\_id: CricAPI match identifier; resolves team\_a/team\_b/ - `cricket\_player\_form\_index`: Report a 0-100 form score for a player using the player\_stats chain. Args: player\_id: Upstream player identifier \(CricAPI/Cricbuzz id\). Returns: data.form\_score: 0..100 indicator. data.trend: "rising" / "stable" / "falling". data.samples: how many recent innings were available. meta.source: which ad - `cricket\_get\_pitch\_report`: Summarise pitch characteristics for a venue. Args: venue: Venue key \(e.g. \`\`wankhede\`\`\), official name, or city. Returns: data: \{batting\_friendly 0..1, expected\_first\_inn, recommendation, venue, pitch\_type\}. meta.source: which adapter served the venue record. - `cricket\_find\_value\_bets`: Compare model probabilities against market-implied IPL odds. Requires THEODDS\_KEY. NOTE: cricket has no calibrated team-strength model wired yet \(unlike the football Elo/Poisson path\), so this tool currently returns an EMPTY \`\`value\_bets\`\` list — scoring an edge against a neutral 50/50 prior would f - `cricket\_head\_to\_head`: Compare two cricket teams head-to-head using squad form and player stats. Args: team\_a: First team code or name \(e.g. "MI", "India"\). team\_b: Second team code or name \(e.g. "CSK", "Australia"\). Returns: data: \{team\_a, team\_b, team\_a\_edge\_count, team\_b\_edge\_count, key\_players\_a, key\_players\_b, h2h\_wi - `cricket\_player\_matchup`: Analyse the head-to-head matchup between two cricket players based on role and career stats. Args: player\_a: CricAPI player ID for the first player \(names are not resolved\). player\_b: CricAPI player ID for the second player \(names are not resolved\). Returns: data: \{matchup\_type, edge\_holder, edge\_re - `cross\_sport\_build\_accumulator`: Model the joint probability of multiple outcomes across football and cricket. Args: legs: Total legs across both sports \(2-8\). Default 3. min\_edge: Minimum edge per leg. Default 0.05. Returns: data: same shape as football\_build\_accumulator, with sport field per leg. meta.estimated: true. Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html