vybsly_odds
Get live betting odds from top bookmakers for NBA, NFL, MLB, NHL, UFC, and MMA. Filter by team or fighter for targeted analysis.
Instructions
Live sports betting odds from multiple bookmakers (FanDuel, DraftKings, BetMGM). Useful for sports analysis.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sport | No | nba, nfl, mlb, nhl, ufc, mma | |
| team | No | Filter by team or fighter name |
Implementation Reference
- index.js:138-148 (schema)Tool definition/schema for 'vybsly_odds' — defines name, description, and inputSchema with optional 'sport' and 'team' properties.
{ name: 'vybsly_odds', description: 'Live sports betting odds from multiple bookmakers (FanDuel, DraftKings, BetMGM). Useful for sports analysis.', inputSchema: { type: 'object', properties: { sport: { type: 'string', description: 'nba, nfl, mlb, nhl, ufc, mma' }, team: { type: 'string', description: 'Filter by team or fighter name' } } } }, - index.js:479-485 (handler)Handler for 'vybsly_odds' — builds params from args.sport and args.team, then calls vybslyCall('/odds', params).
case 'vybsly_odds': { const params = {}; if (args.sport) params.sport = args.sport; if (args.team) params.team = args.team; result = await vybslyCall('/odds', params); break; } - index.js:21-32 (helper)vybslyCall helper function — makes authenticated HTTP GET requests to the Vybsly API with query params and returns JSON.
async function vybslyCall(path, params = {}) { const qs = new URLSearchParams(params).toString(); const url = `${VYBSLY_BASE}${path}${qs ? '?' + qs : ''}`; const headers = { 'Accept': 'application/json' }; if (API_KEY) headers['X-API-Key'] = API_KEY; const res = await fetch(url, { headers }); if (!res.ok) { const text = await res.text(); throw new Error(`Vybsly API ${res.status}: ${text.slice(0, 300)}`); } return res.json(); } - index.js:417-417 (registration)Tool registration via ListToolsRequestSchema handler — returns the TOOLS array (which includes 'vybsly_odds' at index).
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS })); - index.js:428-502 (handler)Main CallToolRequestSchema handler — switch-case dispatches to tool handlers including 'vybsly_odds' case at line 479.
server.setRequestHandler(CallToolRequestSchema, async (req) => { const { name, arguments: args } = req.params; try { let result; switch (name) { case 'vybsly_search': result = await vybslyCall('/search', { q: args.query, limit: args.limit || 10, ...(args.mode && { mode: args.mode }), ...(args.strict && { strict: 'true' }), ...(args.research && { research: 'true' }), ...(args.news && { news: 'true' }), ...(args.educational && { educational: 'true' }), ...(args.source && { source: args.source }), ...(args.lang && { lang: args.lang }), ...(args.strict_fallback && { strict_fallback: args.strict_fallback }) }); break; case 'vybsly_knowledge': result = await vybslyCall('/knowledge', { q: args.query, limit: args.limit || 10, ...(args.strict && { strict: 'true' }), ...(args.research && { research: 'true' }) }); break; case 'vybsly_extract': result = await vybslyCall('/extract', { url: args.url, ...(args.format && { format: args.format }) }); break; case 'vybsly_ask': { const res = await fetch(`${VYBSLY_BASE}/ask`, { method: 'POST', headers: { 'Content-Type': 'application/json', ...(API_KEY && { 'X-API-Key': API_KEY }) }, body: JSON.stringify({ question: args.question, max_sources: args.max_sources || 5 }) }); result = await res.json(); break; } case 'vybsly_stocks': result = await vybslyCall('/stocks', { symbols: args.symbols }); break; case 'vybsly_crypto': result = await vybslyCall('/crypto', { symbol: args.symbol }); break; case 'vybsly_weather': result = await vybslyCall('/weather', { city: args.city }); break; case 'vybsly_news': result = await vybslyCall('/news', { q: args.query, hours: args.hours || 24 }); break; case 'vybsly_odds': { const params = {}; if (args.sport) params.sport = args.sport; if (args.team) params.team = args.team; result = await vybslyCall('/odds', params); break; } case 'vybsly_geocode': result = await vybslyCall('/geocode', { q: args.address }); break; case 'vybsly_directions': result = await vybslyCall('/directions', { from: args.from, to: args.to }); break; default: throw new Error(`Unknown tool: ${name}`); } return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] }; } catch (e) { return { content: [{ type: 'text', text: `Error calling ${name}: ${e.message}` }], isError: true }; } });