npi-providers-mcp-server
Server Details
Search NPPES providers and resolve NUCC specialty codes via MCP over STDIO or Streamable HTTP.
- 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
Scored across 3 tools
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.
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.
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.
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 toolsnpi_get_providerNpi Get ProviderARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| npis | Yes | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| found | No | Decoded records for NPIs that resolved. |
| notice | No | Guidance when some NPIs failed the check digit, returned no record, or hit an upstream error. |
| errored | No | 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. |
| invalid | No | 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. |
| notFound | No | NPIs with a valid check digit that returned no record (deactivated or never enumerated). A confirmed absence, not a failure. |
| totalCount | No | Number of provider records that resolved from the requested NPIs. |
| unprocessed | No | Distinct valid NPIs beyond the first 10, in input order; not looked up. Present only when the lookup limit is exceeded. |
TDQS
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.
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.
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.
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.
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.
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 TaxonomyARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | For get only: exact NUCC taxonomy code, e.g. "207RC0000X". | |
| mode | Yes | resolve: plain-language specialty to codes; get: exact code; browse: hierarchy. | |
| skip | No | Entries to skip before the page (0–1000). Keep the same query and limit, then raise skip by limit each call. | |
| limit | No | Maximum entries for resolve/browse; defaults to 20. Positive integers above 50 are clamped to 50 unless NPI_CLAMP_LIMITS is disabled. | |
| query | No | The plain-language specialty term to resolve, e.g. "pediatric cardiologist". | |
| section | No | For browse only: NUCC section, independent of NPI entity type. Individual includes Group codes. | |
| grouping | No | Filter to a top-level grouping by case-insensitive substring, e.g. "physicians". |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of entries returned. |
| notice | No | Guidance — how to page a truncated result with skip, or how to broaden when nothing matched. |
| matches | No | Matching taxonomy entries. For mode "get" this is the single requested entry; for "resolve"/"browse" it is the ranked/sorted matches up to limit. |
| truncated | No | True when the list was capped at `limit` (more entries may match). |
TDQS
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.
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.
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.
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.
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.
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 ProvidersARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Practice-location city, case-insensitive. A trailing "*" after at least 2 characters matches every city starting with them (e.g. "SAN F*"). | |
| skip | No | Results to skip for pagination (0–1000). A full page names the next in nextPage. | |
| limit | No | Maximum providers to return (default 10). Values above 200 are clamped to the registry cap of 200 with a notice. | |
| state | No | 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. | |
| last_name | No | Individual last name. Trailing wildcard "*" allowed with at least 2 leading characters. | |
| specialty | No | 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. | |
| first_name | No | Individual first name. Trailing wildcard "*" allowed with at least 2 leading characters. | |
| name_search | No | 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. | |
| postal_code | No | 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. | |
| provider_type | No | 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). | |
| organization_name | No | 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. | |
| taxonomy_description | No | Exact NUCC taxonomy description for direct passthrough — use when the taxonomy description is already known. Mutually exclusive with specialty. | |
| use_first_name_alias | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of providers returned. |
| notice | No | 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. |
| nextPage | No | 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. |
| providers | No | Matching provider rows (up to limit). |
| truncated | No | True when the NPPES page contained at least cap providers before location constraints were applied; more may match even when shown is below cap. |
| resolvedTaxonomies | No | Taxonomy candidates ranked for the specialty term. The first candidate supplies appliedTaxonomyDescription; a different candidate can be selected through taxonomy_description. |
| appliedFirstNameAlias | No | 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. |
| continuationPostalCodes | No | 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). |
| appliedTaxonomyDescription | No | The exact NUCC specialization or classification used as the specialty filter. |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
- Changed
npi_get_provider4 fields changed- changed
Input schema / properties / npis / anyOfPrevious 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" + } +] - changed
Input schema / properties / npis / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - added
Output schema / properties / unprocessedAdded 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" +}
- Changed
npi_lookup_taxonomy7 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / oneOfRemoved 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" - } -] - added
Input schema / propertiesAdded 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" + } +} - added
Input schema / requiredAdded value: +[ + "mode" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_match", - "missing_argument" -]New value: +[ + "no_match", + "missing_argument", + "wrong_mode_argument" +] - changed
Output schema / properties / matches / items / properties / section / descriptionPrevious 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."
- Changed
npi_search_providers4 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / limit / maximumPrevious value: -200New value: +9007199254740991 - added
Input schema / properties / use_first_name_aliasAdded 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" +} - added
Output schema / properties / appliedFirstNameAliasAdded 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 tool updates
- Changed
npi_lookup_taxonomy1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."
- Changed
npi_search_providers13 fields changed- changed
Input schema / properties / city / descriptionPrevious 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*\")." - added
Input schema / properties / city / patternAdded value: +"^[^*]*$|^[^*]{2,}\\*$" - changed
Input schema / properties / organization_name / descriptionPrevious 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." - changed
Input schema / properties / postal_code / descriptionPrevious 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." - added
Input schema / properties / postal_code / patternAdded value: +"^[^*]*$|^\\d{2,9}\\*$" - changed
Input schema / properties / provider_type / descriptionPrevious 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)." - changed
Input schema / properties / skip / descriptionPrevious 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." - added
Output schema / properties / continuationPostalCodesAdded 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" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious 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" +] - added
Output schema / properties / nextPageAdded 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" +} - changed
Output schema / properties / notice / descriptionPrevious 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." - added
Output schema / properties / providers / items / properties / matchedOtherNameAdded 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" +}
2 tool updates
- Changed
npi_lookup_taxonomy5 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - added
Output schema / properties / matches / items / properties / notesAdded value: +{ + "description": "NUCC Notes: sources, revision history, and status remarks. Returned by mode \"get\" only, when NUCC records a note.", + "type": "string" +} - added
Output schema / properties / matches / items / properties / replacedByAdded value: +{ + "description": "For an inactive code, the active replacement code NUCC names, when it names one.", + "type": "string" +} - added
Output schema / properties / matches / items / properties / statusAdded 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" +} - changed
Output schema / properties / matches / items / requiredPrevious value: -[ - "code", - "grouping", - "classification", - "displayName", - "section" -]New value: +[ + "code", + "grouping", + "classification", + "displayName", + "section", + "status" +]
- Changed
npi_search_providers2 fields changed- changed
Input schema / properties / specialty / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."
2 tool updates
- Changed
npi_get_provider19 fields changed- changed
Input schema / properties / npis / anyOfPrevious 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" + } +] - changed
Input schema / properties / npis / descriptionPrevious 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." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "found", - "notFound", - "errored", - "totalCount" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "found", + "notFound", + "errored", + "invalid", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "none_found" -]New value: +[ + "none_found", + "invalid_npi_format" +] - changed
Output schema / properties / found / descriptionPrevious value: -"Fully decoded records for NPIs that resolved."New value: +"Decoded records for NPIs that resolved." - changed
Output schema / properties / found / items / descriptionPrevious 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." - changed
Output schema / properties / found / items / properties / addresses / descriptionPrevious 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." - changed
Output schema / properties / found / items / properties / addresses / items / descriptionPrevious value: -"A practice or mailing address."New value: +"A practice (LOCATION) address, or an organization mailing address." - changed
Output schema / properties / found / items / properties / addresses / items / properties / purpose / descriptionPrevious 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." - added
Output schema / properties / found / items / properties / endpoints / items / properties / contentOtherDescriptionAdded value: +{ + "description": "The content the endpoint carries when the content type is OTHER (e.g. \"C-CDA\"), when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / endpointDescriptionAdded value: +{ + "description": "Free-text description of the endpoint (e.g. \"Carequality\"), when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / line2Added value: +{ + "description": "Endpoint address line 2, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / useOtherDescriptionAdded value: +{ + "description": "What the endpoint is used for when the use code is OTHER, when present.", + "type": "string" +} - changed
Output schema / properties / found / items / properties / practiceLocations / items / descriptionPrevious value: -"A practice or mailing address."New value: +"A practice (LOCATION) address, or an organization mailing address." - changed
Output schema / properties / found / items / properties / practiceLocations / items / properties / purpose / descriptionPrevious 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." - added
Output schema / properties / invalidAdded 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" +} - changed
Output schema / properties / notFound / descriptionPrevious 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." - changed
Output schema / properties / notice / descriptionPrevious 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."
- Changed
npi_search_providers4 fields changed- changed
Output schema / properties / providers / items / properties / city / descriptionPrevious value: -"Practice-location city when present."New value: +"Primary practice-location city when present." - added
Output schema / properties / providers / items / properties / matchedLocationAdded 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" +} - changed
Output schema / properties / providers / items / properties / postalCode / descriptionPrevious value: -"Practice-location postal/ZIP code when present."New value: +"Primary practice-location postal/ZIP code when present." - changed
Output schema / properties / providers / items / properties / state / descriptionPrevious value: -"Practice-location state when present."New value: +"Primary practice-location state when present."
3 tool updates
- Changed
npi_get_provider6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "found", + "notFound", + "errored", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "found", - "notFound", - "errored", - "totalCount" -]
- Changed
npi_lookup_taxonomy8 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / oneOfAdded 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" + } +] - removed
Input schema / propertiesRemoved 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" - } -} - removed
Input schema / requiredRemoved value: -[ - "mode" -] - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "matches" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "matches" -]
- Changed
npi_search_providers12 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / name_search / descriptionPrevious 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." - changed
Input schema / properties / state / descriptionPrevious 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." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "providers" + ] + }, + { + "required": [ + "error" + ] + } +] - changed
Output schema / properties / appliedTaxonomyDescription / descriptionPrevious 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." - added
Output schema / properties / errorAdded 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" +} - changed
Output schema / properties / resolvedTaxonomies / descriptionPrevious 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." - changed
Output schema / properties / resolvedTaxonomies / items / properties / description / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious 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." - removed
Output schema / requiredRemoved value: -[ - "providers" -]
1 tool update
- Changed
npi_lookup_taxonomy2 fields changed- added
Input schema / properties / skipAdded 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" +} - changed
Output schema / properties / notice / descriptionPrevious 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."
2 tool updates
- Changed
npi_get_provider24 fields changed- added
Output schema / properties / erroredAdded 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" +} - added
Output schema / properties / found / items / properties / authorizedOfficial / properties / namePrefixAdded value: +{ + "description": "Authorized official name prefix, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / authorizedOfficial / properties / nameSuffixAdded value: +{ + "description": "Authorized official name suffix, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / createdEpochAdded value: +{ + "description": "Record creation timestamp, epoch milliseconds, when present.", + "type": "number" +} - changed
Output schema / properties / found / items / properties / endpoints / items / descriptionPrevious value: -"A FHIR or Direct messaging endpoint."New value: +"A FHIR or Direct messaging endpoint with its routing address and context." - added
Output schema / properties / found / items / properties / endpoints / items / properties / addressTypeAdded value: +{ + "description": "Endpoint address type (DOM/FOR), when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / affiliationAdded value: +{ + "description": "Whether the endpoint is affiliated with an organization (Y/N), when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / affiliationNameAdded value: +{ + "description": "Name of the affiliated organization, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / cityAdded value: +{ + "description": "Endpoint city, when present.", + "type": "string" +} - changed
Output schema / properties / found / items / properties / endpoints / items / properties / contentType / descriptionPrevious value: -"Endpoint content type, when present."New value: +"Endpoint content type code, when present." - added
Output schema / properties / found / items / properties / endpoints / items / properties / contentTypeDescriptionAdded value: +{ + "description": "Endpoint content type description, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / countryCodeAdded value: +{ + "description": "Endpoint ISO country code, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / countryNameAdded value: +{ + "description": "Endpoint country name, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / line1Added value: +{ + "description": "Endpoint address line 1, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / postalCodeAdded value: +{ + "description": "Endpoint postal/ZIP code, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / endpoints / items / properties / stateAdded value: +{ + "description": "Endpoint state, when present.", + "type": "string" +} - changed
Output schema / properties / found / items / properties / endpoints / items / properties / use / descriptionPrevious value: -"Endpoint use, when present."New value: +"Endpoint use code (e.g. \"HIE\"), when present." - added
Output schema / properties / found / items / properties / endpoints / items / properties / useDescriptionAdded value: +{ + "description": "Endpoint use description, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / lastUpdatedEpochAdded value: +{ + "description": "Record last-update timestamp, epoch milliseconds, when present.", + "type": "number" +} - added
Output schema / properties / found / items / properties / otherNames / items / properties / middleNameAdded value: +{ + "description": "Middle name, for individuals, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / otherNames / items / properties / prefixAdded value: +{ + "description": "Name prefix, when present.", + "type": "string" +} - added
Output schema / properties / found / items / properties / otherNames / items / properties / suffixAdded value: +{ + "description": "Name suffix, when present.", + "type": "string" +} - changed
Output schema / properties / notFound / descriptionPrevious 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." - changed
Output schema / requiredPrevious value: -[ - "found", - "notFound", - "totalCount" -]New value: +[ + "found", + "notFound", + "errored", + "totalCount" +]
- Changed
npi_search_providers5 fields changed- added
Input schema / properties / state / anyOfAdded value: +[ + { + "const": "", + "type": "string" + }, + { + "description": "2-letter state code (e.g. \"WA\").", + "pattern": "^[A-Z]{2}$", + "type": "string" + } +] - changed
Input schema / properties / state / descriptionPrevious 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." - removed
Input schema / properties / state / patternRemoved value: -"^[A-Z]{2}$" - removed
Input schema / properties / state / typeRemoved value: -"string" - added
Output schema / properties / providers / items / properties / postalCodeAdded value: +{ + "description": "Practice-location postal/ZIP code when present.", + "type": "string" +}
3 tool updates
- First observed
npi_get_provider - First observed
npi_lookup_taxonomy - First observed
npi_search_providers
Related MCP Connectors
Look up U.S. healthcare providers by NPI, name, specialty and ZIP radius from CMS NPPES data.
Query SEC EDGAR filings, XBRL financials, and company data via MCP. STDIO or Streamable HTTP.
Validate, look up and count US NPI providers from the public CMS registry; not affiliated with CMS.
Search official CMS NPPES NPI-2 medical organization and healthcare provider registry records.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for looking up and searching US healthcare providers in the CMS NPPES NPI Registry.MIT
- FlicenseNot gradedqualityDmaintenanceSource-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.-
- AlicenseNot gradedqualityCmaintenanceEnables querying the NPPES NPI Registry for provider searches, specialty lookups, NPI format validation, and referral-eligibility checks over MCP.MIT
- AlicenseNot gradedqualityAmaintenanceLook up countries, timezones, periodic table elements, physical constants, units, HTTP status codes, and MIME types via MCP. STDIO or Streamable HTTP.755 npm1Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.