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 分