MCP server pro ÚFAL MFF UK NLP nástroje (NameTag, MasKIT, UDPipe, PONK) — česká právní AI
Project description
ufal-mcp
MCP server obalující NLP nástroje ÚFAL MFF UK pro zpracování českých právních textů.
Co umí
| Tool | Backend | K čemu |
|---|---|---|
anonymize |
MasKIT | Pseudonymizace osobních údajů (jména, IČO, telefony, adresy, č.j., rodná čísla, data narození…) |
extract_entities |
NameTag 3 | Named Entity Recognition — osoby, instituce, firmy, geo, data |
analyze_morphology |
UDPipe | Tokenizace, lemmatizace, POS tagging, závislostní parse |
check_readability |
PONK | Analýza čitelnosti právních textů (ARI, Verb Distance, Activity, Lexical diversity) |
Instalace
Z PyPI (doporučeno):
pip install ufal-mcp
Nebo ze source:
git clone https://github.com/Buggy1111/ufal-mcp.git
cd ufal-mcp
pip install -e .
Registrace v Claude Code
claude mcp add ufal -s user -- ufal-mcp
Pokud máš binárku v jiném venv:
claude mcp add ufal -s user -- /cesta/k/.venv/bin/ufal-mcp
Poté Claude Code restartuj — nástroje budou dostupné jako:
mcp__ufal__anonymizemcp__ufal__extract_entitiesmcp__ufal__analyze_morphologymcp__ufal__check_readability
Použití
V Claude Code stačí napsat například:
Anonymizuj text z
PRICHOZI_POSTA/2026-03-02_odpoved_na_stiznost.mda vrať mi čistou verzi pro veřejný demo.
Vytáhni z dokumentu všechny osoby, soudy a č.j. — chystám matter intake pro
/litigation-legal:matter-intake.
Zlemmatizuj tenhle text a vyhoď mi všechny tvary slova "soud" — potřebuju fulltextové vyhledávání.
Projeď moje podání přes PONK — kolik vět má příliš dlouhých?
Licence
- Kód: MIT
- Modely (přes API): CC BY-NC-SA — NEKOMERČNÍ použití. Pro placené nasazení potřebuješ explicitní písemné svolení autorů (Jana Straková, Milan Straka).
Bezpečnost
- Vše posíláš na externí server ÚFAL (
quest.ms.mff.cuni.cz,lindat.mff.cuni.cz) - ÚFAL loguje: čas, velikost dat, konfigurace serveru, IP. Obsah neloguje (přes POST).
- Pro plně privátní variantu lze rozšířit o lokální self-host (UDPipe + NameTag mají modely ke stažení).
Známé limitace
Wrapper sám funguje deterministicky, ale upstream API mají několik dokumentovaných nedostatků. Pro každý je v této verzi přidaná detekce / warning:
| Limitace | Příčina | Co s tím |
|---|---|---|
Fragmentace názvů firem ("ZR Trade s.r.o." → MasKIT zachytí jen "ZR" a "s.r.o.", slovo "Trade" zůstane neanonymizované) |
MasKIT tokenizace | anonymize vrací warnings — NameTag cross-check najde celou entitu a upozorní, že MasKIT nepokryl celý název |
Římské číslice v názvech soudů ("MS Bratislava II" → "II" není anonymizováno) |
MasKIT regex pattern | Detekováno warningem (viz výše) |
| Soudci se neanonymizují | MasKIT záměrný whitelist | By-design — pokud potřebuješ anonymizovat soudce, použij extract_entities + manuální post-processing |
Slovenské tvary ("Tóthovej", "súd", "sa") — nižší přesnost než čeština |
NameTag i UDPipe trénované primárně na CZ | Funguje, ale očekávej občasné chyby morfologie a NER |
Generické placeholdery v MasKIT ("FABBR1", "IABBR1") bez typu entity |
MasKIT API | Tool anonymize má classify_types=True (default) — pomocí NameTag doplní type field do každého replacementu |
| NER nepokrývá: ID karty, řidičáky, pasy, čísla účtů, datovky, spisové značky | MasKIT roadmap (future updates) | Tyto údaje dohledat ručně před odesláním do veřejného sdílení |
Pro citlivá data: vždy zkontroluj warnings v odpovědi anonymize a anonymizovaný výstup ručně před zveřejněním. Wrapper je nástroj na první průchod, ne náhrada za lidskou kontrolu.
Použité API
POST https://lindat.mff.cuni.cz/services/nametag/api/recognizePOST https://lindat.mff.cuni.cz/services/udpipe/api/processPOST https://quest.ms.mff.cuni.cz/maskit/api/processPOST https://quest.ms.mff.cuni.cz/ponk/api/process
Vývoj
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
# Smoke test (volá živé ÚFAL API)
python test_live.py
Release proces
PyPI publish je automatický přes Trusted Publisher (OIDC).
Jednorázové nastavení (PyPI strana):
- Vytvořit balíček na https://pypi.org (nebo nechat workflow, ať ho vytvoří první run)
- PyPI → Account settings → Publishing → Add pending publisher:
- PyPI Project Name:
ufal-mcp - Owner:
Buggy1111 - Repository:
ufal-mcp - Workflow:
release.yml - Environment:
pypi
- PyPI Project Name:
Release nového releasu:
# Bump version v pyproject.toml a src/ufal_mcp/__init__.py
git commit -am "release: v0.X.0"
git tag v0.X.0
git push origin main --tags
GHA workflow release.yml automaticky postaví distribution, publishne na PyPI a vytvoří GitHub Release s artefakty.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ufal_mcp-0.2.1.tar.gz.
File metadata
- Download URL: ufal_mcp-0.2.1.tar.gz
- Upload date:
- Size: 11.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4cd0673c9ca00301d9ae45d38340f174219a1425295c620587447fad5ec78f2
|
|
| MD5 |
a961e8d65982f27fdde6b3063acd4c3c
|
|
| BLAKE2b-256 |
7349f468c5e9482a52ac7b50d7f8c272e625c66e5da0818d628713c0b93d36c1
|
Provenance
The following attestation bundles were made for ufal_mcp-0.2.1.tar.gz:
Publisher:
release.yml on Buggy1111/ufal-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ufal_mcp-0.2.1.tar.gz -
Subject digest:
b4cd0673c9ca00301d9ae45d38340f174219a1425295c620587447fad5ec78f2 - Sigstore transparency entry: 1539484223
- Sigstore integration time:
-
Permalink:
Buggy1111/ufal-mcp@f9c19e194fb804c25005d709d4f14835731b0352 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/Buggy1111
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f9c19e194fb804c25005d709d4f14835731b0352 -
Trigger Event:
push
-
Statement type:
File details
Details for the file ufal_mcp-0.2.1-py3-none-any.whl.
File metadata
- Download URL: ufal_mcp-0.2.1-py3-none-any.whl
- Upload date:
- Size: 12.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c107aa3a65bbe45e9f9c0de8233bb6cd21dd50b325dde9981c18c68b6d737cf
|
|
| MD5 |
4cde6145e0616161eb0c0f733558d673
|
|
| BLAKE2b-256 |
d6f1e1c5fb60927a9626331ef629612da1503d817205e8d61787473003e0fe12
|
Provenance
The following attestation bundles were made for ufal_mcp-0.2.1-py3-none-any.whl:
Publisher:
release.yml on Buggy1111/ufal-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ufal_mcp-0.2.1-py3-none-any.whl -
Subject digest:
6c107aa3a65bbe45e9f9c0de8233bb6cd21dd50b325dde9981c18c68b6d737cf - Sigstore transparency entry: 1539484279
- Sigstore integration time:
-
Permalink:
Buggy1111/ufal-mcp@f9c19e194fb804c25005d709d4f14835731b0352 -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/Buggy1111
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f9c19e194fb804c25005d709d4f14835731b0352 -
Trigger Event:
push
-
Statement type: