Doktor

io.github.afsozerv0.59.1更新於 Oct 7, 2026

Turkish health law for physicians: official legislation and high court decisions, source-grounded.

概覽

AI 產生的概覽

為醫師提供有來源依據的土耳其衛生法資訊,將問題對應到官方法規與附理由的高等法院判決。

功能
Doktor MCP 是一個本機 TypeScript/Node.js 伺服器,可將醫師的衛生法問題分類,對應到土耳其衛生法主題叢集,並從 mevzuat.gov.tr 取得官方法規文本,從 Yargıtay 與 Danıştay 取得判例。工具包括 classify_medical_legal_question、search_health_legislation、get_legislation_provisions、search_health_precedents、filter_reasoned_precedents、prepare_doctor_legal_information_pack、drill_down_pack_item 與 get_decision_full_text。回應帶有 dataOrigin 欄位(mock、live、snapshot、computed、client-provided),使用範例資料時會附加 mockDataWarning。它刻意不提供確定性法律結論、風險評分、緊急行動指示或訴狀撰寫。
適用情境
當醫師或助理需要附引註地查詢土耳其衛生法條文與附理由的法院判例時適用,例如知情同意、病人權利、醫療介入、健康資料隱私或職業倫理。它著重於有來源依據的資訊包,而非最終法律意見。
執行需求
透過 stdio 在本機執行,通常使用 npx doktor-mcp,因此需要 Node.js。未宣告驗證、環境變數或標頭。live 模式需要存取 mevzuat.gov.tr、bedesten.adalet.gov.tr 與 karararama.danistay.gov.tr 的網路。僅限桌面端,無網頁可執行版本。
安裝前請注意
live 模式會把問題文字傳送到土耳其公共來源(mevzuat.gov.tr、bedesten.adalet.gov.tr、karararama.danistay.gov.tr)。mock 模式傳回的範例資料並非真實法規或判例,請檢查 dataOrigin 與 mockDataWarning。此伺服器聲明不提供確定性法律結論;輸出僅供參考,應由律師複核。AYM 仍僅為 mock。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Doktor,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Doktor MCP

Beta sürüm — Güncel sürüm için package.json ve CHANGELOG.md dosyalarına bakın.

Proje sayfası: avfatihsozer.com/projeler/doktor-mcp · English: README.en.md

doktor-mcp, hekimlere yönelik kaynak-temelli hukuki bilgilendirme paketleri üreten, bağımsız bir TypeScript/Node.js MCP iskeletidir. Kategorik nihai hukuki görüş vermez ve hekime ne yapacağını söylemez. Soruları resmî mevzuat metniyle ve gerekçeli yüksek mahkeme karar metniyle eşleştirir; kesin hüküm vermeden, kaynağa dayalı koşullu değerlendirmeler (ör. "kaynaklar bu yönde eğilim göstermektedir") sunabilir.

Adaptör sınırları şunlar için hazırlanmıştır:

  • legislation (mevzuat)
  • yargitay
  • danistay
  • aym

Genel internet makaleleri, bloglar, haberler, hukuk bürosu tanıtım sayfaları ve forumlar bu projenin kaynak girdileri değildir.

Kaynak Motoru Aktarımı (Source Engine Port)

Kaynak-motoru katmanı, canlı adaptörlerin ihtiyaç duyduğu sağlamlaştırmayı sağlar:

  • Bedesten istekleri; sınırlı yeniden deneme, Retry-After işleme, üstel geri-çekilme (backoff), titreşim (jitter) ve istek telemetrisi içeren paylaşılan bir HttpClient ve RateLimiter yolu kullanır.
  • Canlı kaynak hataları yapılandırılmış ve yalnızca-JSON kalır. Kaynak tanılaması; CLI JSON çıktısına log yazmadan yeniden deneme sayısı, backoff süresi, durum ve içerik tipini taşıyabilir.
  • src/sources/sourceRegistry.ts, mevzuat ve emsal kaynakları için sadeleştirilmiş kaynak yeteneği, hız limiti ve önbellek politikası meta verisini sunar.
  • Bedesten/Yargıtay adaptörleri yalnızca-meta veri içeren kararları doğrulanmış emsal çıktısından uzak tutar; resmî mevzuat ise resmî arama, doküman getirme veya madde çıkarımı bir alıntıyı destekleyemediğinde yapılandırılmış unavailable sonuç döndürür.

Canlı Mevzuat Durumu

Canlı resmî mevzuat adaptörü, opsiyonel MCP araç akışlarına bağlanmıştır:

  • adaptör: LiveOfficialLegislationAdapter
  • resmî kaynak: T.C. Cumhurbaşkanlığı Mevzuat Bilgi Sistemi — mevzuat.gov.tr
  • arama yeteneği: resmî MevzuatDatatable arama isteği ayrıştırıcısı
  • tam-metin yeteneği: resmî MevzuatMetin doküman getirme
  • mevcut çıkarım kanıtı: eşlenmiş mevzuat için PDF metin çıkarımı ve madde ayrıştırma

Sağlık mevzuatı ilk canlı eşleme yoludur. Hasta hakları ve aydınlatılmış onam soruları, Hasta Hakları Yönetmeliği 4847 için resmî üretilmiş PDF yolunu kullanır (eşlenmiş madde 24 ve 26 dahil). Sağlık hukuku eşlemeleri ayrıca Tıbbi Deontoloji Nizamnamesi, Tababet ve Şuabatı San'atlarının Tarzı İcrasına Dair Kanun ve Sağlık Hizmetleri Temel Kanunu'nu da kapsar. KVKK madde 6, kişisel-sağlık-verisi ve mahremiyet soruları için, sağlığa özel kaynaklardan sonra destekleyici genel mevzuat olarak kullanılabilir.

Resmî bir doküman çıkarılabilir bir formatta gelmediğinde veya eşlenmiş bir madde çıkarılamadığında, canlı adaptör bir hüküm üretmek yerine yapılandırılmış unavailable çıktısı döndürür.

Canlı kaynak hataları şu sözleşmeyi kullanır:

json
{  "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 Kapsamı

İskelet şunları içerir:

  • MCP sunucu kaydı ve araç işleyici iskelesi
  • resmî mevzuat delili, mahkeme kararı delili, sınıflandırma, emsal durumu ve hukuki bilgilendirme paketi için tip sözleşmeleri
  • mock mevzuat ve yüksek mahkeme adaptörleri
  • resmî kaynak doğrulaması için canlı resmî mevzuat adaptörü
  • canlı mevzuat için MCP sourceMode yönlendirmesi
  • sağlık-öncelikli mevzuat eşlemeleri ve kaynak izleme (source trace) meta verisi
  • sağlık hukuku boru hattı parçaları:
    • soru sınıflandırıcı
    • mevzuat eşleyici
    • emsal filtresi
    • cevap derleyici
  • yerel JSON smoke komutu
  • ilk kaynak-güvenliği kuralları için Vitest kapsamı

Emsal filtresi şu an şu durumları sunar:

  • precedent_usable: tam metin, hukuki gerekçe ve olay ilgililiği mevcut
  • limited_value: tam metin var ama ilgililik zayıf
  • procedural_only: esasa ilişkin gerekçe yok; usuli metin, salt onama veya salt bozma
  • metadata_only: tam metin olmadan künye meta verisi
  • no_reasoning: tam metin var ama hukuki gerekçe yok

Derlenen pakette doğrulanmış emsal bölümüne yalnızca precedent_usable kayıtları girer.

Yanıt Sözleşmesi (Response Contract)

Tüm araç yanıtları dataOrigin alanı taşır. Bu alan, yanıtın kaynağını belirtir:

dataOriginAnlamı
"mock"Yanıt fixture (kurgu) verisi içerir. Gerçek mevzuat veya karar değildir.
"live"Yanıt canlı kaynaklardan (mevzuat.gov.tr, Bedesten, Danıştay) gelmiştir.
"snapshot"Yanıt önceden kaydedilmiş canlı kaynak snapshot'ıdır.
"computed"Yanıt yalnızca hesaplama sonucudur (sınflandırıcı gibi). Kaynak veri içermez.
"client-provided"Yanıt, istemci tarafından sağlanan girdiye dayanır.

dataOrigin: "mock" olduğunda, yanıt ayrıca mockDataWarning alanı taşır:

json
{  "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."}

Bu uyarı, mock verinin gerçek mevzuat alıntısı gibi görünmesini önlemek için kaçırılamaz şekilde eklenmiştir. shortAnswer gibi hekime-dönük metin alanlarına ek önek eklenmez; üst-seviye dataOrigin ve mockDataWarning alanları yeterlidir.

prepare_doctor_legal_information_pack yanıtı ayrıca bir packId alanı taşır. Bu, "pack-" önekiyle başlayan 6 haneli bir hex kimliktir (ör. "pack-3f9a2c"). drill_down_pack_item aracına packId ileterek paketi yeniden oluşturmadan belirli bir madde veya kararı detaylandırabilirsiniz. packId, sunucu belleğinde 30 dakika süreyle saklanır.

Yapılandırılmış paket, istenen hekime-dönük bölümler etrafında şekillenir:

  1. shortAnswer
  2. legalClassification
    • criminal
    • civilCompensation
    • disciplinaryAdministrative
    • patientRights
    • privacyKvkk
    • professionalEthics
  3. relevantLegislation
    • mevzuat adı
    • madde numarası
    • kaynak hükümden birebir kopyalanmış alıntı
    • olay bağlantısı
  4. verifiedHighCourtPrecedents
    • mahkeme/daire, tarih, esas/karar numaraları
    • olay özeti, hukuki değerlendirme, sonuç
    • benzerlik/farklılık notu
  5. missingInformation
  6. lawyerReviewPoints

Her mevzuat girdisi bir kaynak doküman id'si ve birebir kaynak alıntısı taşır. Her doğrulanmış emsal girdisi, gerekçeli-emsal filtresinden geçmek zorundadır.

Bilinçli Olarak Kapsam Dışı

MVP şunları içermez:

  • canlı AYM yüksek mahkeme istemcisi (AYM kararlar bilgi bankası HTML-only arayüzdür; JSON API yoktur — synthetic_only işaretlidir)
  • kaynak referansı veya koşullu dil olmaksızın kategorik risk seviyesi puanlaması ("risk seviyesi yüksek/düşük")
  • acil eylem talimatları
  • dilekçe veya savunma yazımı
  • nihai hukuki sonuçlar
  • "sorumluluk vardır" veya "sorumluluk yoktur" gibi kategorik ifadeler
  • Araç, kaynağa dayalı koşullu değerlendirmeler (ör. "kaynaklar şu yönde eğilim gösteriyor") sunabilir; ama asla kategorik nihai hüküm vermez
  • MCP kaynak kayıtlarıyla doğrulanmamış, yalnızca-modele dayalı hukuki önermeler

v0.44.0'da Yeni

  • assessmentTone: Opsiyonel parametre ("strict" | "grounded-advisory", varsayılan: "grounded-advisory"). strict modda yalnızca kaynak listeleri döner (değerlendirme yok). grounded-advisory modda, kaynağa dayalı koşullu değerlendirme içeren bir preliminaryAssessment eklenir.
  • preliminaryAssessment: summary ve sentences[] içeren opsiyonel yanıt alanı. Her cümlede text, sourceRef ve sourceLabel bulunur. Cümleler emsallerden gerçek sonuç/gerekçeyi ve mevzuattan birebir alıntı parçalarını kullanır — asla kalıp (boilerplate) değil.
  • Mevzuat yürürlük meta verisi: Hükümler inForce, lastAmendedDate ve repealed alanları taşır (varsayılan olarak asla "yürürlükte" varsaymaz).
  • Karar deduplikasyonu: Çapraz-kaynak tekrarları (ör. aynı kararın Yargıtay ve Bedesten'den gelmesi) deduplike edilir; en zengin sürüm tutulur.
  • Tam Türkçe diakritik politikası: Tüm hekime-dönük metinler doğru Türkçe karakterleri kullanır (ASCII ikamesi yok).
  • Tam sürüm geçmişi için CHANGELOG.md. Kararlılık katmanları için COMPATIBILITY.md.

Hız limiti canlı istemciler için ayrılmıştır: amaçlanan davranış, gerçek bir blok veya kaynak hatasından sonra adaptif backoff ile pratik kamu-kaynağı trafiğidir; baskı kanıtı olmadan agresif bir kısıtlama değildir.

MCP Araçları

  • classify_medical_legal_question
  • search_health_legislation
  • get_legislation_provisions
  • search_health_precedents
  • filter_reasoned_precedents
  • prepare_doctor_legal_information_pack
  • drill_down_pack_item — Takip sorusu: packId ile paketi yeniden oluşturmadan belirli bir madde/kararı detaylandırır. Örnek: { "packId": "pack-3f9a2c", "followUpQuestion": "madde 24 ne diyor?" }
  • get_decision_full_text — Belirli bir mahkeme kararının tam metnini getirir. Örnek: { "documentId": "yargitay:99001", "sourceMode": "live" }

Yanıt Sözleşmesi Notları

Tüm araç yanıtları dataOrigin alanı taşır ("mock", "live", "snapshot", "computed", "client-provided"). Mock modda mockDataWarning alanı eklenir.

prepare_doctor_legal_information_pack çağrısında includeDiagnostics: true parametresi eklenerek tam denetim izi (seçim tanılaması, kaynak izi vb.) alınabilir.

Mevzuata-dönük MCP girdileri opsiyonel sourceMode kabul eder:

json
{  "question": "kişisel sağlık verisi mahremiyet",  "sourceMode": "live"}

sourceMode varsayılan olarak "live"'dır (0.59.0'dan beri); fixture verisi için "mock" açıkça istenmelidir. search_health_legislation, get_legislation_provisions ve prepare_doctor_legal_information_pack "live" kullanabilir. Canlı bilgilendirme paketi aynı MVP şeklini korur ve sourceUnavailable'ı yalnızca resmî mevzuat kaynağı doğrulanmış bir hüküm döndüremediğinde ekler.

Mock mod yerel fixture hükümlerini kullanır. Canlı mod, mevzuat.gov.tr'den resmî mevzuat metnini, ayrıca canlı Yargıtay ve Danıştay emsal adaptörlerini kullanır. AYM yalnızca-mock'tur ve canlı modda bir geri-dönüş (fallback) olarak kullanılmak yerine devre dışı bırakılır.

Sağlık Mevzuatı Önceliği

Canlı eşleme katmanı hekim sorularını sağlık-hukuku konu kümelerine ayırır:

  • aydınlatılmış onam / onam
  • tıbbi müdahale
  • hasta hakları
  • hasta mahremiyeti
  • kişisel sağlık verisi
  • kayıt, dosya ve epikriz
  • acil müdahale
  • sevk ve konsültasyon
  • hekimin özen yükümlülüğü
  • meslek etiği

Her eşleme; hedef mevzuatı, hedef madde numaralarını, arama terimlerini, bir seçim gerekçesini ve bir sağlık-hukuku önceliğini taşır. Birden çok eşleme uyduğunda, paket birincil sağlık mevzuatını destekleyici genel mevzuattan önce sıralar. Örneğin bir kişisel-sağlık-verisi mahremiyet sorusu, KVKK'dan önce Hasta Hakları Yönetmeliği'ni döndürebilir; KVKK, ilgisiz hekim soruları için geniş bir geri-dönüş olarak kullanılmaz.

Kaynak İzleme (Source Trace)

sourceTrace, hukuki gerekçe sağlamak yerine canlı mevzuat çıktısını denetler. Her iz, bir hükmün sağlık-hukuku eşlemesinden resmî dokümana ve madde çıkarım adımına nasıl geçtiğini gösterir:

  • orijinal query
  • matchedHealthMapping ve eşleme olmadığında denenen eşleme adayları
  • officialSearchRequest, resmî arama sonuç sayısı ve kompakt resmî sonuçlar
  • selectedSearchResult ve selectedResultReason
  • landing/detay URL'i ve doğrudan ya da üretilmiş PDF URL'i
  • contentType, çıkarım yöntemi, çıkarılan madde numaraları ve getirme süresi

Canlı search_health_legislation, seçilen hükümlerin yanında izi de içerir. Canlı get_legislation_provisions, dönen her hükümde iz taşır. Canlı prepare_doctor_legal_information_pack, izi hem ilgili mevzuat girdilerinde hem de pakete-düzey sourceTrace dizisinde tutar; böylece derlenen alıntı, aynı çıkarılmış hükme karşı kontrol edilebilir.

Bir unavailable canlı paket de denetim bağlamını korur:

json
{  "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 ve selectedResultReason; konu kümesini, sağlık-hukuku önceliğini ve seçilen eşlemenin birincil sağlık mevzuatı mı yoksa destekleyici genel mevzuat mı olduğunu gösterir. İz alanları yalnızca kaynak seçimini ve çıkarımı açıklar. Hukuki önerme üretmezler ve birebir resmî hüküm metninin yerini asla almazlar.

Hüküm Sıralaması (Provision Ranking)

Canlı hüküm sıralaması, resmî madde çıkarımından sonra deterministik puanlama çalıştırır. Paket için kompakt bir kaynak-madde kümesi seçer; madde metni, hukuki tavsiye veya kategorik hukuki sonuç üretmez.

Sıralama sinyalleri:

  • hekim sorgu terimleri
  • eşlenen sağlık-hukuku konu kümesi
  • eşleme arama terimleri
  • çıkarılan madde kullanılabilir bir başlıkla başladığında madde başlığı metni
  • çıkarılan madde metni içindeki anahtar kelime eşleşmeleri
  • eşlenmiş madde-listesi bonusu
  • sağlık-hukuku önceliği ve birincil/destekleyici rol sıralaması

Canlı iz; candidateArticleNumbers, rankedArticleNumbers, rejectedArticleNumbers ve rankingMethod'u gösterir. Dönen her canlı hüküm ayrıca kendi deterministik skorunu, eşleşen terimleri, sıralama gerekçelerini ve manuel eşlenmiş madde listesinden gelip gelmediğini taşır. Canlı adaptör tek bir mevzuat dokümanını küçük bir sıralanmış madde kümesiyle sınırlar — şu an en fazla üç hüküm. Çıkarılan eşlenmiş maddeler önce gelir; yüksek-sinyalli sıralanmış yedek maddeler yalnızca eşlenmiş maddeler çıkarımda yoksa değerlendirilir. İz hem seçilen hem reddedilen aday izini korur.

KVKK, kişisel-sağlık-verisi ve mahremiyet soruları için supporting_general kalır. Sıralamada veya paket sıralamasında birincil sağlık mevzuatının yerini almaz. Yargıtay, Danıştay ve AYM adaptörleri mock adaptör olarak kalır.

Seçim Tanılaması (Selection Diagnostics)

Seçim tanılaması, kaynak seçimi için kısa bir denetim görünümü sağlar: sourceTrace hâlâ resmî isteği, dokümanı, çıkarımı, adayı, sıralamayı ve unavailable detayını içerirken, tanılama tam bir iz okuması gerektirmeden neyin seçildiğini özetler.

Kompakt tanılama şunları içerir:

  • query ve sourceMode
  • seçilen mevzuat ve hüküm sayıları
  • her seçilen mevzuatın rolü, konu kümesi, önceliği, madde numaraları, reddedilen madde-numarası özeti ve seçim gerekçesi
  • her seçilen hükmün skoru, eşleşen terimleri, en iyi sıralama gerekçeleri ve eşlenmiş-madde bayrağı
  • unavailable ve uyarı sayıları

Örnek canlı özet:

json
{  "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  }}

Tanılama yalnızca denetim meta verisidir. Resmî hüküm alıntılarının yerini almaz, hukuki önerme üretmez ve KVKK'yı destekleyici-genel rolünde tutar. Yargıtay, Danıştay ve AYM adaptörleri mock adaptör olarak kalır.

Karar Kaynak İzi (Decision Source Trace)

DecisionSourceTrace, her mahkeme kararı adayı için karar boru hattını denetler. LegislationSourceTrace'in emsal-tarafı karşılığıdır. Her iz şunları taşır:

  • orijinal query
  • source ve court (yargitay / danistay / aym)
  • searchRequest (mock adaptörler için null)
  • searchResultsCount ve selectedResult
  • documentId / sourceId
  • fullTextAvailable ve fullTextRetrievalMethod
  • retrievedAt
  • eligibilityStatus — emsal filtresi sonucu
  • eligibilityReasons — kararın karşıladığı olumlu kriterler
  • exclusionReasons — varsa, dışlanmasının belirli neden(ler)i
  • getirme başarısız olduysa error

Karar kaynak izleri yalnızca denetim meta verisidir. Hukuki gerekçe üretmezler ve karar tüm uygunluk kriterlerini geçmedikçe pakete asla bir mahkeme kararı eklemezler.

Gerekçeli-Karar Uygunluğu

assessDecisionEligibility (src/health/decisionEligibility.ts içinde) emsal filtresi kurallarını uygular ve durum, olumlu uygunluk gerekçeleri ve dışlama gerekçeleriyle yapılandırılmış bir EligibilityResult döndürür.

Bir karar, aşağıdakilerden herhangi biri geçerliyse doğrulanmış-emsaller bölümünden dışlanır:

  • fullTextAvailable: false — tam karar metni mevcut değil (→ metadata_only)
  • legalReasoning boş veya eksik (→ no_reasoning)
  • Karar metni salt usuli işaret içeriyor: salt onama, salt bozma, usul karar (→ procedural_only)
  • Hukuki gerekçe, esasa ilişkin içerik olmadan yalnızca onama veya bozma (→ procedural_only)
  • Kararı sağlık-hukuku olayına bağlayan relevanceNote yok (→ limited_value)

Paketin verifiedHighCourtPrecedents bölümüne yalnızca precedent_usable kararları girer. limited_value, procedural_only, no_reasoning ve metadata_only kararları dışlanır.

Emsal Tanılaması (Precedent Diagnostics)

PrecedentSelectionDiagnostics, karar seçimi için kompakt denetim görünümüdür; mevzuat tarafındaki LegislationSelectionDiagnostics'in karşılığıdır. Her prepare_doctor_legal_information_pack yanıtında ve filter_reasoned_precedents araç yanıtında precedentDiagnostics olarak görünür.

Tanılama şunları içerir:

  • query — orijinal soru
  • selectedPrecedentCount / excludedDecisionCount
  • selectedPrecedents[] — mahkeme, daire, tarih, esas/karar numaraları, durum, eşleşen sağlık konuları ve uygunluk gerekçeleri
  • excludedDecisions[] — mahkeme, tarih, durum ve dışlama gerekçeleri

Tanılama yalnızca seçimi ve dışlamayı özetler. Hukuki yorum sağlamaz ve pakete hiçbir karar eklemez.

Canlı Yargıtay Adaptörü

İlk canlı mahkeme kararı adaptörü: LiveYargitayAdapter (src/sources/yargitay/liveYargitayAdapter.ts). Danıştay ve AYM mock adaptör olarak kalır.

Kaynak ve uç nokta: https://bedesten.adalet.gov.tr/emsal-karar/searchDocuments adresini YARGITAYKARARI filtresiyle hedefler. Sağlık hukuku arama terimini içeren JSON POST gövdesi. 429 ve 5xx hataları için adaptif backoff ile üç kez yeniden dener.

sourceMode: "live" emsal davranışı:

  • search_health_precedents canlı Yargıtay adaptörünü kullanır; Danıştay ve AYM mock kalır.
  • sourceMode: "live" ile prepare_doctor_legal_information_pack, canlı mevzuata ek olarak canlı Yargıtay kararlarını arar.
  • Sağlık hukuku arama terimleri sınıflandırılmış sorudan eşlenir: riza/rıza/onam → "aydınlatılmış rıza", tibbi/müdahale → "tıbbi müdahale", vb.
  • verifiedHighCourtPrecedents'e yalnızca precedent_usable kararları girer. Diğerlerinin hepsi dışlama gerekçeleriyle precedentDiagnostics.excludedDecisions'a kaydedilir.

DecisionSourceTrace canlı örneği:

json
{  "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": []}

Canlı kaynak hatası davranışı: bedesten.adalet.gov.tr erişilemezse veya ayrıştırılamayan bir yanıt dönerse, adaptör yapılandırılmış bir unavailable sonucu döndürür:

json
{  "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": { ... } }]}

Hiçbir karar uydurulmaz. Paket, mock Danıştay ve AYM sonuçlarıyla çalışmaya devam eder ve Yargıtay kaynağı için precedentDiagnostics'te 0 seçilmiş emsal gösterir.

Danıştay ve AYM adaptörleri mock adaptör olarak kalır.

Çok-Kaynaklı Canlı Emsal Boru Hattı

Canlı Danıştay adaptörü, merkezi sağlık hukuku sorgu genişletme modülü, kaynak-başına tanılama (sourceSummaries) ve dosya-tabanlı sonuç önbelleği.

Canlı Danıştay Adaptörü

LiveDanistayAdapter (src/sources/danistay/liveDanistayAdapter.ts) https://karararama.danistay.gov.tr/aramalist adresini hedefler. Yargıtay adaptörüyle aynı yeniden deneme, HTML tam-metin çıkarımı ve uygunluk değerlendirme desenini izler. court "danistay" olarak ayarlanır ve doküman id'leri danistay: ön ekiyle başlar.

Adaptör, kendi terim haritasını tutmak yerine merkezi sorgu genişletme modülünden pickHealthLawQuery kullanır.

precedentSources Parametresi

prepare_doctor_legal_information_pack ve search_health_precedents artık canlı modda hangi mahkemelerin sorgulanacağını seçmek için opsiyonel bir precedentSources dizisi kabul eder:

json
{  "question": "aydınlatılmış rıza",  "sourceMode": "live",  "precedentSources": ["yargitay", "danistay"]}

Geçerli değerler: "yargitay", "danistay", "aym". Belirtilmezse varsayılan üçü birden. AYM bir mock adaptör olarak kalır.

Bir kaynak erişilemez olduğunda, diğerleri devam eder. Paket asla tek bir adaptör hatasına takılıp bloke olmaz.

assessmentTone Parametresi (v0.44.0)

prepare_doctor_legal_information_pack ayrıca opsiyonel bir assessmentTone parametresi kabul eder:

json
{  "question": "hasta hakları nelerdir",  "sourceMode": "mock",  "assessmentTone": "grounded-advisory"}
DeğerDavranış
"grounded-advisory" (varsayılan)Paket, kaynağa dayalı koşullu cümleler içeren preliminaryAssessment'i içerir. Her cümle bir sourceRef taşır.
"strict"Eski davranış: yalnızca kaynak listeleri döner. Değerlendirme metni üretilmez.

preliminaryAssessment alanı summary (genel bakış) ve sentences[] (tekil değerlendirme maddeleri) içerir. Her cümlede text, sourceRef ve sourceLabel bulunur. Cümleler emsallerden gerçek sonuç/gerekçeyi ve mevzuattan birebir alıntı parçalarını kullanır — asla kalıp değil. Kararlılık garantileri için COMPATIBILITY.md.

Sağlık Hukuku Sorgu Genişletme

src/health/healthLawQueryExpansion.ts, hem Yargıtay hem Danıştay adaptörleri tarafından paylaşılan deterministik terim eşlemesi sağlar:

  • 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, sınıflandırılmış bir soru için en yüksek öncelikli eşlenmiş terimi döndürür. pickHealthLawQueries, çok-terimli aramalar için en fazla N adet farklı terim döndürür.

precedentDiagnostics içinde sourceSummaries

PrecedentSelectionDiagnostics artık kaynak-başına dökümle sourceSummaries[] içerir:

json
{  "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[] ve excludedDecisions[] girdileri artık her kararı hangi adaptörün ürettiğini belirtmek için bir source alanı (court ile aynı değer) da içerir.

Dosya-Tabanlı Önbellek

PrecedentCache (src/sources/precedentCache.ts), canlı adaptör sonuçlarını bir saatlik TTL ile önbellek dizinindeki precedents/ altına (varsayılan ~/.cache/doktor-mcp/precedents/) önbelleğe alır. Önbellek dosyaları kaynak, sorgu ve sayfa boyutuna göre anahtarlanır. Önbellek yazma hataları ölümcül değildir.

smoke:precedents üç önbellek bayrağını destekler:

powershell
# Önbelleği kullan (varsayılan)npm run smoke:precedents -- "aydınlatılmış rıza"
# Önbellek okuma ve yazmalarını atlanpm run smoke:precedents -- "aydınlatılmış rıza" --no-cache
# Taze getirmeyi zorla ve önbellek girdisinin üzerine yaznpm run smoke:precedents -- "aydınlatılmış rıza" --refresh

Önbellek depo dışında tutulur; eski sürümlerin kullandığı .cache/ .gitignore'da durmaya devam ediyor.

Emsal Kaynak Kalibrasyonu

Derin probe analizi ve normalleştirici sağlamlaştırma. Tam kalibrasyon iş akışı için docs/LIVE_SOURCE_CALIBRATION.md.

Doğrulanmış uç nokta davranışı (2026-05-22)

KaynakDurumUç nokta
Yargitayreachable_jsonbedesten.adalet.gov.tr/emsal-karar/searchDocuments - Bedesten proxy üzerinden aktif entegrasyon.
Danistayreachable_jsonkarararama.danistay.gov.tr/aramalist - aktif entegrasyon.
Bedestenreachable_jsonbedesten.adalet.gov.tr/emsal-karar/searchDocuments - aktif birleşik entegrasyon.
AYMsynthetic_onlyCanlı uç nokta yok. Yalnızca mock adaptör.

Probe CLI

powershell
# HTML/SOAP analizi ve fixture kaydıyla derin probenpm run probe:precedents -- "aydınlatılmış rıza" -- --source yargitay --save-fixturenpm run probe:precedents -- "hizmet kusuru tıbbi müdahale" -- --source danistay --save-fixture

Probe çıktısı şunları içerir: HTTP durumu, content-type, HTML/SOAP analizi (başlık, form aksiyonları, uç nokta ipuçları, gövde uzunluğu, captcha/login tespiti), calibrationStatus ve recommendedNextStep.

JSON-olmayan yanıt sınıflandırması

Bir canlı adaptör JSON-olmayan bir yanıt aldığında, DecisionSourceTrace.error şunu içerir:

KodAnlamı
non_json_response:html_shell_responseHTTP 200 + küçük HTML SPA kabuğu
non_json_response:unexpected_html_responseLogin/büyük HTML
non_json_response:xml_soap_responseSOAP/XML servis yanıtı
non_json_response:captcha_or_blockCAPTCHA tespit edildi
non_json_response:empty_responseBoş gövde

Ham fixture politikası

  • fixtures/raw/ gitignore'dadır — ham yanıt gövdelerini asla commit etme.
  • fixtures/live-samples/ sanitize edilmiş/sentetik fixture'ları tutar — commit etmek güvenli.
  • Sanitize edilmiş fixture formatı için fixtures/live-samples/README.md.

Pack audit genişletilmiş kontrolleri

audit:pack artık şunları da kontrol eder:

  • sourceSummaries'te erişilemez kaynaklar → hata kodlarıyla uyarı
  • Doğrulanmış bir emsalde decisionSourceTrace.fullTextAvailable === false → hata
  • Doğrulanmış bir emsalde decisionSourceTrace.eligibilityStatus !== "precedent_usable" → hata

Tam kontrol referansı için docs/PACK_AUDIT.md.

Üretim Kurulumu

npm ile kurulum

Node.js 20 ya da üstü gerekir. Paketi kurmadan npx ile çalıştırabilirsiniz. Claude Code'a eklemek için:

bash
claude mcp add doktor -- npx -y doktor-mcp

Önbellek dosyaları kullanıcının önbellek dizinine yazılır: DOKTOR_MCP_CACHE_DIR verilmişse oraya, yoksa $XDG_CACHE_HOME/doktor-mcp ya da ~/.cache/doktor-mcp altına.

Kaynak modu

sourceMode varsayılan olarak "live"'dır (0.59.0'dan beri): tool çağrısında sourceMode belirtilmezse sorgular canlı resmî kaynaklara gider. Fixture (kurgu) verisiyle denemek için çağrıda sourceMode: "mock" verin ya da DOKTOR_MCP_DEFAULT_SOURCE_MODE=mock ortam değişkenini ayarlayın; bu durumda yanıta mockDataWarning alanı eklenir.

Örnek: Claude Desktop Yapılandırması

json
{  "mcpServers": {    "doktor-mcp": {      "command": "npx",      "args": ["-y", "doktor-mcp"]    }  }}

Geçerli Değerler

DeğerAnlamı
"mock"Fixture (kurgu) verisi döner. Gerçek mevzuat veya karar değildir.
"live"Varsayılan. Canlı resmî kaynaklardan sorgular (mevzuat.gov.tr, Yargıtay, Danıştay).
"snapshot"Önceden kaydedilmiş canlı kaynak snapshot'ını kullanır.

Geçersiz bir değer ayarlanırsa (DOKTOR_MCP_DEFAULT_SOURCE_MODE=production gibi), stderr'ye uyarı yazılır ve varsayılan "live" kullanılır.

Not: DOKTOR_MCP_DEFAULT_SOURCE_MODE, DOKTOR_MCP_SOURCE_MODE'un daha keşfedilebilir bir karşılığıdır. İkisi de sourceMode'u ayarlar; ikisi birden ayarlandığında DOKTOR_MCP_DEFAULT_SOURCE_MODE son işleme alınır.

Geliştirme

powershell
npm installnpm testnpm run buildnpm 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 kaynaklarnpm run smoke:precedents -- "hizmet kusuru" --precedentSources yargitay,danistay
# Önbellek kontrolünpm run smoke:precedents -- "aydınlatılmış rıza" --no-cachenpm run smoke:precedents -- "aydınlatılmış rıza" --refresh
npm run smoke:mcp -- "kişisel sağlık verisi mahremiyet" -- --sourceMode livenpm run smoke:mcp -- "hasta haklari tibbi mudahale" -- --sourceMode livenpm run smoke:mcp -- "riza belgesi" -- --sourceMode mocknpm run dev:mcp

smoke:precedents, canlı Yargıtay ve Danıştay adaptörlerini paralel sorgular, sonuçları önbelleğe alır ve her aday karar için sourceTraces ve eligibilityStatus içeren kaynak-başına results ile JSON yazdırır. Bir kaynak erişilemezse, onun yapılandırılmış unavailable sonucu diğer kaynağın çıktısının yanında yazdırılır. JSON ayrıştırılabilirliği her zaman korunur.

smoke:mcp, tam prepare_doctor_legal_information_pack işleyicisini çağırır. sourceMode: "live" ile hem canlı mevzuatı hem canlı Yargıtay + Danıştay adaptörlerini kullanır. Opsiyonel precedentSources parametresi hangi adaptörlerin kullanılacağını seçer. AYM yalnızca-mock'tur ve canlı modda devre dışıdır.

npm run build sonrası, derlenmiş stdio MCP sunucusunu şununla çalıştırın:

powershell
npm run mcp

Hekim Sorusu Benchmark Paketi

Tipik hekim-merkezli hukuki sorulara odaklanan, canlı-kaynak değerlendirme metrikleri içeren kapsamlı bir kalite değerlendirme ve regresyon-test benchmark paketi.

Amaç

  • Kalite Ölçümü: 15 ayrı tıbbi-hukuki kategoride 15-20 hedef sorunun performansını, mevzuat eşlemesini, emsal sayısını ve şema uyumunu sistematik olarak değerlendirir.
  • Regresyon Önleme: Şu gibi katı güvenlik kısıtlarını zorlar: Kisisel Verilerin Korunmasi Kanunu (KVKK)'nın mahremiyet-dışı paketlerde bulunmaması, ret durumlarında hekim-merkezli deontoloji kurallarının genel hasta-haklarına önceliği, ve canlı modda mock-emsal geri-dönüşü olmaması.

Nasıl Çalıştırılır

Testleri çalıştırmak ve rapor çıktılarını görmek için benchmark runner script'ini kullanın:

powershell
# 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ısayolnpm run benchmark:doctor-questions:live
# Çalıştırmayı ilk N soruyla sınırlanpm 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

[!WARNING] Benchmark'ı --sourceMode live ile çalıştırmak, Cumhurbaşkanlığı Mevzuat (mevzuat.gov.tr) ve yüksek mahkeme servislerine (bedesten.adalet.gov.tr ve karararama.danistay.gov.tr) gerçek HTTP istekleri yapar. Bu sunucuların hız limiti (HTTP 429) veya IP kısıtlamasından kaçınmak için stabil bir internet bağlantınız olduğundan ve istek hacmini makul tuttuğunuzdan emin olun.

Mock vs Canlı Benchmark

Mock mod deterministik bir regresyon koruyucusudur. Beklenen mevzuat, öncelik, audit veya güvenlik invariyantları regresyona uğradığında komutu başarısız kılabilir.

Canlı mod bir değerlendirme çalıştırmasıdır. Aynı güvenlik invariyantlarını korur, ancak kaynak kesintileri, boş sonuçlar, hız limitleri ve sourceUnavailable girdileri otomatik başarısızlık yerine metrik ve uyarı olarak raporlanır. Güvensiz emsal kullanımı, yasak MVP alanları, canlı modda mock geri-dönüşü veya audit hataları sert regresyon başarısızlığı olarak kalır.

Benchmark Raporları ve Dışa Aktarımlar

Çalıştırmalar exports/doctor-benchmark/'ta (gitignore'da) ayrıştırılabilir JSON ve Markdown raporları üretir:

  • Mock mod:
    • doctor-benchmark-report.json
    • doctor-benchmark-report.md
  • Canlı mod:
    • live-benchmark-report.json
    • live-benchmark-report.md

Raporlar şunları içerir: startedAt, completedAt, durationMs, passedRegressionCount, failedRegressionCount, liveSourceUnavailableCount, audit sayıları, mevzuat/emsal kapsama sayıları ve soru-başına puanlama.

Raporlar, seçilen her doğrulanmış emsal için canlı benchmark kalite audit alanlarını içerir: mahkeme, daire, karar tarihi, esas/karar numaraları, erişim kaynağı, doküman id/kaynak id, varsa kaynak URL'i, tam-metin erişilebilirliği, gerekçe tespiti, uygunluk durumu/gerekçeleri, sağlık-hukuku ilgililik skoru, eşleşen terimler ve karar kaynak izi varlığı. Rapor tam karar metnini yazdırmaz.

Canlı modda mock geri-dönüşü sert bir regresyondur. AYM devre dışı/yalnızca-mock kalır ve sessizce canlı doğrulanmış emsal sağlayamaz. sourceUnavailable, boş canlı arama sonuçları ve geçici üst-kaynak hataları; bir güvensiz emsal veya şema/audit ihlaline yol açmadıkça kalite metriği ve uyarı olarak kalır.

Puanlama

Her soru şunları alır:

  • legislationMatchScore 0 ile 2 arası
  • priorityScore 0 ile 2 arası
  • precedentSafetyScore 0 ile 2 arası
  • sourceAvailabilityScore 0 ile 2 arası
  • auditScore 0 ile 2 arası
  • forbiddenFieldsScore 0 veya 2
  • totalScore, maxScore, scorePercent ve qualityBand

qualityBand: good, acceptable, needs_tuning veya unsafe. Canlı kaynak erişilemezliği kaliteyi düşürebilir, ama bir maddeyi unsafe yapan yalnızca güvenlik ihlalleri veya audit hatalarıdır.

Doğrulanmış emsal puanlaması bilinçli olarak katıdır. Seçilen bir doğrulanmış emsal precedent_usable olmalı, doğrulanmış tam metne, tespit edilmiş hukuki gerekçeye sahip olmalı ve bir karar kaynak izini korumalıdır. Yalnızca-meta veri, yalnızca-usuli, gerekçesiz, tam-metni-yok veya mock-erişim kayıtları canlı modda doğrulanmış emsal kredisi alamaz. Zayıf sağlık-hukuku ilgililiği, emsal güvenlik kredisini sınırlar ve yüksek bir toplam skorun arkasına gizlenmek yerine bir tuning uyarısı olarak raporlanır.

Benchmark, bu audit katmanının üzerine emsal ilgililik tuning'i içerir. Soru ve kaynağa göre zayıf ilgililiği, örnek karar id'lerini, eşleşen konu terimlerini, eksik beklenen konu terimlerini, bir whyWeak açıklamasını ve önerilen takip sorgu terimlerini raporlar. Ayrıca goodCleanCount'ı goodWithWarningsCount'tan ayırır ve ortalama/medyan sağlık-hukuku ilgililik skorlarını raporlar.

Zayıf ilgililik, kararın sert emsal güvenlik kapılarını geçtiği ama karar metninin yalnızca geniş sağlık kelimeleriyle eşleştiği veya sorunun konu profiliyle güçlü örtüşmediği anlamına gelir. Konu profilleri şunları içerir: aydınlatılmış onam, malpraktis/komplikasyon, acil bakım, tedavi reddi, mahremiyet/kayıtlar, psikiyatrik mahremiyet, şiddet/tehdit, sevk, özel hastane ücret uyuşmazlıkları, kamu disiplini, yoğun bakım ve gebelik acili. Canlı kaynak erişilemezliği bir metrik/uyarı olarak kalır; unsafe ise mock geri-dönüşü, eksik tam metin/gerekçe/iz veya kullanılamaz emsal durumlarının doğrulanmış çıktıya sızması gibi güvenlik ihlalleri için ayrılmıştır.

Performans Benchmark Komutu

sh
npm run benchmark:doctor-questions:performance# veya limitle:npm run benchmark:doctor-questions:performance -- --limit 5

Benchmark, 15 hekim sorusunun tamamını iki kez çalıştırır. Soğuk (cold) çalıştırma canlı ağa gider ve yerel dosya önbelleğini (.cache/precedents-perf/) doldurur. Sıcak (warm) çalıştırma aynı sorguları hemen önbellekten yeniden oynatır. Rapor şunları gösterir:

  • Soğuk vs sıcak toplam süre ve iyileşme %
  • Kaynak-başına soğuk/sıcak ortalama ms, p95, önbellek isabetleri, ağ istekleri
  • Önbellek etkinliği: isabet oranı %, önbellekten-sunulan sayısı, ortalama önbellek yaşı
  • Yeniden deneme/backoff özeti: toplam yeniden deneme, backoff süresi, hız-limiti olayları, timeout sayısı
  • En yavaş 10 sorgu denemesi (soğuk + sıcak birleşik)
  • Performans uyarıları (bloke etmez; sert başarısızlıklar test/build/audit olarak kalır)

p50/p95/p99 Yorumlama

DeğerAnlamı
p50Medyan sorgu süresi — sorguların yarısı bu sürede veya daha kısa sürede tamamlanır
p9595. yüzdelik — kuyruk gecikmesi; çoğu sorgu bundan hızlıdır
p9999. yüzdelik — aykırı gecikme; ara sıra yavaş sorgular

Soğuk p95 > 60s yavaş bir kaynağa işaret eder (genellikle Yargıtay/Bedesten PDF getirme). Sıcak p95 > 10s, en yavaş sorgular için önbelleğin etkili olmadığını gösterir (olası TTL süre dolması veya adaptör içindeki tam-metin getirmeler için önbellek ıskası).

Önbellek Entegrasyonu

Önbellek normal canlı benchmark ve smoke CLI çalıştırmalarında varsayılan olarak devre dışıdır. Performans benchmark'ı için paylaşılan bir PrecedentCache (TTL 2s, dizin .cache/precedents-perf/) enjekte edilir. Önbellek, (source, query, pageSize) anahtarı başına tüm searchAndNormalize sonucunu saklar. Sıcak çalıştırma yeniden oynatması eksiksizdir — önbelleğe alınmış sorgular için hiç ağ çağrısı yapılmaz.

.cache/ gitignore'dadır. Önbellek girdileri commit edilmez.


Sürüm geçmişi için bkz. CHANGELOG.md.

Lisans

GNU Affero Genel Kamu Lisansı sürüm 3 ile lisanslanmıştır (AGPL-3.0-only); tam metin LICENSE dosyasındadır. Yazılımı değiştirip ağ üzerinden başkalarına hizmet olarak sunarsanız, değiştirdiğiniz kaynak kodu da o kullanıcılara aynı lisansla sunmanız gerekir. Güvenlik açıklarının nasıl bildirileceği SECURITY.md dosyasında anlatılıyor.

Telif hakkı © 2026 Alpaslan Fatih Sözer

來源:README.md,提交 5a13636

工具

0
工具後設資料尚未被收錄。

版本歷史

1
  1. v0.59.1最新Oct 7, 2026