MCP-Server

SecondAppraisal Total-Loss Intake

com.secondappraisal/total-loss-intake
Finanzen & Investieren Recht & Compliance Öffentlich und erreichbar MCP 2026-07-28

Was dieses MCP kann

Provides preliminary vehicle total-loss market comparisons, state-specific rules, valuation-report processing, and consent-based intake submission.

get_intake_status
Check an intake
Fetch the current receipt for a submitted intake (status, confirm link while still confirmable, preliminary).
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['intake_id', 'poll_token'], 'properties': {'intake_id': {'type': 'string', 'minLength': 1, 'description': 'The `intake_id` from a previous submission.'}, 'poll_token': {'type': 'string', 'minLength': 1, 'description': 'The `poll_token` returned once on that submission.'}}, 'additionalProperties': False}
get_preliminary_estimate
Preliminary market read
A no-commitment early market read for a vehicle: comparable listing prices near the customer (10th percentile / median / 90th), an odometer-adjusted mid, and the gap vs the insurer's offer. Not an appraisal. Nothing is stored about the customer.
Nur Lesen Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['year', 'make', 'model'], 'properties': {'zip': {'type': 'string', 'pattern': '^\\d{5}(-\\d{4})?$', 'description': 'Preferred; searches comparables near here.'}, 'make': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'trim': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'year': {'type': 'integer', 'maximum': 2100, 'minimum': 1900}, 'model': {'type': 'string', 'maxLength': 80, 'minLength': 1}, 'state': {'type': 'string', 'maxLength': 2, 'minLength': 2, 'description': 'Two-letter state; used when no zip is given.'}, 'odometer': {'type': 'integer', 'maximum': 2000000, 'minimum': 0}, 'acv_offer_cents': {'type': 'integer', 'minimum': 0, 'description': "Insurer's offer in cents, to report the gap."}}, 'additionalProperties': False}
get_state_total_loss_rules
State total-loss rules
State-specific total-loss facts: threshold and method, whether an independent appraiser must be licensed there, whether third-party appraisals are allowed, statute citations, must-know rights, common pitfalls, and the consumer hotline.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', 'required': ['state'], 'properties': {'state': {'type': 'string', 'maxLength': 40, 'minLength': 2, 'description': 'Two-letter code (TX) or state name (Texas).'}}, 'additionalProperties': False}
submit_total_loss_intake
Submit a total-loss situation
Submit a vehicle owner's total-loss situation to SecondAppraisal on their behalf. Minimum: one of customer.phone / customer.email, your `agent` self-identification, and a `consent.attestation`. Returns a receipt with `customer_confirmation_url` (one tap confirms), a relayable `customer_message`, an optional `preliminary` market read, `contact_policy` (we will email/text a welcome and a person will call to confirm the request came from the customer or their agent), and `pricing` — the consultation is free; if the owner wants more, Appraisal Research is $199 (paid up front, no guarantee) or Appraisal Research + Negotiation is $495 with a $25 discount for customers you send ($470; a card HOLD captured only after the settlement improves by $1,000+, otherwise nothing is charged). The $25 applies to representation only. You may quote `pricing` verbatim; payment always happens on our site by the customer's own click (`checkout` links appear once they have confirmed) — never collect card details. Read `customer_message` to the user verbatim.
Destruktiv Externer Zugriff Idempotent
Eingabeschema
{'type': 'object', 'required': ['agent', 'customer', 'consent'], 'properties': {'loss': {'type': 'object', 'properties': {'zip': {'type': 'string', 'pattern': '^\\d{5}(-\\d{4})?$', 'description': 'US ZIP code (5 or 5+4). Used to search comparable vehicles near the customer.'}, 'loss_state': {'type': 'string', 'maxLength': 2, 'minLength': 2, 'description': 'State where the loss occurred / the policy is written.'}, 'date_of_loss': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Calendar date, YYYY-MM-DD.'}, 'insurance_path': {'enum': ['own', 'at-fault', 'unknown', 'none'], 'type': 'string', 'description': "Whose insurance is handling it: own (customer's carrier), at-fault (the other driver's carrier), unknown, or none (no insurance claim — valuation only)."}}, 'description': 'When and where the loss happened.', 'additionalProperties': False}, 'agent': {'type': 'object', 'required': ['name', 'platform'], 'properties': {'name': {'allOf': [{'type': 'string', 'maxLength': 120}, {'type': 'string', 'maxLength': 120, 'minLength': 1}], 'description': 'Human-readable name of the agent or product submitting on the customer\'s behalf (e.g. "OpenClaw", "Acme Claims Copilot"). Shown to the customer.'}, 'version': {'type': 'string', 'maxLength': 60, 'minLength': 1, 'description': 'Agent / integration version string.'}, 'platform': {'type': 'string', 'pattern': '^[a-z0-9][a-z0-9-]{0,59}$', 'description': 'Platform slug for attribution. Known values: openclaw, chatgpt, claude, gemini, copilot, perplexity, custom. Any lowercase slug is accepted.'}, 'operator_url': {'type': 'string', 'format': 'uri', 'maxLength': 300, 'description': 'Homepage or documentation URL of the agent operator.'}}, 'description': 'Who is calling. Required — an intake without self-identification is refused.', 'additionalProperties': False}, 'offer': {'type': 'object', 'properties': {'insurer': {'allOf': [{'type': 'string', 'maxLength': 120}, {'type': 'string', 'maxLength': 120, 'minLength': 1}], 'description': 'Insurance company handling the total loss.'}, 'acv_offer': {'type': 'number', 'maximum': 1000000, 'minimum': 0, 'description': "Insurer's Actual Cash Value offer in dollars. Converted to cents server-side."}, 'claim_number': {'type': 'string', 'maxLength': 60, 'minLength': 1}, 'acv_offer_cents': {'type': 'integer', 'maximum': 100000000, 'minimum': 0, 'description': "Insurer's Actual Cash Value offer in cents. `acv_offer` (dollars) is also accepted."}}, 'description': "The insurer's position so far, if any.", 'additionalProperties': False}, 'consent': {'type': 'object', 'required': ['attestation'], 'properties': {'mode': {'enum': ['customer_directed', 'warm_handoff'], 'type': 'string', 'default': 'customer_directed', 'description': 'customer_directed: the customer asked their agent to submit this. warm_handoff: a registered agent attests the customer asked to be contacted now (priority callback; requires an API key).'}, 'attestation': {'type': 'string', 'maxLength': 1000, 'minLength': 20, 'description': "The agent's attestation, in its own words, that the customer asked for this submission and knows SecondAppraisal will email/text and call to confirm. Stored verbatim on the intake."}, 'attestor_name': {'allOf': [{'type': 'string', 'maxLength': 120}, {'type': 'string', 'maxLength': 120, 'minLength': 1}], 'description': 'Who is attesting (the agent, or the person operating it).'}, 'notify_customer': {'type': 'boolean', 'default': True, 'description': 'true (default): we send the customer our welcome email/text with the confirm link. false: you relay `customer_message` and `customer_confirmation_url` yourself and we send nothing until they confirm or we call.'}}, 'description': 'Consent basis. Attestation wording version 2026-09-16.1.', 'additionalProperties': False}, 'vehicle': {'type': 'object', 'properties': {'vin': {'allOf': [{'type': 'string'}, {'type': 'string', 'maxLength': 17, 'minLength': 11}], 'description': 'Vehicle Identification Number. A full 17-character VIN lets us decode year/make/model/trim.'}, 'make': {'allOf': [{'type': 'string', 'maxLength': 60}, {'type': 'string', 'maxLength': 60, 'minLength': 1}]}, 'trim': {'allOf': [{'type': 'string', 'maxLength': 80}, {'type': 'string', 'maxLength': 80, 'minLength': 1}]}, 'year': {'type': 'integer', 'maximum': 2100, 'minimum': 1900}, 'model': {'allOf': [{'type': 'string', 'maxLength': 80}, {'type': 'string', 'maxLength': 80, 'minLength': 1}]}, 'plate': {'type': 'string', 'maxLength': 12, 'minLength': 1, 'description': 'License plate. Requires plate_state to resolve a VIN.'}, 'odometer': {'type': 'integer', 'maximum': 2000000, 'minimum': 0, 'description': 'Odometer reading in miles at the time of loss.'}, 'plate_state': {'type': 'string', 'maxLength': 2, 'minLength': 2, 'description': 'Two-letter US state code, e.g. TX.'}}, 'description': 'The vehicle. A VIN (or plate + plate_state) is best; year/make/model works too.', 'additionalProperties': False}, 'customer': {'type': 'object', 'properties': {'email': {'type': 'string', 'format': 'email', 'maxLength': 254, 'description': 'Customer email address.'}, 'phone': {'allOf': [{'type': 'string'}, {'type': 'string', 'pattern': '^[2-9]\\d{9}$'}], 'description': 'US mobile or landline number. Punctuation and a leading +1 are tolerated.'}, 'last_name': {'allOf': [{'type': 'string', 'maxLength': 80}, {'type': 'string', 'maxLength': 80, 'minLength': 1}]}, 'first_name': {'allOf': [{'type': 'string', 'maxLength': 80}, {'type': 'string', 'maxLength': 80, 'minLength': 1}]}}, 'description': 'The vehicle owner. At least one of email / phone is required; everything else is optional.', 'additionalProperties': False}, 'external_ref': {'type': 'string', 'maxLength': 120, 'minLength': 1, 'description': 'Your reference id; echoed in every response.'}, 'idempotency_key': {'type': 'string', 'maxLength': 255, 'minLength': 1, 'description': 'Any unique string per logical submission; a replay returns the original receipt.'}}, 'description': "Submit a vehicle owner's total-loss situation on their behalf.", 'additionalProperties': False}
upload_valuation_report
Attach the insurer's valuation report
Attach the insurer's Market Valuation Report (CCC / Mitchell PDF) to a submitted intake. We parse it (vehicle, mileage, offer, insurer, loss date) and refresh the preliminary. Allow up to two minutes.
Eingabeschema
{'type': 'object', 'required': ['intake_id', 'poll_token', 'file_name', 'file_base64'], 'properties': {'file_name': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Original file name, e.g. valuation-report.pdf.'}, 'intake_id': {'type': 'string', 'minLength': 1, 'description': 'The `intake_id` from a previous submission.'}, 'poll_token': {'type': 'string', 'minLength': 1, 'description': 'The `poll_token` returned once on that submission.'}, 'file_base64': {'type': 'string', 'minLength': 1, 'description': 'The PDF bytes, base64-encoded (standard or URL-safe alphabet). Up to 15 MB decoded.'}}, 'additionalProperties': False}
Geändert
submit_total_loss_intake
1. October 2026 02:42
Hinzugefügt
get_state_total_loss_rules
25. September 2026 02:40
Hinzugefügt
get_preliminary_estimate
25. September 2026 02:40
Hinzugefügt
upload_valuation_report
25. September 2026 02:40
Hinzugefügt
get_intake_status
25. September 2026 02:40
Hinzugefügt
submit_total_loss_intake
25. September 2026 02:40