search_sayistay_unified
Search and retrieve audit decisions from the Turkish Court of Accounts (Sayıştay) across General Assembly, Appeals Board, and Chamber decisions with filtering by date, administration type, subject, and other criteria.
Instructions
Use this when searching Turkish Court of Accounts (Sayıştay) audit decisions. Supports Genel Kurul, Temyiz Kurulu, and Daire decisions.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| decision_type | Yes | Decision type: genel_kurul, temyiz_kurulu, or daire | |
| start | No | Starting record for pagination (0-based) | |
| length | No | Number of records per page (1-100) | |
| karar_tarih_baslangic | No | Start date (DD.MM.YYYY format) | |
| karar_tarih_bitis | No | End date (DD.MM.YYYY format) | |
| kamu_idaresi_turu | No | Public administration type filter | ALL |
| ilam_no | No | Audit report number (İlam No, max 50 chars) | |
| web_karar_konusu | No | Decision subject category filter | ALL |
| karar_no | No | Decision number (genel_kurul only) | |
| karar_ek | No | Decision appendix number (genel_kurul only) | |
| karar_tamami | No | Full text search (genel_kurul only) | |
| ilam_dairesi | No | Audit chamber selection (temyiz_kurulu only) | ALL |
| yili | No | Year (YYYY format, temyiz_kurulu only) | |
| dosya_no | No | File number (temyiz_kurulu only) | |
| temyiz_tutanak_no | No | Appeals board meeting minutes number (temyiz_kurulu only) | |
| temyiz_karar | No | Appeals decision text search (temyiz_kurulu only) | |
| yargilama_dairesi | No | Chamber selection (daire only) | ALL |
| hesap_yili | No | Account year (daire only) | |
| web_karar_metni | No | Decision text search (daire only) |
Implementation Reference
- Core handler logic for search_sayistay_unified tool: routes unified search requests to specific Sayistay decision type searches (genel_kurul, temyiz_kurulu, daire) and normalizes responses.async def search_unified(self, params: SayistayUnifiedSearchRequest) -> SayistayUnifiedSearchResult: """Unified search that routes to appropriate search method based on decision_type.""" if params.decision_type == "genel_kurul": # Convert to genel kurul request genel_kurul_params = GenelKurulSearchRequest( karar_no=params.karar_no, karar_ek=params.karar_ek, karar_tarih_baslangic=params.karar_tarih_baslangic, karar_tarih_bitis=params.karar_tarih_bitis, karar_tamami=params.karar_tamami, start=params.start, length=params.length ) result = await self.client.search_genel_kurul_decisions(genel_kurul_params) # Convert to unified format decisions_list = [decision.model_dump() for decision in result.decisions] return SayistayUnifiedSearchResult( decision_type="genel_kurul", decisions=decisions_list, total_records=result.total_records, total_filtered=result.total_filtered, draw=result.draw ) elif params.decision_type == "temyiz_kurulu": # Convert to temyiz kurulu request temyiz_params = TemyizKuruluSearchRequest( ilam_dairesi=params.ilam_dairesi, yili=params.yili, karar_tarih_baslangic=params.karar_tarih_baslangic, karar_tarih_bitis=params.karar_tarih_bitis, kamu_idaresi_turu=params.kamu_idaresi_turu, ilam_no=params.ilam_no, dosya_no=params.dosya_no, temyiz_tutanak_no=params.temyiz_tutanak_no, temyiz_karar=params.temyiz_karar, web_karar_konusu=params.web_karar_konusu, start=params.start, length=params.length ) result = await self.client.search_temyiz_kurulu_decisions(temyiz_params) # Convert to unified format decisions_list = [decision.model_dump() for decision in result.decisions] return SayistayUnifiedSearchResult( decision_type="temyiz_kurulu", decisions=decisions_list, total_records=result.total_records, total_filtered=result.total_filtered, draw=result.draw ) elif params.decision_type == "daire": # Convert to daire request daire_params = DaireSearchRequest( yargilama_dairesi=params.yargilama_dairesi, karar_tarih_baslangic=params.karar_tarih_baslangic, karar_tarih_bitis=params.karar_tarih_bitis, ilam_no=params.ilam_no, kamu_idaresi_turu=params.kamu_idaresi_turu, hesap_yili=params.hesap_yili, web_karar_konusu=params.web_karar_konusu, web_karar_metni=params.web_karar_metni, start=params.start, length=params.length ) result = await self.client.search_daire_decisions(daire_params) # Convert to unified format decisions_list = [decision.model_dump() for decision in result.decisions] return SayistayUnifiedSearchResult( decision_type="daire", decisions=decisions_list, total_records=result.total_records, total_filtered=result.total_filtered, draw=result.draw ) else: raise ValueError(f"Unsupported decision type: {params.decision_type}")
- Pydantic schemas for tool input (SayistayUnifiedSearchRequest) and output (SayistayUnifiedSearchResult), defining parameters for all Sayistay decision types with unified interface.class SayistayUnifiedSearchRequest(BaseModel): """Unified search request for all Sayıştay decision types.""" decision_type: Literal["genel_kurul", "temyiz_kurulu", "daire"] = Field(..., description="Decision type: genel_kurul, temyiz_kurulu, or daire") # Common pagination parameters start: int = Field(0, ge=0, description="Starting record for pagination (0-based)") length: int = Field(10, ge=1, le=100, description="Number of records per page (1-100)") # Common search parameters karar_tarih_baslangic: str = Field("", description="Start date (DD.MM.YYYY format)") karar_tarih_bitis: str = Field("", description="End date (DD.MM.YYYY format)") kamu_idaresi_turu: KamuIdaresiTuruEnum = Field("ALL", description="Public administration type filter") ilam_no: str = Field("", description="Audit report number (İlam No, max 50 chars)") web_karar_konusu: WebKararKonusuEnum = Field("ALL", description="Decision subject category filter") # Genel Kurul specific parameters (ignored for other types) karar_no: str = Field("", description="Decision number (genel_kurul only)") karar_ek: str = Field("", description="Decision appendix number (genel_kurul only)") karar_tamami: str = Field("", description="Full text search (genel_kurul only)") # Temyiz Kurulu specific parameters (ignored for other types) ilam_dairesi: DaireEnum = Field("ALL", description="Audit chamber selection (temyiz_kurulu only)") yili: str = Field("", description="Year (YYYY format, temyiz_kurulu only)") dosya_no: str = Field("", description="File number (temyiz_kurulu only)") temyiz_tutanak_no: str = Field("", description="Appeals board meeting minutes number (temyiz_kurulu only)") temyiz_karar: str = Field("", description="Appeals decision text search (temyiz_kurulu only)") # Daire specific parameters (ignored for other types) yargilama_dairesi: DaireEnum = Field("ALL", description="Chamber selection (daire only)") hesap_yili: str = Field("", description="Account year (daire only)") web_karar_metni: str = Field("", description="Decision text search (daire only)") class SayistayUnifiedSearchResult(BaseModel): """Unified search result containing decisions from any Sayıştay decision type.""" decision_type: Literal["genel_kurul", "temyiz_kurulu", "daire"] = Field(..., description="Type of decisions returned") decisions: List[Dict[str, Any]] = Field(default_factory=list, description="Decision list (structure varies by type)") total_records: int = Field(0, description="Total number of records found") total_filtered: int = Field(0, description="Number of records after filtering") draw: int = Field(1, description="DataTables draw counter")
- SayistayUnifiedClient class providing unified interface over SayistayApiClient, used by the tool handler.class SayistayUnifiedClient: """Unified client that handles all three Sayıştay decision types.""" def __init__(self, request_timeout: float = 60.0): self.client = SayistayApiClient(request_timeout) async def search_unified(self, params: SayistayUnifiedSearchRequest) -> SayistayUnifiedSearchResult: """Unified search that routes to appropriate search method based on decision_type.""" if params.decision_type == "genel_kurul": # Convert to genel kurul request genel_kurul_params = GenelKurulSearchRequest( karar_no=params.karar_no, karar_ek=params.karar_ek, karar_tarih_baslangic=params.karar_tarih_baslangic, karar_tarih_bitis=params.karar_tarih_bitis, karar_tamami=params.karar_tamami, start=params.start, length=params.length ) result = await self.client.search_genel_kurul_decisions(genel_kurul_params) # Convert to unified format decisions_list = [decision.model_dump() for decision in result.decisions] return SayistayUnifiedSearchResult( decision_type="genel_kurul", decisions=decisions_list, total_records=result.total_records, total_filtered=result.total_filtered, draw=result.draw ) elif params.decision_type == "temyiz_kurulu": # Convert to temyiz kurulu request temyiz_params = TemyizKuruluSearchRequest( ilam_dairesi=params.ilam_dairesi, yili=params.yili, karar_tarih_baslangic=params.karar_tarih_baslangic, karar_tarih_bitis=params.karar_tarih_bitis, kamu_idaresi_turu=params.kamu_idaresi_turu, ilam_no=params.ilam_no, dosya_no=params.dosya_no, temyiz_tutanak_no=params.temyiz_tutanak_no, temyiz_karar=params.temyiz_karar, web_karar_konusu=params.web_karar_konusu, start=params.start, length=params.length ) result = await self.client.search_temyiz_kurulu_decisions(temyiz_params) # Convert to unified format decisions_list = [decision.model_dump() for decision in result.decisions] return SayistayUnifiedSearchResult( decision_type="temyiz_kurulu", decisions=decisions_list, total_records=result.total_records, total_filtered=result.total_filtered, draw=result.draw ) elif params.decision_type == "daire": # Convert to daire request daire_params = DaireSearchRequest( yargilama_dairesi=params.yargilama_dairesi, karar_tarih_baslangic=params.karar_tarih_baslangic, karar_tarih_bitis=params.karar_tarih_bitis, ilam_no=params.ilam_no, kamu_idaresi_turu=params.kamu_idaresi_turu, hesap_yili=params.hesap_yili, web_karar_konusu=params.web_karar_konusu, web_karar_metni=params.web_karar_metni, start=params.start, length=params.length ) result = await self.client.search_daire_decisions(daire_params) # Convert to unified format decisions_list = [decision.model_dump() for decision in result.decisions] return SayistayUnifiedSearchResult( decision_type="daire", decisions=decisions_list, total_records=result.total_records, total_filtered=result.total_filtered, draw=result.draw ) else: raise ValueError(f"Unsupported decision type: {params.decision_type}") async def get_document_unified(self, decision_id: str, decision_type: str) -> SayistayUnifiedDocumentMarkdown: """Unified document retrieval for all Sayıştay decision types.""" # Use existing client method (decision_type is already a string) result = await self.client.get_document_as_markdown(decision_id, decision_type) return SayistayUnifiedDocumentMarkdown( decision_type=decision_type, decision_id=result.decision_id, source_url=result.source_url, document_data=result.model_dump(), markdown_content=result.markdown_content, error_message=result.error_message ) async def close_client_session(self):
- sayistay_mcp_module/client.py:28-28 (helper)Underlying SayistayApiClient class implementing low-level HTTP API calls to Sayistay website for each decision type search and document retrieval.class SayistayApiClient:
- mcp_auth/policy.py:180-180 (registration)Authorization policy registration for search_sayistay tools, confirming the tool name pattern used in the MCP server.engine.add_tool_scope_policy("search_sayistay.*", ["mcp:tools:read"])