Odds De-vig MCP Server
Odds De-vig MCP Server
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 사용 통계 가져오기 (API 요청 1회)
리소스 (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