Plain Insurance
insurance.plain/mcpplain.insurancestreamable-httpv1.0.0Scanned
Business insurance quotes for Danish companies, active policies and unsigned offers for review.
8 tools: 5 change things and 3 only read.
- Reads private data · 0
- Reads text others write · 1
- Can send data out · 0
- 1 finding
Anlyon alternative
5 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
8 tools
Changes things 5Claude Code: ask
create_onboardingRecalculates an approved quote and creates offered, unsigned policies, ready for the customer to review and sign on Plain.No findings
Why it is in this group
- The name "create_onboarding" says "create": a word for a change.
Description, as the server wrote it Recalculates an approved quote and creates offered, unsigned policies, ready for the customer to review and sign on Plain. Send the exact quote request again with its quoteId before expiresAt; offers are created for the products with status.value quoted only. Active insurance is rechecked before creation. Retry a failed request on the same connection with the same idempotency key and body. No insurance is accepted, activated or charged. When state.value is awaiting_verification, ask the person for the emailed code. Creates offers for the selected, authorized existing company without recreating it, or onboards a new company. For an existing company, select it with set_company_context and use its CVR; administrator access is required. Uses the connected user's identity: omit email and name. Requires signing in with onboarding:write consent; calling it prompts sign-in when needed. Check list_companies first. idempotencyKey is required. If the connected user's email is confirmed, no email code is needed. Do not reuse a retry key across reconnections; obtain a fresh quote after expiry or insurance changes.
Annotations the server declares
- readOnlyHint: false
- openWorldHint: false
- destructiveHint: false
get_onboarding_payment_linkReturns a one-time link, valid for five minutes, where the person reviews the offers and sets up payment on Plain.Reads text others write1 finding
Why it is in this group
- The name "get_onboarding_payment_link" says "get": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
What it can reach
- untrusted-inputThe description's first sentence says "return" and "review": it reads comments, which other people can write.
Findings
- Warn
The server marks "get_onboarding_payment_link" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}; The name "get_onboarding_payment_link" says "get": a word for reading.
Description, as the server wrote it Returns a one-time link, valid for five minutes, where the person reviews the offers and sets up payment on Plain. The person must open and confirm it. Setting up payment does not accept the offers or charge money. Use the same authorized connection that created the offers and keep the target company selected; continuationToken may then be omitted.
Annotations the server declares
- readOnlyHint: false
- openWorldHint: false
- destructiveHint: false
quote_onboarding_productsCalculates indicative prices for up to twenty products for the company with this CVR, from one flat `answers` object.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Calculates indicative prices for up to twenty products for the company with this CVR, from one flat `answers` object. A plain key answers a question for the company and for every selected product that asks it; `<product>.<name>` answers one product's question. Stored answers and company discounts are not reused; supply required answers explicitly. An optional partnerCode applies that partner's discount. Enum fields use {value, label: {da, en}}. Each product has a status.value: only `quoted` products have a price; `contactPlain` products need an individual offer from Plain and `unavailable` ones cannot be offered (see `issue`). Prices are in DKK (major units) per billingFrequency.value period, with annualPrice for comparison and totals across products. State prices with each quote's `display` text in the customer's language, and always show the `disclaimer`. When pricePerEmployee is true, the price is per employee: say so using the quote's notice, as the customer selects the covered employees on Plain. Unknown answer keys are ignored and reported in warnings; required answers are never inferred. Nothing is bound, created or charged. Works without signing in, as a public new-company quote. Quotes for an existing customer must use the selected, authorized company's CVR. Active products return status.value alreadyInsured with no new-offer price and are excluded from totals and creation; held prerequisites do not need to be selected again. Check list_companies.canCreateOffers before promising to create offers. Quoting itself only needs policies:read. For existing companies, use get_onboarding_payment_link after creating offers for authenticated review; continueUrl is the public new-company signup page and does not apply private policy exclusions.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
- destructiveHint: false
set_company_contextRequires signing in to Plain.No findings
Why it is in this group
- The name "set_company_context" says "set": a word for a change.
Description, as the server wrote it Requires signing in to Plain. Changes the active Plain company for subsequent tool calls on this connection. Use an exact companyId from list_companies. All chats sharing this authorization share the selection. Already-running requests may finish for the previous company.
Annotations the server declares
- readOnlyHint: false
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
verify_onboarding_emailConfirms the signup email with the eight-digit code the person received.No findings
Why it is in this group
- The input takes a statement or command to run (input.code), which can change anything it can reach.
Description, as the server wrote it Confirms the signup email with the eight-digit code the person received. Codes expire after 15 minutes and allow five attempts. Keep the returned capability and continuationToken private. Does not activate insurance.
Annotations the server declares
- readOnlyHint: false
- openWorldHint: false
- destructiveHint: false
Only reads 3Show 3 read-only tools
list_active_policiesRequires signing in to Plain; calling it prompts sign-in when needed.No findings
Why it is in this group
- The name "list_active_policies" says "list": a word for reading.
Description, as the server wrote it Requires signing in to Plain; calling it prompts sign-in when needed. Lists the active insurance policies for the currently selected Plain company on this connection, including product, carrier, dates, price and billing details. Amounts are in major currency units (e.g. DKK). totalPrice is the total price the customer pays; it is legally required to be split into the insurance premium and fees (statutory fees and taxes). Whenever you mention a price, state the total and its split into premium and fees.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
list_companiesRequires signing in to Plain; calling it prompts sign-in when needed.No findings
Why it is in this group
- The name "list_companies" says "list": a word for reading.
Description, as the server wrote it Requires signing in to Plain; calling it prompts sign-in when needed. Lists companies explicitly approved for this Plain connection that you still have access to, and marks the active company. Reports granted scopes and whether the connection can create unsigned offers. Check this before quoting for an existing company or offering to create offers. Reconnect requesting onboarding:write to approve offer creation, or reconnect to approve additional companies. Company permissions are checked separately when creating offers.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- openWorldHint: false
list_onboarding_catalogLists the insurance products a Danish company can be offered and the questions to answer before quoting.No findings
Why it is in this group
- The name "list_onboarding_catalog" says "list": a word for reading.
Description, as the server wrote it Lists the insurance products a Danish company can be offered and the questions to answer before quoting. Pass the company's CVR to resolve industry-specific questions and options. Use product slugs in `products` and question names as keys in `answers`. Employee FTE questions are listed as two whole-number questions, `<name>.fullTime` and `<name>.partTime`, each from 0 to 9999 inclusive; when required, send both counts, including zero. Numeric questions publish min/max limits when configured. Products with automaticQuote:false need manual review, but their questions remain listed so answers can still be collected. Enum fields use {value, label: {da, en}}; use value for logic and label for display. Read-only: nothing is created. Works without signing in. For an existing customer, call list_companies first and select the company with set_company_context. Use its CVR when collecting questions and quoting.
Annotations the server declares
- readOnlyHint: true
- openWorldHint: false
- destructiveHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data or outbound.
- Reads private data0
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write1
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out0
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
The server marks "get_onboarding_payment_link" as not read-only (readOnlyHint: false), and its words say it reads.
What this check looks forMatched text
annotations: {"readOnlyHint":false,"destructiveHint":false,"openWorldHint":false}; The name "get_onboarding_payment_link" says "get": a word for reading.
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 1.0.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http plain https://app.plain.insurance/api/mcpclaude mcp add --transport http plain https://app.plain.insurance/api/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__plain__list_onboarding_catalog",
"mcp__plain__list_companies",
"mcp__plain__list_active_policies"
],
"ask": [
"mcp__plain__quote_onboarding_products",
"mcp__plain__create_onboarding",
"mcp__plain__verify_onboarding_email",
"mcp__plain__get_onboarding_payment_link",
"mcp__plain__set_company_context"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as plain. Review it before you use it.
Capability tags behind 1 rule
- mcp__plain__get_onboarding_payment_link untrusted-input
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/insurance.plain/mcp/verify?hash=bd15b7ed774d6e44609fc39882598a2df2a9b1c7296c4450e11894b8318f2c69" | jq -e '.changed == false'Pinned hash bd15b7ed774d, from Nov 3, 2026, 05:17 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/insurance.plain/mcp/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/insurance.plain/mcp)Source: MCP Registry. Synced Nov 3, 2026, 05:17 UTC.