# Extract Insurance (npm · extract-insurance)

Insurance documents into JSON, with the quote and page behind every value.

- Trust score: 66/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `extract-insurance`: 66/100 (this document), [markdown](https://verifymcp.io/servers/dev-extractinsurance-extract-insurance/extract-insurance.md), [page](https://verifymcp.io/servers/dev-extractinsurance-extract-insurance/extract-insurance)

## Channel facts

- Registry: `npm`
- Package: `extract-insurance`
- Version: `1.2.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 98/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - No install/post-install scripts declared.
  - 30 of 92 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 19/100
  - Repository check failed: no source repository is declared.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 5 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 68/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4801 tokens (~109/item across 44 items; 44 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 88/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 63% of tool parameters carry a description.
- **Tool Safety**: 92/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 4 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "preview_publish" implies "publish" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 45 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Extract Insurance MCP server?

Extract Insurance runs locally as an npm package, launched with npx -y extract-insurance. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add dev-extractinsurance-extract-insurance -- npx -y extract-insurance
```

### Cursor

```json
{
  "mcpServers": {
    "dev-extractinsurance-extract-insurance": {
      "command": "npx",
      "args": [
        "-y",
        "extract-insurance"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "dev-extractinsurance-extract-insurance": {
      "command": "npx",
      "args": [
        "-y",
        "extract-insurance"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add dev-extractinsurance-extract-insurance -- npx -y extract-insurance
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "dev-extractinsurance-extract-insurance": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "extract-insurance"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add dev-extractinsurance-extract-insurance --command npx --arg -y --arg extract-insurance
```

### Hermes

```yaml
mcp_servers:
  dev-extractinsurance-extract-insurance:
    command: "npx"
    args: ["-y", "extract-insurance"]
```

### Netclaw

```json
{
  "McpServers": {
    "dev-extractinsurance-extract-insurance": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "extract-insurance"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add dev-extractinsurance-extract-insurance -t stdio -c npx -a -y extract-insurance
```

### Other

```json
{
  "mcpServers": {
    "dev-extractinsurance-extract-insurance": {
      "command": "npx",
      "args": [
        "-y",
        "extract-insurance"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 66, +1)

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

### 2026-11-03 (score 65, +1)

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

### 2026-11-01 (score 64, +16)

- [security improvement] Malware scan: unverified → pass

### 2026-10-31 (score 48, −15)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 1.2.0 → 1.2.1

### 2026-10-30 (score 63, +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.

### 2026-10-28 (score 62)

First indexed and scored.

## MCP tools (44)

### `sign_in` (~109 tokens)

Sign in

Signs this machine in to Extract Insurance. The first call returns a link and a code: show both to the person and ask them to open the link, check the code and approve. Then call sign_in again: it waits for the approval and saves the key (shared with the extract-insurance CLI; it stops after 90 days without use). Already signed in: says as whom.

Input parameters:

- `wait_seconds` (integer): How long to wait for the approval on a later call (default 45).

### `sign_out` (~26 tokens)

Sign out

Revokes the saved key and deletes it from this machine. Only when the person asks.

### `whoami` (~25 tokens)

Who am I

The account, the key in use and the role of the person it acts as.

### `extract_document` (~359 tokens)

Read a document

Reads one insurance document: a file on this machine (file_path) or an https link (url). PDF, PNG, JPG, HEIC, DOCX, XLSX, CSV, .eml or ZIP. Without workflow or schema you get our standard schema (everything we read); with the person's JSON Schema, their shape; with a workflow, its targets. Returns the result if it ends within wait_seconds (most documents take 40–170 s), else the job id for get_job. Each field: status (accepted, resolved, disputed, missing), value, quote and page; a missing field's absence says why. A file of several documents lists each with its own job_id. Costs $0.15 plus model usage.

Input parameters:

- `fields` (array): Only fields whose path starts with one of these, e.g. ["named_insured", "vehicles"]: for a long document.
- `file_path` (string): A document on this machine (absolute, or relative to the project).
- `only` (array): Only fields with these statuses, e.g. ["disputed"].
- `schema` (object): The person's JSON Schema, as an object.
- `schema_file` (string): Or the path of their JSON Schema file.
- `url` (string): An https link we can fetch (public or signed).
- `wait_seconds` (integer): How long to wait for the end, in seconds (default 45, at most 55: many clients give up at 60). If it isn't done by then, you get the job id: call get_job.
- `workflow` (string): Run one of the person's workflows (id or slug; append @3 or @draft to pin a version).

### `get_job` (~153 tokens)

A job's result

A job's status, where it is, and its result once done; waits up to wait_seconds for the end. fields and only keep a long result small.

Input parameters:

- `fields` (array): Only fields whose path starts with one of these, e.g. ["named_insured", "vehicles"]: for a long document.
- `job_id` (string, required)
- `only` (array): Only fields with these statuses, e.g. ["disputed"].
- `wait_seconds` (integer): How long to wait for the end, in seconds (default 45, at most 55: many clients give up at 60). If it isn't done by then, you get the job id: call get_job.

### `get_evidence` (~190 tokens)

Where a value was read

A picture of the part of the page a field was read from, as the app shows it: each reading's place boxed (green; red when its quote wasn't found word for word); for a cell of a table, the rest of its row (blue, dashed) and the column headers. For a disputed field, to show the person what the page says. For a file of several documents, use that document's job_id. Needs the job's document: not after the account's "delete right after reading" (then the quote and page in the result are what there is). PDF, PNG, JPG and HEIC.

Input parameters:

- `field` (string, required): The field's path, as in the result: named_insured.name, vehicles[1].vin.
- `job_id` (string, required)
- `target` (string): For a workflow with several targets: which target's field.

### `get_standard_schema` (~35 tokens)

Our standard schema

The fields we read from insurance documents, as a JSON Schema: to pick fields, or to write the person's schema against ours.

### `save_filled_file` (~133 tokens)

Save a filled PDF or Excel

For a workflow with a PDF or Excel target: that file filled with a job's values, saved on this machine (never into the chat). With workflow, the job is one of its samples and the file is filled as the draft would.

Input parameters:

- `job_id` (string, required)
- `save_to` (string, required): Where to save it, e.g. out/acord-125.pdf.
- `target` (string, required): The target's id, from the job's result.targets or the workflow's draft.
- `workflow` (string): For a sample: the workflow, to fill it as its draft would.

### `save_document` (~74 tokens)

Save the document a job read

The document a job read (for one document of a file, its own pages), saved on this machine, while we keep it: not after the account's "delete right after reading".

Input parameters:

- `job_id` (string, required)
- `save_to` (string, required): Where to save it, e.g. out/policy.pdf.

### `request_one_document` (~116 tokens)

Ask for a cut file to count as one

A file we cut into several documents (each charged) that the person says is one document: asks us to look. Only our approval gives back the fees past the first. Only when the person says so. Without note: where an earlier request stands. If the file was deleted after reading, give file_path to send it again.

Input parameters:

- `file_path` (string)
- `job_id` (string, required): The file's job (not one of its documents).
- `note` (string): The person's reason, in their words.

### `get_review` (~74 tokens)

What needs the person

A job's disputed fields with each reading (value, quote, page, whether the quote was found word for word) and what the person has answered so far. Show them the readings (get_evidence crops the page) and ask which is right; record their answer with record_answer.

Input parameters:

- `job_id` (string, required)

### `record_answer` (~178 tokens)

Record the person's answer

Saves what the person said a field is: one of its readings (reading, from get_review), the value they typed (value), that the document doesn't have it (not_in_document), or that the value as read is right (confirm); clear takes an answer back. Only their own answer, never your pick. A dispute they settle on a form is used on the account's next documents of that form.

Input parameters:

- `clear` (boolean): Take back an answer given before (the person changed their mind).
- `confirm` (boolean)
- `field` (string, required): The field's path, as in get_review.
- `job_id` (string, required)
- `not_in_document` (boolean)
- `note` (string): The person's words, if they gave a reason.
- `reading` (integer)
- `value`

### `accept_all` (~56 tokens)

All good

Accepts every value not answered yet as right (all: also resolved and missing ones); never a disputed field. Only when the person says the rest is right.

Input parameters:

- `all` (boolean)
- `job_id` (string, required)

### `get_reviewed` (~28 tokens)

The reviewed result

The job's result with the person's answers in it.

Input parameters:

- `job_id` (string, required)

### `list_workflows` (~24 tokens)

Workflows

The person's workflows: id, slug, name, published version, samples.

### `get_workflow` (~74 tokens)

A workflow

One workflow: its draft (targets with their schemas and mappings, policy with its gate: which documents get in), versions, samples with their review, settings, and whether the draft differs from the published version.

Input parameters:

- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `create_workflow` (~111 tokens)

Create a workflow

A new workflow (a draft). Its target is the person's JSON Schema, a PDF or Excel template, else our standard schema. Next: add_sample, then preview_publish and publish_workflow.

Input parameters:

- `name` (string, required)
- `schema` (object): The person's JSON Schema (or an example of their JSON).
- `schema_file` (string): Or the path of that file.
- `template_file` (string): Or a fillable PDF or an .xlsx to fill with each document's values.

### `add_target` (~146 tokens)

Add an output

Adds a target to the workflow's draft: the person's JSON Schema, a PDF or Excel template, or our standard schema (standard: true). Then map it (triage_target, save_draft) and preview_publish.

Input parameters:

- `name` (string)
- `schema` (object): The person's JSON Schema (or an example of their JSON).
- `schema_file` (string): Or the path of that file.
- `standard` (boolean)
- `template_file` (string): Or a fillable PDF or an .xlsx to fill with each document's values.
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `add_sample` (~79 tokens)

Add a sample

Adds a document on this machine to a workflow's samples: publishing is checked against them. It uses the account's free documents first, and is read in the background (preview_publish waits for it).

Input parameters:

- `file_path` (string, required)
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `remove_sample` (~59 tokens)

Remove a sample

Takes a document out of the workflow's samples.

Input parameters:

- `job_id` (string, required): The sample's job id, from get_workflow.
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `preview_sample` (~129 tokens)

A sample in the draft's outputs

What one sample gives in each of the draft's targets, as production would send it once published: to check a mapping before preview_publish.

Input parameters:

- `job_id` (string, required): The sample's job id, from get_workflow.
- `wait_seconds` (integer): How long to wait for the end, in seconds (default 45, at most 55: many clients give up at 60). If it isn't done by then, you get the job id: call get_job.
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `save_draft` (~297 tokens)

Save the draft

Replaces the workflow's draft: send the draft from get_workflow, edited (name, targets with their mappings, policy: resolve_confidence, gate). The published version is untouched until publish_workflow. Which documents get in: policy.gate = {accept: [one choice], on_mismatch, when_unsure}; leave gate out to let every document in. accept: "insurance" (any insurance document); one kind: "policy" (policies, quotes, binders, endorsements), "submission" (applications, loss runs, schedules), "claims", "certificate" (certificates and evidence of insurance), "billing" (invoices, premium audits); or one type of page: "declarations", "loss_run", "application", "certificate_of_insurance". on_mismatch, for a document that is clearly something else: "reject" (refuse it; default) or "warn" (read it anyway, with a warning). when_unsure: "extract" (read it, with a warning; default) or "reject". A refused document costs only the check and is not an extraction; job status "rejected", result.rejected.reason says why. It filters out documents that don't belong; it is not a security control.

Input parameters:

- `draft` (object, required)
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `triage_target` (~100 tokens)

Map a target's fields

For one target of the draft, which of our fields fills each of the person's fields: sure, choose (with candidates), or unknown. Use it to decide the mappings, then save_draft.

Input parameters:

- `hints`
- `only` (array)
- `target` (string, required): The target's id, from get_workflow.
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `preview_publish` (~128 tokens)

What publishing changes

What publishing the draft would change: the mapping, and the values on every sample (values the person confirmed are marked). Show it to the person; its confirmation token is what publish_workflow needs, once they say yes.

Input parameters:

- `wait_seconds` (integer): How long to wait for the end, in seconds (default 45, at most 55: many clients give up at 60). If it isn't done by then, you get the job id: call get_job.
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `publish_workflow` (~99 tokens)

Publish

Publishes the draft as the next version: production runs it from now on. Needs the confirmation from preview_publish of this same draft, and the person's yes. To roll back: restore_version, then publish again.

Input parameters:

- `confirmation` (string, required): From preview_publish.
- `note` (string): What changed, for the version list.
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `restore_version` (~52 tokens)

Restore a version

Copies an earlier version into the draft (publish it to roll back).

Input parameters:

- `version` (integer, required)
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `compare_versions` (~58 tokens)

Two versions' mappings

What the mapping changes between two versions, or a version and the draft.

Input parameters:

- `from` (integer, required)
- `to` (required)
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `update_workflow_settings` (~135 tokens)

Webhook and retention

The workflow's settings, live at once (not versioned): webhook_url (https; null: none), retention_days (how long documents are kept), results_retention_days (how long results are kept), delete_after_read. null: the account's setting. Which documents get in (the gate) is in the draft's policy: save_draft.

Input parameters:

- `delete_after_read` (boolean|null)
- `results_retention_days`
- `retention_days`
- `webhook_url`
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `test_webhook` (~48 tokens)

Test the webhook

Sends a signed test delivery to the workflow's webhook and says what it answered.

Input parameters:

- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `list_runs` (~62 tokens)

Production runs

The workflow's production jobs, newest first: status, file, version, cost, and per target what was filled.

Input parameters:

- `limit` (integer)
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `list_workflow_keys` (~42 tokens)

Production keys

The workflow's keys (never their tokens).

Input parameters:

- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `create_workflow_key` (~279 tokens)

A production key

Makes a key for one workflow (what production uses: it runs that workflow and reads its jobs) and writes it into an env file on this machine, never into the chat. Use an uncommitted file such as .env.local. Returns the key's id and where it went. Code that calls the workflow: POST https://api.extractinsurance.dev/v1/jobs with Authorization: Bearer <key> and the file as the multipart part document (optional part version pins one; default the latest published) → 202 {id}; GET /v1/jobs/{id} until status is no longer queued or running, or let the workflow's webhook receive it; then result.targets.<target id>.value. Read the key from the environment, never write it into the code.

Input parameters:

- `env_file` (string, required): The file to write it to, e.g. .env.local (created if missing; an existing line for env_var is replaced).
- `env_var` (string): The variable's name (default EXTRACT_WORKFLOW_KEY).
- `mode` (string): live (default): published versions; test: also the draft.
- `name` (string): The key's name, e.g. "production".
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `revoke_workflow_key` (~61 tokens)

Revoke a production key

Stops a workflow key at once: production using it gets 401. Only when the person asks.

Input parameters:

- `key_id` (string, required)
- `workflow` (string, required): The workflow's id (wf_…) or its slug, from list_workflows.

### `get_usage` (~35 tokens)

Usage

The month's documents and cost, per workflow, use and key (YYYY-MM; default this month).

Input parameters:

- `month` (string)

### `get_billing` (~41 tokens)

Balance and spend limit

The balance, credit left with its expiry, the monthly spend limit and what's spent, the low-balance alert, automatic top-up, the free documents used.

### `add_credit_link` (~49 tokens)

Where to add credit

The Account page's billing section, where an owner adds credit and sets the spend limit, the low-balance alert and automatic top-up. A key never changes billing; show the person the link.

### `update_account_settings` (~135 tokens)

The account's data settings

How long the account keeps documents (retention_days; null: our default), whether each one is deleted right after it's read (delete_after_read), and whether we may use its documents to improve our reading (improve: the person's consent, only when they say so in their own words); the account's name. Owners only; a workflow's own settings are update_workflow_settings. A shorter retention or deleting right after reading also ends page crops for documents read from then on.

Input parameters:

- `delete_after_read` (boolean)
- `improve` (boolean)
- `name` (string)
- `retention_days`

### `get_activity` (~36 tokens)

Activity

Who did what in the account, newest first, with the key each change was made with (owners).

Input parameters:

- `limit` (integer)

### `list_tickets` (~60 tokens)

Support tickets

The account's support tickets, newest change first, with where each stands: open (waiting on us), waiting (on the person), closed. Also the account's last runs, to name in open_ticket.

Input parameters:

- `status` (string): Default all.

### `get_ticket` (~48 tokens)

A support ticket

A ticket's messages, oldest first (from_us: our answer), and the runs it names.

Input parameters:

- `ticket` (string, required): The ticket's id (tkt_…), from list_tickets.

### `open_ticket` (~112 tokens)

Ask us something

Opens a support ticket: a value read wrong, a run that failed, billing. job_ids names the runs it's about (from list_tickets' recent_jobs or get_job). Only when the person asks: show them the message first, in their words. A person on our side answers, by email to whoever opened the ticket and in the app (Account → Support).

Input parameters:

- `job_ids` (array)
- `message` (string, required): The person's question, in their words.
- `subject` (string, required)

### `answer_ticket` (~101 tokens)

Answer a ticket

Adds the person's answer to a ticket; it waits on us again (a closed one opens again). Only when the person asks: show them the message first, in their words. A person on our side answers, by email to whoever opened the ticket and in the app (Account → Support).

Input parameters:

- `message` (string, required): The person's answer, in their words.
- `ticket` (string, required): The ticket's id (tkt_…), from list_tickets.

### `close_ticket` (~45 tokens)

Close a ticket

Closes a ticket the person says is settled; answering it later opens it again.

Input parameters:

- `ticket` (string, required): The ticket's id (tkt_…), from list_tickets.

### `api_read` (~79 tokens)

Any API read

Any other GET from the Extract Insurance API (described at https://api.extractinsurance.dev/v1/openapi.json), as the person: e.g. /v1/workflows/{id}/versions/2, /v1/jobs/{id}/reviews.

Input parameters:

- `path` (string, required): Under /v1, e.g. /v1/account.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/dev-extractinsurance-extract-insurance/extract-insurance#diagnostics

## Score history

- 2026-11-05: 66
- 2026-11-04: 65
- 2026-11-03: 65
- 2026-11-02: 64
- 2026-11-01: 64
- 2026-10-31: 48
- 2026-10-30: 63
- 2026-10-29: 62
- 2026-10-28: 62

## Common questions

### What is the Extract Insurance MCP server?

Extract Insurance is an MCP server listed in the public MCP registry as dev.extractinsurance/extract-insurance. Insurance documents into JSON, with the quote and page behind every value. This page covers its npm package (extract-insurance).

### Is the Extract Insurance MCP server safe to use?

Extract Insurance scores 66 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Extract Insurance MCP server expose?

Extract Insurance exposes 44 tools: sign_in, sign_out, whoami, extract_document, get_job, and 39 more. Their descriptions and schemas cost roughly 4,280 tokens of context every time the server is loaded.

### Is the Extract Insurance MCP server still maintained?

Extract Insurance is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Extract Insurance MCP server under?

Extract Insurance declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- npm package: https://www.npmjs.com/package/extract-insurance
- Socket report: https://socket.dev/npm/package/extract-insurance
- Website: https://extractinsurance.dev/ai-agents
- Changelog RSS feed: https://verifymcp.io/servers/dev-extractinsurance-extract-insurance/extract-insurance.xml
- Changelog JSON feed: https://verifymcp.io/servers/dev-extractinsurance-extract-insurance/extract-insurance.json
- HTML version of this page: https://verifymcp.io/servers/dev-extractinsurance-extract-insurance/extract-insurance
