phi-redact-mcp
umbryn-mcp
MCP-сервер, который удаляет PII/PHI из текста до того, как он попадёт в LLM — самохостинг, fail-closed и с учётом HIPAA.
Команды, строящие LLM- и агентные пайплайны в регулируемых областях, не имеют чистого, готового способа удалить PHI/PII из полезной нагрузки до того, как она пересечёт границу инфраструктуры провайдера модели. umbryn-mcp — это та самая граница: три MCP-инструмента — redact, restore, detect — которые заменяют чувствительные значения обратимыми плейсхолдерами, работают полностью внутри вашей инфраструктуры и блокируют запрос, если обнаружение неопределённо, вместо утечки данных.
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Отправьте отредактированный текст модели; храните token_map локально; затем вызовите restore, чтобы восстановить результат. Обратные преобразования побайтово точны и подтверждены property-based тестами.
Зачем это существует
Ниша MCP-редактирования PHI/PII реальна, но недостаточно обслуживается — существующие варианты представляют собой тонкие обёртки над Presidio без специфического для HIPAA обнаружения и, что критично, без гарантии, что сбой обнаружения заблокирует запрос, а не молча пропустит необработанные данные. Поэтому команды либо создают собственную границу, либо отправляют чувствительные данные провайдеру и полагаются на BAA, чтобы это покрыть — ошибка на этапе проектирования, которая приводит к реальным инцидентам с комплаенсом.
Наивная обёртка Presidio | Regex в вашем приложении | Cloud DLP API | umbryn-mcp | |
Готовые MCP-инструменты | иногда | ❌ | ❌ | ✅ |
Fail-closed при неопределённом обнаружении | ❌ | ❌ | ❌ | ✅ |
Идентификаторы HIPAA (NPI, DEA, MBI, MRN, CLIA) | ❌ | частично | частично | ✅ |
Обратимость (восстановление оригинала) | редко | DIY | некоторые | ✅ |
Самохостинг, нулевой исходящий трафик | ✅ | ✅ | ❌ (отправляет данные наружу) | ✅ |
Работает с нулевыми тяжёлыми зависимостями | ❌ (нужен spaCy) | ✅ | н/д | ✅ (regex-движок) |
Опциональный ML NER (имена, адреса) | ✅ | ❌ | ✅ | ✅ (доп. |
Почему это было создано: MCP быстро стал мейнстримом — теперь он первоклассный в Claude, Cursor и ChatGPT, среди тысяч серверов — но уголок редактирования PHI/PII остался на несколько неподдерживаемых обёрток. Это заполняет пробел единой честной, проверяемой, fail-closed границей, оставаясь открытым исходным кодом, чтобы логика редактирования, от которой вы зависите, была полностью инспектируемой, а не чёрным ящиком.
Related MCP server: pii-anonymizer
Возможности
Три инструмента, одна граница —
redact(→ очищенный текст + обратимая карта токенов),restore(→ оригинал),detect(→ найденные сущности, без изменений).Fail-closed по построению — если обнаружение выдаёт ошибку или любое обнаружение опускается ниже порога уверенности, вызов возвращает типизированную ошибку. Неопределённость блокирует; никогда не редактирует то, что может, и не пропускает остальное.
Обнаружение с учётом HIPAA — NPI и DEA с проверкой контрольной суммы, Medicare MBI с типизацией позиций, MRN с привязкой к контексту, лабораторные ID CLIA, плюс стандартные PII (email, телефон, SSN, кредитные карты, IBAN, IP, URL).
Нулевой исходящий трафик, самохостинг — движок по умолчанию — чистый regex + контрольные суммы, без сетевых вызовов и без тяжёлых зависимостей. Устанавливается везде, где есть Python.
Опциональное ML-обновление —
pip install "umbryn-mcp[presidio]"добавляет Microsoft Presidio + spaCy для NERPERSON/LOCATIONпрозрачно.Обратимо и детерминированно — защищённые от коллизий типизированные плейсхолдеры делают
restore(redact(x)) == xдля произвольного ввода; одинаковый ввод + конфигурация всегда дают одинаковый вывод.
Когда использовать (а когда нет)
Используйте umbryn-mcp, когда:
Вы отправляете медицинский, клинический, финансовый или пользовательский текст в сторонний LLM API и нужно держать PHI/PII вне инфраструктуры и логов этого провайдера.
Вы строите агентный или MCP-пайплайн в регулируемой области и хотите готовую границу очистки, которую подключаете одним вызовом инструмента.
Вам нужна обратимая редакция, чтобы последующие шаги работали:
redact→ отправить модели →restore.Вы хотите самохостинговый, без исходящего трафика детектор, который можно аудитировать построчно.
Вам нужны специфические для HIPAA идентификаторы (NPI, DEA, Medicare MBI, MRN, CLIA), а не только имена и email.
Используйте что-то другое, когда:
Вам нужна необратимая деидентификация / анонимизация (токенизация, k-анонимность) — здесь редакция обратима по замыслу.
Вам нужно редактировать не текстовые данные (изображения, аудио, PDF, строки БД) — область применения — текст.
Вы хотите сертифицированный комплаенс-продукт — это один технический контроль, а не программа комплаенса (см. Область применения и честные ограничения).
Вы хотите прозрачный прокси, который автоматически очищает всё в пути запроса — v1 — явные вызовы инструментов; режим прокси в дорожной карте.
Вам требуется гарантированный 100% recall — ни один детектор, включая этот, не может этого обещать.
Быстрый старт (< 60 секунд)
pip install umbryn-mcp # zero heavy deps; runs immediatelyЗатем зарегистрируйте его в вашем MCP-клиенте.
Claude Desktop / Claude Code (claude_desktop_config.json или claude mcp add umbryn-mcp -- umbryn-mcp):
{
"mcpServers": {
"umbryn-mcp": {
"command": "umbryn-mcp"
}
}
}Cursor (.cursor/mcp.json) и VS Code используют ту же форму — см. examples/ для готовых к вставке конфигов.
Хотите также обнаружение имён/адресов?
pip install "umbryn-mcp[presidio]"
python -m spacy download en_core_web_lgСервер автоматически обнаруживает Presidio и обновляется — изменений конфигурации не требуется. (Установите UMBRYN_ENGINE=regex, чтобы принудительно использовать движок без зависимостей, или =presidio, чтобы требовать ML-движок.)
Как это работает
Вызов инструмента приходит через stdio; ядро Redactor запускает настроенный движок обнаружения, детерминированно разрешает перекрытия, применяет проверку порога fail-closed и заменяет обнаруженные диапазоны обратимыми типизированными плейсхолдерами. Только очищенный текст должен покидать границу, которую вы запускаете.
flowchart LR
A[MCP client<br/>Claude · Cursor · agent] -- redact / restore / detect --> B[umbryn-mcp<br/>stdio server]
B --> C[Redactor core<br/>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)]Ядро Redactor зависит только от небольшого интерфейса DetectionEngine — никогда напрямую от Presidio или MCP. Необработанные данные и движок обнаружения остаются внутри границы, которую вы запускаете; только очищенный текст покидает её. См. docs/ARCHITECTURE.md и docs/THREAT_MODEL.md.
Инструменты
redact(text) → { redacted_text, token_map, entities }
Заменяет обнаруженные PHI/PII типизированными плейсхолдерами, например [NPI_1]. token_map сопоставляет каждый плейсхолдер с его исходным значением — храните его локально; никогда не отправляйте модели. entities перечисляет, что было отредактировано (тип/диапазон/оценка) для аудита.
restore(redacted_text, token_map) → { text }
Обращает редактирование, восстанавливая исходный текст точно. Безопасно вызывать на выходе модели, который всё ещё содержит плейсхолдеры.
detect(text) → { entities, count }
Сообщает найденные сущности — тип, диапазон, уверенность — без изменения текста. В отличие от redact, он показывает низкоуверенные совпадения, а не блокирует, чтобы вы могли проверить покрытие перед доверием границе в пайплайне.
Как использовать (реальный пайплайн)
Паттерн — redact → model → restore, при этом карта токенов никогда не покидает вашу сторону:
Очистите перед моделью. Вызовите
redact(user_text). Отправьте толькоredacted_textв LLM. Держитеtoken_mapв своём процессе — обращайтесь с ним так же чувствительно, как с исходным вводом, и никогда не передавайте модели.Пусть модель работает с плейсхолдерами. Она видит
[NPI_1],[US_SSN_1]и т.д. — семантически нейтральные токены, о которых она может рассуждать и которые может повторять.Восстановите после. Вызовите
restore(model_output, token_map), чтобы подставить реальные значения обратно в ответ модели, прежде чем он достигнет вашего пользователя или базы данных.Обработайте блокировку. Если
redactвозвращает ошибку инструмента[LOW_CONFIDENCE]или[DETECTION_ERROR], граница отказалась пропустить утечку — сообщите об этом, ужесточите ввод или снизьте риск, но не отправляйте необработанный текст дальше.
Прежде чем доверять пайплайну, вызовите detect(sample_text) на репрезентативных (синтетических) данных, чтобы увидеть, что именно ловится, а что нет, и настройте пороги (ниже) под свой уровень риска.
Fail-closed, точно
Два порога управляют каждым вызовом redact:
detection_floor(по умолчанию0.35) — граница чувствительности. Сигналы ниже неё считаются шумом.min_confidence(по умолчанию0.5) — порог доверия.
Любой кандидат, переживший пол, но набравший ниже min_confidence, переводит вызов в режим fail-closed: он возвращает ошибку [LOW_CONFIDENCE], а не редактирует уверенные диапазоны и пропускает неопределённый. Ошибки движка возвращают [DETECTION_ERROR]. При любой ошибке отредактированный текст не возвращается. Оба порога настраиваются (см. ниже).
Конфигурация
Всё опционально; разумные значения по умолчанию означают, что он работает без конфигурации. Задаётся через блок env клиента.
Переменная | По умолчанию | Значение |
|
|
|
|
| Порог доверия; обнаружения ниже него приводят к fail-closed |
|
| Ниже этого сигнал считается шумом |
|
| Отклонять больший ввод типизированной ошибкой |
|
| Модель spaCy для движка Presidio |
|
| Выдавать структурированную запись аудита на каждый вызов |
| (не задано) | Путь к JSON-файлу конфигурации (ниже) |
Файл конфигурации
Для настроек, которые не умещаются в плоскую переменную окружения, укажите UMBRYN_CONFIG на JSON-файл. Переменные окружения по-прежнему имеют приоритет над файлом для скалярных значений выше, так что вы можете поставить один файл и подстраивать под каждый запуск. Некорректный файл (плохой JSON, неизвестный порог, некомпилируемый regex) приводит к закрытому сбою при запуске, а не к молчаливой деградации.
{
// 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
}Готовый к копированию пример находится в examples/umbryn_config.json.
Покрытие сущностей
Сущность | Движок regex (по умолчанию) | Движок Presidio ( |
Электронная почта, Телефон, SSN, Кредитная карта, IP, URL | ✅ | ✅ |
NPI (контрольная цифра Luhn + 80840) | ✅ | ✅ |
DEA (контрольная цифра) | ✅ | ✅ |
Medicare MBI (с типизацией по позициям) | ✅ | ✅ |
MRN (с привязкой к контексту) | ✅ | ✅ |
Medicare HICN (SSN + код бенефициара) | ✅ | ✅ |
CLIA номер лаборатории | ✅ | ✅ |
ITIN США (структура диапазона 9XX) | ✅ | ✅ |
номер NHS Великобритании (проверка mod-11) | ✅ | ✅ |
канадский SIN (проверка Luhn) | ✅ | ✅ |
водительские права США (с привязкой к контексту) | ✅ | ✅ |
IBAN (проверка mod-97 / ISO 7064) | ✅ | ✅ |
Имена людей | ❌ | ✅ (spaCy NER) |
Адреса / местоположения | ❌ | ✅ (spaCy NER) |
Пользовательские распознаватели (ваш regex + контрольная цифра, через конфигурацию) | ✅ | ✅ |
Benchmark
Качество обнаружения измеряется, а не декларируется. Числа ниже получены на движке по умолчанию (без зависимостей) при оценке на синтетическом оценочном корпусе — 200 сгенерированных документов, ~1800 размеченных фрагментов, с похожими на настоящие идентификаторы значениями, не проходящими контрольную сумму, вкраплёнными как дистракторы для честной оценки точности. Воспроизвести их можно командой python eval/run_eval.py --markdown.
Entity | Precision | Recall | F1 | TP | FP | FN |
| 1.00 | 1.00 | 1.00 | 87 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 105 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 72 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 119 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 144 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 87 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 62 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 200 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 126 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 78 | 0 | 0 |
| 0.94 | 1.00 | 0.97 | 200 | 12 | 0 |
| 1.00 | 1.00 | 1.00 | 144 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 95 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 81 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 97 | 0 | 0 |
| 1.00 | 1.00 | 1.00 | 136 | 0 | 0 |
\* = идентификатор, значимый для HIPAA, подлежащий контролю качества CI. Совокупно по контролируемому набору: точность 0.99, полнота 1.00. Сборка не проходит контроль, если полнота падает ниже 0.90 или точность ниже 0.80. (12 ложных срабатываний NPI — это похожие 10-значные числа, которые проходят контрольную цифру Luhn/80840 — намеренный отказоустойчивый уклон в сторону избыточного редактирования.)
Это синтетические, наилучшие условия с чистой разметкой и окружающими контекстными словами; реальные тексты более запутанные. Относитесь к этому как к защитному барьеру регрессий и проверке здравомыслия, а не как к гарантии — всегда оценивайте на своих репрезентативных данных.
Область применения и честные ограничения
Этот инструмент снижает раскрытие PHI/PII на одной границе. Он не делает систему «соответствующей HIPAA». Соответствие — это свойство всей системы и организации — её политик, контрактов, контроля доступа, аудиторской позиции и людей, — а не какой-то отдельной библиотеки. Запуск umbryn-mcp может быть частью соответствующей архитектуры, но это не сертификация, не гарантия и не замена Соглашению с деловым партнёром, оценке рисков или юридической консультации.
Конкретно, этот проект не: гарантирует 100% обнаружение (ни один детектор не гарантирует), не деидентифицирует за пределами обратимой редакции, не охватывает нетекстовые данные и не действует как прозрачный прокси в v1 (редакция выполняется через явные вызовы инструментов, которые вы подключаете). Ни один детектор не идеален — оценивайте на своих репрезентативных данных, прежде чем полагаться на него. Полные границы, допущения и остаточные риски см. в docs/THREAT_MODEL.md, а о проблемах сообщайте в SECURITY.md.
Как внести вклад
Вклад очень приветствуется — это намеренно дружелюбное место для вашего первого PR в open-source, и мейнтейнер старается отвечать быстро.
Самый лёгкий ценный вклад: добавьте распознаватель для нового идентификатора (regex + опциональный валидатор контрольной цифры + тест). Форма issue add-a-recognizer одновременно служит спецификацией, а CONTRIBUTING.md описывает шесть шагов.
Другие хорошие способы помочь: улучшить документацию, добавить тестовые примеры или примеры конфигураций клиентов, или взять что-то из дорожной карты. Просмотрите хорошие первые задачи или откройте issue, чтобы предложить что-то своё.
git clone https://github.com/Rinava/umbryn-mcp && cd umbryn-mcp
pip install -e ".[dev]"
pytest # fast invariant suite (Presidio faked, sub-second)
ruff check . && mypy src/umbryn_mcp
python eval/run_eval.pyПолное руководство — настройка разработки, соглашения и правило «никаких реальных PHI в фикстурах» — находится в CONTRIBUTING.md. Внося вклад, вы соглашаетесь, что ваша работа лицензируется по MIT.
Лицензия
MIT — соответствует Presidio и максимизирует повторное использование. Создано с помощью Microsoft Presidio (опционально) и MCP Python SDK.
umbryn-mcp создан командой, стоящей за Kenda.
Available Tools
3 toolsdetectDetect PHI/PIIA
Report the PHI/PII entities found in text without modifying it.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to inspect |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of entities found |
| entities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It explicitly states 'without modifying it', which signals non-destructive behavior. However, it lacks details about output format, error handling, or what entities are considered PHI/PII, leaving some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence of 10 words that front-loads the key purpose. Every word earns its place, with no redundancy or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and an output schema (context signal), the description covers the core functionality and non-modifying behavior. It could mention expected output shape or limitations, but the presence of an output schema mitigates the need for extensive return value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear parameter description 'Text to inspect'. The description adds context about PHI/PII entities, but this aligns with the tool's purpose rather than enhancing parameter understanding. The schema already sufficiently explains the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports PHI/PII entities without modifying text. It distinguishes itself from sibling tools 'redact' and 'restore' by explicitly noting the non-modifying nature, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide explicit guidance on when to use this tool versus the sibling tools 'redact' and 'restore'. While the context implies detection is a prerequisite for redaction, no direct usage instructions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redactRedact PHI/PIIA
Replace PHI/PII in text with reversible typed placeholders.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to scrub |
Output Schema
| Name | Required | Description |
|---|---|---|
| entities | Yes | What was redacted, for auditing |
| token_map | Yes | placeholder -> original value; keep local, do NOT send to the model |
| redacted_text | Yes | Text with PHI/PII replaced by typed placeholders |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden. It discloses that redaction is reversible and uses typed placeholders, but does not elaborate on side effects, permission requirements, or output format details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that communicates the core functionality. It is front-loaded and free of superfluous content, though it could benefit from additional context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (one required parameter, output schema exists), the description provides sufficient context about the redaction operation and its reversible nature. It complements the siblings without needing extra details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with a clear 'text' parameter description. The tool description adds minimal extra meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action ('Replace'), the resource ('PHI/PII in text'), and the nature of the output ('reversible typed placeholders'). It effectively distinguishes from sibling tools 'detect' and 'restore' by implying the redaction step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus its siblings ('detect' for identification, 'restore' for reversal). It omits prerequisites, exclusions, or typical workflow context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restoreRestore redacted textB
Reverse a redaction using its token map, recovering the original text.
| Name | Required | Description | Default |
|---|---|---|---|
| token_map | Yes | placeholder -> original value | |
| redacted_text | Yes | Text containing placeholders |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | The rehydrated original text |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavioral traits. It only states the core function without mentioning side effects, required permissions, error cases, or behavior when token map is incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is clear and efficient, but it could be more structured with separate sections for purpose and usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given full schema coverage and an output schema, the description is adequate for a simple tool, but it lacks usage guidelines and behavioral transparency, which are gaps for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description reuses the schema descriptions for both parameters, adding no additional meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Reverse'), the resource ('a redaction'), and the method ('using its token map, recovering the original text'). This distinguishes it from sibling tools 'detect' and 'redact'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you have a redacted text and token map to restore, but it does not explicitly state when to use this tool versus alternatives, nor does it provide prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
detect - First observed
redact - First observed
restore
TDQS
Scored across 3 tools
Each tool has a distinct and non-overlapping purpose: detect finds entities, redact replaces them, and restore reverses the redaction. No ambiguity.
All tool names are single verbs (detect, redact, restore) following a consistent pattern, making them easily predictable.
Three tools exactly cover the full PHI redaction workflow (detect, redact, restore) without unnecessary extras or missing steps.
The tool set provides a complete pipeline: detection, redaction with reversible placeholders, and restoration. No obvious gaps for the stated purpose.
Maintenance
Related MCP Connectors
MCP server for detecting and redacting PII (Personally Identifiable Information) in PDF documents.
HealthGuard - 12-tool health/medical AI safety MCP: PII redaction, HIPAA, GDPR Art.9.
Stateless PII redaction over MCP/REST. Free ≤1000 words or $0.01/call; file upload supported.
Hosted MCP server exposing US hospital procedure cost data to AI assistants
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP proxy that pseudo-anonymizes PII before data reaches external AI providers like Claude, ChatGPT, or Gemini.18MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for automatic detection and redaction of PII in text, with anonymization and deanonymization capabilities, all local processing.1-
- AlicenseAqualityCmaintenanceMCP server and CLI for detecting, redacting, and auditing PHI in medical text before it is sent to AI agents, with tools for scan, redact, audit, and validate operations.4MIT
- AlicenseAqualityCmaintenanceMCP server and CLI for detecting, redacting, and auditing PHI in medical text before it reaches AI agents.4MIT