Skip to main content
Glama
saidsurucu

Yargı MCP

by saidsurucu

search_sayistay_unified

Read-onlyIdempotent

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
NameRequiredDescriptionDefault
decision_typeYesDecision type: genel_kurul, temyiz_kurulu, or daire
startNoStarting record for pagination (0-based)
lengthNoNumber of records per page (1-100)
karar_tarih_baslangicNoStart date (DD.MM.YYYY format)
karar_tarih_bitisNoEnd date (DD.MM.YYYY format)
kamu_idaresi_turuNoPublic administration type filterALL
ilam_noNoAudit report number (İlam No, max 50 chars)
web_karar_konusuNoDecision subject category filterALL
karar_noNoDecision number (genel_kurul only)
karar_ekNoDecision appendix number (genel_kurul only)
karar_tamamiNoFull text search (genel_kurul only)
ilam_dairesiNoAudit chamber selection (temyiz_kurulu only)ALL
yiliNoYear (YYYY format, temyiz_kurulu only)
dosya_noNoFile number (temyiz_kurulu only)
temyiz_tutanak_noNoAppeals board meeting minutes number (temyiz_kurulu only)
temyiz_kararNoAppeals decision text search (temyiz_kurulu only)
yargilama_dairesiNoChamber selection (daire only)ALL
hesap_yiliNoAccount year (daire only)
web_karar_metniNoDecision text search (daire only)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

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):
  • Underlying SayistayApiClient class implementing low-level HTTP API calls to Sayistay website for each decision type search and document retrieval.
    class SayistayApiClient:
  • 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"])
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, openWorldHint, and idempotentHint, covering safety and idempotency. The description adds minimal behavioral context by mentioning the supported decision types, but does not disclose additional traits like rate limits, authentication needs, or pagination behavior. With annotations covering core aspects, a 3 is appropriate as the description adds some value but not rich behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise and front-loaded: a single sentence that directly states the tool's purpose and scope. Every word earns its place, with no redundant or vague language, making it efficient for quick understanding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (19 parameters, 100% schema coverage, annotations, and an output schema), the description is complete enough for a search tool. It specifies the domain and decision types, which is crucial context. However, it could slightly improve by hinting at the output format or result structure, though the output schema mitigates this gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema fully documents all 19 parameters. The description does not add any parameter-specific information beyond what the schema provides, such as explaining relationships between parameters or usage examples. Baseline 3 is correct when the schema handles all parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'searching Turkish Court of Accounts (Sayıştay) audit decisions.' It specifies the exact resource (audit decisions) and distinguishes itself from siblings by mentioning support for 'Genel Kurul, Temyiz Kurulu, and Daire decisions,' which is unique among the sibling tools focused on different legal domains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool: 'Use this when searching Turkish Court of Accounts (Sayıştay) audit decisions.' It implicitly distinguishes from siblings by specifying the domain (Sayıştay), but does not explicitly state when not to use it or name alternatives for similar searches in other domains, which prevents a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/saidsurucu/yargi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server