Odds De-vig MCP Server
Odds De-vig MCP 服务器
用于从 The Odds API 获取体育赔率并去除博彩公司水钱(vig)的 MCP 服务器。
✅ 最新改进(v1.1.0)
API 使用跟踪:所有响应现在都包含剩余 API 调用次数
重试逻辑:连接问题时自动重试(3 次尝试)
更好的错误处理:改进的网络错误处理
响应格式:带有 summary 和 apiUsage 的结构化响应
Related MCP server: propzapi
功能
工具(Tools)
get_sports - 获取支持的体育项目列表(无需 API 请求)
get_today_mlb - 获取今日 MLB 比赛及处理后的赔率(节省请求)
get_upcoming_odds - 获取原始赔率(默认:今日 MLB 比赛)
get_processed_odds - 获取去除水钱后的处理赔率
get_event_consensus - 获取特定事件的共识盘口
get_api_usage - 获取 API 使用统计(消耗 1 次 API 请求)
资源(Resources)
odds://sports- 支持的体育项目列表(无需 API 请求)odds://today-mlb- 今日 MLB 比赛及处理后的赔率odds://processed- 去除水钱后的处理赔率(默认:今日 MLB)
去除水钱的方法
1. Proportional(比例法)- 默认
最简单且常用的方法:
fair_probability = implied_probability / total_implied_probability2. Power(幂法/Shin)
更复杂的方法,考虑结果数量:
fair_probability = implied_probability^n / total_implied_probability^(n-1)3. Additive(加法法)
将水钱均匀分配到所有结果中:
fair_probability = implied_probability - (total_vig / number_of_outcomes)安装与运行
# Установка зависимостей
npm install
# Сборка
npm run build
# Запуск
npm start
# Разработка
npm run dev配置
设置环境变量 ODDS_API_KEY 或使用默认密钥:
export ODDS_API_KEY=your_api_key_here⚠️ API 限制
重要: The Odds API 免费计划每月限制 500 次请求!
节省请求的优化措施:
默认仅请求今日 MLB 比赛
get_sports返回硬编码列表,无需 API 请求get_today_mlb是获取数据最节省的方式所有请求都会记录 API 使用情况
建议:
使用
get_today_mlb进行测试测试时每天限制 20 次请求
通过
get_api_usage监控使用情况
使用方法
获取体育项目列表(无需 API 请求)
{
"tool": "get_sports"
}获取今日 MLB 比赛(节省请求)
{
"tool": "get_today_mlb",
"arguments": {
"deVigMethod": "proportional"
}
}获取处理后的赔率
{
"tool": "get_processed_odds",
"arguments": {
"sport": "americanfootball_nfl",
"deVigMethod": "proportional",
"removeOutliers": true,
"minBookmakers": 3
}
}获取共识盘口
{
"tool": "get_event_consensus",
"arguments": {
"eventId": "event_id_from_api",
"deVigMethod": "power"
}
}数据结构
ProcessedEvent
interface ProcessedEvent {
id: string;
sportKey: string;
sportTitle: string;
commenceTime: string;
homeTeam: string;
awayTeam: string;
bookmakers: ProcessedBookmaker[];
consensusLine?: {
homeTeamFairOdds: number;
awayTeamFairOdds: number;
averageVig: number;
};
}ProcessedOutcome
interface ProcessedOutcome {
name: string;
americanOdds: number;
decimalOdds: number;
impliedProbability: number;
fairProbability: number; // После удаления маржи
}API 限制
关键: 每月 500 次请求限制!
当前优化:
专注于 MLB(每天都有比赛)
仅请求今日比赛
硬编码体育项目列表
记录每次请求
监控:
{
"tool": "get_api_usage"
}返回:
{
"requestsUsed": "15",
"requestsRemaining": "485",
"monthlyLimit": 500,
"eventsFound": 12
}后续计划
Polymarket CLOB API 服务器 - 用于从 Polymarket 获取数据
比较服务器 - 用于比较盘口并寻找套利机会
新闻/SERP 服务器 - 用于获取新闻和上下文
Available Tools
6 toolsget_api_usageA
Get current API usage statistics (makes 1 API call)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but it only adds the operational detail that it makes one API call. It does not explain whether the operation is read-only, what exact statistics are returned, or any authentication/rate-limit implications, or missing for a fully transparent description.
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: a single sentence states the operation, and the parenthetical cost note ('makes 1 API call') is meaningful, and no words are wasted.
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?
This is a simple, no-argument tool with clear purpose, but there is no output schema and no description of the return shape or exact use of 'usage statistics' (e.g., remaining quota, used calls, reset time). The one API call warning provides some context, but the description remains slightly skeletal.
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 tool has 0 parameters and 100% schema coverage, so there is no parameter documentation gap. Baseline for 0 params is 4; the description adds no param-related value because none is needed.
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 uses a specific verb ('Get') with a clear resource ('API usage statistics'), clearly distinguishing it from sibling sports data tools like get_sports and get_upcoming_odds.
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?
It is obvious that this tool is for checking API usage, and the sibling tools are unrelated to usage statistics. However, the description does not provide explicit when-to-use guidance or mention any context/alternates/exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_event_consensusA
Get consensus line for a specific event
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | Event ID from The Odds API | |
| deVigMethod | No | Method for removing vig (default: proportional) | proportional |
| minBookmakers | No | Minimum number of bookmakers for consensus (default: 3) | |
| removeOutliers | No | Remove worst outlier bookmakers (default: false) |
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. It describes the tool's output (consensus line) but does not disclose specific behavioral traits such as whether it performs computations like de-vigging, how it handles missing data, or if it is read-only. It only hints at calculation through parameters like deVigMethod and removeOutliers.
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, concise sentence that clearly states the tool's purpose without unnecessary words. It is front-loaded and efficient.
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 has 4 parameters, no output schema, and no annotations, the description provides minimal context. It does not explain return value structure, error handling, or prerequisites like what constitutes a valid eventId. However, the parameter schema is well-documented, which compensates somewhat.
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?
Schema coverage is 100%, so the schema already documents all four parameters with descriptions. The tool description adds no extra meaning beyond what the schema provides. Baseline 3 is appropriate as the description does not compensate with additional insights.
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 'Get consensus line for a specific event' clearly indicates the tool retrieves consensus odds for a given event, with 'event' being the resource. It differentiates from siblings like 'get_today_mlb' and 'get_upcoming_odds' by focusing on consensus for a specific event rather than listings or raw odds, though it doesn't explicitly name alternatives.
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 implies usage when an event ID is known and consensus data is needed, but does not explicitly state when to use it over siblings or when not to use it. Siblings like 'get_upcoming_odds' suggest alternatives for odds data, but no direct comparison is made.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_processed_oddsB
Get odds with vig removed and fair probabilities calculated
| Name | Required | Description | Default |
|---|---|---|---|
| sport | No | Sport key (default: baseball_mlb) | baseball_mlb |
| markets | No | Markets to get odds for (default: h2h) | h2h |
| regions | No | Regions to get odds for (default: us) | us |
| deVigMethod | No | Method for removing vig (default: proportional) | proportional |
| minBookmakers | No | Minimum number of bookmakers for consensus (default: 3) | |
| commenceTimeTo | No | ISO datetime for latest commence time (default: tomorrow) | |
| removeOutliers | No | Remove worst outlier bookmakers (default: false) | |
| commenceTimeFrom | No | ISO datetime for earliest commence time (default: today) |
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. It discloses the key behavioral aspect (vig removal and probability calculation) which goes beyond a simple fetch. However, it does not mention rate limits, authentication, or output shape, and for an 8-param tool with no output schema, this is a moderate gap but not contradicting.
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?
A single, information-dense sentence that front-loads the core value proposition. Could arguably be more expensive with the parameter list, but it wastes no words.
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?
With 8 parameters, no annotations, and no output schema, the description falls short. Key contextual gaps include: what does the return object look like, how does `removeOutliers` interact with `minBookmakers`, and what are the unit/semantics of odds returned. A tool of this complexity needs more than one sentence to be self-sufficient.
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?
Schema description coverage is 100%—every parameter has a description plus defaults. Per the rubric, high coverage sets baseline at 3. The description itself adds no extra parameter context beyond what the schema already provides, so it cannot score above baseline.
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?
Clear verb-resource pairing with a specific qualifier: 'Get odds with vig removed and fair probabilities calculated.' This distinguishes it from the raw odds tool `get_upcoming_odds` by emphasizing the processing transformation. However, it doesn't name sibling alternatives explicitly.
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 on when to use this tool vs. alternatives like `get_upcoming_odds` or `get_event_consensus`. The description implies a use case for fair/probability-adjusted odds but lacks any explicit when/when-not framing or reference to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sportsA
Get limited list of supported sports (no API call)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It explicitly states that no API call is made and the returned list is 'limited', which meaningfully informs the agent about the tool's behavior. It could mention return format, but for a simple list this is adequate.
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 concise sentence that communicates the core action, scope, and key behavioral fact. No filler or redundant text exists, making it easy for an agent to scan.
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?
For a zero-parameter static list tool, the description sufficiently covers what the tool does and its non-API nature. While no output schema is provided, the expected result is straightforward, and the sibling list offers enough situation context. Slightly more detail about the actual sports content could raise it to a 5.
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 tool has zero parameters, so there are no parameter definitions to explain. The schema fully covers the interface, and the description adds no ambiguity. Per the baseline for zero parameter tools, this scores at the baseline of 4.
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 'Get limited list of supported sports' clearly specifies the action (get), the resource (supported sports), and the scope (limited list). The parenthetical '(no API call)' further distinguishes it from sibling tools that likely fetch live 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?
The description implies usage intent through '(no API call)', suggesting it is a cheap or instant local lookup. However, it does not explicitly state when to use this tool instead of siblings or provide exclusionary guidance, so it stops at implied guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_today_mlbB
Get today's MLB games with processed odds (API efficient)
| Name | Required | Description | Default |
|---|---|---|---|
| deVigMethod | No | Method for removing vig (default: proportional) | proportional |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral transparency burden. It mentions 'processed odds' and 'API efficient' but does not disclose return structure, timezone semantics, pagination, or other behavioral details.
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, front-loaded sentence that conveys the core purpose efficiently. Every word adds value, and there is no redundant or filler content.
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?
The tool is simple with one optional parameter, and the description states the main output concept ('today's MLB games with processed odds'). However, without an output schema or usage context, the description leaves some gaps around expected response shape and when to choose this tool over siblings.
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?
Schema coverage is 100%, with the single parameter deVigMethod already described and constrained by enum values and a default. The description adds no additional parameter context beyond what the schema provides.
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 gets today's MLB games with processed odds, using a specific verb and resource. It distinguishes itself by scoping to today's MLB games, though it does not explicitly contrast with sibling tools like get_processed_odds.
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?
There is no guidance on when to use this tool versus alternatives such as get_upcoming_odds or get_processed_odds. The phrase 'API efficient' hints at a benefit but does not explain selection criteria or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upcoming_oddsB
Get upcoming odds for sports events (limited to today by default)
| Name | Required | Description | Default |
|---|---|---|---|
| sport | No | Sport key (default: baseball_mlb) | baseball_mlb |
| markets | No | Markets to get odds for (default: h2h) | h2h |
| regions | No | Regions to get odds for (default: us) | us |
| commenceTimeTo | No | ISO datetime for latest commence time (default: tomorrow) | |
| commenceTimeFrom | No | ISO datetime for earliest commence time (default: today) |
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. It does disclose the default time limit behavior, which is a useful non-obvious trait. However, it does not describe the response structure, data source, or whether odds are raw or normalized, leaving behavioral expectations incomplete for a read tool.
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, focused sentence that front-loads the action and resource, with a short parenthetical for the key default behavior. Every word contributes value, with no repetition or fluff.
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?
There is no output schema, and the description does not explain what the returned odds data looks like or how it relates to sibling tools such as get_processed_odds. The schema provides adequate parameter details, but the overall context for selecting and interpreting the result is incomplete, especially given the optional time-range parameters that could broaden the default 'today' scope.
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 covers all 5 parameters with descriptions and defaults, giving 100% schema description coverage, so the baseline is 3. The description adds little beyond the schema, merely restating the time-window behavior in prose rather than enriching any specific parameter.
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 uses a specific action ('Get') and resource ('upcoming odds for sports events'), making the core purpose obvious. It doesn't explicitly differentiate from siblings like get_processed_odds or get_today_mlb, but the 'upcoming' and generic sports scope imply a distinct function.
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 phrase 'limited to today by default' provides some contextual usage guidance, and the schema defaults reinforce the intended time window. However, there is no explicit guidance about when to prefer this tool over alternatives such as get_processed_odds or get_event_consensus, so the usage guidance remains mostly implicit.
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.
6 tool updates
v1.0.0- First observed
get_api_usage - First observed
get_event_consensus - First observed
get_processed_odds - First observed
get_sports - First observed
get_today_mlb - First observed
get_upcoming_odds
TDQS
Scored across 6 tools
The tools have mostly distinct purposes: sports list, today's games, upcoming odds, processed odds, event consensus, and API usage. However, 'get_processed_odds' and 'get_event_consensus' could overlap for agents looking for the best line on an event, though descriptions clarify that processed odds gives probabilities and consensus gives a single line.
All tools follow the 'get_' prefix with a resource, which is consistent. The naming is clear and predictable, but some names like 'get_upcoming_odds' and 'get_processed_odds' are similar in structure, which is minor. No mixing of conventions.
With 6 tools, the server is well-scoped for a specialized odds processing service. Each tool serves a distinct function, and the count is within the ideal 3-15 range, providing enough coverage without being bloated.
The tool surface covers listing sports, fetching today's games, upcoming events, processed odds, consensus lines, and API usage. There are minor gaps such as no ability to fetch specific historical games or detailed event details beyond consensus, but the core workflow of getting and processing odds is complete.
Maintenance
Related MCP Connectors
Sports Game Odds MCP — wraps the Sports Game Odds API (sportsgameodds.com)
Sportsbook-derived no-vig fair value with confidence, provenance, and history over REST/MCP.
Live odds, cross-book +EV and graded player-prop results across 37 books. Hosted endpoint included.
- FairLineOAuthio.fairline
Shops MLB, NHL, EPL and NFL lines across sportsbooks with a no-vig fair probability, for members.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables fetching sportsbook odds, live scores, and event information across 70+ books and 30+ leagues, with tools to list sports, get scores, and discover events.28 npm1MIT
- AlicenseNot gradedqualityBmaintenanceProps-first sports odds API with a hosted MCP server. Live odds and player props (moneyline, spreads, totals) across US sportsbooks, normalized to JSON. Tools: get_odds, get_props, get_events, get_books. API-key auth, free tier.MIT No Attribution
- AlicenseAqualityCmaintenanceProvides AI assistants with sports model win probabilities and fair odds across nine sports without requiring an API key.360 npmMIT
- AlicenseNot gradedqualityBmaintenanceWraps the Sports Game Odds API to provide sports game odds data through natural language queries.33 npm1MIT