jdx/mise · error

tool not found in registry or installed backend catalogs

Error message

tool {} not found in registry or installed backend catalogs

What it means

`mise search <name>` looks up tools matching a name in the registry and in catalogs of installed backends. If `get_matches` returns no rows, display_table bails because there is nothing to render. It means no registry shorthand and no installed backend knows this tool name.

Solutions

  1. Check spelling and try a partial name
  2. Run `mise registry` to list valid registry shorthands
  3. Install via explicit backend syntax (mise use aqua:owner/repo or github:owner/repo) instead of relying on the registry
  4. Add the tool to a custom registry file if it is used widely enough

Example fix

// before
mise search mytool   # error: not found in registry
// after
mise use aqua:owner/mytool   # explicit backend, no registry shorthand needed
Defensive patterns

Strategy: validation

Validate before calling

mise registry | grep -qw "$tool" && mise search "$tool" || echo "not in registry; use mise use aqua:owner/$tool"

Prevention

When it happens

Trigger: Running `mise search` with a misspelled or unregistered tool name; the tool exists only via an explicit backend (e.g. aqua:owner/repo) and is not installed, so no catalog lists it; registry entry removed or renamed.

Common situations: Typos in tool names; searching for internal/company tools that were never added to the curated registry; tools installed under a different shorthand than searched.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


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

Appendix: source

Thrown at src/cli/search.rs:128

            Err(err) => {
                if err.kind() == std::io::ErrorKind::Interrupted {
                    // user interrupted, exit gracefully
                    Ok(())
                } else {
                    Err(eyre!(err))
                }
            }
        }
    }

    fn display_table(&self, catalog: &[ToolCatalogEntry]) -> Result<()> {
        let tools = self
            .get_matches(catalog)
            .into_iter()
            .map(|(short, description)| vec![short, description])
            .collect_vec();
        if tools.is_empty() {
            bail!(
                "tool {} not found in registry or installed backend catalogs",
                self.name.as_ref().unwrap()
            );
        }

        let mut table = MiseTable::new(self.no_header, &["Tool", "Description"]);
        for row in tools {
            table.add_row(row);
        }
        table.print()
    }

    fn get_matches(&self, catalog: &[ToolCatalogEntry]) -> Vec<(String, String)> {
        let name = self.name.as_deref().unwrap_or("");
        let mut fuzzy_matcher = FuzzyMatcher::default();
        let fuzzy_pattern = FuzzyPattern::new(&name.to_lowercase());
        let mut matches = catalog
            .iter()

View on GitHub (pinned to 533346cc37)