Installationยถ
Meta Package Manager is distributed on PyPI.
So you can install the latest stable release with uv:
$ uv tool install meta-package-manager
Danger
Misleading package name
There is a mpm Python module on PyPI that has nothing to do with this project. Avoid it!
The real package is named meta-package-manager. Only the latter provides the mpm CLI youโre looking for.
Try it nowยถ
You can try Meta Package Manager right now in your terminal, without installing any dependency or virtual env thanks to uvx:
$ uvx meta-package-manager
Installed 21 packages in 42ms
Usage: mpm [OPTIONS] COMMAND [ARGS]...
$ uvx meta-package-manager@5.21.0
Installed 21 packages in 42ms
Usage: mpm [OPTIONS] COMMAND [ARGS]...
$ uvx --from git+https://github.com/kdeldycke/meta-package-manager -- mpm
$ uvx --from file:///Users/me/code/meta-package-manager -- mpm
This will download meta-package-manager (the package), and run mpm, the CLI included in the package.
Try the libraryยถ
You can also try the library itself in an interactive Python shell without installing anything on your system:
$ uvx --with meta-package-manager python
Installed 21 packages in 42ms
Python 3.13.2 (main, Feb 4 2025, 14:51:09) [Clang 16.0.0 (clang-1600.0.26.6)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from meta_package_manager.pool import pool
>>> list(pool['brew'].installed)
[...]
>>>
Installation methodsยถ
mpm is available on several popular package managers:

Easiest way is to install uv, then install meta-package-manager system-wide with the uv tool command:
$ uv tool install meta-package-manager
Then you can run mpm directly:
$ mpm --version
To use mpm as a library in your project instead:
$ uv add meta-package-manager
pipx is a great way to install Python applications globally:
$ pipx install meta-package-manager
You can install the latest stable release and its dependencies with a simple pip call:
$ python -m pip install meta-package-manager
Other variations includes:
$ pip install meta-package-manager
$ pip3 install meta-package-manager
If you have difficulties to use pip, see
pipโs own installation instructions.
Meta Package Manager is available as an Homebrew formula, so you just need to:
$ brew install meta-package-manager
Meta Package Manager is available in the main repository of Scoop, so you just need to:
> scoop install main/meta-package-manager
ZeroBrew is a fast, Homebrew-compatible package manager written in Rust:
$ zb install meta-package-manager
Stew installs pre-compiled binaries from GitHub Releases:
$ stew install kdeldycke/meta-package-manager
An mpm package is available on AUR and can be installed with any AUR helper:
$ pacaur -S meta-package-manager
$ pacman -S meta-package-manager
$ paru -S meta-package-manager
$ yay -S meta-package-manager
Binariesยถ
Binaries are compiled at each release, so you can skip the installation process above and download the standalone executables directly.
This is the preferred way of testing mpm without polluting your machine. They also offer the possibility of running the CLI on older systems not supporting the minimal Python version required by mpm.
Platform |
|
|
|---|---|---|
Linux |
||
macOS |
||
Windows |
All links above points to the latest released version of mpm.
See also
If you need to test previous versions for regression, compatibility or general troubleshooting, youโll find the old binaries attached as assets to past releases on GitHub.
Caution
Each commit to the development branch triggers the compilation of binaries. This way you can easily test the bleeding edge version of mpm and report any issue.
Look at the list of latest binary builds. Then select the latest Build & release/release.yaml workflow run and download the binary artifact corresponding to your platform and architecture.
Note
ABI targets
$ file ./mpm*
./mpm-linux-arm64.bin: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=520bfc6f2bb21f48ad568e46752888236552b26a, for GNU/Linux 3.7.0, stripped
./mpm-linux-x64.bin: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=56ba24bccfa917e6ce9009223e4e83924f616d46, for GNU/Linux 3.2.0, stripped
./mpm-macos-arm64.bin: Mach-O 64-bit executable arm64
./mpm-macos-x64.bin: Mach-O 64-bit executable x86_64
./mpm-windows-arm64.exe: PE32+ executable (console) Aarch64, for MS Windows
./mpm-windows-x64.exe: PE32+ executable (console) x86-64, for MS Windows
Self-bootstrappingยถ
In a funny twist, mpm can be installed with itself.
Which means there is a way to bootstrap its deployment on an unknown system. Just download the binary corresponding to your platform and architecture:
$ curl --fail --remote-name https://github.com/kdeldycke/meta-package-manager/releases/latest/download/mpm-macos-x64.bin
################################################### 100.0%
$ file ./mpm-macos-x64.bin
./mpm-macos-x64.bin: Mach-O 64-bit executable x86_64
$ chmod +x ./mpm-macos-x64.bin
$ ./mpm-macos-x64.bin --version
mpm, version 5.7.0
Then let mpm discovers which package managers are available on your machine and choose the one providing a path to mpm installation:
$ ./mpm-macos-x64.bin install meta-package-manager
warning: Skip unavailable cargo manager.
warning: Skip unavailable steamcmd manager.
Installation priority: brew > cask > composer > gem > mas > npm > pip > pipx > vscode > yarn
warning: No meta-package-manager package found on brew.
warning: No meta-package-manager package found on cask.
warning: No meta-package-manager package found on composer.
warning: No meta-package-manager package found on gem.
warning: No meta-package-manager package found on mas.
warning: No meta-package-manager package found on npm.
warning: pip does not implement search operation.
meta-package-manager existence unconfirmed, try to directly install it...
Install meta-package-manager package with pip...
Collecting meta-package-manager
Downloading meta_package_manager-5.11.1-py3-none-any.whl (161 kB)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 161.5/161.5 kB 494.7 kB/s eta 0:00:00
(...)
Installing collected packages: (...) meta-package-manager
Successfully installed (...) meta-package-manager-5.11.1
And now you can remove the local binary and enjoy the system-wide mpm that was installed by itself:
$ rm -f ./mpm-macos-x64.bin
$ which mpm
/opt/homebrew/bin/mpm
$ mpm --version
mpm, version 5.11.1
Tip
At this moment, mpm can be installed with itself via these managers:
$ mpm --brew install meta-package-manager
$ mpm --pacaur install meta-package-manager
$ mpm --pacman install meta-package-manager
$ mpm --paru install meta-package-manager
$ mpm --pip install meta-package-manager
$ mpm --pipx install meta-package-manager
$ mpm --stew install kdeldycke/meta-package-manager
$ mpm --uvx install meta-package-manager
$ mpm --yay install meta-package-manager
$ mpm --zerobrew install meta-package-manager
Python module usageยถ
Meta Package Manager should now be available system-wide:
$ mpm --version
mpm, version 4.13.0
(...)
If not, you can directly execute the module from Python:
$ python -m meta_package_manager --version
mpm, version 4.13.0
(...)
Password prompts and sudoยถ
The majority of package managers on Linux requires sudo to perform system-wide operations.
On other OSes youโll be prompted to enter your password to install kernel extensions:
$ brew install --cask macfuse
==> Caveats
macfuse requires a kernel extension to work.
If the installation fails, retry after you enable it in:
System Preferences โ Security & Privacy โ General
For more information, refer to vendor documentation or this Apple Technical Note:
https://developer.apple.com/library/content/technotes/tn2459/_index.html
==> Downloading https://github.com/osxfuse/osxfuse/releases/download/macfuse-4.2.5/macfuse-4.2.5.dmg
Already downloaded: /Users/kde/Library/Caches/Homebrew/downloads/d7961d772f16bad95962f1a780b545a5dbb4788ec6e1ec757994bb5296397b1c--macfuse-4.2.5.dmg
==> Installing Cask macfuse
==> Running installer for macfuse; your password may be necessary.
Package installers may write to any location; options such as `--appdir` are ignored.
Password:
Both cases are not handled gracefully by mpm, which doesnโt support (yet) interactive password management and capture.
A workaround on Linux is to install mpm with sudo, so youโll be able to invoke it with sudo too:
$ sudo uv tool install meta-package-manager
(...)
$ sudo mpm upgrade
(...)
Shell completionยถ
Completion for popular shell rely on Click feature.
Add this to ~/.bashrc:
eval "$(_MPM_COMPLETE=bash_source mpm)"
Add this to ~/.zshrc:
eval "$(_MPM_COMPLETE=zsh_source mpm)"
Add this to ~/.config/fish/completions/mpm.fish:
eval (env _MPM_COMPLETE=fish_source mpm)
Alternatively, export the generated completion code as a static script to be executed:
$ _MPM_COMPLETE=bash_source mpm > ~/.mpm-complete.bash
Then source it from ~/.bashrc:
. ~/.mpm-complete.bash
$ _MPM_COMPLETE=zsh_source mpm > ~/.mpm-complete.zsh
Then source it from ~/.zshrc:
. ~/.mpm.zsh
_MPM_COMPLETE=fish_source mpm > ~/.config/fish/completions/mpm.fish
Default dependenciesยถ
This is a graph of the default, main dependencies of the Python package:
flowchart TD
classDef missing stroke-dasharray: 5
beartype["beartype\n0.22.8"]
boltons["boltons\n25.0.0"]
boolean-py["boolean.py\n5.0"]
bracex["bracex\n2.6"]
certifi["certifi\n2025.11.12"]
charset-normalizer["charset-normalizer\n3.4.4"]
click-extra["click-extra\n7.3.0"]
click_0["click\n8.3.1"]
cloup["cloup\n3.0.8"]
cyclonedx-python-lib["cyclonedx-python-lib\n11.6.0"]
deepmerge["deepmerge\n2.0"]
defusedxml["defusedxml\n0.7.1"]
distro["distro\n1.9.0"]
extra-platforms["extra-platforms\n5.1.0"]
idna["idna\n3.11"]
license-expression["license-expression\n30.4.4"]
meta-package-manager["meta-package-manager\n6.0.0"]
more-itertools["more-itertools\n10.8.0"]
packageurl-python["packageurl-python\n0.17.6"]
ply["ply\n3.11"]
py-serializable["py-serializable\n2.1.0"]
pyparsing["pyparsing\n3.2.5"]
pyyaml["PyYAML\n6.0.3"]
rdflib["rdflib\n7.5.0"]
requests["requests\n2.32.5"]
semantic-version["semantic-version\n2.10.0"]
sortedcontainers["sortedcontainers\n2.4.0"]
spdx-tools["spdx-tools\n0.8.3"]
tabulate["tabulate\n0.9.0"]
tomli-w["tomli_w\n1.2.0"]
typing-extensions["typing_extensions\n4.15.0"]
uritools["uritools\n5.0.0"]
urllib3["urllib3\n2.6.0"]
wcmatch["wcmatch\n10.1"]
xmltodict["xmltodict\n1.0.2"]
click-extra -- ">=0.9" --> tabulate
click-extra -- ">=10.0" --> wcmatch
click-extra -- ">=2.0" --> deepmerge
click-extra -- ">=2.32.5" --> requests
click-extra -- ">=25.0.0" --> boltons
click-extra -- ">=3.0.7" --> cloup
click-extra -- ">=5.0.0" --> extra-platforms
click-extra -- ">=8.3.1" --> click_0
cloup -- ">=8.0,<9.0" --> click_0
cyclonedx-python-lib -- ">=0.11,<2" --> packageurl-python
cyclonedx-python-lib -- ">=2.1.0,<3.0.0" --> py-serializable
cyclonedx-python-lib -- ">=2.4.0,<3.0.0" --> sortedcontainers
cyclonedx-python-lib -- ">=30,<31" --> license-expression
cyclonedx-python-lib -- ">=4.6,<5.0" --> typing-extensions
extra-platforms -- ">=1.9.0" --> distro
license-expression -- ">=4.0" --> boolean-py
meta-package-manager -- ">=0.16.0" --> packageurl-python
meta-package-manager -- ">=0.8.2" --> spdx-tools
meta-package-manager -- ">=0.9" --> tabulate
meta-package-manager -- ">=1.0.0" --> xmltodict
meta-package-manager -- ">=1.1.0" --> tomli-w
meta-package-manager -- ">=10.8.0" --> more-itertools
meta-package-manager -- ">=11.2.0" --> cyclonedx-python-lib
meta-package-manager -- ">=25.0.0" --> boltons
meta-package-manager -- ">=5.0.0" --> extra-platforms
meta-package-manager -- ">=7.3.0" --> click-extra
py-serializable -- ">=0.7.1,<0.8.0" --> defusedxml
rdflib -- ">=2.1.0,<4" --> pyparsing
requests -- ">=1.21.1,<3" --> urllib3
requests -- ">=2,<4" --> charset-normalizer
requests -- ">=2.5,<4" --> idna
requests -- ">=2017.4.17" --> certifi
spdx-tools -- "any" --> beartype
spdx-tools -- "any" --> click_0
spdx-tools -- "any" --> license-expression
spdx-tools -- "any" --> ply
spdx-tools -- "any" --> pyyaml
spdx-tools -- "any" --> rdflib
spdx-tools -- "any" --> semantic-version
spdx-tools -- "any" --> uritools
spdx-tools -- "any" --> xmltodict
wcmatch -- ">=2.1.1" --> bracex
Extra dependenciesยถ
By default, mpm supports TOML configuration files and all standard table formats. Optional extras unlock additional configuration file formats and table output formats:
Extra |
Install command |
Unlocks |
|---|---|---|
|
$ uv pip install meta-package-manager[hjson]
|
|
|
$ uv pip install meta-package-manager[json5]
|
|
|
$ uv pip install meta-package-manager[jsonc]
|
|
|
$ uv pip install meta-package-manager[toml]
|
|
|
$ uv pip install meta-package-manager[xml]
|
|
|
$ uv pip install meta-package-manager[yaml]
|
|
Tip
Install all extras at once with:
$ uv pip install meta-package-manager[hjson,json5,jsonc,toml,xml,yaml]
