NPPES NPI Registry MCP by usefulapi

Look up US healthcare providers and organisations by NPI.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
93%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,682Tokens (tool definitions)
~3.9 KBTypical response size
Moderate attention impact (1.31% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "nppes-npi-registry": {
      "url": "https://nppes-npi-registry.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://nppes-npi-registry.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢nppes_lookup_npi(number)

Look up a single healthcare provider by their exact 10-digit National Provider Identifier (NPI). Returns the full registry record: basic info, addresses, taxonomies/specialties, identifiers and other names. NPPES Read API v2.1.

Input Schema

{
  "type": "object",
  "properties": {
    "number": {
      "type": "string",
      "pattern": "^\\d{10}$",
      "description": "The 10-digit NPI number to look up, e.g. '1467550004' (required)."
    }
  },
  "required": [
    "number"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢nppes_search_individuals(first_name, last_name, name_purpose, taxonomy_description, city, ...)

Search for INDIVIDUAL healthcare providers (NPI-1: doctors, nurses, therapists, etc.) by name, specialty (taxonomy) and/or location. Provide at least one meaningful criterion beyond a location. Name fields support a trailing '*' wildcard (min 2 chars before it). NPPES Read API v2.1.

Input Schema

{
  "type": "object",
  "properties": {
    "first_name": {
      "description": "Provider first name. A trailing '*' wildcard is allowed, e.g. 'Jo*'.",
      "type": "string"
    },
    "last_name": {
      "description": "Provider last name. A trailing '*' wildcard is allowed, e.g. 'Smi*'.",
      "type": "string"
    },
    "name_purpose": {
      "description": "Which name to match: 'PROVIDER' (default) matches the provider's own name; 'AO' matches an authorized official.",
      "type": "string",
      "enum": [
        "AO",
        "PROVIDER"
      ]
    },
    "taxonomy_description": {
      "description": "Provider taxonomy / specialty text, e.g. 'cardiology', 'Pediatrics', 'Social Worker'. Partial matches supported; a trailing '*' wildcard is allowed (min 2 chars before it).",
      "type": "string"
    },
    "city": {
      "description": "City of the provider's address.",
      "type": "string"
    },
    "state": {
      "description": "Two-letter U.S. state/territory abbreviation, e.g. 'CA', 'NY', 'PR'.",
      "type": "string"
    },
    "postal_code": {
      "description": "Postal (ZIP) code; a trailing '*' wildcard is allowed for prefix search, e.g. '941*'.",
      "type": "string"
    },
    "country_code": {
      "description": "Two-letter country code (default 'US'). Use 'US' for domestic addresses.",
      "type": "string"
    },
    "address_purpose": {
      "description": "Which address the city/state/postal_code filters apply to (LOCATION = practice address).",
      "type": "string",
      "enum": [
        "LOCATION",
        "MAILING",
        "PRIMARY",
        "SECONDARY"
      ]
    },
    "limit": {
      "description": "Max number of records to return (1–200, default 10).",
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    },
    "skip": {
      "description": "Number of records to skip, for pagination (0–1000; combined with limit, up to 1200 records reachable).",
      "type": "integer",
      "minimum": 0,
      "maximum": 1000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢nppes_search_organizations(organization_name, taxonomy_description, city, state, postal_code, ...)

Search for ORGANIZATION healthcare providers (NPI-2: hospitals, clinics, group practices, pharmacies, labs, etc.) by organization name, specialty (taxonomy) and/or location. The organization_name field supports a trailing '*' wildcard (min 2 chars before it). NPPES Read API v2.1.

Input Schema

{
  "type": "object",
  "properties": {
    "organization_name": {
      "description": "Organization (legal business) name. A trailing '*' wildcard is allowed, e.g. 'Kaiser*'.",
      "type": "string"
    },
    "taxonomy_description": {
      "description": "Provider taxonomy / specialty text, e.g. 'cardiology', 'Pediatrics', 'Social Worker'. Partial matches supported; a trailing '*' wildcard is allowed (min 2 chars before it).",
      "type": "string"
    },
    "city": {
      "description": "City of the provider's address.",
      "type": "string"
    },
    "state": {
      "description": "Two-letter U.S. state/territory abbreviation, e.g. 'CA', 'NY', 'PR'.",
      "type": "string"
    },
    "postal_code": {
      "description": "Postal (ZIP) code; a trailing '*' wildcard is allowed for prefix search, e.g. '941*'.",
      "type": "string"
    },
    "country_code": {
      "description": "Two-letter country code (default 'US'). Use 'US' for domestic addresses.",
      "type": "string"
    },
    "address_purpose": {
      "description": "Which address the city/state/postal_code filters apply to (LOCATION = practice address).",
      "type": "string",
      "enum": [
        "LOCATION",
        "MAILING",
        "PRIMARY",
        "SECONDARY"
      ]
    },
    "limit": {
      "description": "Max number of records to return (1–200, default 10).",
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    },
    "skip": {
      "description": "Number of records to skip, for pagination (0–1000; combined with limit, up to 1200 records reachable).",
      "type": "integer",
      "minimum": 0,
      "maximum": 1000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢nppes_search(enumeration_type, number, first_name, last_name, organization_name, ...)

Full-power search of the NPPES NPI Registry across ANY combination of criteria — individual name, organization name, NPI number, taxonomy/specialty, and location. Use nppes_search_individuals / nppes_search_organizations for the common cases; use this when you need mixed or advanced criteria. The API requires at least one meaningful search parameter. NPPES Read API v2.1.

Input Schema

{
  "type": "object",
  "properties": {
    "enumeration_type": {
      "description": "Restrict to 'NPI-1' (individuals) or 'NPI-2' (organizations). Omit to search both.",
      "type": "string",
      "enum": [
        "NPI-1",
        "NPI-2"
      ]
    },
    "number": {
      "description": "Exact 10-digit NPI number.",
      "type": "string",
      "pattern": "^\\d{10}$"
    },
    "first_name": {
      "description": "Individual provider first name (trailing '*' wildcard allowed).",
      "type": "string"
    },
    "last_name": {
      "description": "Individual provider last name (trailing '*' wildcard allowed).",
      "type": "string"
    },
    "organization_name": {
      "description": "Organization name (trailing '*' wildcard allowed).",
      "type": "string"
    },
    "name_purpose": {
      "description": "For name matching: 'PROVIDER' (default) or 'AO' (authorized official).",
      "type": "string",
      "enum": [
        "AO",
        "PROVIDER"
      ]
    },
    "taxonomy_description": {
      "description": "Provider taxonomy / specialty text, e.g. 'cardiology', 'Pediatrics', 'Social Worker'. Partial matches supported; a trailing '*' wildcard is allowed (min 2 chars before it).",
      "type": "string"
    },
    "city": {
      "description": "City of the provider's address.",
      "type": "string"
    },
    "state": {
      "description": "Two-letter U.S. state/territory abbreviation, e.g. 'CA', 'NY', 'PR'.",
      "type": "string"
    },
    "postal_code": {
      "description": "Postal (ZIP) code; a trailing '*' wildcard is allowed for prefix search, e.g. '941*'.",
      "type": "string"
    },
    "country_code": {
      "description": "Two-letter country code (default 'US'). Use 'US' for domestic addresses.",
      "type": "string"
    },
    "address_purpose": {
      "description": "Which address the city/state/postal_code filters apply to (LOCATION = practice address).",
      "type": "string",
      "enum": [
        "LOCATION",
        "MAILING",
        "PRIMARY",
        "SECONDARY"
      ]
    },
    "limit": {
      "description": "Max number of records to return (1–200, default 10).",
      "type": "integer",
      "minimum": 1,
      "maximum": 200
    },
    "skip": {
      "description": "Number of records to skip, for pagination (0–1000; combined with limit, up to 1200 records reachable).",
      "type": "integer",
      "minimum": 0,
      "maximum": 1000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools
verifiedversion not recorded4 tools