Doktor について
Doktorは、トルコの医師向けに公式法令と理由付き高等裁判所判決を基に法的情報パックを作るTypeScript/Node.js製MCPサーバーのひな型です。断定的な法的見解ではなく、出典に基づく情報を提供します。
主な機能
- 01公式の医療関連法令の検索と取得
- 02医療・法律上の質問の分類
- 03判例の選別と重複排除
- 04出典追跡付き情報パックの作成
- 05ライブとモックのソースモード
活用シーン
- 01患者の同意に関する法令の確認
- 02案件に関連する理由付き判決の確認
- 03引用条文と出典トレースの検証
MCP 対応
質問分類、法令・判例検索、判決全文の取得、法的情報パックの作成と詳細確認を行うツールを公開します。応答にはデータの出所が示され、法令ツールではライブまたはモックのソースを選べます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
8掲載時のツール一覧 · 5 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| question | string | はい | |
| sourceMode | enum | いいえ | mock | live | snapshot |
詳細
Doktor MCP
ベータ版 — 最新のバージョンについては、package.json と CHANGELOG.md をご覧ください。
プロジェクトページ: avfatihsozer.com/projeler/doktor-mcp · 英語版:README.en.md
doktor-mcp は、医師向けの情報源に基づく法的情報パッケージを生成する、独立した TypeScript/Node.js MCP スケルトンです。カテゴリー別の最終的な法的見解を示したり、医師に何をすべきか指示したりするものではありません。質問を公式の法令本文や、理由が示された高等裁判所の判決文と照合し、断定的な判断を下すことなく、情報源に基づく条件付きの評価(例:「情報源はこの方向を示しています」)を提示できます。
アダプターの境界は、以下を対象として設計されています。
legislation(法令)yargitaydanistayaym
一般的なインターネット記事、ブログ、ニュース、法律事務所の紹介ページ、フォーラムは、このプロジェクトの情報源入力には含まれません。
ソースエンジンの移植(Source Engine Port)
ソースエンジン層は、ライブアダプターに必要な堅牢性を提供します。
- Bedesten のリクエストでは、制限付きの再試行、
Retry-Afterの処理、指数バックオフ、ジッター、リクエストテレメトリーを含む、共有のHttpClientとRateLimiterの経路を使用します。 - ライブソースのエラーは、構造化され、JSON のみで扱われます。ソースの診断情報には、ログを CLI JSON 出力に書き込むことなく、再試行回数、バックオフ時間、ステータス、コンテンツタイプを含めることができます。
src/sources/sourceRegistry.tsは、法令および判例の情報源について、簡素化されたソース機能、レート制限、キャッシュポリシーのメタデータを提供します。- Bedesten/Yargıtay アダプターは、メタデータのみの判決を、検証済み判例出力から除外します。公式法令については、公式検索、文書取得、または条文抽出で引用を裏付けられない場合、構造化された
unavailableの結果を返します。
ライブ法令の状況
公式法令のライブアダプターは、オプションの MCP ツールフローに接続されています。
- アダプター:
LiveOfficialLegislationAdapter - 公式情報源:トルコ共和国大統領府 法令情報システム —
mevzuat.gov.tr - 検索機能:公式の
MevzuatDatatable検索リクエストパーサー - 全文取得機能:公式の
MevzuatMetin文書取得 - 現在の抽出エビデンス:マッピング済み法令に対する PDF テキスト抽出と条文解析
医療関連法令が最初のライブマッピング経路です。患者の権利とインフォームドコンセントに関する質問には、患者の権利に関する規則 4847 の公式生成 PDF 経路を使用します(マッピング済み条文 24 および 26 を含みます)。医療法のマッピングには、医療職業倫理規則、医療およびその分野の実施方法に関する法律、医療サービス基本法も含まれます。KVKK 条文 6 は、健康に関する情報源に続く補足的な一般法令として、個人の健康データやプライバシーに関する質問に使用できます。
公式文書が抽出可能な形式で提供されない場合、またはマッピング済みの条文を抽出できない場合、ライブアダプターは判断を生成するのではなく、構造化された unavailable の出力を返します。
ライブソースのエラーは、次の仕様に従います。
{
"status": "unavailable",
"source": "mevzuat.gov.tr",
"errorCode": "provision_not_found",
"message": "Official text was retrieved but the mapped article could not be extracted.",
"retryable": false,
"recommendedNextStep": "Inspect the official text parser before using this provision in an answer."
}
MVP のスコープ
この骨組みには、以下が含まれます。
- MCP サーバーの登録とツールハンドラーの骨組み
- 公式法令の根拠、裁判所判決の根拠、分類、判例の状態、および法的情報パッケージの型契約
- モック法令アダプターと最高裁判所アダプター
- 公式情報源を検証するためのライブ法令アダプター
- ライブ法令向けの MCP
sourceModeルーティング - 医療優先の法令マッピングと情報源追跡(source trace)メタデータ
- 医療法務パイプラインのコンポーネント:
- 質問分類器
- 法令マッパー
- 判例フィルター
- 回答コンパイラー
- ローカル JSON スモークコマンド
- 初期の情報源安全性ルールに対する Vitest カバレッジ
判例フィルターは現在、以下の状態を提示します。
precedent_usable:全文、法的理由付け、事案との関連性がそろっていますlimited_value:全文はありますが、関連性が弱い状態ですprocedural_only:本案に関する理由付けがなく、手続上の文書、単なる棄却、または単なる破棄ですmetadata_only:全文を伴わない書誌メタデータですno_reasoning:全文はありますが、法的理由付けがありません
コンパイルされたパッケージの検証済み判例セクションに含まれるのは、precedent_usable の記録のみです。
回答契約(Response Contract)
すべてのツール応答には dataOrigin フィールドが含まれます。このフィールドは、応答の情報源を示します。
dataOrigin | 意味 |
|---|---|
"mock" | 応答に fixture(架空)データが含まれています。実際の法令や判決ではありません。 |
"live" | 応答はライブ情報源(mevzuat.gov.tr、Bedesten、Danıştay)から取得されています。 |
"snapshot" | 応答は、事前に保存されたライブ情報源のスナップショットです。 |
"computed" | 応答は計算結果のみです(分類器など)。情報源データは含まれません。 |
"client-provided" | 応答は、クライアントから提供された入力に基づいています。 |
dataOrigin: "mock" の場合、応答には mockDataWarning フィールドも含まれます。
{
"dataOrigin": "mock",
"mockDataWarning": "BU YANIT KURGU (FIXTURE) VERİSİDİR. Gerçek mevzuat veya mahkeme kararı DEĞİLDİR. Gerçek kaynaklar için sourceMode: 'live' kullanın."
}
この警告は、モックデータが実際の法令の引用のように見えるのを防ぐため、必ず追加されます。shortAnswer などの医師向けテキストフィールドには、追加の接頭辞は付きません。トップレベルの dataOrigin フィールドと mockDataWarning フィールドで十分です。
prepare_doctor_legal_information_pack の応答には、packId フィールドも含まれます。これは "pack-" で始まる6桁の16進数識別子です(例:"pack-3f9a2c")。パッケージを再生成せずに特定の項目や判決を詳しく確認するには、drill_down_pack_item ツールに packId を渡します。packId はサーバーのメモリに30分間保存されます。
構造化パッケージは、指定された医師向けセクションを中心に構成されます。
shortAnswerlegalClassificationcriminalcivilCompensationdisciplinaryAdministrativepatientRightsprivacyKvkkprofessionalEthics
relevantLegislation- 法令名
- 条項番号
- 情報源の条文からそのままコピーした引用
- 事案との関連
verifiedHighCourtPrecedents- 裁判所/部、日付、事件番号/判決番号
- 事案の概要、法的評価、結論
- 類似点/相違点に関する注記
missingInformationlawyerReviewPoints
各法令項目には、情報源ドキュメント ID と情報源からのそのままの引用が含まれます。各検証済み判例項目は、理由付けに基づく判例フィルターを通過する必要があります。
意図的に対象外とする項目
MVP には以下は含まれません。
- ライブ AYM 最高裁判所クライアント(AYM 判決情報バンクは HTML のみのインターフェースであり、JSON API はありません —
synthetic_onlyのマークが付いています) - 情報源の引用や条件付きの表現を伴わない、断定的なリスクレベル評価(「リスクレベルが高い/低い」)
- 緊急時の行動指示
- 申立書や答弁書の作成
- 最終的な法的結論
- 「責任がある」または「責任がない」などの断定的な表現
- ツールは、情報源に基づく条件付きの評価(例:「情報源はこの方向を示しています」)を提示できますが、断定的な最終判断は行いません
- MCP の情報源レコードで検証されていない、モデルのみを根拠とする法的主張
v0.44.0 の新機能
assessmentTone:任意のパラメーター("strict"|"grounded-advisory"、デフォルト:"grounded-advisory")です。strictモードでは、情報源のリストのみを返します(評価なし)。grounded-advisoryモードでは、情報源に基づく条件付き評価を含むpreliminaryAssessmentが追加されます。preliminaryAssessment:summaryとsentences[]を含む任意の応答フィールドです。各文にはtext、sourceRef、sourceLabelが含まれます。文では、先例にある実際の結論/根拠と、法令からの直接引用を使用します。定型文(ボイラープレート)は一切使用しません。- 法令の施行状況メタデータ:条項には
inForce、lastAmendedDate、repealedフィールドが含まれます(デフォルトで「施行中」とみなすことはありません)。 - 判例の重複排除:情報源をまたぐ重複(例:同じ判決が Yargıtay と Bedesten の両方から取得される場合)を排除し、最も情報量の多いバージョンを保持します。
- トルコ語の完全なダイアクリティカルマーク方針:医師向けのすべてのテキストで、正しいトルコ語の文字を使用します(ASCII 文字への置き換えはありません)。
- 完全な変更履歴は CHANGELOG.md を参照してください。安定性レイヤーについては COMPATIBILITY.md を参照してください。
レート制限は実稼働クライアント向けに確保されています。意図する動作は、実際のブロックまたは情報源エラーの後に適応型バックオフを行う、実用的な公開情報源へのトラフィックであり、負荷の証拠がない状態での積極的な制限ではありません。
MCP ツール
classify_medical_legal_questionsearch_health_legislationget_legislation_provisionssearch_health_precedentsfilter_reasoned_precedentsprepare_doctor_legal_information_packdrill_down_pack_item— フォローアップの質問:packIdを使って、パッケージを再生成せずに特定の条項/判決を詳しく調べます。例:{ "packId": "pack-3f9a2c", "followUpQuestion": "madde 24 ne diyor?" }get_decision_full_text— 特定の裁判所判決の全文を取得します。例:{ "documentId": "yargitay:99001", "sourceMode": "live" }
応答仕様に関する注意事項
すべてのツール応答には dataOrigin フィールド("mock"、"live"、"snapshot"、"computed"、"client-provided")が含まれます。モックモードでは mockDataWarning フィールドが追加されます。
prepare_doctor_legal_information_pack の呼び出しに includeDiagnostics: true パラメーターを追加すると、完全な監査証跡(選択診断、情報源の追跡情報など)を取得できます。
法令関連の MCP 入力では、任意の sourceMode を指定できます。
{
"question": "kişisel sağlık verisi mahremiyet",
"sourceMode": "live"
}
sourceMode のデフォルトは "live" です(0.59.0 以降)。フィクスチャデータを使う場合は、"mock" を明示的に指定する必要があります。
search_health_legislation、get_legislation_provisions、prepare_doctor_legal_information_pack は "live" を使用できます。ライブの情報提供パッケージは同じ MVP 形式を維持し、公式の法令情報源が検証済みの条項を返せない場合に限り sourceUnavailable を追加します。
モックモードでは、ローカルのフィクスチャ条項を使用します。ライブモードでは、mevzuat.gov.tr の公式法令テキストに加え、Yargıtay と Danıştay のライブ判例アダプターを使用します。AYM はモックのみであり、ライブモードではフォールバックとして使用せず、無効化されます。
医療法令の優先順位
ライブのマッピングレイヤーは、医師からの質問を医療法のトピック群に分類します。
- インフォームド・コンセント/同意
- 医療介入
- 患者の権利
- 患者のプライバシー
- 個人の健康データ
- 記録、診療録、退院時サマリー
- 緊急介入
- 紹介とコンサルテーション
- 医師の注意義務
- 職業倫理
各マッピングには、対象となる法令、対象となる条項番号、検索語、選択理由、医療法上の優先順位が含まれます。複数のマッピングが一致する場合、パッケージでは一般的な補足法令よりも、主要な医療法令を先に並べます。たとえば、個人の健康データのプライバシーに関する質問では、KVKK より先に Hasta Hakları Yönetmeliği が返される場合があります。KVKK は、無関係な医師からの質問に対する幅広いフォールバックとしては使用されません。
ソーストレース(Source Trace)
sourceTrace は、法的根拠を示すのではなく、ライブの法令出力を監査します。各トレースは、
条項が医療法務のマッピングから公式文書、条項の抽出手順へとどのように進んだかを示します。
- 元の
query matchedHealthMappingと、マッピングがない場合に試行されたマッピング候補officialSearchRequest、公式検索結果の件数、およびコンパクトな公式検索結果selectedSearchResultとselectedResultReason- ランディング/詳細 URL、および直接または生成された PDF URL
contentType、抽出方法、抽出された条項番号、および取得時間
ライブの search_health_legislation は、選択された条項とともにトレースも含みます。ライブの
get_legislation_provisions は、返される各条項にトレースを含みます。ライブの
prepare_doctor_legal_information_pack は、関連する法令項目と、パックレベルの
sourceTrace 配列の両方にトレースを保持します。これにより、まとめられた引用を、
同じ抽出済み条項と照合できます。
unavailable のライブパックでも、監査コンテキストは保持されます。
{
"sourceUnavailable": [
{
"status": "unavailable",
"source": "mevzuat.gov.tr",
"errorCode": "document_not_found",
"sourceTrace": [
{
"query": "bilinmeyen konu",
"matchedHealthMapping": null,
"attemptedHealthMappings": ["mevzuat:7.5.4847", "mevzuat:1.5.6698"]
}
]
}
]
}
matchedHealthMapping と selectedResultReason は、トピッククラスター、医療法務の優先度、
および選択されたマッピングが主要な医療法令か、補助的な一般法令かを示します。
トレースフィールドは、ソースの選択と抽出についてのみ説明します。法的命題を生成するものではなく、
公式条項の逐語的な本文に取って代わることは決してありません。
条項のランキング(Provision Ranking)
ライブの条項ランキングでは、公式の条項抽出後に決定論的なスコアリングを実行します。 パック用にコンパクトなソース条項のセットを選択します。条項の本文、法的助言、 または断定的な法的結論を生成するものではありません。
ランキングシグナル:
- 医師のクエリ用語
- マッピングされた医療法務のトピッククラスター
- マッピング検索用語
- 抽出された条項が使用可能な見出しで始まる場合の条項見出しテキスト
- 抽出された条項本文内のキーワード一致
- マッピング済み条項リストのボーナス
- 医療法務の優先度、および主要/補助の役割順序
ライブトレースには、candidateArticleNumbers、rankedArticleNumbers、
rejectedArticleNumbers、および rankingMethod が表示されます。返されるライブ条項にはそれぞれ、
決定論的なスコア、一致した用語、ランキング理由、および手動でマッピングされた条項リストに
由来するかどうかも含まれます。ライブアダプターは、単一の法令文書を少数のランク付けされた条項に
絞り込みます。現時点では、最大 3 条項です。抽出されたマッピング済み条項が最初に選ばれ、
シグナルの強いランク付けされた代替条項は、マッピング済み条項が抽出されていない場合にのみ
検討されます。トレースには、選択された候補と却下された候補の両方の履歴が保持されます。
KVKK、個人健康データ、およびプライバシーに関する質問では、supporting_general のままです。
ランキングやパックの順序付けにおいて、主要な医療法令に取って代わることはありません。
Yargıtay、Danıştay、AYM のアダプターは、モックアダプターのままです。
選択診断(Selection Diagnostics)
選択診断は、ソース選択を簡潔に監査するためのビューを提供します。sourceTrace には引き続き、
公式リクエスト、文書、抽出、候補、ランキング、および unavailable の詳細が含まれますが、
診断ではトレース全体を読まなくても、何が選択されたかを要約できます。
コンパクトな診断には、次の情報が含まれます。
- query と
sourceMode - 選択された法令と条項の件数
- 選択された各法令の役割、トピッククラスター、優先度、条項番号、却下された条項番号の概要、および選択理由
- 選択された各条項のスコア、一致した用語、上位のランキング理由、およびマッピング済み条項フラグ
unavailableと警告の件数
ライブサマリーの例:
{
"selectionDiagnostics": {
"query": "kisisel saglik verisi mahremiyet",
"sourceMode": "live",
"selectedLegislationCount": 2,
"selectedProvisionCount": 2,
"selectedLegislations": [
{
"legislationName": "Hasta Haklari Yonetmeligi",
"legislationRole": "health_primary",
"topicCluster": "patient_privacy",
"selectedArticleNumbers": ["21"]
},
{
"legislationName": "Kisisel Verilerin Korunmasi Kanunu",
"legislationRole": "supporting_general",
"topicCluster": "personal_health_data",
"selectedArticleNumbers": ["6"]
}
],
"unavailableCount": 0
}
}
診断は監査用メタデータに限られます。公式の条項引用に取って代わることも、法的命題を生成することもなく、 KVKK は補助的な一般法令の役割に保たれます。Yargıtay、Danıştay、AYM の アダプターは、モックアダプターのままです。
判断資料ソーストレース(Decision Source Trace)
DecisionSourceTrace は、各裁判所判決候補の判決パイプラインを監査します。
LegislationSourceTrace の判例側に相当します。各トレースには次の情報が含まれます。
- 元の
query sourceおよびcourt(yargitay / danistay / aym)searchRequest(モックアダプターの場合は null)searchResultsCountおよびselectedResultdocumentId/sourceIdfullTextAvailableおよびfullTextRetrievalMethodretrievedAteligibilityStatus— 判例フィルターの結果eligibilityReasons— 判決が満たす肯定的な基準exclusionReasons— 該当する場合、除外された具体的な理由- 取得に失敗した場合の
error
判決ソーストレースは監査メタデータにすぎません。法的根拠を生成することはなく、判決がすべての適格性基準を満たさない限り、パッケージに裁判所の判決を追加することもありません。
理由付き判決の適格性
assessDecisionEligibility(src/health/decisionEligibility.ts 内)は判例フィルターのルールを適用し、ステータス、肯定的な適格性の理由、除外理由を含む構造化された EligibilityResult を返します。
次のいずれかに該当する場合、判決は確認済み判例のセクションから除外されます。
fullTextAvailable: false— 判決全文を利用できない(→metadata_only)legalReasoningが空または不完全(→no_reasoning)- 判決文に手続き上の表記のみが含まれている:
salt onama、salt bozma、usul karar(→procedural_only) - 法的根拠が、実体的な内容を伴わない
onamaまたはbozmaのみ(→procedural_only) - 判決と医療法上の事案を結び付ける
relevanceNoteがない(→limited_value)
パッケージの verifiedHighCourtPrecedents セクションに含まれるのは、precedent_usable の判決のみです。
limited_value、procedural_only、no_reasoning、metadata_only の判決は除外されます。
判例診断(Precedent Diagnostics)
PrecedentSelectionDiagnostics は、判決の選択に関する簡潔な監査ビューで、法令側の LegislationSelectionDiagnostics に相当します。各 prepare_doctor_legal_information_pack の応答、および filter_reasoned_precedents ツールの応答に precedentDiagnostics として表示されます。
診断情報には次のものが含まれます。
query— 元の質問selectedPrecedentCount/excludedDecisionCountselectedPrecedents[]— 裁判所、部、日付、事件番号/判決番号、ステータス、一致した医療分野、適格性の理由excludedDecisions[]— 裁判所、日付、ステータス、除外理由
診断情報は、選択と除外を要約するだけです。法的解釈を提供することはなく、パッケージに判決を追加することもありません。
ライブ Yargıtay アダプター
初のライブ裁判所判決アダプター:LiveYargitayAdapter
(src/sources/yargitay/liveYargitayAdapter.ts)。Danıştay と AYM はモックアダプターのままです。
ソースとエンドポイント: https://bedesten.adalet.gov.tr/emsal-karar/searchDocuments を
YARGITAYKARARI フィルターで対象にします。医療法の検索語を含む JSON POST 本文を送信します。
429 および 5xx エラーの場合、適応型バックオフを使用して最大 3 回再試行します。
sourceMode: "live" の判例動作:
search_health_precedentsはライブ Yargıtay アダプターを使用し、Danıştay と AYM はモックのままです。sourceMode: "live"の場合、prepare_doctor_legal_information_packはライブ法令に加えて ライブ Yargıtay 判決も検索します。- 医療法の検索語は、分類済みの質問から対応付けられます:
riza/rıza/onam→"aydınlatılmış rıza"、tibbi/müdahale→"tıbbi müdahale"など。 verifiedHighCourtPrecedentsに追加されるのはprecedent_usable判決のみです。それ以外の判決は すべて、除外理由とともにprecedentDiagnostics.excludedDecisionsに記録されます。
DecisionSourceTrace のライブ例:
{
"query": "aydınlatılmış rıza",
"source": "yargitay",
"court": "yargitay",
"searchRequest": {
"url": "https://bedesten.adalet.gov.tr/emsal-karar/searchDocuments",
"phrase": "aydınlatılmış rıza",
"pageSize": 5
},
"searchResultsCount": 12,
"selectedResult": { "documentId": "yargitay:99001" },
"selectedResultReason": "Health law term 'aydınlatılmış rıza' matched Yargıtay emsal search.",
"fullTextAvailable": true,
"fullTextRetrievalMethod": "html-text",
"retrievedAt": "2026-05-22T10:00:00.000Z",
"eligibilityStatus": "precedent_usable",
"eligibilityReasons": [
"Tam karar metni mevcut.",
"Hukuki gerekçe alanı dolu.",
"Sağlık hukuku olayıyla bağlantı kurulmuş.",
"Emsal olarak kullanılabilir."
],
"exclusionReasons": []
}
ライブソースのエラー時の動作: bedesten.adalet.gov.tr にアクセスできない場合、または解析できない
応答が返された場合、アダプターは構造化された unavailable 結果を返します:
{
"status": "unavailable",
"source": "yargitay.gov.tr",
"errorCode": "source_error",
"message": "Yargıtay request failed: fetch failed",
"retryable": true,
"recommendedNextStep": "Retry after checking network access to bedesten.adalet.gov.tr.",
"sourceTrace": [{ "query": "aydınlatılmış rıza", "searchRequest": { ... } }]
}
判決が捏造されることはありません。パックはモックの Danıştay および AYM の結果を使って処理を続行し、
Yargıtay ソースについては precedentDiagnostics に選択された判例が 0 件と表示されます。
Danıştay および AYM のアダプターはモックアダプターのままです。
複数ソースのライブ判例パイプライン
ライブ Danıştay アダプター、医療法クエリの一元的な拡張モジュール、ソースごとの
診断情報(sourceSummaries)、およびファイルベースの結果キャッシュ。
ライブ Danıştay アダプター
LiveDanistayAdapter(src/sources/danistay/liveDanistayAdapter.ts)は、
https://karararama.danistay.gov.tr/aramalist を対象にします。Yargıtay アダプターと同じ
再試行、HTML の全文抽出、および適合性評価のパターンに従います。court は
"danistay" に設定され、ドキュメント ID の先頭には danistay: が付きます。
このアダプターは独自の用語マップを保持する代わりに、一元化されたクエリ拡張モジュールから
pickHealthLawQuery を使用します。
precedentSources パラメーター
prepare_doctor_legal_information_pack と search_health_precedents は、ライブモードで
クエリ対象の裁判所を選択するため、オプションの precedentSources 配列を受け付けるようになりました:
{
"question": "aydınlatılmış rıza",
"sourceMode": "live",
"precedentSources": ["yargitay", "danistay"]
}
有効な値は "yargitay"、"danistay"、"aym" です。指定しない場合は、3 つすべてがデフォルトで選択されます。
AYM はモックアダプターのままです。
あるソースにアクセスできない場合でも、ほかのソースは処理を続行します。パックが単一のアダプターのエラーで 停止することはありません。
assessmentTone パラメーター(v0.44.0)
prepare_doctor_legal_information_pack は、オプションの assessmentTone パラメーターも受け付けます:
{
"question": "hasta hakları nelerdir",
"sourceMode": "mock",
"assessmentTone": "grounded-advisory"
}
| 値 | 動作 |
|---|---|
"grounded-advisory"(デフォルト) | パックには、ソースに基づく条件付きの文を含む preliminaryAssessment が含まれます。各文には sourceRef が付与されます。 |
"strict" | 従来の動作:ソース一覧のみを返します。評価文は生成されません。 |
preliminaryAssessment フィールドには、summary(概要)と sentences[](個別の評価項目)が含まれます。各文には
text、sourceRef、sourceLabel が含まれます。文には、判例の実際の結論・理由と法令からの逐語的な引用が使われます。
定型文は使用されません。安定性の保証については、COMPATIBILITY.md を参照してください。
医療法クエリの拡張
src/health/healthLawQueryExpansion.ts は、Yargıtay と Danıştay の両アダプターで
共有される決定論的な用語マッピングを提供します。
riza/onam/aydinlat→"aydınlatılmış rıza"komplikasyon→"komplikasyon tıbbi müdahale"malpraktis→"malpraktis hekim kusur"hekim→"hekimin özen yükümlülüğü"hasta→"hasta hakları"veri/mahrem→"sağlık verisi mahremiyet"kusur→"hizmet kusuru tıbbi müdahale"acil→"acil müdahale hekim yükümlülüğü"
pickHealthLawQuery は、分類済みの質問に対して、最も優先度の高いマッピング済み用語を
返します。pickHealthLawQueries は、複数用語での検索向けに、重複のない用語を最大 N 個返します。
precedentDiagnostics の sourceSummaries
PrecedentSelectionDiagnostics に、ソースごとの内訳を含む sourceSummaries[] が追加されました。
{
"precedentDiagnostics": {
"query": "aydınlatılmış rıza",
"selectedPrecedentCount": 1,
"excludedDecisionCount": 2,
"sourceSummaries": [
{
"source": "yargitay",
"mode": "live",
"searched": true,
"searchResultsCount": 5,
"candidateCount": 2,
"selectedCount": 1,
"excludedCount": 1,
"unavailableCount": 0,
"errorCodes": []
},
{
"source": "danistay",
"mode": "live",
"searched": false,
"searchResultsCount": null,
"candidateCount": 0,
"selectedCount": 0,
"excludedCount": 0,
"unavailableCount": 1,
"errorCodes": ["source_error"]
}
]
}
}
selectedPrecedents[] と excludedDecisions[] の各エントリーに、各判決を生成したアダプターを
示す source フィールド(court と同じ値)も追加されました。
ファイルベースのキャッシュ
PrecedentCache(src/sources/precedentCache.ts)は、ライブアダプターの結果を 1 時間の TTL で、
キャッシュディレクトリ内の precedents/(既定値は ~/.cache/doktor-mcp/precedents/)にキャッシュします。キャッシュファイルはソース、クエリ、ページサイズを基準にキーが設定されます。キャッシュの書き込みエラーは致命的ではありません。
smoke:precedents は 3 つのキャッシュフラグをサポートします。
# Önbelleği kullan (varsayılan)
npm run smoke:precedents -- "aydınlatılmış rıza"
# Önbellek okuma ve yazmalarını atla
npm run smoke:precedents -- "aydınlatılmış rıza" --no-cache
# Taze getirmeyi zorla ve önbellek girdisinin üzerine yaz
npm run smoke:precedents -- "aydınlatılmış rıza" --refresh
キャッシュはリポジトリの外に保存されます。以前のバージョンで使用されていた .cache/ は、引き続き .gitignore に含まれます。
判例ソースのキャリブレーション
詳細なプローブ分析と正規化処理の強化。キャリブレーションの全ワークフローについては
docs/LIVE_SOURCE_CALIBRATION.md を参照してください。
確認済みのエンドポイント動作(2026-05-22)
| ソース | 状態 | エンドポイント |
|---|---|---|
| Yargitay | reachable_json | bedesten.adalet.gov.tr/emsal-karar/searchDocuments - Bedesten プロキシを介したアクティブな統合。 |
| Danistay | reachable_json | karararama.danistay.gov.tr/aramalist - アクティブな統合。 |
| Bedesten | reachable_json | bedesten.adalet.gov.tr/emsal-karar/searchDocuments - アクティブな統合。 |
| AYM | synthetic_only | ライブエンドポイントはありません。モックアダプターのみです。 |
プローブ CLI
# HTML/SOAP analizi ve fixture kaydıyla derin probe
npm run probe:precedents -- "aydınlatılmış rıza" -- --source yargitay --save-fixture
npm run probe:precedents -- "hizmet kusuru tıbbi müdahale" -- --source danistay --save-fixture
プローブの出力には、HTTP ステータス、content-type、HTML/SOAP 分析(タイトル、フォームの
アクション、エンドポイントの手がかり、本文の長さ、CAPTCHA/ログインの検出)、
calibrationStatus、recommendedNextStep が含まれます。
JSON 以外の応答の分類
ライブアダプターが JSON 以外の応答を受け取ると、DecisionSourceTrace.error に次の内容が含まれます。
| コード | 意味 |
|---|---|
non_json_response:html_shell_response | HTTP 200 + 小さな HTML SPA シェル |
non_json_response:unexpected_html_response | ログイン画面/大きな HTML |
non_json_response:xml_soap_response | SOAP/XML サービス応答 |
non_json_response:captcha_or_block | CAPTCHA を検出 |
non_json_response:empty_response | 空の本文 |
生のフィクスチャに関するポリシー
fixtures/raw/は gitignore 対象です。生の応答本文をコミットしないでください。fixtures/live-samples/にはサニタイズ済み/合成フィクスチャが保存されます。安全にコミットできます。- サニタイズ済みフィクスチャの形式については、
fixtures/live-samples/README.mdを参照してください。
Pack audit の拡張チェック
audit:pack に、次のチェックが追加されました。
sourceSummaries内の到達不能なソース → エラーコード付きの警告- 確認済みの判例で
decisionSourceTrace.fullTextAvailable === false→ エラー - 確認済みの判例で
decisionSourceTrace.eligibilityStatus !== "precedent_usable"→ エラー
チェックの完全なリファレンスについては、docs/PACK_AUDIT.md を参照してください。
本番環境へのセットアップ
npm でのインストール
Node.js 20 以上が必要です。パッケージをインストールせずに npx で実行できます。Claude Code に
追加するには、次のようにします。
claude mcp add doktor -- npx -y doktor-mcp
キャッシュファイルはユーザーのキャッシュディレクトリに書き込まれます。DOKTOR_MCP_CACHE_DIR が指定されている場合はそのディレクトリに、指定されていない場合は $XDG_CACHE_HOME/doktor-mcp または ~/.cache/doktor-mcp に保存されます。
ソースモード
sourceMode のデフォルトは "live" です(0.59.0 以降)。ツール呼び出しで sourceMode
が指定されない場合、クエリはライブの公式ソースに送信されます。Fixture(架空)データで試すには、
呼び出し時に sourceMode: "mock" を指定するか、DOKTOR_MCP_DEFAULT_SOURCE_MODE=mock 環境
変数を設定してください。この場合、応答に mockDataWarning フィールドが追加されます。
例:Claude Desktop の設定
{
"mcpServers": {
"doktor-mcp": {
"command": "npx",
"args": ["-y", "doktor-mcp"]
}
}
}
有効な値
| 値 | 意味 |
|---|---|
"mock" | Fixture(架空)データを返します。実際の法令または判例ではありません。 |
"live" | デフォルトです。ライブの公式ソース(mevzuat.gov.tr、Yargıtay、Danıştay)にクエリを送信します。 |
"snapshot" | 事前に保存されたライブソースのスナップショットを使用します。 |
無効な値(DOKTOR_MCP_DEFAULT_SOURCE_MODE=production など)が設定されている場合、
stderr に警告が出力され、デフォルトの "live" が使用されます。
注:
DOKTOR_MCP_DEFAULT_SOURCE_MODEは、より見つけやすいDOKTOR_MCP_SOURCE_MODEに相当する変数です。どちらもsourceModeを設定しますが、 両方が設定されている場合はDOKTOR_MCP_DEFAULT_SOURCE_MODEが優先されます。
開発
npm install
npm test
npm run build
npm run smoke -- "Aydinlatilmis riza kaydi eksikse hangi resmi kaynaklar eslesir?"
npm run smoke:legislation -- "kisisel saglik verisi mahremiyet"
npm run smoke:legislation -- "aydınlatılmış rıza"
# Hem Yargıtay hem Danıştay smoke (varsayılan)
npm run smoke:precedents -- "aydınlatılmış rıza"
# Belirli kaynaklar
npm run smoke:precedents -- "hizmet kusuru" --precedentSources yargitay,danistay
# Önbellek kontrolü
npm run smoke:precedents -- "aydınlatılmış rıza" --no-cache
npm run smoke:precedents -- "aydınlatılmış rıza" --refresh
npm run smoke:mcp -- "kişisel sağlık verisi mahremiyet" -- --sourceMode live
npm run smoke:mcp -- "hasta haklari tibbi mudahale" -- --sourceMode live
npm run smoke:mcp -- "riza belgesi" -- --sourceMode mock
npm run dev:mcp
smoke:precedents は、ライブの Yargıtay および Danıştay アダプターに並行してクエリを送信し、結果を
キャッシュして、各候補判決の sourceTraces と eligibilityStatus を含む、
ソースごとの results を JSON で出力します。ソースにアクセスできない場合、そのソースの構造化された
unavailable 結果が、もう一方のソースの出力とともに出力されます。JSON の解析可能性は
常に維持されます。
smoke:mcp は、完全な prepare_doctor_legal_information_pack ハンドラーを呼び出します。
sourceMode: "live" では、ライブの法令とライブの Yargıtay および Danıştay アダプターの両方を
使用します。オプションの precedentSources パラメーターで、使用するアダプターを選択できます。
AYM は mock 専用であり、ライブモードでは無効です。
npm run build の後、コンパイル済みの stdio MCP サーバーを次のコマンドで起動します。
npm run mcp
医師向け質問ベンチマークパッケージ
医師を中心とする典型的な法律上の質問に焦点を当て、ライブソース評価メトリクスを含む 包括的な品質評価および回帰テスト用のベンチマークパッケージです。
目的
- 品質測定:15 の個別の医療・法律カテゴリにおける 15~20 件の対象質問について、性能、法令のマッピング、判例数、スキーマ準拠を体系的に評価します。
- 回帰防止:次のような厳格な安全制約を強制します。プライバシー以外のパッケージに
Kisisel Verilerin Korunmasi Kanunu (KVKK)が含まれないこと、回答拒否時には医師中心の職業倫理規則が一般的な患者の権利に優先すること、ライブモードで mock 判例へのフォールバックがないこと。
実行方法
テストを実行し、レポートを出力するには、ベンチマーク実行スクリプトを使用します。
# Tam benchmark'ı mock modda çalıştır (varsayılan)
npm run benchmark:doctor-questions
# Canlı modda çalıştır (canlı mevzuat ve emsalleri sorgular, canlı-kaynak metriklerini raporlar)
npm run benchmark:doctor-questions -- --sourceMode live
# Eşdeğer canlı kısayol
npm run benchmark:doctor-questions:live
# Çalıştırmayı ilk N soruyla sınırla
npm run benchmark:doctor-questions -- --limit 5
# Özel bir rapor dizini belirt (varsayılan exports/doctor-benchmark)
npm run benchmark:doctor-questions -- --out exports/my-custom-report
警告
--sourceMode liveでベンチマークを実行すると、大統領府法令サービス(mevzuat.gov.tr)および高等裁判所サービス(bedesten.adalet.gov.tr、karararama.danistay.gov.tr)に実際の HTTP リクエストが送信されます。これらのサーバーによるレート制限(HTTP 429)や IP 制限を避けるため、安定したインターネット接続を確保し、リクエスト量を適切に抑えてください。
Mock とライブのベンチマーク
Mock モードは、決定論的な回帰防止手段です。期待される法令、優先順位、監査、または 安全性の不変条件に回帰が生じると、コマンドを失敗させることができます。
ライブモードは評価の実行です。同じ安全性の不変条件を維持しつつ、ソースの停止、空の結果、
レート制限、sourceUnavailable エントリーは、自動的な失敗ではなく、メトリクスおよび警告として
報告されます。安全でない判例の使用、禁止された MVP フィールド、ライブモードでの mock への
フォールバック、監査エラーは、引き続き重大な回帰失敗として扱われます。
ベンチマークレポートとエクスポート
実行すると、exports/doctor-benchmark/(gitignore対象)に解析可能なJSONおよびMarkdownレポートが生成されます。
- モックモード:
doctor-benchmark-report.jsondoctor-benchmark-report.md
- ライブモード:
live-benchmark-report.jsonlive-benchmark-report.md
レポートには、startedAt、completedAt、durationMs、passedRegressionCount、
failedRegressionCount、liveSourceUnavailableCount、監査件数、法令・判例のカバレッジ件数、
質問ごとのスコアが含まれます。
レポートには、選択された各検証済み判例について、ライブベンチマークの品質監査フィールドが含まれます: 裁判所、部、判決日、事件番号/判決番号、アクセス元、ドキュメントID/ソースID、 該当する場合はソースURL、全文へのアクセス可否、理由の検出、適格性の状態/理由、 医療法関連性スコア、一致した用語、判決ソースの追跡情報の有無。レポートに判決の全文は出力されません。
ライブモードでのモックへのフォールバックは重大なリグレッションとなります。AYMは無効/モックのみの状態に保たれ、
検証済みのライブ判例を通知なしに提供することはありません。sourceUnavailable、ライブ検索結果が空の場合、
一時的な上流ソースのエラーは、信頼できない判例やスキーマ/監査違反につながらない限り、
品質指標および警告として扱われます。
スコアリング
各質問は次のスコアを獲得します:
legislationMatchScore0~2priorityScore0~2precedentSafetyScore0~2sourceAvailabilityScore0~2auditScore0~2forbiddenFieldsScore0または2totalScore、maxScore、scorePercent、qualityBand
qualityBand:good、acceptable、needs_tuning、unsafeのいずれかです。ライブソースにアクセスできないと品質が低下することがありますが、項目をunsafeにするのは安全性違反または監査エラーのみです。
検証済み判例のスコアリングは意図的に厳格です。選択された検証済み判例はprecedent_usableであり、検証済みの全文と検出済みの法的理由を含み、判決ソースの追跡情報を保持している必要があります。メタデータのみ、手続きのみ、理由なし、全文なし、またはモックアクセスの記録は、ライブモードで検証済み判例として評価されません。医療法との関連性が弱い場合は、判例の安全性スコアが制限されます。また、高い総合スコアの陰に隠すのではなく、調整が必要であることを示す警告として報告されます。
ベンチマークには、この監査レイヤーに加えて、判例関連性の調整機能が含まれます。質問とソースごとに、関連性の弱さ、判例IDの例、一致したトピック用語、不足している想定トピック用語、whyWeakの説明、推奨される追加検索用語を報告します。また、goodCleanCountとgoodWithWarningsCountを区別し、医療法関連性スコアの平均値/中央値を報告します。
関連性が弱いとは、判決が判例の厳格な安全性ゲートを通過しているものの、判決文が広義の医療関連用語にしか一致しない、または質問のトピックプロファイルとの適合性が十分でないことを意味します。トピックプロファイルには、インフォームド・コンセント、医療過誤/合併症、救急医療、治療拒否、プライバシー/記録、精神科医療におけるプライバシー、暴力/脅迫、紹介、私立病院の料金に関する紛争、公務員の懲戒、集中治療、妊娠時の緊急事態が含まれます。ライブソースにアクセスできない場合は指標/警告として扱われ、unsafeは、モックへのフォールバック、全文/理由/追跡情報の欠如、利用不能な判例が検証済み出力に混入することなど、安全性違反がある場合に限られます。
パフォーマンスベンチマークコマンド
npm run benchmark:doctor-questions:performance
# veya limitle:
npm run benchmark:doctor-questions:performance -- --limit 5
ベンチマークでは、15 件の医療従事者向け質問すべてを 2 回実行します。コールド実行ではライブネットワークにアクセスし、ローカルファイルキャッシュ(.cache/precedents-perf/)にデータを保存します。ウォーム実行では、同じクエリを直後にキャッシュから再生します。レポートには以下が表示されます。
- コールド実行とウォーム実行の合計時間および改善率(%)
- ソースごとのコールド/ウォーム平均時間(ms)、p95、キャッシュヒット数、ネットワークリクエスト数
- キャッシュの有効性:ヒット率(%)、キャッシュから提供された件数、平均キャッシュ経過時間
- 再試行/バックオフの概要:再試行の合計回数、バックオフ時間、レート制限イベント数、タイムアウト数
- 最も遅いクエリ試行 10 件(コールド+ウォームを合算)
- パフォーマンス警告(実行はブロックしません。ハードエラーは引き続きテスト/ビルド/監査の失敗として扱われます)
p50/p95/p99 の解釈
| 値 | 意味 |
|---|---|
| p50 | クエリ時間の中央値 — クエリの半数がこの時間以内に完了します |
| p95 | 95 パーセンタイル — テールレイテンシです。ほとんどのクエリはこれより高速です |
| p99 | 99 パーセンタイル — 外れ値のレイテンシです。まれに遅いクエリが発生します |
コールド p95 > 60s は、遅いソースがあることを示します(通常は Yargıtay/Bedesten PDF の取得です)。 ウォーム p95 > 10s は、最も遅いクエリに対してキャッシュが効果を発揮していないことを示します(TTL の 期限切れ、またはアダプター内での全文取得時のキャッシュミスが原因として考えられます)。
キャッシュの統合
キャッシュは、通常のライブベンチマークとスモーク CLI の実行ではデフォルトで無効になっています。パフォーマンスベンチマークでは、共有の PrecedentCache(TTL 2s、ディレクトリ
.cache/precedents-perf/)を注入します。キャッシュは、(source, query, pageSize)のキー
ごとに searchAndNormalize の結果全体を保存します。ウォーム実行の再生は完全です — キャッシュされたクエリに対するネットワーク呼び出しは発生しません。
.cache/ は gitignore に含まれています。キャッシュエントリーはコミットされません。
バージョン履歴については、CHANGELOG.md を参照してください。
ライセンス
GNU Affero General Public License バージョン 3(AGPL-3.0-only)の下でライセンスされています。全文は
LICENSE ファイルに記載されています。ソフトウェアを変更し、ネットワーク経由で他者にサービスとして
提供する場合は、変更したソースコードも同じライセンスでそのユーザーに提供する必要があります。セキュリティ脆弱性の報告方法については、SECURITY.md
ファイルで説明しています。
著作権 © 2026 Alpaslan Fatih Sözer
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。