
Kio Orzeczenia Mcp
io.github.matematicsolutionsPublished by GitHub account matematicsolutionsv0.4.5Updated Oct 24, 2026
MCP server for Krajowa Izba Odwolawcza (KIO) rulings from orzeczenia.uzp.gov.pl.
Overview
Local MCP server that lets an assistant search Polish KIO public procurement rulings from the UZP database and retrieve full texts with citations.
- What you can do
- Search KIO case law by phrase, signature, date range or PZP article, with inflection and paging options, and list recent rulings or rulings citing a given PZP article. Fetch a single ruling's full text, parties, sentence and reasoning by signature or internal ID. Get a link to the UZP-rendered PDF of a ruling without downloading it. Check the connector's declared coverage and known gaps before concluding a ruling does not exist.
- When to use it
- Useful for legal and public procurement work where an assistant should find KIO rulings, check what the chamber decided on a PZP article, or pull a specific ruling with a verifiable signature, URL and date for citation. It is a proof-of-concept release, so treat it as exploratory rather than production-grade.
- Requirements
- Runs locally as a Python process (PyPI package kio-orzeczenia-mcp, started via uvx or python -m). Needs network access to the public UZP case law site, which it scrapes over HTML rather than an official API. Optional settings KIO_MCP_RATE_LIMIT and KIO_MCP_CACHE_DIR control request rate and cache location. No account, API key or header is declared.
Installation
In SourceWeft
- Open Kio Orzeczenia Mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
kio-orzeczenia-mcp
MCP server (Model Context Protocol) for the case law of the Krajowa Izba Odwolawcza (KIO) (National Appeals Chamber) at the Urzad Zamowien Publicznych (Public Procurement Office) - the public database orzeczenia.uzp.gov.pl.
It lets Claude / Cursor / VS Code MCP agents consume KIO rulings with verifiable citations (signature + URL + date).
Status: POC v0.1.0 | License: Apache-2.0 | Maintainer: MateMatic
Preliminary warning. The v0.1.0 connector is a proof-of-concept release. It fetches data from the public UZP case law database via HTML (no official REST API). Full legal disclaimer - see the "Legal disclaimer" section below. A dedicated smoke test and notification to UZP are required before production deployment.
What KIO is
The Krajowa Izba Odwolawcza (National Appeals Chamber) is an administrative (quasi-judicial) body operating at the Urzad Zamowien Publicznych (Public Procurement Office) - KIO members are independent when adjudicating (art. 471 PZP) - which hears appeals against contracting authorities' decisions in public procurement proceedings (the Act of 11 September 2019 - Public Procurement Law). KIO rulings are made publicly available by UZP under the Act on access to public information.
KIO rulings are not a source of law within the meaning of art. 87 of the Constitution of the Republic of Poland - they are reference material widely used in the practice of law firms dealing with public procurement.
Quickstart
Wiring into Claude Code
Add to ~/.claude.json (or .mcp.json in the project):
Restart Claude Code. After startup, 6 tools should be visible.
Windows 11 with Smart App Control
Smart App Control blocks unsigned executables, which covers uvx.exe, pip.exe
and the kio-orzeczenia-mcp.exe launcher that pip writes at install time. The python.exe and
py.exe from the python.org installer are signed by the Python Software
Foundation, so running the module through the interpreter works:
pip.exe is blocked for the same reason, so install with python -m pip, not
pip install. If python is not on PATH, use the Windows launcher: py -3 -m kio_orzeczenia_mcp.
Do not turn Smart App Control off to work around this - it cannot be re-enabled without reinstalling Windows.
6 MCP tools
1. kio_search(query: SearchQuery) -> SearchResult
Search over KIO case law. All fields optional.
Returns {total, page, items: [OrzeczenieSummary]}.
2. kio_get_orzeczenie(signature_or_id: str | int) -> Orzeczenie
Fetches the full text of a single ruling.
Returns the full Orzeczenie with content_text, sentence, reasoning (if the parser can extract them), pzp_articles, subject_index, doc_type, outcome, chamber_composition, parties.
issue_date may be null - UZP has no issue date for some older records. We do not substitute a placeholder date.
3. kio_recent(days: int = 30, limit: int = 20) -> list[OrzeczenieSummary]
The most recent rulings from the last N days, sorted by date descending.
4. kio_by_pzp_article(article: str, limit: int = 20) -> list[OrzeczenieSummary]
Rulings citing a specific PZP article. Uses the UZP server-side Art filter, which matches the provisions dictionary and is format-sensitive ("art. 226 ust. 1 pkt 5" hits, plain "226" does not). On an empty result the tool falls back to a full-text phrase search.
5. kio_get_pdf_url(signature_or_id: str | int) -> dict
Returns the URL to the PDF (rendered by UZP from .docx via Qt 4.8.7). Does not fetch bytes - we link to it.
6. kio_coverage() -> Coverage
Declares what this connector covers, where it comes from, and what it does NOT cover. Every gap carries a stable id and a fallback. Call it before telling a user a ruling "does not exist" - the absence may be a gap in this connector, not in KIO case law.
3 usage examples (natural language)
Example 1: "KIO rulings on abnormally low price from the past year"
The agent calls kio_search:
Result: a list of OrzeczenieSummary with human_readable_citation ready to insert into a court filing.
Example 2: "KIO rulings citing art. 226 sec. 1 point 5 PZP"
The agent calls kio_by_pzp_article:
Example 3: "Ruling KIO 2924/21 - who were the parties and was the appeal upheld"
The agent calls kio_get_orzeczenie:
Result: the full Orzeczenie with parties, sentence, reasoning.
Limitations (POC)
- Mapping signature -> internal_id requires a search - if you query by signature, we make +1 req
- Server-side PZP article filter is dictionary-based -
Artmatches entries of the UZP provisions dictionary, so the format matters ("art. 226 ust. 1 pkt 5", not"226"); on a miss we fall back to a phrase search, which is broader and needs verification - PDF not fetched - only a link to the UZP page (product decision)
- The sentence/reasoning parser is shallow - in the POC we return
content_textas plain text. Splitting into sections -> v1.0 - Rate limit 1 req/s - large lists may be slow. A 7-day cache for rulings (immutable) mitigates this.
- UZP serves a fixed 10 results per page -
size > 10is stitched client-side from consecutive pages, i.e. +1 request per extra page - Scraping, not an API - UZP rebuilt the search engine in July 2026 and every endpoint moved (see
DISCOVERY.md). Runpytest -m smokeafter any UZP-side change;tests/test_parser_regression.pyguards the parser offline.
Cache
- Rulings (immutable): 7 days
- Search result lists: 6 hours
- PZP dictionary (once implemented): 30 days
Cache location: ~/.matematic/cache/kio/ (configurable via KIO_MCP_CACHE_DIR).
Audit log
Location: ~/.matematic/audit/kio-orzeczenia-mcp.jsonl
JSONL format (one entry per tool call). See CONSTITUTION.md Art. 3.
What is NOT logged: the full text of a ruling (content_text, reasoning). We log only signatures and metadata.
Legal disclaimer
The data comes from the public UZP case law database (orzeczenia.uzp.gov.pl), made available under the Act of 6 September 2001 on access to public information and the Act of 11 September 2019 - Public Procurement Law.
The connector:
- does not modify the source data,
- does not de-anonymize the parties to a proceeding beyond what UZP publishes,
- does not circumvent any technical protections,
- identifies itself with the User-Agent header
matematic-kio-mcp/{version} (+https://matematic.co).
Pre-release blocker. Before publishing the repository on GitHub, a notification to UZP ([email protected]) about launching the connector is planned - User-Agent, query limit, nature of access. Status: TODO.
In case of objections from UZP or other parties - contact: [email protected].
License
Apache-2.0. See LICENSE.
Project constitution
See CONSTITUTION.md - 4 governance principles (public data, rate limit, audit log, citations).
Other open connectors for Polish law
Open-source connectors by MateMatic that complement the scope of this repository:
mcp-saos- SAOS (Supreme Court, Supreme Administrative Court, common courts)mcp-eu-sparql- EU law via Cellar SPARQLmcp-isap- Journal of Laws, Monitor Polski, ministerial gazettes (Sejm ELI API)
External catalog of legal sources: worldwidelaw/legal-sources (bulk harvest scripts, MIT).
Source: README.md at commit 7456d13
Tools
0Version history
3- v0.4.5LatestOct 15, 2026
- v0.4.4Sep 24, 2026
- v0.4.3Sep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts