tracking
MCP Tracking
MCP-Server für Echtzeit-Tracking mit Terminal-Dashboard. Ermöglicht Claude/Lyra, beliebige lange Operationen zu tracken, und speist automatisch die Sitzungen vom Media-Server (qBittorrent, Bazarr, Dolby-Vision-Konvertierung).
Inhaltsverzeichnis
Related MCP server: Claude Session MCP
Architektur
MCP/tracking/
server.py -- Serveur MCP (outils Claude/Lyra) + point d'entree --ui / --test
api.py -- API HTTP locale (127.0.0.1:8765) pour les scripts externes
mutations.py -- Mutations d'une session, partagees par api.py ET server.py
(horodatage items, historique, niveaux de log, auto-completion)
metrics.py -- Metriques derivees (vitesse, ETA, ecoule, stale) -- logique pure,
calculees a la lecture, jamais stockees
storage.py -- Persistence JSON atomique + verrou fichier + cache mtime + purge TTL
models.py -- Modeles pydantic (TrackingSession, TrackingItem, LogEntry, ProgressPoint)
templates.py -- Templates builtin + templates utilisateur (JSON)
ui.py -- Dashboard Textual (TUI temps reel) + modales stop/kill
sim.py -- Simulations de demo (server.py --test)
poller.py -- Daemon polling qBittorrent (10s) + Bazarr (60s)
tracking-api.service -- Unite systemd (systeme) pour api.py
tracking-poller.service -- Unite systemd (systeme) pour poller.py
install.sh / deploy.sh -- Installation initiale / redeploiement des services
Makefile -- make test | smoke | deploy | ui
tests/ -- unitaires (storage, metrics) + integration/ (API HTTP reelle)Zustands- und Konfigurationsdateien
Datei | Speicherort | Überschreibung |
|
|
|
|
|
|
|
|
|
| neben dem Code, gitignore | -- |
Eine alte tracking_state.json neben dem Code wird beim ersten Start automatisch migriert (Kopie, nie gelöscht).
Umgebungsvariablen für die Aufbewahrung
Variable | Standard | Funktion |
| 7 | Bereinigung von Sitzungen mit done / error / paused |
| 24 | Bereinigung verwaister running-Sitzungen (keine Aktualisierungen mehr) |
Vollständiger Datenfluss
Claude/Lyra (outils MCP)
|
v
server.py ─────────────────────────────────────────┐
|
qBittorrent API (poll 10s) |
| |
Bazarr API (poll 60s) ──> poller.py ──> api.py ──> mutations.py ──> storage.py ──> ~/.local/state/tracking/tracking_state.json
| | |
dv_webhook_server.py | v
| | ui.py
v | (rafraichit chaque seconde)
dv_convert.py ──────────────────────────────────────>
(metriques temps reel ffmpeg/dovi_tool)Die Zustandsdatei wird bei jeder Änderung per atomarem Schreiben (os.replace) unter Dateisperre (tracking_state.lock) geschrieben. Alle Prozesse (MCP, API, Poller, Dashboard) teilen sich diese eine Datei; jede Leseoperation prüft das mtime, um den Cache zu invalidieren.
Jede Mutation (HTTP oder MCP) läuft über mutations.py, das auf beiden Wegen dasselbe Verhalten garantiert: started_at / finished_at auf den Elementen und der Sitzung, Fortschrittsverlauf (gleitendes Fenster von 40 Punkten), Log-Ebenen info / warn / error, automatischer Abschluss, wenn alle Elemente abgeschlossen sind.
Abgeleitete Metriken
GET /sessions und tracking_get liefern einen von metrics.py zur Laufzeit berechneten Block metrics:
Feld | Bedeutung |
| Fortschritt (bei 100 gedeckelt) |
| Geschwindigkeit über die letzten 120 Sekunden ( |
| geschätzte verbleibende Zeit (nur bei laufender Sitzung) |
| von |
|
|
Installation
cd /home/amineutron/dev/MCP/tracking
# Creer le venv et installer les dependances
uv venv .venv
uv pip install "mcp[cli]>=1.0.0" "pydantic>=2.0" "textual>=0.80.0" "fastapi"Der MCP ist in Claude Code registriert (scope user):
claude mcp list # -> tracking: ConnectedZum erneuten Registrieren:
claude mcp add tracking -s user -- \
/home/amineutron/dev/MCP/tracking/.venv/bin/python \
/home/amineutron/dev/MCP/tracking/server.pysystemd-Dienste
Zwei Dienste laufen dauerhaft und starten beim Boot:
Service | Funktion | Port |
| Lokale HTTP-API für externe Skripte | 127.0.0.1:8765 |
| Pollt qBittorrent (10s) + Bazarr (60s) | -- |
Erstinstallation und Redeployment
cd /home/amineutron/dev/MCP/tracking
./install.sh # premiere fois : venv + services (demande sudo)
sudo ./deploy.sh # apres chaque mise a jour du code : stop, unites, restart, verif
make smoke # sante rapideDie MCP-Instanzen server.py, die bereits von Claude-Code-Sitzungen geöffnet wurden, werden von deploy.sh nicht neu gestartet: In diesen Sitzungen tracking über /mcp neu verbinden.
Nützliche Befehle
# Etat
systemctl status tracking-api.service tracking-poller.service
# Logs en direct
journalctl -fu tracking-poller.service
journalctl -fu tracking-api.service
# Redemarrage
sudo systemctl restart tracking-api.service tracking-poller.service
# Test API
curl http://127.0.0.1:8765/health
curl http://127.0.0.1:8765/sessionsStarten
Dashboard (wofi-Verknüpfung)
Suche nach „MCP Tracking“ in wofi/Launcher. Startet das Dashboard in Kitty.
Dashboard (Terminal)
# Toutes les sessions
/home/amineutron/dev/MCP/tracking/.venv/bin/python \
/home/amineutron/dev/MCP/tracking/server.py --ui
# Filtre direct au lancement
.venv/bin/python server.py --ui --filter download
.venv/bin/python server.py --ui --filter movie
.venv/bin/python server.py --ui --filter errorsÜber MCP-Tool (von Claude/Lyra)
open_tracking_ui() # toutes les sessions
open_tracking_ui(filter_template="lyra_task") # vue Lyra uniquement
open_tracking_ui(filter_template="errors") # erreurs uniquementTestmodus (Demo)
.venv/bin/python server.py --testSimuliert 4 parallele Sitzungen: download, machine (12 Knoten), free, movie (komplette DV-Pipeline).
Dashboard
Layout einer Sitzung
[TEMPLATE] Nom de la session id:xxxxxxxx (status)
[=============> ] 54.2% 27100 MB / 50000 MB
champ_extra1: valeur | champ_extra2: valeur
[ok] item-1 100.0 GB -- termine
[>] item-2 frame: 94231 / 172800 (54.5%) speed: 3.2x
[ ] item-3 --
[!] item-4 erreur detail
Logs Erreurs
14:32:01 Message log 1 [!] item-4
14:32:04 Message log 2 14:32:08 ECHEC: details
14:32:07 Message log 3 --
-- --
-- --Item-Symbole
Symbol | Status | Farbe |
| pending | grau |
| running | cyan |
| done | grün |
| error | rot |
Sitzungsfarben
Farbe | Status |
cyan | running |
grün | done |
rot | error |
gelb | paused |
Tastaturkürzel
Taste | Aktion |
| Nächster Filter (dynamischer Zyklus pro Template) |
| Nur-Fehler-Filter umschalten |
| Manuelles Aktualisieren |
| Sitzung sauber stoppen (ID eingeben) -> Status paused |
| Sitzung erzwungen killen (ID eingeben) -> Löschung |
| Beenden |
Pfeile / Mausrad | Scrollen |
Modal-Dialoge stop/kill
Drücken von s oder k öffnet einen modalen Dialog mit einem Eingabefeld für die Sitzungs-ID.
smarkiert die Sitzung alspausedund fügt einen Log hinzuklöscht die Sitzung endgültig aus dem DashboardEscbricht ab
Dynamische Filterung
Der Filterzyklus wird automatisch aus den vorhandenen Sitzungen aufgebaut:
all -> download -> free -> movie -> lyra_task -> errors -> all -> ...allimmer vorhandenJedes im JSON vorhandene Template wird automatisch hinzugefügt
errorserscheint nur, wenn mindestens eine Sitzung einen Fehler hatAktiver Filter wird im Untertitel angezeigt:
filtre: movie | 2/5 session(s)Wenn das gefilterte Template aus dem JSON verschwindet, automatische Rückkehr zu
all
Media-Server-Integration
qBittorrent (automatisch)
Der Poller fragt http://localhost:8080/api/v2/torrents/info alle 10 Sekunden ab.
Ein aktiver Torrent = eine Sitzung
[DOWNLOAD]mit Name, Größe, Geschwindigkeit, ETADie Sitzung wird automatisch gelöscht, wenn der Torrent abgeschlossen ist oder verschwindet
Anmeldedaten:
credentials/qbt-password.cred(verschlüsselt mitsystemd-creds --user, erzeugt vonmedia-server/scripts/secrets/rotate-secrets.sh)
Bazarr fehlende Untertitel (automatisch)
Der Poller fragt die Bazarr-API alle 60 Sekunden ab.
Eine einzige Sitzung
[SUBTITLES]listet alle Episoden/Filme ohne französische Untertitel aufDer Sitzungstitel zeigt die Gesamtzahl an:
Sous-titres manquants (151)Die ersten 50 fehlenden Dateien werden als Elemente aufgelistet
Bazarr-API-Schlüssel:
credentials/bazarr-api-key.cred(gleicher Mechanismus). Ohne Anmeldedaten wird der betreffende Poller einfach deaktiviert.
Dolby-Vision-Konvertierung (automatisch)
Wird von dv-webhook.service ausgelöst, wenn Radarr/Sonarr einen Film mit DV-Profil 4 oder 7 importieren.
Ablauf:
Radarr/Sonarr import
|
v
dv_webhook_server.py (port 8787)
|-- cree session tracking via api.py
|-- passe DV_TRACKING_SESSION_ID en env
v
dv_convert.py
|-- 6 etapes avec metriques temps reel
|-- ffmpeg : frame / speed / size / time (parse stderr)
|-- dovi_tool: frames X/Y ou X% (parse stderr indicatif)
v
session tracking completee ou en erreurDie 6 getrackten Schritte mit ihren Metriken:
Schritt | Werkzeug | Angezeigte Metriken |
1/6 HEVC-Extraktion | ffmpeg | frame / speed / size / time |
2/6 Demux BL/EL | dovi_tool | frames X/Y (%), bl: X GB, el: X GB |
3/6 RPU-Extraktion + P8-Konvertierung | dovi_tool | frames X/Y (%), RPU: X KB |
4/6 Injektion von RPU P8 in BL | dovi_tool | frames X/Y (%), P8 HEVC: X GB |
5/6 Rekonstruktion von Zeitstempeln | ffmpeg | frame / fps / size |
6/6 Finales MKV-Remux | ffmpeg | frame / speed / size |
Der globale Fortschrittsbalken bewegt sich während jedes Schritts kontinuierlich nach vorne (nicht in Sprüngen von 1/6 am Ende jedes Schritts).
Manueller Modus:
# Fichier unique
python /home/amineutron/dev/media-server/scripts/dv_convert.py /chemin/film.mkv
# Scan dossier
python /home/amineutron/dev/media-server/scripts/dv_convert.py --scan /mnt/media/media/moviesIm manuellen Modus wird die Tracking-Sitzung automatisch in process_file erstellt.
Lokale HTTP-API (Port 8765)
Externe Skripte können Sitzungen direkt erstellen/ändern:
# Creer une session
curl -X POST http://127.0.0.1:8765/sessions \
-H "Content-Type: application/json" \
-d '{"name":"Mon operation","template":"free","total":100,"unit":"%"}'
# -> {"id": "a1b2c3d4"}
# Mettre a jour
curl -X PUT http://127.0.0.1:8765/sessions/a1b2c3d4 \
-H "Content-Type: application/json" \
-d '{"processed":45,"log":"Etape 2/5 en cours","extra":{"phase":"etape 2"}}'
# Mettre a jour un item
curl -X PUT http://127.0.0.1:8765/sessions/a1b2c3d4 \
-H "Content-Type: application/json" \
-d '{"item":{"name":"mon-item","status":"done","note":"100 frames speed: 2x"}}'
# Supprimer
curl -X DELETE http://127.0.0.1:8765/sessions/a1b2c3d4
# Lister
curl http://127.0.0.1:8765/sessionsVollständiger PUT-Body (alle Felder optional):
{
"processed": 45.0,
"total": 100.0,
"status": "running",
"extra": {"phase": "etape 2"},
"log": "message de log",
"item": {
"name": "nom-de-l-item",
"status": "running",
"note": "metriques ici",
"processed": 50.0,
"total": 100.0
}
}MCP-Tools
tracking_create
Parametres:
name (str) Nom de la session
template (str) "download" | "machine" | "free" | "movie" | "lyra_task" |
"subtitles" | "series_episode" | "series_season" | template utilisateur
total (float) Valeur totale
unit (str, opt) Unite affichee (ex: " MB", " machines", "%")
items (list, opt) Liste d'elements a suivre
extra (dict, opt) Champs specifiques au template
Format items:
[{"name": "fichier.iso", "total": 5100, "unit": " MB", "note": "info"}]
Retourne: ID de session + etat initial formatetracking_update
Parametres:
session_id (str) ID de la session
processed (float, opt) Nouvelle valeur de progression
message (str, opt) Message de log
item_updates (list, opt) Mises a jour des items
extra (dict, opt) Champs extra a merger
Format item_updates:
[{"name": "item-1", "status": "done", "processed": 1200, "note": "detail"}]
Status: "pending" | "running" | "done" | "error"tracking_log
Fügt einen Log hinzu, ohne den Fortschritt zu ändern.
Parametres:
session_id (str)
message (str)tracking_complete
Markiert als done bei 100 %.
Parametres:
session_id (str)
message (str, opt)tracking_error
Markiert als Fehler (Präfix „ERREUR:“ automatisch, erscheint in der Fehlerspalte).
Parametres:
session_id (str)
message (str)tracking_stop
Stoppt eine Sitzung sauber (Status -> paused). Bleibt im Dashboard sichtbar.
Parametres:
session_id (str)
message (str, opt)tracking_kill
Löscht eine Sitzung erzwungenermaßen. Verschwindet sofort aus dem Dashboard.
Parametres:
session_id (str)tracking_get
Gibt den vollständig formatierten Zustand einer Sitzung zurück.
tracking_list
Parametres:
template (str, opt) Filtrer par template
status (str, opt) Filtrer par statut ("running", "done", "error", "paused")tracking_delete
Löscht eine Sitzung (entspricht tracking_kill).
tracking_templates
Zeigt die Liste der Templates und ihre Felder an.
open_tracking_ui
Öffnet das Dashboard in einem Kitty-Terminal.
Parametres:
filter_template (str, opt) Template a afficher au lancementTemplates
download
Datei-Downloads. Wird automatisch von qBittorrent über den Poller befüllt.
Champs extra : speed, eta
Unite par defaut : MBmachine
Operationen auf Maschinen (update, clone, snapshot, deploy). Wird von Lyra für VM-/Cluster-Operationen verwendet.
Champs extra : operation, target
Unite par defaut : machinesfree
Freies Format. Wird vom Poller für fehlende Bazarr-Untertitel verwendet.
Aucun champ extra impose, aucune unite par defaut.lyra_task
Lyra-Operationen (VM clone, backup, update, snapshot).
Champs extra : operation, target, phase, eta
Unite par defaut : %movie
Komplette Film-Pipeline: Download -> Dolby-Vision-Konvertierung. Wird automatisch von dv_convert.py befüllt, wenn Radarr/Sonarr eine Datei mit DV P4/P7 importieren.
Champs extra : phase, quality, codec, audio, source, dv, speed, eta
Unite par defaut : %
Les 6 etapes DV trackees avec metriques temps reel :
"1/6 extraction HEVC"
"2/6 demux BL/EL"
"3/6 extraction RPU + conv P8"
"4/6 injection RPU P8 dans BL"
"5/6 reconstruction timestamps"
"6/6 remuxage MKV final"Sicherheit
api.pylauscht nur auf127.0.0.1:8765-- aus dem Netzwerk nicht erreichbarn8n ist in
docker-compose.ymlauf127.0.0.1:5678beschränktdv_webhook_server.pylauscht auf0.0.0.0:8787(erforderlich, um Docker-Webhooks zu empfangen) -- diesen Port mit einer Firewall schützen, wenn die Maschine exponiert istDie systemd-Dienste laufen mit
NoNewPrivileges=trueKeine Klartext-Geheimnisse im Code:
poller.pyliest$CREDENTIALS_DIRECTORY(User-Service) oder entschlüsseltcredentials/*.credübersystemd-creds decrypt --user(System-Service), mit Rückgriff auf die VariablenQBT_PASSWORD/BAZARR_KEYfür das Debug
Ein Template hinzufügen
templates.pyöffnen und einen Eintrag inTEMPLATEShinzufügen:
"mon_template": {
"description": "Description courte",
"extra_fields": ["champ1", "champ2"],
"default_unit": " unites",
"example_extra": {"champ1": "valeur", "champ2": "valeur"},
},Optional: eine Simulation
_sim_mon_template()insim.pyhinzufügen.
Das Template ist sofort ohne weitere Änderung verfügbar.
Ohne den Code zu ändern, kann ein Template auch in ~/.config/tracking/templates.json deklariert werden (gleiche Struktur, Schlüssel = Template-Name); es wird beim Start geladen.
Tests
make test # unitaires (storage, metrics) + integration (API HTTP reelle sur port ephemere)Die Autouse-Fixture von conftest.py leitet die Persistenz auf ein tmp_path um: Die Tests berühren niemals den Produktionszustand.
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
- AlicenseBqualityCmaintenanceEnables Claude to coordinate multiple specialized AI agents by creating tasks, tracking their complete thought process and execution in real-time, and monitoring progress across parallel workflows with full transparency.18172MIT
- AlicenseAqualityDmaintenanceProvides Claude Code with programmatic session awareness to track context usage, session history, and task progress. It enables intelligent context reset recommendations and automatic synchronization of project planning documentation.5MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive project management and workflow tracking system that integrates with Claude Code via MCP, automatically capturing sessions, tools, agents, and project tasks into a centralized dashboard and database.20MIT
- FlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for monitoring Claude Code sessions, agent performance, cost tracking, project management, and GitHub synchronization with 89 tools and a real-time dashboard.
Related MCP Connectors
Uptime, SSL, DNS and domain monitoring you can talk to from Claude or any MCP client.
Let your AI sessions talk to each other — messaging, tasks, sessions, and alerts
AI agent run monitoring with incident replay and SLA 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/marouabah/mcp-tracking'
If you have feedback or need assistance with the MCP directory API, please join our Discord server