はじめに
2025年3月の以下のブログで、NetBox MCP Server の存在を知りました。
現状は、読み取り専用 API を通じて、自然言語で問い合わせできるようなもののようです。
当時はそもそも MCP が何なのか知りませんでした(今もだいぶあやふやですが)。ありがたいことに、ちょうどその頃から日本語の解説記事も増えてきて、ほんのちょっと、雰囲気を知りました。
その上で、下のブログや NetBox MCP Server のリポジトリを眺めてみると、試せそうな気がしてきたので試してみました。
いつも通りですが、私の環境でこの手順でこうやったらこうなった、という記録をしているだけの記事です。
環境
- NetBox Community v4.3.0 (2025/05/03 のデモサイト)
- NetBox MCP Server 2025/04/03 の コミット
a5a4cf7910d7f03e62117a6679e9ea459bff1bab
時点- まだバージョン管理やタグ管理はされていない模様
- Claude Desktop バージョン 0.9.3
- Claude Sonnet 3.7
- 無料プラン
- macOS 13.7.5
環境の準備
基本的には、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
になっていることを確認します。
会話の画面の「検索とツール」のアイコンを開くと、NetBox MCP Server を認識してくれているようでした。
聞いてみる
いよいよ聞いてみます。
このデバイスはどのラックにある?
まずは手動で確認しやすいものとして、デバイスが入っているラックについて。
デバイス dmi01-stamford-rtr01 はどのラックにありますか?
このデバイスは: - ラック位置: 4U(前面) - サイト: DM-Stamford - デバイスタイプ: Cisco ISR 1111-8P - ステータス: アクティブ - テナント: Dunder-Mifflin, Inc.
答えてくれました。確認してみるとあっていました。
なお、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/26
、172.16.0.128/26
、172.16.0.192/26
でした。
おわりに
NetBox に対して、自然言語で情報を問い合わせることを試してみました。
実運用上は、多方面で考慮事項があると思いますが、こんな使い方できたら嬉しいかも、と感じました。