clinicaltrialsgov-mcp-server について
clinicaltrialsgov-mcp-serverは、ClinicalTrials.govの検索、試験詳細・結果の取得、患者情報に基づく候補試験の照合をMCP経由で提供します。試験検索や動向分析向けで、フィールド探索と簡潔な一覧・詳細レコードに対応します。
主な機能
- 01条件やフィルターによる試験検索
- 02プロトコル記録と公開結果の取得
- 03フィールド定義と値の確認
- 04患者情報と募集中試験の照合
- 05地理条件による実施施設の検索
活用シーン
- 01疾患、フェーズ、場所による試験検索
- 02完了試験の結果と有害事象の確認
- 03試験数と登録フィールドの分析
- 04患者情報に合う候補試験の特定
MCP 対応
MCPクライアントに7つのツール、1つのJSONリソース、分析用プロンプトを提供します。stdioとStreamable HTTPに対応します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://clinicaltrials.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-clinicaltrialsgov https://clinicaltrials.caseyjhand.com/mcp{"mcpServers":{"cyanheads-clinicaltrialsgov":{"type":"http","url":"https://clinicaltrials.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-clinicaltrialsgov":{"type":"http","url":"https://clinicaltrials.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-clinicaltrialsgov":{"type":"http","url":"https://clinicaltrials.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-clinicaltrialsgov":{"serverUrl":"https://clinicaltrials.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
7| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| sort | string | いいえ | 並べ替え順。形式:FieldName:asc または FieldName:desc。例:"LastUpdatePostDate:desc"、"EnrollmentCount:desc"。カンマ区切りで最大 2 フィールドを指定できます。「最大規模の試験」を検索する場合は、EnrollmentCount:desc と高度なフィルター "AREA[StudyType]INTERVENTIONAL" を組み合わせてください。入 enroll 数の上位には、数千万人を登録する観察レジストリ/請求データ研究が含まれます。入 enroll 数はスポンサーによる報告であり、不明な入 enroll 数を示すセンチネル値の除外を除き、上流では検証されません。並べ替え可能なフィールド名は clinicaltrials_get_field_definitions で確認してください。 |
| query | string | いいえ | 全フィールドを対象とする一般的なフリーテキスト検索。このパラメーター向けに ClinicalTrials.gov が公開している 57 フィールドの関連性検索を実行します。対象は NCTId、NCTIdAlias、OrgStudyId、SecondaryId、Acronym、BriefTitle、OfficialTitle、Condition、InterventionName、InterventionOtherName、Phase、StdAge、StudyType、BriefSummary、アウトカム指標とその説明、LeadSponsorName、CollaboratorName、Location* フィールド、Design* フィールド、および ConditionAncestorTerm/InterventionAncestorTerm の MeSH 上位概念です。そのため、検索語が想定したフィールドに含まれない結果もヒットする場合があります。通常の単語に加え、AND、OR、NOT を使用できます。`[ ]` は AREA[FieldName]value または RANGE[min, max] 式の中でのみ有効です。これらの式は advancedFilter と同様にここでも使えるため、AREA[Phase]PHASE2 はこのパラメーターで受け付けられます。単独の角括弧はエラーになります。`( )` は部分式をグループ化し、マッチした場合に機能します。`,` は AND として扱われます。専用の *Query パラメーター(conditionQuery、interventionQuery など)は、検索対象を 1 つのフィールドに限定します。 |
| fields | array | いいえ | 返す PascalCase のリーフ名。完全なレコードは約 70KB のため、指定を強く推奨します。省略すると簡潔なインデックス投影が返されます。空のリストは省略として扱われず、拒否されます。カンマまたはパイプで連結された項目("NCTId,BriefTitle")は個別の名前に分割されます。一般的なリーフ:NCTId、BriefTitle、BriefSummary、OverallStatus、Phase、LeadSponsorName、Condition。概念に対応する正確なリーフを見つけるには、概念クエリ(例:"adverse events"、"eligibility")を指定して clinicaltrials_get_field_definitions を呼び出してください。 |
| nctIds | any | いいえ | 一括検索する特定の NCT ID に絞り込みます。省略するとすべての研究を検索します。空のリストは「フィルターなし」として扱われず、拒否されます。この値を指定すると、デフォルトの不明な入 enroll 数の除外が解除されるため、指定した ID が自身の検索から除外されることはありません。 |
| pageSize | integer | いいえ | 1 ページあたりの結果数。1~200。 |
| geoFilter | string | いいえ | 地理的な近接フィルター。形式:distance(lat,lon,radius)。radius には `mi` または `km` の接尾辞が必要です。例:シアトルから 50 マイル以内の研究を検索する場合は "distance(47.6062,-122.3321,50mi)"。接尾辞は必須です。単位のない半径、0 以下の半径、[-90, 90] の範囲外の緯度、[-180, 180] の範囲外の経度は拒否されます。設定すると、各研究のロケーションが中心点からの距離順に並べ替えられ、最も近い該当施設が先頭になり、距離がマイル単位で注記されます。ロケーションの全リストは保持されます。 |
| pageToken | string | いいえ | ページネーションカーソル:前回のレスポンスの nextPageToken を変更せずに、同じ条件で渡します。ClinicalTrials.gov がデータを更新すると、トークンは期限切れになります。 |
| countTotal | boolean | いいえ | レスポンスに研究総数を含めます。最初のページでのみ計算されます。 |
| titleQuery | string | いいえ | 研究のタイトルと略称のみを検索します。Acronym、BriefTitle、OfficialTitle にマッチします。通常の単語に加え、AND/OR/NOT を使用できます。`[ ]` は AREA[FieldName]value または RANGE[min, max] 式の中でのみ有効で、このパラメーターではこれらの式を使用できます。単独の角括弧はエラーになります。`( )` はマッチした場合に部分式をグループ化します。`,` は AND として扱われます。 |
| phaseFilter | any | いいえ | 試験フェーズで絞り込みます。省略するとすべてのフェーズを検索します。空のリストは拒否され、「フィルターなし」とは扱われません。値:EARLY_PHASE1、PHASE1、PHASE2、PHASE3、PHASE4、NA。大文字小文字や空白の異なる形式(「Phase 3」、「early phase 1」、「Not Applicable」)も受け付けます。リスト、またはカンマやパイプで連結した文字列は、いずれかのフェーズに一致します。各項目にはフェーズ名を指定してください。検索式(OR、NOT、AREA[…])は advancedFilter に記述します。 |
| outcomeQuery | string | いいえ | アウトカム指標フィールドを検索します。PrimaryOutcomeMeasure、SecondaryOutcomeMeasure、OtherOutcomeMeasure、OutcomeMeasureTitle、および対応する説明フィールド PrimaryOutcomeDescription、SecondaryOutcomeDescription、OtherOutcomeDescription、OutcomeMeasureDescription、OutcomeMeasurePopulationDescription に一致します。そのため、検索語がアウトカムの説明文にのみ含まれていても一致します。通常の単語と AND/OR/NOT を使用できます。`[ ]` は AREA[FieldName]value または RANGE[min, max] 式の内部でのみ有効です。このパラメーターではこれらの式を使用でき、単独の角括弧はエラーになります。`( )` は一致時に部分式をグループ化し、`,` は AND として扱われます。 |
| sponsorQuery | string | いいえ | スポンサー/共同研究者名を検索します。LeadSponsorName、CollaboratorName、OrgFullName に一致します。通常の単語と AND/OR/NOT を使用できます。`[ ]` は AREA[FieldName]value または RANGE[min, max] 式の内部でのみ有効です。このパラメーターではこれらの式を使用でき、単独の角括弧はエラーになります。`( )` は一致時に部分式をグループ化し、`,` は AND として扱われます。 |
| statusFilter | any | いいえ | 試験のステータスで絞り込みます。省略するとすべてのステータスを検索します。空のリストは拒否され、「フィルターなし」とは扱われません。値:RECRUITING、COMPLETED、ACTIVE_NOT_RECRUITING、NOT_YET_RECRUITING、ENROLLING_BY_INVITATION、SUSPENDED、TERMINATED、WITHDRAWN、UNKNOWN、WITHHELD、NO_LONGER_AVAILABLE、AVAILABLE、APPROVED_FOR_MARKETING、TEMPORARILY_NOT_AVAILABLE。 |
| locationQuery | string | いいえ | 所在地を検索します。都市、州、国、施設名が対象です。LocationCity、LocationState、LocationCountry、LocationFacility、LocationZip に一致し、試験のいずれかの施設が一致すれば対象になります。通常の単語と AND/OR/NOT を使用できます。`[ ]` は AREA[FieldName]value または RANGE[min, max] 式の内部でのみ有効です。このパラメーターではこれらの式を使用でき、単独の角括弧はエラーになります。`( )` は一致時に部分式をグループ化し、`,` は AND として扱われます。 |
| advancedFilter | string | いいえ | AREA[FieldName]value 構文を使用して高度な絞り込みを行います。例:「AREA[StudyType]INTERVENTIONAL」、「AREA[EnrollmentCount]RANGE[100, 1000]」、「AREA[Phase]PHASE2 AND AREA[StudyType]INTERVENTIONAL」、「(AREA[Phase]PHASE3 OR AREA[Phase]PHASE4) AND AREA[StudyType]INTERVENTIONAL」。「AREA[HasResults]true」は結果が公開されている試験に限定します。AND/OR/NOT で完全な AREA[FieldName]value 式をつなぎ、括弧でグループ化します。AREA[] に対応するフィールド名を調べるには clinicaltrials_get_field_definitions を呼び出してください。 |
| conditionQuery | string | いいえ | 病状/疾患に関する検索です。例:「Type 2 Diabetes」、「non-small cell lung cancer」。Condition、BriefTitle、OfficialTitle、ConditionMeshTerm、ConditionAncestorTerm、Keyword、NCTId に一致します。ConditionAncestorTerm は、試験自体が列挙する病状の上位 MeSH 概念です。そのため、列挙された病状より広い結果が得られ、試験が名称を挙げていない上位概念にも一致することがあります。通常の単語と AND/OR/NOT を使用できます。`[ ]` は AREA[FieldName]value または RANGE[min, max] 式の内部でのみ有効です。このパラメーターではこれらの式を使用でき、単独の角括弧はエラーになります。`( )` は一致時に部分式をグループ化し、`,` は AND として扱われます。 |
| interventionQuery | string | いいえ | 介入/治療を検索します。例:「pembrolizumab」、「cognitive behavioral therapy」。InterventionName、InterventionType、ArmGroupType、InterventionOtherName、BriefTitle、OfficialTitle、ArmGroupLabel、InterventionMeshTerm、Keyword、InterventionAncestorTerm、InterventionDescription、ArmGroupDescription に一致します。InterventionAncestorTerm は、試験自体が列挙する介入の上位 MeSH 概念です。そのため、列挙された介入より広い結果が得られます。通常の単語と AND/OR/NOT を使用できます。`[ ]` は AREA[FieldName]value または RANGE[min, max] 式の内部でのみ有効です。このパラメーターではこれらの式を使用でき、単独の角括弧はエラーになります。`( )` は一致時に部分式をグループ化し、`,` は AND として扱われます。 |
| includeUnknownEnrollment | boolean | いいえ | EnrollmentCount が上流の「unknown」センチネル値(99999999)である試験を含めます。既定では除外されます。このセンチネル値は RANGE[N, MAX] クエリや EnrollmentCount:desc の並べ替えに影響します。データ品質の監査や、登録数が不明な試験を対象にする場合は true に設定してください。 |
詳細
clinicaltrialsgov-mcp-server
MCP を介して ClinicalTrials.gov の試験を検索し、試験の詳細と結果を取得して、患者に適した候補試験を見つけます。STDIO または Streamable HTTP に対応しています。
公開ホストサーバー: https://clinicaltrials.caseyjhand.com/mcp
概要
米国国立医学図書館の試験登録サイトである ClinicalTrials.gov に登録された 60 万件以上の試験を検索します。試験の完全な記録と公開済みの結果を取得し、フィールドや有効な値を調べ、患者のプロフィールに適した募集中の試験を見つけられます。API キーは不要です。
ツール
| ツール | 説明 |
|---|---|
clinicaltrials_search_studies | 全文検索やフィールド指定検索、ステータス/フェーズ/地域フィルター、ページネーション、並べ替え、フィールド選択を使って試験を検索します |
clinicaltrials_get_study_record | NCT ID を指定して単一の試験を取得します。任意で施設、アウトカム、参照情報の上限を指定できる、完全なプロトコル記録です |
clinicaltrials_get_study_count | データを取得せず、クエリに一致する試験の総数をすばやく取得します |
clinicaltrials_get_field_values | API フィールドの有効な値と、値ごとの試験数を調べます |
clinicaltrials_get_field_definitions | キーワード検索、パスの詳細表示、またはトップレベルの概要によって、有効なフィールド名を特定します |
clinicaltrials_get_study_results | 完了した試験の公開済み結果(アウトカム、有害事象、参加者の推移、ベースライン)を取得します |
clinicaltrials_find_eligible | 患者の人口統計情報と疾患を照合し、候補となる募集中の試験を見つけます。組み入れ/除外基準は確認しません |
リソース
| リソース | 説明 |
|---|---|
clinicaltrials://{nctId} | NCT ID を指定して単一の臨床試験を JSON で取得します。リストには上限を設定し、結果は件数に置き換えます |
プロンプト
| プロンプト | 説明 |
|---|---|
analyze_trial_landscape | 件数取得ツールと検索ツールを使用し、データに基づく臨床試験の概況分析を行います |
機能リファレンス
clinicaltrials_search_studies ツール
- フリーテキストの
queryに加え、フィールド固有のconditionQuery/interventionQuery/locationQuery/sponsorQuery/titleQuery/outcomeQuery、statusFilter/phaseFilter列挙型(大文字・小文字やスペースの違いを許容)、advancedFilter(AREA[FieldName]value/RANGE[min, max])、geoFilter(mi/km接尾辞付きのdistance(lat,lon,radius))を指定できます。pageSizeは 1~1000(デフォルトは 10。サーバーのページあたりの上限(デフォルトは 200)を超える場合、上限に合わせてページが返され、truncated/shown/capが設定されます)、pageTokenはカーソル、sortは最大 2 フィールドでのソートです。 - デフォルトでは、試験ごとの簡潔なインデックス(
nctId、briefTitle、overallStatus、phases、enrollmentCount、hasResults、…)を返します。fields(PascalCase のリーフ)を指定すると、完全な忠実度の投影を選択できます。完全なレコードは約 70KB になります。 - 型付きエラー:
blank_value、ids_not_found、field_invalid、enum_invalid、query_parse_error、geo_invalid、sort_invalid、page_token_invalid、rate_limited
clinicaltrials_get_study_record ツール
nctIdでプロトコルの完全なレコードを取得します。任意でlocationLimit、outcomeLimit/referenceLimit、および所在地の範囲指定と並べ替えに使うnearLocation(lat、lon、radiusMi)を指定できます。いずれにも上限はなく、リストの件数を超える値を指定するとリスト全体が返されます。- 上限によってリストが切り詰められた場合、
filtersAppliedに上流の合計件数が示されます。resultsSectionは件数を示すresultsSummaryに置き換えられます。型付きエラー:study_not_found、rate_limited
clinicaltrials_get_study_count ツール
clinicaltrials_search_studiesと同じクエリおよびフィルターを指定でき、totalCountのみを返します。試験データは取得されません。- 型付きエラー:
blank_value、field_invalid、enum_invalid、query_parse_error、rate_limited
clinicaltrials_get_field_values ツール
- 1 つ以上の PascalCase の
fields(例:OverallStatus、Phase)を指定します。各フィールドの型と、試験件数付きの上位値(API により 250 件を上限とする)、または数値・日付フィールドのmin/max/avg、真偽値フィールドのtrueCount/falseCountを返します。 - STRING フィールドには
longest値が追加されます。2,000 文字を超える場合は、truncatedフラグ付きのプレビューとなり、完全なlengthと、テキスト全体を返すclinicaltrials_search_studies呼び出しを示す通知が含まれます。API が個別の値の件数を数えないフリーテキストフィールドにはuniqueValuesCounted: falseが設定され、uniqueValuesCountの 0 は件数を数えていないことを示します。 multiValuedは、値ごとの件数の合計が試験総数を上回る場合があるフィールドを示します。型付きエラー:blank_value、field_invalid、rate_limited
clinicaltrials_get_field_definitions ツール
mode:search(キーワードquery、デフォルトのlimitは 20、上限なし)、drill(ドット記法のpath)、またはoverviewを指定します。fields、advancedFilter、sort、clinicaltrials_get_field_valuesで使用できる PascalCase の名前を解決します。- 型付きエラー:
blank_value、mode_mismatch、mode_requires、path_not_found、rate_limited
clinicaltrials_get_study_results ツール
- 1 回の呼び出しで取得できる個別の
nctIdsは最大 20 件です。さらに多くの ID(最大 500 件)はdeferredNctIdsとして返されます。sections(outcomes、adverseEvents、participantFlow、baseline、moreInfo)、1 試験あたり 500KB を超える場合がある結果セットを簡潔にまとめるsummary、および再開可能なoutcomeOffset/seriousEventOffset/otherEventOffsetと組み合わせて使うoutcomeLimit/adverseEventLimitを指定できます。 - バッチ全体の失敗ではなく、試験ごとの
fetchErrors/studiesWithoutResultsが返されます。また、別名 ID が別の試験に解決された場合はcanonicalNctIdが返されます。型付きエラー:blank_value、offset_not_applicable、rate_limited
clinicaltrials_find_eligible ツール
age(整数、0~120)。乳児や幼児の場合は、任意でageUnit(デフォルトはyears、months、weeks、days)を指定できます。sex(FEMALE/MALE/ALL)、conditions[]、location(countryは必須、state/cityは任意)、healthyVolunteer、recruitingOnly(デフォルトは true)、maxResults(最大 1000。各呼び出しで返されるのは最大 50 件で、残りはtruncated/shown/capと、再実行可能なsearchCriteriaで示されます)、locationLimit(上限なし。一致した施設数を超える値を指定すると、すべて返されます)- 年齢、性別、場所、募集状況、あいまい検索による疾患条件で一致を判定します。
funnelはフィルターの各段階での一致件数を示し、noticeは組み入れ基準/除外基準が確認されていないことを伝えます(確認するにはclinicaltrials_get_study_recordを使用してください) - 型付きエラー:
blank_value、rate_limited
clinicaltrials://{nctId} リソース
application/json形式の完全なプロトコル記録です。所在地、副次評価項目/その他の評価項目、参考文献はそれぞれ最大 50 件に制限されます。サーバー側で固定されており、引数はありません- 結果データは
resultsSummaryの件数に置き換えられます。truncatedとfiltersAppliedで制限された内容が示され、完全なデータを取得するツールはretrievalに記載されます - 型付きエラー:
study_not_found、rate_limited
analyze_trial_landscape プロンプト
- 引数:
topicは必須、focusAreas(カンマ区切り)は任意 - データに基づく状況分析のために、件数取得、検索、フィールド検出、結果取得の各ツールをエージェントに案内するユーザーメッセージを 1 件返します
特徴
@cyanheads/mcp-ts-core を基盤としています。stdio および Streamable HTTP トランスポート、プラグイン可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、OpenTelemetry トレースに対応した構造化ロギングを備えています。
ClinicalTrials.gov 固有の機能:
- ClinicalTrials.gov REST API v2 用の型安全なクライアント — 一般公開されており、認証や API キーは不要です
- ClinicalTrials.gov の約 1 リクエスト/秒のレート制限を適用するシリアライズ済みリクエストキュー。429/5xx 応答や HTML エラーページに対する再試行と指数バックオフを備えています
fields/sortに渡されたフィールド名を自動修正します(大文字小文字、空白、RecruitmentStatus→OverallStatusなどの旧エイリアス)。修正内容はその都度ログに記録されます- ジオコーディングへの依存なしで、地理的な近接検索と最寄り施設の再ランキングに対応します
- デフォルトでは、検索と件数取得から登録数の「不明」を表すセンチネル値(
99999999)を除外します。includeUnknownEnrollmentを指定すると含められます
エージェントに適した出力:
- 出典情報 — 検索、件数取得、適格性判定の各ツールは
searchCriteriaを返します。clinicaltrials_get_study_resultsでは、エイリアス ID が別の試験に解決される場合にcanonicalNctIdを示します - 部分的な失敗への対応 —
clinicaltrials_get_study_resultsは、バッチ全体を失敗させる代わりに、試験ごとのfetchErrors/studiesWithoutResultsを返します - 型付きエラー — 各ツールは
reasonコード(study_not_found、blank_valueなど)を返し、件数に上限のあるリストでは、残りがある場合に限りnext*Offsetを含めます - 応答の整形 — 検索と適格性判定では、約 70KB の完全な記録ではなく、デフォルトで簡潔なインデックスを返します
はじめに
公開ホストインスタンス
公開インスタンスを https://clinicaltrials.caseyjhand.com/mcp で利用できます。インストールは不要です。Streamable HTTP 経由で、任意の MCP クライアントから接続してください。
{
"mcpServers": {
"clinicaltrialsgov-mcp-server": {
"type": "streamable-http",
"url": "https://clinicaltrials.caseyjhand.com/mcp"
}
}
}
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加してください。
{
"mcpServers": {
"clinicaltrialsgov-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["clinicaltrialsgov-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または npx を使用します(Bun は不要です)。
{
"mcpServers": {
"clinicaltrialsgov-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "clinicaltrialsgov-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または Docker を使用します。
{
"mcpServers": {
"clinicaltrialsgov-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/clinicaltrialsgov-mcp-server:latest"]
}
}
}
Streamable HTTP の場合は、トランスポートを設定してサーバーを起動してください。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以上(または Node.js v24 以上)。
インストール
- リポジトリをクローンします。
git clone https://github.com/cyanheads/clinicaltrialsgov-mcp-server.git
- ディレクトリに移動します。
cd clinicaltrialsgov-mcp-server
- 依存関係をインストールします。
bun install
設定
すべての設定は任意です。サーバーはデフォルト設定で動作し、API キーも不要です。
| 変数 | 説明 | デフォルト |
|---|---|---|
CT_API_BASE_URL | ClinicalTrials.gov API のベース URL です。 | https://clinicaltrials.gov/api/v2 |
CT_REQUEST_TIMEOUT_MS | リクエストごとのタイムアウト(ミリ秒)です。正の整数を指定します。 | 30000 |
CT_MAX_PAGE_SIZE | clinicaltrials_search_studies の 1 ページで返す試験数です。1 以上の整数を指定します。1000 を超える値は 1000 に制限されます。 | 200 |
MCP_TRANSPORT_TYPE | トランスポートです。stdio または http を指定します。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモードです。stateless、stateful、または auto を指定します。 | stateless |
MCP_AUTH_MODE | 認証モードです。none、jwt、または oauth を指定します。 | none |
MCP_LOG_LEVEL | ログレベル(RFC 5424)です。 | info |
LOGS_DIR | ログファイルの保存ディレクトリです(Node.js のみ)。 | <project-root>/logs |
OTEL_ENABLED | OpenTelemetry トレーシングを有効にします。 | false |
OTEL_EXPORTER_OTLP_ENDPOINT | トレースとメトリクス用の OTLP ベース URL です。 | — |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | ログエクスポート用の OTLP エンドポイントです。 | — |
LOG_TOOL_FAILURE_PAYLOADS | 失敗したツール呼び出しの引数と結果を、キー名で機密情報をマスキングし、LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES(デフォルトは 16384)で指定したサイズを上限として記録します。自由形式の値に含まれる秘密情報はマスキングされません。 | false |
任意のオーバーライド設定の一覧については、.env.example を参照してください。
サーバーの実行
ローカル開発
-
ビルドして実行する:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
チェックとテストを実行する:
bun run devcheck # Lint, format, typecheck, and security audit bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t clinicaltrialsgov-mcp-server .
docker run --rm -p 3010:3010 clinicaltrialsgov-mcp-server
Dockerfile は、デフォルトで HTTP トランスポート、ステートレスセッションモードを使用し、/var/log/clinicaltrialsgov-mcp-server にログを記録します。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 目的 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。ツール、リソース、プロンプトを登録し、ClinicalTrials.gov サービスを初期化します。 |
src/config | サーバー固有の環境変数を解析し、Zod で検証します。 |
src/mcp-server/tools | ツール定義(*.tool.ts)です。 |
src/mcp-server/resources | リソース定義(*.resource.ts)です。 |
src/mcp-server/prompts | プロンプト定義(*.prompt.ts)です。 |
src/services/clinical-trials | ClinicalTrials.gov REST API v2 クライアントです。リトライ、レート制限、フィールド検索、型を扱います。 |
tests/ | 単体テストと統合テストです。 |
開発ガイド
開発ガイドラインとアーキテクチャルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックで
try/catchは使用しません。 - リクエストスコープのログ記録には
ctx.logを使い、consoleは呼び出しません。 - 新しいツールとリソースは、
src/mcp-server/*/definitions/index.tsのバレル経由で登録します。 - 生の API レスポンスを検証し、ドメイン型に正規化します。不足しているフィールドを捏造してはいけません。
コントリビューション
問題の報告を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。