Skip to main content
Glama
marouabah

tracking

by marouabah

MCP Tracking

실시간 추적 MCP 서버(터미널 대시보드 포함). 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_DIR

poller_state.json

~/.local/state/tracking/

TRACKING_STATE_DIR

templates.json (사용자 템플릿, 선택 사항)

~/.config/tracking/

TRACKING_TEMPLATES_FILE

credentials/*.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)를 통해 수정될 때마다 기록됩니다. 모든 프로세스(MCP, API, poller, dashboard)가 이 단일 파일을 공유하며, 각 읽기는 mtime을 확인하여 캐시를 무효화합니다.

모든 변경(HTTP 또는 MCP)은 mutations.py를 거치며 두 경로에서 동일한 동작을 보장합니다: 항목과 세션에 started_at / finished_at 설정, 진행 이력(40개 포인트 슬라이딩 윈도우), info / warn / error 로그 레벨, 모든 항목이 완료되면 자동 완료 처리.

파생 지표

GET /sessionstracking_getmetrics.py가 즉시 계산하는 metrics 블록을 반환합니다.

필드

의미

percent

진행률(100으로 제한)

rate, rate_str

최근 120초 동안의 속도(2.0 MB/s, 30.0 u/min)

eta_seconds, eta_str

예상 남은 시간(running 세션만)

elapsed_seconds, elapsed_str

created_at부터 finished_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 서비스

두 서비스가 항상 실행되며 부팅 시 시작됩니다:

서비스

역할

포트

tracking-api.service

외부 스크립트용 로컬 HTTP API

127.0.0.1:8765

tracking-poller.service

qBittorrent(10초) + Bazarr(60초) 폴링

--

초기 설치 및 재배포

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

4개 세션을 병렬로 시뮬레이션합니다: download, machine(12개 노드), free, movie(전체 DV 파이프라인).


대시보드

세션 레이아웃

[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는 최소 하나의 세션에 오류가 있을 때만 표시됨

  • 활성 필터가 하위 제목에 표시됨: filtre: movie | 2/5 session(s)

  • 필터링된 템플릿이 JSON에서 사라지면 자동으로 all로 돌아감


media-server 통합

qBittorrent (자동)

poller는 10초마다 http://localhost:8080/api/v2/torrents/info를 조회합니다.

  • 활성 토렌트 = 이름, 크기, 속도, ETA가 포함된 [DOWNLOAD] 세션

  • 토렌트가 완료되거나 사라지면 세션이 자동으로 삭제됩니다

  • 자격 증명: credentials/qbt-password.cred(systemd-creds --user로 암호화, media-server/scripts/secrets/rotate-secrets.sh가 생성)

Bazarr 누락 자막 (자동)

poller는 60초마다 Bazarr API를 조회합니다.

  • 단일 [SUBTITLES] 세션이 프랑스어 자막이 없는 모든 에피소드/영화를 나열합니다

  • 세션 제목에 총 개수가 표시됩니다: Sous-titres manquants (151)

  • 누락된 처음 50개 파일이 항목으로 나열됩니다

  • Bazarr API 키: credentials/bazarr-api-key.cred(동일한 메커니즘). 자격 증명이 없으면 해당 poller는 그냥 비활성화됩니다.

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 내에서 자동으로 생성됩니다.

로컬 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

파일 다운로드. poller를 통해 qBittorrent가 자동으로 채웁니다.

Champs extra : speed, eta
Unite par defaut : MB

machine

머신에 대한 작업(update, clone, snapshot, deploy). Lyra가 VM/클러스터 작업에 사용합니다.

Champs extra : operation, target
Unite par defaut : machines

free

자유 형식. poller가 누락된 Bazarr 자막에 사용합니다.

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