Kio Orzeczenia Mcp

io.github.matematicsolutions由 GitHub 账号 matematicsolutions 发布v0.4.5更新于 Oct 24, 2026

MCP server for Krajowa Izba Odwolawcza (KIO) rulings from orzeczenia.uzp.gov.pl.

概览

AI 生成的概览

本地 MCP 服务器,让助手检索波兰 UZP 数据库中 KIO 公共采购裁决,并获取带引用的全文。

可以做什么
按短语、案号、日期范围或 PZP 条款检索 KIO 判例,支持词形变化和分页,并可列出近期裁决或引用某条 PZP 条款的裁决。按案号或内部 ID 获取单份裁决的全文、当事人、判决主文和理由。获取 UZP 生成的裁决 PDF 链接,但不下载文件。查询连接器声明的覆盖范围和已知缺口,避免误判某裁决不存在。
适用场景
适合法律和公共采购场景:助手需要查找 KIO 裁决、了解某条 PZP 条款的裁判观点,或调取某份裁决并附上可核验的案号、链接和日期用于引用。该版本为概念验证,宜作探索性使用而非生产环境。
运行要求
以本地 Python 进程运行(PyPI 包 kio-orzeczenia-mcp,可通过 uvx 或 python -m 启动)。需要访问 UZP 公开判例网站的网络连接,该站通过 HTML 抓取而非官方 API。可选设置 KIO_MCP_RATE_LIMIT 和 KIO_MCP_CACHE_DIR 控制请求频率和缓存位置。未声明需要账号、API 密钥或请求头。
安装前请注意
它抓取政府公开网站且无官方 API,UZP 端改动可能导致失效,请求被限制在约每秒一次。工具调用会写入本地 JSONL 审计日志(仅案号和元数据,不含裁决全文)。裁决属参考资料而非法律渊源,解析器较浅,引用前应自行核实。在启用 Smart App Control 的 Windows 11 上,未签名的启动器可能被阻止。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Kio Orzeczenia Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

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

powershell
# Clone and enter the directorygit clone https://github.com/matematicsolutions/kio-orzeczenia-mcp.gitcd kio-orzeczenia-mcp
# Virtualenvpython -m venv .venv.\.venv\Scripts\Activate.ps1
# Installpip install -e ".[dev]"
# Offline test (signature parser)pytest tests/test_signature.py -v
# Smoke test (online - hits UZP, rate-limited 1 req/s)pytest tests/test_smoke.py -v -m smoke
# Run the server (stdio)python -m kio_orzeczenia_mcp.server

Wiring into Claude Code

Add to ~/.claude.json (or .mcp.json in the project):

json
{  "mcpServers": {    "kio-orzeczenia": {      "command": "python",      "args": ["-m", "kio_orzeczenia_mcp.server"],      "env": {        "KIO_MCP_RATE_LIMIT": "1.0",        "KIO_MCP_CACHE_DIR": "~/.matematic/cache/kio"      }    }  }}

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:

bash
python -m pip install kio-orzeczenia-mcppython -m kio_orzeczenia_mcp

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.

json
{ "mcpServers": { "kio-orzeczenia-mcp": { "command": "python", "args": ["-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.

jsonc
// Arguments:{  "phrase": "razaco niska cena",  "signature": null,  "date_from": "2024-01-01",  "date_to": "2024-12-31",  "pzp_article": "226",  "subject_index": null,  "inflection": true,  "page": 1,  "size": 20}

Returns {total, page, items: [OrzeczenieSummary]}.

2. kio_get_orzeczenie(signature_or_id: str | int) -> Orzeczenie

Fetches the full text of a single ruling.

jsonc
// Arguments:"KIO 2924/21"   // string -> first search by signature to resolve internal_id (+1 req)15903           // int -> directly GET /Home/Details/15903 + /Home/ContentHtml/15903

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.

jsonc
// Arguments:{ "days": 30, "limit": 20 }

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.

jsonc
// Arguments:{ "article": "art. 226 ust. 1 pkt 5", "limit": 20 }{ "article": "224 ust. 1", "limit": 50 }   // "art. " prefix added automatically

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.

jsonc
// Returns:{  "pdf_url": "https://orzeczenia.uzp.gov.pl/Home/PdfContent/15903?Kind=KIO",  "signature": "KIO 2924/21",  "internal_id": 15903,  "human_readable_citation": "Wyrok KIO z 2021-10-28, sygn. KIO 2924/21"}

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:

json
{  "phrase": "razaco niska cena",  "date_from": "2025-05-20",  "date_to": "2026-05-20",  "inflection": true,  "size": 50}

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:

json
{ "article": "226 ust. 1 pkt 5", "limit": 30 }

Example 3: "Ruling KIO 2924/21 - who were the parties and was the appeal upheld"

The agent calls kio_get_orzeczenie:

json
"KIO 2924/21"

Result: the full Orzeczenie with parties, sentence, reasoning.


Limitations (POC)

  1. Mapping signature -> internal_id requires a search - if you query by signature, we make +1 req
  2. Server-side PZP article filter is dictionary-based - Art matches 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
  3. PDF not fetched - only a link to the UZP page (product decision)
  4. The sentence/reasoning parser is shallow - in the POC we return content_text as plain text. Splitting into sections -> v1.0
  5. Rate limit 1 req/s - large lists may be slow. A 7-day cache for rulings (immutable) mitigates this.
  6. UZP serves a fixed 10 results per page - size > 10 is stitched client-side from consecutive pages, i.e. +1 request per extra page
  7. Scraping, not an API - UZP rebuilt the search engine in July 2026 and every endpoint moved (see DISCOVERY.md). Run pytest -m smoke after any UZP-side change; tests/test_parser_regression.py guards 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 SPARQL
  • mcp-isap - Journal of Laws, Monitor Polski, ministerial gazettes (Sejm ELI API)

External catalog of legal sources: worldwidelaw/legal-sources (bulk harvest scripts, MIT).

来源:README.md,提交 7456d13

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

3
  1. v0.4.5最新Oct 15, 2026
  2. v0.4.4Sep 24, 2026
  3. v0.4.3Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分