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
- Add the tool to [tools] in mise.toml (e.g. postgres = "16") so it is installed and selected.
- Run `mise install` after adding the tool to make sure the version is present locally.
- Fix typos in the daemon's tool field so it matches a real tool/backend.
- 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
- Every time you add a [daemons] entry, add its tool to [tools] in the same change
- Run `mise install` and `mise ls <tool>` after config edits
- Verify tool names resolve via `mise which <tool>` (catches typos)
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
- daemon requires @ ( ), but [tools] selects
- pipx is required to install
- another daemon profile is active for
- daemon presets are not supported on Windows yet
- daemon presets are not supported on Windows yet
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)