{
  "server": "betslipdoctor",
  "url": "https://api.betslipdoctor.ai/api/mcp",
  "date": "2026-09-30",
  "protocolVersion": "2025-06-18",
  "serverInfo": {
    "name": "betslip-doctor",
    "title": "BetSlip Doctor",
    "version": "1.2.0"
  },
  "listChangedDeclared": false,
  "toolCount": 10,
  "outputSchemaCoveragePct": 0,
  "tools": [
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "doctor.use"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "The app Doctor conversation. Send version bsd-agent-doctor-v1 and one action: open (commandKey, optional owned subject), threads, conversation (threadId), quota, quote (commandKey, threadId, current sequence, text), start (commandKey, quoteId), job or events (jobId), or cancel (commandKey, jobId). Keep each write commandKey stable on retry. Show the quote before start; a succeeded job carries the saved Doctor answer and the conversation stores it. The app enforces AI consent, tier, allowance, cost cap and worker admission. Do not claim an answer until the saved result is readable.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "enum": [
              "open",
              "threads",
              "conversation",
              "quota",
              "quote",
              "start",
              "job",
              "events",
              "cancel"
            ],
            "type": "string"
          },
          "after": {
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "before": {
            "maximum": 2001,
            "minimum": 1,
            "type": "integer"
          },
          "commandKey": {
            "description": "Stable key for one write action and all its retries.",
            "maxLength": 120,
            "minLength": 16,
            "type": "string"
          },
          "history": {
            "additionalProperties": false,
            "properties": {
              "id": {
                "format": "uuid",
                "type": "string"
              },
              "kind": {
                "enum": [
                  "import",
                  "manual"
                ],
                "type": "string"
              }
            },
            "required": [
              "kind",
              "id"
            ],
            "type": "object"
          },
          "jobId": {
            "format": "uuid",
            "type": "string"
          },
          "quoteId": {
            "format": "uuid",
            "type": "string"
          },
          "reportId": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "sequence": {
            "description": "Current thread sequence from conversation.",
            "maximum": 1998,
            "minimum": 0,
            "type": "integer"
          },
          "text": {
            "maxLength": 4000,
            "minLength": 1,
            "type": "string"
          },
          "threadId": {
            "format": "uuid",
            "type": "string"
          },
          "ticketId": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "version": {
            "const": "bsd-agent-doctor-v1",
            "type": "string"
          }
        },
        "required": [
          "version",
          "action"
        ],
        "type": "object"
      },
      "name": "doctor_conversation",
      "title": "Ask the Doctor"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "history.read"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "The authenticated user's imported betting-history ledger: W-L record, stake and net over lifetime/30d/7d windows, sync freshness, and their most recent bets. Numbers come only from the user's own imported slips; nothing is fabricated. Set view: app for the current app History summary with its source, currency and limitation rules.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "currency": {
            "description": "Current app view only; ISO 4217 code.",
            "type": "string"
          },
          "range": {
            "description": "Current app view only.",
            "enum": [
              "1w",
              "1m",
              "3m",
              "ytd",
              "all"
            ],
            "type": "string"
          },
          "recent": {
            "description": "How many recent bets to include (default 5).",
            "maximum": 20,
            "minimum": 0,
            "type": "integer"
          },
          "recordKind": {
            "description": "Current app view only.",
            "enum": [
              "all",
              "import",
              "manual"
            ],
            "type": "string"
          },
          "view": {
            "description": "Use the current app History summary; omit for legacy imported history.",
            "enum": [
              "app"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_history_summary",
      "title": "Betting history summary"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "reports.read"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "For current Grade, send version bsd-agent-grade-v1 and action: list (optional limit 1-20 and cursor), job or report (jobId UUID required), or progress (jobId UUID required; optional after 0-1000000 and limit 1-100). Readiness requires a readable saved report. For legacy reports only, omit version/action and send optional report_id and limit 1-25. Never mix current and legacy fields.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "enum": [
              "list",
              "job",
              "progress",
              "report"
            ],
            "type": "string"
          },
          "after": {
            "default": 0,
            "maximum": 1000000,
            "minimum": 0,
            "type": "integer"
          },
          "cursor": {
            "maxLength": 2000,
            "minLength": 1,
            "type": "string"
          },
          "jobId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "limit": {
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "report_id": {
            "description": "Legacy saved report ID; omit version and action.",
            "type": "string"
          },
          "version": {
            "const": "bsd-agent-grade-v1",
            "type": "string"
          }
        },
        "required": [],
        "type": "object"
      },
      "name": "get_saved_reports",
      "title": "Saved Grade jobs and reports"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "odds.read"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Live sports board: upcoming and in-play games with main-market prices (moneyline, spread, total) and the best posted price per selection across connected books. Read-only decision support; never a guarantee and never a wager. Set view: app for the current app Live board and its provider, filters and cursor.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "category": {
            "description": "Current app games board only; current event prices are a separate app read.",
            "enum": [
              "games"
            ],
            "type": "string"
          },
          "cursor": {
            "description": "Current app view only.",
            "maxLength": 800,
            "type": "string"
          },
          "league": {
            "description": "Current app view only.",
            "type": "string"
          },
          "leagues": {
            "description": "League labels to filter by, e.g. ['MLB','NFL']. Omit for all leagues.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "limit": {
            "description": "Legacy main-market board: max 50. Current app games view: max 20.",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "offset": {
            "description": "Window offset for paging (default 0).",
            "minimum": 0,
            "type": "integer"
          },
          "view": {
            "description": "Use the current app Live board; omit for the legacy main-market board.",
            "enum": [
              "app"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_todays_board",
      "title": "Today's board (live odds)"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "slips.read"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Read the authenticated user's tracked ticket trees and tracking lifecycle. Set view: app to read the current app saved-ticket library instead. Provider placement ids and sportsbook deep links are never returned.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "cursor": {
            "description": "Current app view only.",
            "maxLength": 1000,
            "type": "string"
          },
          "limit": {
            "description": "Legacy tracked trees: max 50. Current app view: max 20.",
            "maximum": 50,
            "minimum": 1,
            "type": "integer"
          },
          "search": {
            "description": "Current app view only.",
            "maxLength": 128,
            "type": "string"
          },
          "view": {
            "description": "Use current app saved-ticket library; omit for tracked trees.",
            "enum": [
              "app"
            ],
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_tracked_slips",
      "title": "Tracked slips"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "slips.grade"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Use version bsd-agent-grade-v1 and a unique commandKey (16-120 characters) for every action. quote requires depth plus exactly one of ticketId (saved UUID) or ticket (exact confirmed manual ticket); funding is optional. start requires quoteId. cancel requires jobId. A quote discloses the allowance; start reserves it and returns a durable job. Use get_saved_reports for progress and the saved result. Text and legacy SGP inputs return migration_required.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "enum": [
              "quote",
              "start",
              "cancel"
            ],
            "type": "string"
          },
          "commandKey": {
            "maxLength": 120,
            "minLength": 16,
            "pattern": "^[a-zA-Z0-9_-]+$",
            "type": "string"
          },
          "depth": {
            "enum": [
              "fast",
              "smart",
              "deep",
              "elite"
            ],
            "type": "string"
          },
          "funding": {
            "default": "auto",
            "enum": [
              "auto",
              "weekly",
              "bug_bounty"
            ],
            "type": "string"
          },
          "jobId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "quoteId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "ticket": {
            "additionalProperties": false,
            "properties": {
              "acceptedReturnMinor": {
                "anyOf": [
                  {
                    "maximum": 1000000000000,
                    "minimum": 0,
                    "type": "integer"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "bookId": {
                "maxLength": 200,
                "minLength": 1,
                "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                "type": "string"
              },
              "bookLabel": {
                "maxLength": 80,
                "minLength": 1,
                "type": "string"
              },
              "clientRevision": {
                "maximum": 1000000000,
                "minimum": 0,
                "type": "integer"
              },
              "clientSlipId": {
                "maxLength": 200,
                "minLength": 1,
                "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                "type": "string"
              },
              "confirmation": {
                "const": "exact_fields_confirmed",
                "type": "string"
              },
              "currency": {
                "pattern": "^[A-Z]{3}$",
                "type": "string"
              },
              "intent": {
                "enum": [
                  "singles",
                  "parlay"
                ],
                "type": "string"
              },
              "offeredReturnMinor": {
                "anyOf": [
                  {
                    "maximum": 1000000000000,
                    "minimum": 0,
                    "type": "integer"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "parentTicketId": {
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
                "type": "string"
              },
              "selections": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "bookId": {
                      "maxLength": 200,
                      "minLength": 1,
                      "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                      "type": "string"
                    },
                    "entityId": {
                      "maxLength": 200,
                      "minLength": 1,
                      "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                      "type": "string"
                    },
                    "eventId": {
                      "maxLength": 200,
                      "minLength": 1,
                      "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                      "type": "string"
                    },
                    "future": {
                      "const": true,
                      "type": "boolean"
                    },
                    "id": {
                      "maxLength": 200,
                      "minLength": 1,
                      "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                      "type": "string"
                    },
                    "jurisdiction": {
                      "maxLength": 32,
                      "minLength": 2,
                      "type": "string"
                    },
                    "label": {
                      "maxLength": 300,
                      "minLength": 1,
                      "type": "string"
                    },
                    "league": {
                      "anyOf": [
                        {
                          "maxLength": 200,
                          "minLength": 1,
                          "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "line": {
                      "anyOf": [
                        {
                          "pattern": "^-?\\d{1,8}(\\.\\d{1,4})?$",
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "market": {
                      "maxLength": 200,
                      "minLength": 1,
                      "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                      "type": "string"
                    },
                    "observedAt": {
                      "anyOf": [
                        {
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "oddsAmerican": {
                      "maximum": 1000000,
                      "minimum": -1000000,
                      "type": "integer"
                    },
                    "period": {
                      "anyOf": [
                        {
                          "maxLength": 200,
                          "minLength": 1,
                          "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "provider": {
                      "const": "manual",
                      "type": "string"
                    },
                    "quoteVersion": {
                      "anyOf": [
                        {
                          "maxLength": 200,
                          "minLength": 1,
                          "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "side": {
                      "maxLength": 200,
                      "minLength": 1,
                      "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                      "type": "string"
                    },
                    "sport": {
                      "maxLength": 200,
                      "minLength": 1,
                      "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                      "type": "string"
                    },
                    "startsAt": {
                      "anyOf": [
                        {
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "id",
                    "eventId",
                    "entityId",
                    "provider",
                    "sport",
                    "league",
                    "market",
                    "period",
                    "side",
                    "line",
                    "label",
                    "startsAt",
                    "bookId",
                    "jurisdiction",
                    "oddsAmerican",
                    "observedAt",
                    "quoteVersion"
                  ],
                  "type": "object"
                },
                "maxItems": 25,
                "minItems": 1,
                "type": "array"
              },
              "settlementTerms": {
                "additionalProperties": false,
                "properties": {
                  "cashSingle": {
                    "const": "win_loss_refund",
                    "type": "string"
                  },
                  "pushes": {
                    "enum": [
                      "refund",
                      "reprice",
                      "lose",
                      "unknown"
                    ],
                    "type": "string"
                  },
                  "reference": {
                    "anyOf": [
                      {
                        "maxLength": 500,
                        "minLength": 1,
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "source": {
                    "enum": [
                      "provider",
                      "book_document",
                      "user_reported",
                      "unknown"
                    ],
                    "type": "string"
                  },
                  "version": {
                    "anyOf": [
                      {
                        "maxLength": 200,
                        "minLength": 1,
                        "pattern": "^[a-zA-Z0-9_.:@/-]+$",
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "voids": {
                    "enum": [
                      "refund",
                      "reprice",
                      "unknown"
                    ],
                    "type": "string"
                  }
                },
                "required": [
                  "source",
                  "reference",
                  "version",
                  "pushes",
                  "voids"
                ],
                "type": "object"
              },
              "source": {
                "const": "manual",
                "type": "string"
              },
              "stakeMinor": {
                "maximum": 1000000000000,
                "minimum": 0,
                "type": "integer"
              }
            },
            "required": [
              "clientSlipId",
              "clientRevision",
              "source",
              "intent",
              "bookId",
              "currency",
              "stakeMinor",
              "selections",
              "confirmation",
              "offeredReturnMinor",
              "acceptedReturnMinor",
              "settlementTerms"
            ],
            "type": "object"
          },
          "ticketId": {
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
            "type": "string"
          },
          "version": {
            "const": "bsd-agent-grade-v1",
            "type": "string"
          }
        },
        "required": [
          "version",
          "action",
          "commandKey"
        ],
        "type": "object"
      },
      "name": "grade_slip",
      "title": "Grade a confirmed betslip"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "odds.read"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": true
      },
      "description": "Compare posted prices across books for each leg of a slip (main markets). Reports every book's quote, the best price for the bettor, and how much the user's own line gives up. Only ever describes books with real posted data; read-only, never places a wager.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "legs": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "book": {
                  "description": "The book the user is on (e.g. 'draftkings'), if known.",
                  "type": "string"
                },
                "odds": {
                  "description": "The american odds the user is on (e.g. -120), if known.",
                  "type": "number"
                },
                "query": {
                  "description": "Leg description, e.g. 'Yankees moneyline' or 'Brewers -1.5'.",
                  "type": "string"
                }
              },
              "required": [
                "query"
              ],
              "type": "object"
            },
            "maxItems": 12,
            "minItems": 1,
            "type": "array"
          }
        },
        "required": [
          "legs"
        ],
        "type": "object"
      },
      "name": "price_shop_slip",
      "title": "Price-shop a slip"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "tail.post"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "readOnlyHint": false
      },
      "description": "Send version bsd-agent-tail-v1. Preview a draft from either an owned saved Grade report (reportId, text, showStake, placement) or saved Doctor exchange (source doctor_exchange, threadId, messageId, text) through the app service. Publish only after showing the exact preview and getting the customer’s confirmation. For action publish reuse the same draft and previewBinding, pass confirmation PUBLISH_POST, placementConfirmation, fWarning and a stable commandKey. Publishing enters the app moderation queue; it is not a wager.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "enum": [
              "preview",
              "publish"
            ],
            "type": "string"
          },
          "commandKey": {
            "maxLength": 120,
            "minLength": 16,
            "type": "string"
          },
          "confirmation": {
            "const": "PUBLISH_POST",
            "type": "string"
          },
          "draft": {
            "additionalProperties": false,
            "description": "The exact app post draft: either a saved Grade report or a saved Doctor exchange.",
            "properties": {
              "messageId": {
                "description": "Saved Doctor reply in that thread.",
                "format": "uuid",
                "type": "string"
              },
              "placement": {
                "description": "Ticket post only.",
                "enum": [
                  "asking",
                  "self_reported_placed"
                ],
                "type": "string"
              },
              "pollOptions": {
                "items": {
                  "maxLength": 50,
                  "minLength": 1,
                  "type": "string"
                },
                "maxItems": 4,
                "minItems": 2,
                "type": "array"
              },
              "reportId": {
                "description": "Owned saved Grade job ID for a ticket post.",
                "format": "uuid",
                "type": "string"
              },
              "showStake": {
                "description": "Ticket post only.",
                "type": "boolean"
              },
              "source": {
                "const": "doctor_exchange",
                "type": "string"
              },
              "text": {
                "maxLength": 280,
                "type": "string"
              },
              "threadId": {
                "description": "Owned Doctor thread for an exchange post.",
                "format": "uuid",
                "type": "string"
              }
            },
            "required": [
              "text"
            ],
            "type": "object"
          },
          "fWarning": {
            "enum": [
              "acknowledge",
              "dont_ask_again",
              null
            ],
            "type": [
              "string",
              "null"
            ]
          },
          "placementConfirmation": {
            "enum": [
              "NOT_PLACED",
              "SELF_REPORTED_PLACED"
            ],
            "type": "string"
          },
          "previewBinding": {
            "pattern": "^[a-f0-9]{64}$",
            "type": "string"
          },
          "version": {
            "const": "bsd-agent-tail-v1",
            "type": "string"
          }
        },
        "required": [
          "version",
          "action",
          "draft"
        ],
        "type": "object"
      },
      "name": "tail_post",
      "title": "Preview or publish to Tail"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "tail.read"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": true
      },
      "description": "Send version bsd-agent-tail-v1 and action feed (optional feed/profileId/listId/search/limit/cursor) or post (postId). Read the same account-filtered Tail feed or one visible post as the BSD app. Moderation, follows, mutes, private lists and cursor binding use the app service.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "action": {
            "enum": [
              "feed",
              "post"
            ],
            "type": "string"
          },
          "cursor": {
            "maxLength": 1500,
            "type": "string"
          },
          "feed": {
            "enum": [
              "community",
              "for_you",
              "following",
              "own",
              "profile",
              "bookmarks",
              "list"
            ],
            "type": "string"
          },
          "limit": {
            "maximum": 25,
            "minimum": 1,
            "type": "integer"
          },
          "listId": {
            "format": "uuid",
            "type": "string"
          },
          "postId": {
            "format": "uuid",
            "type": "string"
          },
          "profileId": {
            "format": "uuid",
            "type": "string"
          },
          "search": {
            "maxLength": 100,
            "type": "string"
          },
          "version": {
            "const": "bsd-agent-tail-v1",
            "type": "string"
          }
        },
        "required": [
          "version",
          "action"
        ],
        "type": "object"
      },
      "name": "tail_read",
      "title": "Read Tail"
    },
    {
      "_meta": {
        "securitySchemes": [
          {
            "scopes": [
              "slips.track"
            ],
            "type": "oauth2"
          }
        ]
      },
      "annotations": {
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false,
        "readOnlyHint": false
      },
      "description": "Create or revise one of the authenticated user's ticket trees. This stores truth state only; it never places, prepares, or hands off a wager.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "client_mutation_id": {
            "description": "Caller-generated idempotency key.",
            "maxLength": 160,
            "minLength": 1,
            "type": "string"
          },
          "expected_revision": {
            "description": "Required with ticket_id; stale writes fail with a conflict.",
            "minimum": 1,
            "type": "integer"
          },
          "ticket": {
            "description": "BSD two-level BetTicketContract. SGP children stay nested under one outer pick.",
            "type": "object"
          },
          "ticket_id": {
            "description": "Server ticket id when revising an existing tracked slip.",
            "type": "string"
          }
        },
        "required": [
          "client_mutation_id",
          "ticket"
        ],
        "type": "object"
      },
      "name": "track_slip",
      "title": "Track a slip"
    }
  ]
}
