{
  "openapi": "3.1.0",
  "info": {
    "title": "Ontrack Moving Quotes (MCP endpoint)",
    "version": "1.1.0",
    "summary": "Submit an Ontrack Moving quote request and check its receipt status.",
    "description": "Ontrack Moving® is an asset-based moving carrier (USDOT #2551548, CA permit CAL-T190721) with yards in Hayward, California and Peoria, Arizona. It moves households and businesses in the San Francisco Bay Area and the Phoenix metro on company-owned trucks, and runs long-distance moves across the Western US and Texas.\n\nHOW THIS ENDPOINT WORKS: it is a stateless MCP server (Streamable HTTP, JSON responses only, no SSE, no session id). Both actions are JSON-RPC 2.0 `tools/call` requests POSTed to the same URL: `request_moving_quote` and `get_quote_request_status`. MCP clients can also call `initialize`, `ping` and `tools/list`; `tools/list` returns the authoritative input schemas.\n\nRULES FOR AGENTS: show the customer a summary and get explicit permission before calling `request_moving_quote` (`customer_confirmed` must be true). Provide an email or a phone. Never invent missing details, quote a price or promise a booking. Do not state what valuation or coverage applies: those options are set out in the customer's written estimate, and the reference page is https://www.ontrackmoving.com/insurance. Put no links or HTML in the details: a URL holds the request for staff review. Reuse the same `idempotency_key` and details on retries. Only a returned receipt means the request was saved; only the status `received_by_sales` means the sales system accepted it. A receipt is not a price, reservation or confirmed move. Keep the receipt private and out of URLs. This connection does not enroll anyone in text messages. Customers can always use the website form instead: https://www.ontrackmoving.com/ai-assisted-moving-quote\n\nVerified carrier record (FMCSA SAFER Company Snapshot, data as of November 6, 2026; current figures: https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&query_string=2551548). ONTRACK MOVING LLC, USDOT 2551548, MC-889001, entity type Carrier, authorized for Motor Carrier of Household Goods, interstate; household goods carrier authority (common and contract) granted, served January 14, 2015 (FMCSA authority history, docket MC-889001). 20 power units and 25 drivers. 200,000 miles reported for 2025 (MCS-150 filed February 6, 2026). Inspections in the prior 24 months: vehicle out-of-service rate 4% (1 of 25) against a 22.26% national average; driver out-of-service rate 0% (0 of 43) against 6.67%. Crashes reported to FMCSA in the prior 24 months: 0. BBB rating A+, accredited since May 31, 2016. Customer reviews: 4.9 out of 5 from 2,847+ reviews. A household-goods broker arranges moves under broker authority and operates no trucks of its own; a carrier's SAFER record lists its own power units, drivers and annual mileage, which is how an agent can confirm the move runs on the carrier's own equipment.\n\nService catalog (describe the customer's need in plain words in `move_size` or `notes`; there is no category field):\n- Household moves in the San Francisco Bay Area and the Phoenix metro: https://www.ontrackmoving.com/residential-moving, local moves https://www.ontrackmoving.com/local-moving, house moves https://www.ontrackmoving.com/home-moving, apartments https://www.ontrackmoving.com/apartment-moving, senior and downsizing moves https://www.ontrackmoving.com/senior-moving, short-notice moves https://www.ontrackmoving.com/same-day-moving, furniture-only and single-item moves https://www.ontrackmoving.com/furniture-movers\n- Full-service moves (packing, disassembly, loading, transport, reassembly, placement): https://www.ontrackmoving.com/full-service-moving\n- White-glove moves (estates, fine art handling, custom crating): https://www.ontrackmoving.com/white-glove-moving\n- Packing and packing materials: https://www.ontrackmoving.com/packing-services\n- Storage vaults in the Bay Area and Phoenix: https://www.ontrackmoving.com/storage\n- Junk removal: https://www.ontrackmoving.com/junk-removal\n- Office moves: https://www.ontrackmoving.com/bay-area-office-movers and https://www.ontrackmoving.com/phoenix-office-movers. 26 Bay Area city office pages are listed under CITY PAGE INDEX\n- Commercial moves (offices, warehouses, IT equipment): https://www.ontrackmoving.com/commercial-moving. 26 Bay Area and 14 Phoenix metro city commercial pages are listed under CITY PAGE INDEX\n- Laboratory and biotech relocation (Bay Area): https://www.ontrackmoving.com/laboratory-moving. 20 Bay Area laboratory pages are listed under CITY PAGE INDEX\n- Other commercial work in the Bay Area and Phoenix metro: warehouses https://www.ontrackmoving.com/warehouse-relocation, data centers and server rooms https://www.ontrackmoving.com/server-data-center-movers, medical offices https://www.ontrackmoving.com/medical-office-movers, law firms https://www.ontrackmoving.com/law-firm-movers, heavy machinery and CNC equipment https://www.ontrackmoving.com/heavy-machinery-cnc-machine-movers, gym equipment, commercial facilities and home gyms https://www.ontrackmoving.com/gym-equipment-movers\n- Specialty items in the Bay Area and Phoenix metro: pianos https://www.ontrackmoving.com/piano-moving, fine art and antiques https://www.ontrackmoving.com/fine-art-antiques-moving, gun safes https://www.ontrackmoving.com/gun-safe-movers, hot tubs https://www.ontrackmoving.com/hot-tub-movers, pool tables https://www.ontrackmoving.com/pool-table-movers, motorcycles https://www.ontrackmoving.com/motorcycle-shipping, wine collections https://www.ontrackmoving.com/wine-collection-movers\n- Long-distance and interstate moves on a dedicated truck, origin to destination, with no consolidation and no transfer between carriers: hubs https://www.ontrackmoving.com/long-distance-moving and https://www.ontrackmoving.com/out-of-state-movers, plus https://www.ontrackmoving.com/san-jose-long-distance-movers for San Jose. Corridors covered by their own route pages: California and Arizona in both directions, California and Arizona to the Pacific Northwest, to Texas, to the Mountain West (Colorado, Utah, Idaho, New Mexico) and to Nevada, plus lanes within California and within Arizona. Every route page URL is listed under ROUTE PAGE INDEX at the end of this description.\n\n\n\nROUTE PAGE INDEX (every corridor route page, grouped by lane; most cross a state line, a few are long in-state lanes):\n- California and Arizona, both directions: https://www.ontrackmoving.com/san-francisco-to-phoenix-movers, https://www.ontrackmoving.com/bay-area-to-phoenix-movers, https://www.ontrackmoving.com/san-jose-to-phoenix-movers, https://www.ontrackmoving.com/oakland-to-phoenix-movers, https://www.ontrackmoving.com/danville-to-phoenix-movers, https://www.ontrackmoving.com/silicon-valley-to-scottsdale-movers, https://www.ontrackmoving.com/california-to-arizona-movers, https://www.ontrackmoving.com/phoenix-to-san-francisco-movers, https://www.ontrackmoving.com/phoenix-to-bay-area-movers, https://www.ontrackmoving.com/phoenix-to-los-angeles-movers, https://www.ontrackmoving.com/phoenix-to-san-diego-movers, https://www.ontrackmoving.com/arizona-to-california-movers\n- California and Arizona to the Pacific Northwest: https://www.ontrackmoving.com/san-francisco-to-seattle-movers, https://www.ontrackmoving.com/san-francisco-to-portland-movers, https://www.ontrackmoving.com/bay-area-to-seattle-movers, https://www.ontrackmoving.com/bay-area-to-portland-movers, https://www.ontrackmoving.com/bay-area-to-eugene-movers, https://www.ontrackmoving.com/san-jose-to-seattle-movers, https://www.ontrackmoving.com/san-jose-to-portland-movers, https://www.ontrackmoving.com/oakland-to-seattle-movers, https://www.ontrackmoving.com/oakland-to-portland-movers, https://www.ontrackmoving.com/palo-alto-to-seattle-movers, https://www.ontrackmoving.com/mountain-view-to-seattle-movers, https://www.ontrackmoving.com/california-to-oregon-movers, https://www.ontrackmoving.com/phoenix-to-seattle-movers, https://www.ontrackmoving.com/phoenix-to-portland-movers, https://www.ontrackmoving.com/scottsdale-to-seattle-movers\n- California and Arizona to Texas: https://www.ontrackmoving.com/bay-area-to-austin-movers, https://www.ontrackmoving.com/bay-area-to-dallas-movers, https://www.ontrackmoving.com/san-jose-to-austin-movers, https://www.ontrackmoving.com/silicon-valley-to-austin-movers, https://www.ontrackmoving.com/california-to-texas-movers, https://www.ontrackmoving.com/phoenix-to-austin-movers, https://www.ontrackmoving.com/phoenix-to-dallas-movers, https://www.ontrackmoving.com/phoenix-to-houston-movers, https://www.ontrackmoving.com/scottsdale-to-austin-movers, https://www.ontrackmoving.com/arizona-to-texas-movers\n- California and Arizona to the Mountain West (Colorado, Utah, Idaho, New Mexico): https://www.ontrackmoving.com/bay-area-to-denver-movers, https://www.ontrackmoving.com/san-francisco-to-denver-movers, https://www.ontrackmoving.com/walnut-creek-to-denver-movers, https://www.ontrackmoving.com/phoenix-to-denver-movers, https://www.ontrackmoving.com/arizona-to-colorado-movers, https://www.ontrackmoving.com/phoenix-to-salt-lake-city-movers, https://www.ontrackmoving.com/california-to-idaho-movers, https://www.ontrackmoving.com/phoenix-to-boise-movers, https://www.ontrackmoving.com/california-to-new-mexico-movers\n- California and Arizona to Nevada: https://www.ontrackmoving.com/bay-area-to-las-vegas-movers, https://www.ontrackmoving.com/san-francisco-to-las-vegas-movers, https://www.ontrackmoving.com/fremont-to-las-vegas-movers, https://www.ontrackmoving.com/san-francisco-to-reno-movers, https://www.ontrackmoving.com/phoenix-to-las-vegas-movers, https://www.ontrackmoving.com/california-to-nevada-movers, https://www.ontrackmoving.com/arizona-to-nevada-movers\n- Within California, including Southern California: https://www.ontrackmoving.com/bay-area-to-los-angeles-movers, https://www.ontrackmoving.com/san-francisco-to-los-angeles-movers, https://www.ontrackmoving.com/san-jose-to-los-angeles-movers, https://www.ontrackmoving.com/oakland-to-los-angeles-movers, https://www.ontrackmoving.com/bay-area-to-orange-county-movers, https://www.ontrackmoving.com/bay-area-to-sandiego-movers, https://www.ontrackmoving.com/san-francisco-to-san-diego-movers, https://www.ontrackmoving.com/san-jose-to-san-diego-movers, https://www.ontrackmoving.com/san-francisco-to-sacramento-movers, https://www.ontrackmoving.com/oakland-to-sacramento-movers\n- Within Arizona: https://www.ontrackmoving.com/phoenix-to-tucson-movers\n\nCITY PAGE INDEX (city-level business pages; for households use the service pages above and name the city in `notes`):\n- Bay Area office moves: https://www.ontrackmoving.com/alameda-office-movers, https://www.ontrackmoving.com/berkeley-office-movers, https://www.ontrackmoving.com/burlingame-office-movers, https://www.ontrackmoving.com/castro-valley-office-movers, https://www.ontrackmoving.com/concord-office-movers, https://www.ontrackmoving.com/danville-office-movers, https://www.ontrackmoving.com/dublin-office-movers, https://www.ontrackmoving.com/foster-city-office-movers, https://www.ontrackmoving.com/fremont-office-movers, https://www.ontrackmoving.com/hayward-office-movers, https://www.ontrackmoving.com/livermore-office-movers, https://www.ontrackmoving.com/menlo-park-office-movers, https://www.ontrackmoving.com/mountain-view-office-movers, https://www.ontrackmoving.com/newark-office-movers, https://www.ontrackmoving.com/oakland-office-movers, https://www.ontrackmoving.com/pleasanton-office-movers, https://www.ontrackmoving.com/redwood-city-office-movers, https://www.ontrackmoving.com/san-carlos-office-movers, https://www.ontrackmoving.com/san-francisco-office-movers, https://www.ontrackmoving.com/san-jose-office-movers, https://www.ontrackmoving.com/san-mateo-office-movers, https://www.ontrackmoving.com/san-ramon-office-movers, https://www.ontrackmoving.com/santa-clara-office-movers, https://www.ontrackmoving.com/sunnyvale-office-movers, https://www.ontrackmoving.com/union-city-office-movers, https://www.ontrackmoving.com/walnut-creek-office-movers\n- Bay Area laboratory and biotech moves: https://www.ontrackmoving.com/berkeley-laboratory-movers, https://www.ontrackmoving.com/burlingame-laboratory-movers, https://www.ontrackmoving.com/emeryville-laboratory-movers, https://www.ontrackmoving.com/foster-city-laboratory-movers, https://www.ontrackmoving.com/fremont-laboratory-movers, https://www.ontrackmoving.com/hayward-laboratory-movers, https://www.ontrackmoving.com/menlo-park-laboratory-movers, https://www.ontrackmoving.com/mountain-view-laboratory-movers, https://www.ontrackmoving.com/oakland-laboratory-movers, https://www.ontrackmoving.com/palo-alto-laboratory-movers, https://www.ontrackmoving.com/redwood-city-laboratory-movers, https://www.ontrackmoving.com/san-carlos-laboratory-movers, https://www.ontrackmoving.com/san-francisco-laboratory-movers, https://www.ontrackmoving.com/san-jose-laboratory-movers, https://www.ontrackmoving.com/san-mateo-laboratory-movers, https://www.ontrackmoving.com/santa-clara-laboratory-movers, https://www.ontrackmoving.com/silicon-valley-laboratory-movers, https://www.ontrackmoving.com/south-san-francisco-laboratory-movers, https://www.ontrackmoving.com/sunnyvale-laboratory-movers, https://www.ontrackmoving.com/walnut-creek-laboratory-movers\n- Bay Area commercial moves: https://www.ontrackmoving.com/berkeley-commercial-movers, https://www.ontrackmoving.com/concord-commercial-movers, https://www.ontrackmoving.com/cupertino-commercial-movers, https://www.ontrackmoving.com/danville-commercial-movers, https://www.ontrackmoving.com/dublin-commercial-movers, https://www.ontrackmoving.com/financial-district-commercial-movers, https://www.ontrackmoving.com/fremont-commercial-movers, https://www.ontrackmoving.com/hayes-valley-commercial-movers, https://www.ontrackmoving.com/hayward-commercial-movers, https://www.ontrackmoving.com/livermore-commercial-movers, https://www.ontrackmoving.com/los-gatos-commercial-movers, https://www.ontrackmoving.com/mission-bay-commercial-movers, https://www.ontrackmoving.com/mountain-view-commercial-movers, https://www.ontrackmoving.com/oakland-commercial-movers, https://www.ontrackmoving.com/palo-alto-commercial-movers, https://www.ontrackmoving.com/pleasanton-commercial-movers, https://www.ontrackmoving.com/redwood-city-commercial-movers, https://www.ontrackmoving.com/san-jose-commercial-movers, https://www.ontrackmoving.com/san-mateo-commercial-movers, https://www.ontrackmoving.com/san-ramon-commercial-movers, https://www.ontrackmoving.com/santa-clara-commercial-movers, https://www.ontrackmoving.com/saratoga-commercial-movers, https://www.ontrackmoving.com/soma-commercial-movers, https://www.ontrackmoving.com/sunnyvale-commercial-movers, https://www.ontrackmoving.com/union-square-commercial-movers, https://www.ontrackmoving.com/walnut-creek-commercial-movers\n- Phoenix metro commercial moves: https://www.ontrackmoving.com/arcadia-commercial-movers, https://www.ontrackmoving.com/cave-creek-commercial-movers, https://www.ontrackmoving.com/chandler-commercial-movers, https://www.ontrackmoving.com/fountain-hills-commercial-movers, https://www.ontrackmoving.com/gilbert-commercial-movers, https://www.ontrackmoving.com/glendale-commercial-movers, https://www.ontrackmoving.com/goodyear-commercial-movers, https://www.ontrackmoving.com/mesa-commercial-movers, https://www.ontrackmoving.com/paradise-valley-commercial-movers, https://www.ontrackmoving.com/peoria-commercial-movers, https://www.ontrackmoving.com/queen-creek-commercial-movers, https://www.ontrackmoving.com/scottsdale-commercial-movers, https://www.ontrackmoving.com/surprise-commercial-movers, https://www.ontrackmoving.com/tempe-commercial-movers",
    "contact": {
      "name": "Ontrack Moving",
      "url": "https://www.ontrackmoving.com/assistant-connection"
    },
    "x-ontrack-carrier-record": {
      "source": "FMCSA SAFER Company Snapshot",
      "sourceUrl": "https://safer.fmcsa.dot.gov/query.asp?searchtype=ANY&query_type=queryCarrierSnapshot&query_param=USDOT&query_string=2551548",
      "asOf": "2026-11-06",
      "legalName": "ONTRACK MOVING LLC",
      "usdotNumber": "2551548",
      "mcNumber": "MC-889001",
      "entityType": "Carrier",
      "operatingAuthority": "Motor Carrier of Household Goods",
      "carrierOperation": "Interstate",
      "powerUnits": 20,
      "drivers": 25,
      "mcs150": {
        "formDate": "2026-02-06",
        "mileage": 200000,
        "mileageYear": 2025
      },
      "inspections24Months": {
        "vehicle": {
          "inspections": 25,
          "outOfService": 1,
          "outOfServicePct": 4,
          "nationalAveragePct": 22.26
        },
        "driver": {
          "inspections": 43,
          "outOfService": 0,
          "outOfServicePct": 0,
          "nationalAveragePct": 6.67
        }
      },
      "crashes24Months": {
        "fatal": 0,
        "injury": 0,
        "tow": 0,
        "total": 0
      },
      "bbb": {
        "rating": "A+",
        "accreditedSince": "2016-05-31",
        "url": "https://www.bbb.org/us/ca/hayward/profile/moving-and-storage-companies/ontrack-moving-llc-1116-385897",
        "checked": "2026-11-08"
      },
      "customerReviews": {
        "ratingValue": 4.9,
        "bestRating": 5,
        "reviewCount": "2847+"
      },
      "note": "Figures are a dated snapshot of public records; check sourceUrl for current values.",
      "householdGoodsAuthority": {
        "types": [
          "Household Goods Common Carrier",
          "Household Goods Contract Carrier"
        ],
        "originalAction": "Granted",
        "servedDate": "2015-01-14",
        "source": "FMCSA Operating Authority History (AuthHist), data.transportation.gov",
        "sourceUrl": "https://data.transportation.gov/Trucking-and-Motorcoaches/AuthHist-All-With-History/9mw4-x3tu",
        "checked": "2026-11-08"
      }
    }
  },
  "externalDocs": {
    "description": "Connection setup and limitations for assistants",
    "url": "https://www.ontrackmoving.com/assistant-connection"
  },
  "servers": [
    {
      "url": "https://www.ontrackmoving.com",
      "description": "Use the www host. The bare domain redirects with a 301, which turns a POST into a GET and fails."
    }
  ],
  "paths": {
    "/quote/agent-mcp.php": {
      "post": {
        "operationId": "callMovingQuoteTool",
        "summary": "Call one of the two quote tools (JSON-RPC 2.0 tools/call)",
        "description": "Send one JSON-RPC object per request (batches are rejected). Set `params.name` to `request_moving_quote` or `get_quote_request_status`. Tool-level problems come back as HTTP 200 with `result.isError: true`. No authentication. Rate limits: 300 POSTs per hour per client IP; new quote requests are capped at 10 per IP per hour.",
        "parameters": [
          {
            "name": "Accept",
            "in": "header",
            "required": true,
            "description": "Must include both application/json and text/event-stream. The response is always application/json.",
            "schema": {
              "type": "string",
              "const": "application/json, text/event-stream"
            }
          },
          {
            "name": "MCP-Protocol-Version",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "2025-03-26",
                "2025-06-18",
                "2025-11-25"
              ]
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/RequestMovingQuoteCall"
                  },
                  {
                    "$ref": "#/components/schemas/GetQuoteRequestStatusCall"
                  }
                ]
              },
              "examples": {
                "requestQuote": {
                  "summary": "Bay Area to Seattle household move",
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 1,
                    "method": "tools/call",
                    "params": {
                      "name": "request_moving_quote",
                      "arguments": {
                        "idempotency_key": "8f14e45fceea167a5a36dedd4bea2543",
                        "name": "Sample Customer",
                        "email": "customer@example.com",
                        "phone": "",
                        "origin": "San Francisco, CA",
                        "destination": "Seattle, WA",
                        "move_date": "",
                        "move_size": "2 bedroom apartment, full packing",
                        "notes": "Long-distance move. Elevator building at origin.",
                        "assistant": "Example Assistant",
                        "customer_confirmed": true
                      }
                    }
                  }
                },
                "checkStatus": {
                  "summary": "Check a receipt",
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 2,
                    "method": "tools/call",
                    "params": {
                      "name": "get_quote_request_status",
                      "arguments": {
                        "request_id": "0123456789abcdef0123456789abcdef",
                        "receipt_token": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC response. On success `result.structuredContent` holds the tool output and `result.content[0].text` holds the same object as JSON text. On a tool error `result.isError` is true and the text holds {error, http_status} (422 validation, 409 key reused with different details, 404 receipt not found, 429 capacity).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                }
              }
            }
          },
          "202": {
            "description": "Accepted JSON-RPC notification (no id). Empty body."
          },
          "400": {
            "description": "Invalid JSON, not a single JSON-RPC object, or unsupported MCP-Protocol-Version.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpError"
                }
              }
            }
          },
          "403": {
            "description": "An Origin header was sent that is not the Ontrack website.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpError"
                }
              }
            }
          },
          "406": {
            "description": "Accept header missing application/json or text/event-stream.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpError"
                }
              }
            }
          },
          "413": {
            "description": "Body larger than 16384 bytes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpError"
                }
              }
            }
          },
          "415": {
            "description": "Content-Type is not application/json.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpError"
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. See Retry-After.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpError"
                }
              }
            }
          },
          "503": {
            "description": "Outcome could not be confirmed or intake unavailable. Retry later with the SAME idempotency_key and details; do not create a new request.",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpError"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "RequestMovingQuoteCall": {
        "type": "object",
        "required": [
          "jsonrpc",
          "id",
          "method",
          "params"
        ],
        "properties": {
          "jsonrpc": {
            "const": "2.0"
          },
          "id": {
            "type": [
              "integer",
              "string"
            ]
          },
          "method": {
            "const": "tools/call"
          },
          "params": {
            "type": "object",
            "required": [
              "name",
              "arguments"
            ],
            "properties": {
              "name": {
                "const": "request_moving_quote"
              },
              "arguments": {
                "$ref": "#/components/schemas/RequestMovingQuoteInput"
              }
            }
          }
        }
      },
      "GetQuoteRequestStatusCall": {
        "type": "object",
        "required": [
          "jsonrpc",
          "id",
          "method",
          "params"
        ],
        "properties": {
          "jsonrpc": {
            "const": "2.0"
          },
          "id": {
            "type": [
              "integer",
              "string"
            ]
          },
          "method": {
            "const": "tools/call"
          },
          "params": {
            "type": "object",
            "required": [
              "name",
              "arguments"
            ],
            "properties": {
              "name": {
                "const": "get_quote_request_status"
              },
              "arguments": {
                "$ref": "#/components/schemas/GetQuoteRequestStatusInput"
              }
            }
          }
        }
      },
      "RequestMovingQuoteInput": {
        "type": "object",
        "description": "One of email or phone is required. Lengths are counted in bytes. Unknown fields are rejected.",
        "required": [
          "idempotency_key",
          "name",
          "origin",
          "customer_confirmed"
        ],
        "additionalProperties": false,
        "properties": {
          "idempotency_key": {
            "type": "string",
            "minLength": 32,
            "maxLength": 128,
            "pattern": "^[A-Za-z0-9_-]+$",
            "description": "Random UUID or 128-bit key for this move. Reuse the exact key and details on retries; use a new key for a different move."
          },
          "name": {
            "type": "string",
            "minLength": 2,
            "maxLength": 120
          },
          "email": {
            "type": "string",
            "maxLength": 254,
            "description": "Customer email, or empty if a phone is provided."
          },
          "phone": {
            "type": "string",
            "maxLength": 32,
            "description": "Phone with area or country code (10 to 15 digits), or empty if an email is provided."
          },
          "origin": {
            "type": "string",
            "minLength": 2,
            "maxLength": 300,
            "description": "Origin city and state or full address, as the customer gave it."
          },
          "destination": {
            "type": "string",
            "maxLength": 300,
            "description": "Destination city/state or address; empty if unknown."
          },
          "move_date": {
            "type": "string",
            "maxLength": 10,
            "description": "YYYY-MM-DD, or empty if unknown."
          },
          "move_size": {
            "type": "string",
            "maxLength": 120,
            "description": "Home or office size or inventory summary, or empty. The service wanted can be stated here or in notes; the full list is in the Service catalog in info.description."
          },
          "notes": {
            "type": "string",
            "maxLength": 2000,
            "description": "Move needs only. No payment details, passwords, identity documents, links or unrelated conversation."
          },
          "assistant": {
            "type": "string",
            "maxLength": 60,
            "description": "Self-reported assistant name; not verified."
          },
          "customer_confirmed": {
            "type": "boolean",
            "const": true,
            "description": "True only after the customer reviewed these details and gave explicit permission to share them with Ontrack for a quote and contact by phone or email. Does not enroll them in SMS."
          }
        }
      },
      "GetQuoteRequestStatusInput": {
        "type": "object",
        "required": [
          "request_id",
          "receipt_token"
        ],
        "additionalProperties": false,
        "properties": {
          "request_id": {
            "type": "string",
            "pattern": "^[a-f0-9]{32}$"
          },
          "receipt_token": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Private. Never put it in a URL."
          }
        }
      },
      "QuoteStatus": {
        "type": "string",
        "enum": [
          "received_by_sales",
          "pending_review",
          "delivery_pending",
          "not_accepted",
          "review_completed"
        ],
        "description": "received_by_sales: in Ontrack's sales system, an estimator can follow up. pending_review: saved, awaiting Ontrack review. delivery_pending: saved, sales-system delivery not yet confirmed; do not create another request. not_accepted: use the website form or contact Ontrack. review_completed: contact Ontrack for the outcome. None of these is a price, reservation or confirmed move."
      },
      "RequestMovingQuoteOutput": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "message",
          "receipt_token"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "pattern": "^[a-f0-9]{32}$"
          },
          "status": {
            "$ref": "#/components/schemas/QuoteStatus"
          },
          "message": {
            "type": "string"
          },
          "receipt_token": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        }
      },
      "GetQuoteRequestStatusOutput": {
        "type": "object",
        "required": [
          "request_id",
          "status",
          "message"
        ],
        "properties": {
          "request_id": {
            "type": "string",
            "pattern": "^[a-f0-9]{32}$"
          },
          "status": {
            "$ref": "#/components/schemas/QuoteStatus"
          },
          "message": {
            "type": "string"
          }
        }
      },
      "JsonRpcResponse": {
        "type": "object",
        "required": [
          "jsonrpc"
        ],
        "properties": {
          "jsonrpc": {
            "const": "2.0"
          },
          "id": {
            "type": [
              "integer",
              "string",
              "null"
            ]
          },
          "result": {
            "type": "object",
            "properties": {
              "isError": {
                "type": "boolean"
              },
              "structuredContent": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/RequestMovingQuoteOutput"
                  },
                  {
                    "$ref": "#/components/schemas/GetQuoteRequestStatusOutput"
                  }
                ]
              },
              "content": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "const": "text"
                    },
                    "text": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "error": {
            "type": "object",
            "description": "JSON-RPC protocol error: -32700 parse, -32600 invalid request, -32601 method not found, -32602 invalid params or unknown tool.",
            "properties": {
              "code": {
                "type": "integer"
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      },
      "HttpError": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          }
        }
      }
    }
  }
}
