SecondAppraisal Total-Loss Intake

Submit a vehicle owner's total loss to SecondAppraisal; preliminary market read; state rules.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
97%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,497Tokens (tool definitions)
~4.4 KBTypical response size
Moderate attention impact (1.95% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "total-loss-intake": {
      "url": "https://secondappraisal.com/mcp"
    }
  }
}

Remote endpoints

https://secondappraisal.com/mcpstreamable-http

What it can do

Tool inventory

Tools (5)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🔴submit_total_loss_intake(agent, customer, vehicle, loss, offer, ...)

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 $497 with a $25 discount for customers you send ($472; 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.

Input Schema

{
  "type": "object",
  "properties": {
    "agent": {
      "type": "object",
      "properties": {
        "name": {
          "allOf": [
            {
              "type": "string",
              "maxLength": 120
            },
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 120
            }
          ],
          "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."
        },
        "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."
        },
        "version": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60,
          "description": "Agent / integration version string."
        },
        "operator_url": {
          "type": "string",
          "format": "uri",
          "maxLength": 300,
          "description": "Homepage or documentation URL of the agent operator."
        }
      },
      "required": [
        "name",
        "platform"
      ],
      "additionalProperties": false,
      "description": "Who is calling. Required — an intake without self-identification is refused."
    },
    "customer": {
      "type": "object",
      "properties": {
        "first_name": {
          "allOf": [
            {
              "type": "string",
              "maxLength": 80
            },
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            }
          ]
        },
        "last_name": {
          "allOf": [
            {
              "type": "string",
              "maxLength": 80
            },
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            }
          ]
        },
        "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."
        }
      },
      "additionalProperties": false,
      "description": "The vehicle owner. At least one of email / phone is required; everything else is optional."
    },
    "vehicle": {
      "type": "object",
      "properties": {
        "vin": {
          "allOf": [
            {
              "type": "string"
            },
            {
              "type": "string",
              "minLength": 11,
              "maxLength": 17
            }
          ],
          "description": "Vehicle Identification Number. A full 17-character VIN lets us decode year/make/model/trim."
        },
        "plate": {
          "type": "string",
          "minLength": 1,
          "maxLength": 12,
          "description": "License plate. Requires plate_state to resolve a VIN."
        },
        "plate_state": {
          "type": "string",
          "minLength": 2,
          "maxLength": 2,
          "description": "Two-letter US state code, e.g. TX."
        },
        "year": {
          "type": "integer",
          "minimum": 1900,
          "maximum": 2100
        },
        "make": {
          "allOf": [
            {
              "type": "string",
              "maxLength": 60
            },
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 60
            }
          ]
        },
        "model": {
          "allOf": [
            {
              "type": "string",
              "maxLength": 80
            },
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            }
          ]
        },
        "trim": {
          "allOf": [
            {
              "type": "string",
              "maxLength": 80
            },
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 80
            }
          ]
        },
        "odometer": {
          "type": "integer",
          "minimum": 0,
          "maximum": 2000000,
          "description": "Odometer reading in miles at the time of loss."
        }
      },
      "additionalProperties": false,
      "description": "The vehicle. A VIN (or plate + plate_state) is best; year/make/model works too."
    },
    "loss": {
      "type": "object",
      "properties": {
        "date_of_loss": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "Calendar date, YYYY-MM-DD."
        },
        "loss_state": {
          "type": "string",
          "minLength": 2,
          "maxLength": 2,
          "description": "State where the loss occurred / the policy is written."
        },
        "zip": {
          "type": "string",
          "pattern": "^\\d{5}(-\\d{4})?$",
          "description": "US ZIP code (5 or 5+4). Used to search comparable vehicles near the customer."
        },
        "insurance_path": {
          "type": "string",
          "enum": [
            "own",
            "at-fault",
            "unknown",
            "none"
          ],
          "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)."
        }
      },
      "additionalProperties": false,
      "description": "When and where the loss happened."
    },
    "offer": {
      "type": "object",
      "properties": {
        "insurer": {
          "allOf": [
            {
              "type": "string",
              "maxLength": 120
            },
            {
              "type": "string",
              "minLength": 1,
              "maxLength": 120
            }
          ],
          "description": "Insurance company handling the total loss."
        },
        "claim_number": {
          "type": "string",
          "minLength": 1,
          "maxLength": 60
        },
        "acv_offer_cents": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100000000,
          "description": "Insurer's Actual Cash Value offer in cents. `acv_offer` (dollars) is also accepted."
        },
        "acv_offer": {
          "type": "number",
          "minimum": 0,
          "maximum": 1000000,
          "description": "Insurer's Actual Cash Value offer in dollars. Converted to cents server-side."
        }
      },
      "additionalProperties": false,
      "description": "The insurer's position so far, if any."
    },
    "consent": {
      "type": "object",
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "customer_directed",
            "warm_handoff"
          ],
          "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",
          "minLength": 20,
          "maxLength": 1000,
          "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",
              "minLength": 1,
              "maxLength": 120
            }
          ],
          "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."
        }
      },
      "required": [
        "attestation"
      ],
      "additionalProperties": false,
      "description": "Consent basis. Attestation wording version 2026-09-16.1."
    },
    "external_ref": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120,
      "description": "Your reference id; echoed in every response."
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 1,
      "maxLength": 255,
      "description": "Any unique string per logical submission; a replay returns the original receipt."
    }
  },
  "required": [
    "agent",
    "customer",
    "consent"
  ],
  "additionalProperties": false,
  "description": "Submit a vehicle owner's total-loss situation on their behalf."
}
🟢get_intake_status(intake_id, poll_token)

Fetch the current receipt for a submitted intake (status, confirm link while still confirmable, preliminary).

Input Schema

{
  "type": "object",
  "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."
    }
  },
  "required": [
    "intake_id",
    "poll_token"
  ],
  "additionalProperties": false
}
🟡upload_valuation_report(intake_id, poll_token, file_name, file_base64)

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.

Input Schema

{
  "type": "object",
  "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."
    },
    "file_name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Original file name, e.g. valuation-report.pdf."
    },
    "file_base64": {
      "type": "string",
      "minLength": 1,
      "description": "The PDF bytes, base64-encoded (standard or URL-safe alphabet). Up to 15 MB decoded."
    }
  },
  "required": [
    "intake_id",
    "poll_token",
    "file_name",
    "file_base64"
  ],
  "additionalProperties": false
}
🟢get_preliminary_estimate(year, make, model, trim, zip, ...)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "year": {
      "type": "integer",
      "minimum": 1900,
      "maximum": 2100
    },
    "make": {
      "type": "string",
      "minLength": 1,
      "maxLength": 60
    },
    "model": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "trim": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "zip": {
      "type": "string",
      "pattern": "^\\d{5}(-\\d{4})?$",
      "description": "Preferred; searches comparables near here."
    },
    "state": {
      "type": "string",
      "minLength": 2,
      "maxLength": 2,
      "description": "Two-letter state; used when no zip is given."
    },
    "odometer": {
      "type": "integer",
      "minimum": 0,
      "maximum": 2000000
    },
    "acv_offer_cents": {
      "type": "integer",
      "minimum": 0,
      "description": "Insurer's offer in cents, to report the gap."
    }
  },
  "required": [
    "year",
    "make",
    "model"
  ],
  "additionalProperties": false
}
🟢get_state_total_loss_rules(state)

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.

Input Schema

{
  "type": "object",
  "properties": {
    "state": {
      "type": "string",
      "minLength": 2,
      "maxLength": 40,
      "description": "Two-letter code (TX) or state name (Texas)."
    }
  },
  "required": [
    "state"
  ],
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded5 tools