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

Angry package

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:

Yo dawg, I herd you like 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

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.

pipx is a great way to install Python applications globally:

$ pipx install meta-package-manager

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

Meta Package Manager is available on Chocolatey, so you just need to:

> choco install meta-package-manager

Tip

The Chocolatey package is pending community review. You can help speed up moderation by showing your support on the package page. In the meantime, you can build and install from the specs maintained in the repository:

> git clone https://github.com/kdeldycke/meta-package-manager.git
> cd meta-package-manager\packaging\choco
> choco pack
> choco install meta-package-manager --source .

Meta Package Manager is available in nixpkgs, so you can install it with:

$ nix-env --install --attr nixpkgs.meta-package-manager

Or try it without installing:

$ nix-shell -p meta-package-manager --run "mpm --version"

On flake-enabled systems:

$ nix run nixpkgs#meta-package-manager -- --version

Tip

The nixpkgs package is pending review at NixOS/nixpkgs#506145. You can help move it forward by showing your support on the pull request. In the meantime, you can build and install from the definition maintained in the repository:

$ git clone https://github.com/kdeldycke/meta-package-manager.git
$ nix-env -f ./meta-package-manager/packaging/nix -i

On flake-enabled systems:

$ nix run github:kdeldycke/meta-package-manager?dir=packaging/nix -- --version

A Guix package definition is maintained in the repository and can be installed from a local checkout:

$ git clone https://github.com/kdeldycke/meta-package-manager.git
$ guix install --load-path=./meta-package-manager/packaging/guix python-meta-package-manager

Tip

The Guix package is pending review at guix/guix#8047. You can help move it forward by showing your support on the pull request.

An mpm package is available on AUR and can be installed with any AUR helper:

$ yay -S meta-package-manager
$ paru -S meta-package-manager
$ pacaur -S meta-package-manager

Stew installs pre-compiled binaries from GitHub Releases:

$ stew install kdeldycke/meta-package-manager

ZeroBrew is a fast, Homebrew-compatible package manager written in Rust:

$ zb install 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.

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

Important

Antivirus false positives The binaries are compiled with Nuitka, which produces self-extracting executables with an embedded Python runtime. This packaging pattern is sometimes flagged by ML-based antivirus engines (like Symantec’s ML.Attribute.HighConfidence). These are false positives. If your antivirus quarantines an mpm binary, you can verify its authenticity with the attestation procedure below, then report the false positive to your antivirus vendor. This will help the project a lot.

Release verification

All release artifacts (Python packages and compiled binaries) are signed with GitHub Artifact Attestations providing SLSA v1 provenance. You can verify any downloaded artifact with the GitHub CLI:

$ gh attestation verify ./mpm-macos-arm64.bin --repo kdeldycke/meta-package-manager --signer-repo kdeldycke/repomatic
Loaded digest sha256:... for file://mpm-macos-arm64.bin
Loaded 1 attestation from GitHub API
✓ Verification succeeded!

Important

The --signer-repo kdeldycke/repomatic flag is required because the release workflow runs as a reusable workflow from kdeldycke/repomatic. The signing certificate references that repository, not kdeldycke/meta-package-manager. Without this flag, verification fails.

For Python packages from PyPI:

$ gh attestation verify ./meta_package_manager-6.2.1-py3-none-any.whl --repo kdeldycke/meta-package-manager --signer-repo kdeldycke/repomatic

Attestation bundles are also attached to each GitHub release for offline verification.

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 --choco install meta-package-manager
$ mpm --pip  install meta-package-manager
$ mpm --pipx install meta-package-manager
> mpm --scoop 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 LR
    meta_package_manager[["`meta-package-manager`"]]

    subgraph primary-deps [Primary dependencies]
        click_extra{{"`click-extra`"}}
        cyclonedx_python_lib{{"`cyclonedx-python-lib`"}}
        spdx_tools{{"`spdx-tools`"}}
        pyyaml{{"`pyyaml`"}}
        tomli{{"`tomli`"}}
        xmltodict{{"`xmltodict`"}}
        boltons{{"`boltons`"}}
        extra_platforms{{"`extra-platforms`"}}
        packageurl_python{{"`packageurl-python`"}}
        backports_strenum{{"`backports-strenum`"}}
        more_itertools{{"`more-itertools`"}}
        tomli_w{{"`tomli-w`"}}
    end

    jsonschema(["`jsonschema`"])
    referencing(["`referencing`"])
    requests(["`requests`"])
    click_0(["`click`"])
    typing_extensions(["`typing-extensions`"])
    arrow(["`arrow`"])
    cloup(["`cloup`"])
    colorama(["`colorama`"])
    license_expression(["`license-expression`"])
    rdflib(["`rdflib`"])
    attrs(["`attrs`"])
    idna(["`idna`"])
    isoduration(["`isoduration`"])
    jsonschema_specifications(["`jsonschema-specifications`"])
    py_serializable(["`py-serializable`"])
    python_dateutil(["`python-dateutil`"])
    rfc3339_validator(["`rfc3339-validator`"])
    rfc3987_syntax(["`rfc3987-syntax`"])
    rpds_py(["`rpds-py`"])
    six(["`six`"])
    tabulate(["`tabulate`"])
    wcmatch(["`wcmatch`"])
    beartype(["`beartype`"])
    boolean_py(["`boolean-py`"])
    bracex(["`bracex`"])
    certifi(["`certifi`"])
    charset_normalizer(["`charset-normalizer`"])
    deepmerge(["`deepmerge`"])
    defusedxml(["`defusedxml`"])
    fqdn(["`fqdn`"])
    isodate(["`isodate`"])
    jsonpointer(["`jsonpointer`"])
    lark(["`lark`"])
    lxml(["`lxml`"])
    ply(["`ply`"])
    pyparsing(["`pyparsing`"])
    rfc3986_validator(["`rfc3986-validator`"])
    semantic_version(["`semantic-version`"])
    sortedcontainers(["`sortedcontainers`"])
    tzdata(["`tzdata`"])
    uri_template(["`uri-template`"])
    uritools(["`uritools`"])
    urllib3(["`urllib3`"])
    wcwidth(["`wcwidth`"])
    webcolors(["`webcolors`"])

    subgraph ext_hjson [--extra hjson]
        hjson(["`hjson`"])
    end

    subgraph ext_json5 [--extra json5]
        json5(["`json5`"])
    end

    subgraph ext_jsonc [--extra jsonc]
        json_with_comments(["`json-with-comments`"])
    end

    subgraph grp_docs [--group docs]
        sphinx{{"`sphinx`"}}
        myst_parser{{"`myst-parser >=4`"}}
        furo{{"`furo >=2025.9.25`"}}
        pygments(["`pygments`"])
        docutils(["`docutils`"])
        jinja2(["`jinja2`"])
        sphinx_click{{"`sphinx-click >=6.1`"}}
        sphinxcontrib_mermaid{{"`sphinxcontrib-mermaid >=1.2.3`"}}
        beautifulsoup4(["`beautifulsoup4`"])
        markdown_it_py(["`markdown-it-py`"])
        accessible_pygments(["`accessible-pygments`"])
        mdit_py_plugins(["`mdit-py-plugins`"])
        packaging(["`packaging`"])
        pygments_ansi_color(["`pygments-ansi-color`"])
        sphinx_autodoc_typehints{{"`sphinx-autodoc-typehints >=2.4`"}}
        sphinx_basic_ng(["`sphinx-basic-ng`"])
        sphinx_copybutton{{"`sphinx-copybutton >=0.5.2`"}}
        sphinx_design{{"`sphinx-design >=0.6`"}}
        sphinx_issues{{"`sphinx-issues >=5`"}}
        sphinxext_opengraph{{"`sphinxext-opengraph >=0.13`"}}
        alabaster(["`alabaster`"])
        babel(["`babel`"])
        imagesize(["`imagesize`"])
        markupsafe(["`markupsafe`"])
        mdurl(["`mdurl`"])
        roman_numerals(["`roman-numerals`"])
        snowballstemmer(["`snowballstemmer`"])
        soupsieve(["`soupsieve`"])
        sphinxcontrib_applehelp(["`sphinxcontrib-applehelp`"])
        sphinxcontrib_devhelp(["`sphinxcontrib-devhelp`"])
        sphinxcontrib_htmlhelp(["`sphinxcontrib-htmlhelp`"])
        sphinxcontrib_jsmath(["`sphinxcontrib-jsmath`"])
        sphinxcontrib_qthelp(["`sphinxcontrib-qthelp`"])
        sphinxcontrib_serializinghtml(["`sphinxcontrib-serializinghtml`"])
    end

    subgraph grp_test [--group test]
        pytest{{"`pytest >=9.0.1`"}}
        pytest_cov{{"`pytest-cov >=7`"}}
        pytest_xdist{{"`pytest-xdist >=3.8`"}}
        coverage{{"`coverage >=7.12`"}}
        exceptiongroup(["`exceptiongroup`"])
        pluggy(["`pluggy`"])
        pytest_github_actions_annotate_failures{{"`pytest-github-actions-annotate-failures >=0.3`"}}
        pytest_randomly{{"`pytest-randomly >=4.0.1`"}}
        execnet(["`execnet`"])
        iniconfig(["`iniconfig`"])
        psutil(["`psutil`"])
        tomlkit(["`tomlkit`"])
    end

    subgraph grp_typing [--group typing]
        types_boltons{{"`types-boltons >=25.0.0.20250919`"}}
        types_pyyaml{{"`types-pyyaml >=6.0.12.9`"}}
        types_xmltodict{{"`types-xmltodict >=1.0.1.20250920`"}}
    end

    meta_package_manager ==>|" >=7.7 "| click_extra
    meta_package_manager ==>|" >=0.8.2 "| spdx_tools
    meta_package_manager ==>|" >=11.2 "| cyclonedx_python_lib
    meta_package_manager ==>|" >=6 "| pyyaml
    meta_package_manager ==>|" >=2.3 "| tomli
    meta_package_manager ==>|" >=1 "| xmltodict
    meta_package_manager ==>|" >=25 "| boltons
    meta_package_manager ==>|" >=10 "| extra_platforms
    meta_package_manager ==>|" >=0.16 "| packageurl_python
    meta_package_manager ==>|" >=1.3 "| backports_strenum
    meta_package_manager ==>|" >=10.8 "| more_itertools
    meta_package_manager ==>|" >=1.1 "| tomli_w
    sphinx --> pygments
    sphinx --> requests
    sphinx ==> tomli
    sphinx --> docutils
    sphinx --> jinja2
    sphinx --> colorama
    sphinx --> packaging
    sphinx --> alabaster
    sphinx --> babel
    sphinx --> imagesize
    sphinx --> roman_numerals
    sphinx --> snowballstemmer
    sphinx --> sphinxcontrib_applehelp
    sphinx --> sphinxcontrib_devhelp
    sphinx --> sphinxcontrib_htmlhelp
    sphinx --> sphinxcontrib_jsmath
    sphinx --> sphinxcontrib_qthelp
    sphinx --> sphinxcontrib_serializinghtml
    click_extra ==> sphinx
    click_extra ==> pytest
    click_extra --> pygments
    click_extra --> requests
    click_extra --> click_0
    click_extra ==> pyyaml
    click_extra ==> tomli
    click_extra --> docutils
    click_extra --> cloup
    click_extra ==> xmltodict
    click_extra ==> boltons
    click_extra ==> extra_platforms
    click_extra --> hjson
    click_extra --> json_with_comments
    click_extra --> json5
    click_extra --> pygments_ansi_color
    click_extra --> tabulate
    click_extra --> wcmatch
    click_extra --> deepmerge
    click_extra --> tomlkit
    pytest --> pygments
    pytest ==> tomli
    pytest --> colorama
    pytest --> exceptiongroup
    pytest --> packaging
    pytest --> pluggy
    pytest --> iniconfig
    spdx_tools --> click_0
    spdx_tools ==> pyyaml
    spdx_tools --> license_expression
    spdx_tools --> rdflib
    spdx_tools ==> xmltodict
    spdx_tools --> beartype
    spdx_tools --> ply
    spdx_tools --> semantic_version
    spdx_tools --> uritools
    cyclonedx_python_lib --> jsonschema
    cyclonedx_python_lib --> referencing
    cyclonedx_python_lib --> typing_extensions
    cyclonedx_python_lib --> license_expression
    cyclonedx_python_lib ==> packageurl_python
    cyclonedx_python_lib --> py_serializable
    cyclonedx_python_lib --> lxml
    cyclonedx_python_lib --> sortedcontainers
    myst_parser ==> sphinx
    myst_parser ==> pyyaml
    myst_parser --> docutils
    myst_parser --> jinja2
    myst_parser --> markdown_it_py
    myst_parser --> mdit_py_plugins
    furo ==> sphinx
    furo --> pygments
    furo --> beautifulsoup4
    furo --> accessible_pygments
    furo --> sphinx_basic_ng
    pytest_cov ==> pytest
    pytest_cov ==> coverage
    pytest_cov --> pluggy
    pytest_xdist ==> pytest
    pytest_xdist --> execnet
    pytest_xdist --> psutil
    sphinx_click ==> sphinx
    sphinx_click --> click_0
    sphinx_click --> docutils
    sphinxcontrib_mermaid ==> sphinx
    sphinxcontrib_mermaid ==> pyyaml
    sphinxcontrib_mermaid --> jinja2
    coverage ==> tomli
    pytest_github_actions_annotate_failures ==> pytest
    pytest_randomly ==> pytest
    sphinx_autodoc_typehints ==> sphinx
    sphinx_copybutton ==> sphinx
    sphinx_design ==> sphinx
    sphinx_issues ==> sphinx
    sphinxext_opengraph ==> sphinx
    jsonschema --> referencing
    jsonschema --> attrs
    jsonschema --> idna
    jsonschema --> isoduration
    jsonschema --> jsonschema_specifications
    jsonschema --> rfc3339_validator
    jsonschema --> rfc3987_syntax
    jsonschema --> rpds_py
    jsonschema --> fqdn
    jsonschema --> jsonpointer
    jsonschema --> rfc3986_validator
    jsonschema --> uri_template
    jsonschema --> webcolors
    referencing --> typing_extensions
    referencing --> attrs
    referencing --> rpds_py
    requests --> idna
    requests --> certifi
    requests --> charset_normalizer
    requests --> urllib3
    click_0 --> colorama
    jinja2 --> markupsafe
    beautifulsoup4 --> typing_extensions
    beautifulsoup4 --> soupsieve
    cloup --> click_0
    cloup --> typing_extensions
    license_expression --> boolean_py
    markdown_it_py --> mdurl
    rdflib --> isodate
    rdflib --> pyparsing
    accessible_pygments --> pygments
    exceptiongroup --> typing_extensions
    mdit_py_plugins --> markdown_it_py
    py_serializable --> defusedxml
    pygments_ansi_color --> pygments
    sphinx_basic_ng ==> sphinx
    tabulate --> wcwidth
    wcmatch --> bracex
    isoduration --> arrow
    jsonschema_specifications --> referencing
    rfc3339_validator --> six
    rfc3987_syntax --> lark
    arrow --> python_dateutil
    arrow --> tzdata
    python_dateutil --> six
    meta_package_manager -.-> ext_hjson
    meta_package_manager -.-> ext_json5
    meta_package_manager -.-> ext_jsonc
    meta_package_manager -.-> grp_docs
    meta_package_manager -.-> grp_test
    meta_package_manager -.-> grp_typing

    click accessible_pygments "https://pypi.org/project/accessible-pygments/" _blank
    click alabaster "https://pypi.org/project/alabaster/" _blank
    click arrow "https://pypi.org/project/arrow/" _blank
    click attrs "https://pypi.org/project/attrs/" _blank
    click babel "https://pypi.org/project/babel/" _blank
    click backports_strenum "https://pypi.org/project/backports-strenum/" _blank
    click beartype "https://pypi.org/project/beartype/" _blank
    click beautifulsoup4 "https://pypi.org/project/beautifulsoup4/" _blank
    click boltons "https://pypi.org/project/boltons/" _blank
    click boolean_py "https://pypi.org/project/boolean-py/" _blank
    click bracex "https://pypi.org/project/bracex/" _blank
    click certifi "https://pypi.org/project/certifi/" _blank
    click charset_normalizer "https://pypi.org/project/charset-normalizer/" _blank
    click click_0 "https://pypi.org/project/click/" _blank
    click click_extra "https://pypi.org/project/click-extra/" _blank
    click cloup "https://pypi.org/project/cloup/" _blank
    click colorama "https://pypi.org/project/colorama/" _blank
    click coverage "https://pypi.org/project/coverage/" _blank
    click cyclonedx_python_lib "https://pypi.org/project/cyclonedx-python-lib/" _blank
    click deepmerge "https://pypi.org/project/deepmerge/" _blank
    click defusedxml "https://pypi.org/project/defusedxml/" _blank
    click docutils "https://pypi.org/project/docutils/" _blank
    click exceptiongroup "https://pypi.org/project/exceptiongroup/" _blank
    click execnet "https://pypi.org/project/execnet/" _blank
    click extra_platforms "https://pypi.org/project/extra-platforms/" _blank
    click fqdn "https://pypi.org/project/fqdn/" _blank
    click furo "https://pypi.org/project/furo/" _blank
    click hjson "https://pypi.org/project/hjson/" _blank
    click idna "https://pypi.org/project/idna/" _blank
    click imagesize "https://pypi.org/project/imagesize/" _blank
    click iniconfig "https://pypi.org/project/iniconfig/" _blank
    click isodate "https://pypi.org/project/isodate/" _blank
    click isoduration "https://pypi.org/project/isoduration/" _blank
    click jinja2 "https://pypi.org/project/jinja2/" _blank
    click json_with_comments "https://pypi.org/project/json-with-comments/" _blank
    click json5 "https://pypi.org/project/json5/" _blank
    click jsonpointer "https://pypi.org/project/jsonpointer/" _blank
    click jsonschema "https://pypi.org/project/jsonschema/" _blank
    click jsonschema_specifications "https://pypi.org/project/jsonschema-specifications/" _blank
    click lark "https://pypi.org/project/lark/" _blank
    click license_expression "https://pypi.org/project/license-expression/" _blank
    click lxml "https://pypi.org/project/lxml/" _blank
    click markdown_it_py "https://pypi.org/project/markdown-it-py/" _blank
    click markupsafe "https://pypi.org/project/markupsafe/" _blank
    click mdit_py_plugins "https://pypi.org/project/mdit-py-plugins/" _blank
    click mdurl "https://pypi.org/project/mdurl/" _blank
    click meta_package_manager "https://pypi.org/project/meta-package-manager/" _blank
    click more_itertools "https://pypi.org/project/more-itertools/" _blank
    click myst_parser "https://pypi.org/project/myst-parser/" _blank
    click packageurl_python "https://pypi.org/project/packageurl-python/" _blank
    click packaging "https://pypi.org/project/packaging/" _blank
    click pluggy "https://pypi.org/project/pluggy/" _blank
    click ply "https://pypi.org/project/ply/" _blank
    click psutil "https://pypi.org/project/psutil/" _blank
    click py_serializable "https://pypi.org/project/py-serializable/" _blank
    click pygments "https://pypi.org/project/pygments/" _blank
    click pygments_ansi_color "https://pypi.org/project/pygments-ansi-color/" _blank
    click pyparsing "https://pypi.org/project/pyparsing/" _blank
    click pytest "https://pypi.org/project/pytest/" _blank
    click pytest_cov "https://pypi.org/project/pytest-cov/" _blank
    click pytest_github_actions_annotate_failures "https://pypi.org/project/pytest-github-actions-annotate-failures/" _blank
    click pytest_randomly "https://pypi.org/project/pytest-randomly/" _blank
    click pytest_xdist "https://pypi.org/project/pytest-xdist/" _blank
    click python_dateutil "https://pypi.org/project/python-dateutil/" _blank
    click pyyaml "https://pypi.org/project/pyyaml/" _blank
    click rdflib "https://pypi.org/project/rdflib/" _blank
    click referencing "https://pypi.org/project/referencing/" _blank
    click requests "https://pypi.org/project/requests/" _blank
    click rfc3339_validator "https://pypi.org/project/rfc3339-validator/" _blank
    click rfc3986_validator "https://pypi.org/project/rfc3986-validator/" _blank
    click rfc3987_syntax "https://pypi.org/project/rfc3987-syntax/" _blank
    click roman_numerals "https://pypi.org/project/roman-numerals/" _blank
    click rpds_py "https://pypi.org/project/rpds-py/" _blank
    click semantic_version "https://pypi.org/project/semantic-version/" _blank
    click six "https://pypi.org/project/six/" _blank
    click snowballstemmer "https://pypi.org/project/snowballstemmer/" _blank
    click sortedcontainers "https://pypi.org/project/sortedcontainers/" _blank
    click soupsieve "https://pypi.org/project/soupsieve/" _blank
    click spdx_tools "https://pypi.org/project/spdx-tools/" _blank
    click sphinx "https://pypi.org/project/sphinx/" _blank
    click sphinx_autodoc_typehints "https://pypi.org/project/sphinx-autodoc-typehints/" _blank
    click sphinx_basic_ng "https://pypi.org/project/sphinx-basic-ng/" _blank
    click sphinx_click "https://pypi.org/project/sphinx-click/" _blank
    click sphinx_copybutton "https://pypi.org/project/sphinx-copybutton/" _blank
    click sphinx_design "https://pypi.org/project/sphinx-design/" _blank
    click sphinx_issues "https://pypi.org/project/sphinx-issues/" _blank
    click sphinxcontrib_applehelp "https://pypi.org/project/sphinxcontrib-applehelp/" _blank
    click sphinxcontrib_devhelp "https://pypi.org/project/sphinxcontrib-devhelp/" _blank
    click sphinxcontrib_htmlhelp "https://pypi.org/project/sphinxcontrib-htmlhelp/" _blank
    click sphinxcontrib_jsmath "https://pypi.org/project/sphinxcontrib-jsmath/" _blank
    click sphinxcontrib_mermaid "https://pypi.org/project/sphinxcontrib-mermaid/" _blank
    click sphinxcontrib_qthelp "https://pypi.org/project/sphinxcontrib-qthelp/" _blank
    click sphinxcontrib_serializinghtml "https://pypi.org/project/sphinxcontrib-serializinghtml/" _blank
    click sphinxext_opengraph "https://pypi.org/project/sphinxext-opengraph/" _blank
    click tabulate "https://pypi.org/project/tabulate/" _blank
    click tomli "https://pypi.org/project/tomli/" _blank
    click tomli_w "https://pypi.org/project/tomli-w/" _blank
    click tomlkit "https://pypi.org/project/tomlkit/" _blank
    click types_boltons "https://pypi.org/project/types-boltons/" _blank
    click types_pyyaml "https://pypi.org/project/types-pyyaml/" _blank
    click types_xmltodict "https://pypi.org/project/types-xmltodict/" _blank
    click typing_extensions "https://pypi.org/project/typing-extensions/" _blank
    click tzdata "https://pypi.org/project/tzdata/" _blank
    click uri_template "https://pypi.org/project/uri-template/" _blank
    click uritools "https://pypi.org/project/uritools/" _blank
    click urllib3 "https://pypi.org/project/urllib3/" _blank
    click wcmatch "https://pypi.org/project/wcmatch/" _blank
    click wcwidth "https://pypi.org/project/wcwidth/" _blank
    click webcolors "https://pypi.org/project/webcolors/" _blank
    click xmltodict "https://pypi.org/project/xmltodict/" _blank

    style meta_package_manager stroke-width:3px
    style backports_strenum stroke-width:3px
    style boltons stroke-width:3px
    style click_extra stroke-width:3px
    style coverage stroke-width:3px
    style cyclonedx_python_lib stroke-width:3px
    style extra_platforms stroke-width:3px
    style furo stroke-width:3px
    style more_itertools stroke-width:3px
    style myst_parser stroke-width:3px
    style packageurl_python stroke-width:3px
    style pytest stroke-width:3px
    style pytest_cov stroke-width:3px
    style pytest_github_actions_annotate_failures stroke-width:3px
    style pytest_randomly stroke-width:3px
    style pytest_xdist stroke-width:3px
    style pyyaml stroke-width:3px
    style spdx_tools stroke-width:3px
    style sphinx stroke-width:3px
    style sphinx_autodoc_typehints stroke-width:3px
    style sphinx_click stroke-width:3px
    style sphinx_copybutton stroke-width:3px
    style sphinx_design stroke-width:3px
    style sphinx_issues stroke-width:3px
    style sphinxcontrib_mermaid stroke-width:3px
    style sphinxext_opengraph stroke-width:3px
    style tomli stroke-width:3px
    style tomli_w stroke-width:3px
    style types_boltons stroke-width:3px
    style types_pyyaml stroke-width:3px
    style types_xmltodict stroke-width:3px
    style xmltodict stroke-width:3px

    style primary-deps fill:#1565C020,stroke:#42A5F5
    style ext_hjson fill:#7B1FA220,stroke:#BA68C8
    style ext_json5 fill:#7B1FA220,stroke:#BA68C8
    style ext_jsonc fill:#7B1FA220,stroke:#BA68C8
    style grp_docs fill:#546E7A20,stroke:#90A4AE
    style grp_test fill:#546E7A20,stroke:#90A4AE
    style grp_typing fill:#546E7A20,stroke:#90A4AE

    

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

hjson

$ uv pip install meta-package-manager[hjson]

json5

$ uv pip install meta-package-manager[json5]
  • JSON5 config files: --config mpm.json5

jsonc

$ uv pip install meta-package-manager[jsonc]
  • JSONC config files: --config mpm.jsonc

toml

$ uv pip install meta-package-manager[toml]

xml

$ uv pip install meta-package-manager[xml]

yaml

$ 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]