Prompt-injection detector for untrusted text before it reaches an LLM (RU/EN). BYO lovec.tech key.
Runs on your machine from its package; the steps are below.
At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx lovec-mcp
MCP client config
{
"mcpServers": {
"lovec": {
"command": "uvx",
"args": [
"lovec-mcp"
]
}
}
}Локальный MCP-сервер поверх детектора промпт-инъекций lovec.tech.
Даёт агентам (Claude Desktop, Claude Code, любой MCP-клиент) тул check_prompt_injection —
проверка недоверенного текста (веб-страница, документ, результат тула, письмо) перед тем,
как отдать его в другую LLM.
Работает только с вашим собственным ключом — сервер сам ничего не хранит и не логирует, но проверяемый текст уходит в API lovec.tech для анализа. Это тонкий клиент поверх уже существующего API-ключа/баланса с сайта.
Из PyPI:
pip install lovec-mcp
# или без установки, через uv:
uvx lovec-mcp
Из исходников:
cd lovec-mcp
python3 -m venv .venv
./.venv/bin/pip install -e .
Ключ выпускается на lovec.tech
export LOVEC_KEY=aig_...
./.venv/bin/python server.py
export LOVEC_KEY=aig_...
./.venv/bin/python -c "
import asyncio, server
print(asyncio.run(server.check_prompt_injection('тестовый текст')))
"
Claude Desktop (claude_desktop_config.json) или Claude Code (.mcp.json) — один и тот же формат:
{
"mcpServers": {
"lovec": {
"command": "uvx",
"args": ["lovec-mcp"],
"env": { "LOVEC_KEY": "aig_..." }
}
}
}
Если ставили из исходников — вместо uvx укажите интерпретатор venv и путь к server.py:
{
"mcpServers": {
"lovec": {
"command": "/absolute/path/to/lovec-mcp/.venv/bin/python",
"args": ["/absolute/path/to/lovec-mcp/server.py"],
"env": { "LOVEC_KEY": "aig_..." }
}
}
}
Тул проверяет одну строку за вызов. Для целого корпуса (RAG, база документов) так не выйдет:
каждый вердикт садится в контекст агента, а API отвечает от секунд до минут. Поэтому цикл
вынесен в CLI lovec-scan, а агент читает готовую сводку.
export LOVEC_KEY=aig_...
lovec-scan ./docs --dry-run # сколько будет запросов (= списаний), ничего не отправляет
lovec-scan ./docs --out lovec-scan-out
Разбивает длинные документы на чанки ≤5000 символов, ходит в API конкурентно, пишет
results.jsonl построчно — прогон резюмируемый, повторный запуск дочитывает остаток.
Упавшие чанки считаются пробелом в покрытии, а не чистым результатом; на 402 (кончился
баланс) скан останавливается и помечает сводку как неполную.
На выходе summary.json: покрытие, доля флагов с 95% ДИ Уилсона по документам (не по чанкам —
чанки одного документа не независимы), гистограмма баллов, топ флагов с цитатами.
Дальше в MCP-клиенте вызываете prompt injection_scan_report — он подставляет сводку и
правила отчёта: не называть корпус чистым (ноль флагов — это верхняя граница, а не справка о
здоровье), не считать precision/recall на неразмеченном корпусе, показывать пробелы покрытия,
подавать флаги как очередь на разбор. Цитаты из корпуса помечены как недоверенные данные.
| Флаг | Зачем |
|---|---|
--jsonl FILE | читать документы из JSONL {id, text} вместо файлов |
--ext | какие расширения читать (по умолчанию .txt,.md,.markdown,.rst) |
--workers | конкурентность, по умолчанию 4 |
--threshold F | флажить по score >= F вместо вендорского is_injection |
--limit N | взять не больше N документов |
| Переменная | По умолчанию | Зачем |
|---|---|---|
LOVEC_KEY | — (обязательна) | ключ с lovec.tech |
LOVEC_BASE | https://lovec.tech | другой хост API |
LOVEC_TIMEOUT | 60 | потолок ожидания одного вызова, секунды |