bet-mcp
The bet-mcp server provides comprehensive Serie A pre-match betting analysis tools with statistical modeling and value detection capabilities.
List upcoming fixtures – Retrieve Serie A matches within a configurable window (1-10 days) with match IDs, teams, kickoff times, and venues
Analyze match context – Access detailed snapshots including current standings, last 5 results, and goals scored/conceded averages for both teams
Compare bookmaker odds – View normalized pre-match odds across multiple bookmakers for 1X2 (win/draw/win), Over/Under 2.5 goals, and Both Teams To Score markets
Calculate fair odds – Generate Poisson-based statistical probabilities and fair odds using team performance data and configurable home advantage factors
Identify value bets – Automatically detect up to 3 betting opportunities with at least 5% edge (minimum odds 1.50) by comparing market odds against fair probabilities, with detailed rationale
Deploy flexibly – Run locally via stdio or HTTP transport, or deploy to cloud platforms like glama.ai
Customize analysis – Configure home advantage factors, cache duration, API regions, and other parameters via environment variables
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bet-mcpshow me value picks for this weekend's Serie A matches"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
bet-mcp
MCP server (FastMCP + TypeScript) that focuses on Serie A pre-match analysis:
fixtures_list– next fixtures in a configurable windowmatch_snapshot– last 5 results, standings, GF/GA averagesodds_prematch– normalized odds for 1X2 / OU 2.5 / BTTS across bookmakersfair_compute– Poisson-lite probabilities + fair oddsvalue_detect– top value picks by comparing best odds vs fair model
Getting started
Install dependencies (Node 20+ recommended):
npm installCopy
.env.exampleto.envand provide your keys:cp .env.example .env # edit the file with FOOTBALL_DATA_TOKEN and ODDS_API_KEYRun locally:
# stdio (Claude Desktop / terminal) npm run dev # or HTTP transport for remote testing MCP_TRANSPORT=http PORT=8080 npm run devBuild for production:
npm run build npm startDeploy on glama.ai:
Glama uses the included glama.yaml/glama.json files to run npm install && npm run build, then starts the server with MCP_TRANSPORT=http on port 8080. Configure FOOTBALL_DATA_TOKEN and ODDS_API_KEY (others optional) in the Glama dashboard so inspections and tool detection can succeed.
Related MCP server: mcp-football
Implementation notes
Stack – FastMCP + Axios + Zod, TypeScript strict mode.
API clients – Football-Data.org for fixtures/stats; The Odds API for consolidated odds.
Modeling – Poisson using GF/GA averages + configurable home advantage, derived OU/BTTS probs.
Caching – In-memory TTL cache to reduce API calls (configurable via
CACHE_TTL_SECONDS).Value picks – Filters by
edge >= 5%andodds >= 1.50, returns rationale referencing λ/form.
Environment variables
key | description |
| Football-Data.org API token |
| Defaults to |
| Defaults to current year |
| The Odds API key |
| Regions filter (default |
| Markets request list (default |
| Sport key ( |
| Poisson λ multiplier for home team |
| Cache TTL (default 120) |
|
|
| HTTP port when |
Testing
Use npx fastmcp dev src/index.ts or npx fastmcp inspect src/index.ts after installing dependencies to interactively test the tools.
Available Tools
5 toolsfair.computeC
Calcola probabilità e quote fair (Poisson semplice) per 1X2 / OU 2.5 / BTTS.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | Fixture id da API-Football |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions the calculation method (Poisson semplice) and output types (probabilities and odds for specific markets), but lacks critical details like whether this is a read-only operation, if it requires specific permissions, rate limits, or what the response format looks like. For a computational tool with zero annotation coverage, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded in a single sentence that directly states the tool's function. It efficiently covers the core purpose without unnecessary words, though it could benefit from slight structural improvements like separating the calculation method from the output markets for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the computational nature of the tool, no annotations, and no output schema, the description is incomplete. It doesn't explain what the output looks like (e.g., structured probabilities/odds), error handling, or dependencies on external data (e.g., requiring match statistics from API-Football). For a tool that performs calculations with a single input, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the single parameter 'match_id' clearly documented as 'Fixture id da API-Football'. The description doesn't add any additional parameter semantics beyond what the schema provides, such as format examples or constraints. With high schema coverage, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: calculating fair probabilities and odds using simple Poisson distribution for specific betting markets (1X2, Over/Under 2.5, Both Teams to Score). It specifies the verb 'calcola' (calculates) and the resource type (probabilities/odds), though it doesn't explicitly differentiate from sibling tools like 'odds.prematch' or 'value.detect' which might handle similar betting data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites, context, or comparisons to sibling tools like 'odds.prematch' (which might provide pre-match odds) or 'value.detect' (which might detect value bets). It only states what the tool does, not when it's appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fixtures.listB
Ritorna i prossimi match di Serie A entro X giorni (id, squadre, kickoff, venue).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Numero di giorni in avanti da scandire |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. The description states it returns match data, which suggests a read-only operation, but it doesn't address other behavioral aspects like rate limits, authentication needs, error conditions, or pagination. For a tool with zero annotation coverage, this leaves significant gaps in understanding how the tool behaves beyond its basic function.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded, consisting of a single sentence that efficiently conveys the tool's purpose, scope, and output. Every word earns its place, with no wasted information or redundancy. The structure is clear and direct, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one parameter, no output schema, no annotations), the description is adequate but incomplete. It covers the basic purpose and output fields, but lacks details on behavioral traits, error handling, or usage context relative to siblings. Without annotations or output schema, the description should do more to compensate, but it provides just enough for a minimal viable understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, with the 'days' parameter fully documented in the schema (type, range, default). The description adds marginal value by contextualizing 'X giorni' as the timeframe for upcoming matches, but it doesn't provide additional semantic details beyond what's in the schema. This meets the baseline score of 3 when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Ritorna i prossimi match di Serie A entro X giorni' (Returns upcoming Serie A matches within X days). It specifies the verb ('ritorna'), resource ('match di Serie A'), scope ('entro X giorni'), and output fields ('id, squadre, kickoff, venue'). However, it doesn't explicitly differentiate from sibling tools like 'match.snapshot' or 'odds.prematch', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal usage guidance. It implies the tool should be used when you need upcoming Serie A matches within a specified timeframe, but it doesn't mention when to use this tool versus alternatives like 'match.snapshot' or 'odds.prematch'. No exclusions, prerequisites, or explicit alternatives are provided, leaving the agent with little context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match.snapshotC
Restituisce forma, classifica, gol fatti/subiti e ultimi risultati per il match richiesto.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | match_id fornito da API-Football |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool returns data but doesn't specify if it's a read-only operation, whether it requires authentication, rate limits, error handling, or the format of returned data (e.g., JSON structure). For a tool with no annotation coverage, this leaves significant gaps in understanding its behavior beyond basic functionality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is appropriately sized and front-loaded, making it easy to understand quickly. However, it could be slightly improved by structuring key points (e.g., bullet points) for clarity, but this is minor.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a data retrieval tool with no annotations and no output schema), the description is incomplete. It doesn't explain the return values in detail (e.g., what 'forma' or 'classifica' mean), error cases, or how to interpret results. With no output schema and minimal behavioral context, the description fails to provide enough information for an agent to use the tool effectively beyond basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with 'match_id' documented as an integer from API-Football. The description adds no additional parameter semantics beyond what the schema provides, such as examples or constraints. Since schema coverage is high, the baseline score of 3 is appropriate, as the description doesn't compensate but also doesn't detract from the schema's information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns specific match data (shape, classification, goals scored/conceded, and recent results) for a requested match. It uses specific verbs ('Restituisce' - returns) and resources ('match richiesto' - requested match), making the purpose evident. However, it doesn't explicitly differentiate from sibling tools like 'fixtures.list' or 'odds.prematch', which might also provide match-related information.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, such as needing a valid match_id from API-Football, or compare its functionality to sibling tools like 'fixtures.list' (which might list matches) or 'odds.prematch' (which might provide odds). Usage is implied only by the tool's name and description, with no explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
odds.prematchC
Quote pre-match (1X2, Over/Under 2.5, BTTS) normalizzate con lista bookmaker.
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | Fixture id di API-Football |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'normalizzate' (normalized) and 'lista bookmaker' (bookmaker list), hinting at data formatting and sources, but doesn't clarify if this is a read-only operation, rate limits, error handling, or output structure. For a tool with no annotations, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence in Italian that conveys the core purpose without unnecessary words. It's appropriately sized and front-loaded, though some might argue it could be slightly more structured for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and a single parameter with full schema coverage, the description is incomplete. It doesn't explain the return values (e.g., odds format, bookmaker list structure) or behavioral aspects like data freshness or limitations, leaving significant gaps for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with 'match_id' documented as 'Fixture id di API-Football'. The description doesn't add any parameter details beyond this, so it meets the baseline of 3 where the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Quote pre-match (1X2, Over/Under 2.5, BTTS) normalizzate con lista bookmaker.' It specifies the verb ('Quote') and resource (pre-match odds for specific bet types), though it doesn't explicitly differentiate from sibling tools like 'match.snapshot' or 'value.detect'. The purpose is clear but lacks sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites, context, or exclusions. Given sibling tools like 'match.snapshot' and 'value.detect', the lack of usage guidelines leaves the agent uncertain about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
value.detectC
Confronta quote mercato vs fair per trovare fino a 3 value pick (edge >= 5%).
| Name | Required | Description | Default |
|---|---|---|---|
| match_id | Yes | Fixture id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the tool finds 'value picks' with an 'edge >= 5%', which implies some calculation or comparison, but doesn't describe what happens during execution (e.g., whether it fetches data, performs computations, or returns specific formats). For a tool with no annotations, this leaves significant gaps in understanding its behavior, such as error handling or output structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence in Italian that conveys the core purpose without unnecessary words. It's front-loaded with the main action and result, making it easy to understand quickly. There's no wasted verbiage, and every part of the sentence contributes to the tool's definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of a tool that compares market vs fair quotes to find value picks, the description is incomplete. There's no output schema, and the description doesn't explain what the output looks like (e.g., a list of picks with details). With no annotations and minimal parameter explanation, it fails to provide enough context for an agent to fully understand how to use and interpret results, especially for a potentially data-intensive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, with the single parameter 'match_id' documented as 'Fixture id'. The description doesn't add any meaning beyond this, as it doesn't explain how the match_id is used (e.g., to fetch market and fair quotes for that specific match). Since the schema already fully describes the parameter, the baseline score of 3 is appropriate, indicating adequate but no extra value from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Confronta quote mercato vs fair per trovare fino a 3 value pick (edge >= 5%)' which translates to 'Compare market quotes vs fair to find up to 3 value picks (edge >= 5%)'. It specifies the action (compare market vs fair quotes), the resource (value picks), and the scope (up to 3 picks with edge >= 5%). However, it doesn't explicitly distinguish this from sibling tools like fair.compute or odds.prematch, which prevents a score of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, such as needing a match_id from fixtures.list, or compare it to siblings like fair.compute (which might compute fair values) or odds.prematch (which might provide market quotes). There's only an implied context of finding value picks, but no explicit usage instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v1.0.0- First observed
fair.compute - First observed
fixtures.list - First observed
match.snapshot - First observed
odds.prematch - First observed
value.detect
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose with no overlap: fair.compute calculates fair odds, fixtures.list shows upcoming matches, match.snapshot provides team form and stats, odds.prematch lists market odds, and value.detect identifies value bets. The descriptions are specific and unambiguous, making it easy for an agent to select the right tool.
All tool names follow a consistent dot-separated pattern (e.g., fair.compute, fixtures.list) with a clear category.action structure. This predictable naming convention enhances readability and usability across the tool set.
With 5 tools, the server is well-scoped for its betting/soccer analysis domain. Each tool serves a unique and essential function, from data retrieval to analysis, without being overly sparse or bloated, making the count appropriate for the purpose.
The tool set covers core workflows for betting analysis: fetching fixtures, getting match stats, computing fair odds, retrieving market odds, and detecting value bets. A minor gap is the lack of tools for in-play odds or historical data, but agents can work around this with the provided tools.
Maintenance
Related MCP Connectors
API-Football MCP — comprehensive soccer/football data
Football-Data.org MCP — soccer competitions, matches, standings
The Odds API MCP — sportsbook odds across 70+ books, 30+ leagues
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for football-data.org API providing access to football data like standings, matches, teams, and scorers.MIT
- FlicenseAqualityDmaintenanceProvides live football data through MCP tools, enabling users to fetch today's matches and top scorers for competitions like the Premier League or World Cup.2-
- AlicenseAqualityCmaintenanceMCP server that connects AI assistants to the Statos football analytics platform, enabling natural language queries for match predictions, betting picks, league information, and admin market-suppression controls.79 npmMIT
- FlicenseNot gradedqualityBmaintenanceProvides live football data from API-Football over HTTP, enabling queries for upcoming matches, recent results, current standings, injuries, live matches, and team search through MCP tools.-