mloda-pii
mloda-pii is a Claude Code hook that replaces
identifiers (emails, phone numbers, IBANs, IP addresses, your own names and ID formats) in tool results with tokens
such as PII_EMAIL_ADDRESS_... before the model sees them. Detection runs on Microsoft Presidio, with no spaCy model. Your local tools and Claude's replies on your screen keep the real
values. Every token is a keyed HMAC-SHA256, computed through mloda. It guards
against accidental exposure and does not see everything the model gets; see Limits below.
The package also ships a mloda FeatureGroup that tokenizes a string column the same way, without a license key.
Setup
uv tool install "mloda-pii[hook,presidio]" # or pip install it into a virtualenv that stays in place
cd your-project
mloda-pii init # paste your invite when asked
Then restart Claude Code. On a terminal init asks for the invite with hidden input; scripts pass the invite file, -
for stdin, or the token itself. init creates the master key, stores and verifies the license, runs the hook once on a
test value, and only then registers it in .claude/settings.local.json. It also creates .mloda-pii/config.toml, kept
out of git: names ([deny]) and ID formats ([patterns]) to detect, and values to keep in clear ([allow], loopback
addresses by default; also the presets documentation and private_networks). Unknown entries are rejected. Running
init again is safe.
| Option | Effect |
|---|---|
--user |
Register in ~/.claude/settings.json, for every project. |
--project |
Register in the committed .claude/settings.json; every teammate installs mloda-pii and runs init --project. |
--mode local |
No license key, see below. |
--key-file <path> |
Import an existing master key instead of creating one. |
Ask for an invite at info@mloda.ai or via mloda.ai.
Modes
| Mode | License key | Needs |
|---|---|---|
licensed (default) |
Required. Without a valid license every gated event blocks: tool results are withheld, tool calls denied, prompts blocked. | An invite. |
local |
None. | An anonymizer-rs anonymizer binary on PATH or in ANONYMIZER_BINARY; ask at info@mloda.ai. |
Both modes give the same tokens from the same master key; there is no fallback between them.
Back up your master key
The master key lives in ~/.config/mloda-pii/master.key. Back it up: every token depends on it, and a lost key
changes all of them. init never overwrites an existing key.
Everyday commands
mloda-pii status: the key, the license and its expiry, where the hook is registered, the last events. Exits 1 when something is missing.mloda-pii uninstall: removes the hook entries (same--user/--projectflags).--purgealso deletes the master key and the stored license, after asking (--yesskips it).mloda-pii license install | status | remove: manage the license alone.mloda-pii stats: per-day counts from the audit log, which never holds values.
A prompt that contains raw identifiers is blocked and a pseudonymized copy is shown to resubmit.
| Variable | Effect |
|---|---|
MLODA_PII_KEY_FILE |
Master key file (default ~/.config/mloda-pii/master.key). |
MLODA_PII_CONFIG |
The project config (default .mloda-pii/config.toml). |
MLODA_PII_ENTITIES |
Presidio labels to detect (default EMAIL_ADDRESS,PHONE_NUMBER,IBAN_CODE,IP_ADDRESS). |
MLODA_PII_WRAP_BASH |
1 routes failed Bash output through the hook too. |
MLODA_PII_TOKEN_STYLE |
hex (default, PII_EMAIL_ADDRESS_<32 hex>) or readable (PII_EMAIL_ADDRESS_1, numbered per project). |
MLODA_PII_FAIL_CLOSED |
On by default. 0 lets an action pass when the hook itself fails; a license block always blocks. |
MLODA_PII_REVERSE_MCP |
1 also puts real values back into MCP tool input; a remote MCP server then receives them. |
MLODA_PII_AUDIT_LOG |
Audit log path (default ~/.local/state/mloda-pii/audit.jsonl); off disables it. |
MLODA_LICENSE_FILE, MLODA_LICENSE_KEY |
Take precedence over the stored license; init checks the one in use and self-tests with it. |
Command options: mloda-pii <command> --help.
The FeatureGroup
from mloda.user import Feature, Options
feature = Feature("email__pii_anonymized", Options(context={"pii_key_file_env": "KEY_FILE"}))
<column>__pii_anonymized returns the 64-hex keyed HMAC-SHA256 token of a string column. pii_key_file_env names the
environment variable that holds the path to the master key file. It needs the anonymizer-rs binary, like the local
mode.
Limits
- The hook guards against accidental exposure, not a model that tries to recover values: a Bash command gets the real value and can return it disguised, which detection misses.
- Hooks never see
@filementions, CLAUDE.md and memory files, the client's own reminders, images or compaction summaries; those reach the model unchanged. - A crashed or timed-out hook on a tool result lets the original output through.
- The values of one event sit in a private temporary Parquet file (under
$XDG_RUNTIME_DIR, else/dev/shm, else the temp dir) for the duration of the call. - The license gate is a speed bump: the local mode makes the same tokens without one, by design.
- Tokens are still personal data under GDPR; whoever holds the key can recompute them.
- The local vault under
~/.local/state/mloda-pii/(or$XDG_STATE_HOME) maps tokens back to raw values; nothing expires it, anduninstall --purgeleaves it in place.
License
mloda-pii is proprietary and source-available, under the mloda-pii License in the LICENSE file of the package. Use
in your daily work is permitted with a license key from mloda, also when the key is free, or in the local mode with an
anonymizer binary mloda provided. The license text is binding over this summary.
Related
- mloda: declarative data and feature access, the framework mloda-pii runs on.
- mloda-registry: plugins and guides for mloda.
Metadata
Release files for mloda-pii 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| mloda_pii-0.4.0.tar.gz | 53.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mloda_pii-0.4.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 113.2 kB
Release files / mloda_pii-0.4.0.tar.gz
| Download URL | mloda_pii-0.4.0.tar.gz |
|---|---|
| Size | 53.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0660f6afc52c5608189b0b98e0dd4b47bca0f4a24b185acd5158cf24f3820bb6
|
|
BLAKE2b-256 checksum How to use checksums |
74f042ecac058e3dbdb47373ae2c9990973a461981588e332da56ae13f28e66d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.22
|
Release files / mloda_pii-0.4.0-py3-none-any.whl
| Download URL | mloda_pii-0.4.0-py3-none-any.whl |
|---|---|
| Size | 59.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5a926358113883a329afc8f8def2d91ffd1f8211bba1f8295438bfb6ddab8e2b
|
|
BLAKE2b-256 checksum How to use checksums |
ab7c42d8415e6645397abfbd25fb1bf6485d369f23170d4732748b00f0d0ef42
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.22
|
Security for mloda-pii 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.