feat(vega): add Navidrome MCP service #197
No reviewers
Labels
No labels
area:authentication
area:flake-utilities
area:performance
area:tbd
host:chaos
host:electra
host:fleet
host:lyra
host:nova
host:vega
investigation
phase:cutover
phase:deploy
phase:mcp
phase:module
phase:packaging
phase:prep
phase:validation
priority:high
priority:medium
project:attic-postgres-lyra-rollout
project:auto-update-reliability
project:auto-update-remediation
project:declarative-purity-cleanup
project:external-review
project:fleet-boundary-cleanup
project:host-facts-refactor
project:lyra-nixos-deploy
project:lyra-service-stack-migration
project:nebula-mesh-network
project:nixos-build-deployment-pipeline
project:security-hardening
project:service-stack-migration
project:vega-sillytavern-cutover
project:wiki-rebuild
repo:numtide/flake-utils
repo:numtide/nix-auth
repo:numtide/nixos-passthru-cache
repo:numtide/nix-relay
service:auto-update
service:mem0
service:nix
service:sillytavern
service:slskd
service:synthseek
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
nimmo/nixos-config!197
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/navidrome-mcp"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #196
Summary
Validation
Remaining live evidence
Deploy to Vega and verify health, authenticated MCP access, a personal playlist operation, and an auto-update no-op before merging.
Automated code review
Reviewed commit:
49b8fa272b3d621dfac55647fdda51aa5570fabfVerdict: Requires further work
Resolve the blocking or important findings and investigate failed deterministic checks before merging.
Overall assessment
The PR introduces a new Navidrome MCP service on Vega, exposing a Streamable HTTP endpoint over Nebula. It adds the
navidrome-mcpflake input, creates SOPS-encrypted secrets for server credentials and client tokens, and configures AI client hosts to consume the remote MCP entry. The service is scoped to Vega with Nebula-only firewall rules, and the auto-update policy is updated.Blocking findings
None.
Important findings
The
.sops.yamlcreation rule forsecrets/navidrome-mcp-clients.yaml$lists recipients:*electra,*lena,*vega,*lyra,*yubikey-nano5c,*yubikey-5-nfc,*provision-key. However, the encrypted file content only contains age-encrypted blocks for 7 recipients. The Lyra recipient key (age1...) is not present in the SOPS metadata block of the provided diff.Impact: If the Lyra host's age key is not included in the encrypted file,
sops-nixon Lyra will fail to decrypt the secret during evaluation or deployment, causing a build failure for that host.Suggested fix: Verify that the SOPS metadata block in
secrets/navidrome-mcp-clients.yamlincludes an encrypted block for Lyra's age public key. If missing, re-encrypt the file ensuring all listed recipients are included.Suggestions
Hardcoded Nebula IP in client URL default (modules/services/navidrome-mcp.nix:68; medium confidence)
default = "http://10.10.0.2:${toString cfg.port}/mcp";Impact: The client URL default hardcodes Vega's Nebula IP (
10.10.0.2). While this is currently correct for Vega, it reduces portability if the configuration is ever reused for other hosts or if Vega's Nebula IP changes. It relies oncfg.listenAddressbeing the same as10.10.0.2.Suggested fix: Consider deriving the client URL default from
cfg.listenAddress(e.g.,"http://${cfg.listenAddress}:${toString cfg.port}/mcp") to ensure consistency and reduce hardcoding.Service dependency on Nebula device unit (modules/services/navidrome-mcp.nix:105; medium confidence)
wants = [ "network-online.target" "nebula@mesh.service" ]; bindsTo = [ "sys-subsystem-net-devices-nebula.mesh.device" ];Impact: The service uses
bindsToon the network device unit. If the Nebula interface goes down, the service will be stopped. This is generally good for correctness but ensure this behavior aligns with operational expectations (e.g., should it restart automatically when Nebula comes back up?Restart = "on-failure"might not trigger on stop due to dependency loss depending on systemd version/config).Suggested fix: Verify that
Restart = "on-failure"behaves as expected when the service is stopped due to a dependency (Nebula device) being removed. Consider ifRestartSecor other restart policies need adjustment for Nebula flakiness.Tests and validation
Questions
secrets/navidrome-mcp-clients.yamlbeen verified to include all recipients listed in.sops.yaml, specifically Lyra's key?10.10.0.2in the client URL default acceptable, or should it be derived fromcfg.listenAddress?Review limitations
nix flake checkto validate the configuration.secrets/navidrome-mcp-clients.yamlshows encrypted content but does not explicitly list all recipient keys in a human-readable format, requiring inference from the number of encrypted blocks.Diff coverage
.sops.yaml: reviewed — included in a context-limited batchREADME.md: reviewed — included in a context-limited batchflake.lock: reviewed — included in a context-limited batchflake.nix: reviewed — included in a context-limited batchhosts/vega/default.nix: reviewed — included in a context-limited batchlib/auto-update-policy.nix: reviewed — included in a context-limited batchmodules/profiles/ai-agents.nix: reviewed — included in a context-limited batchmodules/profiles/ai-runtime.nix: reviewed — included in a context-limited batchmodules/services/navidrome-mcp.nix: reviewed — included in a context-limited batchsecrets/README.md: reviewed — included in a context-limited batchsecrets/navidrome-mcp-clients.yaml: reviewed — included in a context-limited batchsecrets/navidrome-mcp.yaml: reviewed — included in a context-limited batchReview metadata