Skip to main content
Glama

npi-providers-mcp-server

Server Details

Search NPPES providers and resolve NUCC specialty codes via MCP over STDIO or Streamable HTTP.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 80 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/npi-providers-mcp-server
GitHub Stars
1
Server Listing
npi-providers-mcp-server
ChatGPT
–
Claude
–

TDQS

A4.4/5.0

Scored across 3 tools

Disambiguation5/5

The three tools target clearly distinct jobs: retrieve a provider by NPI, search providers by criteria, and resolve/browse taxonomy codes. Descriptions explicitly connect specialty resolution to search and NPI results to retrieval, so an agent can select without ambiguity.

Naming Consistency5/5

All tools share the predictable `npi_` prefix followed by a verb_noun pattern: `npi_get_provider`, `npi_lookup_taxonomy`, `npi_search_providers`. The verbs are distinct and consistently snake_case.

Tool Count5/5

Three tools is a well-scoped surface for a read-only NPI lookup server, with each tool covering a core workflow: search, detail retrieval, and taxonomy reference. There are no redundant or filler tools.

Completeness4/5

The surface covers the key read-only workflows for NPPES provider lookup: search, retrieval by NPI, and specialty/taxonomy resolution. Minor gaps exist around bulk retrieval limits—only the first 10 distinct valid NPIs are processed per get call—and there is no standalone NPI validation tool, but agents can work around these limitations.

Available Tools

3 tools
npi_get_providerNpi Get ProviderA
Read-onlyIdempotent
Inspect

Fetch NPPES records from up to 100 raw NPI entries per call. Deduplicate in input order, validate check digits, and look up the first 10 distinct valid NPIs; remaining valid NPIs are listed in unprocessed and are never looked up. Decodes an NPI from a claim, prescription, or another health data source into the provider's professional-practice profile: every taxonomy with its primary flag, license number and state; practice addresses with phone and fax (only LOCATION rows are kept for individual providers, so their mailing address is withheld; organizations also carry their mailing address); credential, sex, sole-proprietor flag; enumeration and last-updated dates; active/deactivated status; secondary identifiers (Medicaid, etc.); and FHIR/Direct endpoints. Each NPI must be 10 digits with a valid check digit (its last digit); every NPI failing the check digit lands in invalid and is never looked up. Reports partial success: valid NPIs with no registry record (deactivated or never enumerated) land in notFound, while NPIs whose lookup hit an upstream error (registry unavailable, timeout) land in errored — kept distinct from confirmed misses — rather than failing the whole call.

NameRequiredDescriptionDefault
npisYesA single 10-digit NPI, or an array of up to 100. Entries are deduplicated in order, then check digits are validated; the first 10 distinct valid NPIs are looked up and any remaining valid NPIs are listed in unprocessed. Every invalid NPI is reported in invalid.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
foundNoDecoded records for NPIs that resolved.
noticeNoGuidance when some NPIs failed the check digit, returned no record, or hit an upstream error.
erroredNoNPIs whose lookups failed with an upstream/transport error (service unavailable, timeout) — distinct from a confirmed miss in notFound. These are unresolved, not absent; retry them.
invalidNoNPIs that failed the NPI check digit — not valid NPIs, usually a typo. They were never looked up, so they are neither confirmed misses nor upstream failures.
notFoundNoNPIs with a valid check digit that returned no record (deactivated or never enumerated). A confirmed absence, not a failure.
totalCountNoNumber of provider records that resolved from the requested NPIs.
unprocessedNoDistinct valid NPIs beyond the first 10, in input order; not looked up. Present only when the lookup limit is exceeded.

TDQS

A4/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly/idempotent/openWorld), and the description adds substantial behavior beyond them: dedup in input order, check-digit validation, the first-10-distinct lookup cap, remaining NPIs surfaced as unprocessed, and a clear distinction between notFound (confirmed miss) and errored (upstream failure) rather than failing the whole call. It also discloses the data-shaping rule that only LOCATION rows are kept for individuals, withholding their mailing address.

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 leading sentence is front-loaded with the essential scope (up to 100 entries per call, NPPES). It is dense but nearly every clause carries substantive information; the second sentence's heavy nested parentheticals and em-dash chains make it harder to scan than it needs to be.

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 one-parameter, read-only, open-world tool with annotations and an output schema, the description supplies everything an agent needs: batching limits, validation rules, partial-success buckets, and data-shaping caveats. Return-value detail is redundant with the output schema but not harmful.

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

Parameters3/5

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

With a single parameter and 100% schema coverage, the schema already documents the format, the 10-digit pattern, the Luhn/80840 check digit, and the dedup-first-10 rule. The description largely restates those constraints rather than adding new parameter-level meaning, so the baseline 3 is appropriate.

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?

States a specific verb and resource — fetching NPPES records and decoding an NPI into a professional-practice profile — with concrete detail on what the profile contains. The one gap is that it never names or contrasts with the siblings (npi_lookup_taxonomy, npi_search_providers), so an agent must infer why this is the right tool rather than a search or taxonomy lookup.

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

Usage Guidelines3/5

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

"Decodes an NPI from a claim, prescription, or another health data source" gives an implicit use case, and the 10-lookup cap plus partial-success semantics communicate operational context. There is no explicit when-to-use/when-not or routing to the sibling tools, so alternative selection is left to inference.

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

npi_lookup_taxonomyNpi Lookup TaxonomyA
Read-onlyIdempotent
Inspect

Resolve and browse the NUCC Healthcare Provider Taxonomy — the specialty code set NPPES uses — fully offline (bundled). Mode resolve turns a plain-language specialty (e.g. "cardiologist", "heart doctor") into matching active taxonomy entries, excluding codes NUCC marks inactive; mode get returns the full entry for an exact code, including NUCC's Notes; mode browse walks the hierarchy (grouping → classification → specialization), optionally filtered by grouping and NUCC section. Individual includes Group codes; section does not determine NPI entity type, which comes from NPPES enumeration_type. Every entry carries its status, and an inactive code names its replacement when NUCC gives one; get and browse still return inactive codes. A resolved entry's specialization, or its classification when specialization is absent, maps directly to npi_search_providers.taxonomy_description.

NameRequiredDescriptionDefault
codeNoFor get only: exact NUCC taxonomy code, e.g. "207RC0000X".
modeYesresolve: plain-language specialty to codes; get: exact code; browse: hierarchy.
skipNoEntries to skip before the page (0–1000). Keep the same query and limit, then raise skip by limit each call.
limitNoMaximum entries for resolve/browse; defaults to 20. Positive integers above 50 are clamped to 50 unless NPI_CLAMP_LIMITS is disabled.
queryNoThe plain-language specialty term to resolve, e.g. "pediatric cardiologist".
sectionNoFor browse only: NUCC section, independent of NPI entity type. Individual includes Group codes.
groupingNoFilter to a top-level grouping by case-insensitive substring, e.g. "physicians".

Output Schema

NameRequiredDescription
capNoThe limit that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of entries returned.
noticeNoGuidance — how to page a truncated result with skip, or how to broaden when nothing matched.
matchesNoMatching taxonomy entries. For mode "get" this is the single requested entry; for "resolve"/"browse" it is the ranked/sorted matches up to limit.
truncatedNoTrue when the list was capped at `limit` (more entries may match).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/closed-world, so the bar is met; the description goes further by disclosing that the dataset is fully offline and bundled, that inactive codes carry replacement pointers when NUCC supplies them, and how status is surfaced on every entry. That is genuine behavioral context an agent cannot get from the annotations.

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

Conciseness4/5

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

Front-loaded with the core identity, then modes, then caveats — no filler sentences. The mode clauses are packed into one long paragraph, which is dense but every clause carries distinct information; minor readability cost keeps it from a 5.

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?

With 7 parameters, enum modes, and an output schema already documenting return shape, the description fills exactly the remaining gaps: mode selection, inactive-code behavior, hierarchy traversal, and the handoff to npi_search_providers. Nothing an agent needs to invoke correctly is missing.

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 100%, so the baseline is 3; the description adds real meaning on top: `section` is independent of NPI entity type, and Individual includes Group codes. It does not elaborate on pagination interaction between skip/limit beyond what the schema already states, so it stops short of 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+resource (resolve/browse the NUCC Healthcare Provider Taxonomy) and enumerates all three modes with their distinct semantics. It also positions itself against the sibling by noting the resolved value maps directly to npi_search_providers.taxonomy_description, so an agent can tell where this tool ends and the sibling begins.

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

Usage Guidelines5/5

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

Explicit mode routing: `resolve` for plain-language terms, `get` for exact codes, `browse` for hierarchy walking. It adds the non-obvious exclusion rule that `get`/`browse` still return inactive codes while `resolve` filters them out, and warns that `section` does not determine NPI entity type — a common misuse the agent would otherwise make before calling npi_get_provider.

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

npi_search_providersNpi Search ProvidersA
Read-onlyIdempotent
Inspect

Search the NPPES NPI registry for individual practitioners and healthcare organizations by name, organization name, location, provider type, and specialty. Plain-language specialty terms (e.g. "cardiologist", "pediatric cardiologist") resolve through the bundled NUCC taxonomy; the top match's specialization or classification becomes taxonomy_description, and all resolved candidates are returned in metadata. Location belongs in the dedicated city/state/postal_code inputs, not inside specialty. Each provider row includes the NPI, name, primary specialty, city/state/ZIP, type, and active/deactivated status; the NPI is the input for npi_get_provider when the full record is needed. At least one search criterion is required, and the registry rejects state-only searches. When city/state/postal_code are given, only practice addresses are searched, never mailing addresses: a provider is returned only when its primary practice location or one of its other practice locations matches all of them. A provider kept on another practice location names it in matchedLocation. Name searches also match former and other names, sorted by current name; such a row names the matching name in matchedOtherName. The registry never reports a true match total, and one search reaches only its first 1200 matches: a full page names the next in nextPage, and the terminal window (skip 1000, limit 200) returns continuationPostalCodes, postal_code prefixes that continue the search.

NameRequiredDescriptionDefault
cityNoPractice-location city, case-insensitive. A trailing "*" after at least 2 characters matches every city starting with them (e.g. "SAN F*").
skipNoResults to skip for pagination (0–1000). A full page names the next in nextPage.
limitNoMaximum providers to return (default 10). Values above 200 are clamped to the registry cap of 200 with a notice.
stateNo2-letter state code (e.g. "WA"). The registry rejects state-only searches, so another criterion is required. A blank value is treated as omitted.
last_nameNoIndividual last name. Trailing wildcard "*" allowed with at least 2 leading characters.
specialtyNoPlain-language specialty (e.g. "pediatric cardiologist"), resolved through the bundled NUCC taxonomy to exact descriptions before searching. Codes NUCC marks inactive are never resolved. The matched taxonomy is echoed in the result. Mutually exclusive with taxonomy_description.
first_nameNoIndividual first name. Trailing wildcard "*" allowed with at least 2 leading characters.
name_searchNoOne person's name. The first token becomes first_name and the last token becomes last_name; use first_name/last_name when middle names or multi-part surnames matter.
postal_codeNoPractice-location ZIP code: 5 digits (also matching the ZIP+4 codes that extend it), 9 digits, or a 2–9 digit prefix with one trailing "*" (e.g. "98*", "981*"). A ZIP+4 prefix (6+ digits) never matches a practice address recorded with only a 5-digit ZIP.
provider_typeNoRestrict to individuals (NPI-1) or organizations (NPI-2). Omit to search both; when set, it must match the name fields ("individual" for first_name/last_name/name_search, "organization" for organization_name).
organization_nameNoOrganization name (implies provider_type organization; cannot be combined with first_name, last_name, or name_search). Trailing wildcard "*" allowed with at least 2 leading characters.
taxonomy_descriptionNoExact NUCC taxonomy description for direct passthrough — use when the taxonomy description is already known. Mutually exclusive with specialty.
use_first_name_aliasNoInclude first-name variants (default true upstream). False requests exact first-name matching. Applies to the resolved first_name, including name_search, only without a wildcard; other-name matching remains enabled.

Output Schema

NameRequiredDescription
capNoThe limit that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of providers returned.
noticeNoGuidance — the page-size-not-total caveat, the next page or terminal-window continuation procedure, other-name and location-filter counts, or how to broaden an empty result.
nextPageNoThe next page: re-run the same arguments with this skip and limit. Present after a full page while rows remain reachable. When skip + limit passes 1000 it is skip 1000, limit 200, whose leading rows repeat rows already returned (the notice says how many) — dedupe by NPI.
providersNoMatching provider rows (up to limit).
truncatedNoTrue when the NPPES page contained at least cap providers before location constraints were applied; more may match even when shown is below cap.
resolvedTaxonomiesNoTaxonomy candidates ranked for the specialty term. The first candidate supplies appliedTaxonomyDescription; a different candidate can be selected through taxonomy_description.
appliedFirstNameAliasNoEffective first-name alias expansion for a resolved non-wildcard first name, including the upstream default true. Absent when no first name exists or it contains a wildcard.
continuationPostalCodesNoPresent only at the terminal window (a full page at skip 1000, limit 200): postal_code prefixes that continue the same search, each re-run from skip 0 with the same arguments — the notice gives the full procedure. Empty when no postal split remains (postal_code is already a 5-digit ZIP, a full ZIP+4, or not a numeric ZIP prefix).
appliedTaxonomyDescriptionNoThe exact NUCC specialization or classification used as the specialty filter.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover readOnly, idempotent, openWorld, but the description adds substantial operational context beyond them: the 1200-match window, nextPage pagination and the terminal-window continuationPostalCodes, practice-vs-mailing address semantics with matchedLocation, former-name matching with matchedOtherName, and that no true total is ever reported. These are non-obvious behaviors an agent needs.

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 purpose and searchable fields, then escalates to constraint and pagination edge cases; nearly every sentence carries operational value. It is dense and long, and a few clauses (e.g. location-not-in-specialty) could be tightened, but there is little true waste.

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 13-parameter, open-world registry search with an output schema covering return values, the description supplies everything an agent needs: criteria constraints, address-scope semantics, pagination limits, and sibling routing. Nothing material is left unstated.

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 100%, so baseline is 3, but the description adds meaning beyond the schema: how specialty resolution chooses the top match and echoes all candidates in metadata, that name_search tokenizes into first/last, and that provider_type must align with the name field used. Some content (wildcard rules, ZIP+4 nuance) duplicates the schema, 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 and resource ('Search the NPPES NPI registry') plus the full set of supported criteria, and explicitly routes to the sibling npi_get_provider for full records. An agent can distinguish this search tool from both siblings without opening their schemas.

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

Usage Guidelines5/5

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

Gives explicit selection rules: use specialty for plain-language terms vs taxonomy_description for known codes (mutually exclusive), location goes in dedicated inputs not specialty, name_search vs first_name/last_name, and the hard constraint that at least one criterion is required with state-only rejected. This is when/when-not/alternatives guidance at its fullest.

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. 3 tool updates
    • Changednpi_get_provider4 fields changed
      • changedInput schema / properties / npis / anyOf
        Previous value: -[
        -  {
        -    "description": "A 10-digit National Provider Identifier whose last digit is its check digit (Luhn over the number prefixed with 80840).",
        -    "pattern": "^\\d{10}$",
        -    "type": "string"
        -  },
        -  {
        -    "description": "An array of up to 10 ten-digit NPIs.",
        -    "items": {
        -      "description": "A 10-digit National Provider Identifier whose last digit is its check digit (Luhn over the number prefixed with 80840).",
        -      "pattern": "^\\d{10}$",
        -      "type": "string"
        -    },
        -    "maxItems": 10,
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A 10-digit National Provider Identifier whose last digit is its check digit (Luhn over the number prefixed with 80840).",
        +    "pattern": "^\\d{10}$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "An array of up to 100 ten-digit NPIs; only the first 10 distinct valid NPIs are looked up.",
        +    "items": {
        +      "description": "A 10-digit National Provider Identifier whose last digit is its check digit (Luhn over the number prefixed with 80840).",
        +      "pattern": "^\\d{10}$",
        +      "type": "string"
        +    },
        +    "maxItems": 100,
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / npis / description
        Previous value: -"A single 10-digit NPI, or an array of up to 10. Each must be exactly 10 digits; each is also checked against its NPI check digit before any API call, and one that fails is reported in invalid."New value: +"A single 10-digit NPI, or an array of up to 100. Entries are deduplicated in order, then check digits are validated; the first 10 distinct valid NPIs are looked up and any remaining valid NPIs are listed in unprocessed. Every invalid NPI is reported in invalid."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `none_found`: Every requested NPI with a valid check digit returned a confirmed no-record response — none failed with an upstream error (those surface as the underlying service/timeout error instead). `invalid_npi_format`: Every requested NPI failed the NPI check digit, so none was looked up. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `none_found`: Every attempted NPI lookup returned a confirmed no-record response — none failed with an upstream error (those surface as the underlying service/timeout error instead). Unprocessed NPIs remain unresolved. `invalid_npi_format`: Every requested NPI failed the NPI check digit, so none was looked up. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / unprocessed
        Added value: +{
        +  "description": "Distinct valid NPIs beyond the first 10, in input order; not looked up. Present only when the lookup limit is exceeded.",
        +  "items": {
        +    "description": "A 10-digit National Provider Identifier whose last digit is its check digit (Luhn over the number prefixed with 80840).",
        +    "pattern": "^\\d{10}$",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Changednpi_lookup_taxonomy7 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / oneOf
        Removed value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "limit": {
        -        "default": 20,
        -        "description": "Maximum matching entries to return (1–50).",
        -        "maximum": 50,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "mode": {
        -        "const": "resolve",
        -        "description": "Resolve a plain-language specialty to taxonomy codes.",
        -        "type": "string"
        -      },
        -      "query": {
        -        "description": "The plain-language specialty term to resolve, e.g. \"pediatric cardiologist\".",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "skip": {
        -        "default": 0,
        -        "description": "Entries to skip before the page (0–1000). Keep the same query and limit, then raise skip by limit each call.",
        -        "maximum": 1000,
        -        "minimum": 0,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "query"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "code": {
        -        "description": "The exact NUCC taxonomy code, e.g. \"207RC0000X\".",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "get",
        -        "description": "Fetch one exact taxonomy entry by code.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "code"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "grouping": {
        -        "description": "Filter to a top-level grouping by case-insensitive substring, e.g. \"physicians\".",
        -        "type": "string"
        -      },
        -      "limit": {
        -        "default": 20,
        -        "description": "Maximum entries to return (1–50).",
        -        "maximum": 50,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "mode": {
        -        "const": "browse",
        -        "description": "Browse the taxonomy hierarchy.",
        -        "type": "string"
        -      },
        -      "section": {
        -        "description": "Filter by NPI section: Individual (NPI-1) or Non-Individual (NPI-2).",
        -        "enum": [
        -          "Individual",
        -          "Non-Individual"
        -        ],
        -        "type": "string"
        -      },
        -      "skip": {
        -        "default": 0,
        -        "description": "Entries to skip before the page (0–1000). Keep the same filters and limit, then raise skip by limit each call.",
        -        "maximum": 1000,
        -        "minimum": 0,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "mode"
        -    ],
        -    "type": "object"
        -  }
        -]
      • addedInput schema / properties
        Added value: +{
        +  "code": {
        +    "description": "For get only: exact NUCC taxonomy code, e.g. \"207RC0000X\".",
        +    "type": "string"
        +  },
        +  "grouping": {
        +    "description": "Filter to a top-level grouping by case-insensitive substring, e.g. \"physicians\".",
        +    "type": "string"
        +  },
        +  "limit": {
        +    "description": "Maximum entries for resolve/browse; defaults to 20. Positive integers above 50 are clamped to 50 unless NPI_CLAMP_LIMITS is disabled.",
        +    "maximum": 9007199254740991,
        +    "minimum": 1,
        +    "type": "integer"
        +  },
        +  "mode": {
        +    "description": "resolve: plain-language specialty to codes; get: exact code; browse: hierarchy.",
        +    "enum": [
        +      "resolve",
        +      "get",
        +      "browse"
        +    ],
        +    "type": "string"
        +  },
        +  "query": {
        +    "description": "The plain-language specialty term to resolve, e.g. \"pediatric cardiologist\".",
        +    "type": "string"
        +  },
        +  "section": {
        +    "description": "For browse only: NUCC section, independent of NPI entity type. Individual includes Group codes.",
        +    "enum": [
        +      "Individual",
        +      "Non-Individual"
        +    ],
        +    "type": "string"
        +  },
        +  "skip": {
        +    "description": "Entries to skip before the page (0–1000). Keep the same query and limit, then raise skip by limit each call.",
        +    "maximum": 1000,
        +    "minimum": 0,
        +    "type": "integer"
        +  }
        +}
      • addedInput schema / required
        Added value: +[
        +  "mode"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_match`: A get code matched no taxonomy entry, a resolve query matched no active one (the message names any inactive codes it matched), or a resolve query was made only of generic words (\"doctor\", \"M.D.\", \"specialist\") that name no specialty. `missing_argument`: The required query or code was present but blank after trimming. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_match`: A get code matched no taxonomy entry, a resolve query matched no active one (the message names any inactive codes it matched), or a resolve query was made only of generic words (\"doctor\", \"M.D.\", \"specialist\") that name no specialty. `missing_argument`: The required query or code was missing or blank after trimming. `wrong_mode_argument`: An explicitly supplied field belongs to a different mode. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_match",
        -  "missing_argument"
        -]New value: +[
        +  "no_match",
        +  "missing_argument",
        +  "wrong_mode_argument"
        +]
      • changedOutput schema / properties / matches / items / properties / section / description
        Previous value: -"NPI enumeration scope: Individual (NPI-1) or Non-Individual (NPI-2)."New value: +"NUCC section. Individual includes Group codes; Non-Individual covers facilities, suppliers and agencies. Provider entity type comes from NPPES enumeration_type."
    • Changednpi_search_providers4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum providers to return (1–200; the registry caps at 200)."New value: +"Maximum providers to return (default 10). Values above 200 are clamped to the registry cap of 200 with a notice."
      • changedInput schema / properties / limit / maximum
        Previous value: -200New value: +9007199254740991
      • addedInput schema / properties / use_first_name_alias
        Added value: +{
        +  "description": "Include first-name variants (default true upstream). False requests exact first-name matching. Applies to the resolved first_name, including name_search, only without a wildcard; other-name matching remains enabled.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / appliedFirstNameAlias
        Added value: +{
        +  "description": "Effective first-name alias expansion for a resolved non-wildcard first name, including the upstream default true. Absent when no first name exists or it contains a wildcard.",
        +  "type": "boolean"
        +}
  2. 2 tool updates
    • Changednpi_lookup_taxonomy1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_match`: A get code matched no taxonomy entry, or a resolve query matched no active one (the message names any inactive codes it matched). `missing_argument`: The required query or code was present but blank after trimming. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_match`: A get code matched no taxonomy entry, a resolve query matched no active one (the message names any inactive codes it matched), or a resolve query was made only of generic words (\"doctor\", \"M.D.\", \"specialist\") that name no specialty. `missing_argument`: The required query or code was present but blank after trimming. Other values are possible when a failure originates below the handler."
    • Changednpi_search_providers13 fields changed
      • changedInput schema / properties / city / description
        Previous value: -"Practice-location city."New value: +"Practice-location city, case-insensitive. A trailing \"*\" after at least 2 characters matches every city starting with them (e.g. \"SAN F*\")."
      • addedInput schema / properties / city / pattern
        Added value: +"^[^*]*$|^[^*]{2,}\\*$"
      • changedInput schema / properties / organization_name / description
        Previous value: -"Organization name (implies provider_type organization). Trailing wildcard \"*\" allowed with at least 2 leading characters."New value: +"Organization name (implies provider_type organization; cannot be combined with first_name, last_name, or name_search). Trailing wildcard \"*\" allowed with at least 2 leading characters."
      • changedInput schema / properties / postal_code / description
        Previous value: -"Practice-location postal/ZIP code (5 or 9 digits)."New value: +"Practice-location ZIP code: 5 digits (also matching the ZIP+4 codes that extend it), 9 digits, or a 2–9 digit prefix with one trailing \"*\" (e.g. \"98*\", \"981*\"). A ZIP+4 prefix (6+ digits) never matches a practice address recorded with only a 5-digit ZIP."
      • addedInput schema / properties / postal_code / pattern
        Added value: +"^[^*]*$|^\\d{2,9}\\*$"
      • changedInput schema / properties / provider_type / description
        Previous value: -"Restrict to individuals (NPI-1) or organizations (NPI-2). Omit to search both."New value: +"Restrict to individuals (NPI-1) or organizations (NPI-2). Omit to search both; when set, it must match the name fields (\"individual\" for first_name/last_name/name_search, \"organization\" for organization_name)."
      • changedInput schema / properties / skip / description
        Previous value: -"Results to skip for pagination (0–1000). Only the first 1200 matches are reachable; skip beyond 1000 silently returns the same window — narrow the query instead of paging further."New value: +"Results to skip for pagination (0–1000). A full page names the next in nextPage."
      • addedOutput schema / properties / continuationPostalCodes
        Added value: +{
        +  "description": "Present only at the terminal window (a full page at skip 1000, limit 200): postal_code prefixes that continue the same search, each re-run from skip 0 with the same arguments — the notice gives the full procedure. Empty when no postal split remains (postal_code is already a 5-digit ZIP, a full ZIP+4, or not a numeric ZIP prefix).",
        +  "items": {
        +    "description": "A trailing-\"*\" postal_code prefix.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_search_criteria`: No effective search criterion was provided. `conflicting_specialty`: Both specialty and taxonomy_description were supplied. `unresolved_specialty`: The specialty term matched no active NUCC taxonomy (the message names any inactive codes it matched). `invalid_search_field`: The registry returned a field error (e.g. wildcard under 2 characters, bad provider type). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_search_criteria`: No effective search criterion was provided. `conflicting_specialty`: Both specialty and taxonomy_description were supplied. `mixed_provider_criteria`: Individual criteria (first_name, last_name, name_search) were combined with organization criteria (organization_name), directly or through provider_type. `unresolved_specialty`: The specialty term matched no active NUCC taxonomy (the message names any inactive codes it matched), or was made only of generic words (\"doctor\", \"M.D.\", \"specialist\") that name no specialty. `invalid_search_field`: The registry returned a field error (e.g. wildcard under 2 characters, bad provider type). Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_search_criteria",
        -  "conflicting_specialty",
        -  "unresolved_specialty",
        -  "invalid_search_field"
        -]New value: +[
        +  "no_search_criteria",
        +  "conflicting_specialty",
        +  "mixed_provider_criteria",
        +  "unresolved_specialty",
        +  "invalid_search_field"
        +]
      • addedOutput schema / properties / nextPage
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The next page: re-run the same arguments with this skip and limit. Present after a full page while rows remain reachable. When skip + limit passes 1000 it is skip 1000, limit 200, whose leading rows repeat rows already returned (the notice says how many) — dedupe by NPI.",
        +  "properties": {
        +    "limit": {
        +      "description": "The limit to send for the next page.",
        +      "type": "number"
        +    },
        +    "skip": {
        +      "description": "The skip to send for the next page.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "skip",
        +    "limit"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance — pagination ceiling, page-size-not-total caveat, or how to broaden an empty result."New value: +"Guidance — the page-size-not-total caveat, the next page or terminal-window continuation procedure, other-name and location-filter counts, or how to broaden an empty result."
      • addedOutput schema / properties / providers / items / properties / matchedOtherName
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The other (former, professional, DBA, or alternate) name this row matched the name search through. Present only when the current name fails a requested last_name, organization_name, or wildcard first_name and this other name satisfies it (case-insensitive, ignoring punctuation and spaces, trailing \"*\" as a prefix). An exact first_name alone never marks a row: the registry also matches first-name variants (Bob for Robert).",
        +  "properties": {
        +    "name": {
        +      "description": "The other name as \"First Middle Last\", or its organization name.",
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "Registry name type, e.g. \"Former Name\", \"Professional Name\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name"
        +  ],
        +  "type": "object"
        +}
  3. 2 tool updates
    • Changednpi_lookup_taxonomy5 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_match`: A resolve query or get code matched no taxonomy entry. `missing_argument`: The required query or code was present but blank after trimming. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_match`: A get code matched no taxonomy entry, or a resolve query matched no active one (the message names any inactive codes it matched). `missing_argument`: The required query or code was present but blank after trimming. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / matches / items / properties / notes
        Added value: +{
        +  "description": "NUCC Notes: sources, revision history, and status remarks. Returned by mode \"get\" only, when NUCC records a note.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / matches / items / properties / replacedBy
        Added value: +{
        +  "description": "For an inactive code, the active replacement code NUCC names, when it names one.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / matches / items / properties / status
        Added value: +{
        +  "description": "NUCC status. Inactive codes are no longer maintained: mode \"resolve\" excludes them, while \"get\" and \"browse\" return them.",
        +  "enum": [
        +    "active",
        +    "inactive"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / matches / items / required
        Previous value: -[
        -  "code",
        -  "grouping",
        -  "classification",
        -  "displayName",
        -  "section"
        -]New value: +[
        +  "code",
        +  "grouping",
        +  "classification",
        +  "displayName",
        +  "section",
        +  "status"
        +]
    • Changednpi_search_providers2 fields changed
      • changedInput schema / properties / specialty / description
        Previous value: -"Plain-language specialty (e.g. \"pediatric cardiologist\"), resolved through the bundled NUCC taxonomy to exact descriptions before searching. The matched taxonomy is echoed in the result. Mutually exclusive with taxonomy_description."New value: +"Plain-language specialty (e.g. \"pediatric cardiologist\"), resolved through the bundled NUCC taxonomy to exact descriptions before searching. Codes NUCC marks inactive are never resolved. The matched taxonomy is echoed in the result. Mutually exclusive with taxonomy_description."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_search_criteria`: No effective search criterion was provided. `conflicting_specialty`: Both specialty and taxonomy_description were supplied. `unresolved_specialty`: The specialty term matched no NUCC taxonomy. `invalid_search_field`: The registry returned a field error (e.g. wildcard under 2 characters, bad provider type). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_search_criteria`: No effective search criterion was provided. `conflicting_specialty`: Both specialty and taxonomy_description were supplied. `unresolved_specialty`: The specialty term matched no active NUCC taxonomy (the message names any inactive codes it matched). `invalid_search_field`: The registry returned a field error (e.g. wildcard under 2 characters, bad provider type). Other values are possible when a failure originates below the handler."
  4. 2 tool updates
    • Changednpi_get_provider19 fields changed
      • changedInput schema / properties / npis / anyOf
        Previous value: -[
        -  {
        -    "description": "A 10-digit National Provider Identifier.",
        -    "pattern": "^\\d{10}$",
        -    "type": "string"
        -  },
        -  {
        -    "description": "An array of up to 10 ten-digit NPIs.",
        -    "items": {
        -      "description": "A 10-digit National Provider Identifier.",
        -      "pattern": "^\\d{10}$",
        -      "type": "string"
        -    },
        -    "maxItems": 10,
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A 10-digit National Provider Identifier whose last digit is its check digit (Luhn over the number prefixed with 80840).",
        +    "pattern": "^\\d{10}$",
        +    "type": "string"
        +  },
        +  {
        +    "description": "An array of up to 10 ten-digit NPIs.",
        +    "items": {
        +      "description": "A 10-digit National Provider Identifier whose last digit is its check digit (Luhn over the number prefixed with 80840).",
        +      "pattern": "^\\d{10}$",
        +      "type": "string"
        +    },
        +    "maxItems": 10,
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / npis / description
        Previous value: -"A single 10-digit NPI, or an array of up to 10. Each is validated as exactly 10 digits before any API call."New value: +"A single 10-digit NPI, or an array of up to 10. Each must be exactly 10 digits; each is also checked against its NPI check digit before any API call, and one that fails is reported in invalid."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "found",
        -      "notFound",
        -      "errored",
        -      "totalCount"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "found",
        +      "notFound",
        +      "errored",
        +      "invalid",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `none_found`: Every requested NPI returned a confirmed no-record response — none failed with an upstream error (those surface as the underlying service/timeout error instead). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `none_found`: Every requested NPI with a valid check digit returned a confirmed no-record response — none failed with an upstream error (those surface as the underlying service/timeout error instead). `invalid_npi_format`: Every requested NPI failed the NPI check digit, so none was looked up. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "none_found"
        -]New value: +[
        +  "none_found",
        +  "invalid_npi_format"
        +]
      • changedOutput schema / properties / found / description
        Previous value: -"Fully decoded records for NPIs that resolved."New value: +"Decoded records for NPIs that resolved."
      • changedOutput schema / properties / found / items / description
        Previous value: -"A fully decoded NPPES provider record."New value: +"A decoded NPPES provider record — the registry's professional-practice data. Only LOCATION address rows are kept for individual providers."
      • changedOutput schema / properties / found / items / properties / addresses / description
        Previous value: -"All practice and mailing addresses."New value: +"Registry addresses. Only LOCATION (practice) rows are kept for individual providers — their mailing address is withheld; organizations carry both LOCATION and MAILING rows."
      • changedOutput schema / properties / found / items / properties / addresses / items / description
        Previous value: -"A practice or mailing address."New value: +"A practice (LOCATION) address, or an organization mailing address."
      • changedOutput schema / properties / found / items / properties / addresses / items / properties / purpose / description
        Previous value: -"Address purpose (LOCATION or MAILING)."New value: +"Address purpose: LOCATION (practice) or MAILING. Only LOCATION rows are kept for individual providers; organizations also carry MAILING."
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / contentOtherDescription
        Added value: +{
        +  "description": "The content the endpoint carries when the content type is OTHER (e.g. \"C-CDA\"), when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / endpointDescription
        Added value: +{
        +  "description": "Free-text description of the endpoint (e.g. \"Carequality\"), when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / line2
        Added value: +{
        +  "description": "Endpoint address line 2, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / useOtherDescription
        Added value: +{
        +  "description": "What the endpoint is used for when the use code is OTHER, when present.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / found / items / properties / practiceLocations / items / description
        Previous value: -"A practice or mailing address."New value: +"A practice (LOCATION) address, or an organization mailing address."
      • changedOutput schema / properties / found / items / properties / practiceLocations / items / properties / purpose / description
        Previous value: -"Address purpose (LOCATION or MAILING)."New value: +"Address purpose: LOCATION (practice) or MAILING. Only LOCATION rows are kept for individual providers; organizations also carry MAILING."
      • addedOutput schema / properties / invalid
        Added value: +{
        +  "description": "NPIs that failed the NPI check digit — not valid NPIs, usually a typo. They were never looked up, so they are neither confirmed misses nor upstream failures.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A requested NPI that failed the NPI check digit.",
        +    "properties": {
        +      "npi": {
        +        "description": "The requested NPI that failed the check digit.",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "description": "Why the NPI was rejected.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "npi",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / notFound / description
        Previous value: -"NPIs that were well-formed but returned no record (deactivated or never enumerated). A confirmed absence, not a failure."New value: +"NPIs with a valid check digit that returned no record (deactivated or never enumerated). A confirmed absence, not a failure."
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when some or all NPIs returned nothing."New value: +"Guidance when some NPIs failed the check digit, returned no record, or hit an upstream error."
    • Changednpi_search_providers4 fields changed
      • changedOutput schema / properties / providers / items / properties / city / description
        Previous value: -"Practice-location city when present."New value: +"Primary practice-location city when present."
      • addedOutput schema / properties / providers / items / properties / matchedLocation
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The additional practice location that satisfied the requested city/state/postal_code. Present only when the primary practice location is elsewhere.",
        +  "properties": {
        +    "city": {
        +      "description": "City of the matching practice location.",
        +      "type": "string"
        +    },
        +    "postalCode": {
        +      "description": "Postal/ZIP code of the matching practice location.",
        +      "type": "string"
        +    },
        +    "state": {
        +      "description": "State of the matching practice location.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / providers / items / properties / postalCode / description
        Previous value: -"Practice-location postal/ZIP code when present."New value: +"Primary practice-location postal/ZIP code when present."
      • changedOutput schema / properties / providers / items / properties / state / description
        Previous value: -"Practice-location state when present."New value: +"Primary practice-location state when present."
  5. 3 tool updates
    • Changednpi_get_provider6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "found",
        +      "notFound",
        +      "errored",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `none_found`: Every requested NPI returned a confirmed no-record response — none failed with an upstream error (those surface as the underlying service/timeout error instead). Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "none_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "found",
        -  "notFound",
        -  "errored",
        -  "totalCount"
        -]
    • Changednpi_lookup_taxonomy8 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / oneOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "limit": {
        +        "default": 20,
        +        "description": "Maximum matching entries to return (1–50).",
        +        "maximum": 50,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "mode": {
        +        "const": "resolve",
        +        "description": "Resolve a plain-language specialty to taxonomy codes.",
        +        "type": "string"
        +      },
        +      "query": {
        +        "description": "The plain-language specialty term to resolve, e.g. \"pediatric cardiologist\".",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "skip": {
        +        "default": 0,
        +        "description": "Entries to skip before the page (0–1000). Keep the same query and limit, then raise skip by limit each call.",
        +        "maximum": 1000,
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "query"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "code": {
        +        "description": "The exact NUCC taxonomy code, e.g. \"207RC0000X\".",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "get",
        +        "description": "Fetch one exact taxonomy entry by code.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "code"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "grouping": {
        +        "description": "Filter to a top-level grouping by case-insensitive substring, e.g. \"physicians\".",
        +        "type": "string"
        +      },
        +      "limit": {
        +        "default": 20,
        +        "description": "Maximum entries to return (1–50).",
        +        "maximum": 50,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "mode": {
        +        "const": "browse",
        +        "description": "Browse the taxonomy hierarchy.",
        +        "type": "string"
        +      },
        +      "section": {
        +        "description": "Filter by NPI section: Individual (NPI-1) or Non-Individual (NPI-2).",
        +        "enum": [
        +          "Individual",
        +          "Non-Individual"
        +        ],
        +        "type": "string"
        +      },
        +      "skip": {
        +        "default": 0,
        +        "description": "Entries to skip before the page (0–1000). Keep the same filters and limit, then raise skip by limit each call.",
        +        "maximum": 1000,
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "mode"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties
        Removed value: -{
        -  "code": {
        -    "description": "For mode \"get\": the exact NUCC taxonomy code (e.g. \"207RC0000X\").",
        -    "type": "string"
        -  },
        -  "grouping": {
        -    "description": "For mode \"browse\": filter to a top-level grouping by case-insensitive substring (e.g. \"physicians\").",
        -    "type": "string"
        -  },
        -  "limit": {
        -    "default": 20,
        -    "description": "Maximum entries to return for resolve/browse (1–50). Ignored for get.",
        -    "maximum": 50,
        -    "minimum": 1,
        -    "type": "integer"
        -  },
        -  "mode": {
        -    "description": "resolve: plain term → codes. get: exact code → entry. browse: walk the hierarchy.",
        -    "enum": [
        -      "resolve",
        -      "get",
        -      "browse"
        -    ],
        -    "type": "string"
        -  },
        -  "query": {
        -    "description": "For mode \"resolve\": the plain-language specialty term to resolve (e.g. \"pediatric cardiologist\").",
        -    "type": "string"
        -  },
        -  "section": {
        -    "description": "For mode \"browse\": filter by NPI section — Individual (NPI-1) or Non-Individual (NPI-2).",
        -    "enum": [
        -      "Individual",
        -      "Non-Individual"
        -    ],
        -    "type": "string"
        -  },
        -  "skip": {
        -    "default": 0,
        -    "description": "Entries to skip before the page, for paging past a truncated resolve/browse result (0–1000). Keep the same query/filters and limit, raise skip by limit each call. Ignored for get.",
        -    "maximum": 1000,
        -    "minimum": 0,
        -    "type": "integer"
        -  }
        -}
      • removedInput schema / required
        Removed value: -[
        -  "mode"
        -]
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "matches"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_match`: A resolve query or get code matched no taxonomy entry. `missing_argument`: The required query or code was present but blank after trimming. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_match",
        +            "missing_argument"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "matches"
        -]
    • Changednpi_search_providers12 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / name_search / description
        Previous value: -"Convenience shortcut: a single person's name, split into first/last heuristically. For precise control use first_name/last_name."New value: +"One person's name. The first token becomes first_name and the last token becomes last_name; use first_name/last_name when middle names or multi-part surnames matter."
      • changedInput schema / properties / state / description
        Previous value: -"2-letter state code (e.g. \"WA\"). The registry rejects state-only searches — pair it with another criterion. Blank values from form-based clients are treated as omitted."New value: +"2-letter state code (e.g. \"WA\"). The registry rejects state-only searches, so another criterion is required. A blank value is treated as omitted."
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "providers"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / appliedTaxonomyDescription / description
        Previous value: -"The single taxonomy_description sent to the registry (from specialty resolution or the raw escape hatch)."New value: +"The exact NUCC specialization or classification used as the specialty filter."
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_search_criteria`: No effective search criterion was provided. `conflicting_specialty`: Both specialty and taxonomy_description were supplied. `unresolved_specialty`: The specialty term matched no NUCC taxonomy. `invalid_search_field`: The registry returned a field error (e.g. wildcard under 2 characters, bad provider type). Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_search_criteria",
        +            "conflicting_specialty",
        +            "unresolved_specialty",
        +            "invalid_search_field"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / resolvedTaxonomies / description
        Previous value: -"The taxonomy candidates the specialty term resolved to; the first was sent to the registry. Re-run with taxonomy_description to pick a different one."New value: +"Taxonomy candidates ranked for the specialty term. The first candidate supplies appliedTaxonomyDescription; a different candidate can be selected through taxonomy_description."
      • changedOutput schema / properties / resolvedTaxonomies / items / properties / description / description
        Previous value: -"The taxonomy description (specialization or classification) the registry matched on — the value sent as taxonomy_description."New value: +"Search-compatible NUCC specialization or classification for this candidate."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the returned page hit the limit — more may match."New value: +"True when the NPPES page contained at least cap providers before location constraints were applied; more may match even when shown is below cap."
      • removedOutput schema / required
        Removed value: -[
        -  "providers"
        -]
  6. 1 tool update
    • Changednpi_lookup_taxonomy2 fields changed
      • addedInput schema / properties / skip
        Added value: +{
        +  "default": 0,
        +  "description": "Entries to skip before the page, for paging past a truncated resolve/browse result (0–1000). Keep the same query/filters and limit, raise skip by limit each call. Ignored for get.",
        +  "maximum": 1000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Guidance when nothing matched — suggests broadening or browsing the hierarchy."New value: +"Guidance — how to page a truncated result with skip, or how to broaden when nothing matched."
  7. 2 tool updates
    • Changednpi_get_provider24 fields changed
      • addedOutput schema / properties / errored
        Added value: +{
        +  "description": "NPIs whose lookups failed with an upstream/transport error (service unavailable, timeout) — distinct from a confirmed miss in notFound. These are unresolved, not absent; retry them.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A requested NPI whose lookup failed with an upstream error.",
        +    "properties": {
        +      "npi": {
        +        "description": "The requested NPI whose lookup failed operationally.",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "description": "The upstream failure reason (service unavailable, timeout, etc.).",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "npi",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / found / items / properties / authorizedOfficial / properties / namePrefix
        Added value: +{
        +  "description": "Authorized official name prefix, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / authorizedOfficial / properties / nameSuffix
        Added value: +{
        +  "description": "Authorized official name suffix, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / createdEpoch
        Added value: +{
        +  "description": "Record creation timestamp, epoch milliseconds, when present.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / found / items / properties / endpoints / items / description
        Previous value: -"A FHIR or Direct messaging endpoint."New value: +"A FHIR or Direct messaging endpoint with its routing address and context."
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / addressType
        Added value: +{
        +  "description": "Endpoint address type (DOM/FOR), when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / affiliation
        Added value: +{
        +  "description": "Whether the endpoint is affiliated with an organization (Y/N), when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / affiliationName
        Added value: +{
        +  "description": "Name of the affiliated organization, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / city
        Added value: +{
        +  "description": "Endpoint city, when present.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / found / items / properties / endpoints / items / properties / contentType / description
        Previous value: -"Endpoint content type, when present."New value: +"Endpoint content type code, when present."
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / contentTypeDescription
        Added value: +{
        +  "description": "Endpoint content type description, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / countryCode
        Added value: +{
        +  "description": "Endpoint ISO country code, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / countryName
        Added value: +{
        +  "description": "Endpoint country name, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / line1
        Added value: +{
        +  "description": "Endpoint address line 1, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / postalCode
        Added value: +{
        +  "description": "Endpoint postal/ZIP code, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / state
        Added value: +{
        +  "description": "Endpoint state, when present.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / found / items / properties / endpoints / items / properties / use / description
        Previous value: -"Endpoint use, when present."New value: +"Endpoint use code (e.g. \"HIE\"), when present."
      • addedOutput schema / properties / found / items / properties / endpoints / items / properties / useDescription
        Added value: +{
        +  "description": "Endpoint use description, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / lastUpdatedEpoch
        Added value: +{
        +  "description": "Record last-update timestamp, epoch milliseconds, when present.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / found / items / properties / otherNames / items / properties / middleName
        Added value: +{
        +  "description": "Middle name, for individuals, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / otherNames / items / properties / prefix
        Added value: +{
        +  "description": "Name prefix, when present.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / found / items / properties / otherNames / items / properties / suffix
        Added value: +{
        +  "description": "Name suffix, when present.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / notFound / description
        Previous value: -"NPIs that were well-formed but returned no record (deactivated or never enumerated)."New value: +"NPIs that were well-formed but returned no record (deactivated or never enumerated). A confirmed absence, not a failure."
      • changedOutput schema / required
        Previous value: -[
        -  "found",
        -  "notFound",
        -  "totalCount"
        -]New value: +[
        +  "found",
        +  "notFound",
        +  "errored",
        +  "totalCount"
        +]
    • Changednpi_search_providers5 fields changed
      • addedInput schema / properties / state / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "2-letter state code (e.g. \"WA\").",
        +    "pattern": "^[A-Z]{2}$",
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / state / description
        Previous value: -"2-letter state code (e.g. \"WA\"). The registry rejects state-only searches — pair it with another criterion."New value: +"2-letter state code (e.g. \"WA\"). The registry rejects state-only searches — pair it with another criterion. Blank values from form-based clients are treated as omitted."
      • removedInput schema / properties / state / pattern
        Removed value: -"^[A-Z]{2}$"
      • removedInput schema / properties / state / type
        Removed value: -"string"
      • addedOutput schema / properties / providers / items / properties / postalCode
        Added value: +{
        +  "description": "Practice-location postal/ZIP code when present.",
        +  "type": "string"
        +}
  8. 3 tool updates
    • First observednpi_get_provider
    • First observednpi_lookup_taxonomy
    • First observednpi_search_providers

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for looking up and searching US healthcare providers in the CMS NPPES NPI Registry.
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Source-provenanced US federal healthcare provider data over MCP. Resolve any NPI or CCN across NPPES, OIG LEIE, SAM.gov, state Medicaid exclusions, CMS PECOS, Care Compare, and Open Payments — every field carries a 14-field provenance contract, and an "excluded or compromised anywhere" check runs on every lookup.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying the NPPES NPI Registry for provider searches, specialty lookups, NPI format validation, and referral-eligibility checks over MCP.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.