Metadata-Version: 2.4
Name: lovec-mcp
Version: 0.1.2
Summary: Local MCP server for the lovec.tech prompt-injection detector
License-Expression: Apache-2.0
Project-URL: Homepage, https://github.com/lovec-tech/lovec-mcp
Project-URL: Repository, https://github.com/lovec-tech/lovec-mcp
Project-URL: Issues, https://github.com/lovec-tech/lovec-mcp/issues
Project-URL: API, https://lovec.tech
Keywords: mcp,prompt-injection,llm-security,ai-safety
Classifier: Intended Audience :: Developers
Classifier: Topic :: Security
Classifier: Natural Language :: Russian
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: mcp<3,>=2.1
Requires-Dist: httpx<1,>=0.27
Requires-Dist: pydantic<3,>=2
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == "dev"
Requires-Dist: pytest-asyncio>=0.24; extra == "dev"
Dynamic: license-file

# lovec-mcp

Локальный MCP-сервер поверх детектора промпт-инъекций [lovec.tech](https://lovec.tech).
Даёт агентам (Claude Desktop, Claude Code, любой MCP-клиент) тул `check_prompt_injection` —
проверка недоверенного текста (веб-страница, документ, результат тула, письмо) перед тем,
как отдать его в другую LLM.

Работает **только с вашим собственным ключом** — сервер сам ничего не хранит и не логирует,
но проверяемый текст уходит в API [lovec.tech](https://lovec.tech) для анализа. Это тонкий
клиент поверх уже существующего API-ключа/баланса с сайта.

## Установка

Из PyPI:

```bash
pip install lovec-mcp
# или без установки, через uv:
uvx lovec-mcp
```

Из исходников:

```bash
cd lovec-mcp
python3 -m venv .venv
./.venv/bin/pip install -e .
```

Ключ выпускается на [lovec.tech](https://lovec.tech)

## Быстрая проверка руками

```bash
export LOVEC_KEY=aig_...
./.venv/bin/python server.py
```

```bash
export LOVEC_KEY=aig_...
./.venv/bin/python -c "
import asyncio, server
print(asyncio.run(server.check_prompt_injection('тестовый текст')))
"
```

## Подключение к MCP-клиенту

Claude Desktop (`claude_desktop_config.json`) или Claude Code (`.mcp.json`) — один и тот же формат:

```json
{
  "mcpServers": {
    "lovec": {
      "command": "uvx",
      "args": ["lovec-mcp"],
      "env": { "LOVEC_KEY": "aig_..." }
    }
  }
}
```

Если ставили из исходников — вместо `uvx` укажите интерпретатор venv и путь к `server.py`:

```json
{
  "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`, а агент читает готовую сводку.

```bash
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` | потолок ожидания одного вызова, секунды |


<!-- mcp-name: io.github.lovec-tech/lovec-mcp -->
