ai-lawyer-agent/backend/mcp_server/tools/judges.py

77 lines
2.4 KiB
Python

# mcp_server/tools/judges.py
import httpx
import json
from fastmcp import FastMCP
from typing import Optional
from pydantic import Field
JUSTICE_API = "https://obcan.justice.sk/pilot/api/ress-isu-service"
HEADERS = {
"User-Agent": "Mozilla/5.0",
"Accept": "application/json",
"Accept-Language": "sk-SK,sk;q=0.9",
}
async def _get(path: str, params: dict) -> dict:
clean = {k: v for k, v in params.items() if v is not None}
async with httpx.AsyncClient(timeout=10.0) as client:
r = await client.get(
f"{JUSTICE_API}{path}",
params=clean,
headers=HEADERS
)
r.raise_for_status()
return r.json()
def register_judge_tools(mcp: FastMCP):
@mcp.tool()
async def judge_autocomplete(
query: str,
court_id: Optional[str] = None,
limit: int = Field(default=10, description="Maximálny počet výsledkov"),
) -> str:
"""
Autocomplete pre mená sudcov — použiť AKO PRVÝ krok
pri hľadaní sudcu podľa mena.
"""
result = await _get("/v1/sudca/autocomplete", {
"query": query,
"guidSud": court_id,
"limit": limit,
})
return json.dumps(result, ensure_ascii=False)
@mcp.tool()
async def judge_search(
query: Optional[str] = None,
kraj: Optional[str] = None,
court_id: Optional[str] = None,
status: Optional[str] = None,
page: int = Field(default=0, description="Číslo stránky (začína od 0)"),
size: int = Field(default=20, description="Počet výsledkov na stránku"),
) -> str:
"""
Vyhľadávanie sudcov s filtrami.
Používať ak autocomplete nevráti výsledky.
"""
result = await _get("/v1/sudca", {
"query": query,
"krajFacetFilter": kraj,
"guidSud": court_id,
"stavZapisuFacetFilter": status,
"page": page,
"size": size,
})
return json.dumps(result, ensure_ascii=False)
@mcp.tool()
async def judge_by_id(judge_id: str) -> str:
"""
Detailné informácie o konkrétnom sudcovi podľa ID.
judge_id: ID sudcu (napr. "sudca_42")
"""
if judge_id.isdigit():
judge_id = f"sudca_{judge_id}"
result = await _get(f"/v1/sudca/{judge_id}", {})
return json.dumps(result, ensure_ascii=False)