AI関連の技術を試してみたくて、NetBox 内の情報を MCP サーバ経由で ChatGPT 風にブラウザから調べられる環境を構築してみました。
ちょうど NetBox 側で MCP サーバのツールが公開されていたので、そちらをつかって、さらに、少し前に公開された Gemma 3 という LLM をローカル環境で動かすことにやってみました。
今回、以下のようにチャット形式で NetBox の情報を確認できるようになります。
最後におまけとして、外部接続では Gemini を使った実験もしています
本記事で紹介する Gemma モデルの利用は、Google が定める Gemma Terms of Use に従う必要があります。実際に利用する場合は必ず最新の規約をご確認ください。
今回の構成
それぞれの役割は以下のとおりです
- Open WebUI(ブラウザUI + バックエンド)
- ブラウザからのUI表示、会話管理、MCPツール呼び出し、Ollama への推論依頼
- Ollama
- ローカル環境で LLM を動かすツール、今回は Gemma 3 のモデルを実行
- Gemma 3
- LLM 本体
- Google DeepMind が公開した最新のオープン大規模言語モデル (LLM)
- 「Gemini」(Googleの商用モデル)とは別で、研究・開発者向けに軽量&無料で使えるモデル
- LLM 本体
- MCP Server
- NetBox 用の MCP Server、 MCP プロトコル経由で MCP クライアント ( Open WebUI ) とやりとり
今回確認した各バージョンは以下の通りです、Ubuntu上に Docker コンテナで各ツールを利用します
- Ubuntu : 24.04.2 LTS
- NetBox関連
- NetBox : v4.3.7
- NetBox MCP Server : 0.1.0
- Open WebUI : v0.6.26
- Ollama : 0.11.8
- gemma3:4b を今回利用
Docker のインストールは、コチラを参考にしてください
環境準備
NetBox 本体の準備
NetBox の Docker 用ファイルを取得するために、リポジトリをクローンします
# NetBox の Docker 用ファイルを取得するために、リポジトリをクローン
git clone -b release --depth=1 https://github.com/netbox-community/netbox-docker.git
# ディレクトリ移動
cd netbox-docker/
NetBox MCP Server の準備
./app
ディレクトリを作成し、そこへ NetBox MCP Server のリポジトリをクローンします。
# ./app ディレクトリを作成
mkdir ./app
# NetBox MCP Server のリポジトリをクローン
git clone --depth=1 https://github.com/netboxlabs/netbox-mcp-server app
次にnetbox-docker
ディレクトリ上に Dockerfile-NetBox-MCP
を作成し、NetBox MCP Server を Docker 上で動かせるようにします。
以下はその内容です。
# Python 3.12 slim + uv + mcpo
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 必要最低限のビルドツール
RUN apt-get update -y && apt-get install -y --no-install-recommends \
curl ca-certificates build-essential git \
&& rm -rf /var/lib/apt/lists/*
# uv をインストール
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
ENV PATH="/root/.local/bin:${PATH}"
# アプリを配置
WORKDIR /opt/app
COPY app/ /opt/app/
# 依存インストール
# requirements.txt は公式リポジトリに含まれています
RUN uv add -r requirements.txt
# ポートは mcpo を 8000 で待受
EXPOSE 8000
# mcpo で NetBox MCP Server を HTTP 化して公開
# 環境変数 NETBOX_URL と NETBOX_TOKEN は docker-compose 側で与えます
CMD ["uvx","mcpo","--port","8000","--","uv","run","server.py"]
docker-compose.override.yml の準備
NetBox の docker-compose.yml
に以下を内容を追記する docker-compose.override.yml
を作成します
- NetBox
- 確実に起動するように
healthcheck
を変更 - 初めからログインユーザとAPIトークンを設定(必要に応じて変更してください)
- 確実に起動するように
- NetBox MCP Server
-
Dockerfile-NetBox-MCP
を利用して NetBox MCP Server 用のコンテナをビルド
-
- Ollama と Open WebUI のコンテナ構築のための内容を記載
以下が docker-compose.override.yml
になります
docker-compose.override.yml
services:
netbox: &netbox
container_name: netbox
ports:
- "80:8080" # NetBox は http://<サーバーのIP>:80
depends_on:
postgres:
condition: service_healthy # netbox 起動前に postgres が起動している必要がある
redis:
condition: service_healthy # netbox 起動前に redis が起動している必要がある
redis-cache:
condition: service_healthy # netbox 起動前に redis-cache が起動している必要がある
healthcheck:
test: curl -f http://localhost:8080/login/ || exit 1
start_period: 180s # 初回でエラーなるため 90s から延長
timeout: 3s
interval: 10s # 15s から短縮
environment:
SKIP_SUPERUSER: "false" # 初回起動時にスーパーユーザ・APIを作成を有効化
SUPERUSER_NAME: "netbox" # ユーザを設定、必要に応じて変更
SUPERUSER_PASSWORD: "netbox" # パスワードを設定、必要に応じて変更
SUPERUSER_EMAIL: "netbox@example.com" # メールアドレスを設定、必要に応じて変更
SUPERUSER_API_TOKEN: "0123456789abcdef0123456789abcdef01234567" # 初回起動時にAPIを設定、必要に応じて変更
netbox-worker:
container_name: netbox-worker
netbox-housekeeping:
container_name: netbox-housekeeping
postgres:
container_name: postgres
redis:
container_name: redis
redis-cache:
container_name: redis-cache
netbox-mcp:
build:
context: .
dockerfile: Dockerfile-NetBox-MCP
container_name: netbox-mcp
environment:
- NETBOX_URL=http://netbox:8080/ # netbox の URL を設定
- NETBOX_TOKEN=0123456789abcdef0123456789abcdef01234567 # netbox の API トークンを設定
ports:
- "8000:8000"
depends_on:
netbox:
condition: service_healthy
ollama:
image: ollama/ollama:latest
container_name: ollama
depends_on:
netbox:
condition: service_healthy
ports:
- "11434:11434" # Ollama API
volumes:
- ollama-models:/root/.ollama
environment:
- OLLAMA_HOST=0.0.0.0
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
depends_on:
- ollama
ports:
- "3000:8080" # Web UI は http://<サーバーのIP>:3000
environment:
- OLLAMA_BASE_URL=http://ollama:11434 # Ollama API URL
- 'TOOL_SERVER_CONNECTIONS=[{"url":"http://netbox-mcp:8000","path":"openapi.json","auth_type":"none","key":"","config":{"enable":true},"info":{"name":"NetBox-MCP","description":"NetBox MCP Server"}}]' # NetBox-MCP の設定
- WEBUI_AUTH=false
volumes:
- openwebui-data:/app/backend/data
volumes:
ollama-models:
openwebui-data:
このディレクトリで
docker compose up -d
を実行すると、各コンテナのビルドと起動がはじまります
Ollama で Gemma 3 モデルを取得する
Ollama は、ローカル環境で LLM を動かすためのランタイムです。利用したいモデルは事前に ollama pull
コマンドでダウンロードしておく必要があります。
Docker 上で動いている場合は、以下のように docker exec
経由でコンテナ内の Ollama CLI を実行して Gemma 3 モデルを適用できます。
docker exec -it ollama bash -lc "ollama pull gemma3:4b"
今回は、Gemma 3 (4B) モデルを利用しました
これよりもサイズの小さい 270m
や 1b
のモデルも選択できますが、チャットの質問にうまく回答してもらえなかったので 4b
モデルを今回は利用しました
▼ Gemma 3 で利用できるモデルの一覧
ここまでで、構築は完了です
Open WebUI から NetBox に問い合わせてみる
ブラウザで http://<サーバーのIP>:3000/
を入力すると、Open WebUI が表示されます。
新しいチャットで、NetBox-MCP
を下の画像のように有効にします
IPアドレスを取得してみる
まずは、「NetBox MCPツールを使って、Netbox上のデータの中で 10.99.0.0/24 に登録されているIPv4アドレスの数を教えて」という質問をすると、NetBox上のデータを正しく取得できました
ただし、回答に5分くらいかかります・・・
サーバー上で以下のコマンドで MCP サーバー側で、どういった問い合わせが来ているか確認できます
docker logs -f netbox-mcp
以下のようなログでMCPサーバーに対して問い合わせが来ていることがわかります
2025-XX-XX XX:06:33,710 - INFO - Calling endpoint: netbox_get_objects, with args: {'object_type': 'ip-addresses', 'filters': {'ip_networks': '10.99.0.0/24'}}
[XX/XX/25 XX:06:33] DEBUG Received message: server.py:587
<mcp.shared.session.RequestResponder
object at 0x783ac9b2f9d0>
INFO Processing request of type server.py:624
CallToolRequest
DEBUG Dispatching request of type server.py:626
CallToolRequest
DEBUG Starting new HTTP connection connectionpool.py:241
(1): netbox:8080
DEBUG http://netbox:8080 "GET connectionpool.py:544
/api/ipam/ip-addresses/?ip_ne
tworks=10.99.0.0%2F24
HTTP/1.1" 200 3391
DEBUG Response sent server.py:673
INFO: 172.18.0.10:58380 - "POST /netbox_get_objects HTTP/1.1" 200 OK
デバイス情報を取得してみる
次にデバイスの一覧を取得してみました、なかなか期待した回答がもらえず、最後は、以下の画像のような誘導尋問のような質問にして、やっと期待した回答がもらえました
外部の Google の Gemini (Gemini API)を利用
高速かつ正確な回答を期待して、ローカル LLM の Gemma 3 から、外部の Gemini (Gemini API) に変えて使ってみます
Google AI Studio で API キー発行
- Google AI Studio にログイン(Googleアカウント必須)
- 左のメニューの下の方の「Get API key」から新しいキーを作成
- 「+ APIキーを作成」から作成
- 表示された API キーをコピーしておきます
Open WebUI に登録
- Open WebUI 管理画面の左下の User を選択 → 「設定」
- 開いた設定画面の左下の「管理者設定」を選択
- 「接続」を選択し、「OpenAI API」の右の「+」で接続を追加
- 以下の画像のように追加
- URL の右側にある円の矢印を選択すると、接続を確認して成功すると画面右上に緑色で「サーバー接続が確認されました」が表示されれば OK です
- 最後に「保存」で終了
これで新しいチャットを開いて、画面上のモデルを選択する場所で「外部」を選択すると Gemini の複数のモデルが表示されます
今回は無料枠での利用で「Gemini 1.5 Flash」を使います。
無料枠や料金についてはコチラをご確認ください
確認してみる
「NetBox MCPツールを使って、Netbox上のデータの中で 登録されているデバイスの一覧を教えて、回答は日本語で表形式で回答してください」と質問すると、すぐに以下のように期待通りの回答を返してくれます。
ローカル環境の Gemma3 を利用する場合は、処理にかなり時間がかかるうえに質問文を厳密に作らなければならないのに比べて、この方法は非常に手軽で便利でした
また、以下のように利用可能なアドレスを調査なども想定通りの回答をもらえました
一発でいい回答をもらえなくても続けて質問することで、期待している回答がもらえます
おわりに
NetBox MCP サーバーを経由して、ChatGPT 風にチャットから NetBox の情報を取得する仕組みを試してみました。
ローカル LLM の Gemma 3 を使った場合、回答に時間がかかるうえ、質問の仕方を細かく指定しないといけないため、実用性はやや低いと感じました。
ただし、システムプロンプトであらかじめ条件を設定しておけば、期待に近い回答を得やすくなる可能性があります。
一方で、外部の Gemini を利用したところ、動作が非常に快適で、実運用ではこちらの方がより実用的だと感じました。
▼ 参考にさせていただいたリンク