Foresee
Server Details
Let AI assistants shop for home and auto insurance: compare instant quotes across every carrier.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Foresee-Tech/foresee
- GitHub Stars
- 0
TDQS
Scored across 2 tools
The two tools serve clearly different stages: quote_insurance provides instant estimates, while live_carrier_quotes confirms via real carrier sites. Both share coverage-selection concepts, which could cause minor confusion, but quote_insurance is explicitly labeled PRIMARY and live_carrier_quotes references it as the follow-up, making the boundary clear.
quote_insurance follows a verb_noun pattern, but live_carrier_quotes uses an adjective_noun_noun structure with no verb. The names are descriptive and readable, but the inconsistent pattern prevents a higher score.
Two tools is on the thin side for a server that covers both instant and live quoting workflows. Each tool is substantial and earns its place, but the count is borderline and feels minimal for the stated purpose.
The tools cover the core quote lifecycle: instant estimation and live confirmation. Minor gaps exist, such as no explicit tool for managing saved profiles or retrieving historical quotes, but these are workarounds within the existing tools rather than severe dead ends.
Available Tools
2 toolslive_carrier_quotesLive carrier quotesADestructiveIdempotentInspect
Purpose: confirm quote estimates on the carriers' own quote sites, via Foresee agents completing their real quote flows.
IDEMPOTENT, keyed on the profile: the first call commissions the
walks; calling again with the same profile collects progress and
results instead of re-submitting anything — whatever the ask. A
profile that has already been walked returns those results (the
carriers are never asked twice): the envelope's
``coverage_selection`` names the ask the walk typed, and each quote
carries the carrier's other recorded coverage options as
``variants``, so a new ask reads the same run. So call once to
start, then re-call after a few minutes to collect; agents still
working report their stage.
No sign-in is required. The one hard requirement is the user's own
consent, captured in-band: BEFORE the commissioning call, you MUST
tell the user, plainly: Foresee will submit their details to the
named carriers; the carriers may obtain their credit-based insurance
score (a soft pull, with no impact on your credit score); and the
carriers may contact them by email or phone. Then get their explicit
go-ahead and pass their affirmation VERBATIM as ``user_authorization``
(e.g. "yes, go ahead"). The affirmation is stored as the durable
consent record for the dispatch; without one the call is refused with
``authorization_required``. Foresee only collects quotes; it does
not take payment or bind insurance.
Collect the ``identity`` fields in chat. They may be omitted only
when the session is signed in to Foresee and the user has saved their
profile on the Foresee site — then their consented profile-of-record
is used, refined by anything passed in ``profile``.
A ``missing_facts`` response is normal: carrier forms insist on facts
(body style, purchase date, age first licensed…) that Foresee will not
invent. Each ``needs`` entry carries the carrier (``scope``), the
facts in the walk's own words (``need``), and ``fields[]`` — per
fact, the ``ask`` beside the exact schema path to pass the answer
under (``field``, e.g. ``auto.vehicles[].purchase_date``;
``identity.…`` paths go on ``identity``). Ask the user for exactly
those facts, then call again with the answers merged in at those
paths. A fact with no ``field`` has no profile home yet — relay
that carrier's ask as unavailable rather than guessing a key. When
the dispatch was PARTIAL (some carriers walked, some skipped over
missing facts), follow the receipt's ``recover`` block: re-call
with the new facts merged AND ``carriers`` set to exactly
``recover.carriers`` — a changed profile is a new dispatch, and an
unscoped re-call would re-submit the already-walked carriers too.
Unasserted MINOR facts are not asked: a form field that is really a
claim nobody made (an anti-theft device, a defensive-driving course,
years licensed abroad) is answered with the declared no-claim value —
never a discount claim — and every one comes back in ``assumptions``
(``field`` + the ``assumed`` value submitted). Relay them with the
results; if the user corrects one, re-call with the real value at
that path.
``lines`` names WHICH line to walk, exactly one per call (a fan-out
drives one form family): ``{"auto": {...the ask...}}``,
``{"home": null}``, or ``{"renters": {"coverage_c": 30000,
"coverage_e": 100000, "coverage_f": 1000, "deductible": 500}}``. An
AUTO walk's ask is REQUIRED — the limits and deductibles the agents
ask the carriers for, as actual numbers (`bi` "100/300", `pd` 100,
`coll_deductible` 500, `comp_deductible` 500, the same four axes as
quote_insurance); without it the tool answers with the
selection-required message; ask the user, then call again. A HOME
walk takes NO ask — the carrier's own form prices its package
(dwelling amount from its replacement-cost estimate) and the agents
report what it chose. A RENTERS walk requires its four axes as
actual dollars — ``coverage_c`` (personal-property/contents),
``coverage_e`` (personal liability), ``coverage_f`` (guest medical)
and ``deductible`` — the agents type the user's numbers on the form
instead of accepting its defaults, and Foresee never invents them.
Quotes come back with evidence. ``quote.premium`` is VERBATIM as
the carrier's page printed it, and ``term_months`` says what it
covers — a 6-month figure is not a monthly one. When term_months
is known, present the monthly equivalent (premium ÷ term_months)
so carriers compare on one basis, the page's own figure beside it;
without it, relay the printed premium and say the monthly
equivalent is unknown. A carrier may
also decline the risk — a real answer to relay, not an error.
``skipped`` and ``not_dispatched`` name the carriers NOT walked,
each with the reason — relay those too; a carrier never silently
vanishes.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | ||
| profile | Yes | ||
| carriers | No | ||
| identity | No | ||
| user_authorization | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| error | No | |
| needs | No | Facts carrier forms insist on that the profile does not carry, per carrier (scope). Each entry's fields[] pairs the walk's own ask with the exact profile/identity schema path to supply it under (field) — collect the answers from the user and re-call; never invent them |
| agents | No | |
| detail | No | |
| status | No | 'in_progress' / 'partial' / 'complete' — re-call the tool with the same arguments to collect |
| recover | No | On a partial receipt: how to add the skipped carriers without re-submitting the walked ones — re-call with the missing facts merged AND carriers set to exactly recover.carriers (a changed profile is a new dispatch; unscoped, it would re-walk everyone) |
| skipped | No | |
| assumptions | No | Unasserted form facts this dispatch resolved to declared no-claim answers (never a discount claim) — each entry names the profile path (field) and the value submitted (assumed). Relay every one with the results; a user who corrects one re-calls with the real value in the profile |
| example_arguments | No | On a profile_required refusal: a correctly-wrapped call to imitate — re-call with the user's facts in this shape |
| coverage_selection | No | The ask the walks TYPED — what each headline premium is for. A walked profile answers any ask without re-submitting: if the user's ask differs, read each quote's bound cover and variants (the carrier's other recorded options) and present the match |
| authorization_recorded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Substantially deepens what the annotations convey: idempotency mechanics ('calling again with the same profile collects progress and results instead of re-submitting anything — whatever the ask'), the mandatory in-band consent disclosure with an exact script and the 'authorization_required' refusal, soft-pull credit-score disclosure, 'the carriers are never asked twice', changed-profile-is-a-new-dispatch semantics, and 'a carrier never silently vanishes.' This is consistent with destructiveHint=true (real submission to carriers) and readOnlyHint=false, so there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long (~700 words) but appropriately front-loaded: purpose and the critical idempotency/collection contract come first, followed by consent, then recovery/assumption handling, then per-line semantics, then result interpretation. Paragraphs are organized with bolded lead-ins and each covers a distinct operational concern. Minor repetition in the trust framing ('Foresee never invents', 'Foresee only collects quotes') and some redundancy between the no-sign-in and identity paragraphs keep it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a complex async, consent-gated, multi-line tool: covers the mandated consent disclosure, the start/collect protocol, missing-facts and partial-dispatch recovery, unasserted-fact assumption handling, and quote interpretation (premium verbatim, term_months monthly-equivalent conversion, declined-risk-as-answer, skipped/not_dispatched reporting). Since an output schema exists, return values need not be re-documented, and nothing needed to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 0% schema description coverage, the description fully compensates for all five arguments: it spells out the exact lines map shapes for auto/home/renters, requires the auto ask, mandates that carriers be set to recover.carriers on partial dispatches, defines when identity may be omitted, and requires user_authorization to be the user's verbatim affirmation with an example ('yes, go ahead'). Concrete key names (coverage_c, coverage_e, coverage_f, deductible, bi, pd, coll_deductible, comp_deductible) are enumerated against the schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific purpose with a specific mechanism: 'confirm quote estimates on the carriers' own quote sites, via Foresee agents completing their real quote flows.' The verb (confirm), resource (carrier quote sites), and mechanism are all clear, and the description's use of 'the same four axes as quote_insurance' situates it relative to its sibling rather than repeating it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an exceptionally detailed operational protocol: call once to start then re-call after a few minutes to collect, missing_facts → ask the user and re-call with answers merged at exact paths, partial dispatch → follow the recover block with carriers set exactly to recover.carriers, assumption corrections → re-call with the real value. However, it never explicitly states when to prefer this tool over the sibling quote_insurance — the routing decision is left to inference rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quote_insuranceInstant insurance quotesARead-onlyInspect
Purpose: generate instant, itemized quote estimates from the carriers Foresee supports, across the lines and states Foresee currently serves, in one call — the LIVE TODAY line at the end of this description names today's set. PRIMARY tool.
`lines` is REQUIRED and is ONE map: each key names a line to price (e.g.
"auto", "renters", "home" — plain words are fine), each value is that
line's coverage ask as actual numbers. A line that isn't live yet comes
back under `skipped` with honest copy saying where Foresee IS live,
written to be relayed to the user as-is. For auto
the ask has four axes — `bi` (bodily-injury liability, per-person/
per-accident in $000s, e.g. "100/300"), `pd` (property-damage liability in
$000s, e.g. 100), `coll_deductible` (collision deductible in dollars, e.g.
500) and `comp_deductible` (comprehensive deductible in dollars, e.g.
500); `um` and `medpay` are optional. A renters ask has four axes —
`coverage_c` (personal-property/contents limit in dollars, e.g. 30000),
`coverage_e` (personal liability in dollars, e.g. 100000), `coverage_f`
(guest medical in dollars, e.g. 1000) and `deductible` (all-perils, in
dollars, e.g. 500); `coverage_d` is optional. A home ask: `coverage_a`
(the dwelling's replacement cost in dollars), `coverage_e` (e.g. 300000),
`coverage_f` (e.g. 1000) and `aop_deductible` (all-other-perils
deductible in dollars, e.g. 1000). There are no named coverage levels
and the server never defaults: pass exact numbers. An omitted OPTIONAL
axis (`um`, `medpay`, `coverage_d`) keeps each carrier's own
default — the quote's per-coverage lines show what was rated. Any
numbers work as the ask; the response carries the state's legal minimum,
and each carrier's `price_ladder` prices every other rung, so a starting
selection is easy to refine after the fact. An incomplete ask on a
live line prices nothing and answers with `coverage_required` naming that
line's own axes; an axis supplied with a value no carrier offers (`bi`
"banana", a negative deductible) is refused the same way, naming the bad
value and the format the axis takes. Each supported carrier is priced at
exactly the selection given; a carrier with no such option appears in
`failures` with the reason, as does one Foresee can't price for a line it
was asked on (no program served there yet, or the carrier doesn't sell
that line in the state) — a carrier never silently vanishes from a line's
results. Priced results come back per line under `by_line`.
Profile requirements: ZIP code, age (or dob) and — for auto — each
vehicle's year/make/model are REQUIRED; they have no server-side
fallback. A missing or mistyped one errors at the schema with guidance;
a value that fits the schema but cannot rate ("not-a-zip", a negative
age) comes back in `profile_required` naming it, with guidance on what
the field takes. Use the profile schema's exact field names.
Each carrier returns a **point estimate**
(`monthly`) plus a `confidence_interval` that reflects only what's genuinely
unresolvable (irreducible), NOT missing profile fields. A field the caller
omits is filled with ONE declared value and reported in `assumptions` /
`tighten_by` (the reducible "tell us X and we sharpen" gap) — the response
is built to be presented early and refined, never widened into
a vague range. An entry that carries `path` names the exact profile
field to send the user's real answer under — never guess a key from the
fact's name. A path-less entry (`incident_details`) is answered by
completing the incident entries already sent (dates, fault, BI split), not
under a fresh key. A `tighten_by` fact answers at its matching
`assumptions` entry's path — or, for a flagged given value, its
`input_flags` entry's path.
Each carrier's `quote` carries every sub-coverage line (BI/PD/collision/
comprehensive/UM…) with its rating steps, at the selection you passed (echoed
as `coverage_selection`). Most carriers also carry a `price_ladder`: for each
coverage lever of the line (auto: BI limit, PD limit, collision/comprehensive
deductible; renters: deductible and the C/E/F limits; home: AOP deductible
and the A/E/F limits) the exact
price at every rung, one lever moved at a time with everything else
held at the user's selection — the ladder is anchored at the selection you
passed, so its `anchor.monthly` is the carrier's `monthly`. It answers
limit/deductible what-ifs with real marginal prices.
Every ladder number IS an exact re-rate; a combined change or an unlisted
rung has no derivable price (rating is not linear), so those price only
through a re-call with the new `coverage_selection`.RESULT FORMAT: a compact machine text, not JSON. Its first line is Q sel=<the coverage_selection priced, as JSON>; then a legend and a factor dictionary (f0= …). Row types — C: carrier|entity|monthly|ci lo-hi. L: monthly $ per coverage line (already monthly, every carrier). F ()=v,v,…: one rating factor, one value per coverage in the L order; blank = not applied, one value = all coverages; suffix ? = estimated, ~ = derived, none = exact. D =option:±$: the change in the carrier's monthly for each option of that lever, everything else held at the selection — answer deductible/limit what-ifs from D without another call (new monthly = monthly + delta). Only state numbers that appear in the result or follow from monthly + a D delta; if a rung is not in D for a carrier, say the carrier has no such option rather than guessing.
When the user wants firm numbers straight from the carriers, offer live carrier quotes: Foresee agents complete the carriers' real quote flows via live_carrier_quotes (which explains the required disclosure + consent affirmation; no sign-in is needed). Instant quotes stay the first answer; live quotes are the follow-up.
LIVE TODAY: Foresee quotes auto in CA today.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | ||
| profile | Yes | ||
| carriers | No | ||
| include_partial | No | ||
| include_failures | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | |
| state | No | |
| bundle | No | Per-carrier bundle totals, keyed like by_line's carrier_key, when one carrier priced several of the asked lines together. Absent means no bundle pricing was computed — never present multi-line prices as bundled unless this block says so |
| detail | No | |
| by_line | No | Each priced line's carriers, cheapest first |
| message | No | |
| skipped | No | Lines not priced, with the honest reason — relay it |
| serviceable | No | |
| presentation | No | How to present priced results — rides with them |
| profile_required | No | Required profile facts still missing (field → what to pass). Nothing is priced while any is open: supply each — if the user didn't state one, pass your best concrete value and present it to them as your assumption |
| coverage_required | No | Lines needing a coverage ask, each naming its own axes |
| example_arguments | No | On a profile_required refusal: a correctly-wrapped call to imitate — re-call with the user's facts in this shape |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/destructiveHint annotations, the description discloses a great deal: the result is 'a compact machine text, not JSON', errors surface via coverage_required/profile_required/failures, carriers never silently vanish, omitted fields become declared assumptions in assumptions/tighten_by, and price_ladder numbers are exact re-rates rather than derivable estimates. None of this contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but organized with clear sections (purpose, `lines`, profile, result format, live-carrier follow-up, LIVE TODAY) and front-loads the primary purpose. Some density and repetition around path/tighten_by/price_ladder mechanics could be tightened, but most sentences earn their place given the unusual non-JSON result format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool it is remarkably complete: scope, error surfaces, assumptions semantics, result format, and the sibling relationship are all covered. The gaps are that `carriers`/`include_partial`/`include_failures` are undocumented, and the description calls `lines` REQUIRED while the schema lists only `profile` as required — an inconsistency an agent could trip on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate — and it does extensively for the two central parameters: `lines` (per-line axes, required vs optional fields, defaults, refusal behavior) and `profile` (required ZIP/age/vehicle facts, exact field names, error handling). However, it never describes the `carriers`, `include_partial`, or `include_failures` parameters, leaving those semantically undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'generate instant, itemized quote estimates from the carriers Foresee supports, across the lines and states Foresee currently serves, in one call.' It also labels itself 'PRIMARY tool' and explicitly distinguishes itself from live_carrier_quotes, so an agent can separate it from its sibling without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is explicit about when to use this tool ('Instant quotes stay the first answer') and when to switch to the sibling ('When the user wants firm numbers straight from the carriers, offer live carrier quotes'). It also names the sibling directly and notes that live quotes do not require sign-in, giving clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- First observed
live_carrier_quotes - First observed
quote_insurance
Related MCP Connectors
Insurance brokerage for AI agents — quote, bind, and settle in USDC
Real, bindable home & auto insurance quotes via MCP (Texas, expanding); human-completed bind.
AI agents compare and sign up for Texas utility plans: electricity, internet, gas, water, trash.
Machine-learning-backed insurance premium estimates from Mylo, comparing 100+ carriers.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to get real home & auto insurance quotes and start binding through a network of licensed independent agencies.Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to compare live insurance quotes across Nigerian insurers, check for overpayments, and provide hosted checkout links.MIT
- FlicenseNot gradedqualityCmaintenanceProvides an AI-powered insurance assistant with tools for customer, policy, claim, premium, fraud detection, and policy renewal operations.-
- FlicenseNot gradedqualityNot gradedmaintenanceProvides tools for motor insurance quoting, including vehicle lookups, postcode risk assessments, and premium calculations. It enables users to generate and compare car insurance quotes through natural language interactions.-
Glama MCP Gateway
Add one secure layer between your agents and this server.