rcmdnk's blog

20251014_mise_200_200

codexなどのツールのインストールはHomebrewなどでも簡単にできるようになっていますが、 MCPサーバー用のツールは別途管理する必要があります。

多くはPythonやNode.jsのパッケージとしてuvx/npxなどを使って使う方法が 紹介されていますが、 全部まとめてmiseで管理するようにしました。

よくある方法

MCPサーバー用のツールはPythonやNode.jsのパッケージとして公開されていることが多いです。

これらのツールは隔離された開発環境にpipnpmで直接インストールすることはありますが、 グローバルインストールする方法はあまり推奨されていません。 色々なツールをインストールしているとバージョンの競合などが起きやすくなるためです。

そこでよくある方法としてはuvxnpxを使って実行する方法。

codexの設定だと

~/.codex/config.toml
1
2
3
4
5
6
7
[mcp_servers.serena]
command = "uvx"
args = ["--from", "git+https://github.com/oraios/serena", "serena", "start-mcp-server", "--context", "codex", "--enable-web-dashboard", "false"]

[mcp_servers.context7]
command = "npx"
args = ["-y", "@upstash/context7-mcp", "--api-key", "${CONTEXT7_API_KEY}"]

こんな感じでコマンドにuvxnpxを指定して設定する方法がよく紹介されています。

これらのツールの公式でもこのように紹介されています。

これらはserenaだったりcontext7-mcpというCLIツールを使ってMCPサーバーを起動しますが、 それらをuvxnpxで直接実行しています。

1
2
$ uvx --from git+https://github.com/oraios/serena serena
$ npx -y @upstash/context7-mcp

これらのコマンドを実行すると、もしPATHの中やNode.jsの場合はnode_modules/.binにそのコマンドがあった場合は そちらを優先して実行します。

無い場合、実際には最初の実行時に、~/.cache/uv/~/.npm/_npx/にパッケージがインストールされ、それを使ってコマンドが実行されます。

それらのインストール時には各コマンド毎に隔離した環境が作られるため、複数のツールを使ってもバージョンの競合などは起きません。

インストールせずに実行できる、みたいに書いてあるものもありますが、実際には上に書いたように 実態がインストールされてから実行されるので、 初めて実行しようとすると少し時間がかかります。

これを直接codexのMCPサーバーとして実行しようとすると時間がかかりすぎてタイムアウトエラーになることがあります。 startup_timeout_ms = 60000 などしてタイムアウトを長くして回避することも出来ますが、 できれば先に用意しておいたほうが色々とトラブルを避けられます。

miseで全部管理する

mise(ミーズ)は 開発環境の管理ツールです。

結構機能が盛りだくさんで、

  • 開発ツールの管理
  • プロジェクトごとの開発環境の管理
  • 仮想環境の自動認識
  • タスクの自動化

などが出来ます。

もともと使い始めたのは仮想環境の自動認識のためでした。

それ以外だとpre-commitを使うレポジトリに最初に入るときに自動でpre-commit installを実行する設定 1 をしたりする程度でしたが、 MCPサーバー用のツールもまとめて管理したら便利そうだったのでまとめてみました。

以下の様な設定ファイルを用意します。

~/config/mise/config.toml
1
2
3
4
5
6
7
8
[tools]
node = "24.9.0"
uv = "0.8.22"

"npm:@openai/codex" = "0.42.0"
"npm:@upstash/context7-mcp" = "1.0.20"

"pipx:oraios/serena" = "latest"

これを~/config/mise/config.tomlに保存して

1
$ mise install

すればcodexコマンドと共に、context7-mcpserenaコマンドもインストールされます。

miseのsetup が済んでいれば

1
.local/share/mise/installs/npm-openai-codex/0.42.0/bin/codex

などにインストールされているコマンドへのPATHが通ってcodexだけで実行できるようになっているはずです。

serenaなどもそのまま実行できるようになったので、上の ~/.codex/config.toml

~/.codex/config.toml
1
2
3
4
5
6
7
[mcp_servers.context7]
command = "context7-mcp"
args = ["--api-key", "${CONTEXT7_API_KEY}"]

[mcp_servers.serena]
command = "serena"
args = ["start-mcp-server", "--context", "codex", "--enable-web-dashboard", "false"]

このように直接コマンドを使うように書き換えられます。

この方法の利点としては

  • 事前に必要なツールがmiseのみ。
  • mise installを実行しておくことでcodex起動時には即座に各MCPサーバーが起動できる。
  • バージョン管理が一元化できる
    • mise upgrade --bumpとすると全てのツールを最新にできる。設定ファイルも自動で更新。
  • codexなどもバージョンも含めきちんと管理することができる。
    • HomebrewだとHomebrewに登録された最新バージョンのみ。実際のリリースより遅れることもあり、古いバージョンを(簡単に)使うことは出来ない。
  • ~/.config/mise/config.tomldotfilesなどで管理しておけば複数の環境で同じ環境を簡単に再現できる。

といった感じ。

miseの設定ファイルについて

miseの設定ファイルについてもう少し捕捉。

tools

今回のファイルだと toolsセクションのみのファイルになっていますが、 uv, nodeという管理する側のツールもここで管理します。 別途インストールされてPATHに入っていればPATHの設定次第でそちらが使われる事もあるので、 .bashrcの中などに追加する_mise_hookなどの設定と他のPATHの設定の順序などちょっと注意が必要です。 基本的に最新のものを使っている状態ならそれ程細かく気にする必要はないかもしれませんが。

後は、npmpipxでインストールするツールを指定しています。

pipx (uvx)

pipxと書いてありますが、miseでpipxと書いた場合、uvが入っていればdefaultではuvxがコマンド管理ツールとして使われます。

pipx Backend

uvxコマンドがなければpipxコマンドが使われますが、uvxがあってもpipxを使痛い場合は

1
2
[settings.pipx]
uvx = false

と設定すればpipxが必ず使われます。

ただuvxの方が高速なので無理にこの設定をすることは無いと思います。

pipxの形ではPyPIに公開されているパッケージの他にGitHubに公開されているパッケージや 別のGitリポジトリに公開されているパッケージもインストールできます。 また、zipファイルになっているパッケージもインストールできます。

GitHubに関しては、上にあるように

1
"pipx:oraios/serena" = "latest"

<user>/<repo>の形で指定できます。

このserenaの場合、latestで指定していますが、 現状

1
"pipx:oraios/serena" = "v0.1.4"

などと書いて、指定バージョンをインストールすることは出来ますが、 この状態でmise upgrade --bumpを実行すると

1
mise WARN  Error getting latest version for pipx:oraios/serena: no latest version found

というwarningが出てアップグレードもされません。

latestにしておくとmise lsで確認するとちゃんと最新バージョンが入っていて、 新しいバージョンがリリースされるときちんと更新されるのでここはlatestにしてあります。

PyPIからインストールするような

1
"pipx:mcp-proxy" = "0.9.0"

とかであればバージョンを書いてもmise upgrade --bumpで更新されます。

ここでuvxなどを使ってインストールされる際には ~/.cache/uv/ではなく ~/.local/share/mise/installs の下にインストールされるようになっていて、 miseのsetupが済んでいればインストールされると 自動的にそのコマンドのあるディレクトリへのPATHが通るようになっています。

npmなどの場合も同様です。

npm (bun)

npmの場合は通常npmコマンドが使われますが、bunを使うことも出来ます。

1
2
3
4
5
6
[settings.npm]
bun = true

[tools]
bun = "1.2.23"
...

のような感じにsettings.npm.buntrueにしてbunをインストールすればbunが使われます。 この場合はbunがないとエラーになります。

bunの方が高速なのでbunを使うのも良いと思います。

bunを使う場合はこんな感じになります。

~/config/mise/config.toml
1
2
3
4
5
6
7
8
9
10
11
12
[settings.npm]
bun = true

[tools]
bun = "1.2.23"
node = "24.9.0"
uv = "0.8.22"

"npm:@openai/codex" = "0.42.0"
"npm:@upstash/context7-mcp" = "1.0.20"

"pipx:oraios/serena" = "latest"
Sponsored Links
  1. https://github.com/rcmdnk/python-template/blob/main/.mise.toml

Sponsored Links

« Python, uvで`optional-dependencies`で指定するパッケージをgroupsで重複無くインストール出来るようにする

}