0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NetBoxに聞いてみる Ollama+Open WebUIでMCPクライアント構築

Last updated at Posted at 2025-08-31

AI関連の技術を試してみたくて、NetBox 内の情報を MCP サーバ経由で ChatGPT 風にブラウザから調べられる環境を構築してみました。
ちょうど NetBox 側で MCP サーバのツールが公開されていたので、そちらをつかって、さらに、少し前に公開された Gemma 3 という LLM をローカル環境で動かすことにやってみました。

今回、以下のようにチャット形式で NetBox の情報を確認できるようになります。

image.png

最後におまけとして、外部接続では Gemini を使った実験もしています

本記事で紹介する Gemma モデルの利用は、Google が定める Gemma Terms of Use に従う必要があります。実際に利用する場合は必ず最新の規約をご確認ください。

今回の構成

今回は以下のような構成で実施しています
image.png

それぞれの役割は以下のとおりです

  • Open WebUI(ブラウザUI + バックエンド)
    • ブラウザからのUI表示、会話管理、MCPツール呼び出し、Ollama への推論依頼
  • Ollama
    • ローカル環境で LLM を動かすツール、今回は Gemma 3 のモデルを実行
  • Gemma 3
    • LLM 本体
      • Google DeepMind が公開した最新のオープン大規模言語モデル (LLM)
      • 「Gemini」(Googleの商用モデル)とは別で、研究・開発者向けに軽量&無料で使えるモデル
  • 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 上で動かせるようにします。
以下はその内容です。

Dockerfile-NetBox-MCP
# 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
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) モデルを利用しました
これよりもサイズの小さい 270m1b のモデルも選択できますが、チャットの質問にうまく回答してもらえなかったので 4b モデルを今回は利用しました

▼ Gemma 3 で利用できるモデルの一覧

ここまでで、構築は完了です

Open WebUI から NetBox に問い合わせてみる

ブラウザで http://<サーバーのIP>:3000/ を入力すると、Open WebUI が表示されます。
新しいチャットで、NetBox-MCPを下の画像のように有効にします

image.png

IPアドレスを取得してみる

まずは、「NetBox MCPツールを使って、Netbox上のデータの中で 10.99.0.0/24 に登録されているIPv4アドレスの数を教えて」という質問をすると、NetBox上のデータを正しく取得できました
ただし、回答に5分くらいかかります・・・

image.png

サーバー上で以下のコマンドで 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

デバイス情報を取得してみる

次にデバイスの一覧を取得してみました、なかなか期待した回答がもらえず、最後は、以下の画像のような誘導尋問のような質問にして、やっと期待した回答がもらえました
image.png

外部の Google の Gemini (Gemini API)を利用

高速かつ正確な回答を期待して、ローカル LLM の Gemma 3 から、外部の Gemini (Gemini API) に変えて使ってみます

Google AI Studio で API キー発行

  1. Google AI Studio にログイン(Googleアカウント必須)
  2. 左のメニューの下の方の「Get API key」から新しいキーを作成
  3. 「+ APIキーを作成」から作成
  4. 表示された API キーをコピーしておきます

Open WebUI に登録

  1. Open WebUI 管理画面の左下の User を選択 → 「設定」
  2. 開いた設定画面の左下の「管理者設定」を選択
  3. 「接続」を選択し、「OpenAI API」の右の「+」で接続を追加
  4. 以下の画像のように追加
    • 「URL」は https://generativelanguage.googleapis.com/v1beta/openai
    • 「キー」は Google AI Studio で作成した API キーを入力
      image.png
  5. URL の右側にある円の矢印を選択すると、接続を確認して成功すると画面右上に緑色で「サーバー接続が確認されました」が表示されれば OK です
  6. 最後に「保存」で終了

これで新しいチャットを開いて、画面上のモデルを選択する場所で「外部」を選択すると Gemini の複数のモデルが表示されます
image.png

今回は無料枠での利用で「Gemini 1.5 Flash」を使います。
無料枠や料金についてはコチラをご確認ください

確認してみる

「NetBox MCPツールを使って、Netbox上のデータの中で 登録されているデバイスの一覧を教えて、回答は日本語で表形式で回答してください」と質問すると、すぐに以下のように期待通りの回答を返してくれます。

image.png

ローカル環境の Gemma3 を利用する場合は、処理にかなり時間がかかるうえに質問文を厳密に作らなければならないのに比べて、この方法は非常に手軽で便利でした

また、以下のように利用可能なアドレスを調査なども想定通りの回答をもらえました

image.png

一発でいい回答をもらえなくても続けて質問することで、期待している回答がもらえます
image.png

おわりに

NetBox MCP サーバーを経由して、ChatGPT 風にチャットから NetBox の情報を取得する仕組みを試してみました。

ローカル LLM の Gemma 3 を使った場合、回答に時間がかかるうえ、質問の仕方を細かく指定しないといけないため、実用性はやや低いと感じました。
ただし、システムプロンプトであらかじめ条件を設定しておけば、期待に近い回答を得やすくなる可能性があります。

一方で、外部の Gemini を利用したところ、動作が非常に快適で、実運用ではこちらの方がより実用的だと感じました。

▼ 参考にさせていただいたリンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?