Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, email [email protected] and we’ll put it right.

ai.serff/ca-rate-filings

REMOTE · API.SERFF.AI · SCANNED AUG 3

Natural-language search over California's public insurance rate, rule & form filings.

Available components

+2 this week 61 Trust /100
Trust breakdown (6 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →

Endpoint Security57
Transport & Reachability100
Schema Quality & AI Usability57
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 11624 tokens (~683/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
  • Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Capabilities60
  • Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28. See how to fix → Fail
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

remote · api.serff.ai

# add to Claude Code
claude mcp add --transport http ai-serff-ca-rate-filings https://api.serff.ai/mcp
# ~/.codex/config.toml
[mcp_servers.ai-serff-ca-rate-filings]
url = "https://api.serff.ai/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-serff-ca-rate-filings": {
      "type": "remote",
      "url": "https://api.serff.ai/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add ai-serff-ca-rate-filings --url https://api.serff.ai/mcp --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  ai-serff-ca-rate-filings:
    url: "https://api.serff.ai/mcp"
// mcp.json
{
  "mcpServers": {
    "ai-serff-ca-rate-filings": {
      "type": "http",
      "url": "https://api.serff.ai/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 2 Aug 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 31 Jul 26 +1
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 30 Jul 26 −2
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 29 Jul 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 28 Jul 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

  • 27 Jul 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 26 Jul 26 59

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 3 Aug 2026 · Probed https://api.serff.ai/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=api.serff.ai CN=WR3,O=Google Trust Services,C=US 5 Jul 2026 3 Oct 2026 RSA 2048 SHA256-RSA d39aa9ea3627427810614649566fa523
SANs: api.serff.ai
CN=WR3,O=Google Trust Services,C=US (CA) CN=GTS Root R1,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 RSA 2048 SHA256-RSA 7ff005a91568d63abc22861684aa4b5a
CN=GTS Root R1,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 19 Jun 2020 28 Jan 2028 RSA 4096 SHA256-RSA 77bd0d6cdb36f91aea210fc4f058d30d
DNSSEC insecure

Validation of api.serff.ai. Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
ai. present 3799 8 Verified
serff.ai. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication No authorisation required

The endpoint answered without asking for a token. Anyone who knows the URL can reach it.

Result No authorisation required
HTTP status 200
Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://api.serff.ai/mcp Verified 200
http (plaintext) http://api.serff.ai/mcp HTTPS enforced 302 https://api.serff.ai/mcp
MCP tools — 17 exposed · ~9,004 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.

Tool Tokens
get_filing_extract_meta ~749

Lists **what's in** each extracted artefact for a filing — section counts, item names, and the page each item came from — without returning any of the bulky factor tables, descriptions, or rate rows themselves. **Call this FIRST**, before `get_filing_extracts`, for any "what does this filing contain" question. It costs a fraction of the tokens and tells you which file + which section you need to pull in detail. `get_filing_extracts` is then the targeted second call once you know the SERFF + file + section that actually answer the user's question. Use this when the user asks: - "What forms does this filing include?" / "List the form numbers in TSIS-134726605." - "How many exclusions does it carry? What are they called?" - "What rate tables are in this filing, and which PDF page are they on?" - "List the discounts / endorsements / coverages this filing offers." - "Where in the source PDF is the territory rate table?" - Any "how many", "what are the names of", or "which page is X on" question about a filing's extracted artefacts. Wrong surface for: - Anything that needs the actual numeric content (factor values, full rate rows, full exclusion text). Call `get_filing_extracts` instead, narrowing `files` to just the one(s) you discovered here. Whitelist (same as `get_filing_extracts`): - `calculations.json` — example rate-calculation walk-throughs. - `coverages.json` — coverage definitions (perils, limits, applicability). - `deductibles.json` — deductible options + factors. - `discounts.json` — discount / surcharge schedules. - `endorsements.json` — optional endorsements / riders. - `examples.json` — worked policyholder rating examples. - `exclusions.json` — coverage exclusions + the conditions they apply to. - `extraction_summary.json` — structured filing-overview fields. - `final_rating_calculation.json` — canonical rating expression. - `forms.json` — policy form numbers + types. - `rates_data.json` — base rates + rate-table headers. - `underwriting_guidelines.jso…

NameTypeReqDescription
filesarrayOptional subset of whitelist file names to summarise. Omit or pass empty for all 12.
serffstringyesCanonical SERFF id, shape PREFIX-IDENTIFIER (e.g. "AAIC-134567890").

No output schema declared.

No examples provided.

get_filing_extracts ~663

Returns the structured-data JSON artefacts the pipeline extracted from a filing's source PDFs. Use this when the question is about **rating mechanics, data tables, risk curves, calculation steps, or coverage / form definitions** — anything where the narrative summary isn't enough and the LLM needs the actual structured rows. Whitelist (and what each contains): - `calculations.json` — step-by-step rate calculation walk-through (base rate, factor application, final premium). One entry per documented example calculation. - `coverages.json` — coverage definitions: which perils / lines / risk types the filing addresses, with limits and applicability. - `deductibles.json` — deductible options offered, dollar amounts, and any peril-specific rules. - `discounts.json` — available discounts / surcharges, eligibility criteria, and the corresponding multiplicative factors. - `endorsements.json` — optional endorsements / riders attached to the filing. - `examples.json` — worked policyholder examples (sample insureds with calculated premiums). - `exclusions.json` — coverage exclusions and conditions under which they apply. - `extraction_summary.json` — structured machine-readable form of the same content `get_filing_summary` returns as Markdown; useful when you want filing-type / what-this-filing-does fields as JSON rather than prose. - `final_rating_calculation.json` — the canonical rating expression / equation the filing prescribes (base × factor1 × factor2 …). - `forms.json` — policy form numbers, edition dates, and the form types associated with the filing. - `rates_data.json` — the rate tables themselves: rows of (segment / cell / factor) values. **The biggest file by far** — can be hundreds of thousands of rows for territory-detailed filings. See truncation below. - `underwriting_guidelines.json` — eligibility and underwriting rules (e.g. credit-tier bands, prior-loss caps). **Truncation**: any returned file whose JSON contains an array longer than 100 rows is truncated…

NameTypeReqDescription
filesarrayOptional subset of whitelist file names to return (e.g. ["rates_data.json", "calculations.json"]). Omit or pass empty for the full whitelist.
serffstringyesCanonical SERFF id, shape PREFIX-IDENTIFIER (e.g. "AAIC-134567890"). Validated against /^[A-Z]{3,5}-[A-Z0-9]{7,15}$/.

No output schema declared.

No examples provided.

get_filing_lineage ~340

Returns the **reconciled lineage chain** for a SERFF id — leaf filing plus ordered predecessors back to the bureau root. Each chain entry includes the SERFF id, position (0 = leaf), role (`leaf` / `predecessor`), and a lite filing record (state, year, carrier name, product name, filing type, filing date). Distinct from `get_filing_references`, which returns what the filing itself claims inside the PDF. Use this when you want the canonical chain (e.g. "what's the bureau root and prior versions for this Progressive auto programme?"); use `get_filing_references` when you want the carrier-stated lineage. Walks back from any SERFF in a programme's chain — pass either the leaf or any predecessor and you get the same chain back. Returns `{ error: ... }` if the SERFF id has not been resolved into any programme chain (the filing may be a non-rate-affecting type — Withdrawal / Correspondence — or simply not yet ingested). Pair with `search_filings` using `predecessor_prefix`: search returns "filings that some programme adopted from bureau X"; lineage tells you, for any of those filings, the full chain it sits in.

NameTypeReqDescription
serffstringyesCanonical SERFF id, shape PREFIX-IDENTIFIER (e.g. "AAIC-134567890"). Either the leaf or a predecessor — the chain is returned regardless. Validated against /^[A-Z]{3,5}-[A-Z0-9]{7,15}$/; invalid valu…

No output schema declared.

No examples provided.

get_filing_references ~280

Returns the predecessor, superseded, and companion filings that **this filing itself** cites in its supporting documentation. Carrier-claimed lineage extracted from inside the PDF (e.g. "supersedes XXXX-NNNN", "loss costs adopted from NCCI-NNNN"). Distinct from `get_filing_lineage`, which returns the reconciled chain across the corpus. The two often agree but can diverge — `get_filing_references` is the carrier's stated lineage; `get_filing_lineage` is what was actually wired together across filings. When they disagree, that is itself a signal worth surfacing. Each entry typically carries a SERFF id, NAIC, group code, filing type, and a relationship label (predecessor / superseded / loss-cost-source). Use to answer "what does this filing claim to replace?" or "which bureau filing did this carrier adopt?". Returns `{ error: ... }` if no references record exists for the SERFF id (the filing has not yet been classified).

NameTypeReqDescription
serffstringyesCanonical SERFF id, shape PREFIX-IDENTIFIER (e.g. "AAIC-134567890"). Validated against /^[A-Z]{3,5}-[A-Z0-9]{7,15}$/; invalid values return an error envelope.

No output schema declared.

No examples provided.

get_filing_source_file_link ~494

Returns a short-lived **V4-signed GCS URL** for a single SOURCE file (PDF / XLSM / XLSX / DOC / ZIP) the carrier submitted for a SERFF filing. The link is intended for **display to the end user** — they click it in their browser to download the file. **CRITICAL: DO NOT fetch this URL yourself.** Surface it to the user verbatim and stop. The URL is a signed link for the human's browser, not for the model. Fetching it pulls the entire source file (often tens of MB of PDF / XLSM) into your context window and serves no purpose the user did not already get from seeing the link. Pair with `list_filing_source_files` to discover the file names first, then call this to mint a link. When you respond to the user, include the URL **and the `expires_at` timestamp** so they know how long they have to click — after that the link returns 403 and they'll need to ask for a fresh one. Link properties: direct V4-signed GCS URL, expires after `ttl_seconds` (default 900 = 15 min, capped at 3600). Bypasses Cloud Run entirely. Intended for human clicks, NOT for the model to fetch. Whitelist is dynamic, keyed off the actual contents of the filing's source-files directory — same set `list_filing_source_files` advertises. `file_name` must be a basename (no slashes, no `..`) AND must appear in the listing. Returns `{ serff, file_name, url, expires_at, ttl_seconds, notice }`. The `notice` repeats the don't-fetch directive — include it in your response to the user too.

NameTypeReqDescription
file_namestringyesBasename of a file present in this SERFF's source-files directory (the exact set returned by `list_filing_source_files`). No slashes, no path traversal — pure basename.
serffstringyesCanonical SERFF id, shape PREFIX-IDENTIFIER (e.g. "REGU-134742228").
ttl_secondsintegerSigned-URL lifetime in seconds. Default 900 (15 minutes). Capped at 3600 (1 hour). Shorter is preferred — the link is for the human to click immediately, not for long-term storage.

No output schema declared.

No examples provided.

get_filing_summary ~244

Returns an actuarial narrative summary for a single SERFF id — the **Filing Type** header, the **"What This Filing Does"** section (concrete bullet-pointed change list with page citations for Rate / Rule / Form / New Programme / Withdrawal filings), the structured **Description**, and the key references the summary cites. This is the fastest route from "I have a SERFF id" to "I understand what this filing changes" — typically a few KB rather than the hundreds of KB of raw source. Page citations of the form `(p. N)` let a reviewer verify each claim against the source PDF. Returns `{ error: ... }` if no summary exists for the SERFF id (the filing has not yet been classified). Use `list_filing_source_files` and `mcp_health` to triage; do not retry.

NameTypeReqDescription
serffstringyesCanonical SERFF id, shape PREFIX-IDENTIFIER (e.g. "AAIC-134567890"). Validated against /^[A-Z]{3,5}-[A-Z0-9]{7,15}$/; invalid values return an error envelope.

No output schema declared.

No examples provided.

get_product ~290

Returns the full record for a single product — by `product_id` (uuid) OR `leaf_serff`. Each call expands the predecessor chain into a list of {position, serff, filing} where each filing is the slim metadata (state, year, carrier, product, filing type, status, date). Saves the round-trip you'd otherwise need (`search_products` → `get_filing_summary` × N). Returns the substantive-leaf signals (`leaf_likely_new`, `leaf_file_bytes`, `leaf_embed_bytes`), the chain evidence score (`chain_evidence_score`), the pricing-lineage label (`adoption_sources`), and the array of sibling product ids (`related_product_ids`) sharing a bureau/me-too source. Pair with `get_product_siblings` to resolve those ids into full sibling rows in one call. Pass either argument — not both. Returns `{ error: ... }` if neither provided, on malformed UUID/SERFF, or when no product matches.

NameTypeReqDescription
leaf_serffstringLeaf-filing SERFF id, shape PREFIX-IDENTIFIER. Mutually exclusive with `product_id`.
product_idstringCanonical product UUID (e.g. "00006cf7-ae2b-4eb4-b774-2fe66debd40d"). Mutually exclusive with `leaf_serff` — pass one.

No output schema declared.

No examples provided.

get_product_ancestors ~243

Returns the prior revisions of a product — other products in the same lineage cluster (same `company_name`, `state`, `lob`) with an older `leaf_filing_date`. Distinct from `get_product_siblings`, which returns peers sharing a bureau / cross-carrier source. Use to answer "how has this programme evolved?" — walk back through each revision in chronological order. Returns slim rows (product identity, leaf, adoption_sources, depth, root) ordered oldest → newest. If the seed product is missing any of the cluster-key fields (`company_name` / `state` / `lob` / `leaf_filing_date`), returns `ancestors: []` with an explanatory `note` field — not an error. Pass `product_id` (uuid) OR `leaf_serff`. Returns `{ ancestors: [], count: 0 }` when no prior revision exists — not an error.

NameTypeReqDescription
leaf_serffstringLeaf-filing SERFF id. Mutually exclusive with `product_id`.
product_idstringCanonical product UUID. Mutually exclusive with `leaf_serff` — pass one.

No output schema declared.

No examples provided.

get_product_siblings ~292

Returns the sibling products of a given product — other products whose chain shares a bureau filing (ISO / AAIS / NCCI / WCRT / WCRB / SURE) or a cross-carrier predecessor with the seed product. The shared filing is the "source" both products adopted from — multiple carriers' parallel adoptions of the same ISO programme, or multiple successors of a single me-too source. Resolves the seed's stored `related_product_ids` array into slim sibling rows (product identity, leaf, LOB, state, adoption_sources, depth, root). Cheaper than a full `search_products` predicate when you already have a known product and want its peers. Use to: - find every product riding on a specific ISO loss-cost filing (start from one bureau-adopting product, get all the others adopting the same root), - spot programmes that look proprietary but actually share a cross-carrier source, - explore me-too clusters around a single source filing. Pass `product_id` (uuid) OR `leaf_serff`. Returns `{ siblings: [], count: 0 }` when the product has no siblings — not an error.

NameTypeReqDescription
leaf_serffstringLeaf-filing SERFF id. Mutually exclusive with `product_id`.
product_idstringCanonical product UUID. Mutually exclusive with `leaf_serff` — pass one.

No output schema declared.

No examples provided.

list_filing_source_files ~260

Lists the **source files** (PDFs, XLS spreadsheets, DOC manuals, ZIP archives) ingested for a SERFF id. Returns metadata only — name, size in bytes, MIME-class type (`pdf` / `spreadsheet` / `document` / `csv` / `archive` / `other`), file extension, modified timestamp. Pair with `get_filing_source_file_link` to mint a signed download link the user can click — list names here, mint a link there. Use this to: - triage a filing whose summary looks thin ("did we even ingest the right files?"), - discover the XLSM rater / rate manual PDF / rating-samples spreadsheet for a filing, - confirm which artefacts a filing actually shipped (e.g. is there a separate rate manual XLS, or just the PDF?). Returns `{ error: ... }` if no source files exist for the SERFF id.

NameTypeReqDescription
serffstringyesCanonical SERFF id, shape PREFIX-IDENTIFIER (e.g. "AAIC-134567890"). Validated against /^[A-Z]{3,5}-[A-Z0-9]{7,15}$/; invalid values return an error envelope.

No output schema declared.

No examples provided.

mcp_account ~86

Returns the resolved identity behind the current MCP bearer — email, company_name, account_type (free vs production), and company_reference. Quota-exempt: this is an identity probe, not a value-bearing call. Returns nulls for fields mono has no value for. Useful for an MCP client to confirm "who am I talking to mono as" without burning the user's monthly quota.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

mcp_health ~110

Diagnostic snapshot of the deployed MCP server: build identifier, server_version (1.0.<PR> tag), boot time, advertised tool names, a hash of the tool surface, and corpus_updated_at (freshest watermark across the filings pipeline). Call this first when you suspect the connector is showing a stale tool list or you want to detect whether code or data has changed since your last call — compare tools_advertised against what your client lists, server_version for code, corpus_updated_at for data.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

search_actuarial_embeds ~686

Pure vector search over per-filing actuarial-memorandum embeddings (`extract_embeds` where `kind='actuarial_memo'`). Each hit is a filing whose memo is semantically closest to your query, with the matching excerpt and lite filing metadata. **Cost**: one query-embedding call + one indexed Postgres lookup. Bounded, cheap, fast. No LLM planning, no LLM composition. **This is the right tool any time the question is *actuarial-shape*.** Reach for it — not `search_summary_embeds` and not `search_filing_embeds` — when the user is asking about: - Rate adequacy: headline rate change, indicated vs selected, off-balance, capping. - Loss trends: severity trend, frequency trend, pure-premium trend, projected ultimates, LDFs, IBNR development. - Credibility / experience: experience period, weight assigned to own experience vs class-plan / bureau, credibility tables. - Expense / profit provisions: permissible loss ratio, target combined ratio, profit & contingency loading, expense ratio, investment-income offset. - Reason codes / drivers: reinsurance cost, weather/cat load, severity-driven rate need, mix shift, frequency reductions from telematics. - Anything where the answer would be a *number from the actuarial memo* rather than a description of what the filing does. The memo is where actuaries put the numerics; the extraction summary is where the pipeline puts the prose. If the question reaches for numbers, hit this surface first. **Wrong surface for**: - *Content* questions ("filings discussing wildfire scoring", "telematics programmes", "parametric triggers") — those discuss what the filing is *about*, not actuarial numerics. Use `search_summary_embeds` (broader coverage). - Concrete-filter questions ("Filings from carrier NAIC 12345 in 2024") — use `search_filings`. - Filings with no actuarial memo. Memos are typically attached to Rate filings; Form, Rule, and Withdrawal filings often have none. Coverage is narrower than `search_summary_embeds` for that reason — most of…

NameTypeReqDescription
querystringyesNatural-language query. Pass the user's actuarial question verbatim — short, specific queries (5-30 words) match best. The query is embedded and cosine-compared against per-filing actuarial-memo embe…
topKintegerNumber of top filings to return. Defaults to 10; capped at 50.

No output schema declared.

No examples provided.

search_filing_embeds ~825

Pure vector search over per-chunk full-document embeddings (`filing_embeds`, ~12.4M rows across ~65K filings — each filing sliced into ~190 paragraph-sized chunks). The most granular semantic surface in the corpus. **Cost**: one query-embedding call + one indexed Postgres lookup. No LLM planning, no LLM composition. **Right surface for**: - "Find the exact passage discussing X" — granular text-search where you need the paragraph not just the filing. - "Find filings whose body text mentions X" when the summary-level surface (`search_summary_embeds`) might miss a topic buried in a long PDF. - **"Drill into this specific filing semantically"** — pass `serff` to restrict the cosine search to a single filing. Without scoping, commodity-vocabulary chunks from other filings can out-rank your target filing; scoping eliminates that. **Wrong surface for**: - Filing-level questions where multiple hits per filing are noise — use `search_summary_embeds` (one match per filing). - Concrete-filter questions like "Filings from carrier NAIC 12345 in 2024" — use `search_filings`. `aggregate: true` (default) collapses to top-K *filings* by best-chunk similarity (one row per filing, the best matching paragraph as excerpt). `aggregate: false` returns top-K raw chunks (may include several from the same filing) — use when the user asked to see the actual paragraphs. When `serff` is set, aggregate is forced to false (every hit is the same filing already). Returns top-K hits, each with `{serff, chunk_index, similarity, excerpt, meta}`. Default `topK=10`, max 50. Excerpt is the first 800 chars of the matching chunk.

NameTypeReqDescription
aggregatebooleanWhen true (default), collapse to top-K filings by best-chunk similarity. When false, return top-K raw chunks (may include multiple chunks from the same filing). Ignored (forced to false) when `serff`…
date_fromstringLower bound on filing date (ISO YYYY-MM-DD).
date_tostringUpper bound on filing date (ISO YYYY-MM-DD).
filing_typestringWildcard match on filing type ("Rate", "Rule", "Form", etc.). Substring match.
naicstringExact NAIC carrier identifier (5-digit string).
predecessor_prefixstringBureau / org SERFF prefix ("ISOF", "NCCI", "AAIS", "MSO").
product_typestringWildcard match on product type. Substring match — "Auto" matches Personal Auto and Commercial Auto.
querystringyesNatural-language query. Pass the user's question verbatim when you can — short, specific queries (5-30 words) match best. The query is embedded and cosine-compared against per-chunk body embeddings.
serffstringOptional SERFF id to scope the chunk search to a single filing (shape PREFIX-IDENTIFIER, e.g. "REGU-134742228"). Use this when you already know which filing you want to read semantically — e.g. "find…
statestringTwo-letter US state code, uppercase. Corpus currently covers CA only.
topKintegerNumber of top hits to return. Defaults to 10; capped at 50. If filters narrow the candidate set below topK you get what's there, no silent fallback to cross-filing matches.
yearintegerExact filing year. Mutually exclusive with year_from/year_to.
year_fromintegerLower bound on filing year, inclusive.
year_tointegerUpper bound on filing year, inclusive.

No output schema declared.

No examples provided.

search_filings ~1,114

Search the SERFF filings corpus by carrier, NAIC, product line, state, year-range, filing type, or bureau lineage. Returns a lite row shape per match (SERFF id, state, year, NAIC, group code, carrier name, product name, filing type / status / date). For the substance of a filing, follow up with `get_filing_summary` once you have a SERFF id. All filters AND together. Defaults: `limit=25`, capped at 100; ordered by filing date descending. Pagination via `offset`. The full count matching the predicate is returned in `total` (independent of `limit`/`offset`) so you can decide whether to paginate or narrow the predicate. Common patterns: - "All California auto filings from 2024" → `state="CA"`, `product_type="Auto"`, `year=2024`. - "Recent rule changes in workers comp" → `product_type="Workers"`, `filing_type="Rule"`, `year_from=2023`. - "Which Progressive filings adopted ISO?" → `search="PRGS"`, `predecessor_prefix="ISOF"`. - "Anything mentioning telematics in the product name" → `search="telematics"`. `predecessor_prefix` answers "filings adopted from a bureau" questions — it restricts to filings that appear in some programme's adopted-from chain, so orphan bureau filings no carrier ever pulled in are excluded. Validated against `/^[A-Z][A-Z0-9]{1,7}-?$/`; trailing dash optional. Invalid values return `{ error: ... }` rather than a row set. Only filings that have been fully read and classified are returned — partial / pre-classification rows are hidden so every result is a filing you can actually reason about.

NameTypeReqDescription
date_fromstringLower bound on filing date as ISO date (YYYY-MM-DD). Use for finer-grained windows than `year_from` allows. Compares against the date the carrier submitted the filing, not the rate effective date.
date_tostringUpper bound on filing date as ISO date (YYYY-MM-DD).
filing_typestringWildcard match on filing type. Common values: "Rate", "Rule", "Rate/Rule", "Loss Cost / Rule", "Form", "Rate/Rule/Form", "Withdrawal", "Correspondence", "Adoption". Substring matches: `filing_type="R…
limitintegerMax rows returned in this call. Defaults to 25; capped at 100. Pair with `offset` to page. Always check `total` in the response to decide whether you need more pages.
naicstringExact match on the NAIC carrier identifier (5-digit string). Use when you know the specific carrier (e.g. "24260" = Progressive Direct). One filing always belongs to exactly one NAIC.
offsetintegerRow offset for pagination. Defaults to 0. Combined with the descending filing-date ordering, `offset=N` skips the most recent N filings matching the predicate.
predecessor_prefixstringBureau or organisation SERFF prefix — common values: "ISOF" (ISO Services), "NCCI" (workers comp loss costs), "AAIS" (American Association of Insurance Services), "MSO" (Mutual Service Organisation).…
product_typestringWildcard match on product type. Common values include "Personal Auto", "Homeowners", "Commercial Auto", "Workers Compensation", "Property", "Liability". Substring matches: `product_type="Auto"` retur…
searchstringFree-text wildcard match across SERFF id, carrier name, and product name. Useful for "anything mentioning Progressive" or "filings whose product name contains 'condo'". Prefer the structured fields b…
statestringTwo-letter US state code, uppercase. The corpus currently covers California (`CA`) only — other state codes will return no rows until additional states are onboarded. One filing always belongs to exa…
yearintegerExact filing year (e.g. 2024). The corpus covers filings from 2005 onward; earlier years return no rows. Mutually exclusive with `year_from`/`year_to` — pick one form.
year_fromintegerLower bound on filing year, inclusive. The corpus covers filings from 2005 onward. Pair with `year_to` for a range, or use alone for "everything since".
year_tointegerUpper bound on filing year, inclusive.

No output schema declared.

No examples provided.

search_products ~1,439

**Scope warning — read before reaching for this tool.** The products corpus is a curated subset of filings, not the canonical breadth. Many filings are absent by design: bureau-only rows, withdrawals, correspondences, prior revisions (collapsed into the latest), and any filing the build pipeline hasn't classified as a substantive programme. For *"what filings exist"*, *"what carriers have filed"*, *"is carrier X in state Y"* questions — use `search_filings`. Reach for `search_products` only when the question is explicitly about programmes, lineage clusters, latest-revision picks, or adoption-source labels. Search the **products** corpus by carrier, state, LOB, year-range, pricing-lineage classification (`adoption_sources`), and chain shape. Products are programme histories — each row is one carrier programme defined by its leaf filing plus an ordered chain of predecessor SERFFs back to a root. By default, returns ONE row per (`company_name`, `state`, `lob`) lineage cluster — the latest revision by `leaf_filing_date`. Pass `all_revisions=true` to get every row including prior revisions of the same programme. Filters AND together. Defaults: `limit=25` capped at 100, ordered by `leaf_filing_date` DESC. `total` is the full predicate-matching count, independent of `limit`/`offset`. Common patterns: - "Full bureau workers-comp programmes in CA" → `state="CA"`, `lob="WORKERS COMPENSATION"`, `adoption_sources_any=["bureau"]`. - "Proprietary commercial-auto programmes 2024+" → `lob="AUTO"`, `leaf_year_from=2024`, `adoption_sources_any=["proprietary"]`. - "Me-too programmes Progressive's chain feeds" → `adoption_sources_any=["me_too","bureau_forms_only"]` (returns either), `company_name="Progressive"`. - "Substantive new-program leaves" → `leaf_likely_new=true`. These are programmes whose own filing carries the full rate manual (high-confidence price-ables). - "Strong-evidence chains" → `chain_evidence_min=0.7` (cosine of leaf vs. immediate parent chunks). `adoption_sou…

NameTypeReqDescription
adoption_sources_anyarrayMatch products whose `adoption_sources` array contains ANY of the listed labels (PostgreSQL `&&` overlap). E.g. `["bureau"]` returns full-bureau-adoption products; `["me_too","bureau_forms_only"]` re…
all_revisionsbooleanWhen true, returns every product including prior revisions of the same lineage cluster. Default false — only the latest revision per (company_name, state, lob) is returned. Use for time-series querie…
chain_evidence_maxnumberUpper bound on `chain_evidence_score`. Use for "low-evidence" diagnostic queries.
chain_evidence_minnumberLower bound on `chain_evidence_score` (cosine similarity of leaf-filing chunks vs immediate-parent chunks, 0-1). Use to find products with strong content-overlap chains (e.g. `chain_evidence_min=0.7`…
company_namestringSubstring (ILIKE) match on the leaf-filing carrier name. Use for "Progressive programmes" type queries.
depthintegerExact chain depth (number of predecessors). depth=0 means a standalone leaf with no chain.
depth_fromintegerLower bound on chain depth, inclusive. Use for "programmes with at least N predecessors".
depth_tointegerUpper bound on chain depth, inclusive.
leaf_likely_newbooleanTrue when the leaf itself is a substantive programme launch — its own filing carries the rate manual (root-type label AND ≥3MB files or ≥200KB embeds). High-confidence buildables.
leaf_serffstringDirect lookup by leaf SERFF id. Exact match. Same as filtering all products that this filing is the leaf of (max one row per leaf).
leaf_yearintegerExact leaf year (e.g. 2026). The leaf is the most recent filing in the chain — this is the programme's most recent revision. Mutually exclusive with `leaf_year_from`/`leaf_year_to`.
leaf_year_fromintegerLower bound on leaf year, inclusive. Use for "programmes whose most recent revision is on or after Y".
leaf_year_tointegerUpper bound on leaf year, inclusive.
limitintegerMax rows returned. Defaults to 25, capped at 100. Pair with `offset` to page.
lobstringSubstring match on product LOB family (state_product_type → falls back to serff_product_type). Common values: "AUTO LIAB/PHYS DAMAGE", "WORKERS COMPENSATION", "OTHER LIABILITY", "MULTI-PERIL", "HOMEO…
offsetintegerRow offset for pagination. Defaults to 0.
root_serffstringFilter to products rooted at this SERFF id. Returns all programmes whose chain terminates at the given root (typically many products share a bureau root).
root_typestringSubstring match on the root filing's type. Common values: "New Program", "Transferred Program", "Auto Class Plan", "Class Plan", "Manual", "Rate". `root_type="New Program"` returns programmes that tr…
statestringTwo-letter US state code, uppercase. The corpus currently covers California (`CA`) only — other state codes will return no rows.

No output schema declared.

No examples provided.

search_summary_embeds ~889

Pure vector search over per-filing extraction-summary embeddings (one embedding per filing, ~59K rows total). Each hit is a filing whose extraction summary is semantically closest to your query, with the matching excerpt and lite filing metadata (state, year, company, product type, filing type, filing date). **Cost**: one query-embedding call + one indexed Postgres lookup. Bounded, cheap, fast. No LLM planning, no LLM composition. Always reach for this before any LLM-driven alternative. **Right surface for *what is this filing about* questions**: - "Show me filings discussing X" — content questions where X is not a concrete filter (wildfire scoring, telematics programmes, autonomous-vehicle exposure, ESG factors, parametric triggers, etc.). - "Find filings that mention <topic>" — when you need to discover filings by content rather than by structured metadata. - "Filings citing trend data on <thing>" — when the question is content-shaped, not numerics-shaped. **Wrong surface for**: - *Actuarial-shape* questions like "filings with credibility under 50%", "filings whose indicated and selected rate diverge sharply", "rate filings where frequency trend is negative". Use `search_actuarial_embeds` — those numerics live in the actuarial memo, not the summary. - Concrete-filter questions like "Filings from carrier NAIC 12345 in 2024" or "ISOF-rooted filings carriers adopted". Use `search_filings` with the typed filters — much faster, no embedding cost at all. - Anything with a SERFF id already in hand — use the `get_filing_*` tools. **How to combine**: - For "recent auto programmes in California with novel rating factors": first `search_filings` (state=CA, product_type="Auto", year_from=…) to get a candidate set, then call this tool over those candidates' descriptions implied by the question. - For "filings whose summary mentions X": this tool alone, then `get_filing_summary` on the top hits to read in full. Returns top-K hits, each with `{serff, similarity, excerpt, m…

NameTypeReqDescription
date_fromstringLower bound on filing date (ISO YYYY-MM-DD).
date_tostringUpper bound on filing date (ISO YYYY-MM-DD).
filing_typestringWildcard match on filing type ("Rate", "Rule", "Form", "Withdrawal", etc.). Substring match.
naicstringExact NAIC carrier identifier (5-digit string). Restricts the cosine search to that carrier.
predecessor_prefixstringBureau / org SERFF prefix ("ISOF", "NCCI", "AAIS", "MSO"). Restricts to filings carriers actually adopted into a programme.
product_typestringWildcard match on product type ("Personal Auto", "Homeowners", "Commercial Auto", "Workers Compensation", etc.). Substring match — "Auto" matches both Personal and Commercial Auto.
querystringyesNatural-language query. Pass the user's question verbatim when you can — short, specific queries (5-30 words) match best. The query is embedded and cosine-compared against per-filing summary embeddin…
serffstringOptional SERFF id to scope the search to a single filing's summary embedding (shape PREFIX-IDENTIFIER). Each filing has at most one summary embedding, so topK is effectively 1 when serff is set.
statestringTwo-letter US state code, uppercase. Corpus currently covers CA only.
topKintegerNumber of top filings to return. Defaults to 10; capped at 50. The result will contain at most this many rows; if filters narrow the candidate set below topK you get what's there, no silent fallback.
yearintegerExact filing year. Mutually exclusive with year_from/year_to.
year_fromintegerLower bound on filing year, inclusive.
year_tointegerUpper bound on filing year, inclusive.

No output schema declared.

No examples provided.