medical-codes-mcp-server について
medical-codes-mcp-serverは、米国の診断、処置、医療用品、医薬品コードをオフラインで検索するサーバーです。組み込みのパブリックドメインデータを使い、APIキーは不要です。情報提供を目的とし、コーディングの助言ではありません。
主な機能
- 01収録システムのコードを解読
- 02公式コード説明の検索
- 03有効性と請求可否の確認
- 04コード、医薬品、NDC、分類の相互参照
- 05階層とデータリリースの閲覧
活用シーン
- 01臨床記述からコードを検索
- 02コードの有効性や請求可否を確認
- 03NDCをRxNormの医薬品に対応付け
- 04コードシステムのリリース情報を確認
MCP 対応
MCPクライアントに、オフライン検索、解読、検証、階層閲覧、相互参照を行う6つのツールを提供します。STDIOとStreamable HTTPに対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://medical-codes.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-medical-codes https://medical-codes.caseyjhand.com/mcp{"mcpServers":{"cyanheads-medical-codes":{"type":"http","url":"https://medical-codes.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-medical-codes":{"type":"http","url":"https://medical-codes.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-medical-codes":{"type":"http","url":"https://medical-codes.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-medical-codes":{"serverUrl":"https://medical-codes.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
6| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| codes | array | はい | 変換するコード(1~50 個)。複数のシステムを混在できます。システムはコードごとに検出されます。NDC は RxNorm 製品に変換されます。形式は、4-4-2、5-3-2、5-4-1、5-4-2 のハイフン付き、またはハイフンなしの 10/11 桁です。 |
| system | enum | いいえ | すべてのコードの検索先をこのシステムに固定し、NDC 変換もスキップします。省略するとコードごとに自動検出します。ICD10CM | ICD10PCS | HCPCS | RXNORM |
| includeHierarchy | boolean | いいえ | true の場合、見つかった各コードの親と直接の子を付加します。 |
詳細
@cyanheads/medical-codes-mcp-server
米国の医療コード(ICD-10-CM、ICD-10-PCS、HCPCS Level II、RxNorm)を、MCP を介してバンドルされたオフラインインデックスで解読、検索、検証、相互参照できます。STDIO または Streamable HTTP に対応しています。
公開ホストサーバー: https://medical-codes.caseyjhand.com/mcp
メモ
**情報提供のみを目的としており、臨床上の助言やコーディング上の助言ではありません。**このサーバーは、コードの解読や検索に役立つよう、パブリックドメインの連邦政府リリースから公式コードの説明と、請求可能性/有効性のフラグを返します。医療上の助言ではなく、
valid_billableの結果もコーディングや償還に関する判断ではありません。請求を提出する前に、必ず公式ソースのリリース(CMS、CDC/NCHS、NLM)と支払者の規則を照合してください。バンドルされたデータは、ビルドに取り込まれたリリース時点の内容です。現在有効なリリースを正確に確認するには、medcode_list_systemsを呼び出してください。
概要
米国の医療コード(ICD-10-CM、ICD-10-PCS、HCPCS Level II、RxClass の薬剤クラスを含む RxNorm)を、公式の連邦政府リリースからオフラインで検索できます。コード、薬剤、NDC、薬剤クラスを解読、検索し、請求可能性を確認して、相互参照できます。
ツール
| ツール | 説明 |
|---|---|
medcode_get_code | 1~50 個のコードを正式な説明に変換します。コードごとに体系を自動検出し、found / notFound で一部成功を示します。 |
medcode_search_codes | 正式な説明を全文検索し、臨床的な説明からコードを検索します。 |
medcode_check_code | コードの存在、有効性、請求可能性を検証します。請求不可または終了済みの場合は whyNot を返します。 |
medcode_map_codes | 階層内のコード(parents / children)、RxNorm 全体の薬剤(名称 ↔ RXCUI、NDC ↔ RXCUI、RXCUI → 成分/ブランド)、または薬剤と RxClass の分類、および分類とその薬剤を相互に対応付けます。 |
medcode_browse_hierarchy | 検索語を使わずに体系の階層をたどり、情報を探索します。 |
medcode_list_systems | 同梱されている体系のリリース識別子、有効日、コード数と、各ソースのバージョン(来歴)を含む RxClass レイヤーを一覧表示します。 |
仕組み
再配布が自由にできるパブリックドメインの米国連邦コードセットのみを同梱しています。パッケージのビルド時に単一の SQLite + FTS5 データベースに組み込み、起動時に読み取り専用で開きます。
同梱されているコード体系
| システム | 提供元 | 対象 |
|---|---|---|
| ICD-10-CM | CDC/NCHS — 米国連邦政府、パブリックドメイン | 診断(請求可能な末端コードと、請求不可のカテゴリーヘッダー) |
| ICD-10-PCS | CMS — 米国連邦政府、パブリックドメイン | 入院患者の処置(軸ベースの7文字コード) |
| HCPCS Level II | CMS — 米国連邦政府、パブリックドメイン | 医療用品、医薬品、医師以外が提供するサービス |
| RxNorm | NLM RxNav — パブリックドメイン | 医薬品:名称 ↔ RXCUI、NDC ↔ RXCUI 対応表、有効成分、ブランド |
| RxClass drug classes | NLM RxClass — 米国政府の情報源のみ | RxNorm の医薬品のクラス:薬理クラス、作用機序、生理学的作用、薬物動態、治療カテゴリ、化学構造、治療・予防対象の疾患と禁忌、VA クラス、DEA スケジュール、CVX ワクチンコード |
RxNorm には、正規化された最新の医薬品用語集(有効成分、ブランド名、臨床用医薬品とブランド医薬品、パック、およびそれらの NDC と有効成分・ブランドの対応表)が含まれます。ビルド時に、API キー不要の RxNav REST API から取得しています。この API が提供するのはパブリックドメインの正規化レイヤーのみです。UMLS のライセンスが適用される RxNorm の完全版リリースは意図的に除外しており、パッケージを自由に再配布できる状態にしています。
RxClass は医薬品に付随するクラスレイヤーであり、コード体系ではありません。20,723 のクラスと87,269 の医薬品・クラス間のエッジが含まれ、ビルド時に API キー不要の RxClass API から取得しています。6つの情報源を同梱しており、すべて米国政府の著作物です。MEDRT(VA MED-RT — 作用機序、生理学的作用、薬物動態、化学構造、疾患との関連)、FDASPL(構造化製品ラベルに基づく FDA の確立された薬理クラスと関連クラス)、FMTSME(治療カテゴリ)、VA(VA 国民医薬品集のクラス)、RXNORM(DEA の規制薬物スケジュール)、CDC(CVX ワクチンコード)です。4つの情報源は除外しています。ATC と ATCPROD は WHO の規約により商用目的での複製・配布が禁止されており、SNOMEDCT には SNOMED CT Affiliate ライセンスが適用されます。また、DAILYMED は FDASPL のエッジをほぼ完全に(8,710件中8,696件)重複しており、バージョンを公開していません。
本製品は、米国国立医学図書館(NLM)、国立衛生研究所、保健福祉省のご厚意により、一般公開されているデータを使用しています。NLM は本製品について責任を負わず、本製品またはその他の製品を推奨・推薦するものではありません。
CPT(AMA の著作権対象)および SNOMED CT / LOINC(UMLS ライセンスが必要)は、自由に再配布できないため、オフラインパッケージには意図的に含めていません。
米国の範囲。 ICD-10-CM と ICD-10-PCS は米国の臨床修正版であり、WHO の ICD-10/ICD-11 基本版や他国の国内修正版ではありません。
機能リファレンス
medcode_get_code ツール
- 1~50 個のコードを受け付けます。システムの混在も可能です。各コードのシステムは、その形式から個別に判定されます
- National Drug Code(NDC)を、同梱の NDC↔RxNorm マップを使ってオフラインで直接 RxNorm 製品にデコードします。対象は、ハイフンで区切られた FDA のセグメント構成(4-4-2、5-3-2、5-4-1、または 11 桁の 5-4-2)およびハイフンのない 10 桁または 11 桁のコードです。
source: "NDC"のタグが付きます - 部分的に成功する場合があります。解決されたコードは
foundに、解決されなかったコードはコードごとの理由とともにnotFoundに含まれます。解決先がないハイフンのない整数は、対象範囲外の CPT / HCPCS Level I コードの可能性があるものとして示されます。ただし、ハイフンのない 10 桁または 11 桁のコードは例外で、該当する薬剤が同梱データにない NDC として示されます - ICD-10-CM のピリオド付き形式(
A01.00)で記述されたコードは ICD-10-CM として解決されます。値が実際に曖昧な場合は、明示的なsystemが自動判定に優先します(曖昧なコードにはcandidateSystemsが示されます)。また、NDC のデコードはスキップされます。includeHierarchyを指定すると、各コードに親コードと直接の子コードが付加されます alsoInSystemsは、同じコード文字列を持つ他の同梱システムを示します。各システムでは別のコードとして扱われます- RxNorm の行には
billable: null(RxNorm には請求の概念がありません)とshortDescription: null(RxNorm が公開している名称は 1 つのみ)が設定されます。chapterには RxNorm の用語タイプ(IN、SCD、SBD、…)が格納されます - エラー:要求されたすべてのコードが複数の同梱システムに存在し、
systemが指定されていない場合はambiguous_system(該当するシステムをまとめてcandidateSystemsに含めます)。それ以外の場合に、要求されたコードがいずれも解決されないとno_codes_foundになります。このエラーでは、コードを保持する他の同梱システムと、複数のシステムに存在する各コードが示されます
medcode_search_codes ツール
- すべての検索語が含まれている必要があります。まずトークンの接頭辞として照合し、次に部分文字列として照合するため、屈折形や複合形も見つかります。RxNorm の概念は薬剤名のみで照合され、用語タイプでは照合されません
system、billableOnly(ヘッダー/カテゴリ、終了済みの HCPCS コード、およびすべての RxNorm 概念を除外します。RxNorm には請求の概念がありません)、chapter(RxNorm の場合は用語タイプ)で絞り込みます- 全文検索の関連度順に並べられます。各行には解決された
systemが示されます cursor/limitによるページネーションに対応しています(既定値はMEDCODE_MAX_RESULTS、上限は 200)。truncated/nextCursorを提示し、一致する項目がない場合は解析済みのクエリを含む通知を返します
medcode_check_code ツール
- 判別された
statusはvalid_billable、valid_not_billable、valid_header、valid、またはterminatedです。validは現行の RxNorm 概念を示し、RxNorm には請求の概念がないため、billable: nullとして返されます whyNotでは、請求不可または終了済みである理由を説明します。請求不可または終了済みのコードも正常な結果であり、エラーではありません- HCPCS コードは、その終了日(CMS が請求に使用することを認める最終日)を過ぎると
terminatedになります。呼び出し時の UTC 日付に照らして判定されます。それまでは請求可能としてチェックされ、その日付がwhyNotに示されます - ICD-10-CM のピリオド付き形式(
A01.00)で記述されたコードは ICD-10-CM として解決されます。alsoInSystemsは同じコード文字列を持つ他の同梱システムを示します。判定は解決されたシステムにのみ適用されるためです - エラー:
unknown_code(指定されたシステムに存在しない場合、またはsystemが指定されず、すべての同梱システムに存在しない場合。コードの形式に合致するすべてのシステムが示されます。ICD-10-CM のピリオド付き形式の場合は ICD-10-CM のみです。明示的なsystemが指定されている場合、コードを保持する別の同梱システムがあれば、そのシステムのコードとして示されます。NDC もここに該当します。同梱データに該当する薬剤がない、形式が正しいハイフンのない 10 桁または 11 桁のコードも含まれます。その場合はmedcode_get_codeおよびmedcode_map_codesndc_to_rxcuiを案内します)およびambiguous_system(複数のシステムに存在し、systemが指定されていない場合)
medcode_map_codes ツール
- 階層方向の
parents/childrenは、1回の呼び出しにつき1階層ずつたどります(深さ1)。ICD-10-PCS コードには接頭辞の親がなく、RxNorm 概念にはコード階層がありません。 - 薬剤の方向(RxNorm):
name_to_rxcui(用語タイプではなく、薬剤名に一致します)、ndc_to_rxcui/rxcui_to_ndc(NDC は FDA の区分構成(4-4-2、5-3-2、5-4-1、または11桁の5-4-2)に従ったハイフン付き、あるいはハイフンなしの10桁/11桁で受け付けます)、rxcui_to_ingredients/rxcui_to_brands(各結果にはconceptType(IN/PIN/MIN/BN)が含まれます) - 薬剤クラスの方向(RxClass):
rxcui_to_classesは RXCUI のクラスを返し、class_to_rxcuisはクラス ID の直接のメンバーである RXCUI を返します。どちらも RxNorm 名とconceptTypeが含まれます。各結果にはclassType、そのクラスを示す RxClass のソースであるsource、およびrelation(has_epc、may_treatなど)が含まれます。結果はクラス × ソース × リレーションごとに1件です。ci_で始まるリレーション(ci_with、ci_moa、ci_pe、ci_chemclass)は適応ではなく禁忌を表します。 - RxClass はほとんどのクラスを成分に関連付けるため、薬剤製品を指定すると、その成分のクラスも返され、
viaに成分(PINではなくIN)が示されます。継承は上方向のみです。DEA スケジュールは薬剤製品にのみ記録され、VA クラスもほぼ薬剤製品にのみ記録されます。そのため、これらを調べる場合は製品を指定してください。成分のSCHEDULEまたはVAの結果が空であれば、未スケジュールまたは未分類と解釈するのではなく、そのことを示しています。メンバーシップは直接のものです。すべての薬剤がサブクラスにのみ関連付けられるクラス(N0000193873「利尿薬」など)はメンバーを返さず、クラス階層もたどりません。 - クラス ID は大文字と小文字を区別せずに一致します。また、1桁の CVX ワクチンコードは、ゼロ埋めされた ID として解釈されます(
3は CVX03です)。 classType(EPC、MOA、PE、PK、TC、CHEM、DISEASE、VA、SCHEDULE、CVX)は2つのクラス方向を絞り込みます。それ以外の方向では指定すると拒否されます。children、name_to_rxcui、rxcui_to_ndc、rxcui_to_classes、class_to_rxcuisはcursor/limitでページネーションします。1つの RXCUI に数千件のパッケージ NDC が含まれることがあり、1つのクラスに数千のメンバーが含まれることもあります。それ以外の方向ではlimitとcursorは拒否されます。また、systemが制御するのはparents/childrenのみです(薬剤およびクラスの方向で受け付けるのはRXNORMのみです)。- すべての結果には
sourceの出典情報が含まれるため、連続した呼び出しで正しい識別子を使用できます。解決可能なソースでも要求された方向の関係がない場合は、エラーではなく通知付きの正常な空の結果になります。たとえば、ブランド名にはクラスがありません。 - エラー:
no_mapping(ソースを解決できません。fromに渡されたコード体系名、コードまたは RXCUI が必要な箇所に指定された NDC(形式が正しくても、バンドルされた薬剤にマッピングされないもの)、RXCUI が必要な箇所に指定されたクラス ID、または対象範囲外の CPT/HCPCS Level I コードである可能性がある単独の整数は、その旨が示されます。また、コード体系名は、その方向が受け付ける1つの入力に復元されます。明示的に指定されたsystemに該当しないparents/childrenのコードは、そのコードを含むバンドル済みシステムのコードとして示されます。また、rxcui_to_*のソースが別のバンドル済みシステムに含まれる場合は、そのシステムのコードとして示されます。これらの方向では RxNorm 概念のみを読み取るためです。ndc_to_rxcuiで見つからない場合は、表記の形式が不正か、形式は正しいがバンドルされた薬剤にマッピングされない NDC かが示されます。class_to_rxcuisで見つからない場合は、クラス ID を想定したメッセージになり、代わりに指定された RXCUI またはクラス型が示されます)、field_not_applicable(その方向では使用されないsystem、classType、limit、またはcursor)、direction_unavailable(このビルドに RxNorm、またはクラス方向で使用する RxClass レイヤーがバンドルされていません)、ambiguous_system
medcode_browse_hierarchy ツール
nodeが指定されていない場合:最上位の項目(ICD-10-CM カテゴリー、HCPCS の範囲バケット、ICD-10-PCS の第1軸の値)。nodeが指定されている場合:その直下の子項目- ICD-10-CM/HCPCS は接頭辞による階層構造を使用します。ICD-10-PCS は軸ベースで、参照できるのは最上位の Section 軸のみです。2~7番目の位置はコンテキストに依存するため、不完全なコードから列挙することはできません
cursor/limitを使ってページ分割します(デフォルトはMEDCODE_MAX_RESULTS、上限は200)- エラー:ノードが存在しない場合、または ICD-10-PCS でアルファベット外の文字を使用しているか、バンドルされたコードが始まらない場合は
unknown_node
medcode_list_systems ツール
- 入力なし。バンドルされたシステムごとに1件を返し、
releaseId、effectiveStart/effectiveEnd、codeCount、sourceUrl、builtAtを含みます builtAtはシステムのデータの日付を示します。ICD-10-CM、ICD-10-PCS、HCPCS では、記載されたリリースからインデックスを構築した時点です。リリースラベルを公開していない RxNorm では、RxNav スナップショットを取得した日付です。そのため、同じスナップショットから再構築すると同じ日付が報告されますclassLayerは、コードシステムとは別に RxClass レイヤーを報告します。クラス数とエッジ数、およびソースごとの RxClass バージョン(RxClass が公開していない場合は null — CDC)、そのソースが提供するクラス数とエッジ数、RxClass スナップショットを取得した日付を含みます。このレイヤーなしでビルドした場合は null です- 実行中のビルドに組み込まれている ICD-10-CM/PCS の会計年度、HCPCS リリース、RxNorm スナップショット、RxClass ソースを正確に確認できます
特長
@cyanheads/mcp-ts-core を基盤としており、stdio と Streamable HTTP のトランスポート、プラグイン可能な認証(none/jwt/oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを備えています。
ICD-10/HCPCS/RxNorm 固有の特長:
- SQLite + FTS5 のインデックスを同梱 — オフラインで利用でき、キー不要かつ決定論的です。実行時のネットワーク I/O やレート制限はありません
- コード形式を自動検出して、コードを該当するシステムに自動で振り分けます。また、ICD-10-CM のドット付き形式のコードは ICD-10-CM として解決されます。衝突を区別するには、明示的に
systemを指定します - ソースリリースに基づく実際の請求可能性/有効性を示します。オーダーファイルの請求可能フラグと、HCPCS の場合は呼び出し時点で評価した終了日によって
medcode_check_codeの結果を決定し、ヒューリスティックは使用しません。請求の概念がない RxNorm は判定を返す代わりにbillable: nullを報告します
エージェントに適した出力:
- すべての応答に出所情報を含みます — 解決された
systemを後続処理用に返し、alsoInSystemsは別のバンドル済みシステムで異なる意味を持つコード文字列を示します。また、medcode_list_systemsはビルドに組み込まれたリリースを正確に報告します - 部分的な失敗を適切に処理します —
medcode_get_codeはバッチ全体を失敗させず、コードごとのfound/notFound行を返します - 判別可能な出力コントラクト —
medcode_check_codeの型付きstatusとmedcode_map_codesのsourceにより、呼び出し元は文字列を解析するのではなく、データに基づいて分岐できます
はじめに
このサーバーにはコードデータベースが同梱されているため、API キーの取得も、実行時のダウンロードも不要です。
公開ホストインスタンス
公開インスタンスは https://medical-codes.caseyjhand.com/mcp で利用できます — インストールは不要です。Streamable HTTP を提供しており、クライアントごとに設定形式が異なります。
Claude Code の場合:
claude mcp add --transport http medical-codes-mcp-server https://medical-codes.caseyjhand.com/mcp
Cline の場合(cline_mcp_settings.json):
{
"mcpServers": {
"medical-codes-mcp-server": {
"type": "streamableHttp",
"url": "https://medical-codes.caseyjhand.com/mcp"
}
}
}
Cursor の場合(mcp.json):
{
"mcpServers": {
"medical-codes-mcp-server": {
"url": "https://medical-codes.caseyjhand.com/mcp"
}
}
}
Claude Desktop では、Settings → Connectors からリモートサーバーを追加します。
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加してください。
{
"mcpServers": {
"medical-codes-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/medical-codes-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または npx を使用する場合(Bun は不要です):
{
"mcpServers": {
"medical-codes-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/medical-codes-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または Docker を使用する場合:
{
"mcpServers": {
"medical-codes-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/medical-codes-mcp-server:latest"
]
}
}
}
Streamable HTTP を使用するには、トランスポートを設定してサーバーを起動します。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
「MCP クライアントの設定ファイル」は一般的な表現として使用してください。クライアントによって設定ファイルのパスは異なり、このサーバーは特定のクライアント専用ではありません。
前提条件
- Bun v1.4 以上(または Node.js v24 以上 — Bun 以外で実行した場合、サーバーはオプションの
better-sqlite3依存関係にフォールバックします)。 - API キー、アカウント、ネットワークアクセスは不要です。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/medical-codes-mcp-server.git
- ディレクトリに移動します:
cd medical-codes-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します(任意):
cp .env.example .env
# all runtime vars are optional — the server runs as-is
設定
サーバーはオフラインで動作し、キーは不要です。必須の変数はありません。サーバー固有の設定項目が 2 つあり、標準のフレームワーク変数も適用されます。
| 変数 | 説明 | デフォルト |
|---|---|---|
MEDCODE_DB_PATH | 同梱の SQLite インデックスに対する絶対パスの上書き設定です。カスタムビルドまたは外部マウントされたデータベースを指定する場合にのみ設定してください。 | パッケージ内の data/medical-codes.db |
MEDCODE_MAX_RESULTS | 呼び出しで limit が指定されていない場合のデフォルトのページサイズです。対象は medcode_search_codes、medcode_browse_hierarchy、ページネーション対応の medcode_map_codes の各方向です。また、includeHierarchy を指定した medcode_get_code が付加する子項目の数でもあります。 | 50(上限 200) |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_HTTP_ENDPOINT_PATH | MCP サーバーをマウントするエンドポイントのパスです。 | /mcp |
MCP_SESSION_MODE | HTTP セッションの処理方法:stateless、stateful、または auto(stateful に解決されます)。src/index.ts では stateless が宣言されています。これは、ツールが呼び出し中に呼び出し元へ入力を求めないことを意味します。この変数はその宣言を上書きします。 | stateless |
MCP_AUTH_MODE | 認証モード:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(RFC 5424)。 | info |
LOG_TOOL_FAILURE_PAYLOADS | 失敗した各ツール呼び出しの引数と結果を記録します(キー名のみをマスキング)。記録量は LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES で制限されます。 | false |
OTEL_ENABLED | OpenTelemetry の計装を有効にします。 | false |
OTEL_EXPORTER_OTLP_ENDPOINT | OTLP のベース URL です。トレースは /v1/traces に、メトリクスは /v1/metrics にエクスポートされます。 | — |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | オプトイン方式の OTLP ログエクスポートです。ベースエンドポイントを指定しても有効にはなりません。 | — |
任意の上書き設定の全一覧は .env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
チェックとテストを実行:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
同梱インデックスのビルド
同梱の data/medical-codes.db は npm パッケージと Docker イメージに含まれていますが、100 MB を超えるため、git にはコミットされていません。再ビルドせずにビルド済みのコピーを入手するには、npm パッケージの data/medical-codes.db を使用するか、各 GitHub リリースに添付されている medical-codes-mcp-server.mcpb バンドルから取得してください。このバンドルは、インデックスを data/medical-codes.db に格納した zip アーカイブです。再ビルドが必要になるのは、連邦政府の新しいリリースに更新するときだけです。ビルドスクリプトはダウンロードを行いません。正規の .gov ソースファイル(ICD-10-CM/PCS の注文ファイル、および HCPCS の四半期ごとの ANWEB ファイル。HCPCS のリリースラベルを決める CMS 名のファイルで、URL はスクリプトヘッダーに記載されています)をディレクトリ直下に展開し、2 つのフェッチャーで RxNorm と RxClass をそのディレクトリにキャッシュします(空のディレクトリに対して実行してください。どちらも再取得せず、既存のキャッシュを再利用します)。その後、スクリプトにディレクトリを指定します。
bun run scripts/ingest/fetch-rxnav.ts --out <dir>/rxnav # RxNorm, from the keyless RxNav API
bun run scripts/ingest/fetch-rxclass.ts --rxnav <dir>/rxnav --out <dir>/rxclass # RxClass, after RxNorm
bun run scripts/build-index.ts --from-dir <dir> --fy 2027 # --fy labels the ICD-10-CM/PCS releases
スクリプトはソースファイルとキャッシュを解析し、単一の .db ファイルを出力します。RxNorm の日付は RxNav のフェッチ完了時刻、RxClass のソースの日付はそれぞれのフェッチ完了時刻で決まり、どちらもキャッシュに記録されるため、同じキャッシュから再ビルドすれば同じ日付が報告されます。ビルドはビルド時にのみ実行され、サーバーが何かをダウンロードすることはありません。
Docker
docker build -t medical-codes-mcp-server .
docker run --rm -e MCP_TRANSPORT_TYPE=stdio medical-codes-mcp-server
Dockerfile はデフォルトで HTTP トランスポートとステートレスセッションモードを使用し、/var/log/medical-codes-mcp-server にログを出力します。バンドルされた data/medical-codes.db をイメージにコピーするため、サーバーは完全に自己完結しています。OpenTelemetry のピア依存関係はデフォルトでインストールされます。これらを除外するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。6 つのツールを登録し、setup() でバンドルされたインデックスを開きます。 |
src/config | サーバー固有の環境変数を Zod で解析・検証します。 |
src/mcp-server/tools | ツールの定義(*.tool.ts)です。 |
src/services/code-index | コードインデックスサービスです。読み取り専用の SQLite ハンドル、コード形状の検出、FTS5 クエリの変換を行います。 |
scripts/build-index.ts | ビルド時の取り込みパイプラインです。連邦政府のソースファイルを data/medical-codes.db に組み込みます。 |
data/medical-codes.db | バンドルされた SQLite + FTS5 コードインデックスです。実行時には読み取り専用で開きます。 |
tests/ | src/ の構成に対応するユニットテストと統合テストです。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md/AGENTS.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジック内で
try/catchを使わないでください。 - リクエスト単位のログには
ctx.logを使用してください。コードインデックスは読み取り専用のグローバルデータであり、テナントの状態ではありません。 src/index.tsのcreateApp()配列を使って新しいツールを登録してください。- バンドルされた DB を信頼できる情報源として扱ってください。ソースリリースの実際の請求可能フラグと有効性フラグを提示し、コードや請求可能性の判断を捏造しないでください。
貢献
問題の報告を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。