Skip to main content
Glama
ThiagoJacobLannes

brasil-planos-saude-mcp

brasil-planos-saude-mcp

MCP server that helps answer "is this health plan any good?" in Brazil. Claude (or any MCP client) can look up a health-plan operator (operadora de plano de saúde) and see what the regulator, ANS, publishes about it: complaints, quality score, access-to-care monitoring, fines and readjustments. It can compare operators side by side and rank them.

Read-only, no key, no account. Everything comes from the ANS open-data portal. Not affiliated with ANS or any operator.

Operators, not plans or prices. ANS publishes these indicators per operator. A single operator sells many plans with different networks; check the network and the price with the operator or a broker.

Not legal advice. For a denied or delayed procedure, use where_to_complain (Disque ANS 0800 701 9656). In an emergency, get care first.

Tools

operator_profile

Everything about one operator: registration and status (active, or cancelled with date and reason), beneficiaries and size class, the complaints index with its position among operators of the same size, five years of IDSS, the access-to-care band, fines, and the small-group readjustment.

Parameters: operator (name or part of it, CNPJ, or ANS registry number), coverage (medica or odonto). A shared brand such as "Unimed" (hundreds of separate cooperatives) returns the largest matches and asks for a more specific name.

compare_operators

Two to eight operators side by side: 12-month complaints index against the median of their size class, latest IDSS, latest access-to-care band, fines in the last five years, latest small-group readjustment.

Parameters: operators (list), coverage.

rank_operators

Active operators ranked by complaints (by="reclamacoes", lower is better) or quality (by="qualidade", latest IDSS, higher is better).

Parameters: by, coverage, porte (pequeno, medio, grande), uf, modality, min_beneficiaries (default 5000), worst_first, limit.

find_operators

Search by name, CNPJ or registry number, or list by head-office state, city or modality (cooperativa médica, medicina de grupo, seguradora, autogestão, odontologia de grupo, filantropia). Largest first.

where_to_complain

The official ANS channels, checked on the ANS consumer-service page, and how a complaint (NIP) works.

Related MCP server: Consulta de Multas

What the numbers mean

Indicator

What it is

Better

Updated

IGR (Índice Geral de Reclamações)

Complaints to ANS per 100,000 beneficiaries in a month (2023 method). ANS compares operators of the same size: small < 20k, medium 20k-100k, large > 100k beneficiaries. The server also gives a 12-month average, which is steadier.

lower

monthly

IDSS (Índice de Desempenho da Saúde Suplementar)

ANS's yearly 0-1 score, with four dimensions: quality of care (IDQS), access (IDGA), market sustainability (IDSM), processes and regulation (IDGR).

higher

yearly

Garantia de atendimento

Quarterly band for denied or delayed coverage: 0 no upheld complaints, 1 below the median, 3 more than 50% above the median. Band 3 again and again leads ANS to suspend sales of plans.

lower

quarterly, when ANS publishes

Penalidades

Fines ANS applied, by year and status, including fines under appeal, suspended or archived. Not what was paid.

fewer, relative to size

when ANS publishes

Reajuste do agrupamento

The readjustment the operator applied to its pool of collective contracts with fewer than 30 lives. Individual/family plans follow a cap set by ANS instead.

yearly

Every result says which month, quarter or year each figure belongs to, and links the file it came from.

Data and cache

The first call downloads seven ANS files (about 65 MB) and keeps a compact copy (about 1 MB) in your user cache folder. After 24 hours the server asks ANS whether a file changed and downloads it again only if it did. If ANS is down, it uses the cached copy and says so. To fill the cache in advance:

brasil-planos-saude-mcp --refresh

Set BRASIL_PLANOS_SAUDE_CACHE_DIR to use another folder.

The operator registry file also has the operator's contact e-mail and the name of its legal representative. This server leaves both out.

Install

Quickest (needs uv): no clone needed, it runs straight from PyPI.

claude mcp add brasil-planos-saude -- uvx brasil-planos-saude-mcp

For Claude Desktop, use "command": "uvx", "args": ["brasil-planos-saude-mcp"].

From source:

Requires Python 3.10+.

git clone https://github.com/ThiagoJacobLannes/brasil-planos-saude-mcp
cd brasil-planos-saude-mcp
python -m pip install -e .

On Windows, if you keep code in a cloud-synced folder (Google Drive, OneDrive), create the virtual environment outside it. Sync clients drop desktop.ini files into folders, which can crash packages on startup.

Add to Claude Code

claude mcp add brasil-planos-saude -- python -m brasil_planos_saude_mcp.server

Add to Claude Desktop

Merge claude_desktop_config.snippet.json into your Claude Desktop claude_desktop_config.json, then restart Claude Desktop:

{
  "mcpServers": {
    "brasil-planos-saude": {
      "command": "python",
      "args": ["-m", "brasil_planos_saude_mcp.server"]
    }
  }
}

Example questions

  • "Is Hapvida any good? How does it do on complaints?"

  • "Compare Amil, Bradesco Saúde, SulAmérica and Porto Seguro."

  • "Which large health plans get the fewest complaints?"

  • "Best-rated dental plans."

  • "Has Unimed Campinas been fined by ANS?"

  • "My plan denied a procedure. Where do I complain?"

License

MIT

Available Tools

5 tools
compare_operatorsA

Side-by-side comparison of 2 to 8 health-plan operators on the ANS indicators.

Use for "Amil or Bradesco Saúde?", "compare the plans my company offers". For each operator: 12-month complaints index (IGR) with the median of its size class and its position, latest IDSS, latest access-to-care band, number of fines in the last 5 years, and the latest small-group readjustment.

Args: operators: Names, CNPJs or ANS registry numbers, e.g. ["Amil", "Bradesco Saúde", "SulAmérica"]. coverage: "medica" (default) or "odonto".

NameRequiredDescriptionDefault
coverageNomedica
operatorsYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden, and it discloses the exact output payload per operator (IGR with size-class median and position, IDSS, access-to-care band, 5-year fines count, small-group readjustment). It doesn't mention behavior on unknown/ambiguous operator names or error handling, which is the main remaining gap for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence and the example phrasings immediately follow. The 'For each operator' list is long but each item is load-bearing output detail, so it earns its space despite the density.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param read tool with no annotations, the description covers scope, inputs, and output contents thoroughly; the existence of an output schema means the enumerated metrics are bonus rather than required. Missing only edge-case behavior (invalid or ambiguous operator identifiers), which prevents a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: it defines accepted operator identifier forms (names, CNPJs, ANS registry numbers) with an example, and enumerates the coverage values ('medica' default, 'odonto') that the schema leaves as a bare string. It could clarify what medica vs odonto changes in the output, keeping it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (side-by-side comparison), resource (health-plan operators), and scope (2 to 8 operators on ANS indicators). This clearly distinguishes it from operator_profile (single operator) and rank_operators (ranking), so an agent can pick it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete triggering questions ('Amil or Bradesco Saúde?', 'compare the plans my company offers'), which clearly signals the use case. It doesn't explicitly state when NOT to use it or name the sibling alternatives (rank_operators, operator_profile), so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_operatorsA

Find Brazilian health-plan operators (operadoras de planos de saúde) registered with ANS.

Use it to turn a brand the user mentions ("Unimed BH", "Amil", "Bradesco Saúde") into the ANS registry number, or to list operators by state, city or type. Largest first.

Args: query: Part of the name, the CNPJ, or the ANS registry number. Accents and case don't matter. Several words must all match ("unimed campinas"). uf: State of the operator's head office, e.g. "SP", "MG". city: City of the head office, e.g. "Belo Horizonte". modality: e.g. "Cooperativa Médica", "Medicina de Grupo", "Seguradora", "Autogestão", "Odontologia de Grupo", "Filantropia", "Administradora de Benefícios" (substring match). include_cancelled: Also list operators whose registration was cancelled. limit: How many to return (default 10, max 50).

Each operator: registro_ans, name, legal name, modality, head office, status, and beneficiaries and size class (porte) per coverage. Head office is not where the operator sells plans.

NameRequiredDescriptionDefault
ufNo
cityNo
limitNo
queryNo
modalityNo
include_cancelledNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses result ordering ('Largest first'), the default and maximum result count (10, max 50), that modality is a substring match, that query words are ANDed, that accents/case are normalized, and a non-obvious domain caveat that head office is not where the operator sells plans. It does not state pagination behavior or explicitly frame the operation as read-only, so it is not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-sentence purpose, then usage, then an Args block, then the return shape — a clean, scannable structure. The modality enumeration is long but each value is a legitimate allowed input, and every section earns its place; only minor tightening is possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter search tool with an output schema present, the description supplies everything an agent needs: what it searches, how matching works, ordering, limits, cancellation handling, and even a summary of returned fields. Nothing material is left to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate entirely, and it does: every one of the six parameters is explained with examples, defaults (limit default 10, max 50; include_cancelled semantics), and matching rules (substring for modality, all-words-must-match for query, accent/case insensitivity). This adds real meaning that the bare schema titles could never convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — find Brazilian health-plan operators registered with ANS — and immediately gives the two concrete jobs it performs (brand name → ANS registry number, or listing by geography/type). This is clearly a discovery/lookup tool, distinguishable from siblings like operator_profile, compare_operators and rank_operators which operate on already-identified operators.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the triggering scenario ('turn a brand the user mentions ("Unimed BH", "Amil") into the ANS registry number') and the alternative scenario (list by state, city or type), which is exactly the when-to-use guidance an agent needs. It does not name sibling tools or state exclusions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

operator_profileA

Everything ANS publishes about one health-plan operator, to judge whether it is a good choice.

Use for "is Hapvida good?", "how does Unimed Campinas rank on complaints?", "has SulAmérica been fined?". Returns:

  • registration: legal name, CNPJ, modality, head office, phone, status (active or cancelled, with date and reason), beneficiaries and size class;

  • complaints (IGR): latest month, 12-month average, the median of operators of the same size, the operator's position among them, and the monthly series;

  • quality (IDSS, 0-1, higher is better) for the last 5 years with its four dimensions;

  • access-to-care monitoring band (0 best, 3 worst) for the last published quarters;

  • fines applied by ANS: totals, last 5 years, status and the most recent cases;

  • the readjustment applied to its small-group pool (contracts with < 30 lives).

Args: operator: Name (or part of it), CNPJ, or ANS registry number. If the name matches several operators, the largest active one is used and the others are listed in outras_operadoras_com_nome_parecido: check it is the one the user meant (Unimed, for example, is hundreds of separate cooperatives). coverage: "medica" or "odonto". Default: every coverage the operator has.

Always quote the month/year of each figure and explain that IGR is lower-is-better and IDSS higher-is-better (see como_ler in the result).

NameRequiredDescriptionDefault
coverageNo
operatorYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses the full data scope (six domains), the meaning of directionality (IGR lower-is-better, IDSS higher-is-better), and an important silent fallback ('the largest active one is used') with a pointer to outras_operadoras_com_nome_parecido for verification. It omits any statement about permissions, rate limits, or read-only nature, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then a scannable bulleted return breakdown, then args — good ordering with no filler sentences. The per-field return enumeration is somewhat long given an output schema already exists, which is the main redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An agent has everything needed to call it correctly: input formats, ambiguity handling, coverage default, and interpretation guidance for the returned metrics (with a pointer to como_ler). Since an output schema exists, the description is not obliged to enumerate return fields further.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must do all the work and it does: 'operator' accepts name/partial name, CNPJ, or ANS registry number, and it explains the multi-match resolution behavior. 'coverage' gets its two allowed values ('medica'/'odonto') and its default, which the schema's untyped anyOf string/null cannot convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb-scoped statement: 'Everything ANS publishes about one health-plan operator', plus the decision it supports. It is clearly an entity-detail tool and is distinguishable from siblings like compare_operators or rank_operators, which act on multiple operators.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Example questions ('is Hapvida good?', 'has SulAmérica been fined?') make the intended use case concrete and give the agent a trigger pattern. It does not explicitly state when to prefer find_operators or compare_operators instead, so the routing guidance is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rank_operatorsA

Rank active health-plan operators by complaints or by quality.

Use for "which large health plans get the fewest complaints?", "best-rated dental plans", "worst operators in Minas Gerais".

Args: by: "reclamacoes" (12-month IGR, lower is better) or "qualidade" (latest IDSS, higher is better). coverage: "medica" (default) or "odonto". porte: "pequeno" (< 20k beneficiaries), "medio" (20k-100k) or "grande" (> 100k). ANS itself only compares operators of the same size. uf: Head-office state, e.g. "MG". Not the same as where it sells plans. modality: e.g. "Cooperativa Médica", "Medicina de Grupo", "Seguradora". min_beneficiaries: Skip operators smaller than this (default 5000; tiny ones swing wildly). worst_first: True to list the worst first. limit: How many to return (default 10, max 50).

NameRequiredDescriptionDefault
byNoreclamacoes
ufNo
limitNo
porteNo
coverageNomedica
modalityNo
worst_firstNo
min_beneficiariesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it explains ranking direction, defaults, the ANS same-size comparison constraint, and why tiny operators are excluded by default. It does not explicitly declare read-only behavior or permissions, but the ranking/query nature is clear and the output schema covers return structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and concrete examples, then efficiently documents each parameter. Despite eight parameters, every line adds useful information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is substantially complete for a complex eight-parameter tool: all parameters are explained, output schema covers return values, and key caveats are included. The main remaining gap is explicit routing guidance versus sibling tools such as compare_operators and find_operators.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

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 for all eight parameters. It does so thoroughly: it defines allowed values for by and coverage, explains porte thresholds, clarifies that uf means head-office state, gives modality examples, and documents defaults and limits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: ranking active health-plan operators by complaints or quality. The example questions make the ranking purpose concrete, though it does not explicitly contrast itself with sibling tools such as compare_operators or find_operators.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides clear usage contexts through example questions like 'which large health plans get the fewest complaints?' and 'best-rated dental plans'. It does not explicitly state when to choose this over sibling tools, but the intended use cases are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

where_to_complainA

How to complain about a health plan in Brazil: the official ANS channels and the steps.

Use when a user's plan denied or delayed a procedure, or they have a contract problem. Each channel was checked on the ANS consumer-service page (conferido_em).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries disclosure duty, and it does add provenance the schema cannot express: each channel was 'checked on the ANS consumer-service page (conferido_em)'. It doesn't discuss return shape or how many channels come back, but for a zero-parameter read-only guidance lookup the behavioral risk surface is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short lines: what it returns, when to call it, and how the data was verified. The trigger sentence is front-loaded right after the purpose statement and no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description needn't spell out the return format, and it already covers purpose, trigger and data provenance. What is slightly missing is any hint of scope limits (e.g. whether it covers only ANS-regulated plans vs. employer self-funded plans), which matters for this domain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing semantic to explain and the baseline for an argument-free tool applies. The description correctly implies a no-input lookup by not suggesting any audience/state/locale scoping.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific resource and scope: 'the official ANS channels and the steps' for complaining about a Brazilian health plan. The sibling tools (operator_profile, find_operators, compare_operators, rank_operators) are all operator-data tools, so this guidance tool is unambiguously distinct from every one of them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger: 'Use when a user's plan denied or delayed a procedure, or they have a contract problem.' That is a clear invocation condition covering the two main scenarios. It does not name an alternative or exclusion, but no sibling could plausibly be confused with it.

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.

  1. 5 tool updatesv0.1.0
    • First observedcompare_operators
    • First observedfind_operators
    • First observedoperator_profile
    • First observedrank_operators
    • First observedwhere_to_complain

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool targets a distinct task: single-operator deep lookup, operator discovery/search, multi-operator comparison, ranked lists, and complaint-channel guidance. The boundaries are reinforced by clear use-case examples in the descriptions, so an agent can reliably choose the right tool. There is minor overlap between find/compare/rank because all involve operators, but their purposes and outputs are sharply differentiated.

Naming Consistency4/5

Most names follow a clear verb_noun or action pattern: find_operators, compare_operators, rank_operators. operator_profile is noun-based and where_to_complain is a phrase, which are minor deviations but still readable and intuitive. The overall set is consistent enough to predict tool behavior.

Tool Count5/5

Five tools is well-scoped for a focused domain of Brazilian health-plan operator data and consumer guidance. Each tool earns its place: search, profile, comparison, ranking, and complaint routing. There is no obvious redundancy or missing major workflow.

Completeness4/5

The surface covers discovery, detailed profile retrieval, comparison, ranking, and complaint guidance, which addresses the core informational needs of the domain. Minor gaps might include a dedicated tool for plan/product-level details or direct access to underlying time-series data, but these are workable through operator_profile. The read-only nature of the server makes CRUD lifecycle coverage less relevant.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables users to query public Brazilian vehicle and traffic data from official sources, including vehicle debts (IPVA, licensing, open fines), federal infractions by plate/RENAVAM, vehicles registered to an owner, and driver's license status.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables natural-language querying of Brazilian public health indicators from DataSUS microdata — mortality, dengue, hospitalizations, ICSAP, and births — through 41 tools covering consultation, analysis (peer-stratum comparison, dengue endemic channel, weekly bulletin), reliability warnings, and anomaly detection. It runs locally against the public API with anti-hallucination rules so every figure comes from a tool with its source cited.
    MIT