てくなべ (tekunabe)

ansible / network automation / 学習メモ

[NetBox] 「 /26 が空いてるネットワークアドレスは?」NetBox MCP Server を試してみた

はじめに

2025年3月の以下のブログで、NetBox MCP Server の存在を知りました。

netboxlabs.com

現状は、読み取り専用 API を通じて、自然言語で問い合わせできるようなもののようです。

当時はそもそも MCP が何なのか知りませんでした(今もだいぶあやふやですが)。ありがたいことに、ちょうどその頃から日本語の解説記事も増えてきて、ほんのちょっと、雰囲気を知りました。

その上で、下のブログや NetBox MCP Server のリポジトリを眺めてみると、試せそうな気がしてきたので試してみました。

いつも通りですが、私の環境でこの手順でこうやったらこうなった、という記録をしているだけの記事です。

環境

環境の準備

基本的には、NetBox MCP Server のリポジトリ の README.md にある手順通りです。

uv のインストール

uv はまだ使ったことがなかったので、インストールしておきました。uv は最近見かける機会が増えてきました。

API トークンの作成

NetBox に admin でログインして、左メニューしたの「管理者」配下の「API トークン」をクリックします。

API トークン一覧が画面の右上の「追加」ボタンをクリックします。

トークン一覧画面

「新規追加トークン画面」でユーザー admin を選択し、「書き込み有効」チェックボックスをオフにします。作成する前に、表示されているトークンを控えておきます。その後、「作成」をクリックします。

トークン追加画面

リポジトリの clone と必要パッケージのインストール

NetBox MCP Server のリポジトリを clone します。

git clone https://github.com/netboxlabs/netbox-mcp-server.git

必要パッケージをインストールします。

cd netbox-mcp-server
uv add -r requirements.txt

ためしに起動

README.md にある通り、試しに server.py を起動します。以降登場する https://demo.netbox.dev はデモサイトの URL です。

% NETBOX_URL=https://demo.netbox.dev/ NETBOX_TOKEN=作成したトークン uv run server.py
[05/03/25 21:03:03] DEBUG    Using selector: KqueueSelector 

正しいのかどうなのかよくわかっらなかったのですが、いきなりエラーが出ることはなかったので、control + C で抜けました。

Claude Desktop の MCP Server 設定

Claude Desktop の設定画面を開き「開発者」内の「構成を編集」をクリックします。

設定 - 開発者

設定ファイル claude_desktop_config.json が開くので、以下の内容にして保存します。

{
    "mcpServers": {
        "netbox": {
            "command": "/Users/sakana/.local/bin/uv",
            "args": [
                "--directory",
                "/Users/sakana/Documents/netbox-mcp-server",
                "run",
                "server.py"
            ],
            "env": {
                "NETBOX_URL": "https://demo.netbox.dev/",
                "NETBOX_TOKEN": "作成したトークン"
            }
        }
    }
}

なお、uv コマンドはパスを通したつもりだったのですが、うまく通せてなかった(後の画面で MCP netbox: spawn uv ENOENT などのエラー)ようで、上記のようなパスを指定しました。

Claude Desktop を再起動して、再度「設定」> 「開発者」を開いて、running になっていることを確認します。

running

会話の画面の「検索とツール」のアイコンを開くと、NetBox MCP Server を認識してくれているようでした。

認識しているよう

README にあった通りの Tool 一覧

聞いてみる

いよいよ聞いてみます。

このデバイスはどのラックにある?

まずは手動で確認しやすいものとして、デバイスが入っているラックについて。

バイス dmi01-stamford-rtr01 はどのラックにありますか?

このデバイスはどのラック?

このデバイスは:
- ラック位置: 4U(前面)
- サイト: DM-Stamford
- デバイスタイプ: Cisco ISR 1111-8P
- ステータス: アクティブ
- テナント: Dunder-Mifflin, Inc.

答えてくれました。確認してみるとあっていました。

NetBox の画面で直接確認

なお、get_objects の部分は、リクエストにはパラメーターらしきもの、レスポンスには API レスポンスらしきものが入っていました。

リクエス

{
  `filters`: {
    `name`: `dmi01-stamford-rtr01`
  },
  `object_type`: `devices`
}

レスポンス

{"id": 10, "url": "https://demo.netbox.dev/api/dcim/devices/10/", "display_url": "https://demo.netbox.dev/dcim/devices/10/", "display": "dmi01-stamford-rtr01", "name": "dmi01-stamford-rtr01", "device_type": {"id": 6, "url": "https://demo.netbox.dev/api/dcim/device-types/6/", "display": "ISR 1111-8P", "manufacturer": {"id": 3, "url": "https://demo.netbox.dev/api/dcim/manufacturers/3/", "display": "Cisco", "name": "Cisco", "slug": "cisco", "description": ""}, "model": "ISR 1111-8P", "slug": "isr1111", "description": ""}, "role": {"id": 1, "url": "https://demo.netbox.dev/api/dcim/device-roles/1/", "display": "Router", "name": "Router", "slug": "router", "description": "", "_depth": 0}, "tenant": {"id": 5, "url": "https://demo.netbox.dev/api/tenancy/tenants/5/", "display": "Dunder-Mifflin, Inc.", "name": "Dunder-Mifflin, Inc.", "slug": "dunder-mifflin", "description": ""}, "platform": {"id": 1, "url": "https://demo.netbox.dev/api/dcim/platforms/1/", "display": "Cisco IOS", "name": "Cisco IOS", "slug": "cisco-ios", "description": ""}, "serial": "", "asset_tag": null, "site": {"id": 11, "url": "https://demo.netbox.dev/api/dcim/sites/11/", "display": "DM-Stamford", "name": "DM-Stamford", "slug": "dm-stamford", "description": ""}, "location": null, "rack": {"id": 10, "url": "https://demo.netbox.dev/api/dcim/racks/10/", "display": "Comms closet", "name": "Comms closet", "description": ""}, "position": 4.0, "face": {"value": "front", "label": "Front"}, "latitude": null, "longitude": null, "parent_device": null, "status": {"value": "active", "label": "Active"}, "airflow": null, "primary_ip": null, "primary_ip4": null, "primary_ip6": null, "oob_ip": null, "cluster": null, "virtual_chassis": null, "vc_position": null, "vc_priority": null, "description": "", "comments": "", "config_template": null, "config_context": {}, "local_context_data": null, "tags": [], "custom_fields": {}, "created": "2020-12-20T00:00:00Z", "last_updated": "2020-12-20T02:56:06.592000Z", "console_port_count": 2, "console_server_port_count": 0, "power_port_count": 1, "power_outlet_count": 0, "interface_count": 14, "front_port_count": 0, "rear_port_count": 0, "device_bay_count": 0, "module_bay_count": 0, "inventory_item_count": 0}

40ポート以上空いているスイッチは?

続いて、

1000BASE-T 以上のポートが40ポート以上空いているスイッチをリスト化してください。

文字数オーバー

残念ながら文字数オーバーになってしまいました。別の会話で聞き直しても類似のエラーになりました。

Claude 自身を使うのが今回が初めてなのですが、無料プランの影響でしょうか。

/26 が空いてるネットワークアドレスは?

続いて、

172.16.0.0/24 配下で、/26 の範囲がまるごと未使用になってるネットワークアドレスを教えて

回答は以下の通り。

IPAM(IPアドレス管理)システムから未使用の/26ネットワークを検索します。172.16.0.0/24ネットワーク内で使用されていない/26サブネットを調べます。

このIPAMの情報から、172.16.0.0/24のネットワークが存在していることがわかりました。次に、このネットワーク内に既に割り当てられている/26またはそれより小さいサブネットを確認します。

次に、このネットワーク内のIPアドレスの使用状況を確認します。

得られた情報を分析すると、172.16.0.0/24内の以下のIPアドレスが使用されています:

- 172.16.0.1 から 172.16.0.31 までのアドレスが割り当てられています

ここから、172.16.0.0/24内で/26のサブネットを検討すると:

1. 172.16.0.0/26 (172.16.0.0 - 172.16.0.63)
  - 既に172.16.0.1-31が使用されているため、完全に未使用ではありません
2. 172.16.0.64/26 (172.16.0.64 - 172.16.0.127)
  - このサブネット内のアドレスは使用されていないようです
3. 172.16.0.128/26 (172.16.0.128 - 172.16.0.191)
  - このサブネット内のアドレスは使用されていないようです
4. 172.16.0.192/26 (172.16.0.192 - 172.16.0.255)
  - このサブネット内のアドレスは使用されていないようです

以上の分析から、172.16.0.0/24ネットワーク内で完全に未使用の/26サブネットは以下の3つです:

1. 172.16.0.64/26 (172.16.0.64 - 172.16.0.127)
2. 172.16.0.128/26 (172.16.0.128 - 172.16.0.191)
3. 172.16.0.192/26 (172.16.0.192 - 172.16.0.255)

これらのサブネットは現在IPアドレスが割り当てられておらず、新しいネットワークの展開に使用できます。

NetBox の画面でプレフィックス 172.16.0.0/24 を確認してみると、確かに空いているのは 172.16.0.64/26172.16.0.128/26172.16.0.192/26 でした。

172.16.0.0/24 内

おわりに

NetBox に対して、自然言語で情報を問い合わせることを試してみました。

実運用上は、多方面で考慮事項があると思いますが、こんな使い方できたら嬉しいかも、と感じました。