lyraBLOCK
Sovereign, local-first voice DevOps assistant (assistant vocal souverain): Ollama LLM, Whisper STT, Piper TTS and MCP tools for KVM, backups and smart home
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://github.com/amineutron/lyra/actions/workflows/tests.yml) [](LICENSE) [](https://www.python.org/downloads/) [](https://codespaces.new/amineutron/lyra)
English summary. Lyra is a voice-driven DevOps assistant that runs locally by default: Ollama models, faster-whisper speech-to-text, Piper text-to-speech, a three-tier RAG over MCP tool specs, and a resident daemon with text, voice and web clients. It drives KVM virtual machines, backups and home devices through MCP servers, and never runs a sensitive action without a human confirmation. AGPL-3.0 with a commercial option; French-first interface. What is captured and what leaves the machine: docs/user/DATAFLOWS.en.md (French: DATAFLOWS.md).
Assistant vocal DevOps local par défaut — pas d'API cloud, pas de facture, sorties réseau optionnelles et listées. Tu lui parles (ou tu lui écris) en français, il gère tes VMs, tes backups, ta TV, tes lumières. Tout tourne sur ta machine : LLM via Ollama, reconnaissance vocale, synthèse vocale.
Née comme copilote pour gérer un homelab (KVM, backups, domotique), Lyra s'appuie sur un pipeline RAG à 3 niveaux + un routage à base de règles pour éviter d'interroger un LLM à chaque requête triviale — résultat : des réponses en dessous de la seconde une fois le démon chaud.
Démo, en vrai
Enregistrée sur le démon réel avec docs/demo/record.sh : une requête de lecture, puis « supprime la vm test-vm » que Lyra propose comme action destructive et an
47c0cc12f151OBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add mermaid-mcp --env HF_HUB_DISABLE_IMPLICIT_TOKEN=${HF_HUB_DISABLE_IMPLICIT_TOKEN} --env NTFY_TOKEN=${NTFY_TOKEN} --env TOKENIZERS_PARALLELISM=${TOKENIZERS_PARALLELISM} --env TRACKING_TOKEN_FILE=${TRACKING_TOKEN_FILE} -- npx -y [email protected]{
"mcpServers": {
"mermaid-mcp": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"HF_HUB_DISABLE_IMPLICIT_TOKEN": "${HF_HUB_DISABLE_IMPLICIT_TOKEN}",
"NTFY_TOKEN": "${NTFY_TOKEN}",
"TOKENIZERS_PARALLELISM": "${TOKENIZERS_PARALLELISM}",
"TRACKING_TOKEN_FILE": "${TRACKING_TOKEN_FILE}"
}
}
}
}Exposed tools (45)
32 read · 12 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
activate_scene_by_name | read | Active une scene par son NOM (recherche partielle, prefere cet outil!) |
ambilight_color | read | Met l |
ambilight_mode | read | Change le mode Ambilight (follow_video, follow_audio, lounge_light) |
ambilight_off | read | Desactive l |
ambilight_on | read | Active l |
backup_create | write | Cree un backup (timeshift, borg, vm-snapshot, ou manual) |
backup_list | read | Liste tous les backups disponibles (par type ou tous) |
backup_status | read | Affiche le dashboard global des backups (status, espace, alertes) |
backup_verify | read | Verifie l |
generate_diagram | read | Génère un diagramme Mermaid avec template et légende. Si mermaid_code n |
get_all_groups | read | Liste tous les groupes de lumieres |
get_all_lights | read | Liste toutes les lumieres Hue avec leur etat |
get_all_scenes | read | Liste toutes les scenes disponibles |
get_state | read | Retourne l |
help | read | Liste tous les outils disponibles avec leurs descriptions |
launch_app | read | Lance une application (netflix, youtube, plex, disney, prime) |
list_apps | read | Liste les applications disponibles sur la TV |
list_diagrams | read | Liste tous les diagrammes générés dans cette session. |
mute | read | Coupe ou remet le son de la TV |
power_off | read | Eteint la TV Philips (standby) |
power_on | read | Allume la TV Philips |
set_brightness | write | Regle la luminosite d |
set_color_preset | write | Applique un preset de couleur (warm, cool, daylight, relax, energize, red, green, blue) |
set_color_rgb | write | Change la couleur RGB d |
set_display_mode | write | Configure le mode d |
set_group_brightness | write | Regle la luminosite de TOUTES les lumieres d |
set_group_color_preset | write | Applique un preset de couleur a un groupe (warm/cool/daylight/relax/energize/red/green/blue) |
set_group_color_rgb | write | Change la couleur RGB de toutes les lumieres d |
set_scene | write | Active une scene par son ID exact |
show_diagram | read | Affiche un diagramme généré précédemment dans le navigateur. |
tool_name | read | ... |
turn_off_group | read | Eteint toutes les lumieres d |
turn_off_light | read | Eteint une lumiere Hue |
turn_on_group | read | Allume toutes les lumieres d |
turn_on_light | read | Allume une lumiere Hue (light_id: 1=Hue, 2=Hue2, 3=HueBack, 4=HuePlayFront, 5=gradient) |
validate_diagram | read | Valide un diagramme Mermaid selon les bonnes pratiques (12 règles). |
vm_exec | write | Execute une commande dans une VM via SSH |
vm_snapshot | read | Gere les snapshots d |
vm_start | write | Demarre une VM KVM et attend optionnellement que SSH soit accessible |
vm_status | read | Affiche le status et les informations d |
vm_stop | destructive | Arrete une VM KVM proprement (ou force l |
volume_down | read | Baisse le volume de la TV |
volume_set | write | Regle le volume a un niveau specifique (0-60) |
volume_up | read | Augmente le volume de la TV |
youtube_video | read | Lance YouTube sur une video avec compte Premium (ADB, sans pubs) |
Trust audit
BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (10 observation(s))
- Network
- declared (13 observation(s))
- Shell
- declared (2 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (22)
"desc": "cles host SSH + repertoires ~/.ssh/ des users",
requests.post(url, json={"powerstate": "On"}, auth=auth, timeout=3, verify=False)requests.post(url, json={"current": volume, "muted": False}, auth=auth, timeout=3, verify=False)requests.post(url, json={"power": "On"}, auth=auth, timeout=3, verify=False)requests.post(url, json=ambilight, auth=auth, timeout=3, verify=False)
timeout=3, verify=False
api_url: "http://127.0.0.1:8765"
cfg["tracking"] = {"api_url": "http://127.0.0.1:8765",'/api': { target: 'http://127.0.0.1:9877', changeOrigin: true },token: "VOTRE_HA_LONG_LIVED_TOKEN"
vm_stop
echo "SSH refuse sur $vm : la baseline $SNAPSHOT doit autoriser la cle des VM (~/.ssh/config)" >&2
'@mascots': fileURLToPath(new URL('../../assets/mascots.json', import.meta.url)),fs: { allow: ['..', '../../assets'] },LYRA="${LYRA_DIR:-$(cd "$(dirname "$0")/../../../.." && pwd)}"(snap / "config.json").symlink_to("../../blobs/b1")@pytest.mark.parametrize("nom, lien", [("../evasion", None), ("/etc/passwd", None), ("x", "../../etc/passwd")])http://127.0.0.1:9877/ui/ sur l'hote.
neutroncore) sur `http://127.0.0.1:9877/ui/` — backend Python stdlib,
react, react-dom, @types/react, @types/react-dom, @vitejs/plugin-react, typescript, vite
pytest, pytest-cov, pytest-benchmark, pytest-asyncio, ruff, mypy, coverage, ipython
docs/assets/lyra-intro.gif
Gates applied: no_behavioural_pass.
47c0cc12f151full audit observations/trust-audit/mcp-server/amineutron__lyra.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | 47c0cc12f151 | BLOCK | D | 69 | first audit |
Questions
What is the lyra MCP server?
Sovereign, local-first voice DevOps assistant (assistant vocal souverain): Ollama LLM, Whisper STT, Piper TTS and MCP tools for KVM, backups and smart home
What tools does lyra expose?
45 in total: 32 read-only, 12 that write, and 1 that can delete or overwrite (vm_stop). Every one is listed on this page with its risk.
Is lyra safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (69/100) and found 6 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does lyra need?
It reads HF_HUB_DISABLE_IMPLICIT_TOKEN, NTFY_TOKEN, TOKENIZERS_PARALLELISM and TRACKING_TOKEN_FILE from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does lyra run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as mermaid-mcp at 1.0.1.
How current is this page?
The grade is for one exact copy of the source (47c0cc12f151), read on 2026-10-11. The repository is watched and re-audited when it changes.