anonymize-mcp 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. anonymize_mcp-0.9.0/.gitignore +22 -0
  2. anonymize_mcp-0.9.0/LICENSE +30 -0
  3. anonymize_mcp-0.9.0/PKG-INFO +250 -0
  4. anonymize_mcp-0.9.0/README.md +213 -0
  5. anonymize_mcp-0.9.0/dev/ufal-mcp-stress-v076/README.md +44 -0
  6. anonymize_mcp-0.9.0/docs/journal/README.md +31 -0
  7. anonymize_mcp-0.9.0/pyproject.toml +94 -0
  8. anonymize_mcp-0.9.0/src/anonymize_mcp/__init__.py +3 -0
  9. anonymize_mcp-0.9.0/src/anonymize_mcp/http.py +109 -0
  10. anonymize_mcp-0.9.0/src/anonymize_mcp/korektor.py +65 -0
  11. anonymize_mcp-0.9.0/src/anonymize_mcp/langdetect.py +479 -0
  12. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit.py +452 -0
  13. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_audit.py +338 -0
  14. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_constants.py +159 -0
  15. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_normalize.py +171 -0
  16. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_parsing.py +147 -0
  17. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_patterns.py +1527 -0
  18. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_placeholders.py +265 -0
  19. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_postprocess.py +854 -0
  20. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_stoplist.py +75 -0
  21. anonymize_mcp-0.9.0/src/anonymize_mcp/maskit_strict.py +130 -0
  22. anonymize_mcp-0.9.0/src/anonymize_mcp/nametag.py +399 -0
  23. anonymize_mcp-0.9.0/src/anonymize_mcp/nametag_labels.py +76 -0
  24. anonymize_mcp-0.9.0/src/anonymize_mcp/ponk.py +244 -0
  25. anonymize_mcp-0.9.0/src/anonymize_mcp/server.py +380 -0
  26. anonymize_mcp-0.9.0/src/anonymize_mcp/translator.py +182 -0
  27. anonymize_mcp-0.9.0/src/anonymize_mcp/udpipe.py +225 -0
  28. anonymize_mcp-0.9.0/src/anonymize_mcp/validation.py +125 -0
@@ -0,0 +1,22 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ .venv/
5
+ venv/
6
+ build/
7
+ dist/
8
+ .pytest_cache/
9
+ .mypy_cache/
10
+ .ruff_cache/
11
+ .DS_Store
12
+ *.log
13
+
14
+ # Working documents (not part of distribution)
15
+ *.docx
16
+ *:Zone.Identifier
17
+
18
+ # Coverage artifacts
19
+ .coverage
20
+ .coverage.*
21
+ htmlcov/
22
+ coverage.xml
@@ -0,0 +1,30 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Michal Bürgermeister
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+
25
+ NOTE: This MIT license covers the wrapper code only.
26
+ The underlying ÚFAL MFF UK NLP models accessed via the REST APIs
27
+ (NameTag 3, MasKIT, PONK) are licensed under CC BY-NC-SA, which means
28
+ their results are limited to NON-COMMERCIAL use unless you obtain
29
+ explicit written permission from the model authors.
30
+ See https://lindat.mff.cuni.cz/en/terms-of-use for details.
@@ -0,0 +1,250 @@
1
+ Metadata-Version: 2.4
2
+ Name: anonymize-mcp
3
+ Version: 0.9.0
4
+ Summary: MCP server wrapping LINDAT NLP tools — production-grade anonymization, multilingual NER (33+ languages), UDPipe (961 models), Charles Translator (8 languages), PONK readability, Korektor spellcheck. Non-commercial use only.
5
+ Project-URL: Homepage, https://github.com/Buggy1111/anonymize-mcp
6
+ Project-URL: Repository, https://github.com/Buggy1111/anonymize-mcp
7
+ Project-URL: Issues, https://github.com/Buggy1111/anonymize-mcp/issues
8
+ Project-URL: LINDAT, https://lindat.mff.cuni.cz/
9
+ Author-email: Michal Bürgermeister <michalbugy12@gmail.com>
10
+ License: MIT
11
+ License-File: LICENSE
12
+ Keywords: anonymization,anthropic,claude,czech,legal-tech,lindat,maskit,mcp,model-context-protocol,nametag,ner,nlp,ponk,udpipe
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Legal Industry
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Natural Language :: Czech
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.10
21
+ Classifier: Programming Language :: Python :: 3.11
22
+ Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
25
+ Classifier: Topic :: Text Processing :: Linguistic
26
+ Requires-Python: >=3.10
27
+ Requires-Dist: httpx>=0.27.0
28
+ Requires-Dist: mcp>=1.2.0
29
+ Provides-Extra: test
30
+ Requires-Dist: anyio>=4; extra == 'test'
31
+ Requires-Dist: mypy>=1.11; extra == 'test'
32
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'test'
33
+ Requires-Dist: pytest-cov>=5; extra == 'test'
34
+ Requires-Dist: pytest>=8; extra == 'test'
35
+ Requires-Dist: ruff>=0.6; extra == 'test'
36
+ Description-Content-Type: text/markdown
37
+
38
+ # anonymize-mcp
39
+
40
+ <!-- mcp-name: io.github.Buggy1111/anonymize-mcp -->
41
+
42
+ [![CI](https://github.com/Buggy1111/anonymize-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/Buggy1111/anonymize-mcp/actions/workflows/ci.yml)
43
+ [![PyPI](https://img.shields.io/pypi/v/anonymize-mcp.svg)](https://pypi.org/project/anonymize-mcp/)
44
+ [![Python](https://img.shields.io/pypi/pyversions/anonymize-mcp.svg)](https://pypi.org/project/anonymize-mcp/)
45
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
46
+
47
+ MCP server obalující NLP nástroje [LINDAT](https://lindat.mff.cuni.cz/) / [ÚFAL MFF UK](https://ufal.mff.cuni.cz/) — **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.
48
+
49
+ > **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`.
50
+
51
+ > **Dříve `ufal-mcp`** — přejmenováno na žádost ÚFAL MFF UK (v0.8.0).
52
+
53
+ ## Co umí
54
+
55
+ | Tool | Backend | K čemu |
56
+ |------|---------|--------|
57
+ | `extract_entities` | [NameTag 3](https://ufal.mff.cuni.cz/nametag/3) | NER pro **CZ** (bohatý CNEC 2.0 tagset) + **34 dalších jazyků** (UNER PER/ORG/LOC) s auto-detekcí |
58
+ | `anonymize` | [MasKIT](https://ufal.mff.cuni.cz/maskit) | **Production-grade pseudonymizace** (v0.7.26): 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). |
59
+ | `analyze_morphology` | [UDPipe](https://ufal.mff.cuni.cz/udpipe) | Tokenizace, lemmatizace, POS tagging, závislostní parse — **auto-detect 35 jazyků** |
60
+ | `check_readability` | [PONK](https://ufal.mff.cuni.cz/ponk) | Čitelnost CZ — 4 feature sety: metrics + rules + lexical surprise + speech acts |
61
+ | `correct_text` | [Korektor](https://ufal.mff.cuni.cz/korektor) | CZ spell checker + auto-doplnění/odstranění diakritiky |
62
+ | `translate_text` | [Charles Translator](https://lindat.mff.cuni.cz/services/translation/) | Překlad mezi 8 jazyky (CZ/EN/FR/DE/PL/RU/UK/HI), 17 přímých párů + auto EN-pivot |
63
+
64
+ ### Podporované jazyky — NER + morfologie (35 jazyků, auto-detect)
65
+
66
+ - 🇨🇿 CZ · 🇸🇰 SK · 🇬🇧 EN · 🇩🇪 DE · 🇫🇷 FR · 🇮🇹 IT · 🇪🇸 ES · 🇵🇹 PT · 🇳🇱 NL
67
+ - 🇵🇱 PL · 🇭🇺 HU · 🇷🇴 RO · 🇸🇮 SL · 🇧🇬 BG · 🇬🇷 EL · 🇭🇷 HR · 🇷🇸 SR · 🇺🇦 UK · 🇷🇺 RU
68
+ - 🇫🇮 FI · 🇱🇹 LT · 🇱🇻 LV · 🇪🇪 ET · 🇩🇰 DA · 🇸🇪 SV · 🇳🇴 NO (Bokmål + Nynorsk)
69
+ - 🇨🇳 ZH · 🇦🇪 AR · 🇹🇷 TR · 🇻🇳 VI · 🇮🇳 HI · 🇮🇱 HE · 🇯🇵 JA · 🇰🇷 KO · 🇹🇭 TH
70
+
71
+ ## Pro koho je tohle (sektory + use cases)
72
+
73
+ 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):
74
+
75
+ | Sektor | Use case | PII které MCP zvládne |
76
+ |---|---|---|
77
+ | ⚖️ **Právo** | Anonymizace spisu před AI review, GDPR compliance | Jména, RČ, adresy, č.j., sp.zn., IBAN, OP, datovky |
78
+ | 🏥 **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é |
79
+ | 🎓 **Věda / akademie** | Peer review, citace v publikaci | ORCID, Researcher ID, e-maily kolegů, granty |
80
+ | 💳 **Bankovnictví** | Compliance, výpisy do AI, vykazování | Č.ú., karta, IBAN, VS/KS/SS, header výpisu |
81
+ | 🏠 **Reality / katastr** | Anonymizace výpisů z KN, smluv | LV, parcely, k.ú., vlastník + RČ + adresa |
82
+ | 🚗 **Pojišťovny** | Likvidace škod, AI analýza | VIN, SPZ, č. pojistky, TP, OP, RČ pojištěného |
83
+ | 📜 **Notáři** | Notářské zápisy pro AI summary | NZ, OP, datovka notáře, sp. zn. |
84
+ | 📚 **Studijní oddělení** | Potvrzení o studiu, statistika studentů | UČO, studijní č., ISIC, kontakty studenta |
85
+ | 🔬 **Výzkum / NGO** | Anonymizace korpusu pro etiku výzkumu | Vše výše + zachování klinických/právních kódů |
86
+
87
+ 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.**
88
+
89
+ ### Sektor #10 — International
90
+
91
+ | Use case | PII které MCP zvládne |
92
+ |---|---|
93
+ | 🌍 **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 |
94
+ | 💰 **Crypto/Web3 outreach, smart contracts** | Bitcoin (Legacy/P2SH/Bech32/Taproot), Ethereum, Monero, XRP, TRON |
95
+ | 🔐 **DevOps logs / API key leak detection** | OpenAI, Anthropic, OpenRouter, GitHub PAT, AWS, Google, Slack, Stripe tokeny |
96
+ | 🏢 **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í) |
97
+
98
+ ## Instalace
99
+
100
+ Z PyPI (doporučeno):
101
+
102
+ ```bash
103
+ pip install anonymize-mcp
104
+ ```
105
+
106
+ Nebo ze source:
107
+
108
+ ```bash
109
+ git clone https://github.com/Buggy1111/anonymize-mcp.git
110
+ cd anonymize-mcp
111
+ pip install -e .
112
+ ```
113
+
114
+ ## Registrace v MCP klientovi
115
+
116
+ anonymize-mcp je standardní [MCP](https://modelcontextprotocol.io) server (stdio transport). Po registraci a restartu klienta máš k dispozici 6 nástrojů:
117
+
118
+ - `mcp__anonymize__extract_entities` — multilingvální NER (35 jazyků auto-detect)
119
+ - `mcp__anonymize__anonymize` — production-grade pseudonymizace CZ (regex pre-pass + stop-list + placeholder mode)
120
+ - `mcp__anonymize__analyze_morphology` — morfologie 35 jazyků auto-detect (UDPipe 961 modelů)
121
+ - `mcp__anonymize__check_readability` — čitelnost CZ (4 feature sety)
122
+ - `mcp__anonymize__correct_text` — spell check + diakritika CZ
123
+ - `mcp__anonymize__translate_text` — překlad mezi 8 jazyky
124
+
125
+ ### Claude Code (terminál)
126
+
127
+ ```bash
128
+ claude mcp add anonymize -s user -- anonymize-mcp
129
+ ```
130
+
131
+ ### Claude Desktop
132
+
133
+ **Starší Claude Desktop** (Mac `.app` z anthropic.com, Windows `.exe` installer):
134
+
135
+ Edituj `~/Library/Application Support/Claude/claude_desktop_config.json` (Mac)
136
+ nebo `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
137
+
138
+ ```json
139
+ {
140
+ "mcpServers": {
141
+ "anonymize": {
142
+ "command": "anonymize-mcp"
143
+ }
144
+ }
145
+ }
146
+ ```
147
+
148
+ **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**.
149
+
150
+ > Na Windows může být `anonymize-mcp.exe` mimo PATH (typicky `C:\Python\Python3xx\Scripts\anonymize-mcp.exe`). V configu pak použij plnou cestu.
151
+
152
+ ### OpenAI Codex CLI _(autorem netestováno)_
153
+
154
+ Edituj `~/.codex/config.toml`:
155
+
156
+ ```toml
157
+ [mcp_servers.anonymize]
158
+ command = "anonymize-mcp"
159
+ ```
160
+
161
+ ### Cursor _(autorem netestováno)_
162
+
163
+ Edituj `.cursor/mcp.json` v projektu (nebo globálně `~/.cursor/mcp.json`):
164
+
165
+ ```json
166
+ {
167
+ "mcpServers": {
168
+ "anonymize": {
169
+ "command": "anonymize-mcp"
170
+ }
171
+ }
172
+ }
173
+ ```
174
+
175
+ ### Windsurf, Cline, Zed, VS Code Copilot Agent _(autorem netestováno)_
176
+
177
+ Stejný `mcpServers` JSON formát — viz dokumentace daného klienta. `command: "anonymize-mcp"` (případně absolutní cesta).
178
+
179
+ ## Použití
180
+
181
+ V Claude Code stačí napsat například:
182
+
183
+ > Anonymizuj text z `dokument.md` v placeholder_mode a vrať mi čistou verzi.
184
+
185
+ > Vytáhni z dokumentu všechny osoby, soudy a č.j.
186
+
187
+ > Klient přinesl ukrajinský dokument — přelož mi ho do češtiny, najdi entity a zanalyzuj morfologii.
188
+
189
+ > Projeď moje podání přes PONK — vrať aktivovaná gramatická pravidla.
190
+
191
+ > Klient mi posílá text bez diakritiky z mobilu — doplň diakritiku přes Korektor.
192
+
193
+ ## Autor
194
+
195
+ `anonymize-mcp` napsal **Michal Bürgermeister** ([@Buggy1111](https://github.com/Buggy1111), michalbugy12@gmail.com) — nezávislý vývojář z ČR.
196
+
197
+ 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.
198
+
199
+ Issues, PR a feedback jsou vítané na [github.com/Buggy1111/anonymize-mcp](https://github.com/Buggy1111/anonymize-mcp).
200
+
201
+ ## Licence
202
+
203
+ Tento nástroj má **MIT licenci** (viz `LICENSE`).
204
+
205
+ Pod ním jsou čtyři samostatné nástroje, každý s vlastní licencí:
206
+
207
+ | Komponenta | Autoři | Licence software | Licence modelů |
208
+ |------------|--------|------------------|----------------|
209
+ | **NameTag 3** | Jana Straková, Milan Straka | MPL 2.0 | **CC BY-NC-SA** (NON-commercial) |
210
+ | **UDPipe** | Milan Straka, Jana Straková | MPL 2.0 | **CC BY-NC-SA** (NON-commercial) |
211
+ | **MasKIT** | Jiří Mírovský, Barbora Hladká | MPL 2.0 | (rule-based) |
212
+ | **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) |
213
+
214
+ **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.
215
+
216
+ ## Bezpečnost
217
+
218
+ - **Vše posíláš 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řes `anonymize`.
219
+ - Pro plně privátní zpracování doporučuji **lokální self-host**: NameTag i UDPipe mají modely ke stažení (CC BY-NC-SA), MasKIT a PONK mají MPL 2.0 source.
220
+
221
+ ## Použité API (6 LINDAT REST endpointů)
222
+
223
+ - `POST https://lindat.mff.cuni.cz/services/nametag/api/recognize` — NER
224
+ - `POST https://lindat.mff.cuni.cz/services/udpipe/api/process` — morfologie
225
+ - `POST https://lindat.mff.cuni.cz/services/korektor/api/correct` — spell check
226
+ - `POST https://lindat.mff.cuni.cz/services/translation/api/v2/models/{src-tgt}` — překlad
227
+ - `POST https://quest.ms.mff.cuni.cz/maskit/api/process` — anonymizace
228
+ - `POST https://quest.ms.mff.cuni.cz/ponk/api/process` — čitelnost
229
+
230
+ ## Vývoj
231
+
232
+ ```bash
233
+ python3 -m venv .venv
234
+ source .venv/bin/activate
235
+ pip install -e .
236
+
237
+ # Smoke test (volá živé API)
238
+ python test_live.py
239
+ ```
240
+
241
+ ## Release proces
242
+
243
+ PyPI publish je automatický přes [Trusted Publisher (OIDC)](https://docs.pypi.org/trusted-publishers/).
244
+
245
+ ```bash
246
+ # Bump version v pyproject.toml a src/anonymize_mcp/__init__.py
247
+ git commit -am "release: v0.X.0"
248
+ git tag v0.X.0
249
+ git push origin main --tags
250
+ ```
@@ -0,0 +1,213 @@
1
+ # anonymize-mcp
2
+
3
+ <!-- mcp-name: io.github.Buggy1111/anonymize-mcp -->
4
+
5
+ [![CI](https://github.com/Buggy1111/anonymize-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/Buggy1111/anonymize-mcp/actions/workflows/ci.yml)
6
+ [![PyPI](https://img.shields.io/pypi/v/anonymize-mcp.svg)](https://pypi.org/project/anonymize-mcp/)
7
+ [![Python](https://img.shields.io/pypi/pyversions/anonymize-mcp.svg)](https://pypi.org/project/anonymize-mcp/)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
9
+
10
+ MCP server obalující NLP nástroje [LINDAT](https://lindat.mff.cuni.cz/) / [ÚFAL MFF UK](https://ufal.mff.cuni.cz/) — **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.
11
+
12
+ > **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`.
13
+
14
+ > **Dříve `ufal-mcp`** — přejmenováno na žádost ÚFAL MFF UK (v0.8.0).
15
+
16
+ ## Co umí
17
+
18
+ | Tool | Backend | K čemu |
19
+ |------|---------|--------|
20
+ | `extract_entities` | [NameTag 3](https://ufal.mff.cuni.cz/nametag/3) | NER pro **CZ** (bohatý CNEC 2.0 tagset) + **34 dalších jazyků** (UNER PER/ORG/LOC) s auto-detekcí |
21
+ | `anonymize` | [MasKIT](https://ufal.mff.cuni.cz/maskit) | **Production-grade pseudonymizace** (v0.7.26): 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). |
22
+ | `analyze_morphology` | [UDPipe](https://ufal.mff.cuni.cz/udpipe) | Tokenizace, lemmatizace, POS tagging, závislostní parse — **auto-detect 35 jazyků** |
23
+ | `check_readability` | [PONK](https://ufal.mff.cuni.cz/ponk) | Čitelnost CZ — 4 feature sety: metrics + rules + lexical surprise + speech acts |
24
+ | `correct_text` | [Korektor](https://ufal.mff.cuni.cz/korektor) | CZ spell checker + auto-doplnění/odstranění diakritiky |
25
+ | `translate_text` | [Charles Translator](https://lindat.mff.cuni.cz/services/translation/) | Překlad mezi 8 jazyky (CZ/EN/FR/DE/PL/RU/UK/HI), 17 přímých párů + auto EN-pivot |
26
+
27
+ ### Podporované jazyky — NER + morfologie (35 jazyků, auto-detect)
28
+
29
+ - 🇨🇿 CZ · 🇸🇰 SK · 🇬🇧 EN · 🇩🇪 DE · 🇫🇷 FR · 🇮🇹 IT · 🇪🇸 ES · 🇵🇹 PT · 🇳🇱 NL
30
+ - 🇵🇱 PL · 🇭🇺 HU · 🇷🇴 RO · 🇸🇮 SL · 🇧🇬 BG · 🇬🇷 EL · 🇭🇷 HR · 🇷🇸 SR · 🇺🇦 UK · 🇷🇺 RU
31
+ - 🇫🇮 FI · 🇱🇹 LT · 🇱🇻 LV · 🇪🇪 ET · 🇩🇰 DA · 🇸🇪 SV · 🇳🇴 NO (Bokmål + Nynorsk)
32
+ - 🇨🇳 ZH · 🇦🇪 AR · 🇹🇷 TR · 🇻🇳 VI · 🇮🇳 HI · 🇮🇱 HE · 🇯🇵 JA · 🇰🇷 KO · 🇹🇭 TH
33
+
34
+ ## Pro koho je tohle (sektory + use cases)
35
+
36
+ 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):
37
+
38
+ | Sektor | Use case | PII které MCP zvládne |
39
+ |---|---|---|
40
+ | ⚖️ **Právo** | Anonymizace spisu před AI review, GDPR compliance | Jména, RČ, adresy, č.j., sp.zn., IBAN, OP, datovky |
41
+ | 🏥 **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é |
42
+ | 🎓 **Věda / akademie** | Peer review, citace v publikaci | ORCID, Researcher ID, e-maily kolegů, granty |
43
+ | 💳 **Bankovnictví** | Compliance, výpisy do AI, vykazování | Č.ú., karta, IBAN, VS/KS/SS, header výpisu |
44
+ | 🏠 **Reality / katastr** | Anonymizace výpisů z KN, smluv | LV, parcely, k.ú., vlastník + RČ + adresa |
45
+ | 🚗 **Pojišťovny** | Likvidace škod, AI analýza | VIN, SPZ, č. pojistky, TP, OP, RČ pojištěného |
46
+ | 📜 **Notáři** | Notářské zápisy pro AI summary | NZ, OP, datovka notáře, sp. zn. |
47
+ | 📚 **Studijní oddělení** | Potvrzení o studiu, statistika studentů | UČO, studijní č., ISIC, kontakty studenta |
48
+ | 🔬 **Výzkum / NGO** | Anonymizace korpusu pro etiku výzkumu | Vše výše + zachování klinických/právních kódů |
49
+
50
+ 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.**
51
+
52
+ ### Sektor #10 — International
53
+
54
+ | Use case | PII které MCP zvládne |
55
+ |---|---|
56
+ | 🌍 **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 |
57
+ | 💰 **Crypto/Web3 outreach, smart contracts** | Bitcoin (Legacy/P2SH/Bech32/Taproot), Ethereum, Monero, XRP, TRON |
58
+ | 🔐 **DevOps logs / API key leak detection** | OpenAI, Anthropic, OpenRouter, GitHub PAT, AWS, Google, Slack, Stripe tokeny |
59
+ | 🏢 **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í) |
60
+
61
+ ## Instalace
62
+
63
+ Z PyPI (doporučeno):
64
+
65
+ ```bash
66
+ pip install anonymize-mcp
67
+ ```
68
+
69
+ Nebo ze source:
70
+
71
+ ```bash
72
+ git clone https://github.com/Buggy1111/anonymize-mcp.git
73
+ cd anonymize-mcp
74
+ pip install -e .
75
+ ```
76
+
77
+ ## Registrace v MCP klientovi
78
+
79
+ anonymize-mcp je standardní [MCP](https://modelcontextprotocol.io) server (stdio transport). Po registraci a restartu klienta máš k dispozici 6 nástrojů:
80
+
81
+ - `mcp__anonymize__extract_entities` — multilingvální NER (35 jazyků auto-detect)
82
+ - `mcp__anonymize__anonymize` — production-grade pseudonymizace CZ (regex pre-pass + stop-list + placeholder mode)
83
+ - `mcp__anonymize__analyze_morphology` — morfologie 35 jazyků auto-detect (UDPipe 961 modelů)
84
+ - `mcp__anonymize__check_readability` — čitelnost CZ (4 feature sety)
85
+ - `mcp__anonymize__correct_text` — spell check + diakritika CZ
86
+ - `mcp__anonymize__translate_text` — překlad mezi 8 jazyky
87
+
88
+ ### Claude Code (terminál)
89
+
90
+ ```bash
91
+ claude mcp add anonymize -s user -- anonymize-mcp
92
+ ```
93
+
94
+ ### Claude Desktop
95
+
96
+ **Starší Claude Desktop** (Mac `.app` z anthropic.com, Windows `.exe` installer):
97
+
98
+ Edituj `~/Library/Application Support/Claude/claude_desktop_config.json` (Mac)
99
+ nebo `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
100
+
101
+ ```json
102
+ {
103
+ "mcpServers": {
104
+ "anonymize": {
105
+ "command": "anonymize-mcp"
106
+ }
107
+ }
108
+ }
109
+ ```
110
+
111
+ **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**.
112
+
113
+ > Na Windows může být `anonymize-mcp.exe` mimo PATH (typicky `C:\Python\Python3xx\Scripts\anonymize-mcp.exe`). V configu pak použij plnou cestu.
114
+
115
+ ### OpenAI Codex CLI _(autorem netestováno)_
116
+
117
+ Edituj `~/.codex/config.toml`:
118
+
119
+ ```toml
120
+ [mcp_servers.anonymize]
121
+ command = "anonymize-mcp"
122
+ ```
123
+
124
+ ### Cursor _(autorem netestováno)_
125
+
126
+ Edituj `.cursor/mcp.json` v projektu (nebo globálně `~/.cursor/mcp.json`):
127
+
128
+ ```json
129
+ {
130
+ "mcpServers": {
131
+ "anonymize": {
132
+ "command": "anonymize-mcp"
133
+ }
134
+ }
135
+ }
136
+ ```
137
+
138
+ ### Windsurf, Cline, Zed, VS Code Copilot Agent _(autorem netestováno)_
139
+
140
+ Stejný `mcpServers` JSON formát — viz dokumentace daného klienta. `command: "anonymize-mcp"` (případně absolutní cesta).
141
+
142
+ ## Použití
143
+
144
+ V Claude Code stačí napsat například:
145
+
146
+ > Anonymizuj text z `dokument.md` v placeholder_mode a vrať mi čistou verzi.
147
+
148
+ > Vytáhni z dokumentu všechny osoby, soudy a č.j.
149
+
150
+ > Klient přinesl ukrajinský dokument — přelož mi ho do češtiny, najdi entity a zanalyzuj morfologii.
151
+
152
+ > Projeď moje podání přes PONK — vrať aktivovaná gramatická pravidla.
153
+
154
+ > Klient mi posílá text bez diakritiky z mobilu — doplň diakritiku přes Korektor.
155
+
156
+ ## Autor
157
+
158
+ `anonymize-mcp` napsal **Michal Bürgermeister** ([@Buggy1111](https://github.com/Buggy1111), michalbugy12@gmail.com) — nezávislý vývojář z ČR.
159
+
160
+ 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.
161
+
162
+ Issues, PR a feedback jsou vítané na [github.com/Buggy1111/anonymize-mcp](https://github.com/Buggy1111/anonymize-mcp).
163
+
164
+ ## Licence
165
+
166
+ Tento nástroj má **MIT licenci** (viz `LICENSE`).
167
+
168
+ Pod ním jsou čtyři samostatné nástroje, každý s vlastní licencí:
169
+
170
+ | Komponenta | Autoři | Licence software | Licence modelů |
171
+ |------------|--------|------------------|----------------|
172
+ | **NameTag 3** | Jana Straková, Milan Straka | MPL 2.0 | **CC BY-NC-SA** (NON-commercial) |
173
+ | **UDPipe** | Milan Straka, Jana Straková | MPL 2.0 | **CC BY-NC-SA** (NON-commercial) |
174
+ | **MasKIT** | Jiří Mírovský, Barbora Hladká | MPL 2.0 | (rule-based) |
175
+ | **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) |
176
+
177
+ **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.
178
+
179
+ ## Bezpečnost
180
+
181
+ - **Vše posíláš 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řes `anonymize`.
182
+ - Pro plně privátní zpracování doporučuji **lokální self-host**: NameTag i UDPipe mají modely ke stažení (CC BY-NC-SA), MasKIT a PONK mají MPL 2.0 source.
183
+
184
+ ## Použité API (6 LINDAT REST endpointů)
185
+
186
+ - `POST https://lindat.mff.cuni.cz/services/nametag/api/recognize` — NER
187
+ - `POST https://lindat.mff.cuni.cz/services/udpipe/api/process` — morfologie
188
+ - `POST https://lindat.mff.cuni.cz/services/korektor/api/correct` — spell check
189
+ - `POST https://lindat.mff.cuni.cz/services/translation/api/v2/models/{src-tgt}` — překlad
190
+ - `POST https://quest.ms.mff.cuni.cz/maskit/api/process` — anonymizace
191
+ - `POST https://quest.ms.mff.cuni.cz/ponk/api/process` — čitelnost
192
+
193
+ ## Vývoj
194
+
195
+ ```bash
196
+ python3 -m venv .venv
197
+ source .venv/bin/activate
198
+ pip install -e .
199
+
200
+ # Smoke test (volá živé API)
201
+ python test_live.py
202
+ ```
203
+
204
+ ## Release proces
205
+
206
+ PyPI publish je automatický přes [Trusted Publisher (OIDC)](https://docs.pypi.org/trusted-publishers/).
207
+
208
+ ```bash
209
+ # Bump version v pyproject.toml a src/anonymize_mcp/__init__.py
210
+ git commit -am "release: v0.X.0"
211
+ git tag v0.X.0
212
+ git push origin main --tags
213
+ ```
@@ -0,0 +1,44 @@
1
+ # ÚFAL MCP — Stress Test v0.7.6
2
+
3
+ Adversarial test suite pro `ufal-mcp` v0.7.5 → hledání bugů pro v0.7.6.
4
+ ÚFAL = Ústav formální a aplikované lingvistiky, **MFF UK / Univerzita Karlova v Praze**.
5
+
6
+ ## Cíl
7
+ Najít reprodukovatelné bugy napříč všemi 6 nástroji a zlepšit robustnost.
8
+
9
+ ## Nástroje pod testem
10
+ 1. `extract_entities` — NameTag 3 (CNEC 2.0 + UNER multilingual)
11
+ 2. `anonymize` — MasKIT + wrapper pipeline (8 kroků)
12
+ 3. `analyze_morphology` — UDPipe 2 (961 modelů)
13
+ 4. `check_readability` — PONK (4 feature sety)
14
+ 5. `correct_text` — Korektor (spellcheck / strict / diacritics / strip)
15
+ 6. `translate_text` — Charles Translator (8 jazyků, 17 párů)
16
+
17
+ ## Kategorie testů (A-I)
18
+ | ID | Název | Co testuje |
19
+ |---|---|---|
20
+ | A | Degenerate input | "", whitespace, emoji, single char, control chars |
21
+ | B | Size extrémy | 1B, 10KB, 100KB, 500KB+ (validation limit) |
22
+ | C | Encoding/Unicode | BOM, zero-width, RTL, kombinující znaky |
23
+ | D | Language mixing | CZ+SK+EN+DE+PL+UK code-switching |
24
+ | E | PII adversarial | RČ formáty, hybrid PII, OCR typos, fake PII |
25
+ | F | Domain stress | legal / medical / technical / social |
26
+ | G | Adversarial payload | HTML/JSON/XML v textu, placeholdery v inputu, prompt injection |
27
+ | H | Cross-tool / idempotence | `f(f(x))==f(x)`, translate round-trip |
28
+ | I | Concurrency | asyncio paralelní volání |
29
+
30
+ ## Použití
31
+ ```bash
32
+ # 1. Spustit celou matrici
33
+ python runner/run_stress.py
34
+
35
+ # 2. Spustit jen jednu kategorii
36
+ python runner/run_stress.py --category E
37
+
38
+ # 3. Spustit jen jeden nástroj
39
+ python runner/run_stress.py --tool anonymize
40
+ ```
41
+
42
+ Raw výstupy: `results/raw/`
43
+ Bug report: `results/BUGS-v076.md`
44
+ Demo report: `demo/stress-report.md`
@@ -0,0 +1,31 @@
1
+ # Development Journal — ufal-mcp
2
+
3
+ Den po dni: co se dělo, proč, co se z toho naučilo.
4
+
5
+ > Repo: <https://github.com/Buggy1111/ufal-mcp>
6
+ > PyPI: <https://pypi.org/project/ufal-mcp/>
7
+
8
+ ## Timeline
9
+
10
+ | Den | Verze | Hlavní téma |
11
+ |-----|-------|-------------|
12
+ | [2026-05-14](2026-05-14.md) | v0.1.0 → v0.3.1 | Initial release, 4 nástroje, refactor 6 modulů |
13
+ | [2026-05-15](2026-05-15.md) | (docs) | Per-tool license tabulka, Claude Desktop MS Store omezení |
14
+ | [2026-05-19](2026-05-19.md) | v0.3.3 | PONK podaplikace autoři (Mírovský feedback) |
15
+ | [2026-05-20](2026-05-20.md) | v0.4.0 → v0.7.4 | Multilingvální průlom (33 jazyků), Charles Translator, production-grade anonymizace pipeline |
16
+ | [2026-05-21](2026-05-21.md) | v0.7.5 → v0.7.7 | Stress test fixy, 9 sektorů + 11 jazyků, idempotence |
17
+ | [2026-05-22](2026-05-22.md) | v0.7.8 → v0.7.17 | Wikipedia stress, post-process layer, preserved acronyms |
18
+ | [2026-05-23](2026-05-23.md) | v0.7.18 → v0.7.26 | Production-grade push, MEGA international expansion, 179/179 PASS |
19
+
20
+ ## Final test coverage (v0.7.26)
21
+
22
+ ```
23
+ ✅ 86 unit tests (pytest)
24
+ ✅ 9 9-sektor synthetic regression
25
+ ✅ 29 mass corpus v2 (CZ reálné dokumenty)
26
+ ✅ 12 mass corpus v3 (CZ obskurní edge cases)
27
+ ✅ 17 mass corpus v4 (international)
28
+ ✅ 26 ÚFAL tool integration (6 tools × 6 lang × edge cases)
29
+ ─────────────────────────────────────────────────
30
+ 179 TOTAL PASS (100%)
31
+ ```