BetSlip Doctor
REMOTE · API.BETSLIPDOCTOR.AI
Your agent grades every slip A+ to F-, links your books and tracks your record. No wager placement.
Available components
Last scanned (8 hours ago)
Scores higher than 97% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Entertainment and Games
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability73
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 13789 tokens (~148/item across 93 items; 92 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management94
- Stability check failed: schema churn in the 30 days we've observed: 1 tool removals, 2 breaking changes, 0 auth/transport breaks, 58 additions. See how to fix → Fail
Tool Coverage76
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 15% of tool parameters carry a description.Partial
- Structured output schemas are declared (11% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 94 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities73
- Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
- Supports UI / widget rendering.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 0
- Tool “get_grade_report” rewrote its description, which is the text the model reads security
- Tool “grade_settings” rewrote its description, which is the text the model reads security
- Tool “grade_slip” rewrote its description, which is the text the model reads security
- Tool “show_saved_grade” rewrote its description, which is the text the model reads security
- 3 Nov 26 0
- Tool “get_league_order” rewrote its description, which is the text the model reads security
- 1 Nov 26 0
- Resource “bsd-customer-cards” now points somewhere else: ui://bsd/customer-cards-v3.html → ui://bsd/customer-cards-v4.html security
- The server rewrote its instructions, which are the text every model session reads security
- New tool “doctor_actions”, which the server declares destructive security
- New tool “tail_social”, which the server declares destructive security
- Tool “add_doctor_parlay_to_slip” rewrote its description, which is the text the model reads security
- Tool “copy_tail_slip” rewrote its description, which is the text the model reads security
- Tool “get_grade_report” rewrote its description, which is the text the model reads security
- Tool “get_league_order” rewrote its description, which is the text the model reads security
- Tool “get_todays_board” rewrote its description, which is the text the model reads security
- Tool “list_grade_jobs” rewrote its description, which is the text the model reads security
- Tool “price_shop_slip” rewrote its description, which is the text the model reads security
- Tool “search_markets” rewrote its description, which is the text the model reads security
- Tool “show_saved_grade” rewrote its description, which is the text the model reads security
- Tool “tail_post” rewrote its description, which is the text the model reads security
- Tool “tail_read” rewrote its description, which is the text the model reads security
- Tool “price_shop_slip” no longer declares itself destructive security
- Schema quality: 121 → 146 ▼ functional
- “price_shop_slip” added a required parameter “ticketId”, so existing callers break ▼ functional
- “price_shop_slip” dropped the required parameter “legs” ▼ functional
- Server version: 1.3.0 → 1.6.0 functional
- New tool “account_settings” functional
- New tool “check_slip” functional
- New tool “get_player_research” functional
- New tool “history_actions” functional
- New tool “look_up_fact” functional
- New tool “notifications” functional
- New tool “read_pasted_slip” functional
- New tool “save_tail_post” functional
- New tool “ticket_actions” functional
- “get_history_summary” added an optional parameter “id” cosmetic
- “get_history_summary” added an optional parameter “params” cosmetic
- “get_tracked_slips” added an optional parameter “ticketId” cosmetic
- “price_shop_slip” added an optional parameter “books” cosmetic
- “tail_read” added an optional parameter “params” cosmetic
- “tail_read” added an optional parameter “replyId” cosmetic
- “get_history_summary” reworded the description of “recordId” cosmetic
- “tail_post” reworded the description of “active” cosmetic
- “tail_post” reworded the description of “postId” cosmetic
- “price_shop_slip” dropped the optional parameter “bookKey” cosmetic
- “price_shop_slip” dropped the optional parameter “intent” cosmetic
- “price_shop_slip” dropped the optional parameter “jurisdiction” cosmetic
- Tool “create_tracked_slip” changed its title: Save a slip → Save an app ticket cosmetic
- 31 Oct 26 0
- Tool “get_todays_board” rewrote its description, which is the text the model reads security
- “get_todays_board” added an optional parameter “sport” cosmetic
- 29 Oct 26 0
- Tool “get_todays_board” rewrote its description, which is the text the model reads security
- 28 Oct 26 0
- Tool “get_todays_board” rewrote its description, which is the text the model reads security
- “get_todays_board” added an optional parameter “includeStatus” cosmetic
- “get_todays_board” added an optional parameter “mode” cosmetic
- 25 Oct 26 0
- Tool “get_league_order” rewrote its description, which is the text the model reads security
- 24 Oct 26 0
- Tool “add_doctor_parlay_to_slip” rewrote its description, which is the text the model reads security
- Tool “cancel_doctor_reply” rewrote its description, which is the text the model reads security
- Tool “cancel_grade” rewrote its description, which is the text the model reads security
- Tool “connect_sportsbook” rewrote its description, which is the text the model reads security
- Tool “doctor_conversation” rewrote its description, which is the text the model reads security
- Tool “fix_grade_leg” rewrote its description, which is the text the model reads security
- Tool “forget_doctor_note” rewrote its description, which is the text the model reads security
- Tool “get_bettor_profile” rewrote its description, which is the text the model reads security
- Tool “get_doctor_conversation” rewrote its description, which is the text the model reads security
- Tool “get_doctor_events” rewrote its description, which is the text the model reads security
- Tool “get_doctor_job” rewrote its description, which is the text the model reads security
- Tool “get_doctor_memory” rewrote its description, which is the text the model reads security
- Tool “get_doctor_parlays” rewrote its description, which is the text the model reads security
- Tool “get_doctor_picks” rewrote its description, which is the text the model reads security
- Tool “get_doctor_quota” rewrote its description, which is the text the model reads security
- Tool “get_grade_evidence” rewrote its description, which is the text the model reads security
- Tool “get_grade_job” rewrote its description, which is the text the model reads security
- Tool “get_grade_progress” rewrote its description, which is the text the model reads security
- Tool “get_grade_report” rewrote its description, which is the text the model reads security
- Tool “get_league_order” rewrote its description, which is the text the model reads security
- Tool “get_saved_reports” rewrote its description, which is the text the model reads security
- Tool “get_tail_feed” rewrote its description, which is the text the model reads security
- Tool “get_tail_post” rewrote its description, which is the text the model reads security
- Tool “grade_slip” rewrote its description, which is the text the model reads security
- Tool “list_doctor_conversations” rewrote its description, which is the text the model reads security
- Tool “list_grade_jobs” rewrote its description, which is the text the model reads security
- Tool “open_doctor_conversation” rewrote its description, which is the text the model reads security
- Tool “preview_tail_post” rewrote its description, which is the text the model reads security
- Tool “price_shop_slip” rewrote its description, which is the text the model reads security
- Tool “publish_tail_post” rewrote its description, which is the text the model reads security
- Tool “quote_doctor_reply” rewrote its description, which is the text the model reads security
- Tool “quote_grade” rewrote its description, which is the text the model reads security
- Tool “remember_doctor_note” rewrote its description, which is the text the model reads security
- Tool “scan_slip” rewrote its description, which is the text the model reads security
- Tool “set_show_my_record” rewrote its description, which is the text the model reads security
- Tool “set_synced_record_consent” rewrote its description, which is the text the model reads security
- Tool “share_graded_ticket_to_tail” rewrote its description, which is the text the model reads security
- Tool “show_doctor_conversation” rewrote its description, which is the text the model reads security
- Tool “show_saved_grade” rewrote its description, which is the text the model reads security
- Tool “show_tail_feed” rewrote its description, which is the text the model reads security
- Tool “show_tail_post” rewrote its description, which is the text the model reads security
- Tool “start_doctor_reply” rewrote its description, which is the text the model reads security
- Tool “start_grade” rewrote its description, which is the text the model reads security
- Tool “tail_hot” rewrote its description, which is the text the model reads security
- Tool “tail_my_posts” rewrote its description, which is the text the model reads security
- Tool “tail_post” rewrote its description, which is the text the model reads security
- Tool “tail_react” rewrote its description, which is the text the model reads security
- Tool “tail_read” rewrote its description, which is the text the model reads security
- Schema quality: 134 → 119 ▲ functional
- Tool “disconnect_sportsbook” now declares an output schema ▲ functional
- Tool “fix_grade_leg” now declares an output schema ▲ functional
- Destructive annotations: All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation. functional
- “tail_post” reworded the description of “key” cosmetic
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://api.betslipdoctor.ai/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=api.betslipdoctor.ai | CN=YR1,O=Let's Encrypt,C=US | 17 Oct 2026 | 15 Jan 2027 | RSA 2048 | SHA256-RSA | 6e02b6e40f2460e0ca0fec84714b0d00bf8 |
| SANs: api.betslipdoctor.ai | ||||||
| CN=YR1,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | a20253f15f2691c05dc1ce13b9bcca4e |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.betslipdoctor.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 1814, 3799 | 8, 8 | Verified |
| betslipdoctor.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer resource_metadata="https://api.betslipdoctor.ai/.well-known/oauth-protected-resource", error="invalid_token"
Bearer resource_metadata="https://api.betslipdoctor.ai/.well-known/oauth-protected-resource", error="invalid_token" | Header | Value |
|---|---|
| strict-transport-security | max-age=63072000 |
| content-security-policy | frame-ancestors 'none' |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=() |
Protected resource metadata
| Document | https://api.betslipdoctor.ai/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://api.betslipdoctor.ai/api/mcp |
| Authorisation server | https://api.betslipdoctor.ai |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.betslipdoctor.ai/api/mcp | Verified | 200 | |
| http (plaintext) | http://api.betslipdoctor.ai/api/mcp | HTTPS enforced | 308 | https://api.betslipdoctor.ai/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
account_settings Account settings ~217
This account's settings, exactly as the app's Settings screens read and write them. set_preferences: POST account/preferences {any app preference field, gradeDepthDefault}; favorite_teams: GET account/favorite-teams; set_favorite_teams: POST account/favorite-teams app body; set_timezone: POST account/timezone {timezone}; quota: GET account/quota; book_balances: GET sportsbooks/balances; set_book_currency: POST sportsbooks/currency app body {accountId, identityDigest, expectedRevision, currency, confirmation}; seen_books: GET sportsbooks/seen; bug_report: POST bug-reports app body; bug_reports: GET bug-reports; bug_rewards: GET bug-reports/rewards.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| body | object | – | The app request body for this action, unchanged. |
| commandKey | string | – | Writes: one stable key per write, reused on every retry. |
| params | object | – | The app query (filters, limit, cursor) for a read. |
No output schema declared.
No examples provided.
add_doctor_parlay_to_slip Add a Doctor parlay to the slip ~155
Put one of the Doctor’s posted parlays (key from get_doctor_parlays) on this account’s slip in one step, with a unique commandKey. Checks every leg’s current price at the parlay’s book, saves the parlay as a private unplaced ticket and returns its legs (marketSelectionId, oddsAmerican, line, eventId) and ticketId; counts one tail per account per parlay. Run check_slip with the ticketId before Grade or the book link. Same paid-leg lock as get_doctor_parlays; never places a bet. Reuse its commandKey on every retry.
| Name | Type | Req | Description |
|---|---|---|---|
| commandKey | string | yes | – |
| key | string | yes | – |
No output schema declared.
No examples provided.
cancel_doctor_reply Cancel Doctor reply ~59
Cancel an owned Doctor jobId under the app cancellation and reservation rules. Cannot undo a reply or provider work already completed. Reuse its commandKey on every retry.
| Name | Type | Req | Description |
|---|---|---|---|
| commandKey | string | yes | – |
| jobId | string | yes | – |
No output schema declared.
No examples provided.
cancel_grade Cancel Grade ~65
Cancel an owned Grade jobId through the app service. Stops eligible work and releases its remaining reservation under the existing app rules; cannot undo provider work already performed. Reuse its commandKey on every retry.
| Name | Type | Req | Description |
|---|---|---|---|
| commandKey | string | yes | – |
| jobId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| createdAt | string | yes | – |
| deadlineAt | string | yes | – |
| eventSequence | integer | yes | – |
| failureCode | – | yes | – |
| id | string | yes | – |
| ownerId | string | yes | – |
| queue | object | – | – |
| quoteId | string | yes | – |
| refundNotice | object | – | – |
| result | – | yes | – |
| state | string | yes | – |
| terminalAt | – | yes | – |
No examples provided.
check_slip Check my slip ~129
The app slip’s rule for this conversation’s slip. Send legs (ids plus the oddsAmerican, line, observedAt and startsAt they were added with) or a ticketId from add_doctor_parlay_to_slip or copy_tail_slip. Legs whose game started or finished or whose line is gone come back in removed: drop them. legs stay, at current odds and line. empty: the slip is gone, build a new one. Run before Grade, before a book link, and when they return.
| Name | Type | Req | Description |
|---|---|---|---|
| legs | array | – | – |
| ticketId | string | – | – |
No output schema declared.
No examples provided.
connect_sportsbook Connect a sportsbook ~169
Return a 10-minute betslipdoctor.ai link (linkUrl, expiresAt) to the app’s sportsbook linking page, where the customer signs in to book (e.g. FanDuel) in state (two letters). While linking is not allowed it answers book_link_required with consent.text, consent.privacyUrl and consent.textVersion: show the text and privacy link word for word, and only after the customer’s explicit yes call again with consent true, that consentTextVersion and a commandKey (a missing or stale version is refused). Never sees sportsbook passwords; never places a wager.
| Name | Type | Req | Description |
|---|---|---|---|
| book | string | yes | – |
| commandKey | string | – | – |
| consent | boolean | – | – |
| consentTextVersion | string | – | – |
| state | string | – | – |
No output schema declared.
No examples provided.
copy_tail_slip Save reviewed Tail slip ~194
After the customer reviews every current leg and confirms the exact stake/currency/settlement fields, save the app’s owned Tail/Fade ticket using the preview binding and CONFIRM_COPY_TICKET. Keep commandKey stable on retries. Returns an unplaced slip; run check_slip with its ticketId before Grade or the book link. Never places a wager or grades automatically.
| Name | Type | Req | Description |
|---|---|---|---|
| bookId | string | yes | – |
| clientRevision | integer | yes | – |
| clientSlipId | string | yes | – |
| commandKey | string | yes | – |
| confirmation | string | yes | – |
| currency | string | yes | – |
| expectedPostRevision | integer | yes | – |
| jurisdiction | string | yes | – |
| mode | string | yes | – |
| offeredReturnMinor | – | yes | – |
| postId | string | yes | – |
| previewBinding | string | yes | – |
| settlementTerms | object | yes | – |
| stakeMinor | integer | yes | – |
No output schema declared.
No examples provided.
create_api_key Create an API key ~85
Create a personal API key (bsd_live_…) for scripts. Give it a name and the scopes it needs; they must be a subset of this connection's own scopes. The full key is returned once in this result and cannot be read again. API keys cannot create other keys. Requires Pro or Elite.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| scopes | array | yes | – |
No output schema declared.
No examples provided.
create_tracked_slip Save an app ticket ~127
Save one app ticket (the quote_grade ticket contract) to this account's saved slips through the app's POST tickets, with a stable client_mutation_id for retries. Stores the slip only; never prepares or places a wager.
| Name | Type | Req | Description |
|---|---|---|---|
| client_mutation_id | string | yes | Caller-generated idempotency key. |
| ticket | object | yes | The app ticket: clientSlipId, clientRevision, source, intent, bookId, currency, stakeMinor, confirmation, offeredReturnMinor, acceptedReturnMinor, settlementTerms and 1-25 selections (same as quote_g… |
| Name | Type | Req | Description |
|---|---|---|---|
| createdAt | string | yes | – |
| id | string | yes | – |
| input | object | yes | – |
| inputDigest | string | yes | – |
| ownerId | string | yes | – |
No examples provided.
disconnect_sportsbook Disconnect a sportsbook ~97
Disconnect an owned linked sportsbook accountId, the same as the app’s Disconnect: BSD imports for it stop at once and the link to your sportsbook is removed in the background. Requires confirm true after the customer explicitly asks; without it nothing changes. Saved bets stay in History. Reconnecting needs connect_sportsbook again.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | – |
| commandKey | string | – | – |
| confirm | boolean | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | – |
| appliedAt | string | yes | – |
| confirmedAt | – | yes | – |
| generation | integer | yes | – |
| requestedAt | – | yes | – |
| revision | integer | yes | – |
| state | string | yes | – |
| version | string | yes | – |
No examples provided.
doctor_actions Doctor: decisions, reply buttons, memory ~390
The Doctor actions beside the conversation, as the app does them. Record a decision only when the customer says what they did; change memory consent only when they ask. decision: GET doctor/messages/{messageId}/decision params {beforeRevision}; record_decision: POST doctor/messages/{messageId}/decision {messageId, messageDigest, threadId, binding, expectedRevision, confirmation SAVE_RESPONSE, decision followed|changed|skipped|unknown, modifiedTicketId}; saved_reply: GET doctor/messages/{messageId}/saved-reply params {messageDigest, threadId, ticketId|reportId|historyKind+historyId}; grade_this: POST doctor/messages/{messageId}/grade-quote app body; compare_books: POST doctor/messages/{messageId}/book-prices app body; revise_ticket: POST doctor/messages/{messageId}/revisions app body; book_check: GET doctor/book-comparisons/{comparisonId}; delete_thread: POST doctor/threads/{threadId}/delete (confirmation DELETE); memory_status: GET doctor/memory; memory_context: GET doctor/memory/context; memory_consent: POST doctor/memory/consent {enabled, expectedGeneration, confirmation ALLOW_HONCHO_MEMORY|DISABLE_HONCHO_MEMORY}; memory_forget_all: POST doctor/memory/forget {expectedGeneration} (confirmation FORGET_RECALLED_MEMORY); notes_consent: POST memory/consent {enabled, expectedGeneration} (on/off switch).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| body | object | – | The app request body for this action, unchanged. |
| commandKey | string | – | Writes: one stable key per write, reused on every retry. |
| comparisonId | string | – | – |
| messageId | string | – | – |
| params | object | – | The app query (filters, limit, cursor) for a read. |
| threadId | string | – | – |
No output schema declared.
No examples provided.
doctor_conversation Ask the Doctor ~252
Combined form of the Doctor tools, open_doctor_conversation through cancel_doctor_reply (same fields, same answers): version bsd-agent-doctor-v1 and one action. Show a quote before start; remember or forget a note only when the customer explicitly asks; never claim an answer until the job's saved result is readable. A response style affects that reply only.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| after | integer | – | – |
| before | integer | – | – |
| commandKey | string | – | Stable key for one write action and all its retries. |
| confirmation | string | – | – |
| expectedRevision | integer | – | – |
| history | object | – | – |
| id | string | – | Exact owned note ID to remove. |
| jobId | string | – | – |
| note | object | – | – |
| quoteId | string | – | – |
| reportId | string|null | – | – |
| responseStyle | string | – | This reply only. Omit to preserve the account default. |
| sequence | integer | – | Current thread sequence from conversation. |
| text | string | – | – |
| threadId | string | – | – |
| ticketId | string|null | – | – |
| version | string | yes | – |
No output schema declared.
No examples provided.
export_betting_history Export History page ~58
Read one real CSV export page for the owned History filters. Returns complete/next, filename and CSV. Never call a partial page a full export. No account mutation.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| query | object | yes | – |
No output schema declared.
No examples provided.
fade_post Review and save opposite slip ~160
Preview actual supported opposite selections for a visible Tail post at the customer’s bookId and jurisdiction. Unavailable legs remain unavailable; this is not the mathematical complement of a parlay. After explicit customer review, confirm with the original preview binding, post revision, exact stake/currency/settlement fields and CONFIRM_COPY_TICKET. Keep commandKey stable on retries. Saves a private unplaced ticket and records the existing confirmed Fade activity; never places a wager. Use get_tail_post for the source’s current Fade count and permitted actors.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| bookId | string | – | – |
| commandKey | string | – | – |
| jurisdiction | string | – | – |
| postId | string | yes | – |
| request | object | – | – |
No output schema declared.
No examples provided.
fix_grade_leg Let the Doctor fix a graded slip ~181
The app’s Fix it on an owned saved Grade jobId whose get_grade_report says fixable.offered: the Doctor reprices, swaps or drops weak legs at the slip’s own sportsbook and returns the app’s estimate (state fixed | best_reachable | no_moves, steps per leg, blockers, fixedTicket saved unplaced). after is the Doctor’s estimate, never a saved Grade: re-grade with regradeQuote to confirm. A Grade with no fix answers fix_not_offered with its reason. Paid plans, under the daily fix cap; costs no Grade. Keep commandKey (16-120 characters) stable; a replay returns the same estimate. Never places a wager or moves money.
| Name | Type | Req | Description |
|---|---|---|---|
| commandKey | string | yes | – |
| jobId | string | yes | – |
| target | string | – | – |
| ticketDigest | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| after | – | yes | – |
| before | – | yes | – |
| blockers | array | yes | – |
| book | – | yes | – |
| createdAt | string | yes | – |
| estimateDigest | string | yes | – |
| expiresAt | string | yes | – |
| fixId | string | yes | – |
| fixedTicket | – | yes | – |
| gradeVersion | string | yes | – |
| jobId | string | yes | – |
| payout | object | yes | – |
| placeable | boolean | yes | – |
| pricesAt | string | yes | – |
| regradeQuote | – | yes | – |
| regradeUnavailable | – | yes | – |
| state | string | yes | – |
| steps | array | yes | – |
| target | – | yes | – |
| ticketDigest | string | yes | – |
| ticketId | string | yes | – |
| version | string | yes | – |
| work | array | yes | – |
No examples provided.
forget_doctor_note Forget Doctor note ~96
Remove the exact owned note only after the customer explicitly asks to forget it. Requires current id/expectedRevision and confirmation forget_for_future_consults. Rotates inferred memory under the existing account service; saved conversations remain separately retained until deleted. Reuse its commandKey on every retry.
| Name | Type | Req | Description |
|---|---|---|---|
| commandKey | string | yes | – |
| confirmation | string | yes | – |
| expectedRevision | integer | yes | – |
| id | string | yes | – |
No output schema declared.
No examples provided.
get_betting_leaks Read betting leaks ~48
Read deterministic patterns from this account’s settled betting history, with coverage, sample sizes, thresholds and source ticket IDs.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| range | string | – | – |
No output schema declared.
No examples provided.
get_bettor_profile Read bettor profile ~79
Read this authenticated account’s bettor model, optionally filtered by topic: confirmed notes and revisions, separately attributed Honcho inferred context, source IDs when supplied, generation, recall state and as-of. Unavailable inference stays unavailable. Memory and AI consent apply; recalled statements never establish bet outcomes or change Grade math.
| Name | Type | Req | Description |
|---|---|---|---|
| topic | string | – | – |
No output schema declared.
No examples provided.
get_box_score Get a live score and box score ~134
Read the in-play or final score and box score for one game (eventId from search_markets or the board), the same read as the app’s Live game page: status (in_progress, final or suspended), period and clock, each team’s score and period-by-period line, team statistics, and player statistic tables. state unavailable with a reason (e.g. unsupported_league, no_usable_body when the game has not started, source_stale) means the app shows no box score either. Covers the leagues the app’s Live game page covers, soccer included.
| Name | Type | Req | Description |
|---|---|---|---|
| eventId | string | yes | – |
No output schema declared.
No examples provided.
get_doctor_conversation Read Doctor conversation ~54
Read the owned threadId, saved user messages, Doctor answers and jobs; optional before pages older messages. Does not generate a new answer.
| Name | Type | Req | Description |
|---|---|---|---|
| before | integer | – | – |
| threadId | string | yes | – |
No output schema declared.
No examples provided.
get_doctor_events Read Doctor events ~45
Read saved events for the owned Doctor jobId, optionally after a sequence. Never starts a consult.
| Name | Type | Req | Description |
|---|---|---|---|
| after | integer | – | – |
| jobId | string | yes | – |
No output schema declared.
No examples provided.
get_doctor_job Read Doctor job ~41
Read the owned Doctor jobId, including its real saved answer when available. Never generates or restarts a reply.
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | yes | – |
No output schema declared.
No examples provided.
get_doctor_memory Read Doctor memory ~53
Read this authenticated account’s confirmed notes, active status, current revisions and memory generation. Longer-term Honcho personalization is recalled inside consults. These notes are user-reported preferences and lessons, not authoritative betting outcomes.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_doctor_parlays Read Doctor parlays ~148
Read the Doctor’s posted parlays for one league (e.g. LGUE_nfl): 2-3 legs on different games, each B+ or better when posted. Upcoming first with the newest regrade (currentGrade), then recent WON/LOST/PUSH results and the parlays record. Items carry parlayType (lock = 2 legs, moonshot = 3), title, pitch, legCount, oddsAmerican (combined price) and netUnits once settled. Empty means nothing cleared the bar today. App permissions and paid-leg lock apply; a paid reader gets the legs to put the parlay on a slip.
| Name | Type | Req | Description |
|---|---|---|---|
| league | string | yes | – |
No output schema declared.
No examples provided.
get_doctor_picks Read Doctor picks ~131
Read today’s saved Doctor picks and recent settled WON/LOST/PUSH results. Each item carries league (first leg’s league id), sport (first leg’s sport id) and leagues (every leg’s league), the same fields the app’s league tabs filter by, for every reader. Optional league (e.g. LGUE_nfl) and/or sport (e.g. SPRT_americanfootball) keep only matching items. Uses the app’s account permissions and paid-leg lock; no generation or current-price claim.
| Name | Type | Req | Description |
|---|---|---|---|
| league | string | – | – |
| sport | string | – | – |
No output schema declared.
No examples provided.
get_doctor_quota Read Doctor allowance ~35
Read this account’s current app consult allowance, held and used amounts, and reset information. Does not reserve a consult.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_grade_evidence Read Grade evidence ~84
Return the evidence behind an owned completed Grade jobId: each claim checked (price, injury and lineup, matchup, form, line move, situational, weather, correlation), its sources with tier 1-5, age and supports/contradicts tag, unknowns, and whether it was verified. Never grades again.
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | yes | – |
No output schema declared.
No examples provided.
get_grade_job Read Grade job ~35
Read the owned Grade jobId and its current durable status. Never starts or resumes work.
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| createdAt | string | yes | – |
| deadlineAt | string | yes | – |
| eventSequence | integer | yes | – |
| failureCode | – | yes | – |
| id | string | yes | – |
| ownerId | string | yes | – |
| queue | object | – | – |
| quoteId | string | yes | – |
| refundNotice | object | – | – |
| result | – | yes | – |
| state | string | yes | – |
| terminalAt | – | yes | – |
No examples provided.
get_grade_progress Read Grade progress ~74
Read saved progress for the owned Grade jobId, with optional after sequence and limit 1-100. Progress is not proof that a saved report is ready; never starts work.
| Name | Type | Req | Description |
|---|---|---|---|
| after | integer | – | – |
| jobId | string | yes | – |
| limit | integer | – | – |
| representation | string | – | – |
No output schema declared.
No examples provided.
get_grade_report Read saved Grade report ~183
Return the verified saved report for a completed Grade this account owns, by jobId. Returns unavailable until the saved report is readable; never grades again. headline is the letter the app shows: A+, A, B, C, D, F or NG (No grade), with its label. rockySummary carries each leg’s modeled win chance against its break-even and its EV, the chance all legs win, confidence, top risks and the NG reasons (chances and EV as fractions), and view: Research and Price, each a level (Strong, OK or Weak, or null when it couldn’t be checked) with a plain reason; what moved the Grade, by name; the cap line when a better price at another book capped the letter; and the checks that couldn’t run. The same breakdown the app shows.
| Name | Type | Req | Description |
|---|---|---|---|
| jobId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| additionalFindingCount | – | – | – |
| assessment | – | – | – |
| catalogDigest | – | – | – |
| catalogVersion | – | – | – |
| checks | – | – | – |
| completeGrade | – | – | – |
| computedRisk | – | – | – |
| coverage | – | – | – |
| createdAt | – | – | – |
| depth | – | – | – |
| detailCheckpointKeys | – | – | – |
| doctorFix | – | – | – |
| earnedValueGrade | – | – | – |
| evidenceCutoff | – | – | – |
| evidenceManifestDigest | – | – | – |
| excerpts | – | – | – |
| finalEvidenceScore | – | – | – |
| findings | – | – | – |
| fixable | – | – | – |
| gates | – | – | – |
| gradeSettings | – | – | – |
| gradeView | object | – | – |
| headline | – | – | – |
| id | string | yes | – |
| legCoverage | – | – | – |
| legLabels | – | – | – |
| legacyGrade | – | – | – |
| limitations | – | – | – |
| market | – | – | – |
| meters | – | – | – |
| modelReceiptDigests | – | – | – |
| outcomeParlayGrade | – | – | – |
| outcomeValueGrade | – | – | – |
| ownerId | – | – | – |
| parlayMarketGrade | – | – | – |
| personalizedGrade | – | – | – |
| personalizedRockyGrade | – | – | – |
| priceTrail | – | – | – |
| profileDigest | – | – | – |
| profileSnapshot | – | – | – |
| provisional | – | – | – |
| publicProjectionDigest | string | yes | – |
| recordFirst | – | – | – |
| recordFirstAdmission | – | – | – |
| recordFirstLean | – | – | – |
| refundNotice | – | – | – |
| reportDigest | string | yes | – |
| researchStartedAt | – | – | – |
| researchStatus | – | – | – |
| rockyGrade | – | – | – |
| rockySummary | – | – | – |
| ruleVersion | – | – | – |
| sources | – | – | – |
| stateManifestDigest | – | – | – |
| ticket | – | – | – |
| v2 | – | – | – |
| value | – | – | – |
| valueUnavailableReason | – | – | – |
| version | string | yes | – |
No examples provided.
get_history_summary Betting history summary ~299
The authenticated account's app History summary (GET history/summary): record, stake and net over the chosen range, with its source, currency and limitation rules. Numbers come only from the account's own records; nothing is fabricated. category reads the other History pages the app shows.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Current app History read (the app route body). Context takes only original recordId and recordKind; other categories require request. Advice also requires the original record references; every advice… |
| currency | string | – | ISO 4217 code. |
| id | string | – | earlier_report: the saved report; links: the import. |
| params | object | – | The app query for chart, record_doctor_decisions, earlier_reports, recall (filters as JSON text), recall_week, grade_comparison, doctor_overview and imports. |
| range | string | – | 1y is a rolling calendar year; ytd is year to date. |
| recordId | string | – | Original owned History record ID (advice, context, record, recall_record, record_doctor_decisions). |
| recordKind | string | – | – |
| request | – | – | Use the existing History filters/cursor for this category. Advice before placement is distinct from current or retrospective responses. |
| view | string | – | Optional; the app History is the only view. |
No output schema declared.
No examples provided.
get_league_order Read the league order ~185
Read BetSlip Doctor’s league order right now: the same leagues in the same order as the app’s league strip (its Home and Odds chips: games in play first, then the soonest tip within 6 hours, then games in the next 24 hours); Tennis, Soccer and Golf are sport chips and carry their SPRT_ id. Each row has rank, weight and phase (this week’s popularity times season phase), inSeason and featured. `slate` carries the default league and the featured game (the in-play or soonest game with the most markets), refreshed every 5 minutes. Lists only leagues in season with a DraftKings price right now (the same leagues as the app’s chips, search and league lists); a league leaves when it has no priced game and comes back by itself when it does. Read-only; no account data.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_plan Get my plan ~83
Read this account’s BetSlip Doctor plan exactly as the app shows it: the plan (free, starter, pro or elite), where it is paid (paymentSource), its status and current period end, the plan limits, and this period’s usage: Grades left and when they reset, Doctor chats left this month (and today on Free). Read only; changes nothing.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_player_research Research a player prop ~322
Research a player and his prop the way the Doctor does: his last 5 and last 10 games against his season average and tonight’s line (overs, unders and average margin, hot/cold/steady), his games against tonight’s opponent, the prop against the opponent’s defense (what it allowed in its last 5 finals against the league average per team-game, good/average/bad and rank), both teams’ last 5 results and their head-to-head. league is a LGUE_ id; player is his name (leave it out, with team and opponent, for just both teams’ last 5 and head-to-head); team (or teamId) places him on a roster when the name alone is not enough; opponent defaults to his team’s next game; market ("Points", "Passing Yards", "Shots on Goal", "Strikeouts", "PRA") and line (tonight’s number, e.g. from search_markets) set the over/under counts. Public stats, saved and reused across users. Covers the NBA, WNBA, NFL, college football, NHL, MLB and college basketball; state unavailable says why.
| Name | Type | Req | Description |
|---|---|---|---|
| eventId | string | – | – |
| league | string | yes | – |
| line | number | – | – |
| market | string | – | – |
| opponent | string | – | – |
| opponentTeamId | string | – | – |
| player | string | – | – |
| playerId | string | – | – |
| team | string | – | – |
| teamId | string | – | – |
No output schema declared.
No examples provided.
get_saved_reports Saved Grade jobs and reports ~108
Combined form of list_grade_jobs, get_grade_job, get_grade_progress, get_grade_report and get_grade_evidence (same fields, same answers): version bsd-agent-grade-v1 and action list, job, progress, report or evidence.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| after | integer | – | – |
| cursor | string | – | – |
| jobId | string | – | – |
| limit | integer | – | – |
| representation | string | – | – |
| version | string | yes | – |
No output schema declared.
No examples provided.
get_tail_feed Read Tail feed ~118
Doctor ticket posts include result WON/LOST/PUSH when settled, null otherwise. Read the app Tail feed with its account-filtered community, following, own, profile, bookmark or private-list visibility. Uses app moderation, mutes and account-bound cursor rules; does not post.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| feed | string | – | – |
| gradeFamily | string | – | – |
| limit | integer | – | – |
| listId | string | – | – |
| profileId | string | – | – |
| search | string | – | – |
No output schema declared.
No examples provided.
get_tail_post Read Tail post ~107
Doctor ticket posts include result WON/LOST/PUSH when settled, null otherwise. Read one app Tail postId visible to this account under the same moderation and privacy rules. Supply fadedByLimit (1-25) or fadedByCursor to include the permitted public confirmed-Fade profile page. May contain another community member’s published content; does not post.
| Name | Type | Req | Description |
|---|---|---|---|
| fadedByCursor | string | – | – |
| fadedByLimit | integer | – | – |
| postId | string | yes | – |
No output schema declared.
No examples provided.
get_todays_board Today's board (live odds) ~571
The app Live board (GET live/board): upcoming and in-play games, each with mainLines: its DraftKings game lines (slot, line, odds), optional league or sport, limit 1-20 and cursor. sport reads a sport chip's board across its leagues (SPRT_tennis, SPRT_soccer, SPRT_golf; tennis and golf games have no league). A league outside the app's chips is built on its first read, so that first answer can be 503 provider_unavailable with retryAfterSeconds: read again in about 60 s. Only leagues in season with a DraftKings price right now are listed: a league or sport without one answers no games (it is not in get_league_order either) and comes back by itself once its games are priced. mode: live with includeStatus: true lists only the games in play now, each with its status (a game in a league with no scoreboard feed, such as tennis or UFC, is listed while DraftKings prices it in play: its status is in_progress with the score, period and clock a public scoreboard has for it, or none; tennis: score = sets won, period = the set in play, displayClock = that set's games home-away; UFC: period = round); with includeStatus: true, eventSeries gives each game its playoff series line (round, game, summary; MLB now) or null; stale: true means some games could not be confirmed yet, so read again shortly. Use category: event_catalog for original event market identities, event_prices for an exact source-bound group at one book, or board_snapshot for one prewarmed page; those require request. pickem is the app's Pick'Em board for one game: request {eventId} returns the catalogue page and pickem.markets (full-game player Over/Under); request {eventId, marketId} returns that market's lines with DraftKings' price on each (pickem.prices). Never a wager.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Source-bound categories require request; board_snapshot reads one complete prewarmed page without provider work; games uses the board filters. |
| cursor | string | – | – |
| includeStatus | boolean | – | Adds each game's status. |
| league | string | – | – |
| limit | integer | – | – |
| mode | string | – | Games in play now; needs includeStatus: true. |
| request | – | – | Required for event_catalog, event_prices or board_snapshot. Pass the exact original source-bound request; never relabel source IDs or periods. |
| sport | string | – | A sport chip board instead of league, e.g. SPRT_tennis. |
| view | string | – | Optional; the app board is the only view. |
No output schema declared.
No examples provided.
get_tracked_slips Saved slips ~114
Read the authenticated account's saved-ticket library: the same list the app shows (GET tickets), newest first, with optional search, limit 1-20 and cursor. Provider placement ids and sportsbook deep links are never returned.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| limit | integer | – | – |
| search | string | – | – |
| ticketId | string | – | One saved ticket (GET tickets/:id) instead of the list. |
| view | string | – | Optional; the app library is the only view. |
No output schema declared.
No examples provided.
grade_pickem_entry Grade a Pick’Em entry ~176
Use action settlement with ticketId to read this owned entry’s result (history.read also required). Use bsd-pickem-grade-v2. check returns per-pick availability without research or a model call; letters are not scored yet. quote saves the owned Power or complete Flex child-ticket structure. Whole-entry Grade stays unavailable without confirmed book payouts and supported engine shape. start never bypasses those requirements. report also requires reports.read. No wager is placed.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| childTicketIds | array | – | – |
| commandKey | string | – | – |
| depth | string | – | – |
| entry | – | – | – |
| jobId | string | – | – |
| quoteId | string | – | – |
| selections | array | – | – |
| ticketId | string | – | – |
| version | string | yes | – |
No output schema declared.
No examples provided.
grade_settings Grade settings ~91
Read or save this account’s Grade risk preference, analysis depth and unit size. Saving requires the exact confirmed settings, current revision and a stable command key. Risk preference is separate from computed report risk. No Grade or research starts.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| commandKey | string | – | – |
| confirmed | boolean | – | – |
| expectedRevision | integer | – | – |
| settings | object | – | – |
No output schema declared.
No examples provided.
grade_slip Grade a confirmed betslip ~189
Combined form of quote_grade, start_grade and cancel_grade (same fields, same answers): version bsd-agent-grade-v1, action quote, start or cancel, and a commandKey. Paid plans can run Fast, Pro (wire depth deep) or Elite at the quoted price. If the Grade returns no letter, the units come back. Show the quote before a start; send force: true on quote only when the customer wants a new Grade of an already graded slip. Text and legacy SGP inputs return migration_required.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| commandKey | string | yes | – |
| depth | string | – | – |
| force | boolean | – | – |
| funding | string | – | – |
| jobId | string | – | – |
| quoteId | string | – | – |
| ticket | object | – | – |
| ticketId | string | – | – |
| version | string | yes | – |
Structured output declared, but exposes no named fields.
No examples provided.
history_actions History: record a bet, notes, links ~152
Write this account's History as the app does. Record a bet only when the customer says they placed it. save_manual: POST history/manual {id?, expectedRevision?, confirmation PLACED, input {ticketId, placedAt, status, outcome, ...}}; set_currency: POST history/currency app body; save_link: POST history/links app body (link an import to a manual record); recall_save: POST history/recall/organization app body (notes, tags, bookmark).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | – |
| body | object | – | The app request body for this action, unchanged. |
| commandKey | string | – | Writes: one stable key per write, reused on every retry. |
No output schema declared.
No examples provided.
list_api_keys List your API keys ~36
List your active personal BetSlip Doctor API keys (name, display prefix, scopes, created, last used). Secrets are never returned.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_connected_agents List connected agents ~33
List the agents (OAuth apps) connected to your BetSlip Doctor account: name, scopes, connected and last used.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_doctor_conversations List Doctor conversations ~26
Read this account’s saved app Doctor threads. Does not generate an answer.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_grade_jobs List Grade jobs ~84
Read the authenticated account’s current Grade library, with optional limit 1-20 and account-bound cursor. Each row’s headline is its Rocky letter (A+ to F, or NG) and report.rockyGradeSummary its label and score. Never starts research.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | – |
| limit | integer | – | – |
| representation | string | – | – |
No output schema declared.
No examples provided.
list_linkable_sportsbooks List sportsbooks I can link ~114
List the sportsbooks this account can link, the same list as the app’s Settings > Sportsbooks picker: each book (bookId, name, abbr) with the two-letter states it can be linked in. state (two letters, e.g. NJ) filters to the books linkable there; without it the account’s own linking state is used when its linked books share one. Use a listed book and state with connect_sportsbook. Never contacts a sportsbook.
| Name | Type | Req | Description |
|---|---|---|---|
| state | string | – | – |
No output schema declared.
No examples provided.
list_sportsbooks List my sportsbooks ~103
Read this account’s linked sportsbooks exactly as the app shows them: whether sportsbook linking is allowed, each account (accountId, book, region, betsSynced), its connection (verified, paused, reconnect_required, revoked, disabled, unknown), needsReconnect, its last check and last refresh, the newest bet import, and booksOnTickets: the books on the customer’s saved tickets (bookAbbr, tickets, lastSeenAt). Never contacts the sportsbook.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
look_up_fact Look up a Doctor fact ~182
Start a Doctor consult from its quote, then call with its jobId and structured fact, public subject names, league, date, timezone and optional eventId. If the fields do not match a planned lookup, the lookup_not_planned error includes extra.plannedLookups: the exact allowed {fact, subject, league, date, timezone, eventId} fields. Retry with one of those entries and the same jobId. If the plan is not ready yet, retry after the consult has planned it. Returns the outcome, reason and linked sources after the consult succeeds. Use the quoted sources for facts and numbers.
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | yes | – |
| eventId | string | – | – |
| fact | string | yes | – |
| jobId | string | yes | – |
| league | – | yes | – |
| subject | array | yes | – |
| timezone | string | yes | – |
No output schema declared.
No examples provided.
How do I install the BetSlip Doctor MCP server?
BetSlip Doctor is a hosted endpoint at https://api.betslipdoctor.ai/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.betslipdoctor.ai
claude mcp add --transport http ai-betslipdoctor-mcp 'https://api.betslipdoctor.ai/api/mcp'
What is the BetSlip Doctor MCP server?
BetSlip Doctor is an MCP server listed in the public MCP registry as ai.betslipdoctor/mcp. Your agent grades every slip A+ to F-, links your books and tracks your record. No wager placement. This page covers its hosted endpoint (https://api.betslipdoctor.ai/api/mcp).
Is the BetSlip Doctor MCP server safe to use?
BetSlip Doctor scores 89 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the BetSlip Doctor MCP server expose?
BetSlip Doctor exposes 92 tools: get_tracked_slips, track_slip, get_todays_board, grade_slip, get_saved_reports, and 87 more. Their descriptions and schemas cost roughly 12,842 tokens of context every time the server is loaded.
Does the BetSlip Doctor MCP server require authentication?
Yes. BetSlip Doctor asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the BetSlip Doctor MCP server still maintained?
BetSlip Doctor is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.