anonymize-mcp
<!-- mcp-name: io.github.Buggy1111/anonymize-mcp -->MCP server obalující NLP nástroje LINDAT / ÚFAL MFF UK — multilingvální NER + morfologie (35 jazyků auto-detect), production-grade anonymizace s 80+ PII patterny napříč 9 sektory + mezinárodním pokrytím (US/UK/DE/FR/IT/ES/PL/RU/IN, EU VAT 28 zemí, IBAN 30+ zemí, crypto, API tokeny), překlad mezi 8 jazyky (17 přímých párů + auto EN-pivot), čitelnost a korektura.
🔒 Nově (v0.10.0): zero-egress lokální mód — plně offline anonymizace, žádný text neopustí stroj. Pro GDPR / právní / zdravotnická data. Zapnutí:
ANONYMIZE_MCP_LOCAL=1.
🌐 Nechcete nic instalovat? Vyzkoušejte to online zdarma → anonymizace.js.org — anonymizace, NER, morfologie, korektor a překlad češtiny přímo v prohlížeči. Doprovodný web k tomuto MCP serveru.
Pouze pro nekomerční použití. Modely NameTag a UDPipe jsou pod CC BY-NC-SA. LINDAT API je bezplatné pro akademické a osobní použití. Pro komerční nasazení kontaktujte autory nástrojů a
ufal@ufal.mff.cuni.cz.
Neoficiální komunitní projekt — není provozován ani schválen ÚFAL MFF UK; wrapper kolem veřejných LINDAT API od nezávislého vývojáře. Historie názvů:
ufal-mcp→wrapper-mcp(v0.8.0, na žádost ÚFAL) →anonymize-mcp(v0.9.0). Pokud máte nainstalovaný deprecated balíčekwrapper-mcp, přejděte napip install anonymize-mcp— je to tentýž projekt.
Co umí
| Tool | Backend | K čemu |
|---|---|---|
extract_entities | NameTag 3 | NER pro CZ (bohatý CNEC 2.0 tagset) + 34 dalších jazyků (UNER PER/ORG/LOC) s auto-detekcí |
anonymize | MasKIT + NameTag | Production-grade pseudonymizace: regex pre-pass přes 80+ PII patternů — CZ + international (IBAN 30+ zemí, EU VAT 28, US SSN/EIN, DE/UK/FR/IT/ES/PL/RU/IN ID, crypto, API tokeny). Opt-in placeholder_mode (deterministické OSOBA1/MESTO1). 🔒 Zero-egress lokální mód (ANONYMIZE_MCP_LOCAL=1) — plně offline, viz níže. |
analyze_morphology | UDPipe | Tokenizace, lemmatizace, POS tagging, závislostní parse — auto-detect 35 jazyků |
check_readability | PONK | Čitelnost CZ — 4 feature sety: metrics + rules + lexical surprise + speech acts |
correct_text | Korektor | CZ spell checker + auto-doplnění/odstranění diakritiky |
translate_text | Charles Translator | Překlad mezi 8 jazyky (CZ/EN/FR/DE/PL/RU/UK/HI), 17 přímých párů + auto EN-pivot |
Podporované jazyky — NER + morfologie (35 jazyků, auto-detect)
- 🇨🇿 CZ · 🇸🇰 SK · 🇬🇧 EN · 🇩🇪 DE · 🇫🇷 FR · 🇮🇹 IT · 🇪🇸 ES · 🇵🇹 PT · 🇳🇱 NL
- 🇵🇱 PL · 🇭🇺 HU · 🇷🇴 RO · 🇸🇮 SL · 🇧🇬 BG · 🇬🇷 EL · 🇭🇷 HR · 🇷🇸 SR · 🇺🇦 UK · 🇷🇺 RU
- 🇫🇮 FI · 🇱🇹 LT · 🇱🇻 LV · 🇪🇪 ET · 🇩🇰 DA · 🇸🇪 SV · 🇳🇴 NO (Bokmål + Nynorsk)
- 🇨🇳 ZH · 🇦🇪 AR · 🇹🇷 TR · 🇻🇳 VI · 🇮🇳 HI · 🇮🇱 HE · 🇯🇵 JA · 🇰🇷 KO · 🇹🇭 TH
Pro koho je tohle (sektory + use cases)
Stress-tested napříč 9 sektory na 12.7KB cross-sektorovém spisu — výsledek 94/94 unique PII chyceno v jednom volání. Plus international corpus 17/17 (US/UK/DE/FR/IT/ES/PL/RU/IN + crypto + akademické + fleet):
| Sektor | Use case | PII které MCP zvládne |
|---|---|---|
| ⚖️ Právo | Anonymizace spisu před AI review, GDPR compliance | Jména, RČ, adresy, č.j., sp.zn., IBAN, OP, datovky |
| 🏥 Medicína | Propouštěcí zprávy pro výzkum, statistika hospitalizací | RČ, IČZ, č. pojištěnce, kontakty lékaře — klinické kódy MKN-10 zachované |
| 🎓 Věda / akademie | Peer review, citace v publikaci | ORCID, Researcher ID, e-maily kolegů, granty |
| 💳 Bankovnictví | Compliance, výpisy do AI, vykazování | Č.ú., karta, IBAN, VS/KS/SS, header výpisu |
| 🏠 Reality / katastr | Anonymizace výpisů z KN, smluv | LV, parcely, k.ú., vlastník + RČ + adresa |
| 🚗 Pojišťovny | Likvidace škod, AI analýza | VIN, SPZ, č. pojistky, TP, OP, RČ pojištěného |
| 📜 Notáři | Notářské zápisy pro AI summary | NZ, OP, datovka notáře, sp. zn. |
| 📚 Studijní oddělení | Potvrzení o studiu, statistika studentů | UČO, studijní č., ISIC, kontakty studenta |
| 🔬 Výzkum / NGO | Anonymizace korpusu pro etiku výzkumu | Vše výše + zachování klinických/právních kódů |
Plus 35 jazyků v multilingvální stack (legal docs SK/EN/DE/PL/UK/RU/FR/HI/ES/IT/AR + 24 dalších otestovány na NER+morfologii, auto EN-pivot pro překlad mimo přímé Charles páry). CJK jména (čínská/japonská) maskována od v0.8.4.
Sektor #10 — International
| Use case | PII které MCP zvládne |
|---|---|
| 🌍 US/UK/DE/FR/IT/ES/PL/RU/IN dokumenty | SSN, NIN, Steuer-ID, NIR, Codice Fiscale, DNI, PESEL, Aadhaar, PAN, cestovní pasy (8 jazyků) — auto bez lang= parametru |
| 💰 Crypto/Web3 outreach, smart contracts | Bitcoin (Legacy/P2SH/Bech32/Taproot), Ethereum, Monero, XRP, TRON |
| 🔐 DevOps logs / API key leak detection | OpenAI, Anthropic, OpenRouter, GitHub PAT, AWS, Google, Slack, Stripe tokeny |
| 🏢 Cross-border B2B | Foreign companies (SARL/SAS/GmbH/AG/Ltd/LLC/Inc/SpA/SL/Sp. z o.o.) + EU VAT (28 zemí) + IBAN (30+ zemí) |
Instalace
Z PyPI (doporučeno):
pip install anonymize-mcp
Nebo ze source:
git clone https://github.com/Buggy1111/anonymize-mcp.git
cd anonymize-mcp
pip install -e .
Registrace v MCP klientovi
anonymize-mcp je standardní MCP server (stdio transport). Po registraci a restartu klienta máš k dispozici 6 nástrojů:
mcp__anonymize__extract_entities— multilingvální NER (35 jazyků auto-detect)mcp__anonymize__anonymize— production-grade pseudonymizace CZ (regex pre-pass + stop-list + placeholder mode)mcp__anonymize__analyze_morphology— morfologie 35 jazyků auto-detect (UDPipe 961 modelů)mcp__anonymize__check_readability— čitelnost CZ (4 feature sety)mcp__anonymize__correct_text— spell check + diakritika CZmcp__anonymize__translate_text— překlad mezi 8 jazyky
Claude Code (terminál)
claude mcp add anonymize -s user -- anonymize-mcp
Claude Desktop
Starší Claude Desktop (Mac .app z anthropic.com, Windows .exe installer):
Edituj ~/Library/Application Support/Claude/claude_desktop_config.json (Mac)
nebo %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"anonymize": {
"command": "anonymize-mcp"
}
}
}
Nová Claude Desktop (Microsoft Store / appx package, "Cowork" UI): k 05/2026 podporuje pouze remote MCP servery přes HTTP URL. Lokální stdio MCP servery jako anonymize-mcp zde přidat nelze.
Na Windows může být
anonymize-mcp.exemimo PATH (typickyC:\Python\Python3xx\Scripts\anonymize-mcp.exe). V configu pak použij plnou cestu.
OpenAI Codex CLI (autorem netestováno)
Edituj ~/.codex/config.toml:
[mcp_servers.anonymize]
command = "anonymize-mcp"
Cursor (autorem netestováno)
Edituj .cursor/mcp.json v projektu (nebo globálně ~/.cursor/mcp.json):
{
"mcpServers": {
"anonymize": {
"command": "anonymize-mcp"
}
}
}
Windsurf, Cline, Zed, VS Code Copilot Agent (autorem netestováno)
Stejný mcpServers JSON formát — viz dokumentace daného klienta. command: "anonymize-mcp" (případně absolutní cesta).
Použití
V Claude Code stačí napsat například:
Anonymizuj text z
dokument.mdv placeholder_mode a vrať mi čistou verzi.
Vytáhni z dokumentu všechny osoby, soudy a č.j.
Klient přinesl ukrajinský dokument — přelož mi ho do češtiny, najdi entity a zanalyzuj morfologii.
Projeď moje podání přes PONK — vrať aktivovaná gramatická pravidla.
Klient mi posílá text bez diakritiky z mobilu — doplň diakritiku přes Korektor.
Autor
anonymize-mcp napsal Michal Bürgermeister (@Buggy1111, michalbugy12@gmail.com) — nezávislý vývojář z ČR.
Wrapper kolem skvělých nástrojů ÚFAL MFF UK — bez NameTag, MasKIT, UDPipe, PONK, Korektor a Charles Translator by tenhle MCP server neexistoval. Díky celému ÚFAL týmu (Jana Straková, Milan Straka, Jiří Mírovský, Barbora Hladká, Silvie Cinková a další) za roky práce na production-grade NLP nástrojích pro češtinu.
Issues, PR a feedback jsou vítané na github.com/Buggy1111/anonymize-mcp.
Licence
Tento nástroj má MIT licenci (viz LICENSE).
Pod ním jsou čtyři samostatné nástroje, každý s vlastní licencí:
| Komponenta | Autoři | Licence software | Licence modelů |
|---|---|---|---|
| NameTag 3 | Jana Straková, Milan Straka | MPL 2.0 | CC BY-NC-SA (NON-commercial) |
| UDPipe | Milan Straka, Jana Straková | MPL 2.0 | CC BY-NC-SA (NON-commercial) |
| MasKIT | Jiří Mírovský, Barbora Hladká | MPL 2.0 | (rule-based) |
| PONK | Jiří Mírovský, Silvie Cinková, Barbora Hladká + autoři podaplikací: Ivan Kraus, Arnold Stanovský, Jan Černý, Ivana Kvapilíková, Tomáš Polák, Silvie Cinková | MPL 2.0 | (rule-based + UDPipe → CC BY-NC-SA) |
Důležité: tento nástroj nevolá lokální instalaci, ale veřejné API služby (lindat.mff.cuni.cz, quest.ms.mff.cuni.cz). Bezplatné pro akademické a osobní použití. Hromadný / placený / produkční traffic vyžaduje explicitní souhlas autorů a provozovatele API.
Bezpečnost
- V cloudovém módu posíláš text na externí server (
quest.ms.mff.cuni.cz,lindat.mff.cuni.cz). Před odesláním citlivých dat nejdřív projeď text přesanonymize. - Pro plně privátní zpracování použij zero-egress lokální mód (níže) — žádný text neopustí tvůj stroj.
Zero-egress / on-prem mód 🔒
Anonymizace kompletně lokálně — žádné volání externího API, žádný text neopustí stroj. Pro GDPR / právní / zdravotnická data, kde citlivý obsah nesmí ven.
pip install "anonymize-mcp[local]" # přidá ufal.nametag (lokální NER)
python -m anonymize_mcp.local_backend # jednorázově stáhne model (~31 MB)
ANONYMIZE_MCP_LOCAL=1 anonymize-mcp # spusť server v lokálním módu
V Claude Code stačí přidat env proměnnou k registraci:
claude mcp add anonymize -s user -e ANONYMIZE_MCP_LOCAL=1 -- anonymize-mcp
Jak to funguje: anonymize přeskočí MasKIT API a anonymizuje přes lokální regex pre-pass (80+ vzorů) + NameTag NER běžící v procesu (ufal.nametag + CNEC 2.0 model). Jména, města, instituce, telefony, IČO, RČ, č.j. atd. se nahradí placeholdery (OSOBA1, MESTO1, TELEFON1…) bez jediného síťového volání.
Konfigurace (env):
| Proměnná | Význam |
|---|---|
ANONYMIZE_MCP_LOCAL=1 | Zapne zero-egress mód |
ANONYMIZE_MCP_NAMETAG_MODEL=/cesta/model.ner | Vlastní cesta k modelu (jinak auto-download do ~/.cache/anonymize-mcp/models/) |
ANONYMIZE_MCP_NO_DOWNLOAD=1 | Zakáže auto-download (model musíš dodat ručně) |
ANONYMIZE_MCP_LOCAL_ALLOW_CLOUD=1 | Vědomě povolí cloudové tooly i v lokálním módu (jinak odmítnuté, viz níže) |
Co je v lokálním módu lokální (v0.10.1): anonymize i extract_entities běží plně offline (lokální CNEC 2.0 NER; multilingvální model vyžaduje API, tool na to upozorní warningem). Ostatní tooly (translate_text, correct_text, check_readability, analyze_morphology) by text poslaly na ÚFAL API — proto jsou v zero-egress módu odmítnuté s vysvětlující chybou; vědomě je povolíš přes ANONYMIZE_MCP_LOCAL_ALLOW_CLOUD=1.
Hardened setup (air-gapped/auditované stroje): model si předstáhni předem (python -m anonymize_mcp.local_backend — ověřuje se SHA-256) a server nasaď s ANONYMIZE_MCP_NO_DOWNLOAD=1 — pak proces nikdy neotevře žádné síťové spojení.
Tradeoff: lokální NameTag 1 (CNEC 2.0, CC BY-NC-SA, non-commercial) je o něco jednodušší než cloudový NameTag 3 a vynechává MasKIT rule-engine — výměnou za nulový egress.
Použité API (6 LINDAT REST endpointů)
POST https://lindat.mff.cuni.cz/services/nametag/api/recognize— NERPOST https://lindat.mff.cuni.cz/services/udpipe/api/process— morfologiePOST https://lindat.mff.cuni.cz/services/korektor/api/correct— spell checkPOST https://lindat.mff.cuni.cz/services/translation/api/v2/models/{src-tgt}— překladPOST https://quest.ms.mff.cuni.cz/maskit/api/process— anonymizacePOST https://quest.ms.mff.cuni.cz/ponk/api/process— čitelnost
Vývoj
python3 -m venv .venv
source .venv/bin/activate
pip install -e .
# Testy (272 offline testů; síťové: pytest -m network)
pip install -e ".[test]"
pytest -m "not network"
Release proces
PyPI publish je automatický přes Trusted Publisher (OIDC).
# Bump version v pyproject.toml a src/anonymize_mcp/__init__.py
git commit -am "release: v0.X.0"
git tag v0.X.0
git push origin main --tags