tracking
MCP Tracking
ターミナル・ダッシュボード付きのリアルタィム追跡MCРサーバー。 Claude/Lyra が任意の長時間操作を追跡できるようにし、media-server(qBittorrent、Bazarr、DV変換)からセッションを自動的に供給します。
目次
Related MCP server: Claude Session MCP
アーキテクチャー
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)状態ファイルと設定
ファイル | 場所 | 上書 |
|
|
|
|
|
|
|
|
|
| コーと同ジ、gitignore | -- |
コーの隣にある古い tracking_state.json は、初回起動時に自動的に移行されます(コピーされ、削除はされません)。
保持に関する環境変数:
変数 | デフォルト | 役割 |
| 7 | done / error / paused セッションのパージ |
| 24 | 更新のない running セッション(孤児)のパージ |
完全なデータフロー
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)状態ファイルは、ファイルロッケ(tracking_state.lock)の下で原子的書き込み(os.replace)によって変更のたびに書キ込まれます。すべでのプセス(MCР、API、ポーラ、ダッシュボード)がこの単一のファイルを共有し、各読キ込は mtime を確認してキャッシュを無効化します。
あらゆる変更(HTTP または MCР)は mutations.py を経由し、両方のパスで同じ挙動を保証します:started_at / finisheed_at を項目とセッションに設定、進捗履歴(40ポインと のスライデイング・ウインドウ)、ログレベル info / warn / error、全項目が完了したときの自動完了。
派生メトリクス
GET /seessions と tracking_get は、metrics.py によってその場で計算された metrics ブロックを返します:
フィールド | 意味 |
| 進捗(100で頭打チ) |
| 直近120秒の速度( |
| 推定残り時間(running セッションのみ) |
|
|
|
|
インストール
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"MCP は Claude Code(ユーザースコープ)に登録されています:
claude mcp list # -> tracking: Connected再登録するには:
claude mcp add tracking -s user -- \
/home/amineutron/dev/MCP/tracking/.venv/bin/python \
/home/amineutron/dev/MCP/tracking/server.pysystemd サービス
2つのサービスが常駐し、ブート時に起動します:
サービス | 役割 | ポート |
| 外部スクリプト向けローカルHTTP API | 127.0.0.1:8765 |
| qBittorrent (10s) + Bazarr (60s) のポーリング | -- |
初期インストールと再デプロイ
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 rapideClaude Code セッションによって既に開かれている MCP インスタンス server.py は deploy.sh では再起動されません。それらのセッションでは /mcp から tracking を再接続してください。
便利なコマンド
# 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起動
ダッシュボード(wofiショートカット)
wofi/ランチャーで「MCP Tracking」を検索します。Kitty でダッシュボードを起動します。
ダッシュボード(ターミナル)
# 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 errorsMCPツール経由(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テストモード(デモ)
.venv/bin/python server.py --testdownload、machine(12ノード)、free、movie(完全なDVパイプライン)の4セッションを並行してシミュレートします。
ダッシュボード
セッションのレイアウト
[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 --
-- --
-- --項目アイコン
アイコン | ステータス | 色 |
| pending | グレー |
| running | シアン |
| done | 緑 |
| error | 赤 |
セッション色
色 | ステータス |
シアン | running |
緑 | done |
赤 | error |
黄色 | paused |
キーボードショートカット
キー | アクション |
| 次のフィルター(テンプレートによる動的サイクル) |
| エラー専用フィルターの切り替え |
| 手動リフレッシュ |
| セッションの正常停止(IDを入力)→ status paused |
| セッションの強制終了(IDを入力)→ 削除 |
| 終了 |
矢印キー / ホイール | スクロール |
stop/kill モーダル
s または k を押すと、セッションIDの入力フィールドを持つモーダルが開きます。
sはセッションをpausedにマークし、ログを追加しますkはダッシュボードからセッションを完全に削除しますEchapはキャンセル
動的フィルタリング
フィルターのサイクルは、存在するセッションから自動的に構築されます:
all -> download -> free -> movie -> lyra_task -> errors -> all -> ...allは常に存在JSON 内に存在する各テンプレートが自動的に追加される
errorsは、少なくとも1つのセッションにエラーがある場合にのみ表示されるアクティブなフィルターがサブタイトルに表示される:
filtre: movie | 2/5 session(s)フィルタされたテンプレートがJSONから消えた場合、自動的に
allに戻る
media-server 連携
qBittorrent(自動)
ポーラーは10秒ごとに http://localhost:8080/api/v2/torrents/info を照会します。
アクティブなトーレント = 名前、サイズ、速度、ETA を持つ
[DOWNLOAD]セッショントーレントが完了または消滅すると、セッションは自動的に削除される
認証情報:
credetials/qbt-password.cred(systemd-creds --userで暗号化、media-server/scripts/secrets/rotate-secrets.shで生成)
Bazarr 欠落字幕(自動)
ポーラーは60秒ごとに Bazarr API を照会します。
単一の
[SUBTITLES]セッションが、フランス語字幕のないすべでのエピソード/映画をリストしますセッションのタイトルは合計を示します:
Sous-titres manquants (151)欠落ファイルの最初の50件が項目としてリストされる
Bazarr API キー:
credetials/bazarr-api-key.cred(同じメカニズム)。認証情報がない場合、該当するポーリングは単に無効になります。
Dolby Vision 変換(自動)
Radarr/Sonarr が DV Profile 4 または 7 の映画をインポートすると、dv-webhook.service によって発火されます。
フロー:
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追跡される6つのステップとそのメトリクス:
ステップ | ツール | 表示されるメトリクス |
1/6 HEVC 抽出 | ffmpeg | frame / speed / size / time |
2/6 BL/EL デマックス | dovi_tool | frames X/Y (%), bl: X GB, el: X GB |
3/6 RPU 抽出 + P8 変換 | dovi_tool | frames X/Y (%), RPU: X KB |
4/6 BL への RPU P8 注入 | dovi_tool | frames X/Y (%), P8 HEVC: X GB |
5/6 タイムスタンプ再構築 | ffmpeg | frame / fps / size |
6/6 最終 MKV リマックス | ffmpeg | frame / speed / size |
全体的な進捗バーは各ステップ中も連続的に進みます(各ステップ終了時に 1/6 ずつ飛び的に進むわけではありません)。
手動モード:
# 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手動モードでは、process_file 内で tracking セッションが自動的に作成されます。
ローカル HTTP API(ポート8765)
外部スクリプトはセッションを直接作成/変更できます:
# 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完全な PUT ボディ(全フィールド任意):
{
"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 ツール
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
進捗を変更せずにログを追加します。
Parametres:
session_id (str)
message (str)tracking_complete
100% で done にマークします。
Parametres:
session_id (str)
message (str, opt)tracking_error
エラーとしてマークします(接頭辞「ERREUR:」を自動付与、エラー列に表示)。
Parametres:
session_id (str)
message (str)tracking_stop
セッションを正常に停止します(status -> paused)。ダッシュボードに表示され続けます。
Parametres:
session_id (str)
message (str, opt)tracking_kill
セッションを強制的に削除します。ダッシュボードから即座に消えます。
Parametres:
session_id (str)tracking_get
セッションの完全な状態を整形して返します。
tracking_list
Parametres:
template (str, opt) Filtrer par template
status (str, opt) Filtrer par statut ("running", "done", "error", "paused")tracking_delete
セッションを削除します(tracking_kill と同等)。
tracking_templates
テンプレートのリストとそのフィールドを表示します。
open_tracking_ui
Kitty ターミナルでダッシュボードを開きます。
Parametres:
filter_template (str, opt) Template a afficher au lancementテンプレート
download
ファイルのダウンロード。ポーラー経由で qBittorrent によって自動的に供給されます。
Champs extra : speed, eta
Unite par defaut : MBmachine
マシーンに対する操作(update、clone、snapshot、deploy)。 VM/クラスター操作のために Lyra が使用します。
Champs extra : operation, target
Unite par defaut : machinesfree
自由形式。欠落字幕のためにポーラーが使用します。
Aucun champ extra impose, aucune unite par defaut.lyra_task
Lyra 操作(VM clone、backup、update、snapshot)。
Champs extra : operation, target, phase, eta
Unite par defaut : %movie
映画の完全なパイプライン:ダウンロード、Dolby Vision 変換。 Radarr/Sonarr が DV P4/P7 ファイルをインポートすると、dv_convert.py によって自動的に供給されます。
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"セキュリティ
api.pyは127.0.0.1:8765のみで待ち受けます -- ネットワークからはアクセス不可n8n は
docker-compose.yml内で127.0.0.1:5678に制限dv_webhook_server.pyは0.0.0.0:8787で待ち受けます(Docker ウェブフックを受信するために必要)-- マシンが公開されている場合は、このポートをファイアウォールで保護systemd サービスは
NoNewPrivileges=trueで実行されますコード内に平文の秘密情報はありません:
poller.pyは$CREDENTIALS_DIRECTORY(ユーザーサービス)を読むか、systemd-creds decrypt --user(システムサービス)でcredentials/*.credを復号し、デバッグ用にQBT_PASSWORD/BAZARR_KEY変数へフォールバックします。
テンプレートを追加する
templates.pyを開き、TEMPLATESにエントリーを追加します:
"mon_template": {
"description": "Description courte",
"extra_fields": ["champ1", "champ2"],
"default_unit": " unites",
"example_extra": {"champ1": "valeur", "champ2": "valeur"},
},任意:
sim.pyにシミュレーション_sim_mon_template()を追加します。
テンプレートは、他に変更を加えずにすぐに利用できます。
コードに触れずに、テンプレートは ~/.config/tracking/templates.json で宣言することもできます(同じ構造、キー = テンプレート名)。起動時に読み込まれます。
テスト
make test # unitaires (storage, metrics) + integration (API HTTP reelle sur port ephemere)conftest.py の autouse フィクスチャーが永続化先を tmp_path にリダイレクトします:テストがプロダクションの状態に触れることは決してありません。
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