Skip to main content
Glama
marouabah

tracking

by marouabah

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)

状態ファイルと設定

ファイル

場所

上書

tracking_state.json

~/.local/state/tracking/

TRACKING_STATE_DIР

pollеr_state.json

~/.local/state/tracking/

TRACKING_STATE_DIР

templates.json(ユーザーテンプレート、任意)

~/.config/tracking/

TRACKING_TEMPLATES_FILE

credetials/*.cred(qBittorrent、Bazarr)

コーと同ジ、gitignore

--

コーの隣にある古い tracking_state.json は、初回起動時に自動的に移行されます(コピーされ、削除はされません)。

保持に関する環境変数:

変数

デフォルト

役割

TRACKING_TTL_DAYS

7

done / error / paused セッションのパージ

TRACKING_TTL_RUNNING_H

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 /seessionstracking_get は、metrics.py によってその場で計算された metrics ブロックを返します:

フィールド

意味

percent

進捗(100で頭打チ)

rate, rate_str

直近120秒の速度(2.0 MB/s30.0 u/min

eta_seconds, eta_str

推定残り時間(running セッションのみ)

elapsed_seconds, elapsed_str

created_at から finisheed_at または現在までの経過時間

idle_seconds, stale

stale = 10分間更新がない running(TUIに表示)


インストール

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.py

systemd サービス

2つのサービスが常駐し、ブート時に起動します:

サービス

役割

ポート

tracking-api.service

外部スクリプト向けローカルHTTP API

127.0.0.1:8765

tracking-pollеr.service

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 rapide

Claude Code セッションによって既に開かれている MCP インスタンス server.pydeploy.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 errors

MCPツール経由(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 --test

download、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

シアン

[ok]

done

[!]

error

セッション色

ステータス

シアン

running

done

error

黄色

paused

キーボードショートカット

キー

アクション

f

次のフィルター(テンプレートによる動的サイクル)

e

エラー専用フィルターの切り替え

r

手動リフレッシュ

s

セッションの正常停止(IDを入力)→ status paused

k

セッションの強制終了(IDを入力)→ 削除

q

終了

矢印キー / ホイール

スクロール

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.credsystemd-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 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

進捗を変更せずにログを追加します。

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

machine

マシーンに対する操作(update、clone、snapshot、deploy)。 VM/クラスター操作のために Lyra が使用します。

Champs extra : operation, target
Unite par defaut : machines

free

自由形式。欠落字幕のためにポーラーが使用します。

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.py127.0.0.1:8765 のみで待ち受けます -- ネットワークからはアクセス不可

  • n8n は docker-compose.yml 内で 127.0.0.1:5678 に制限

  • dv_webhook_server.py0.0.0.0:8787 で待ち受けます(Docker ウェブフックを受信するために必要)-- マシンが公開されている場合は、このポートをファイアウォールで保護

  • systemd サービスは NoNewPrivileges=true で実行されます

  • コード内に平文の秘密情報はありません:poller.py$CREDENTIALS_DIRECTORY(ユーザーサービス)を読むか、systemd-creds decrypt --user(システムサービス)で credentials/*.cred を復号し、デバッグ用に QBT_PASSWORD / BAZARR_KEY 変数へフォールバックします。


テンプレートを追加する

  1. templates.py を開き、TEMPLATES にエントリーを追加します:

"mon_template": {
    "description": "Description courte",
    "extra_fields": ["champ1", "champ2"],
    "default_unit": " unites",
    "example_extra": {"champ1": "valeur", "champ2": "valeur"},
},
  1. 任意: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 にリダイレクトします:テストがプロダクションの状態に触れることは決してありません。

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