Skip to main content
Glama
marouabah

tracking

by marouabah

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

tracking_state.json

~/.local/state/tracking/

TRACKING_STATE_DIR

poller_state.json

~/.local/state/tracking/

TRACKING_STATE_DIR

templates.json (Benutzer-Templates, optional)

~/.config/tracking/

TRACKING_TEMPLATES_FILE

credentials/*.cred (qBittorrent, Bazarr)

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

TRACKING_TTL_DAYS

7

Bereinigung von Sitzungen mit done / error / paused

TRACKING_TTL_RUNNING_H

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

percent

Fortschritt (bei 100 gedeckelt)

rate, rate_str

Geschwindigkeit über die letzten 120 Sekunden (2.0 MB/s, 30.0 u/min)

eta_seconds, eta_str

geschätzte verbleibende Zeit (nur bei laufender Sitzung)

elapsed_seconds, elapsed_str

von created_at bis finished_at oder jetzt

idle_seconds, stale

stale = running ohne Aktualisierung seit 10 Min. (im TUI angezeigt)


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: Connected

Zum erneuten Registrieren:

claude mcp add tracking -s user -- \
  /home/amineutron/dev/MCP/tracking/.venv/bin/python \
  /home/amineutron/dev/MCP/tracking/server.py

systemd-Dienste

Zwei Dienste laufen dauerhaft und starten beim Boot:

Service

Funktion

Port

tracking-api.service

Lokale HTTP-API für externe Skripte

127.0.0.1:8765

tracking-poller.service

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 rapide

Die 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/sessions

Starten

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 uniquement

Testmodus (Demo)

.venv/bin/python server.py --test

Simuliert 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

[ok]

done

grün

[!]

error

rot

Sitzungsfarben

Farbe

Status

cyan

running

grün

done

rot

error

gelb

paused

Tastaturkürzel

Taste

Aktion

f

Nächster Filter (dynamischer Zyklus pro Template)

e

Nur-Fehler-Filter umschalten

r

Manuelles Aktualisieren

s

Sitzung sauber stoppen (ID eingeben) -> Status paused

k

Sitzung erzwungen killen (ID eingeben) -> Löschung

q

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.

  • s markiert die Sitzung als paused und fügt einen Log hinzu

  • k löscht die Sitzung endgültig aus dem Dashboard

  • Esc bricht ab

Dynamische Filterung

Der Filterzyklus wird automatisch aus den vorhandenen Sitzungen aufgebaut:

all -> download -> free -> movie -> lyra_task -> errors -> all -> ...
  • all immer vorhanden

  • Jedes im JSON vorhandene Template wird automatisch hinzugefügt

  • errors erscheint nur, wenn mindestens eine Sitzung einen Fehler hat

  • Aktiver 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, ETA

  • Die Sitzung wird automatisch gelöscht, wenn der Torrent abgeschlossen ist oder verschwindet

  • Anmeldedaten: credentials/qbt-password.cred (verschlüsselt mit systemd-creds --user, erzeugt von media-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 auf

  • Der 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 erreur

Die 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/movies

Im 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/sessions

Vollstä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 formate

tracking_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 lancement

Templates

download

Datei-Downloads. Wird automatisch von qBittorrent über den Poller befüllt.

Champs extra : speed, eta
Unite par defaut : MB

machine

Operationen auf Maschinen (update, clone, snapshot, deploy). Wird von Lyra für VM-/Cluster-Operationen verwendet.

Champs extra : operation, target
Unite par defaut : machines

free

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.py lauscht nur auf 127.0.0.1:8765 -- aus dem Netzwerk nicht erreichbar

  • n8n ist in docker-compose.yml auf 127.0.0.1:5678 beschränkt

  • dv_webhook_server.py lauscht auf 0.0.0.0:8787 (erforderlich, um Docker-Webhooks zu empfangen) -- diesen Port mit einer Firewall schützen, wenn die Maschine exponiert ist

  • Die systemd-Dienste laufen mit NoNewPrivileges=true

  • Keine Klartext-Geheimnisse im Code: poller.py liest $CREDENTIALS_DIRECTORY (User-Service) oder entschlüsselt credentials/*.cred über systemd-creds decrypt --user (System-Service), mit Rückgriff auf die Variablen QBT_PASSWORD / BAZARR_KEY für das Debug


Ein Template hinzufügen

  1. templates.py öffnen und einen Eintrag in TEMPLATES hinzufügen:

"mon_template": {
    "description": "Description courte",
    "extra_fields": ["champ1", "champ2"],
    "default_unit": " unites",
    "example_extra": {"champ1": "valeur", "champ2": "valeur"},
},
  1. Optional: eine Simulation _sim_mon_template() in sim.py hinzufü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.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    A
    quality
    D
    maintenance
    Provides 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.
    5
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    20
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A 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.

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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