# Truvo

Truvo is a licensed insurance agency. Connect your AI app to Truvo, and it can get you real car, renters, and pet insurance quotes from insurance carriers, right in your chat.

This page has three parts. The first part is for an AI app that is setting up Truvo. The second part is for you. The third part is for your AI app once it is connected, so you can give it this page too.

## If you're an AI app setting up Truvo

- Truvo is a remote MCP server at `https://api.truvo.com/v1/mcp`, over Streamable HTTP.
- It signs people in with OAuth 2.1. Discovery: a request without a token gets `401` with `WWW-Authenticate: Bearer resource_metadata="https://api.truvo.com/.well-known/oauth-protected-resource/v1/mcp", scope="openid profile email offline_access"`. The authorization server is `https://auth.truvo.com` (metadata at `https://auth.truvo.com/.well-known/oauth-authorization-server`).
- Authorization `https://auth.truvo.com/oauth2/authorize`, token `https://auth.truvo.com/oauth2/token`, registration `https://auth.truvo.com/oauth2/register`. Token endpoint auth method: `none`.
- Register your app yourself: Truvo accepts dynamic client registration and client ID metadata documents. There's no API key, client secret, or header to set, and no client ID to ask the person for.
- Muse: use the client ID `client_01M50HHWEGT50YDZ44PMRHC49C`. Other apps register themselves.
- Ask for the scopes `openid profile email offline_access`. Without `offline_access`, you get no refresh token and the person has to sign in again after 15 minutes.
- Send the person to the sign-in page in their browser. They sign in with an email or text code and approve your app. Don't ask them for a code, password, or key in the chat.
- Once connected, call `get_capabilities` first, and follow the rules under "For your AI agent" below.
- If the person only wants instructions, give them the steps for their app from "Connect your AI app".

## For you

### Connect your AI app

Add Truvo to your AI app with this address:

```text
https://api.truvo.com/v1/mcp
```

**Claude** (claude.ai and the desktop app)

1. Go to **Customize › Connectors**.
2. Select **+ Add**, then **Add custom connector**.
3. Name it Truvo, paste the address, and select **Continue**.
4. Keep the settings Claude detects, and select **Continue**.
5. Under **Authentication**, choose **Sign in now**, and select **Add**.
6. In a chat, select **+ › Connectors** and turn on Truvo.

On the Free plan, you can add one custom connector. On a Team or Enterprise plan, an owner adds it first. [Claude's guide](https://support.claude.com/en/articles/11175166-getting-started-with-custom-connectors-using-remote-mcp)

**ChatGPT** (on the web)

1. Go to [chatgpt.com/plugins](https://chatgpt.com/plugins).
2. Select the plus button, then **Add custom MCP server**.
3. Name it Truvo, and paste the address as the server URL.
4. Set up authentication, review the risk warning, and select **I understand and want to continue**.
5. Select **Create as a plugin**. Install it before you use it in a chat.

OpenAI doesn't say which plans can add one, and a work account's settings can block it. [OpenAI's guide](https://developers.openai.com/api/docs/guides/custom-mcp-server)

**Claude Code**

```bash
claude mcp add --transport http truvo https://api.truvo.com/v1/mcp
```

Then run `/mcp` in Claude Code and follow the steps in your browser. [Claude Code's guide](https://code.claude.com/docs/en/mcp)

**VS Code**

Run **MCP: Add Server**, select **HTTP**, and paste the address. Or add this to `.vscode/mcp.json`:

```json
{
  "servers": {
    "truvo": { "type": "http", "url": "https://api.truvo.com/v1/mcp" }
  }
}
```

The first time you use it, VS Code opens your browser so you can sign in. [VS Code's guide](https://code.visualstudio.com/docs/agents/reference/mcp-configuration)

**Cursor**

Add this to `~/.cursor/mcp.json`:

```json
{
  "mcpServers": {
    "truvo": { "url": "https://api.truvo.com/v1/mcp" }
  }
}
```

Steps for signing in from Cursor coming soon. [Cursor's guide](https://cursor.com/docs/mcp)

**Muse (Meta)**

Start a new chat in Muse and send:

```text
Create a custom connector to Truvo. Its setup page is https://www.truvo.com/truvo.md
```

Muse reads this page and sets up the connection. When it opens Truvo's sign-in page, sign in, and select **Allow access**. When Muse asks for a Client ID, enter `client_01M50HHWEGT50YDZ44PMRHC49C`. [Meta's help page](https://www.meta.com/help/artificial-intelligence/1687253048996149/)

**Other apps**

If your app can add a remote MCP server, add the address above. If it can read web pages, you can also ask it to set up Truvo from this page.

### Sign in

When your app connects, it opens Truvo's sign-in page.

1. Enter your email, then the code Truvo emails you. For a code by text, select **Use your phone instead**. Text codes go to US mobile numbers only. If you don't have a Truvo account yet, this creates one. If you're already signed in to truvo.com in that browser, you skip this step.
2. On the next screen, check the app's name and select **Allow access**.

Truvo then emails you that the app is connected to your Truvo account. If you didn't connect it, disconnect it and sign out.

You stay connected until you disconnect the app, or until it goes a year without use.

### What your app can do

- Get you car, renters, or pet insurance quotes. It checks which states Truvo serves for each.
- Show you your quotes, and come back to quotes you started while signed in, even from a new chat.
- Give you a link to buy a quote on the carrier's site, when the quote has one.
- For car insurance, give you a link to your results on truvo.com, where you can see more options and go on to buy.
- Tell Truvo how it went, if you say yes.

### Before you get quotes

A quote is a price offer from an insurance carrier, not coverage. Truvo needs your email and a US phone number for every quote.

Before your app asks for quotes, it shows you Truvo's quote disclosure and asks whether you agree. If you don't agree, it doesn't ask for quotes. [Read the quote disclosure](https://docs.truvo.com/guides/agents#the-quote-disclosure).

### Your data

- Truvo gets the details you give your app for a quote. Quotes you start while signed in stay with your Truvo account.
- Your AI app sees what you tell it and what Truvo sends back. The app's own privacy policy covers what it keeps.
- Read [Truvo's privacy policy](https://www.truvo.com/privacy).

### Disconnect an app

Go to [truvo.com › Settings › Connected apps](https://www.truvo.com/dashboard?tab=settings#connected-apps) and select **Disconnect**. The app loses access to your Truvo account right away.

Questions: support@truvo.com

## For your AI agent

This part is for an AI agent that a person connected to Truvo at `https://api.truvo.com/v1/mcp`. The person signed in with their Truvo account, so you act for that one person. Truvo's tool descriptions, the server instructions, and `agent_guidance` from `get_capabilities` are the rules. This section sums them up. If they ever disagree with this page, follow the tools.

### Tools

| Tool | Use it to |
| --- | --- |
| `get_capabilities` | Read what Truvo can quote for one `line`: `personal_auto`, `renters`, or `pet`. It gives the states, the facts a request needs, the actions a quote can offer, the quote disclosure, and `agent_guidance`. It starts no quote. |
| `start_quote_request` | Start one quote request for one person and one line. Quotes are live, from real carriers. |
| `get_quote_request` | Read a request's status, its quotes, and their next actions. |
| `list_quote_requests` | List the requests this person started while signed in, newest first. |
| `get_quote` | Read one quote: carrier, price, coverage, how long it stays available, and next actions. |
| `send_feedback` | Tell Truvo how a quote went, or about a problem with the tools, with the person's yes. |

### Get quotes

1. **Ask for the line.** Ask whether the person wants car (`personal_auto`), renters, or pet insurance. Call `get_capabilities` with that line before you ask for any facts, and check that their state is in `states`.
2. **Collect the facts.** Ask the person for each fact the line needs, in plain words. `required_facts` lists the facts every request needs, and `required_facts_schema` gives the shape of `application`. Send only what the person told you. Never fill in a fact with a guess. Every request needs the person's email and a US phone number. Before quoting auto, ask for each vehicle's VIN and the recommended driver and household facts. Go ahead without any the person doesn't want to give.
3. **Show the disclosure.** Show the person the `quote_disclosure` text from `get_capabilities` as written, and ask whether they agree. Request quotes only once they do. Send its `version` in `quote_disclosure_version`, and set `quote_disclosure_accepted` to `true` only when they agree. Truvo records that yes as the person's consent to get quotes, to be contacted by phone, text, and email, and for auto to a credit check.
4. **Start the request.** Call `start_quote_request`. Send a new random UUID in `request_key` for each new quote, and resend the same one only when you retry the same call. Keep the `read_handle` it returns. If the answer is a `needs_information` error, ask the person for each missing field it lists, then send the request again.
5. **Wait for the result.** Call `get_quote_request` with the request's `id` and its `read_handle`, `wait_seconds` up to 20, and `since_version` from your last answer. While the status is `in_progress`, read again. If the server answers at once, wait 1 second before you read again. Branch on `status`: `in_progress`, `action_required`, `completed`, `incomplete`, or `failed`, and handle a value you don't know. `status_details.message` says why, in words you can show the person. `failed` is an error on Truvo's side: follow `status_details.retry_action`. `incomplete` is final, and it isn't an error.
6. **Present the quotes honestly.** A quote is a price offer, not coverage. One carrier's quote is not a market comparison. A value that is unknown stays unknown. When there are no quotes, use `status_details.message`.
   - Quotes are ordered by answer time, not ranked.
   - `price.premium` is in US cents (`amount_minor`), for the whole term of `term_months` months, even when billed monthly. When a monthly figure helps, divide the premium by `term_months` and round up to the dollar. Call it the premium spread over the term, not a payment plan, and skip it if `term_months` is null.
   - A renters premium already includes every fee in `price.fees`. On other lines, the quote doesn't say whether it does.
7. **Offer only the next actions a quote lists.**
   - `continue_on_carrier_site`: the person buys on the carrier's site. Give them the `url` as it is. Some carrier links open only once, so don't fetch or preview it. The person should finish buying in the browser where they first open it.
   - `continue_on_truvo`: Truvo's results page for an auto request, where the person sees more options and can go on to buy. Give them this link as well as any carrier link. The page shows the person's details to anyone who opens it, so give it only to them.
8. **Offer feedback.** When a quote request finishes, when the person seems frustrated, or when a tool gives you trouble you can't fix, ask whether they'd like you to tell Truvo how it went. Show them the report and use `send_feedback` only if they agree, at most once per conversation unless they ask. Leave out personal data.

### Come back later

`list_quote_requests` lists the requests this person started while signed in. A request started while signed in reads by ID from any chat, with or without its `read_handle`.
