Skip to content

Releases: DeamonDev888/mcp-control

v0.7.12

Choose a tag to compare

@github-actions github-actions released this 25 Oct 20:58

[0.7.12] — Finitions « produit » : diagnostic réseau, pannes visibles, confort d'usage

Diagnostic réseau (le cas VPN qui ressemblait à une panne)

  • Veille de la passerelle LAN : toutes les 30 s, l'app pingue la passerelle par défaut et croise ce résultat avec l'état des serveurs distants. Si le LAN est coupé (VPN actif le plus souvent) alors que la machine est bien connectée, un bandeau rouge s'affiche en haut de la fenêtre : « réseau local injoignable — VPN actif ? (Proton VPN : autoriser les connexions LAN) ». Le journal enregistre l'apparition et le retour du réseau.
  • Décision isolée dans une fonction pure lan_decision() et testée (4 cas : sain, passerelle muette, VPN trompeur, indéterminé).
  • Messages d'erreur actionnables : une erreur SSH de type connect to host … n'est plus présentée comme un problème de clé mais comme « machine injoignable (LAN coupé / VPN actif, ou machine éteinte) ».

Panics enfin visibles

  • panic::set_hook : tout panic écrit désormais une ligne [panic] … dans mcc.log et sur stderr. Avant, en mode fenêtré (windows_subsystem=windows), un panic était totalement muet.
  • catch_unwind autour du cycle de sondage : un panic dans un cycle ne tue plus le thread de supervision — il est journalisé et le cycle suivant repart.

Confort d'usage

  • Boutons clarifiés : Désactiver devient « ⏸ Mettre en pause » / « ▶ Reprendre » (le serveur reste listé) et Retirer devient « 🗑 Supprimer » — la confusion entre les deux avait conduit à mettre 14 serveurs hors supervision par erreur. Chaque bouton a un tooltip qui explique l'effet exact.
  • Bouton de déconnexion (🔓 dans la barre de titre, visible seulement si un code est stocké) + « Oublier le code enregistré » dans le dialogue de déverrouillage : plus rien ne traîne dans le navigateur après une rotation de code ou sur un poste partagé.

Performance

  • Sondage parallèle : les serveurs sont sondés par paquets de 8 au lieu d'un par un. Avec ~30 serveurs dont 15 en SSH, un cycle dépassait le refresh de 15 s (états en retard d'un cycle) ; il tient maintenant dans l'intervalle. Les spawns concurrents restent protégés par la garde anti-doublon.

Sécurité

  • Comparaisons à temps constant (crypto::ct_eq) pour le code d'accès et la preuve de pair : la comparaison précédente sortait au premier octet différent.

Documentation

  • README : section Installer (assistant NSIS, sans droits admin), tableau des boutons mis à jour (⚡ autoboot par serveur, ⏸ pause, 🗑 suppression), 37 frameworks, FAQ « tous mes serveurs distants sont DOWN » (VPN) et « mes serveurs ont disparu » (pause).

Tests

  • 89 tests verts (+ lan_decision_couvre_les_cas_vpn_et_panne), clippy -D warnings sous Windows et Linux, cargo fmt --check.

v0.7.11

Choose a tag to compare

@github-actions github-actions released this 25 Oct 19:36

[0.7.11] — Installateur wizard (NSIS) + bouton Autoboot par serveur

Installateur Windows (wizard)

  • Vrai installateur *-setup.exe généré par Tauri (NSIS), publié dans la release à côté du binaire portable. Parcours : choix de la langue (Français/English) → bienvenue → dossier d'installation → dossier du menu Démarrer → installation → fin (avec case « créer un raccourci bureau » et lancement de l'app).
  • installMode: currentUser : installation dans le profil utilisateur, aucune élévation UAC ; désinstalleur et entrée « Ajout/Suppression de programmes » inclus.
  • Métadonnées du paquet : description courte/longue, éditeur DeamonDev888, catégorie DeveloperTool, icône de l'installateur.
  • CI : le job desktop Windows construit désormais le bundle NSIS (@tauri-apps/cli build --bundles nsis) et publie <artifact>-setup.exe en plus du binaire.

Autoboot par serveur (⚡)

  • Nouveau bouton ⚡ par serveur : dans la ligne de l'explorateur et dans la barre d'actions du détail. Il pilote auto_restart — le serveur est relancé au démarrage du command center et après un crash, indépendamment de l'autostart de l'app elle-même.
  • Nouvelle action API set_auto_restart ({action, id, enabled}) : journalise le changement et, à la réactivation, remet à zéro le compteur d'échecs de spawn (un serveur qui avait été coupé après 3 échecs peut repartir).
  • Persistance réparée : auto_restart n'était lu ni écrit dans config.json (toujours true au rechargement). Il est maintenant écrit quand il vaut false et relu au chargement — le bouton survit au redémarrage.
  • État visuel : ⚡ orange quand actif, grisé sinon, tooltip explicite ; l'état est aussi rappelé en clair dans le panneau Démarrage du détail.

Tests

  • auto_restart_par_serveur_action_et_persistance : action → flag du serveur → écriture dans config.json → réactivation effaçant les échecs → serveur inconnu rejeté proprement.
  • 88 tests verts, clippy -D warnings (Windows et Linux), cargo fmt --check.

v0.7.10

Choose a tag to compare

@github-actions github-actions released this 25 Oct 18:51

[0.7.10] — Trois modes de transport (STDIO / HTTP / WS) + 37 frameworks MCP détectés par langage

Frameworks MCP

  • 37 frameworks reconnus, 5 maximum par langage : Python (FastMCP, FastAPI-MCP, mcpo, mcp-proxy, MCP SDK), TypeScript/Node (FastMCP, xmcp, mcp-framework, MCP SDK, Fastify MCP), Rust (LiteMCP, rmcp, rust-mcp-sdk, tower-mcp, mcp-rs), Go (mcp-go, Go SDK, mcp-golang, gomcp, go-mcp), Java (Spring AI, MCP Java SDK, Quarkus MCP, LangChain4j, mcp-java), C#/.NET (MCP C# SDK, mcp-dotnet, mcpdotnet, csharp-mcp), Ruby (MCP Ruby, fast-mcp, ruby-mcp, mcp-rb), PHP (PHP MCP SDK, Laravel MCP, mcp-php, Symfony MCP).
  • Détection combinée : signature comportementale d'abord (LiteMCP = spec 2026-07-28 non négociée + /health « ok » ; FastMCP = réponses SSE + /sse legacy co-servi, avec arbitrage Python/TypeScript par le langage du process), puis nom annoncé par le serveur (serverInfo.name) et paquet lancé pour les serveurs stdio.
  • Langage déduit du framework quand il est identifié (rmcp → Rust, mcp-go → Go…), sinon en-têtes HTTP, process propriétaire du port ou commande stdio.
  • Matching par mot délimité : mcpo ne matche plus mcporter, et @modelcontextprotocol/server-* (serveurs npm officiels) n'est plus pris pour le SDK C#. Tests de non-régression dédiés.
  • Nouvelle route GET /api/frameworks (id, label, langage) : l'UI construit les badges depuis cette table, sans liste dupliquée en JavaScript. Badge générique .tag.fw pour les frameworks autres que LiteMCP/FastMCP.

Durcissements (audit 2026-10-25)

  • sanitize_http_path : un chemin de sonde sans / initial ou contenant un caractère de contrôle retombe sur le chemin par défaut (anti-CRLF dans la request-line) ; utilisé par http_request, sse_get_host et le probe.
  • http_host_header : en-tête Host correct (host:port, crochets IPv6) sur toutes les requêtes de sonde.
  • read_bounded_line : lecture stdio plafonnée (au plus MAX_PROBE_READ + 1 octets avant troncature) — plus d'allocation géante avant coupure.
  • RespHead.session_id : le Mcp-Session-Id renvoyé par l'initialize est capturé, prêt à être rejoué sur les appels suivants.
  • ssh_error_hint factorisé (un seul endroit pour les messages « auth refusée » / « machine injoignable »).

UI

  • Plus de badge « HTTP+SSE » ni « SSE » : le streamable JSON et les réponses encodées SSE (FastMCP/mcp-proxy) sont tous les deux du HTTP — le badge de transport affiche désormais simplement HTTP. Le badge de framework (FastMCP, LiteMCP) reste séparé et son tooltip ne parle plus de SSE.
  • Trois modes seulement : STDIO / HTTP / WS. Le badge HTTPS (port 443) est retiré : ce n'était pas un mode de transport.
  • Badge WS (orange) : affiché quand le serveur accepte une upgrade WebSocket (HTTP/1.1 101 Switching Protocols) sur le chemin MCP. Nouvelle sonde ws_upgrade_host (en-têtes Upgrade: websocket, Sec-WebSocket-Key), timeout court, détection seule — aucun frame WS n'est échangé.
  • Détail serveur : la ligne framework de FastMCP n'affiche plus « + SSE legacy ».

Technique

  • Server.ws / McpProbe.ws propagés (probe HTTP loopback, probe par hôte, cache de démarrage, /api/state, /api/detail).
  • Test de non-régression ws_upgrade_detecte_101_et_rejette_le_reste : 101 → WS, 200 → HTTP, port fermé → pas de panic.

v0.6.4

Choose a tag to compare

@github-actions github-actions released this 20 Oct 00:34

[0.6.4] — Plus aucune fenêtre console qui s'ouvre

Corrigé (bug bloquant)

  • Cliquer Start/Stop (ou chaque poll) ouvrait des fenêtres console : les spawns utilitaires (netstat, tasklist, taskkill, arp, ipconfig, hostname) n'avaient pas CREATE_NO_WINDOW depuis une app GUI. Helper hidden() appliqué à TOUS les Command de l'app.
  • Kill des serveurs stdio : Child::kill() ne tuait que le lanceur .cmd, pas node.exe détaché → processus orphelins et consoles résiduelles. kill_tree() (taskkill /F /T /PID) remplace les 6 sites de kill (toggle OFF, kill_stdio, remove, chemins d'erreur handshake).

Vérifié

  • 0 console visible (MainWindowHandle ≠ 0) avant/après 5 toggles + polls.
  • Start → UP (pid réel), Stop → process tué côté OS, aucune fenêtre.

v0.6.3

Choose a tag to compare

@github-actions github-actions released this 20 Oct 00:18

[0.6.3] — Langage détecté par le process réel + chips visibles partout

Corrigé

  • Les serveurs HTTP locaux sans en-têtes n'avaient AUCUN langage → chip absent. Le probe interroge désormais le vrai process qui écoute le port (netstat -ano → PID → tasklist → image, cache 10 s) : node.exe → node, python.exe → python, java.exe → java, dotnet.exe → dotnet…
  • Normalisation de l'image (node.exe → node) pour que la chip s'affiche.
  • Chip « ? » explicite quand le langage est indétectable (au lieu de rien).
  • La fenêtre native desktop embarquait un vieux core (v0.6.0) → rebuild aligné sur le core courant.

Preuve : Overmind/discord/postgres/X/NEWS détectés node via leur process node.exe ; py-header → python (header uvicorn) ; stdio → node (commande).

v0.6.2

Choose a tag to compare

@github-actions github-actions released this 18 Oct 00:16

[0.6.2] — Langage des serveurs MCP + logos

Frontend

  • Chip de langage (monogramme coloré façon logo) à côté du badge de type : JS (Node/TS), PY, RS, GO, JV, C#, RB, PHP. Survol = libellé complet. Badge absent si le langage est inconnu (aucune invention).
  • Transport conservé : STDIO / HTTP / SSE / HTTPS (+ ·LAN).

Backend

  • Détection du langage — la spec MCP n'expose PAS le langage (serverInfo = name/title/version uniquement) :
    • stdio : commande de lancement (node/npx/tsx → Node, python/uv/uvx → Python, cargo → Rust, go/java/dotnet/ruby/php), extension du script en dernier recours.
    • HTTP : en-têtes Server / X-Powered-By (uvicorn/gunicorn/werkzeug → Python, express → Node, hyper/axum → Rust, Kestrel → .NET, Jetty/Tomcat → Java, net/http → Go), sinon indice dans le nom.
  • RespHead (content-type/server/x-powered-by) remplace le simple content-type ; lang exposé dans /api/state.
  • Fixture examples/test-py-header-server.js (se présente comme uvicorn) pour tester l'inférence.

Preuves : py-header → python (header uvicorn) ; Filesystem/demo-stdio → node (commande) ; serveurs réels sans en-tête → lang inconnu.

v0.6.1

Choose a tag to compare

@github-actions github-actions released this 18 Oct 00:04

[0.6.1] — Badges du type de MCP (STDIO / HTTP / SSE / HTTPS)

UI

  • Chaque serveur affiche son type de transport avant le badge « désuet » : STDIO (cyan), HTTP (violet), SSE (vert, détecté au probe), HTTPS (port 443), suffixe ·LAN pour les serveurs distants.
  • Même badge dans la vue détail à côté du pill d'état.

Backend

  • Détection SSE : Content-Type text/event-stream capturé sur la réponse initialize → champ sse (McpProbe/Server) exposé dans /api/state.
  • Fixture examples/test-sse-server.js (serveur MCP SSE zéro dépendance) pour tester.

Preuve réelle : Overmind, discord, postgres, X, NEWS détectés SSE ; demo-http (JSON chunked) HTTP ; stdio → STDIO.

v0.6.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 19:41

[0.6.0] — App NATIVE (Tauri) + CLI headless

Architecture

  • Workspace cargo : mcp-command-center (core headless, lib + bin) + mcp-command-center-desktop (Tauri 2).
  • Le core devient une LIBRAIRIE : tout le moteur (config, probes, polling, HTTP, boutique) est dans src/lib.rs ; run_headless() démarre tout et retourne l'URL, park_forever() bloque.
  • mcp-command-center.exe = CLI 100 % headless : plus AUCUNE ouverture de navigateur/fenêtre. Sortie console : URL + endpoints. (Le mode --app Edge/Chrome est supprimé.)
  • mcp-command-center-desktop.exe = vraie fenêtre native OS : Tauri 2 + WebView2 système (déjà fourni par Windows 11), exe autonome 9 MB, windows_subsystem = "windows" (aucune console). Le moteur tourne dans le process, la fenêtre navigue vers l'URL locale.
  • Lanceurs : start-command-center.bat → fenêtre native ; start-headless.bat → CLI.

CI

  • Jobs core scopés sur -p mcp-command-center (le desktop ne compile pas sur ubuntu sans webkit2gtk).
  • Nouveau job desktop (windows-latest) : construit la fenêtre native et l'ajoute à la release (mcp-command-center-desktop-windows-x86_64.exe).
  • Prérequis MSVC : toolchain stable-x86_64-pc-windows-msvc + Build Tools 2022 + WebView2 Runtime (tous présents ici).

v0.5.1

Choose a tag to compare

@github-actions github-actions released this 17 Oct 18:13

[0.5.1] — Audit complet + formatage

Gates

  • cargo fmt appliqué (tout le repo formaté, vérifié par fmt --check) + fmt --check ajouté au rituel de release.
  • Corrigé : refresh_secs non clampé (une config avec 0 = busy-loop CPU) → clamp 5..3600.
  • Nettoyé : variable batch morte dans scan_ports.

Audit — feuille de route

Voir README (section Feuille de route) pour la liste complète construire/optimiser/sécuriser.

v0.5.0

Choose a tag to compare

@github-actions github-actions released this 17 Oct 18:08

[0.5.0] — Fenêtre desktop + Boutique MCP

Desktop

  • L'app s'ouvre maintenant dans une FENÊTRE dédiée (Edge/Chrome --app, style Electron sans la payload) au lieu d'un onglet navigateur. Fallback navigateur. MCC_NO_BROWSER=1 pour désactiver.

Boutique MCP (portée de l'app Hermes desktop)

  • Bouton « Boutique » : catalogue de 14 serveurs MCP officiels (Filesystem, Git, GitHub, Memory, Fetch, Puppeteer, Brave, PostgreSQL, SQLite, Slack…), catégories + recherche, install en un clic.
  • Import « collez n'importe quoi » (porté de mcp-import.ts) : snippet mcp.json (mcpServers ou mcp_servers ou map brute), commande npx/uvx/docker/claude mcp add, ou simple URL → serveurs créés.
  • Backend : /api/store, actions install_store + import_mcp, parsing tolerant (mcp-doc.ts), nettoyage de noms (@modelcontextprotocol/server-filesystem → filesystem).

Corrigé (Windows)

  • Rust Command::new("npx") échouait : CreateProcess ne résout que les .exe — résolution .cmd dans le PATH ajoutée (npx/uvx fonctionnent).
  • Timeout de handshake stdio 6 s → 15 s (npx télécharge le package au premier lancement).