Atlas / MCP servers / amineutron / lyra

lyraBLOCK

mcp/amineutron/lyra

Sovereign, local-first voice DevOps assistant (assistant vocal souverain): Ollama LLM, Whisper STT, Piper TTS and MCP tools for KVM, backups and smart home

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
45 32r · 12w · 1d
Transport
stdio
License
NOASSERTION
Stars
1
01

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

Read from source at commit 47c0cc12f151OBSERVED · 2026-10-11
02

Connect

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-code
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]
claude-desktop
{
  "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}"
      }
    }
  }
}
03

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.

ToolRiskDescription
activate_scene_by_namereadActive une scene par son NOM (recherche partielle, prefere cet outil!)
ambilight_colorreadMet l
ambilight_modereadChange le mode Ambilight (follow_video, follow_audio, lounge_light)
ambilight_offreadDesactive l
ambilight_onreadActive l
backup_createwriteCree un backup (timeshift, borg, vm-snapshot, ou manual)
backup_listreadListe tous les backups disponibles (par type ou tous)
backup_statusreadAffiche le dashboard global des backups (status, espace, alertes)
backup_verifyreadVerifie l
generate_diagramreadGénère un diagramme Mermaid avec template et légende. Si mermaid_code n
get_all_groupsreadListe tous les groupes de lumieres
get_all_lightsreadListe toutes les lumieres Hue avec leur etat
get_all_scenesreadListe toutes les scenes disponibles
get_statereadRetourne l
helpreadListe tous les outils disponibles avec leurs descriptions
launch_appreadLance une application (netflix, youtube, plex, disney, prime)
list_appsreadListe les applications disponibles sur la TV
list_diagramsreadListe tous les diagrammes générés dans cette session.
mutereadCoupe ou remet le son de la TV
power_offreadEteint la TV Philips (standby)
power_onreadAllume la TV Philips
set_brightnesswriteRegle la luminosite d
set_color_presetwriteApplique un preset de couleur (warm, cool, daylight, relax, energize, red, green, blue)
set_color_rgbwriteChange la couleur RGB d
set_display_modewriteConfigure le mode d
set_group_brightnesswriteRegle la luminosite de TOUTES les lumieres d
set_group_color_presetwriteApplique un preset de couleur a un groupe (warm/cool/daylight/relax/energize/red/green/blue)
set_group_color_rgbwriteChange la couleur RGB de toutes les lumieres d
set_scenewriteActive une scene par son ID exact
show_diagramreadAffiche un diagramme généré précédemment dans le navigateur.
tool_nameread...
turn_off_groupreadEteint toutes les lumieres d
turn_off_lightreadEteint une lumiere Hue
turn_on_groupreadAllume toutes les lumieres d
turn_on_lightreadAllume une lumiere Hue (light_id: 1=Hue, 2=Hue2, 3=HueBack, 4=HuePlayFront, 5=gradient)
validate_diagramreadValide un diagramme Mermaid selon les bonnes pratiques (12 règles).
vm_execwriteExecute une commande dans une VM via SSH
vm_snapshotreadGere les snapshots d
vm_startwriteDemarre une VM KVM et attend optionnellement que SSH soit accessible
vm_statusreadAffiche le status et les informations d
vm_stopdestructiveArrete une VM KVM proprement (ou force l
volume_downreadBaisse le volume de la TV
volume_setwriteRegle le volume a un niveau specifique (0-60)
volume_upreadAugmente le volume de la TV
youtube_videoreadLance YouTube sur une video avec compte Premium (ADB, sans pubs)
04

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.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (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)

HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
lyra/core/workflows/vm_export.py:43
"desc": "cles host SSH + repertoires ~/.ssh/ des users",
Why it matters. touches a credential store
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
scenes/ironman/orchestrator.py:699
requests.post(url, json={"powerstate": "On"}, auth=auth, timeout=3, verify=False)
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
scenes/ironman/orchestrator.py:705
requests.post(url, json={"current": volume, "muted": False}, auth=auth, timeout=3, verify=False)
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
scenes/ironman/orchestrator.py:711
requests.post(url, json={"power": "On"}, auth=auth, timeout=3, verify=False)
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
scenes/ironman/orchestrator.py:713
requests.post(url, json=ambilight, auth=auth, timeout=3, verify=False)
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
scenes/ironman/phases/music_anticipator.py:111
timeout=3, verify=False
Why it matters. certificate verification is disabled
Fix. leave verification on
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
config.yaml.example:312
api_url: "http://127.0.0.1:8765"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
deploy/eval/bootstrap.py:58
cfg["tracking"] = {"api_url": "http://127.0.0.1:8765",
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
installer/app/frontend/vite.config.ts:23
'/api': { target: 'http://127.0.0.1:9877', changeOrigin: true },
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
secrets.yaml.example:16
token: "VOTRE_HA_LONG_LIVED_TOKEN"
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
vm_stop
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWFilesystem / path · fs.credential_store · CWE-22, CWE-59
tests/installer/vm_install_test.sh:109
echo "SSH refuse sur $vm : la baseline $SNAPSHOT doit autoriser la cle des VM (~/.ssh/config)" >&2
Why it matters. touches a credential store
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
installer/app/frontend/vite.config.ts:13
'@mascots': fileURLToPath(new URL('../../assets/mascots.json', import.meta.url)),
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
installer/app/frontend/vite.config.ts:21
fs: { allow: ['..', '../../assets'] },
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
scenes/ironman/tests/e2e/test_ironman_e2e.sh:4
LYRA="${LYRA_DIR:-$(cd "$(dirname "$0")/../../../.." && pwd)}"
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/installer/test_bundle.py:26
(snap / "config.json").symlink_to("../../blobs/b1")
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/installer/test_bundle.py:64
@pytest.mark.parametrize("nom, lien", [("../evasion", None), ("/etc/passwd", None), ("x", "../../etc/passwd")])
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/user/VM_INSTALL_TESTS.md:74
http://127.0.0.1:9877/ui/ sur l'hote.
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
installer/README.md:11
neutroncore) sur `http://127.0.0.1:9877/ui/` — backend Python stdlib,
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
installer/app/frontend/package.json
react, react-dom, @types/react, @types/react-dom, @vitejs/plugin-react, typescript, vite
Why it matters. 7 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
requirements-dev.txt
pytest, pytest-cov, pytest-benchmark, pytest-asyncio, ruff, mypy, coverage, ipython
Why it matters. 9 requirement(s) not pinned with ==
Fix. pin exact versions
INFOInventory / provenance · inv.oversize · CWE-1104
docs/assets/lyra-intro.gif
docs/assets/lyra-intro.gif
Why it matters. 1206013 bytes not read

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 47c0cc12f151full audit observations/trust-audit/mcp-server/amineutron__lyra.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1147c0cc12f151BLOCKD69first audit
06

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.

Advertisement