Skip to main content
Glama

trmm-exec-mcp

Один MCP-сервер для Tactical RMM: доступ на чтение через Entra + read-only PowerShell runner. Подключаться могут только члены назначенной группы безопасности Entra. Он читает всё на платформе и запускает PowerShell для сбора информации на любом агенте — и отказывает всему, что меняет состояние. Построен на FastMCP 3.x с аутентификацией Microsoft Entra (тот же стек, что и odoo-ticket-mcp).

v2 (упрощённая). В более ранней версии был релей одобрения одноразовых токенов Roam для настоящих операций записи/выполнения. Это было больше, чем реальная потребность, поэтому в v2 убраны релей, хранилище предложений, список одобряющих и список разрешённых агентов. Безопасность теперь обеспечивается двумя вещами: группой Entra (кто может подключаться) и read-only защитой (что может делать скрипт). Старый процесс остался в истории git до ветки simplify/readonly-entra.

Что обеспечивает режим только для чтения

Произвольный PowerShell нельзя доказательно считать read-only, поэтому guard.py — это строгий защитный барьер с глубиной защиты, который склонен отказывать. Два уровня:

  1. Разрешающий список глаголов командлетов — командлеты PowerShell имеют форму Verb-Noun; проходят только глаголы чтения (Get, Test, Measure, Select, …), поэтому любые Set-*, New-*, Remove-*, Stop-*, Restart-* отклоняются по построению.

  2. Список запрещённых опасных токенов — ловит конструкции, меняющие состояние, которые не являются командлетами Verb-Noun (нативные del/reg delete/schtasks, .NET ::Delete, перенаправление на диск) и обфускацию, которая могла бы обойти уровень 1 (iex, -EncodedCommand, декодирование Base64, Invoke-Command).

Отказ называет нарушающий токен. Это не песочница — по-прежнему указывайте TRMM_API_KEY на аккаунт, чей радиус поражения вы принимаете.

Related MCP server: entraid-mcp

Аутентификация: Microsoft Entra (режим resource-server)

AzureJWTVerifier + RemoteAuthProvider от FastMCP: сервер проверяет токены Entra, привязанные к аудитории, и публикует метаданные защищённого ресурса; он никогда не выдаёт токены. claude.ai выполняет OAuth против Entra и подключается. nginx перед ним выполняет только TLS + список разрешённых IP Anthropic. Ограничьте доступ старшим инженерам через назначение группы в приложении Entra (Assignment required = Yes).

Инструменты

Инструмент

Тип

Назначение

search_agents

read

Найти машины (фильтр по hostname/типу/платформе/статусу).

get_agent

read

Полная информация об одном агенте (железо, ОС, IP, проверки, состояние перезагрузки).

resolve_agent

read

Hostname → ID агента (ошибка при 0/>1).

search_audit_log

read

Собственный журнал аудита TRMM (кто что делал в TRMM).

run_readonly_script

read

Запуск read-only PowerShell (журналы событий, службы, ПО, конфигурация). Изменяющие скрипты отклоняются.

Конфигурация (только env)

Переменная

Обязательная

Описание

TRMM_API_URL

✅

Базовый URL API TRMM.

TRMM_API_KEY

✅

Ключ аккаунта TRMM с правами чтения + запуска/отправки команд.

MCP_AUTH_ENABLED

—

true (по умолчанию). false только для локального тестирования в Inspector.

ENTRA_TENANT_ID / ENTRA_CLIENT_ID

✅†

Tenant + client id регистрации приложения API.

MCP_BASE_URL

✅†

Публичный корень (без /mcp), например https://trmm-exec-mcp.example.com.

ENTRA_IDENTIFIER_URI

✅†

Должен совпадать с App ID URI, заданным в Entra (например, URL https://…/mcp).

ENTRA_REQUIRED_SCOPES / ENTRA_SCOPE_NAME

—

Конфигурация scope (access_as_user по умолчанию).

MCP_HOST / MCP_PORT / MCP_PATH

—

Привязка контейнера (по умолчанию 0.0.0.0/8080//mcp).

† требуется при MCP_AUTH_ENABLED=true.

Аккаунт TRMM

Использует пользователя TRMM claude, предоставленного с правами чтения + Send Command (SendCMDPerms). Поместите его ключ в TRMM_API_KEY (через переменные окружения стека Portainer, никогда в git). Read-only защита ограничивает, что может делать скрипт; держите аккаунт ограниченным тем, что нужно инструментам. Относитесь к DC как к особо чувствительным.

Запуск / развёртывание

python -m venv .venv && .venv\Scripts\activate
pip install -r requirements.txt
# local (auth off): set TRMM_API_URL, TRMM_API_KEY, MCP_AUTH_ENABLED=false, then:
python -m trmm_exec_mcp

Продакшн: PORTAINER_DEPLOY.md (Git-стек + webhook, переменные Entra, порт хоста) + deploy/nginx-trmm-exec-mcp.conf.

Проверка

python -m py_compile trmm_exec_mcp/*.py — чисто. Read-only защита имеет набор тестов (read-скрипты разрешены; изменяющие/обфусцированные/нативно-деструктивные отклоняются). После развёртывания: /healthz ok, неаутентифицированный /mcp → 401, и discovery-документ объявляет scope https://…/mcp/access_as_user (не api://…).

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    A read-only MCP server for Microsoft Intune and Entra ID that enables list, get, search, and reporting operations for tenant visibility, audits, troubleshooting, and health reporting without write actions. It includes authentication helpers, report exports, and metadata discovery tools.
    36
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server for Microsoft Entra ID (Azure AD) that enables querying user sign-in logs, group memberships, and assigned Microsoft 365 licenses via Microsoft Graph API. Provides security and audit visibility without any write operations.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only MCP access to Tactical RMM, allowing agents to query devices, clients, sites, audit logs, software, and pending actions without any mutating capabilities.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to read Microsoft 365 tenant data, such as users, license usage, and stale accounts, while enforcing least-privilege by refusing to run with excessive Azure permissions.
    4
    MIT