Context7
Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.
Description from the maker (original English)
Redacts PII/PHI from text before it reaches an LLM. Fail-closed, self-hosted, no egress.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
UMBRYN_ENGINE, UMBRYN_MIN_CONFIDENCE, UMBRYN_DETECTION_FLOORYou need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"umbryn": {
"command": "uvx",
"args": [
"umbryn-mcp"
],
"env": {
"UMBRYN_ENGINE": "your-value",
"UMBRYN_MIN_CONFIDENCE": "your-value",
"UMBRYN_DETECTION_FLOOR": "your-value"
}
}
}
}Run this in your terminal
claude mcp add umbryn --env UMBRYN_ENGINE=your-value --env UMBRYN_MIN_CONFIDENCE=your-value --env UMBRYN_DETECTION_FLOOR=your-value -- uvx umbryn-mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"umbryn": {
"command": "uvx",
"args": [
"umbryn-mcp"
],
"env": {
"UMBRYN_ENGINE": "your-value",
"UMBRYN_MIN_CONFIDENCE": "your-value",
"UMBRYN_DETECTION_FLOOR": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"umbryn": {
"type": "stdio",
"command": "uvx",
"args": [
"umbryn-mcp"
],
"env": {
"UMBRYN_ENGINE": "your-value",
"UMBRYN_MIN_CONFIDENCE": "your-value",
"UMBRYN_DETECTION_FLOOR": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
UMBRYN_ENGINE envUMBRYN_MIN_CONFIDENCE envUMBRYN_DETECTION_FLOOR envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026
The registry name was verified with the GitHub account Rinava, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
The registry does not list a required key, though some servers ask you to sign in on first use.
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.2.1) reached the registry 3 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.
In the same category: Context7, Codebase Memory, Exa
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
Feeds AI the latest docs for libraries and frameworks before it answers, so code it writes does not use outdated, removed functions.
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Connect AI agents to Exa for web search, content fetching, and multi-step research.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
An MCP server that redacts PII/PHI from text before it ever reaches an LLM — self-hosted, fail-closed, and HIPAA-aware.
Teams building LLM and agent pipelines in regulated domains have no clean, drop-in way to strip PHI/PII from a payload *before* it crosses into a model provider's infrastructure. umbryn-mcp is that boundary: three MCP tools — redact, restore, detect — that scrub sensitive values into reversible placeholders, run entirely inside infrastructure you control, and block the request if detection is uncertain instead of leaking data.
redact("Patient MRN: 1234567, provider NPI 1234567893, ssn 078-05-1120, john.doe@example.com")
redacted_text (safe to send to the model): "Patient MRN: [MEDICAL_RECORD_NUMBER_1], provider NPI [NPI_1], ssn [US_SSN_1], [EMAIL_ADDRESS_1]"
token_map (kept local, never sent to the model): [MEDICAL_RECORD_NUMBER_1] → 1234567 [NPI_1] → 1234567893 [US_SSN_1] → 078-05-1120 [EMAIL_ADDRESS_1] → john.doe@example.com
Send the redacted text to the model; keep the token_map local; call restore afterward to rehydrate the result. Round-trips are byte-exact and proven with property-based tests.
The PHI/PII-redaction MCP niche is real but underserved — the existing options are thin Presidio wrappers with no HIPAA-specific detection and, critically, no guarantee that a detection failure blocks the request instead of silently passing raw data through. So teams either roll their own boundary or ship sensitive data to a provider and lean on a BAA to cover it — the design-time mistake that causes real compliance incidents.
| Naive Presidio wrapper | Regex-in-your-app | Cloud DLP API | umbryn-mcp | |
|---|---|---|---|---|
| Drop-in MCP tools | sometimes | ❌ | ❌ | ✅ |
| Fail-closed on uncertain detection | ❌ | ❌ | ❌ | ✅ |
| HIPAA identifiers (NPI, DEA, MBI, MRN, CLIA) | ❌ | partial | partial | ✅ |
| Reversible (restore original) | rarely | DIY | some | ✅ |
| Runs self-hosted, zero egress | ✅ | ✅ | ❌ (sends data out) | ✅ |
| Works with zero heavy deps | ❌ (needs spaCy) | ✅ | n/a | ✅ (regex engine) |
| Optional ML NER (names, addresses) | ✅ | ❌ | ✅ | ✅ ([presidio] extra) |
Why it was built: MCP went mainstream fast — it's now first-class in Claude, Cursor, and ChatGPT, across thousands of servers — but the PHI/PII-redaction corner was left to a few unmaintained wrappers. This fills that gap with a single honest, auditable, fail-closed boundary, kept open source so the redaction logic you depend on is fully inspectable rather than a black box.
redact (→ scrubbed text + reversible token map), restore (→ original), detect (→ entities found, no mutation).pip install "umbryn-mcp[presidio]" adds Microsoft Presidio + spaCy for PERSON/LOCATION NER, transparently.restore(redact(x)) == x for *arbitrary* input; same input + config always yields the same output.Reach for `umbryn-mcp` when:
redact → send to model → restore.Reach for something else when:
pip install umbryn-mcp # zero heavy deps; runs immediately
Then register it with your MCP client.
Claude Desktop / Claude Code (claude_desktop_config.json, or claude mcp add umbryn-mcp -- umbryn-mcp):
{
"mcpServers": { "umbryn-mcp": { "command": "umbryn-mcp" } } }
Cursor (.cursor/mcp.json) and VS Code use the same shape — see examples/ for ready-to-paste configs.
Want name/address detection too?
pip install "umbryn-mcp[presidio]"
python -m spacy download en_core_web_lg
The server auto-detects Presidio and upgrades — no config change needed. (Set UMBRYN_ENGINE=regex to force the dependency-free engine, or =presidio to require the ML one.)
A tool call comes in over stdio; the Redactor core runs the configured detection engine, resolves overlaps deterministically, applies the fail-closed threshold check, and swaps detected spans for reversible typed placeholders. Only scrubbed text is meant to leave the boundary you run.
flowchart LR
A[MCP client Claude · Cursor · agent] -- redact / restore / detect --> B[umbryn-mcp stdio server] B --> C[Redactor core fail-closed · reversible] C --> D{Detection engine} D -->|default, zero deps| E[Regex + checksums] D -->|optional| F[Presidio + spaCy NER] C -. scrubbed text .-> A A -- scrubbed text only --> G[(LLM / downstream)]
The Redactor core depends only on a small DetectionEngine interface — never on Presidio or MCP directly. Raw data and the detection engine stay inside the boundary you run; only scrubbed text leaves it. See docs/ARCHITECTURE.md and docs/THREAT_MODEL.md.
redact(text) → { redacted_text, token_map, entities }Replaces detected PHI/PII with typed placeholders like [NPI_1]. token_map maps each placeholder back to its original value — keep it local; never send it to the model. entities lists what was redacted (type/span/score) for auditing.
restore(redacted_text, token_map) → { text }Reverses a redaction, recovering the original text exactly. Safe to call on model output that still contains the placeholders.
detect(text) → { entities, count }Reports the entities found — type, span, confidence — without modifying the text. Unlike redact, it surfaces low-confidence hits rather than blocking, so you can inspect coverage before trusting the boundary in a pipeline.
The pattern is redact → model → restore, with the token map never leaving your side:
redact(user_text). Send only redacted_text to the LLM. Keep token_map in your process — treat it as sensitively as the raw input, and never pass it to the model.[NPI_1], [US_SSN_1], etc. — semantically neutral tokens it can reason about and echo back.restore(model_output, token_map) to swap the real values back into the model's response before it reaches your user or database.redact returns a [LOW_CONFIDENCE] or [DETECTION_ERROR] tool error, the boundary refused to leak — surface it, tighten input, or lower the risk, but don't send the raw text onward.Before trusting it in a pipeline, call detect(sample_text) on representative (synthetic) data to see exactly what is and isn't caught, and tune the thresholds (below) to your risk tolerance.
Two thresholds govern every redact call:
0.35) — the sensitivity boundary. Signals below it are treated as noise.0.5) — the *trust* threshold.Any candidate that survives the floor but scores below `min_confidence` puts the call into fail-closed mode: it returns a [LOW_CONFIDENCE] error rather than redacting the confident spans and passing the uncertain one through. Engine errors return [DETECTION_ERROR]. On any error, no redacted text is returned. Both thresholds are configurable (see below).
All optional; sane defaults mean it runs with zero config. Set via the client's env block.
| Variable | Default | Meaning |
|---|---|---|
UMBRYN_ENGINE | auto | auto (Presidio if installed, else regex), regex, or presidio |
UMBRYN_MIN_CONFIDENCE | 0.5 | Trust threshold; detections below it fail closed |
UMBRYN_DETECTION_FLOOR | 0.35 | Below this, a signal is treated as noise |
UMBRYN_MAX_INPUT_CHARS | 100000 | Reject larger input with a typed error |
UMBRYN_SPACY_MODEL | en_core_web_lg | spaCy model for the Presidio engine |
UMBRYN_AUDIT_LOG | false | Emit a structured audit record per redact call (counts and types only) |
UMBRYN_CONFIG | *(unset)* | Path to a JSON config file (below) |
For settings that don't fit a flat environment variable, point UMBRYN_CONFIG at a JSON file. Environment variables still win over the file for the scalar values above, so you can ship one file and tweak per launch. A malformed file (bad JSON, unknown threshold, un-compilable regex) fails closed at startup rather than degrading silently.
{
// Per-entity trust thresholds override min_confidence for that type. "entity_thresholds": { "PHONE_NUMBER": 0.7, "IP_ADDRESS": 0.9 },
// Entity types to drop entirely — never detected, never redacted. // (A privacy trade-off you're opting into: a disabled type can leak.) "disabled_entities": ["URL"],
// Your own recognizers, no fork required. validator names a built-in // check-digit function (luhn, npi, dea, iban, nhs) — config supplies data, // never code. "recognizers": [ { "entity_type": "EMPLOYEE_ID", "regex": "\\bEMP-\\d{6}\\b", "base_score": 0.85, "context": ["employee", "badge"], "context_required": false } ],
"audit_log": true }
A ready-to-copy example lives at [`exampl
Only the beginning is shown; read the rest in the repo