Npi Providers Mcp Server

io.github.cyanheads由 GitHub 账号 cyanheads 发布v0.5.0更新于 Nov 2, 2026

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

已验证Streamable HTTP可网页运行位置与生活网页搜索与抓取

概览

AI 生成的概览

查询美国 NPPES NPI 注册库中的医疗提供者,并解析 NUCC 专科代码,可通过托管端点或本地运行。

可以做什么
  • 搜索提供者:按姓名、城市、州、邮编、提供者类型和专科查找个人执业者或医疗机构,通俗专科词会经内置 NUCC 分类表解析。
  • 查询 NPI:每次调用可将最多 10 个有效 NPI 解码为执业记录,含分类、执照、执业地址、资质、标识、端点和状态,并分为 found、notFound、errored、invalid。
  • 浏览专科代码:完全离线地解析、获取或浏览 NUCC 医疗提供者分类表,包括停用代码及其替代代码。
  • 读取资源:在支持资源的客户端中按标识符获取单个提供者记录或分类条目。
适用场景
适合需要识别美国医生或医疗机构、核验理赔或转诊中出现的 NPI,或把“心脏医生”这类模糊专科说法映射为注册库实际过滤所用的精确分类代码的场景。
运行要求
无必填项:NPPES 注册库无需密钥,分类表已内置。可连接托管的 Streamable HTTP 端点,或用 npx 本地运行 npm 包(源码构建需 Bun 1.4+ 或 Node.js 24+)。可选覆盖项包括 NPPES_API_BASE_URL、NPPES_TIMEOUT_MS、NPI_CLAMP_LIMITS、MCP_TRANSPORT_TYPE、MCP_HTTP_PORT 和 MCP_AUTH_MODE。查询注册库需要网络访问。
安装前请注意
查询会发往公开的 CMS NPPES 注册库,搜索词和 NPI 会传给该第三方。结果仅为公开的执业数据,个人提供者的邮寄地址会被隐去。搜索为只读操作,但注册库不报告真实匹配总数,单次搜索最多只能触及其前 1200 条匹配。启用 LOG_TOOL_FAILURE_PAYLOADS 会记录失败调用的参数和结果,且自由文本值中的密钥不会被脱敏。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Npi Providers Mcp Server,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.cyanheads%2Fnpi-providers-mcp-server/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "npi-providers": {
      "type": "http",
      "url": "https://npi-providers.caseyjhand.com/mcp"
    }
  }
}

README

@cyanheads/npi-providers-mcp-server

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

3 Tools • 2 Data Resources • 1 Skill


Overview

The US healthcare provider directory from the NPI Registry. Search doctors and organizations by name, location, and specialty in plain language, decode any NPI to its provider record, and browse the NUCC specialty taxonomy.

Tools

ToolDescription
npi_search_providersSearch the NPPES registry by name, organization, location, provider type, and specialty. Plain-language specialties resolve through the bundled NUCC taxonomy before searching.
npi_get_providerFetch the NPPES professional-practice record for up to 10 NPIs — taxonomies, practice addresses, credentials, identifiers, endpoints, and status. Only LOCATION address rows are kept for individual providers.
npi_lookup_taxonomyResolve, fetch, or browse the NUCC Healthcare Provider Taxonomy — fully offline.

Resources

ResourceDescription
npi://provider/{npi}A single provider's decoded record by NPI — the resource twin of npi_get_provider.
npi://taxonomy/{code}A single NUCC taxonomy entry by code — the resource twin of npi_lookup_taxonomy mode get.

All resource data is also reachable via tools; the resources are convenience twins for resource-capable clients.

The bundled npi-providers-guide skill is available at skill://npi-providers-guide/SKILL.md. It covers specialty cohorts, provider identity, and the limits of exhaustive directory searches.

Capability reference

npi_search_providers tool

  • Inputs: name_search or first_name / last_name (individuals), organization_name (organizations), provider_type, city / state / postal_code (practice addresses only), and a plain-language specialty resolved through the bundled NUCC taxonomy, or an exact taxonomy_description (never both). At least one criterion is required, state alone is rejected, and individual and organization criteria can't be mixed. A trailing * needs at least 2 leading characters; postal_code takes 5 or 9 digits or a 2–9 digit prefix ending in *. Positive limit (clamped to 200, default 10), skip 0–1000. Optional use_first_name_alias controls upstream first-name variants; omitted defaults to true for a non-wildcard first name. When supplied for a wildcard/no-first-name search, the option is reported as inapplicable
  • Output: compact rows (npi, name, primary taxonomy, primary practice city / state / postalCode, status), with matchedLocation / matchedOtherName naming the practice location or other name a row matched through, and resolvedTaxonomies / appliedTaxonomyDescription echoing the specialty resolution. appliedFirstNameAlias reports the effective boolean only for a non-wildcard first name. No true total is reported: a full page names nextPage, and the terminal window (skip 1000, limit 200) returns continuationPostalCodes that continue the search
  • Typed error reasons: no_search_criteria, conflicting_specialty, mixed_provider_criteria, unresolved_specialty, invalid_search_field

npi_get_provider tool

  • Accepts npis: a single NPI or up to 100 raw entries, each exactly 10 digits. Deduplicates, checks every check digit, then looks up the first 10 distinct valid NPIs; optional unprocessed lists the remaining valid NPIs in order. With NPI_CLAMP_LIMITS=false, the raw array maximum is 10
  • Partitions the batch into found (decoded records: taxonomies with license, practice addresses, credential, identifiers, FHIR/Direct endpoints, status — only LOCATION address rows for individual providers, so their mailing address is withheld), notFound (confirmed absence), errored (upstream failure — retry these), and invalid (failed the check digit, never looked up)
  • Typed error reasons: invalid_npi_format (every NPI failed the check digit), none_found (every NPI looked up is a confirmed absence); an upstream failure surfaces as that underlying error instead. Error messages and structured error data retain every invalid NPI and any unprocessed remainder

npi_lookup_taxonomy tool

  • Modes: resolve (query → matching active codes), get (exact code → full entry with NUCC's notes), browse (walk grouping → classification → specialization, filterable by grouping and NUCC section). Section describes the taxonomy category, not a provider's NPI entity type; use search's provider_type for that. resolve / browse take positive limit (clamped to 50, default 20) and skip (0–1000) and disclose truncated; wrong-mode arguments are rejected before defaults apply
  • Every entry carries status (active / inactive) and an inactive code's replacedBy; resolve excludes inactive codes, while get and browse return them. A resolved entry's specialization (or classification when absent) is the exact value npi_search_providers.taxonomy_description accepts
  • Definitions and notes contain readable line breaks and list bullets in place of NUCC HTML markup; literal markers and source text remain intact
  • Typed error reasons: no_match, missing_argument, wrong_mode_argument

npi://provider/{npi} resource

  • Returns the same decoded record as npi_get_provider, for one NPI, as application/json — only LOCATION address rows are kept for individual providers
  • npi must be a well-formed 10-digit NPI; invalid_npi_format when it fails the NPI check digit (no registry request), no_record when the registry has none (deactivated or never enumerated)

npi://taxonomy/{code} resource

  • Returns the same entry as npi_lookup_taxonomy mode get (NUCC notes, status, and replacedBy included; inactive codes stay readable), as application/json; cached publicly for 24 hours
  • code must match ^\d{3}[A-Z0-9]{6}X$; no_match when no entry exists for the code

Features

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

NPI/NPPES-specific:

  • Keyless — runs against the public CMS NPPES NPI Registry API (v2.1) with no API key or account
  • Bundled NUCC taxonomy — the 883-code Healthcare Provider Taxonomy (v26.1) ships in the image and loads into an in-memory index at startup, so specialty resolution and code lookups work fully offline with no second upstream
  • Specialty resolution turns a vague term ("heart doctor") into the precise taxonomy description the registry filters on, and echoes the match back for the agent to verify
  • Detects the registry's quirk of returning HTTP 200 with an Errors[] body on validation failure and maps it to typed, recoverable error reasons

Agent-friendly output:

  • Provenance on search — the resolved taxonomy and the exact taxonomy_description sent to the registry are echoed back, so agents can see what was actually searched and re-run with a different code
  • Honest pagination — the returned count is disclosed as the page size, never a fabricated grand total; a full page names the exact next page, and a broad query that hits the 1200-match reachable ceiling gets the postal-code prefixes that continue it
  • Graceful partial failure — npi_get_provider returns per-NPI found / notFound / errored / invalid rows instead of failing the whole batch

Getting started

Connect to the hosted instance, no install:

sh
claude mcp add --transport http npi-providers-mcp-server https://npi-providers.caseyjhand.com/mcp

Or run it locally:

sh
claude mcp add npi-providers-mcp-server -- npx -y @cyanheads/npi-providers-mcp-server

For other clients, add this to the MCP config file:

json
{  "mcpServers": {    "npi-providers-mcp-server": {      "command": "npx",      "args": ["-y", "@cyanheads/npi-providers-mcp-server"]    }  }}

No API key is required. For Docker or a source build, see Running the server.

Configuration

No required variables — the server runs out of the box against the keyless NPPES registry. All variables below are optional overrides.

VariableDescriptionDefault
NPPES_API_BASE_URLNPPES NPI Registry API base URL. Override for a private mirror or testing.https://npiregistry.cms.hhs.gov/api
NPPES_TIMEOUT_MSPer-request HTTP timeout for NPPES calls, in milliseconds.15000
NPI_CLAMP_LIMITSClamp search limits to 200 and taxonomy limits to 50; accept 100 raw NPIs while looking up ten distinct valid NPIs. False restores schema upper bounds of 200, 50 and ten raw NPIs. Every actual clamp emits a notice, log and counter event.true
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTPort for the HTTP server.3010
MCP_AUTH_MODEAuth mode: none, jwt, or oauth.none
MCP_SESSION_MODEHTTP session handling: stateless, stateful, or auto. This server pins stateless; the schema default auto resolves to stateful.stateless
MCP_LOG_LEVELLog level (RFC 5424).info
LOG_TOOL_FAILURE_PAYLOADSLog each failed tool call's arguments and result, redacted by key name and capped at LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (default 16384). A secret inside a free-form value is not redacted.false
STORAGE_PROVIDER_TYPEStorage backend.in-memory
OTEL_ENABLEDEnable OpenTelemetry instrumentation (spans, metrics, completion logs).false

See .env.example for the full list of optional overrides.

Running the server

Local development

Requires Bun v1.4.0 or higher (or Node.js v24+). The NPPES registry is keyless and the NUCC taxonomy is bundled.

  • Clone and install:

    sh
    git clone https://github.com/cyanheads/npi-providers-mcp-server.gitcd npi-providers-mcp-server && bun installcp .env.example .env   # optional NPPES base URL and timeout overrides
  • Build and run:

    sh
    # One-time buildbun run rebuild
    # Run the built serverbun run start:stdio# orbun run start:http
  • Run checks and tests:

    sh
    bun run devcheck   # Lint, format, typecheck, securitybun run test       # Vitest test suitebun run lint:mcp   # Validate MCP definitions against spec

Docker

sh
docker build -t npi-providers-mcp-server .docker run --rm -e MCP_TRANSPORT_TYPE=http -p 3010:3010 npi-providers-mcp-server

The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/npi-providers-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point — registers tools and resources, inits services.
src/configServer-specific environment variable parsing and validation with Zod.
src/mcp-server/toolsTool definitions (*.tool.ts).
src/mcp-server/resourcesResource definitions (*.resource.ts).
src/services/nppesNPPES NPI Registry API client — query building, Errors[]-on-200 detection, normalization.
src/services/taxonomyBundled NUCC taxonomy service — in-memory index for resolve / get / browse.
skills/Published agent guide, delivered with the package and over MCP.
tests/Unit and integration tests mirroring src/.

Development guide

See CLAUDE.md/AGENTS.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for request-scoped logging, ctx.state for tenant-scoped storage
  • Register new tools and resources in the createApp() arrays
  • Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields

Data attribution

Provider data from the CMS NPPES NPI Registry (public domain). The bundled specialty codes are the NUCC Health Care Provider Taxonomy, © American Medical Association on behalf of the National Uniform Claim Committee (NUCC), redistributed unmodified beyond formatting under the NUCC permission. See NOTICE.

Contributing

Issues are welcome. Run checks and tests before submitting:

sh
bun run devcheckbun run test

License

Apache-2.0 — see LICENSE for details.

来源:README.md,提交 ac8d90f

工具

3

npi_search_providers

Npi Search Providers

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.

输入参数cityskiplimitstatelast_namespecialtyfirst_namename_searchpostal_codeprovider_typeorganization_nametaxonomy_description另有 1 个

npi_get_provider

Npi Get Provider

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.

输入参数npis必填

npi_lookup_taxonomy

Npi Lookup Taxonomy

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.

输入参数codemode必填skiplimitquerysectiongrouping

版本历史

5
  1. v0.5.0最新Oct 26, 2026
  2. v0.4.1Oct 9, 2026
  3. v0.4.0Sep 25, 2026
  4. v0.1.9Sep 21, 2026
  5. v0.1.8Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分