Auth0 User Monitor MCP Server
Enables monitoring Auth0 users by collecting summaries, storing reports in SQLite, and auto-blocking suspicious admins, all through MCP tools without an LLM.
README
День 18 — Планировщик и фоновые задачи (Auth0 user-monitor)
Отдельный MCP-сервер БЕЗ LLM (чистый код), который работает 24/7: по расписанию (раз в 10 минут) собирает сводку по пользователям тенанта Auth0, кладёт отчёт в SQLite и авто-блокирует подозрительных админов. Сводка отдаётся по запросу мгновенно из БД. Плюс набор скриптов, моделирующих жизненный цикл пользователей (создание → роли/доступ → активность → блокировка → удаление).
Что внутри
| Файл | Роль |
|---|---|
server.py |
MCP-сервер (без LLM) — tools + фоновый планировщик (stdio / --http). |
scheduler.py |
Фоновый поток: раз в N сек собирает сводку, авто-блокирует подозрительных, пишет в БД. |
collector.py |
Сбор сводки из РЕАЛЬНОГО Auth0 (users, roles, last_login, fp-логи, доступ к приложениям). |
summary_store.py |
SQLite-хранилище отчётов. |
simulate.py / simlib.py |
Скрипты моделирования жизненного цикла пользователей (запускаются вручную). |
client.py |
Минимальный MCP-клиент для проверки. |
auth0_client.py / config.py / logutil.py |
Транспорт к Auth0 (с retry на 429, полные HTTP-логи, маскирование секретов). |
MCP-инструменты (без LLM)
| Tool | Что делает |
|---|---|
get_user_summary |
Последний отчёт из БД (собран по расписанию) — мгновенно, без обращения к Auth0. |
collect_now |
Собрать свежий отчёт сейчас, сохранить, вернуть (заодно авто-блок подозрительных). |
block_suspicious_users |
Найти админов с ≥ порога неудачных входов и заблокировать; вернуть id. |
list_reports |
История отчётов (время + итоги). |
set_schedule |
Сменить период сбора (сек) и/или порог подозрительности. Сохраняется, действует сразу. |
Сводка по пользователю: email, статус (blocked), last_login, logins_count,
роли, признак admin, доступ к приложениям (apps), число неудачных входов
(failed_logins), флаг suspicious.
Подозрительный = admin-роль И ≥ AUTH0_SUSPICIOUS_THRESHOLD (по умолч. 5)
неудачных входов И не заблокирован. Порог и интервал — через env.
Как это «по-настоящему» (анализ осуществимости)
Всё, что можно — реально в тенанте; то, что Auth0 «из коробки» не даёт — решено явно:
| Требование | Реализация |
|---|---|
Создание / отключение (blocked) / удаление пользователей |
✅ напрямую Management API |
| Роли (выдача/отзыв) | ✅ POST/DELETE /users/{id}/roles |
last_login (когда логинился) |
Реальные входы через ROPG (password-realm grant) → Auth0 проставляет настоящий last_login/logins_count |
| «Неудачные входы с неправильным паролем» | Реальные fp-логи от ROPG с неверным паролем; коллектор считает их из GET /logs?q=type:fp |
| «Доступ к приложениям» | В Auth0 нет прямой связи user→app; моделируется списком в app_metadata.sim.apps (+ реальные роли) |
| Низкий rate-limit dev-тенанта | Retry на 429 с backoff (Retry-After / X-RateLimit-Reset) |
Search-индекс q= отстаёт от создания |
Списки пользователей берём через обычный GET /users (консистентно), не через q= |
Для ROPG скрипт setup создаёт изолированные удаляемые ресурсы: отдельное
regular-web приложение day18-simulator (с password-realm grant) и отдельную
БД-коннекшн day18-sim-db (включены и симулятор, и M2M-клиент). cleanup всё
удаляет. Секрет симулятора лежит в .sim_state.json (в .gitignore).
Запуск
pip install -r requirements.txt
cp .env.example .env # AUTH0_DOMAIN / CLIENT_ID / CLIENT_SECRET
1. Сервер 24/7 (отдельный процесс):
python3 server.py --http # http://127.0.0.1:8766/mcp, планировщик внутри
# короткий интервал для проверки:
AUTH0_SUMMARY_INTERVAL=60 python3 server.py --http
2. Запросы (другой терминал):
python3 client.py --http --call get_user_summary
python3 client.py --http --call collect_now
python3 client.py --http --call block_suspicious_users
3. Смоделировать «видимость» (создаёт реальные демо-объекты в тенанте):
python3 simulate.py scenario # users + роли + доступ + реальные входы + блокировка
python3 simulate.py list
python3 simulate.py cleanup # удалить всё: users + connection + app + role
scenario создаёт 6 пользователей: 2 админа (day18-admin1/2) и 4 обычных;
выдаёт роли/доступ; делает реальные входы; day18-admin2 получает 6 неудачных
входов (станет подозрительным → сервер заблокирует), day18-user3 тоже 6
неудачных, но он НЕ админ → НЕ блокируется; day18-user4 отключается.
Переменные окружения
| Env | По умолч. | Назначение |
|---|---|---|
AUTH0_SUMMARY_INTERVAL |
600 |
Период сбора (сек). |
AUTH0_SUSPICIOUS_THRESHOLD |
5 |
Порог неудачных входов для подозрительного админа. |
DAY18_DB |
day18.db |
Файл SQLite с отчётами. |
Агент (день 18): чат + панель инструментов
Лёгкий LLM-агент, подключённый ТОЛЬКО к монитору дня 18 (без старого Auth0 98-инструментного MCP). Интерфейс — только чат и описание инструментов сервера.
| Файл | Роль |
|---|---|
web.py |
Минимальный веб: чат + панель «🧰 Инструменты MCP-сервера». |
chat_agent.py |
Простой агент: диалог + function-calling по тулзам монитора (без этапов/инвариантов/памяти). |
mcp_client.py |
MCP-клиент/мост к монитору (HTTP по URL или stdio). |
llm_client.py |
Транспорт к DeepSeek (function-calling). |
# 1) монитор (24/7) в одном терминале:
python3 server.py --http
# 2) агент-чат в другом:
MONITOR_URL=http://127.0.0.1:8766/mcp uvicorn web:app --reload # http://127.0.0.1:8000
Примеры запросов в чате: «покажи сводку», «собери сейчас», «заблокируй подозрительных», «меняй расписание на 5 минут». Агент сам вызывает нужный инструмент монитора; под ответом видно 🔧 какой тул был вызван.
Сам MCP-сервер по-прежнему без LLM. LLM использует только агент.
Архитектура (24/7)
┌─ scheduler (поток, раз в N сек) ─┐
client / агент ─MCP─▶ server.py ─▶ collector ─HTTPS─▶ Auth0 Mgmt API
│ ├─ users + roles + last_login
│ ├─ logs (type:fp) → failed_logins
│ └─ auto-block (admin + ≥5) → PATCH blocked
▼
summary_store (SQLite) ◀── get_user_summary читает отсюда
Сервер не использует LLM. Скрипты симуляции — отдельно, их запускают вручную.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。