diff --git a/anayasa_mcp_module/models.py b/anayasa_mcp_module/models.py index dde3e06..d9bdd77 100644 --- a/anayasa_mcp_module/models.py +++ b/anayasa_mcp_module/models.py @@ -114,7 +114,7 @@ class AnayasaNormDenetimiSearchRequest(BaseModel): review_outcomes: Optional[List[AnayasaIncelemeSonucuEnum]] = Field(default_factory=list, description="List of review types and outcomes (IncelemeTuruKararSonuclar_id[]).") reason_for_final_outcome: Optional[AnayasaSonucGerekcesiEnum] = Field(default=AnayasaSonucGerekcesiEnum.TUMU, description="Main reason for the decision outcome (KararSonucununGerekcesi).") basis_constitution_article_numbers: Optional[List[str]] = Field(default_factory=list, description="List of supporting Constitution article numbers (DayanakHukmu[]).") - results_per_page: Optional[int] = Field(10, description="Number of results per page. Options: 10, 20, 30, 40, 50.") + results_per_page: Optional[int] = Field(10, ge=1, le=10, description="Results per page.") page_to_fetch: Optional[int] = Field(1, ge=1, description="Page number to fetch for results list.") sort_by_criteria: Optional[str] = Field("KararTarihi", description="Sort criteria. Options: 'KararTarihi', 'YayinTarihi', 'Toplam' (keyword count).") diff --git a/bedesten_mcp_module/models.py b/bedesten_mcp_module/models.py index c5edbc3..2ca6a0d 100644 --- a/bedesten_mcp_module/models.py +++ b/bedesten_mcp_module/models.py @@ -33,65 +33,15 @@ DanistayBirimEnum = Literal[ # Search Request Models class BedestenSearchData(BaseModel): - pageSize: int = Field(..., description="""Number of results per page. - Range: 1-100 results per page - Recommended: 10-50 for balanced performance - Higher values for comprehensive analysis""") - pageNumber: int = Field(..., description="""Page number to retrieve (1-indexed). - Start with 1 for first page - Calculate total pages from response.data.total / pageSize - Navigate: pageNumber=2 gets next set of results""") - itemTypeList: List[str] = Field(..., description="""Court type filter - determines which court decisions to search: - • ["YARGITAYKARARI"]: Court of Cassation (Yargıtay) - supreme court civil/criminal decisions - • ["DANISTAYKARAR"]: Council of State (Danıştay) - administrative court decisions - • ["YERELHUKUK"]: Local Civil Courts (Yerel Hukuk Mahkemeleri) - first instance civil decisions - • ["ISTINAFHUKUK"]: Civil Courts of Appeals (İstinaf Hukuk Mahkemeleri) - appellate court decisions - • ["KYB"]: Extraordinary Appeal (Kanun Yararına Bozma) - extraordinary appeal decisions - Note: Use single-item list for specific court type targeting""") - phrase: str = Field(..., description="""Search phrase/keyword with advanced search support: - • Regular search: "mülkiyet kararı" - searches words separately - • Exact phrase: "\"mülkiyet kararı\"" - searches exact phrase (more precise) - • Legal concepts: "\"idari işlem\"", "\"sözleşme ihlali\"", "\"tazminat davası\"" - • Empty string: searches all documents (use with filters) - Exact phrases significantly reduce false positives for precise legal research""") - birimAdi: Optional[Union[YargitayBirimEnum, DanistayBirimEnum]] = Field(None, description=""" - Chamber/Department (Daire) filter (optional). Available options depend on itemTypeList: - - For YARGITAYKARARI - Court of Cassation (52 options): - - None/null for ALL chambers - - 'Civil General Assembly (Hukuk Genel Kurulu)', '1st Civil Chamber (1. Hukuk Dairesi)' through '23rd Civil Chamber (23. Hukuk Dairesi)' - - 'Criminal General Assembly (Ceza Genel Kurulu)', '1st Criminal Chamber (1. Ceza Dairesi)' through '23rd Criminal Chamber (23. Ceza Dairesi)' - - 'Civil Chambers Presidents Board (Hukuk Daireleri Başkanlar Kurulu)', 'Criminal Chambers Presidents Board (Ceza Daireleri Başkanlar Kurulu)' - - 'Grand General Assembly (Büyük Genel Kurulu)' - - For DANISTAYKARAR - Council of State (27 options): - - None/null for ALL chambers - - 'Grand General Assembly (Büyük Gen.Kur.)', 'Administrative Cases Chambers Council (İdare Dava Daireleri Kurulu)', 'Tax Cases Chambers Council (Vergi Dava Daireleri Kurulu)' - - '1st Chamber (1. Daire)' through '17th Chamber (17. Daire)' - - 'Precedents Unification Council (İçtihatları Birleştirme Kurulu)', 'Administrative Affairs Council (İdari İşler Kurulu)', 'Presidents Council (Başkanlar Kurulu)' - - Military courts: 'Military High Administrative Court (Askeri Yüksek İdare Mahkemesi)' variants - """) - kararTarihiStart: Optional[str] = Field(None, description="""Decision start date (Karar Tarihi Başlangıç) filter (optional). - Format: YYYY-MM-DDTHH:MM:SS.000Z (ISO 8601 with Z timezone) - Examples: - • "2024-01-01T00:00:00.000Z" - from beginning of 2024 - • "2023-06-15T00:00:00.000Z" - from June 15, 2023 - • "2024-03-01T00:00:00.000Z" - from March 1, 2024 - Use with kararTarihiEnd for date range, or alone for "from date" filtering""") - kararTarihiEnd: Optional[str] = Field(None, description="""Decision end date (Karar Tarihi Bitiş) filter (optional). - Format: YYYY-MM-DDTHH:MM:SS.000Z (ISO 8601 with Z timezone) - Examples: - • "2024-12-31T23:59:59.999Z" - until end of 2024 - • "2023-12-31T23:59:59.999Z" - until end of 2023 - • "2024-06-30T23:59:59.999Z" - until end of June 2024 - Use with kararTarihiStart for date range, or alone for "until date" filtering""") - sortFields: List[str] = Field(default=["KARAR_TARIHI"], description="""Sorting field (Sıralama Alanı) specification. - ["KARAR_TARIHI"]: Sort by decision date (Karar Tarihi) [DEFAULT] - Most common use case for chronological ordering""") - sortDirection: str = Field(default="desc", description="""Sort direction (Sıralama Yönü) for results. - "desc": Descending order - newest decisions first [DEFAULT] - "asc": Ascending order - oldest decisions first - Recommended: "desc" for latest legal developments""") + pageSize: int = Field(..., description="Results per page (1-10)") + pageNumber: int = Field(..., description="Page number (1-indexed)") + itemTypeList: List[str] = Field(..., description="Court type filter (YARGITAYKARARI/DANISTAYKARAR/YERELHUKUK/ISTINAFHUKUK/KYB)") + phrase: str = Field(..., description="Search phrase (use \"exact phrase\" for precise matching)") + birimAdi: Optional[Union[YargitayBirimEnum, DanistayBirimEnum]] = Field(None, description="Chamber filter (optional)") + kararTarihiStart: Optional[str] = Field(None, description="Start date (ISO 8601 format)") + kararTarihiEnd: Optional[str] = Field(None, description="End date (ISO 8601 format)") + sortFields: List[str] = Field(default=["KARAR_TARIHI"], description="Sort fields") + sortDirection: str = Field(default="desc", description="Sort direction (asc/desc)") class BedestenSearchRequest(BaseModel): data: BedestenSearchData diff --git a/danistay_mcp_module/models.py b/danistay_mcp_module/models.py index 40280d4..0529aaa 100644 --- a/danistay_mcp_module/models.py +++ b/danistay_mcp_module/models.py @@ -5,7 +5,7 @@ from typing import List, Optional, Dict, Any class DanistayBaseSearchRequest(BaseModel): """Base model for common search parameters for Danistay.""" - pageSize: int = Field(default=10, ge=1, le=100) + pageSize: int = Field(default=10, ge=1, le=10) pageNumber: int = Field(default=1, ge=1) # siralama and siralamaDirection are part of detailed search, not necessarily keyword search # as per user's provided payloads. @@ -21,11 +21,11 @@ class DanistayKeywordSearchRequestData(BaseModel): class DanistayKeywordSearchRequest(BaseModel): # This is the model the MCP tool will accept """Model for keyword-based search request for Danistay.""" - andKelimeler: List[str] = Field(default_factory=list, description="Keywords for AND logic (VE Mantığı), e.g., ['word1', 'word2']") - orKelimeler: List[str] = Field(default_factory=list, description="Keywords for OR logic (VEYA Mantığı).") - notAndKelimeler: List[str] = Field(default_factory=list, description="Keywords for NOT AND logic (VE DEĞİL Mantığı).") - notOrKelimeler: List[str] = Field(default_factory=list, description="Keywords for NOT OR logic (VEYA DEĞİL Mantığı).") - pageSize: int = Field(default=10, ge=1, le=100) + andKelimeler: List[str] = Field(default_factory=list, description="AND keywords") + orKelimeler: List[str] = Field(default_factory=list, description="OR keywords") + notAndKelimeler: List[str] = Field(default_factory=list, description="NOT AND keywords") + notOrKelimeler: List[str] = Field(default_factory=list, description="NOT OR keywords") + pageSize: int = Field(default=10, ge=1, le=10) pageNumber: int = Field(default=1, ge=1) class DanistayDetailedSearchRequestData(BaseModel): # Internal data model for detailed search payload @@ -51,20 +51,20 @@ class DanistayDetailedSearchRequestData(BaseModel): # Internal data model for de class DanistayDetailedSearchRequest(DanistayBaseSearchRequest): # MCP tool will accept this """Model for detailed search request for Danistay.""" - daire: Optional[str] = Field(None, description="Chamber/Department name (e.g., '1. Daire').") - esasYil: Optional[str] = Field(None, description="Case year for 'Esas No'.") - esasIlkSiraNo: Optional[str] = Field(None, description="Starting sequence for 'Esas No'.") - esasSonSiraNo: Optional[str] = Field(None, description="Ending sequence for 'Esas No'.") - kararYil: Optional[str] = Field(None, description="Decision year for 'Karar No'.") - kararIlkSiraNo: Optional[str] = Field(None, description="Starting sequence for 'Karar No'.") - kararSonSiraNo: Optional[str] = Field(None, description="Ending sequence for 'Karar No'.") - baslangicTarihi: Optional[str] = Field(None, description="Start date for decision (DD.MM.YYYY).") - bitisTarihi: Optional[str] = Field(None, description="End date for decision (DD.MM.YYYY).") - mevzuatNumarasi: Optional[str] = Field(None, description="Legislation number.") - mevzuatAdi: Optional[str] = Field(None, description="Legislation name.") - madde: Optional[str] = Field(None, description="Article number.") - siralama: str = Field("1", description="Sorting criteria (e.g., 1: Esas No, 3: Karar Tarihi).") - siralamaDirection: str = Field("desc", description="Sorting direction ('asc' or 'desc').") + daire: Optional[str] = Field(None, description="Chamber") + esasYil: Optional[str] = Field(None, description="Case year") + esasIlkSiraNo: Optional[str] = Field(None, description="Start case no") + esasSonSiraNo: Optional[str] = Field(None, description="End case no") + kararYil: Optional[str] = Field(None, description="Decision year") + kararIlkSiraNo: Optional[str] = Field(None, description="Start decision no") + kararSonSiraNo: Optional[str] = Field(None, description="End decision no") + baslangicTarihi: Optional[str] = Field(None, description="Start date") + bitisTarihi: Optional[str] = Field(None, description="End date") + mevzuatNumarasi: Optional[str] = Field(None, description="Law number") + mevzuatAdi: Optional[str] = Field(None, description="Law name") + madde: Optional[str] = Field(None, description="Article") + siralama: str = Field("1", description="Sort by") + siralamaDirection: str = Field("desc", description="Direction") # Add a general keyword field if detailed search also supports it # arananKelime: Optional[str] = Field(None, description="General keyword for detailed search.") @@ -76,15 +76,15 @@ class DanistayApiDecisionEntry(BaseModel): id: str # The API response for keyword search uses "daireKurul", detailed search example uses "daire". # We use an alias to handle both and map to a consistent field name "chamber". - chamber: Optional[str] = Field(None, alias="daire", description="The chamber or board.") + chamber: Optional[str] = Field(None, alias="daire", description="Chamber") esasNo: Optional[str] = Field(None) kararNo: Optional[str] = Field(None) kararTarihi: Optional[str] = Field(None) - arananKelime: Optional[str] = Field(None, description="Matched keyword (Aranan Kelime) if provided in response.") + arananKelime: Optional[str] = Field(None, description="Keyword") # index: Optional[int] = None # Present in response, can be added if needed by MCP tool # siraNo: Optional[int] = None # Present in detailed response, can be added - document_url: Optional[HttpUrl] = Field(None, description="URL (Belge URL) to the full document, constructed by the client.") + document_url: Optional[HttpUrl] = Field(None, description="Document URL") model_config = ConfigDict(populate_by_name=True, extra='ignore') # Important for alias to work and ignore extra fields @@ -93,7 +93,7 @@ class DanistayApiResponseInnerData(BaseModel): data: List[DanistayApiDecisionEntry] recordsTotal: int recordsFiltered: int - draw: Optional[int] = Field(None, description="Draw counter (Çizim Sayıcısı) from API, usually for DataTables.") + draw: Optional[int] = Field(None, description="Draw counter") class DanistayApiResponse(BaseModel): """Model for the complete search response from the Danistay API.""" diff --git a/emsal_mcp_module/models.py b/emsal_mcp_module/models.py index 216cc2c..fc54d49 100644 --- a/emsal_mcp_module/models.py +++ b/emsal_mcp_module/models.py @@ -17,7 +17,7 @@ class EmsalDetailedSearchRequestData(BaseModel): # Add other specific court type fields from the form if they are separate keys in payload # E.g., "Ceza Mahkemeleri", "İdari Mahkemeler" etc. - birimHukukMah: Optional[str] = Field("", description="List of selected Regional Civil Chambers (Bölge Hukuk Mahkemeleri), '+' separated.") + birimHukukMah: Optional[str] = Field("", description="Regional chambers (+ separated)") esasYil: Optional[str] = "" esasIlkSiraNo: Optional[str] = "" @@ -36,42 +36,42 @@ class EmsalDetailedSearchRequestData(BaseModel): class EmsalSearchRequest(BaseModel): # This is the model the MCP tool will accept """Model for Emsal detailed search request, with user-friendly field names.""" - keyword: Optional[str] = Field(None, description="Keyword (Anahtar Kelime) to search.") + keyword: Optional[str] = Field(None, description="Keyword") - selected_bam_civil_court: Optional[str] = Field(None, description="Selected BAM Civil Court (Seçilen BAM Hukuk Mahkemesi) (maps to 'Bam Hukuk Mahkemeleri' payload key).") - selected_civil_court: Optional[str] = Field(None, description="Selected Civil Court (Seçilen Hukuk Mahkemesi) (maps to 'Hukuk Mahkemeleri' payload key).") - selected_regional_civil_chambers: Optional[List[str]] = Field(default_factory=list, description="Selected Regional Civil Chambers (Seçilen Bölge Hukuk Daireleri) (for 'birimHukukMah', joined by '+').") + selected_bam_civil_court: Optional[str] = Field(None, description="BAM Civil Court") + selected_civil_court: Optional[str] = Field(None, description="Civil Court") + selected_regional_civil_chambers: Optional[List[str]] = Field(default_factory=list, description="Regional chambers") - case_year_esas: Optional[str] = Field(None, description="Case year (Dava Yılı) for 'Esas No'.") - case_start_seq_esas: Optional[str] = Field(None, description="Starting sequence (Başlangıç Sırası) for 'Esas No'.") - case_end_seq_esas: Optional[str] = Field(None, description="Ending sequence (Bitiş Sırası) for 'Esas No'.") + case_year_esas: Optional[str] = Field(None, description="Case year") + case_start_seq_esas: Optional[str] = Field(None, description="Start case no") + case_end_seq_esas: Optional[str] = Field(None, description="End case no") - decision_year_karar: Optional[str] = Field(None, description="Decision year (Karar Yılı) for 'Karar No'.") - decision_start_seq_karar: Optional[str] = Field(None, description="Starting sequence (Başlangıç Sırası) for 'Karar No'.") - decision_end_seq_karar: Optional[str] = Field(None, description="Ending sequence (Bitiş Sırası) for 'Karar No'.") + decision_year_karar: Optional[str] = Field(None, description="Decision year") + decision_start_seq_karar: Optional[str] = Field(None, description="Start decision no") + decision_end_seq_karar: Optional[str] = Field(None, description="End decision no") - start_date: Optional[str] = Field(None, description="Start date (Başlangıç Tarihi) for decision (DD.MM.YYYY).") - end_date: Optional[str] = Field(None, description="End date (Bitiş Tarihi) for decision (DD.MM.YYYY).") + start_date: Optional[str] = Field(None, description="Start date (DD.MM.YYYY)") + end_date: Optional[str] = Field(None, description="End date (DD.MM.YYYY)") - sort_criteria: str = Field("1", description="Sorting criteria (Sıralama Kriteri) (e.g., 1: Esas No).") - sort_direction: str = Field("desc", description="Sorting direction (Sıralama Yönü) ('asc' or 'desc').") + sort_criteria: str = Field("1", description="Sort by") + sort_direction: str = Field("desc", description="Direction") page_number: int = Field(default=1, ge=1) - page_size: int = Field(default=10, ge=1, le=100) + page_size: int = Field(default=10, ge=1, le=10) class EmsalApiDecisionEntry(BaseModel): """Model for an individual decision entry from the Emsal API search response.""" id: str - daire: Optional[str] = Field(None, description="The chamber/court (Daire/Mahkeme) that made the decision.") + daire: Optional[str] = Field(None, description="Chamber") esasNo: Optional[str] = Field(None) kararNo: Optional[str] = Field(None) kararTarihi: Optional[str] = Field(None) - arananKelime: Optional[str] = Field(None, description="Matched keyword (Aranan Kelime) from the search.") - durum: Optional[str] = Field(None, description="Status (Durum) of the decision (e.g., 'KESİNLEŞMEDİ').") + arananKelime: Optional[str] = Field(None, description="Keyword") + durum: Optional[str] = Field(None, description="Status") # index: Optional[int] = None # Present in Emsal response, can be added if tool needs it - document_url: Optional[HttpUrl] = Field(None, description="URL (Belge URL) to the full document, constructed by the client.") + document_url: Optional[HttpUrl] = Field(None, description="Document URL") model_config = ConfigDict(extra='ignore') diff --git a/kik_mcp_module/models.py b/kik_mcp_module/models.py index 75ffed3..395f84a 100644 --- a/kik_mcp_module/models.py +++ b/kik_mcp_module/models.py @@ -13,28 +13,28 @@ class KikKararTipi(str, Enum): class KikSearchRequest(BaseModel): """Model for KIK Decision search criteria.""" karar_tipi: KikKararTipi = Field(KikKararTipi.UYUSMAZLIK, description="Type") - karar_no: Optional[str] = Field(None, description="Number") - karar_tarihi_baslangic: Optional[str] = Field(None, description="Start date", pattern=r"^\d{2}\.\d{2}\.\d{4}$") - karar_tarihi_bitis: Optional[str] = Field(None, description="End date", pattern=r"^\d{2}\.\d{2}\.\d{4}$") - resmi_gazete_sayisi: Optional[str] = Field(None, description="Gazette no") - resmi_gazete_tarihi: Optional[str] = Field(None, description="Gazette date", pattern=r"^\d{2}\.\d{2}\.\d{4}$") - basvuru_konusu_ihale: Optional[str] = Field(None, description="Tender subject") + karar_no: Optional[str] = Field(None, description="No") + karar_tarihi_baslangic: Optional[str] = Field(None, description="Start", pattern=r"^\d{2}\.\d{2}\.\d{4}$") + karar_tarihi_bitis: Optional[str] = Field(None, description="End", pattern=r"^\d{2}\.\d{2}\.\d{4}$") + resmi_gazete_sayisi: Optional[str] = Field(None, description="Gazette") + resmi_gazete_tarihi: Optional[str] = Field(None, description="Date", pattern=r"^\d{2}\.\d{2}\.\d{4}$") + basvuru_konusu_ihale: Optional[str] = Field(None, description="Subject") basvuru_sahibi: Optional[str] = Field(None, description="Applicant") ihaleyi_yapan_idare: Optional[str] = Field(None, description="Entity") yil: Optional[str] = Field(None, description="Year") - karar_metni: Optional[str] = Field(None, description="Text search") + karar_metni: Optional[str] = Field(None, description="Text") page: int = Field(1, ge=1, description="Page") class KikDecisionEntry(BaseModel): """Represents a single decision entry from KIK search results.""" - preview_event_target: str = Field(..., description="Internal event target for fetching details.") - karar_no_str: str = Field(..., alias="kararNo", description="Raw decision number as extracted from KIK (e.g., '2024/UH.II-1766').") - karar_tipi: KikKararTipi = Field(..., description="The type of decision this entry belongs to.") + preview_event_target: str = Field(..., description="Event target") + karar_no_str: str = Field(..., alias="kararNo", description="Decision number") + karar_tipi: KikKararTipi = Field(..., description="Decision type") - karar_tarihi_str: str = Field(..., alias="kararTarihi", description="Decision date.") - idare_str: Optional[str] = Field(None, alias="idare", description="Procuring entity.") - basvuru_sahibi_str: Optional[str] = Field(None, alias="basvuruSahibi", description="Applicant.") - ihale_konusu_str: Optional[str] = Field(None, alias="ihaleKonusu", description="Tender subject.") + karar_tarihi_str: str = Field(..., alias="kararTarihi", description="Date") + idare_str: Optional[str] = Field(None, alias="idare", description="Entity") + basvuru_sahibi_str: Optional[str] = Field(None, alias="basvuruSahibi", description="Applicant") + ihale_konusu_str: Optional[str] = Field(None, alias="ihaleKonusu", description="Subject") @computed_field @property @@ -58,18 +58,17 @@ class KikDocumentMarkdown(BaseModel): """ KIK decision document, with Markdown content potentially paginated. """ - retrieved_with_karar_id: Optional[str] = Field(None, description="The Base64 encoded karar_id that was used to request this document.") - # Decode edilmiş karar no ve tipini de yanıt olarak ekleyelim, Claude için faydalı olabilir. - retrieved_karar_no: Optional[str] = Field(None, description="The raw KIK Decision Number (e.g., '2024/UH.II-1766') this document pertains to.") - retrieved_karar_tipi: Optional[KikKararTipi] = Field(None, description="The KIK Decision Type this document pertains to.") + retrieved_with_karar_id: Optional[str] = Field(None, description="Request ID") + retrieved_karar_no: Optional[str] = Field(None, description="Decision number") + retrieved_karar_tipi: Optional[KikKararTipi] = Field(None, description="Decision type") - karar_id_param_from_url: Optional[str] = Field(None, alias="kararIdParam", description="The KIK system's internal KararId parameter from the document's display URL (KurulKararGoster.aspx).") - markdown_chunk: Optional[str] = Field(None, description="The requested chunk of the decision content converted to Markdown.") - source_url: Optional[str] = Field(None, description="The source URL of the original document (KurulKararGoster.aspx).") - error_message: Optional[str] = Field(None, description="Error message if document retrieval or processing failed.") - current_page: int = Field(1, description="The current page number of the markdown chunk being returned.") - total_pages: int = Field(1, description="The total number of pages the full markdown content is divided into.") - is_paginated: bool = Field(False, description="True if the full markdown content is split into multiple pages.") - full_content_char_count: Optional[int] = Field(None, description="Total character count of the full markdown content before chunking.") + karar_id_param_from_url: Optional[str] = Field(None, alias="kararIdParam", description="Internal ID") + markdown_chunk: Optional[str] = Field(None, description="Content") + source_url: Optional[str] = Field(None, description="Source URL") + error_message: Optional[str] = Field(None, description="Error") + current_page: int = Field(1, description="Page") + total_pages: int = Field(1, description="Total pages") + is_paginated: bool = Field(False, description="Paginated") + full_content_char_count: Optional[int] = Field(None, description="Char count") model_config = ConfigDict(populate_by_name=True) \ No newline at end of file diff --git a/kvkk_mcp_module/models.py b/kvkk_mcp_module/models.py index 8c36e12..7db1c3c 100644 --- a/kvkk_mcp_module/models.py +++ b/kvkk_mcp_module/models.py @@ -11,21 +11,21 @@ class KvkkSearchRequest(BaseModel): Examples: "açık rıza", "veri güvenliği", "kişisel veri işleme" """) page: int = Field(1, ge=1, le=50, description="Page number for search results (1-50).") - pageSize: int = Field(10, ge=1, le=20, description="Number of results per page (1-20).") + pageSize: int = Field(10, ge=1, le=10, description="Number of results per page (1-10).") class KvkkDecisionSummary(BaseModel): """Model for a single KVKK decision summary from Brave search results.""" title: Optional[str] = Field(None, description="Decision title from search results.") url: Optional[HttpUrl] = Field(None, description="URL to the KVKK decision page.") description: Optional[str] = Field(None, description="Brief description or snippet from search results.") - decision_id: Optional[str] = Field(None, description="Extracted decision ID from URL (e.g., Icerik/7288/2021-1303).") - publication_date: Optional[str] = Field(None, description="Publication date if extractable from title or description.") - decision_number: Optional[str] = Field(None, description="Decision number if extractable from title or description.") + decision_id: Optional[str] = Field(None, description="Value") + publication_date: Optional[str] = Field(None, description="Value") + decision_number: Optional[str] = Field(None, description="Value") class KvkkSearchResult(BaseModel): """Model for the overall search result for KVKK decisions.""" decisions: List[KvkkDecisionSummary] = Field(default_factory=list, description="List of KVKK decisions found.") - total_results: Optional[int] = Field(None, description="Total number of results available (if provided by Brave API).") + total_results: Optional[int] = Field(None, description="Value") page: int = Field(1, description="Current page number of results.") pageSize: int = Field(10, description="Number of results per page.") query: Optional[str] = Field(None, description="The actual search query sent to Brave API.") @@ -41,7 +41,7 @@ class KvkkDocumentMarkdown(BaseModel): current_page: int = Field(description="The current page number of the markdown chunk (1-indexed).") total_pages: int = Field(description="Total number of pages for the full markdown content.") is_paginated: bool = Field(description="True if the full markdown content is split into multiple pages.") - error_message: Optional[str] = Field(None, description="Error message if document retrieval or conversion failed.") + error_message: Optional[str] = Field(None, description="Value") class Config: json_encoders = { diff --git a/mcp_server_main.py b/mcp_server_main.py index ad242e2..b6347cc 100644 --- a/mcp_server_main.py +++ b/mcp_server_main.py @@ -972,7 +972,7 @@ async def search_yargitay_detailed( bitisTarihi: str = Field("", description="End date for decision search (DD.MM.YYYY)."), siralama: str = Field("3", description="Sorting criteria (1: Esas No, 2: Karar No, 3: Karar Tarihi)."), siralamaDirection: str = Field("desc", description="Sorting direction ('asc' or 'desc')."), - pageSize: int = Field(10, ge=1, le=100, description="Number of results per page."), + pageSize: int = Field(10, ge=1, le=10, description="Number of results per page."), pageNumber: int = Field(1, ge=1, description="Page number to retrieve.") ) -> CompactYargitaySearchResult: """Search Yargıtay decisions using primary API with 52 chamber filtering and advanced operators.""" @@ -1047,7 +1047,7 @@ async def search_danistay_by_keyword( notAndKelimeler: List[str] = Field(default_factory=list, description="Keywords for NOT AND logic."), notOrKelimeler: List[str] = Field(default_factory=list, description="Keywords for NOT OR logic."), pageNumber: int = Field(1, ge=1, description="Page number."), - pageSize: int = Field(10, ge=1, le=100, description="Results per page.") + pageSize: int = Field(10, ge=1, le=10, description="Results per page.") ) -> CompactDanistaySearchResult: """Search Danıştay decisions with keyword logic.""" @@ -1099,7 +1099,7 @@ async def search_danistay_detailed( siralama: str = Field("1", description="Sorting criteria (e.g., 1: Esas No, 3: Karar Tarihi)."), siralamaDirection: str = Field("desc", description="Sorting direction ('asc' or 'desc')."), pageNumber: int = Field(1, ge=1, description="Page number."), - pageSize: int = Field(10, ge=1, le=100, description="Results per page.") + pageSize: int = Field(10, ge=1, le=10, description="Results per page.") ) -> CompactDanistaySearchResult: """Search Danıştay decisions with detailed filtering.""" @@ -1179,7 +1179,7 @@ async def search_emsal_detailed_decisions( sort_criteria: str = Field("1", description="Sorting criteria (e.g., 1: Esas No)."), sort_direction: str = Field("desc", description="Sorting direction ('asc' or 'desc')."), page_number: int = Field(1, ge=1, description="Page number (accepts int)."), - page_size: int = Field(10, ge=1, le=100, description="Results per page.") + page_size: int = Field(10, ge=1, le=10, description="Results per page.") ) -> CompactEmsalSearchResult: """Search Emsal precedent decisions with detailed criteria.""" @@ -1690,7 +1690,7 @@ async def get_rekabet_kurumu_document( ) async def search_yargitay_bedesten( phrase: str = Field(..., description="Search phrase with advanced operators"), - pageSize: int = Field(10, ge=1, le=100, description="Sayfa başına sonuç sayısı"), + pageSize: int = Field(10, ge=1, le=10, description="Sayfa başına sonuç sayısı"), pageNumber: int = Field(1, ge=1, description="Sayfa numarası"), birimAdi: Optional[YargitayBirimEnum] = Field(None, description="See docs for details"), kararTarihiStart: Optional[str] = Field(None, description="Start date for filtering (ISO 8601 format)"), @@ -1769,7 +1769,7 @@ async def get_yargitay_bedesten_document_markdown( ) async def search_danistay_bedesten( phrase: str = Field(..., description="Search phrase with advanced operators"), - pageSize: int = Field(10, ge=1, le=100, description="Sayfa başına sonuç sayısı"), + pageSize: int = Field(10, ge=1, le=10, description="Sayfa başına sonuç sayısı"), pageNumber: int = Field(1, ge=1, description="Sayfa numarası"), birimAdi: Optional[DanistayBirimEnum] = Field(None, description="See docs for details"), kararTarihiStart: Optional[str] = Field(None, description="Start date for filtering (ISO 8601 format)"), @@ -1848,7 +1848,7 @@ async def get_danistay_bedesten_document_markdown( ) async def search_yerel_hukuk_bedesten( phrase: str = Field(..., description="Search phrase with advanced operators"), - pageSize: int = Field(10, ge=1, le=100, description="Sayfa başına sonuç sayısı"), + pageSize: int = Field(10, ge=1, le=10, description="Sayfa başına sonuç sayısı"), pageNumber: int = Field(1, ge=1, description="Sayfa numarası"), kararTarihiStart: Optional[str] = Field(None, description="Start date for filtering (ISO 8601 format)"), kararTarihiEnd: Optional[str] = Field(None, description="End date for filtering (ISO 8601 format)") @@ -1925,7 +1925,7 @@ async def get_yerel_hukuk_bedesten_document_markdown( ) async def search_istinaf_hukuk_bedesten( phrase: str = Field(..., description="Search phrase with advanced operators"), - pageSize: int = Field(10, ge=1, le=100, description="Sayfa başına sonuç sayısı"), + pageSize: int = Field(10, ge=1, le=10, description="Sayfa başına sonuç sayısı"), pageNumber: int = Field(1, ge=1, description="Sayfa numarası"), kararTarihiStart: Optional[str] = Field(None, description="Start date for filtering (ISO 8601 format)"), kararTarihiEnd: Optional[str] = Field(None, description="End date for filtering (ISO 8601 format)") @@ -2001,7 +2001,7 @@ async def get_istinaf_hukuk_bedesten_document_markdown( ) async def search_kyb_bedesten( phrase: str = Field(..., description="Search phrase with advanced operators"), - pageSize: int = Field(10, ge=1, le=100, description="Sayfa başına sonuç sayısı"), + pageSize: int = Field(10, ge=1, le=10, description="Sayfa başına sonuç sayısı"), pageNumber: int = Field(1, ge=1, description="Sayfa numarası"), kararTarihiStart: Optional[str] = Field(None, description="Start date for filtering (ISO 8601 format)"), kararTarihiEnd: Optional[str] = Field(None, description="End date for filtering (ISO 8601 format)") diff --git a/rekabet_mcp_module/models.py b/rekabet_mcp_module/models.py index 99174c0..576d33a 100644 --- a/rekabet_mcp_module/models.py +++ b/rekabet_mcp_module/models.py @@ -26,31 +26,30 @@ class RekabetKararTuruAdiEnum(str, Enum): class RekabetKurumuSearchRequest(BaseModel): """Model for Rekabet Kurumu (Turkish Competition Authority) search request.""" sayfaAdi: Optional[str] = Field(None, description="Title") - YayinlanmaTarihi: Optional[str] = Field(None, description="Pub date") - PdfText: Optional[str] = Field(None, description="Search text") - # This field uses the GUID enum as it's used by the client to make the actual web request. + YayinlanmaTarihi: Optional[str] = Field(None, description="Date") + PdfText: Optional[str] = Field(None, description="Text") KararTuruID: Optional[RekabetKararTuruGuidEnum] = Field(RekabetKararTuruGuidEnum.TUMU, description="Type") - KararSayisi: Optional[str] = Field(None, description="Number") + KararSayisi: Optional[str] = Field(None, description="No") KararTarihi: Optional[str] = Field(None, description="Date") page: int = Field(1, ge=1, description="Page") class RekabetDecisionSummary(BaseModel): """Model for a single Rekabet Kurumu decision summary from search results.""" - publication_date: Optional[str] = Field(None, description="Publication Date (Yayımlanma Tarihi).") - decision_number: Optional[str] = Field(None, description="Decision Number (Karar Sayısı).") - decision_date: Optional[str] = Field(None, description="Decision Date (Karar Tarihi).") - decision_type_text: Optional[str] = Field(None, description="Decision Type as text (Karar Türü - metin olarak).") - title: Optional[str] = Field(None, description="Decision title or summary text.") - decision_url: Optional[HttpUrl] = Field(None, description="URL to the decision's landing page (e.g., /Karar?kararId=...).") - karar_id: Optional[str] = Field(None, description="GUID of the decision, extracted from its URL.") - related_cases_url: Optional[HttpUrl] = Field(None, description="URL to related court cases page, if available.") + publication_date: Optional[str] = Field(None, description="Pub date") + decision_number: Optional[str] = Field(None, description="Number") + decision_date: Optional[str] = Field(None, description="Date") + decision_type_text: Optional[str] = Field(None, description="Type") + title: Optional[str] = Field(None, description="Title") + decision_url: Optional[HttpUrl] = Field(None, description="URL") + karar_id: Optional[str] = Field(None, description="ID") + related_cases_url: Optional[HttpUrl] = Field(None, description="Cases URL") class RekabetSearchResult(BaseModel): """Model for the overall search result for Rekabet Kurumu decisions.""" decisions: List[RekabetDecisionSummary] - total_records_found: Optional[int] = Field(None, description="Total number of records found matching the query.") - retrieved_page_number: int = Field(description="The page number of the results that were retrieved.") - total_pages: Optional[int] = Field(None, description="Total number of pages available for the query.") + total_records_found: Optional[int] = Field(None, description="Total") + retrieved_page_number: int = Field(description="Page") + total_pages: Optional[int] = Field(None, description="Pages") class RekabetDocument(BaseModel): """ @@ -58,16 +57,15 @@ class RekabetDocument(BaseModel): Contains metadata from the landing page, a link to the PDF, and the PDF's content converted to paginated Markdown. """ - source_landing_page_url: HttpUrl = Field(description="The URL of the decision's landing page from which the PDF was identified.") - karar_id: str = Field(description="GUID of the decision.") + source_landing_page_url: HttpUrl = Field(description="Source URL") + karar_id: str = Field(description="ID") - title_on_landing_page: Optional[str] = Field(None, description="Title as found on the landing page (e.g., from tag or a main heading). Could be a generic title if direct PDF.") - pdf_url: Optional[HttpUrl] = Field(None, description="Direct URL to the decision PDF document, if successfully found and resolved.") + title_on_landing_page: Optional[str] = Field(None, description="Title") + pdf_url: Optional[HttpUrl] = Field(None, description="PDF URL") - # Fields for Markdown content derived from the PDF - markdown_chunk: Optional[str] = Field(None, description="A 5,000 character chunk of the Markdown content derived from the decision PDF.") - current_page: int = Field(1, description="The current page number of the PDF-derived markdown chunk (1-indexed).") - total_pages: int = Field(1, description="Total number of pages for the full PDF-derived markdown content. Will be 0 if content could not be processed.") - is_paginated: bool = Field(False, description="True if the full PDF-derived markdown content is split into multiple pages.") + markdown_chunk: Optional[str] = Field(None, description="Content") + current_page: int = Field(1, description="Page") + total_pages: int = Field(1, description="Total pages") + is_paginated: bool = Field(False, description="Paginated") - error_message: Optional[str] = Field(None, description="Contains an error message if the document retrieval or processing failed at any stage.") \ No newline at end of file + error_message: Optional[str] = Field(None, description="Error") \ No newline at end of file diff --git a/sayistay_mcp_module/models.py b/sayistay_mcp_module/models.py index d789383..93a74a5 100644 --- a/sayistay_mcp_module/models.py +++ b/sayistay_mcp_module/models.py @@ -16,30 +16,18 @@ class GenelKurulSearchRequest(BaseModel): of the Turkish Court of Accounts, typically addressing interpretation of audit and accountability regulations. """ - karar_no: Optional[str] = Field(None, description="Decision number (e.g., '5415')") - karar_ek: Optional[str] = Field(None, description="Decision appendix number (max 99)") + karar_no: Optional[str] = Field(None, description="Decision no") + karar_ek: Optional[str] = Field(None, description="Appendix no") - karar_tarih_baslangic: Optional[str] = Field(None, description=""" - Decision start year for date range filtering. - Available years: 2006-2024. Format: 'YYYY' (e.g., '2020') - Use with karar_tarih_bitis for date range filtering. - """) + karar_tarih_baslangic: Optional[str] = Field(None, description="Start year (YYYY)") - karar_tarih_bitis: Optional[str] = Field(None, description=""" - Decision end year for date range filtering. - Available years: 2006-2024. Format: 'YYYY' (e.g., '2024') - Use with karar_tarih_baslangic for date range filtering. - """) + karar_tarih_bitis: Optional[str] = Field(None, description="End year") - karar_tamami: Optional[str] = Field(None, description=""" - Content/text search within decision summaries (max 400 characters). - Searches in decision abstracts and main content. - Example: 'belediye taşınmaz tahsis' - """) + karar_tamami: Optional[str] = Field(None, description="Value") # DataTables pagination start: int = Field(0, description="Starting record for pagination (0-based)") - length: int = Field(10, description="Number of records per page (1-100)") + length: int = Field(10, description="Number of records per page (1-10)") class GenelKurulDecision(BaseModel): """Single Genel Kurul decision entry from search results.""" @@ -66,62 +54,27 @@ class TemyizKuruluSearchRequest(BaseModel): Temyiz Kurulu reviews appeals against audit chamber decisions, providing higher-level review of audit findings and sanctions. """ - ilam_dairesi: DaireEnum = Field("ALL", description=""" - Chamber/Department filter for appeals board decisions. - • ALL: All chambers (default) - • 1-8: Specific chamber number (1. Daire through 8. Daire) - Each chamber specializes in different types of public institutions. - """) + ilam_dairesi: DaireEnum = Field("ALL", description="Value") - yili: Optional[str] = Field(None, description=""" - Account year filter (Hesap Yılı). - Available years: 1993-2022. Format: 'YYYY' (e.g., '2020') - Refers to the fiscal year being audited, not decision date. - """) + yili: Optional[str] = Field(None, description="Value") - karar_tarih_baslangic: Optional[str] = Field(None, description=""" - Decision start year for date range filtering. - Available years: 2000, 2006-2024. Format: 'YYYY' (e.g., '2020') - Use with karar_tarih_bitis for date range filtering. - """) + karar_tarih_baslangic: Optional[str] = Field(None, description="Value") - karar_tarih_bitis: Optional[str] = Field(None, description=""" - Decision end year for date range filtering. - Available years: 2000, 2006-2024. Format: 'YYYY' (e.g., '2024') - Use with karar_tarih_baslangic for date range filtering. - """) + karar_tarih_bitis: Optional[str] = Field(None, description="End year") - kamu_idaresi_turu: KamuIdaresiTuruEnum = Field("ALL", description=""" - Public administration type filter: - • ALL: All institutions (default) - • Genel Bütçe Kapsamındaki İdareler: General budget administrations - • Yüksek Öğretim Kurumları: Higher education institutions - • Belediyeler ve Bağlı İdareler: Municipalities and affiliates - • Other specific institution types - """) + kamu_idaresi_turu: KamuIdaresiTuruEnum = Field("ALL", description="Value") ilam_no: Optional[str] = Field(None, description="Audit report number (İlam No, max 50 chars)") dosya_no: Optional[str] = Field(None, description="File number for the case") temyiz_tutanak_no: Optional[str] = Field(None, description="Appeals board meeting minutes number") - temyiz_karar: Optional[str] = Field(None, description=""" - Content search within appeals decisions. - Searches decision text and reasoning. - Example: 'araç kiralama kasko' - """) + temyiz_karar: Optional[str] = Field(None, description="Value") - web_karar_konusu: WebKararKonusuEnum = Field("ALL", description=""" - Decision subject category filter: - • ALL: All subjects (default) - • İhale Mevzuatı ile İlgili Kararlar: Procurement legislation - • Personel Mevzuatı ile İlgili Kararlar: Personnel legislation - • Harcırah Mevzuatı ile İlgili Kararlar: Travel allowance legislation - • Other specialized legal areas - """) + web_karar_konusu: WebKararKonusuEnum = Field("ALL", description="Value") # DataTables pagination start: int = Field(0, description="Starting record for pagination (0-based)") - length: int = Field(10, description="Number of records per page (1-100)") + length: int = Field(10, description="Number of records per page (1-10)") class TemyizKuruluDecision(BaseModel): """Single Temyiz Kurulu decision entry from search results.""" @@ -148,60 +101,25 @@ class DaireSearchRequest(BaseModel): Daire decisions are first-instance audit findings and sanctions issued by individual audit chambers before potential appeals. """ - yargilama_dairesi: DaireEnum = Field("ALL", description=""" - Audit chamber filter: - • ALL: All chambers (default) - • 1-8: Specific chamber number (1. Daire through 8. Daire) - Each chamber audits different types of public institutions. - """) + yargilama_dairesi: DaireEnum = Field("ALL", description="Value") - karar_tarih_baslangic: Optional[str] = Field(None, description=""" - Decision start year for date range filtering. - Available years: 2012-2025. Format: 'YYYY' (e.g., '2020') - Use with karar_tarih_bitis for date range filtering. - """) + karar_tarih_baslangic: Optional[str] = Field(None, description="Value") - karar_tarih_bitis: Optional[str] = Field(None, description=""" - Decision end year for date range filtering. - Available years: 2012-2025. Format: 'YYYY' (e.g., '2024') - Use with karar_tarih_baslangic for date range filtering. - """) + karar_tarih_bitis: Optional[str] = Field(None, description="End year") ilam_no: Optional[str] = Field(None, description="Audit report number (İlam No, max 50 chars)") - kamu_idaresi_turu: KamuIdaresiTuruEnum = Field("ALL", description=""" - Public administration type filter: - • ALL: All institutions (default) - • Genel Bütçe Kapsamındaki İdareler: General budget administrations - • Yüksek Öğretim Kurumları: Higher education institutions - • Belediyeler ve Bağlı İdareler: Municipalities and affiliates - • Other specific institution types - """) + kamu_idaresi_turu: KamuIdaresiTuruEnum = Field("ALL", description="Value") - hesap_yili: Optional[str] = Field(None, description=""" - Account year filter (Hesap Yılı). - Available years: 2005, 2008-2023. Format: 'YYYY' (e.g., '2020') - Refers to the fiscal year being audited, not decision date. - """) + hesap_yili: Optional[str] = Field(None, description="Value") - web_karar_konusu: WebKararKonusuEnum = Field("ALL", description=""" - Decision subject category filter: - • ALL: All subjects (default) - • İhale Mevzuatı ile İlgili Kararlar: Procurement legislation - • Personel Mevzuatı ile İlgili Kararlar: Personnel legislation - • Vergi Resmi Harç ve Diğer Gelirlerle İlgili Kararlar: Tax and fee legislation - • Other specialized legal areas - """) + web_karar_konusu: WebKararKonusuEnum = Field("ALL", description="Value") - web_karar_metni: Optional[str] = Field(None, description=""" - Content search within chamber decisions. - Searches decision text and audit findings. - Example: 'birim fiyat revize edilmemesi' - """) + web_karar_metni: Optional[str] = Field(None, description="Value") # DataTables pagination start: int = Field(0, description="Starting record for pagination (0-based)") - length: int = Field(10, description="Number of records per page (1-100)") + length: int = Field(10, description="Number of records per page (1-10)") class DaireDecision(BaseModel): """Single Daire decision entry from search results.""" @@ -235,7 +153,7 @@ class SayistayDocumentMarkdown(BaseModel): decision types (Genel Kurul, Temyiz Kurulu, Daire). """ decision_id: str = Field(..., description="Unique decision identifier") - decision_type: str = Field(..., description="Type of decision: 'genel_kurul', 'temyiz_kurulu', or 'daire'") + decision_type: str = Field(..., description="Value") source_url: str = Field(..., description="Original URL where the document was retrieved") markdown_content: Optional[str] = Field(None, description="Full decision text converted to Markdown format") retrieval_date: Optional[str] = Field(None, description="Date when document was retrieved (ISO format)") diff --git a/uyusmazlik_mcp_module/models.py b/uyusmazlik_mcp_module/models.py index 6b8eebf..ac6c008 100644 --- a/uyusmazlik_mcp_module/models.py +++ b/uyusmazlik_mcp_module/models.py @@ -28,41 +28,41 @@ class UyusmazlikKararSonucuEnum(str, Enum): # Based on checkbox text in the form class UyusmazlikSearchRequest(BaseModel): # This is the model the MCP tool will accept """Model for Uyuşmazlık Mahkemesi search request using user-friendly terms.""" - icerik: Optional[str] = Field("", description="Keyword or content for main text search (Icerik).") + icerik: Optional[str] = Field("", description="Search text") bolum: Optional[UyusmazlikBolumEnum] = Field( UyusmazlikBolumEnum.TUMU, - description="Select the department (Bölüm)." + description="Department" ) uyusmazlik_turu: Optional[UyusmazlikTuruEnum] = Field( UyusmazlikTuruEnum.TUMU, - description="Select the type of dispute (Uyuşmazlık)." + description="Dispute type" ) # User provides a list of user-friendly names for Karar Sonucu karar_sonuclari: Optional[List[UyusmazlikKararSonucuEnum]] = Field( # Changed to list of Enums default_factory=list, - description="List of desired 'Karar Sonucu' types." + description="Decision types" ) - esas_yil: Optional[str] = Field("", description="Case year ('Esas Yılı').") - esas_sayisi: Optional[str] = Field("", description="Case number ('Esas Sayısı').") - karar_yil: Optional[str] = Field("", description="Decision year ('Karar Yılı').") - karar_sayisi: Optional[str] = Field("", description="Decision number ('Karar Sayısı').") - kanun_no: Optional[str] = Field("", description="Relevant Law Number ('KanunNo').") + esas_yil: Optional[str] = Field("", description="Case year") + esas_sayisi: Optional[str] = Field("", description="Case no") + karar_yil: Optional[str] = Field("", description="Decision year") + karar_sayisi: Optional[str] = Field("", description="Decision no") + kanun_no: Optional[str] = Field("", description="Law no") - karar_date_begin: Optional[str] = Field("", description="Decision start date (DD.MM.YYYY) ('KararDateBegin').") - karar_date_end: Optional[str] = Field("", description="Decision end date (DD.MM.YYYY) ('KararDateEnd').") + karar_date_begin: Optional[str] = Field("", description="Start date (DD.MM.YYYY)") + karar_date_end: Optional[str] = Field("", description="End date (DD.MM.YYYY)") - resmi_gazete_sayi: Optional[str] = Field("", description="Official Gazette number ('ResmiGazeteSayi').") - resmi_gazete_date: Optional[str] = Field("", description="Official Gazette date (DD.MM.YYYY) ('ResmiGazeteDate').") + resmi_gazete_sayi: Optional[str] = Field("", description="Gazette no") + resmi_gazete_date: Optional[str] = Field("", description="Gazette date (DD.MM.YYYY)") # Detailed text search fields from the "icerikDetail" section of the form - tumce: Optional[str] = Field("", description="Exact phrase search ('Tumce').") - wild_card: Optional[str] = Field("", description="Search for phrase and its inflections ('WildCard').") # Changed from WildCard for Pythonic name - hepsi: Optional[str] = Field("", description="Search for texts containing all specified words ('Hepsi').") - herhangi_birisi: Optional[str] = Field("", description="Search for texts containing any of the specified words ('Herhangibirisi').") - not_hepsi: Optional[str] = Field("", description="Exclude texts containing these specified words ('NotHepsi').") + tumce: Optional[str] = Field("", description="Exact phrase") + wild_card: Optional[str] = Field("", description="Wildcard search") + hepsi: Optional[str] = Field("", description="All words") + herhangi_birisi: Optional[str] = Field("", description="Any word") + not_hepsi: Optional[str] = Field("", description="Exclude words") class UyusmazlikApiDecisionEntry(BaseModel): """Model for an individual decision entry parsed from Uyuşmazlık API's HTML search response.""" @@ -71,9 +71,9 @@ class UyusmazlikApiDecisionEntry(BaseModel): bolum: Optional[str] = Field(None) uyusmazlik_konusu: Optional[str] = Field(None) karar_sonucu: Optional[str] = Field(None) - popover_content: Optional[str] = Field(None, description="Summary/description from popover.") + popover_content: Optional[str] = Field(None, description="Summary") document_url: HttpUrl # Full URL to the decision document HTML page - pdf_url: Optional[HttpUrl] = Field(None, description="Direct URL to PDF if available.") + pdf_url: Optional[HttpUrl] = Field(None, description="PDF URL") class UyusmazlikSearchResponse(BaseModel): # This is what the MCP tool will return """Response model for Uyuşmazlık Mahkemesi search results for the MCP tool.""" diff --git a/yargitay_mcp_module/models.py b/yargitay_mcp_module/models.py index 817f1c7..372f2f2 100644 --- a/yargitay_mcp_module/models.py +++ b/yargitay_mcp_module/models.py @@ -34,86 +34,41 @@ class YargitayDetailedSearchRequest(BaseModel): to Yargitay's detailed search endpoint (e.g., /aramadetaylist). Based on the payload provided by the user. """ - arananKelime: Optional[str] = Field("", description="""Keyword to search for with advanced operators support: - • Simple words: 'arsa payı' (OR logic - finds documents with ANY word) - • Exact phrases: '"arsa payı"' (finds exact phrase) - • AND logic: 'arsa+payı' (both words required) - • Wildcards: 'bozma*' (matches bozma, bozması, bozmanın, etc.) - • Multiple required: '+"arsa payı" +"bozma sebebi"' - • Exclusion: '+"arsa payı" -"inşaat sözleşmesi"' - Examples: arsa payı | "arsa payı" | +"mülkiyet hakkı" +"bozma sebebi" | hukuk*""") + arananKelime: Optional[str] = Field("", description="Turkish keywords (supports +word -word \"phrase\" operators)") # Department/Board selection - Complete Court of Cassation chamber hierarchy - birimYrgKurulDaire: Optional[str] = Field("ALL", description=""" - Court of Cassation (Yargıtay) chamber/board selection. Options include: - - 'ALL' for all chambers - - Civil: 'Civil General Assembly (Hukuk Genel Kurulu)', '1st Civil Chamber (1. Hukuk Dairesi)' through '23rd Civil Chamber (23. Hukuk Dairesi)', 'Civil Chambers Presidents Board (Hukuk Daireleri Başkanlar Kurulu)' - - Criminal: 'Criminal General Assembly (Ceza Genel Kurulu)', '1st Criminal Chamber (1. Ceza Dairesi)' through '23rd Criminal Chamber (23. Ceza Dairesi)', 'Criminal Chambers Presidents Board (Ceza Daireleri Başkanlar Kurulu)' - - General: 'Grand General Assembly (Büyük Genel Kurulu)' - Total: 52 possible values (including 'ALL' for all chambers) - """) - birimYrgHukukDaire: Optional[str] = Field("", description="Legacy field - use birimYrgKurulDaire instead for chamber selection") - birimYrgCezaDaire: Optional[str] = Field("", description="Legacy field - use birimYrgKurulDaire instead for chamber selection") + birimYrgKurulDaire: Optional[str] = Field("ALL", description="Chamber (ALL or specific chamber name)") + birimYrgHukukDaire: Optional[str] = Field("", description="Legacy field") + birimYrgCezaDaire: Optional[str] = Field("", description="Legacy field") - esasYil: Optional[str] = Field("", description="""Case year for 'Esas No' filtering. - Format: YYYY (e.g., '2024') - Use with sequence numbers for precise case targeting""") - esasIlkSiraNo: Optional[str] = Field("", description="""Starting sequence number for 'Esas No' range filtering. - Format: numeric string (e.g., '1', '100') - Use with esasSonSiraNo for range: cases 100-200 in specified year""") - esasSonSiraNo: Optional[str] = Field("", description="""Ending sequence number for 'Esas No' range filtering. - Format: numeric string (e.g., '500', '1000') - Creates range from esasIlkSiraNo to this number""") + esasYil: Optional[str] = Field("", description="Case year (YYYY)") + esasIlkSiraNo: Optional[str] = Field("", description="Start case no") + esasSonSiraNo: Optional[str] = Field("", description="End case no") - kararYil: Optional[str] = Field("", description="""Decision year for 'Karar No' filtering. - Format: YYYY (e.g., '2024') - Filters decisions by the year they were issued""") - kararIlkSiraNo: Optional[str] = Field("", description="""Starting sequence number for 'Karar No' range filtering. - Format: numeric string (e.g., '1', '50') - Use with kararSonSiraNo for decision number ranges""") - kararSonSiraNo: Optional[str] = Field("", description="""Ending sequence number for 'Karar No' range filtering. - Format: numeric string (e.g., '100', '500') - Creates range from kararIlkSiraNo to this number""") + kararYil: Optional[str] = Field("", description="Decision year (YYYY)") + kararIlkSiraNo: Optional[str] = Field("", description="Start decision no") + kararSonSiraNo: Optional[str] = Field("", description="End decision no") - baslangicTarihi: Optional[str] = Field("", description="""Start date for decision search. - Format: DD.MM.YYYY (e.g., '01.01.2024') - Use with bitisTarihi for date range filtering - Examples: '01.01.2024', '15.06.2023'""") - bitisTarihi: Optional[str] = Field("", description="""End date for decision search. - Format: DD.MM.YYYY (e.g., '31.12.2024') - Creates date range from baslangicTarihi to this date - Examples: '31.12.2024', '30.06.2023'""") + baslangicTarihi: Optional[str] = Field("", description="Start date (DD.MM.YYYY)") + bitisTarihi: Optional[str] = Field("", description="End date (DD.MM.YYYY)") - siralama: Optional[str] = Field("3", description="""Sorting criteria for search results: - • '1': Esas No (Case Number) - sorts by case registration order - • '2': Karar No (Decision Number) - sorts by decision issuance order - • '3': Karar Tarihi (Decision Date) - sorts by chronological order [DEFAULT] - Recommended: Use '3' for most recent decisions first""") - siralamaDirection: Optional[str] = Field("desc", description="""Sorting direction for results: - • 'desc': Descending order (newest/highest first) [DEFAULT] - • 'asc': Ascending order (oldest/lowest first) - Most common: 'desc' for latest decisions first""") + siralama: Optional[str] = Field("3", description="Sort by (1=case, 2=decision, 3=date)") + siralamaDirection: Optional[str] = Field("desc", description="Direction (asc/desc)") - pageSize: int = Field(10, ge=1, le=100, description="""Number of results per page. - Range: 1-100 results per page - Recommended: 10-50 for balanced performance and coverage - Large values (50-100) for comprehensive analysis""") - pageNumber: int = Field(1, ge=1, description="""Page number to retrieve (1-indexed). - Start with 1 for first page - Use with pageSize to navigate through large result sets - Example: pageSize=50, pageNumber=3 gets results 101-150""") + pageSize: int = Field(10, ge=1, le=10, description="Results per page (1-100)") + pageNumber: int = Field(1, ge=1, description="Page number (1-indexed)") class YargitayApiDecisionEntry(BaseModel): """Model for an individual decision entry from the Yargitay API search response.""" id: str # Unique system ID of the decision - daire: Optional[str] = Field(None, description="The chamber (Daire) that made the decision.") - esasNo: Optional[str] = Field(None, alias="esasNo", description="Case registry number (Esas No).") - kararNo: Optional[str] = Field(None, alias="kararNo", description="Decision number (Karar No).") - kararTarihi: Optional[str] = Field(None, alias="kararTarihi", description="Date of the decision (Karar Tarihi).") - arananKelime: Optional[str] = Field(None, alias="arananKelime", description="Matched keyword (Aranan Kelime) in the search result item.") + daire: Optional[str] = Field(None, description="Chamber") + esasNo: Optional[str] = Field(None, alias="esasNo", description="Case no") + kararNo: Optional[str] = Field(None, alias="kararNo", description="Decision no") + kararTarihi: Optional[str] = Field(None, alias="kararTarihi", description="Date") + arananKelime: Optional[str] = Field(None, alias="arananKelime", description="Keyword") # 'index' and 'siraNo' from API response are not critical for MCP tool, so omitted for brevity # This field will be populated by the client after fetching the search list - document_url: Optional[HttpUrl] = Field(None, description="Direct URL (Belge URL) to the decision document.") + document_url: Optional[HttpUrl] = Field(None, description="Document URL") model_config = ConfigDict(populate_by_name=True) # To allow populating by alias from API response @@ -132,9 +87,9 @@ class YargitayApiSearchResponse(BaseModel): class YargitayDocumentMarkdown(BaseModel): """Model for a Yargitay decision document, containing only Markdown content.""" - id: str = Field(..., description="The unique ID (Belge Kimliği) of the document.") - markdown_content: Optional[str] = Field(None, description="The decision content (Karar İçeriği) converted to Markdown.") - source_url: HttpUrl = Field(..., description="The source URL (Kaynak URL) of the original document.") + id: str = Field(..., description="Document ID") + markdown_content: Optional[str] = Field(None, description="Content") + source_url: HttpUrl = Field(..., description="Source URL") class CompactYargitaySearchResult(BaseModel): """A more compact search result model for the MCP tool to return."""