Skip to content

Lumify Sports Intelligence

by lumify.ai · remote · no sign-in to list tools · v1.0.1 · published by ai.lumify

Schedules, scores, odds, splits & explainable AI bet confidence — 8+ sports, free instant key.

Changes · 2

28 tools: 2 change things and 26 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http sports-intelligence https://lumify.ai/mcp --header 'Authorization: <your-authorization>'

Findings

Matches of fixed checks, with the text they matched.

1 info
  • The description is 2,611 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...t live trading odds. Not wagering advice. Attribution is always Graded by Lumify."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

28 tools

Changes things 2Claude Code: ask
  • estimate_costEstimate the credit cost of one or more planned tool calls before making them — no credits are spent.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Estimate the credit cost of one or more planned tool calls before making them — no credits are spent. Costs are data-dependent (e.g. odds/intelligence/splits not yet ingested for an event are free, and batch_get_events ids that don't exist cost nothing), so this returns a [min_credits, max_credits] range per call rather than a single number. Pass the exact tool name and arguments you're considering, e.g. {"tool": "get_event", "arguments": {"event_id": 123, "include_odds": true}}.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • grade_slipGrade settleable player-prop legs (over / under / push / in_progress / dnp / no_stat) for nfl, nba, ncaaf, ncaab, nhl, mlb, and soccer — the same sport coverage as get_player_props…1 finding

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Info

      The description is 2,611 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...t live trading odds. Not wagering advice. Attribution is always Graded by Lumify."

      What this check looks for
    Description, as the server wrote it
    Grade settleable player-prop legs (over / under / push / in_progress / dnp / no_stat) for nfl, nba, ncaaf, ncaab, nhl, mlb, and soccer — the same sport coverage as get_player_props — plus structured game markets (h2h / spreads / totals) on any sport get_odds already settles. Prefer structured event_id + market_key + side; player_id and line are required on props, line is required on spreads/totals, and both player_id and line are omitted on h2h. team_total requires team_id + line + over/under and is only gradable on nfl/ncaaf/mlb/soccer. draw is only gradable on soccer h2h — off soccer it comes back unmapped. Free-text game phrases (Chiefs -3.5, Over 47.5 vs Bills, Yankees ML, Yankees to win, Yankees over 4.5 runs, Over 52.5 Syracuse vs Pittsburgh, Novak Djokovic ML) grade when the team or player and event resolve uniquely — Over 47.5 alone stays unmapped and is never the first slate game. A tennis moneyline leftover is a player, not a team; vs is the opponent player. Last-name-only tennis stays unmapped. A last-name-only player prop (Bergeron over 1.5 shots on goal last night) grades when a date is present and that surname is unique in scope — a named sport, team, or event narrows it (Johnson nhl last night); with no such clue, uniqueness is across every prop sport the key can see. No date, or a surname shared by more than one player in that scope, stays unmapped unless a date is present and exactly one of those candidates played in the window (optionally vs a named opponent). A colliding team nickname plus a date promotes only the unique in-window club; a football-sized line will not pick a baseball club. anytime goal / anytime assist (soccer_goals/soccer_assists over 0.5) and over a hit / over a homer (hits/home_runs over 1.0) need no explicit number. Free-text player props are graded only when player and event resolve uniquely — never guesses an ambiguous name. A roster-team mention (CIN, Niners) is resolved first; unique team_id scopes the player, and ambiguous/not_found stays on team_resolve. vs/at on a player prop is the opponent and narrows the event, not the player's team. Ambiguous events stay on event_resolve with candidates. Read legs[].result / current / market for the grade; use resolve.player_id to re-issue structured props. Call this tool with an API key to grade from an agent. Capped at 3 concurrent calls per key (shared with POST /v1/grade/slip). The public /grade sheet uses the same engine without a key (20 grades / IP / day). How-to: https://lumify.ai/docs/grade. Not live trading odds. Not wagering advice. Attribution is always Graded by Lumify.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Only reads 26Claude Code: allow
  • batch_get_eventsGet multiple events by id in one call — for agents that already have a list of ids and want full detail for each without one call per event.No findings

    Why it is in this group

    • The name "batch_get_events" says "get": a word for reading.
    Description, as the server wrote it
    Get multiple events by id in one call — for agents that already have a list of ids and want full detail for each without one call per event. Max 25 ids. Returns full detail for every id that exists plus a not_found list for any that don't (never billed). Use get_event for a single id, or list_events / query_events to discover ids first.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_eventGet a single event with participants and venue.No findings

    Why it is in this group

    • The name "get_event" says "get": a word for reading.
    Description, as the server wrote it
    Get a single event with participants and venue. Optionally inline current odds and/or bet intelligence (same 1 credit as the event call). Raises a not-found error if event_id doesn't exist. Use list_events / query_events to discover ids first, or batch_get_events to fetch several ids in one call.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_injuriesBeta.No findings

    Why it is in this group

    • The name "get_injuries" says "get": a word for reading.
    Description, as the server wrote it
    Beta. Get late-breaking player injury and availability status for an event (out / doubtful / questionable / probable / day_to_day / ir / suspended / available), with previous_status, body_part, note, source_url, and severity (info / material / critical). Beta coverage: NFL and MLB (more sports rolling out). NFL monitoring starts ~4.5 days before kickoff (Wednesday/Thursday practice reports); MLB stays on a 48-hour window. Returns available:false with no charge until the injury monitor has written a first structured report. Checks run on cadence, on a significant main-market odds move, and at a guaranteed pre-kickoff checkpoint. Subscribe to webhook event_type=injury for material/critical changes. No in-game feed. Use exclude_status to drop noisy long-standing designations (e.g. ir) from the response — does not affect available or credit cost.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_intelligenceGet predictive bet intelligence for an event: vig-stripped probability, fair_price, Price overlay, main-line ev (Beta), and forecasts[] — forecasted wagers from the model (same obj…No findings

    Why it is in this group

    • The name "get_intelligence" says "get": a word for reading.
    Description, as the server wrote it
    Get predictive bet intelligence for an event: vig-stripped probability, fair_price, Price overlay, main-line ev (Beta), and forecasts[] — forecasted wagers from the model (same objects as list_forecasts): player props plus high-confidence main-line picks on tennis, NFL, NCAAF, MLB, and soccer. bets[] is live for MLB, tennis, soccer (MLS + big-five), NFL, and NCAAF. forecasts[] covers MLB, NFL, NCAAF, NBA, NCAAB, NHL, tennis, and soccer and can populate when available is false. Fair-price + line-shopping on bets[] today (edge/tier null; has_recommend false). bookmaker is ignored. Match-level tokens (OVER, UNDER, ML_DRAW) have null player/team attribution. Free only when available is false and forecasts is empty. Field catalog: https://lumify.ai/docs/reference#event-intelligence

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_live_scoreGet a lightweight live score snapshot for an event: status, period, clock, per-participant score and period-by-period scores, and last-updated time.No findings

    Why it is in this group

    • The name "get_live_score" says "get": a word for reading.
    Description, as the server wrote it
    Get a lightweight live score snapshot for an event: status, period, clock, per-participant score and period-by-period scores, and last-updated time. Cheaper and faster than get_event when you only need the score, not participants or venue. Capped at 20 calls/min per key (shared with GET /v1/events/{id}/score and list_events include_scores=true). For live updates prefer the SSE stream. Raises a not-found error if event_id doesn't exist.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_oddsGet current betting odds for an event: per-bookmaker lines and last-updated time.No findings

    Why it is in this group

    • The name "get_odds" says "get": a word for reading.
    Description, as the server wrote it
    Get current betting odds for an event: per-bookmaker lines and last-updated time. Includes in-play quotes while the event is underway; books that have not quoted since kickoff are omitted. bookmaker defaults to pinnacle. Use 'all' or a comma-separated list for multiple books — still 1 credit. Default is main lines (is_main=true); set include_alts for alternate spread/total rungs. Final events include result (won/lost/push/void) graded from the pre-kickoff close. MLB, tennis, and soccer (MLS + big-five) mains also include fair_price and consensus mirrored from published assessments. Returns available:false with no charge if odds aren't posted for this event yet. If bookmaker is omitted and Pinnacle hasn't posted a line yet (common for the first/last games of a preseason slate), falls back to the best-covered other book and adds requested_bookmaker='pinnacle' plus fallback_bookmaker to the response instead of reporting no odds; an explicit bookmaker='pinnacle' never falls back. Use get_odds_history for line movement over time.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_odds_historyGet line-movement history for an event: a list of past odds snapshots (movements), each with its own timestamp, up to limit entries.No findings

    Why it is in this group

    • The name "get_odds_history" says "get": a word for reading.
    Description, as the server wrote it
    Get line-movement history for an event: a list of past odds snapshots (movements), each with its own timestamp, up to limit entries. bookmaker defaults to pinnacle. Use get_odds instead if you only need the current line.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_period_oddsGet first-half / first-five / first-set lines and live progress for an NFL, NCAAF, NBA, NCAAB, MLB, soccer, or tennis event.No findings

    Why it is in this group

    • The name "get_period_odds" says "get": a word for reading.
    Description, as the server wrote it
    Get first-half / first-five / first-set lines and live progress for an NFL, NCAAF, NBA, NCAAB, MLB, soccer, or tennis event. Joins persisted first_half_spreads / first_half_totals mains to this-event period scores (1H = Q1+Q2, NCAAB or soccer native 1H; MLB F5 = innings 1–5; tennis S1 = first-set games) and grades the period, not the full game. GET /odds / get_odds stay on moneyline/spread/total. Returns available:false with no charge if no period mains have been ingested. Other sports return HTTP 400.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_playerGet a single player identity profile: name, sport, country, position/handedness, physical stats, current team, rankings (tennis {singles, points}; null on every other sport), and i…No findings

    Why it is in this group

    • The name "get_player" says "get": a word for reading.
    Description, as the server wrote it
    Get a single player identity profile: name, sport, country, position/handedness, physical stats, current team, rankings (tennis {singles, points}; null on every other sport), and image_url (Lumify media URL, null until the sport's headshot/enrichment job). Raises a not-found error if player_id doesn't exist. Resolve ids via search_players.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_player_eventsList a player's events (schedule/results), paginated by id (after_id).No findings

    Why it is in this group

    • The name "get_player_events" says "get": a word for reading.
    Description, as the server wrote it
    List a player's events (schedule/results), paginated by id (after_id). Defaults to ±30 days around today when no date filter is given. Resolve player_id via search_players first.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_player_propsGet player-prop lines and live progress for an NFL, NCAAF, NBA, NCAAB, NHL, MLB, or soccer event.No findings

    Why it is in this group

    • The name "get_player_props" says "get": a word for reading.
    Description, as the server wrote it
    Get player-prop lines and live progress for an NFL, NCAAF, NBA, NCAAB, NHL, MLB, or soccer event. Joins persisted player-prop mains to this-event player box counts and grades over/under/push (1:1 slugs, combo sums including rush+rec and pass+rush yards, weighted total bases, anytime TD, double-double/triple-double, hockey points). Sport × market catalog: https://lumify.ai/docs/player-props. GET /odds / get_odds stay on moneyline/spread/total. Returns available:false with no charge if no prop mains have been ingested. Other sports return HTTP 400.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_splitsGet public betting splits (bets% and handle%) for an event: a consensus split plus a per-bookmaker breakdown (bookmakers[].bookmaker uses the same odds slugs as get_odds, e.g.No findings

    Why it is in this group

    • The name "get_splits" says "get": a word for reading.
    Description, as the server wrote it
    Get public betting splits (bets% and handle%) for an event: a consensus split plus a per-bookmaker breakdown (bookmakers[].bookmaker uses the same odds slugs as get_odds, e.g. draftkings — not upstream short keys like dk), with a captured_at timestamp. Available for MLB, NBA, NHL, NFL, NCAAF, and NCAAB. Not available for tennis or soccer (upstream 400). Returns available:false with no charge if splits haven't been captured for this event yet or the sport is unsupported.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_statsGet raw, deterministic team/match statistics for a soccer, MLB, tennis, NFL, NCAAF, NBA, NCAAB, or NHL event — no odds (use get_odds) and no scoring (use get_intelligence).No findings

    Why it is in this group

    • The name "get_stats" says "get": a word for reading.
    Description, as the server wrote it
    Get raw, deterministic team/match statistics for a soccer, MLB, tennis, NFL, NCAAF, NBA, NCAAB, or NHL event — no odds (use get_odds) and no scoring (use get_intelligence). Payload is sport-specific: teams.home/away except tennis (players.player_1/player_2). Tennis doubles/qualifying return available:false. Form/record/H2H exclude walkovers and NFL/NCAAF/NBA/NCAAB preseason. Other sports return HTTP 400. Field catalog: https://lumify.ai/docs/reference#event-stats

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_teamGet a single team profile with its home venue.No findings

    Why it is in this group

    • The name "get_team" says "get": a word for reading.
    Description, as the server wrote it
    Get a single team profile with its home venue. Raises a not-found error if team_id doesn't exist. Resolve ids via list_teams.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • get_team_propsGet team-total lines and live progress for an NFL, NCAAF, MLB, or soccer event.No findings

    Why it is in this group

    • The name "get_team_props" says "get": a word for reading.
    Description, as the server wrote it
    Get team-total lines and live progress for an NFL, NCAAF, MLB, or soccer event. Joins persisted Pinnacle team-total mains (each team's full-game points/runs/goals Over/Under) to this-event participant scores and grades over/under/push. GET /odds / get_odds stay on moneyline/spread/total. Returns available:false with no charge if no team-total mains have been ingested. Other sports return HTTP 400.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_evBeta.No findings

    Why it is in this group

    • The name "list_ev" says "list": a word for reading.
    Description, as the server wrote it
    Beta. List pregame main-line +EV opportunities for a predictive-framework sport (soccer, mlb, tennis, nfl, ncaaf), sorted by ev_pct descending. market=h2h (default, moneyline), spreads, or totals. Tennis totals are not offered (Stage 1 is moneyline + spreads). Same gates as bets[].ev on get_intelligence: sharp-fair price gap, positive and ≤25%, suppressed MLB moneyline null books skipped in favor of the next eligible book. 1 credit. Field catalog: https://lumify.ai/docs/reference#intelligence-ev

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_eventsList events (schedules and live scores), paginated by id (after_id).No findings

    Why it is in this group

    • The name "list_events" says "list": a word for reading.
    Description, as the server wrote it
    List events (schedules and live scores), paginated by id (after_id). Filter by sport, league, status, date range, season, or team_id (resolve teams via list_teams / get_team). Returns event id, name, sport/league, start time, status, and venue for each; pass include_scores to also inline participants + scores (intended for small result sets — use get_event for one event's full detail, or query_events for free-text/natural-language filters instead of structured params). include_scores shares the 20/min score-poll budget with get_live_score; prefer the SSE stream for live boards.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_forecastsDaily board of forecasted wagers from Lumify's model — a prediction, not a beat-the-market claim (no OOS/independence gate; see list_ev for the gated main-line +EV claim).No findings

    Why it is in this group

    • The name "list_forecasts" says "list": a word for reading.
    Description, as the server wrote it
    Daily board of forecasted wagers from Lumify's model — a prediction, not a beat-the-market claim (no OOS/independence gate; see list_ev for the gated main-line +EV claim). Player props (rate model) on MLB, NCAAF, NFL, NBA, NCAAB, NHL. High-confidence main-line picks on tennis, NFL, NCAAF, MLB, and soccer: one side per moneyline / spread / total when the uncertainty band does not include a coin flip. Tennis moneyline is ranking Bradley-Terry; tennis spreads/totals are a Normal-approx games model. Other sports use the published assessment probability. Each wager has p_hit, conviction, and posted books prices. Use list_ev to scan main lines by sharp-fair price gap; use this tool to scan high-probability forecasts. reliability is emerging on v0. 1 credit; empty slate is still 200. How + field catalog: https://lumify.ai/docs/forecasts Worked wager: https://lumify.ai/docs/understanding-odds#forecasts

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_seasonsList seasons per sport/league.No findings

    Why it is in this group

    • The name "list_seasons" says "list": a word for reading.
    Description, as the server wrote it
    List seasons per sport/league. By default returns only currently active seasons; pass current_only=false to include historical seasons. Optionally filter by sport. Returns each season's id, year, phase, start/end dates, and whether it is_current. Use list_sports for just each sport's current season.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_sportsList supported sports with their leagues and current season.No findings

    Why it is in this group

    • The name "list_sports" says "list": a word for reading.
    Description, as the server wrote it
    List supported sports with their leagues and current season. Returns each sport's id, slug, name, team-sport flag, and its leagues (each with its current_season). Use list_seasons with current_only=false for historical seasons.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_teamsList teams, paginated by id (after_id).No findings

    Why it is in this group

    • The name "list_teams" says "list": a word for reading.
    Description, as the server wrote it
    List teams, paginated by id (after_id). Filter by sport, league, conference, division, country, active status, or name (q, partial match). Returns each team's id, slug, name, city, conference/division, venue, and image_url (Lumify media URL, null until ingest). Use get_team for full detail on one id once resolved here.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • query_eventsSearch events with a natural-language query instead of structured filters — e.g.No findings

    Why it is in this group

    • The name "query_events" says "query": a word for reading.
    Description, as the server wrote it
    Search events with a natural-language query instead of structured filters — e.g. 'live nfl games today' or 'college basketball this week'. Rule-based (not an LLM): recognizes sport (nfl/nba/mlb/nhl/tennis/soccer/ncaaf/ncaab + aliases like hockey, american football, college basketball), status (live/final/upcoming/…), dates (today/tomorrow, this week, next N days, YYYY-MM-DD ranges). Bare 'football' is ambiguous and left unrecognized. Response includes interpreted filters, equivalent REST call, and unrecognized_terms. Prefer list_events when you already know the structured filters you want.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • resolve_eventResolve event identity from an event_id, or a player_id/team_id clue plus an optional date window, to a Lumify event_id.No findings

    Why it is in this group

    • The name "resolve_event" says "resolve": a word for reading.
    Description, as the server wrote it
    Resolve event identity from an event_id, or a player_id/team_id clue plus an optional date window, to a Lumify event_id. Falls back to a player's roster team schedule for team sports (only individual sports like tennis track per-player game participation directly). Combine team_id + opponent_team_id for a specific matchup. Returns ambiguous instead of guessing when the window has more than one candidate — never auto-pick candidates[0].

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • resolve_playerResolve messy sports player names to a Lumify player_id using sport, team, or event clues.No findings

    Why it is in this group

    • The name "resolve_player" says "resolve": a word for reading.
    Description, as the server wrote it
    Resolve messy sports player names to a Lumify player_id using sport, team, or event clues. Prefer this before grade_slip when the name is a fragment, initial, or nickname. Returns ambiguous instead of guessing — never auto-pick candidates[0]. A sport-scoped key binds the in-scope side of a collision and returns not_found when every hit is out of scope. Does not grade props.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • resolve_teamResolve messy team names, abbreviations, metros, or aliases to a Lumify team_id using sport, league, event, or player clues.No findings

    Why it is in this group

    • The name "resolve_team" says "resolve": a word for reading.
    Description, as the server wrote it
    Resolve messy team names, abbreviations, metros, or aliases to a Lumify team_id using sport, league, event, or player clues. Prefer this before list_teams when the string is a nickname or city token. Returns ambiguous instead of guessing — never auto-pick candidates[0]. City-only metros sit below the auto-resolve floor.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • search_playersSearch players by name, sport, country, ranking, or active status, paginated by id (after_id).No findings

    Why it is in this group

    • The name "search_players" says "search": a word for reading.
    Description, as the server wrote it
    Search players by name, sport, country, ranking, or active status, paginated by id (after_id). Returns the same identity object on every sport (null means unknown, not wrong sport). Tennis standings nest under rankings.{singles, points}; rankings is null on every other sport. Use get_player for full detail on one id, or get_player_events for a player's schedule/results.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.0.1. Values in angle brackets are yours to fill in.

claude mcp add --transport http sports-intelligence https://lumify.ai/mcp --header 'Authorization: <your-authorization>'

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__sports-intelligence__list_sports",
      "mcp__sports-intelligence__list_events",
      "mcp__sports-intelligence__get_event",
      "mcp__sports-intelligence__batch_get_events",
      "mcp__sports-intelligence__query_events",
      "mcp__sports-intelligence__get_live_score",
      "mcp__sports-intelligence__get_odds",
      "mcp__sports-intelligence__get_odds_history",
      "mcp__sports-intelligence__get_stats",
      "mcp__sports-intelligence__get_player_props",
      "mcp__sports-intelligence__get_team_props",
      "mcp__sports-intelligence__get_period_odds",
      "mcp__sports-intelligence__get_splits",
      "mcp__sports-intelligence__get_injuries",
      "mcp__sports-intelligence__get_intelligence",
      "mcp__sports-intelligence__list_ev",
      "mcp__sports-intelligence__list_forecasts",
      "mcp__sports-intelligence__list_teams",
      "mcp__sports-intelligence__search_players",
      "mcp__sports-intelligence__get_team",
      "mcp__sports-intelligence__get_player",
      "mcp__sports-intelligence__get_player_events",
      "mcp__sports-intelligence__list_seasons",
      "mcp__sports-intelligence__resolve_player",
      "mcp__sports-intelligence__resolve_team",
      "mcp__sports-intelligence__resolve_event"
    ],
    "ask": [
      "mcp__sports-intelligence__estimate_cost",
      "mcp__sports-intelligence__grade_slip"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as sports-intelligence. Review it before you use it.