Neovim経由でMCPを使う

## はじめに

最近よく聞くMCPですが、Neovimでも使えるようです。
今回はmcphubというプラグインを使用します。

https://github.com/ravitemer/mcphub.nvim

## 前提

- Neovimと生成AIを統合するプラグインで主流なものとして[avante](https://github.com/yetone/avante.nvim)と[codecompanion](https://github.com/olimorris/codecompanion.nvim)の2つがありますが、今回はavanteを使った手順を紹介します

- プラグインマネージャは[lazy](https://github.com/olimorris/codecompanion.nvim)を使用しますが、他のプラグインを使っている方は適宜置き換えてください

:::note warn
MCPサーバを利用する場合、AIが意図しないリソースへアクセスする場合があります。
ツール利用の自動承認をOFFにする(今回紹介するプラグインではデフォルトでOFFになっています)などして、業務コードなどの秘匿情報は各自の責任で保護してください。
:::

## インストール手順

### 1. avanteのインストール

mcphubはチャットツールがないと使えないので、まずはavanteをインストールします。
公式のインストール手順をコピペします。

```lua
{
  "yetone/avante.nvim",
  event = "VeryLazy",
  version = false, -- Never set this value to "*"! Never!
  opts = {
    -- add any opts here
    -- for example
    provider = "openai",
    openai = {
      endpoint = "https://api.openai.com/v1",
      model = "gpt-4o", -- your desired model (or use gpt-4o, etc.)
      timeout = 30000, -- Timeout in milliseconds, increase this for reasoning models
      temperature = 0,
      max_completion_tokens = 8192, -- Increase this to include reasoning tokens (for reasoning models)
      --reasoning_effort = "medium", -- low|medium|high, only used for reasoning models
    },
  },
  -- if you want to build from source then do `make BUILD_FROM_SOURCE=true`
  build = "make",
  -- build = "powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false" -- for windows
  dependencies = {
    "nvim-treesitter/nvim-treesitter",
    "stevearc/dressing.nvim",
    "nvim-lua/plenary.nvim",
    "MunifTanjim/nui.nvim",
    --- The below dependencies are optional,
    "echasnovski/mini.pick", -- for file_selector provider mini.pick
    "nvim-telescope/telescope.nvim", -- for file_selector provider telescope
    "hrsh7th/nvim-cmp", -- autocompletion for avante commands and mentions
    "ibhagwan/fzf-lua", -- for file_selector provider fzf
    "nvim-tree/nvim-web-devicons", -- or echasnovski/mini.icons
    "zbirenbaum/copilot.lua", -- for providers='copilot'
    {
      -- support for image pasting
      "HakonHarnes/img-clip.nvim",
      event = "VeryLazy",
      opts = {
        -- recommended settings
        default = {
          embed_image_as_base64 = false,
          prompt_for_file_name = false,
          drag_and_drop = {
            insert_mode = true,
          },
          -- required for Windows users
          use_absolute_path = true,
        },
      },
    },
    {
      -- Make sure to set this up properly if you have lazy=true
      'MeanderingProgrammer/render-markdown.nvim',
      opts = {
        file_types = { "markdown", "Avante" },
      },
      ft = { "markdown", "Avante" },
    },
  },
}
```

その後、接続するプロバイダによってシェルに環境変数を設定します。
↓公式から引用

:::note info
For Claude:
```shell
export ANTHROPIC_API_KEY=your-api-key
```

For OpenAI:

```shell
export OPENAI_API_KEY=your-api-key
```

For Azure OpenAI:

```shell
export AZURE_OPENAI_API_KEY=your-api-key
```

For Amazon Bedrock:

```shell
export BEDROCK_KEYS=aws_access_key_id,aws_secret_access_key,aws_region[,aws_session_token]
```

Note: The aws_session_token is optional and only needed when using temporary AWS credentials
:::

自分は`.zshrc`で自動的に設定するようにしています。

```sh
if [ -f "$HOME/openai_api_key" ]; then
    export OPENAI_API_KEY=$(cat "$HOME/openai_api_key")
fi
```

環境変数の設定が済んだら、Neovimからavanteを起動します。
デフォルトのキーバインドは`<leader>aa`です。

こんな感じで右側にプロンプトが表示されれば成功です。
![スクリーンショット 2025-05-07 18.14.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844028/eebac1c9-b41e-4915-8e77-5ddef396a1f3.png)

avante単体でも触ってて面白いと思うので、mcphubのインストールに進む前に色々触ってみてください。

### 2. mcphubのインストール

avanteを使えるようになったので、次にmcphubをインストールします。

mcphubをインストールする前に、以下をターミナルで実行しておいてください。
mcphubが参照するファイルが存在しない場合、Neovim実行時エラーになるので事前に手動で作成します。

```sh
mkdir -p ~/.config/mcphub
echo '{ "mcpServers": {} }' > ~/.config/mcphub/servers.json
```

ではプラグインのインストールです。
公式のインストール手順をコピペします。

```lua
{
    "ravitemer/mcphub.nvim",
    dependencies = {
      "nvim-lua/plenary.nvim",  -- Required for Job and HTTP requests
    },
    -- uncomment the following line to load hub lazily
    --cmd = "MCPHub",  -- lazy load 
    build = "npm install -g mcp-hub@latest",  -- Installs required mcp-hub npm module
    -- uncomment this if you don't want mcp-hub to be available globally or can't use -g
    -- build = "bundled_build.lua",  -- Use this and set use_bundled_binary = true in opts  (see Advanced configuration)
    config = function()
      require("mcphub").setup()
    end,
    keys = {
		{ "<leader>m", "<cmd>MCPHub<cr>", desc = "Open MCPHub" },
	},
}
```

追加で自分は`<leader>m`でmcphubのUIを起動するキーバインドを組んでいます。
お好みに変更してください。

次に、avanteとmcphubを統合するためにavante側の設定を書き換えます。
以下をコピペします。

```lua
{
  "yetone/avante.nvim",
  event = "VeryLazy",
  version = false, -- Never set this value to "*"! Never!
  opts = {
    -- add any opts here
    -- for example
    provider = "openai",
    openai = {
      endpoint = "https://api.openai.com/v1",
      model = "gpt-4o", -- your desired model (or use gpt-4o, etc.)
      timeout = 30000, -- Timeout in milliseconds, increase this for reasoning models
      temperature = 0,
      max_completion_tokens = 8192, -- Increase this to include reasoning tokens (for reasoning models)
      --reasoning_effort = "medium", -- low|medium|high, only used for reasoning models
    },
	-- system_prompt as function ensures LLM always has latest MCP server state
	-- This is evaluated for every message, even in existing chats
	system_prompt = function()
		local hub = require("mcphub").get_hub_instance()
		return hub:get_active_servers_prompt()
	end,
	-- Using function prevents requiring mcphub before it's loaded
	custom_tools = function()
		return {
			require("mcphub.extensions.avante").mcp_tool(),
		}
	end,
 	disabled_tools = {
 		"list_files",
 		"search_files",
 		"read_file",
 		"create_file",
 		"rename_file",
 		"delete_file",
 		"create_dir",
 		"rename_dir",
 		"delete_dir",
 		"bash",
 	},
  },
  -- if you want to build from source then do `make BUILD_FROM_SOURCE=true`
  build = "make",
  -- build = "powershell -ExecutionPolicy Bypass -File Build.ps1 -BuildFromSource false" -- for windows
  dependencies = {
  	"ravitemer/mcphub.nvim",
    "nvim-treesitter/nvim-treesitter",
    "stevearc/dressing.nvim",
    "nvim-lua/plenary.nvim",
    "MunifTanjim/nui.nvim",
    --- The below dependencies are optional,
    "echasnovski/mini.pick", -- for file_selector provider mini.pick
    "nvim-telescope/telescope.nvim", -- for file_selector provider telescope
    "hrsh7th/nvim-cmp", -- autocompletion for avante commands and mentions
    "ibhagwan/fzf-lua", -- for file_selector provider fzf
    "nvim-tree/nvim-web-devicons", -- or echasnovski/mini.icons
    "zbirenbaum/copilot.lua", -- for providers='copilot'
    {
      -- support for image pasting
      "HakonHarnes/img-clip.nvim",
      event = "VeryLazy",
      opts = {
        -- recommended settings
        default = {
          embed_image_as_base64 = false,
          prompt_for_file_name = false,
          drag_and_drop = {
            insert_mode = true,
          },
          -- required for Windows users
          use_absolute_path = true,
        },
      },
    },
    {
      -- Make sure to set this up properly if you have lazy=true
      'MeanderingProgrammer/render-markdown.nvim',
      opts = {
        file_types = { "markdown", "Avante" },
      },
      ft = { "markdown", "Avante" },
    },
  },
}
```

mcphubのインストールが完了したら、`:MCPHub`を実行します。
`keys`でキーバインドを設定している方はキーバインドで実行しても問題ないです。

こんな感じになったら成功です:tada:
![スクリーンショット 2025-05-07 18.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844028/414360e2-ecbc-4330-81b3-3943b591649a.png)

## 使ってみる

### サーバのインストール

早速mcphub経由でmcpサーバをインストールしてみます。
今回は`file-system`と`Git Tools`のサーバをインストールしてみます。

mcphubのUIで`C`を押して設定ファイルを開いた後、`e`を押して編集に入ります。
以下をコピペします。フォルダ指定のところだけ書き換えてください。

```lua
{
  "mcpServers": {
    "file-system": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/path/to/allowed/dir"
      ]
    },
    "git-tools": {
      "command": "uvx",
      "displayed": false,
      "args": ["mcp-server-git"]
    }
  }
}
```

:::note info
各サーバのインストール過程で`npx`と`uvx`を使うので、用意してください。
:::

その後、mcphubのUIで`H`を押してホームに戻り`R`で再起動します。

再起動後、このようになっていれば成功です！
![スクリーンショット 2025-05-07 19.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844028/07ebbe93-04fc-444f-ab49-36bde3054b27.png)

インストールできるサーバ一覧はmcphubのUIで`M`を押すとみれます。

:::note info
本来サーバをインストールするときはavante経由でインストールできるのですが、実行時すると`~/.config/mcphub/servers.json`の編集権限がなく実行できなかったので今回は自動インストールにしています。

![スクリーンショット 2025-05-07 19.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844028/446d42b5-7e3b-4b09-a5d9-132237acf3b5.png)
:::

### チャットで指示する

適当なプロジェクトをNeovimで開いて、avanteのプロンプトで修正指示やコミットの指示を投げてみてください。
AIがツールを使ってファイル修正やコミットをしてくれると思います。

## 最後に

Neovimがまだまだ現役で活躍してくれそうで嬉しいです！