
mise lspでmise.tomlの書き間違いをエディタで見つける:Neovimで診断・補完・quick fixを試す
どうも!オペ部の西村祐二です!
miseの設定ファイル mise.toml は、ツールのバージョン、環境変数、タスクまで1つのファイルに書けて便利です。一方で、設定キーの綴りを間違えたり、タスクの depends に存在しない名前を書いたりしても、エディタ上では気づきにくいと感じていました。
mise 2026.10.18で、mise.toml 向けの言語サーバーmise lspが追加されました。この記事では、Neovimに mise lsp をつなぎ、わざと誤りを入れた mise.toml を開いて、診断、quick fix、補完、hoverの動きを試します。あわせて、エディタを使わずにLSPのリクエストを直接送り、各機能の応答も確かめます。
mise lspでできること
mise lsp は、エディタから起動され、標準入出力でやり取りするLanguage Server Protocolのサーバーです。リリースノートと公式ドキュメントによると、次の機能があります。
- 診断: TOMLの構文エラー、未知のキー(候補の提示付き)、型の違い、非推奨キー、存在しないタスク名、タスクの循環依存
- quick fix: 未知のキーやタスク名を候補に置き換える、非推奨キーを後継のキーに書き換える
- 補完とhover: 設定キー、
[tools]のツール名、dependsなどのタスク名 - タスクの定義への移動、参照の検索、rename
- mise fmtと同じ整形
- semantic tokens: タスク名やツール名などの色分け(2026.10.19で追加)
全体の関係を自作の概念図にまとめると、次のようになります。

mise lsp は、設定キーの一覧や型をインストール済みのmiseのスキーマから読みます。そのため、使っているmiseのバージョンに合った診断になります。また、公式ドキュメントによると、mise lsp は mise.toml などmiseの設定ファイル以外を無視します。そのため、エディタ側でTOMLファイル全体につないでも、Cargo.toml や pyproject.toml には影響しないとされています(Cargo.toml では後で確かめます)。
Neovimにつなぐ
公式ドキュメントにあるNeovimの設定を使いました。Neovim 0.11以降で使える vim.lsp.config の設定です。最後の1行は、診断を行末に表示するために足したものです。Neovim 0.11以降は行末の表示(virtual text)が既定でオフになっています。
vim.lsp.config("mise", {
cmd = { "mise", "lsp" },
filetypes = { "toml" },
root_markers = { "mise.toml", ".mise.toml" },
})
vim.lsp.enable("mise")
vim.diagnostic.config({ virtual_text = true })
mise 2026.10.18より古いmiseでは、mise lsp はプロジェクトの lsp という名前のタスクとして扱われます。手元のmiseが対応しているかは、mise help lsp の出力に Usage: mise lsp が含まれるかで確かめられます。
以下の操作は、補完プラグインを入れていない素のNeovimで行いました。hoverは K、コードアクションは :lua vim.lsp.buf.code_action()(0.11以降は既定のキー gra でも呼べます)、補完は挿入モードの <C-x><C-o> です。
書き間違いを入れたmise.tomlで試す
次の mise.toml に、わざと5種類の誤りを入れました。
env_path = ["./bin"]
[tools]
node = "24"
[settings]
experimantal = true
jobs = "four"
[tasks.build]
description = "Build the app"
run = "echo build"
depends = ["lnt"]
[tasks.lint]
description = "Lint the sources"
run = "echo lint"
depends = ["test"]
[tasks.test]
run = "echo test"
depends = ["lint"]
- 1行目: 非推奨のキー
env_path - 7行目:
experimentalの綴り間違い - 8行目: 整数を取る
jobsに文字列 - 13行目: 存在しないタスク
lnt - 18行目と22行目:
lintとtestの循環依存
5種類の誤りに6件の診断が出る
ファイルを開くと、循環依存が2行に出るので、6件の診断が行末に表示されました。

| 行 | 種類 | 重要度 | メッセージ |
|---|---|---|---|
| 1 | deprecated-key |
警告 | env_path is deprecated ... use env._.path instead. This will be removed in mise 2027.4.0. |
| 7 | unknown-key |
警告 | unknown key experimantal; did you mean experimental? |
| 8 | invalid-value |
エラー | "four" is not of type "integer" |
| 13 | unknown-task |
警告 | unknown task lnt; did you mean lint? |
| 18 | task-cycle |
エラー | dependency cycle: lint -> test -> lint |
| 22 | task-cycle |
エラー | dependency cycle: test -> lint -> test |
非推奨キーには削除予定のバージョン(mise 2027.4.0)まで出るので、移行の期限も分かります。タスクの循環依存は mise run で実行して初めて気づくことが多く、編集中に見つけられるのは助かりそうです。
quick fixは3種類の誤りに付く
7行目でコードアクションを呼ぶと、候補の experimental に置き換える修正が出ました。

後述のスクリプトでLSPのリクエストを直接送って確かめると、quick fixは次の3つの診断に付いていました。
experimantal→experimentalに置き換えenv_path→env._.pathに置き換え(キー名だけを書き換え、値の["./bin"]はそのまま)lnt→lintに置き換え
env._.path = ["./bin"] はTOMLのドットつきキーなので、[env] テーブルに _.path を書いたのと同じ意味になります。ファイルに別の [env] テーブルがある場合は、同じテーブルを2回定義することになるので、[env] の中へ移す必要がありそうです(この組み合わせは試していません)。型の違い(jobs = "four")と循環依存にはquick fixが付かず、自分で直す必要があります。
hoverでツールのbackendやタスクのコマンドを見る
[tools] の node にカーソルを置いてhoverすると、ツールの説明とbackendが表示されました。

設定キーの上では、型と説明が表示されました(例: settings.jobs は integer で、同時に動かすジョブ数)。depends に書いたタスク名の上では、タスクの説明と run のコマンドが出ます。
dependsの中で定義済みのタスクを補完する
次の画面は、1行目と7行目のquick fixを適用したあとのものです。13行目の depends = ["lnt"] の中身を消して補完を呼ぶと、lint(説明付き)と test が候補に出ました。

LSPに直接送った補完では、[tasks.lint] の depends の中で build と test が返り、自分自身の lint は候補に含まれませんでした。[settings] の直下の行頭で補完を呼ぶと、設定キーが147件返りました(mise 2026.10.19の場合。件数はバージョンと位置で変わります)。
エディタを使わずにLSPの応答を確かめる
画面だけでは分かりにくい部分は、小さなPythonスクリプトを書き、mise lsp を子プロセスで起動してLSPのメッセージを直接送って確かめました。結果は次の通りです。
| 試したこと | 結果 |
|---|---|
| initializeで返る機能 | codeAction、completion、definition、documentFormatting、hover、references、rename、semanticTokens |
depends = ["lint"] から定義へ移動 |
[tasks.lint] の位置 |
lint の参照を検索 |
[tasks.lint] と depends = ["lint"] の2か所 |
lint を check にrename |
上の2か所を書き換える編集。綴り間違いの lnt は対象外 |
スペースを抜いた別の mise.toml(node="24")を整形 |
node = "24" に直す編集。mise fmt の出力と同じ |
綴り間違いを入れた Cargo.toml |
診断、hover、整形のどれも返さない |
trustしていないディレクトリでも動く
検証用のディレクトリは mise trust していないので、mise tasks ls は「not trusted」で失敗しました。それでも mise lsp は診断とhoverを返しました。公式ドキュメントでは、mise lsp は設定を解析するだけで、テンプレートの展開もコマンドの実行もしないとされています。クローンしたばかりのリポジトリの mise.toml を、trustする前にエディタで確認できます。
他のエディタ
Zedについては、公式ドキュメントでmise-zed拡張が mise lsp を起動すると説明されています。今回は試していません。
まとめ
- mise 2026.10.18で追加された
mise lspで、mise.tomlの書き間違いを編集中に確認できました。対象は綴り間違い、型の違い、非推奨キー、存在しないタスク名、タスクの循環依存です - 綴り間違い、非推奨キー、存在しないタスク名にはquick fixが付きます。型の違いと循環依存は自分で直す必要があります
- 補完では
dependsに定義済みのタスク(自分自身は除く)が、hoverではツールのbackendやタスクのrunのコマンドが出ました - Neovimでは、公式ドキュメントの
vim.lsp.configの設定でつながりました - trustしていないディレクトリの
mise.tomlでも診断とhoverが返りました。Cargo.tomlには何も返さなかったので、TOMLファイル全体につないでも他のファイルの邪魔になりません










