🦔

uvxで誰でも使えるPython自作ツールを手軽に公開する方法

に公開

uvxとは?

uvxは、Pythonのパッケージマネージャーuvの一部で、PyPIに公開せずともGitHubリポジトリから直接Pythonツールを実行できる便利な機能です。本記事では、誰でも簡単にuvxで動作するツールを作成・公開する方法を解説します。

本記事の前提として、uvの基本を理解していて、セットアップが完了している必要があるため、uvを全く知らない方や、セットアップしていない方は、以下記事を参照してください。

https://zenn.dev/karaage0703/articles/029b45ff78bc57

uvxはuv tool runのエイリアスです。uv toolはPython製のCLIツールを簡単にグローバルにインストールできる機能です。uvxを実行することでPyPIに登録されている多くの(全てではありません)CLIツールを手軽に動かすことができます。

PyPIに登録されたソフトをuvxで動かす方法

例えばPythonのLinter・FormatterであるRuffもuvxで使えます。uvさえインストールされていれば、以下コマンドでLintチェックとフォーマットができます。

$ uvx ruff check
$ uvx ruff format

Ruffについて詳しくは以下記事参照ください。
https://zenn.dev/mkj/articles/4e6833e71b267c

GitHubのリポジトリ上のソフトをuvxで動かす方法

uvxで手軽に動かすためにはPyPIに登録しないと駄目だと思っていたのですが、GitHubリポジトリを指定しても動かすことができることをつい最近知りました。以下みたいに--fromオプションを使います。

$ uvx --from git+https://github.com/user/repo tool-name

これを使えば、GitHubで公開した自作ツールを、多くの人に手軽に使ってもらうことができます。

今回は試しにuvxで動くツールを格納したサンプルリポジトリを作成しました。AIに適当に作ってもらったもので、実用性は皆無です(あくまでuvxをテストするためのリポジトリです)。

https://github.com/karaage0703/uvx-tools

基本的には以下3点を満たしていればuvxで動きます。

  • ライブラリとしてパッケージ化されている(pyproject.toml or setup.pyがある)
  • モジュールかCLIエントリポイントが用意されている
  • 必要なライブラリの依存関係が宣言されている

ライブラリに関して全然分からない場合は、以下記事も参考にしてください
https://zenn.dev/karaage0703/articles/db8c663640c68b

上記ソフトのuvxでの動かし方は、モジュールとして動かす場合は以下です。

$ uvx --from git+https://github.com/karaage0703/uvx-tools python -m hello_uvx.cli

実行すると以下のように表示されます。

╔═══════════════════════════════════╗
║  Hello, World!                    ║
║  Time: 2025-10-01 23:12:43        ║
║  Running via uvx ✨                ║
╚═══════════════════════════════════╝

console_scriptsエントリポイントを使うともっとシンプルに動かせます。pyproject.tomlで以下のように定義します。

[project.scripts]
hello-uvx = "hello_uvx.cli:main"
pysay = "pysay.cli:main"
file-stats = "file_stats.cli:main"

これで、以下のように簡潔に動かせます(表示結果は同じなので省略します)。

$ uvx --from git+https://github.com/karaage0703/uvx-tools hello-uvx

uv tool install でインストールする

頻繁に使うツールは uv tool install でインストールすると便利です。グローバルにインストールするにはconsole_scriptsエントリポイントが必要となります。

以下コマンドでインストールできます。

$ uv tool install git+https://github.com/karaage0703/uvx-tools

インストールされたら以下実行してみましょう。

$ pysay 'Hello'

以下のようにウシさんがHelloと言ってくれます。

 -------
< Hello >
 -------

        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

インストール済みツールの管理

# インストール済みツール一覧
uv tool list

# ツールをアップデート
uv tool upgrade uvx-tools

# 全ツールをアップデート
uv tool upgrade --all

# ツールをアンインストール
uv tool uninstall uvx-tools

自作MCPサーバでuvxを使う場合

自作のMCPサーバ、例えばKaggleの情報を取得するMCPサーバの場合、一度ローカルにMCPサーバをダウンロードして、以下のように絶対パスを使ってMCPサーバの場所を指定をしていました。ただ、これだと環境依存があるので引っかかりやすいのと、なによりコピペできないので面倒ですね。

{
  "mcpServers": {
    "kaggle-mcp-server": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "</path/to/kaggle-mcp-server>",
        "-m",
        "kaggle_mcp_server"
      ]
    }
  }
}

ここで、uvxで--fromを使えば絶対パスを使わずに、以下のようにGitHubのリポジトリを指定する形で書けます。

{
  "mcpServers": {
    "kaggle-mcp": {
      "command": "uvx",
      "args": [
        "--from",
        "git+https://github.com/karaage0703/kaggle-mcp-server",
        "python",
        "-m",
        "kaggle_mcp_server"
      ]
    }
  }
}

MCPサーバを手軽に設定できるので、これで心置きなくMCPサーバをいくらでも作って公開できますね。

まとめ

uvxを使って、PyPIに公開せずに簡単にPythonツールを共有・実行する方法を紹介しました。

ちょっとした便利ツールやMCPサーバを公開するときに便利だと思いますので、よかったら活用してみてください。

MCPサーバを自作したいという人はPythonではじめるMCP開発入門
もどうぞ!(著者としてのダイレクトマーケティングです!)

https://karaage.hatenadiary.jp/entry/python-mcp-book

参考リンク

関連記事

https://zenn.dev/karaage0703/articles/0a8a16edc6f1d0

Discussion