jdx/mise · error

daemon requires @

Error message

daemon {} requires {tool}@{version}

What it means

Each daemon preset entry may pin a tool and version (e.g. postgres@16). validate_tools looks up that tool's BackendArg in the resolved Toolset versions; if the tool is not present in the toolset at all, mise bails telling you which daemon needs which tool@version. The daemon cannot run because its backing tool was never selected for installation.

Solutions

  1. Add the tool to [tools] in mise.toml (e.g. postgres = "16") so it is installed and selected.
  2. Run `mise install` after adding the tool to make sure the version is present locally.
  3. Fix typos in the daemon's tool field so it matches a real tool/backend.
  4. Confirm with `mise ls <tool>` that the tool resolves in the project directory.

Example fix

// before
[daemons.db]
tool = "postgres"
version = "16"

// after
[tools]
postgres = "16"

[daemons.db]
tool = "postgres"
version = "16"
Defensive patterns

Strategy: validation

Validate before calling

# Confirm each daemon's tool resolves before starting daemons
for tool in $(mise ls --parseable | cut -d'#' -f1); do :; done
mise ls postgres || echo "daemon tool missing from [tools]"

Try / catch

try {
  await mise.daemons.start();
} catch (e) {
  const m = String(e).match(/daemon (\S+) requires (\S+)@(\S+)/);
  if (m) console.error(`Add ${m[2]} = "${m[3]}" to [tools] for daemon ${m[1]}.`);
}

Prevention

When it happens

Trigger: A [daemons] entry declares tool = "postgres" version "16" (any version), but the resolved Toolset's versions map has no entry for that BackendArg — the tool is absent from [tools] in mise.toml, .tool-versions, or any other config source.

Common situations: Adding a daemon preset to mise.toml but forgetting to add the corresponding tool to [tools]; a teammate's config requires a tool your machine's config files don't list; a typo in the tool name so it never resolves.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/f9a18b77b91cc823. Report an issue: GitHub.

Appendix: source

Thrown at src/daemons/runtime.rs:398

    doc.insert("daemons".into(), toml::Value::Table(daemons));
    Ok(header + &toml::to_string_pretty(&doc)?)
}

pub(crate) async fn validate_tools(
    set: &DaemonSet,
    config: &Arc<Config>,
    ts: &Toolset,
) -> Result<()> {
    for daemon in set.daemons.values() {
        let Some((tool, version)) = &daemon.tool else {
            continue;
        };
        if cfg!(windows) {
            bail!("daemon presets are not supported on Windows yet");
        }
        let ba: crate::cli::args::BackendArg = tool.as_str().into();
        let Some(versions) = ts.versions.get(&ba) else {
            bail!("daemon {} requires {tool}@{version}", daemon.name);
        };
        let actual = versions
            .versions
            .first()
            .ok_or_else(|| eyre::eyre!("missing {tool}"))?;
        let compatible = ba
            .backend()?
            .list_installed_versions_matching(version)
            .contains(&actual.version);
        if compatible {
            continue;
        }
        let requested = ToolRequest::new(
            ba.into(),
            version,
            ToolSource::MiseTomlDaemon(daemon.source.clone()),
        )?
        .resolve(

View on GitHub (pinned to 533346cc37)