trmm-mcp
trmm-mcp
Ein schreibgeschützter MCP-Server, der eine Tactical RMM-Instanz als Agent-Tools bereitstellt, sodass ein LLM Geräte-, Client- und Auditdaten sammeln kann – ohne die Möglichkeit, irgendetwas zu ändern.
Von Natur aus schreibgeschützt. Es sind keine Tools für Skriptausführung, Befehlsausführung, Neustart, Installation, Bearbeitung, Erstellung oder Löschung implementiert. Selbst wenn der API-Schlüssel schreibfähig wäre, ist der Schadensradius null. Kombinieren Sie es trotzdem mit einem schreibgeschützten Dienstbenutzer (Defense in Depth).
Python + FastMCP. Zwei Transporte aus einer Codebasis: stdio für die lokale Verwendung unter Ihrem MCP-Client und Streamable HTTP (mit gemeinsamer Bearer-Token-Authentifizierung) für einen gemeinsamen Remote-Server, mit dem sich das gesamte Team verbindet – siehe Remote-Bereitstellung.
Die Konfiguration erfolgt nur über Umgebungsvariablen – keine Geheimnisse im Code. Beim Start wird schnell abgebrochen, wenn erforderliche Variablen fehlen.
Tools
Alle Tools haben readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true, geben strukturierte Inhalte mit einem Ausgabeschema zurück und unterstützen Paginierung, wo zutreffend.
Tool | Was es tut |
| Alle Clients/Mandanten (mit optionalen eingebetteten Standortzusammenfassungen). |
| Standorte, nach Client filterbar. |
| Agenten/Geräte mit Zusammenfassungsfeldern; filterbar nach Client/Standort/Typ/Plattform/Status/Hostname. |
| Vollständige Details für einen Agenten (OS, Hardware, Status, Prüfungszusammenfassung); |
| Prüfungsergebnisse (CPU/Speicher/Disk/Ping/Dienst/Skript/Ereignis) mit Bestanden/Nicht bestanden-Status. |
| Befehls-/Skript-/Aufgabenausführungsverlauf für einen Agenten (neueste zuerst). |
| Auditprotokoll nach Agent/Client/Benutzer/Aktion/Objekttyp/Zeitbereich abfragen. |
| Wartende Neustarts/Updates/Skripte für einen oder alle Agenten. |
| Installierte Software-Inventar für einen Agenten. |
| Windows-Update-Einträge, die für einen Agenten bekannt sind. |
| Serverzustand/Version/Zähler (erfordert |
Siehe docs/API_CONTRACT.md für die genauen Endpunkte und die Audit-Log-Nutzlast.
Related MCP server: KVMFleet MCP Server
Konfiguration
Variable | Erforderlich | Standard | Beschreibung |
| ✅ | — | API-Basis-URL, die |
| ✅ | — |
|
| — | (nicht gesetzt) | Überwachungstoken nur für |
| — |
| Zeitlimit pro Anfrage (Sekunden). |
| — |
| Setzen Sie |
| — |
| Wiederholungen bei vorübergehenden 5xx-/Netzwerkfehlern. |
Erhalten Sie einen API-Schlüssel in TRMM: Einstellungen → Globale Einstellungen → API-Schlüssel (wählen Sie Ihren schreibgeschützten Dienstbenutzer). Der Schlüssel umgeht 2FA und erbt die Rollenberechtigungen dieses Benutzers.
Installation
Erfordert Python 3.10+.
cd tactical-rmm-mcp
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS/Linux: source .venv/bin/activate
pip install -r requirements.txt(Oder pip install -e ., um das Konsolenskript trmm-mcp zu erhalten.)
Ausführen
Der Server spricht MCP über stdio, daher wird er normalerweise von Ihrem MCP-Client gestartet. Um ihn manuell auszuführen (er wartet auf einen MCP-Client auf stdin):
# set env first, then:
python -m trmm_mcp
# or
python server.pyWenn TRMM_API_URL/TRMM_API_KEY fehlen, gibt er eine klare Fehlermeldung auf stderr aus und beendet sich mit einem Nicht-Null-Exit-Code.
Bei einem MCP-Client registrieren (stdio)
Claude Code — Projekt .mcp.json
Erstellen Sie .mcp.json in Ihrem Projekt (verwenden Sie den absoluten Pfad zu server.py und das Python Ihrer venv, damit Abhängigkeiten aufgelöst werden):
{
"mcpServers": {
"trmm": {
"command": "C:\\Users\\admin\\your-workspace\\tactical-rmm-mcp\\.venv\\Scripts\\python.exe",
"args": ["C:\\Users\\admin\\your-workspace\\tactical-rmm-mcp\\server.py"],
"env": {
"TRMM_API_URL": "https://api.yourdomain.com",
"TRMM_API_KEY": "your-readonly-key",
"TRMM_MON_TOKEN": "optional-mon-token"
}
}
}
}Claude Desktop — claude_desktop_config.json
Gleiche Struktur, unter dem Top-Level-Schlüssel "mcpServers":
{
"mcpServers": {
"trmm": {
"command": "/abs/path/tactical-rmm-mcp/.venv/bin/python",
"args": ["/abs/path/tactical-rmm-mcp/server.py"],
"env": {
"TRMM_API_URL": "https://api.yourdomain.com",
"TRMM_API_KEY": "your-readonly-key"
}
}
}
}Auf macOS befindet sich diese Datei unter ~/Library/Application Support/Claude/claude_desktop_config.json; unter Windows unter %APPDATA%\Claude\claude_desktop_config.json. Starten Sie die App nach der Bearbeitung neu.
Remote-Bereitstellung (Teamzugriff)
Führen Sie trmm-mcp als gemeinsamen HTTPS-Server aus, damit Ingenieure/Helpdesk ihn als Claude-Connector verwenden, anstatt ihn lokal zu installieren. Der TRMM-API-Schlüssel bleibt serverseitig; Clients authentifizieren sich mit einem gemeinsamen Bearer-Token.
1. Bearer-Token generieren und konfigurieren
python -c "import secrets; print(secrets.token_urlsafe(32))"In .env (oder Ihrer Portainer-Stack-Umgebung):
TRMM_API_URL=https://api.yourdomain.com
TRMM_API_KEY=<read-only service-user key>
TRMM_MCP_TRANSPORT=http
TRMM_MCP_AUTH_TOKEN=<the token you just generated>Der Server weigert sich, im HTTP-Modus ohne TRMM_MCP_AUTH_TOKEN zu starten.
2. Mit Docker / Portainer bereitstellen
docker compose up -d --build
curl http://localhost:8080/healthz # -> {"status":"ok",...}Stellen Sie in Portainer einen Stack aus diesem Repository bereit und setzen Sie die Umgebungsvariablen im Stack – passt zu Ihrem bestehenden Build → Push → Portainer-Webhook-Redeploy-Ablauf. Das Image läuft als Nicht-Root-Benutzer und enthält einen Docker-HEALTHCHECK gegen /healthz.
3. Hinter HTTPS + ein Netzwerk-Gate stellen
Beenden Sie TLS und beschränken Sie den Zugriff vor dem Container – ein Reverse-Proxy (Caddy/Nginx/Traefik), der z. B. https://trmm-mcp.example.com bereitstellt, hinter Ihrem VPN oder Cloudflare Access. Das Bearer-Token ist Defense-in-Depth, nicht die einzige Schicht. Setzen Sie Port 8080 niemals unauthentifiziert dem Internet aus.
4. Claude verbinden (Claude Code / Desktop)
Remote-.mcp.json – kein Python, Repo oder TRMM-Schlüssel auf dem Rechner des Teammitglieds:
{
"mcpServers": {
"trmm": {
"type": "http",
"url": "https://trmm-mcp.example.com/mcp",
"headers": { "Authorization": "Bearer <shared-token>" }
}
}
}claude.ai Web & Mobil
Die Web-/Mobile-Custom-Connector-UI authentifiziert über OAuth, nicht über einen statischen Header – daher deckt das obige Bearer-Setup Claude Code + Desktop ab. Für Web + Mobile stellen Sie dem Server Cloudflare Tunnel + ein MCP Server Portal vor: Es führt den OAuth/SSO (Entra)-Flow gegenüber Claude aus und injiziert das Bearer-Token vorgelagert, sodass kein zusätzlicher Servercode erforderlich ist. Vollständige Anleitung: docs/REMOTE_OAUTH_CLOUDFLARE.md. Verwendet docker-compose.cloudflare.yml (Tunnel-Sidecar, keine veröffentlichten Ports).
Endpunkte
Pfad | Auth | Zweck |
| Bearer | Der MCP-Endpunkt, mit dem sich Clients verbinden |
| keine | Health-Probe für Docker/Orchestratoren |
Mit MCP Inspector testen
npx @modelcontextprotocol/inspector \
-e TRMM_API_URL=https://api.yourdomain.com \
-e TRMM_API_KEY=your-readonly-key \
-- python server.pyDann in der Inspector-UI: Tools auflisten, trmm_list_clients aufrufen und trmm_search_audit_log mit within_days: 7 ausprobieren, um zu bestätigen, dass Paginierung und Audit-Log-Filter mit Live-Daten funktionieren.
Evaluierung
evaluation.xml enthält 10 schreibgeschützte MSP-Fragen mit verifizierten Antworten. Führen Sie sie mit dem im mcp-builder-Skill gebündelten Harness aus:
python scripts/evaluation.py \
-t stdio -c python -a server.py \
-e TRMM_API_URL=https://api.yourdomain.com \
-e TRMM_API_KEY=your-readonly-key \
-o evaluation_report.md \
evaluation.xmlDie Antworten in
evaluation.xmlsind spezifisch für die Instanz, gegen die sie verifiziert wurden; generieren Sie sie für einen anderen Datensatz neu.
Sicherheitshinweise
Geheimnisse stammen nur aus der Umgebung; nichts wird auf stdout protokolliert (stdio-Server müssen stdout sauber halten – Diagnosen gehen an stderr).
Fehler werden in umsetzbare Meldungen übersetzt, die Authentifizierung (401) vs. Berechtigung (403) vs. Nicht gefunden (404) vs. Netzwerk/Timeout unterscheiden, ohne Interna preiszugeben.
Dieser Server ruft niemals einen mutierenden Endpunkt auf. Ein zukünftiger, explizit abgesicherter Aktionsserver wäre ein separates Projekt.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables read-only access to SentinelOne's platform through MCP, allowing security investigations, threat hunting, and asset inventory queries via natural language.MIT

KVMFleet MCP Serverofficial
AlicenseAqualityCmaintenanceRead-only MCP server that allows AI assistants to query and monitor KVM Fleet devices, audit logs, and console sessions through the official REST API.5141MIT- AlicenseNot gradedqualityBmaintenanceEnables read-only interaction with App Store Connect via MCP tools, including listing apps, versions, builds, and review submissions, with compliance boundaries and no write operations by default.MIT
- AlicenseAqualityCmaintenanceRead-only MCP server for the Action1 RMM REST API, enabling access to endpoints, missing updates, vulnerabilities, installed software, policies, automations, and reports.21Apache 2.0
Related MCP Connectors
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Read-only Dant3 MCP for public rooms, agents, jobs and provisional machine onboarding.
Read-only Remote MCP for externally grounded AI agent trust receipts.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/JohnGilligan2/tactical-rmm-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server