Skip to content

uninstall

uninstall

Take both halves back out again.

install writes into two places that outlive the Python package: a Houdini packages directory, and an MCP client's config. pip uninstall moves neither, so removing this used to mean knowing where both live and editing them by hand.

The leftovers are not harmless, and they fail in the quiet way this project keeps running into. A package file pointing at a plugin directory that no longer exists is skipped by Houdini without a word. A client entry pointing at a removed interpreter surfaces only as "disconnected". And a forgotten fxhoudinimcp.json in a second packages directory silently overrides the next install, because Houdini processes every packages directory and the last one wins.

fxhoudinimcp uninstall                    # remove both halves, after asking
fxhoudinimcp uninstall --dry-run          # list what it would remove
fxhoudinimcp uninstall --yes              # do not ask
fxhoudinimcp uninstall --houdini-dir DIR  # only this packages directory
fxhoudinimcp uninstall --client none      # leave client configs alone

Unlike install, this does not have to pick between candidate directories. Installing has to know which Houdini you mean; removing does not, because every fxhoudinimcp.json found is a leftover and leaving one behind is the hazard above. So the default is all of them, listed in full before anything is deleted.

The Python package is deliberately left alone. That is pip uninstall fxhoudinimcp, and running it on someone's behalf from inside the package being removed is a good way to produce a half-deleted install.

Functions:

Name Description
build_parser

The argument parser, exposed so the README's flag table can be checked.

confirm

Ask before deleting. Anything but an explicit yes is no.

find_package_files

Every fxhoudinimcp.json this uninstall would remove.

remove_claude_code

Unregister from Claude Code via its own CLI. Returns report lines.

remove_desktop_entry

Drop our entry from Claude Desktop's config, keeping everything else.

remove_package_files

Delete the Houdini package files. Returns report lines.

stdin_is_interactive

Whether there is a person on the other end who can answer a question.

Functions:

build_parser

build_parser() -> ArgumentParser

The argument parser, exposed so the README's flag table can be checked.

confirm

confirm(question: str) -> bool

Ask before deleting. Anything but an explicit yes is no.

find_package_files

find_package_files(houdini_dir: str | None) -> list[Path]

Every fxhoudinimcp.json this uninstall would remove.

With --houdini-dir only that one directory is considered, so a machine with several Houdini versions can have one cleaned without touching the rest. Without it, every candidate directory is searched, which is the point: the file you forget is the one that breaks the next install.

remove_claude_code

remove_claude_code(dry_run: bool) -> list[str]

Unregister from Claude Code via its own CLI. Returns report lines.

remove_desktop_entry

remove_desktop_entry(config: Path, dry_run: bool) -> list[str]

Drop our entry from Claude Desktop's config, keeping everything else.

The same care install takes, for the same reason: this file is likely to hold servers that took someone effort to set up, and an uninstaller that eats them is worse than one that never ran.

remove_package_files

remove_package_files(paths: list[Path], dry_run: bool) -> list[str]

Delete the Houdini package files. Returns report lines.

stdin_is_interactive

stdin_is_interactive() -> bool

Whether there is a person on the other end who can answer a question.

This lives here rather than in install because deleting files is now the only question left worth asking. install used to ask which Houdini packages directory to use and no longer does, having concluded the question was avoidable; this one is not.