1.背景: 2.概要: 3.動作確認環境: 4.構築実装ステップ: 5.動作確認: 6.まとめ:
1.背景:
別記事ご紹介したようにApstraでは「Apstra Cloud Services/Data Center Assurance(DCA)」を通じてAIopsを活用できます。
DCAではさまざまなAIopsを実装していますが、2025年7月時点では、自然言語はドキュメント検索が正式リリース(GA)となっており、トラブルシュートや設定方法の確認などに利用することができます。利用しているApstra環境の状態確認を自然言語で行いたい場合は、「Apstra Virtual Assistant/Marvis AI Assistant for DC(Tech Preview)」を利用することができます。こちらは、近いうちにGAになる予定です。
ただし、正式リリースを待たずとも、今回ご紹介する「MCP(Model Context Protocol)」を利用することで、Apstra環境を自分のLLMと連携させ、自然言語で状態確認や設定変更が可能になります。Apstraが「SSoT(Single Source Of Truth)」として保持しているさまざまな情報を利用し、状態確認や設定変更を自然言語で行えるようになります。
なお、サンプル手順やpythonスクリプトのサンプルは、こちらに公開にされており、本記事はそれらをもとに確認した内容となります。
2.概要:
生成AIを活用する際、事前にトレーニングされた情報だけでは不十分な場合があります。そのため、独自の外部情報と連携させることで、最新、かつ固有の情報を取り込みながら生成AIを活用したり、外部のツールに対して自然言語で操作を行うニーズが高まっています。
従来、生成AI と外部システムを連携させるには、システムごとに個別の API 統合が必要であり、認証方法やデータ形式、エラー処理などの細かな実装を都度行う必要がありました。こうした個別実装は、拡張性や保守性の面でも課題となっていました。
この課題を解決するために登場したのが「Model Context Protocol(MCP)」です。2024 年 11 月に Anthropic が発表したこのオープンプロトコルは、AI と外部システムの接続を標準化し、開発者の負担を大幅に軽減します。
Anthropic の公式ドキュメントでは、MCP を「AI アプリケーション用の USB-C ポートのようなもの」と表現しています。USB-C が様々なデバイスを標準化されたインターフェースで接続できるように、MCP も生成 AI モデルと様々なデータソースやツールを標準化された方法で接続することができます。
データセンターインフラの活用方法においても、ネットワーク、サーバー、ストレージ、仮想マシン/コンテナなどで分割されたインフラコンポーネントを別々のツールで管理している場合に、DevOpsエンジニアやビジネス部門のメンバーが共通のインタフェースを通じて状況確認や操作を行えるようになります。
本記事では、MCPを活用して、Network Fabric ManagerであるApstraとClaude Desktopを連携させ、自然言語による操作が可能な環境を構築する方法を紹介します。
3.動作確認環境:
以下の環境で今回動作確認を行いました。
- MCP Client
- Claude for Desktop 0.11.3
- Mac Apple M3
- MacOS Sonoma 14.7.3
- Python 3.13.5
- FastMCP 2.9.2
- MCP Server
- Apstra 6.0.0
- MCPサーバーのためのpythonスクリプトサンプル
https://github.com/vignitin/apstra-mcp-server
4.構築実装ステップ:
以下の手順で構築を行います。
- MacにClaude for Desktop, Python, FastMCPインストール
- Apstra MCP Serverの設定
- Claude for DesktopからApstraの動作確認
4-1.MacにClaude for Desktop , Python, FastMCPインストール
まず、公式サイトからClaude for Desktop をダウンロードしてインストールします。
追加設定は不要で、インストール後に正常に起動できることを確認してください。
次に、必要なパッケージのインストールをします。
# Pythonのバージョンの確認(3.10未満の場合はアップグレードが必要) $ python3 --version # UV(pythonパッケージマネージャ)のインストール $ brew install uv # UVを使って、FastMCP パッケージをインストール $ uv pip install fastmcp
FastMCPが正常にインストールされたか、以下のコマンドでバージョン確認をします。
$ fastmcp version FastMCP version: 2.9.2 MCP version: 1.9.4 Python version: 3.13.5 Platform: macOS-14.7.3-arm64-i386-64bit-Mach-O FastMCP root path: /Users/xxxx/uv/.venv/lib/python3.13/site-packages
4-2.Apstra MCP Serverの設定
ここでは、JuniperのDC スペシャリストのNitin Vigが作成したapstra-mcp-serverのサンプルコードを利用します。これは、Apstra Fabric ManagerのAPIをMCP経由で公開するためのPythonスクリプトです。
% git clone https://github.com/vignitin/apstra-mcp-server % cd apstra-mcp-server/
apstra_mcp_v2.pyの中で、Apstraと接続するための宛先と認証情報(ユーザー名/パスワード)を設定します。
# apstraのサーバーのIPまたはサーバー名を設定します。 # 今回はapstra cloud labの環境を使用しているためサーバー名を指定します。 aos_server = 'apstra-ff2f1ad0-260d-4164-xxxxxx.aws.apstra.com' username = 'admin' password = 'xxxxxx'
この設定だけで基本的な接続は可能です。
apstra_mcp_v2.pyのスクリプトの中身は非常にシンプルで、ApstraのAPIを呼び出す関数が定義されています。たとえば:
get_bp():Blueprint/Fabric情報の取得
get_racks():ラック情報の取得
get_rz():Routing Zone/VRF情報の取得
create_vn():仮想ネットワークの作成
get_diff_status():設定の差分確認
deploy():設定のデプロイ
これらの関数は、MCP経由でClaudeから自然言語で呼び出せるようになります。
from fastmcp import FastMCP
import httpx, sys
# サーバーをインスタンス化し、名前を付けます
mcp = FastMCP("Apstra MCP server")
# Apstraサーバーの接続情報です
aos_server = 'Apstra server IP/Name'
username = 'Apstra username'
password = 'Apstra password'
# 認証機能です。apstra apiの/loginを定義してます。
def auth():
try:
url_login = 'https://' + aos_server + '/api/user/login'
headers_init = { 'Content-Type':"application/json", 'Cache-Control':"no-cache" }
data = f'{{"username": "{username}","password":"{password}"}}'
response = httpx.post(url_login, data=data, headers=headers_init, verify=False)
if response.status_code != 201:
sys.exit('error: authentication failed')
auth_token = response.json()['token']
headers = { 'AuthToken':auth_token, 'Content-Type':"application/json", 'Cache-Control':"no-cache" }
return(headers)
except Exception as e:
print(f"An unexpected error occurred: {e}", file=sys.stderr)
# 以下は、apstraから取得したり設定をするためのそれぞれの関数を定義しています。
# 取得・設定が必要な項目によってこれらを追加することで生成AIでその機能が利用できるようになります。
# Apstraのblueprints情報を取得する関数です。apstra apiの/api/blueprintsを取得します。
@mcp.tool()
def get_bp() - str:
"""Gets blueprint information"""
try:
headers = auth()
url = 'https://' + aos_server + '/api/blueprints'
response = httpx.get(url, headers=headers, verify=False)
return(response.json()['items'])
except Exception as e:
print(f"An unexpected error occurred: {e}", file=sys.stderr)
# Apstraのrack情報を取得する関数です。apstra apiの/blueprints/xx/racksを取得します。
@mcp.tool()
def get_racks(blueprint_id) - str:
"""Gets rack information for a blueprint"""
try:
headers = auth()
url = 'https://' + aos_server + '/api/blueprints/' + blueprint_id + '/racks'
response = httpx.get(url, headers=headers, verify=False)
return(response.json()['items'])
except Exception as e:
print(f"An unexpected error occurred: {e}", file=sys.stderr)
# ApstraのRouting Zone/VRF情報を取得する関数です。apstra apiの/blueprints/xx/security-zonesを取得します。
@mcp.tool()
def get_rz(blueprint_id) - str:
"""Gets routing zone information for a blueprint"""
try:
headers = auth()
url = 'https://' + aos_server + '/api/blueprints/' + blueprint_id + '/security-zones'
response = httpx.get(url, headers=headers, verify=False)
return(response.json())
except Exception as e:
print(f"An unexpected error occurred: {e}", file=sys.stderr)
# Apstraの仮想ネットワークを作成する関数です。apstra apiの/blueprints/xx/virtual-networksで作成します。
# Create virtual networks
@mcp.tool()
def create_vn(blueprint_id, security_zone_id, vn_name) - str:
"""Creates a virtual network in a given blueprint and routing zone"""
try:
headers = auth()
url = 'https://' + aos_server + '/api/blueprints/' + blueprint_id + '/virtual-networks'
data = f'{{"label": "{vn_name}","vn_type":"vxlan","security_zone_id":"{security_zone_id}"}}'
# print(data)
response = httpx.post(url, data=data, headers=headers, verify=False)
return(response.json())
except Exception as e:
print(f"An unexpected error occurred: {e}", file=sys.stderr)
# ApstraからBlueprintのコミット/反映状況を確認する関数です。
# 例えば、各デバイスに設定反映する前に内容が問題ないか確認します。apstra apiの/blueprints/xx/diff-status'を取得します。
@mcp.tool()
def get_diff_status(blueprint_id) - str:
"""Gets the diff status for a blueprint"""
try:
headers = auth()
url = 'https://' + aos_server + '/api/blueprints/' + blueprint_id + '/diff-status'
response = httpx.get(url, headers=headers, verify=False)
return(response.json())
except Exception as e:
print(f"An unexpected error occurred: {e}", file=sys.stderr)
# ApstraからBlueprintのコミット/反映状況をする関数です。apstra apiの/blueprints/xx/deploy'を利用します。
# Deploy config
@mcp.tool()
def deploy(blueprint_id: str, description: str, staging_version:int) - str:
"""Deploys the config for a blueprint"""
try:
headers = auth()
url = 'https://' + aos_server + '/api/blueprints/' + blueprint_id + '/deploy'
data = f'{{"version": {staging_version},"description":"{description}"}}'
print(url)
print(data)
response = httpx.put(url, headers=headers, data=data, verify=False)
return(response.json())
except Exception as e:
print(f"An unexpected error occurred: {e}", file=sys.stderr)
最後に、apstra_mcp_v2.pyを使って、macにインストールしたClaude for DesktopにApstra MCPサーバーを認識させる必要があります。
FastMCPには、設定ファイル(claude_desktop_config.json)を自動で更新するCLIコマンドが用意されています。
# MCPサーバーをClaudeに登録 $ fastmcp install apstra_mcp.py
設定ファイルが以下のように更新されていることを確認します:
% more /Users/hiromit/Library/Application\ Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"Apstra MCP server": {
"command": "uv",
"args": [
"run",
"--with",
"fastmcp",
"fastmcp",
"run",
"/Users/xx/xx/apstra-mcp-server/apstra_mcp_v2.py"
]
}
}
}
4-3.Claude desktopからApstraの動作確認
Claude for Desktop を起動済みの場合は、一旦完全に終了してから再起動してください。
起動後、「検索とツール」を確認すると「Apstra MCP Server」が追加されているのが確認できます。
「Apstra MCP Server」を選択するとスクリプトで定義した6つの関数が確認できます。
設定は以上です。
これで生成AIを使ってApstraの状況確認や設定ができるようになりました。
5.動作確認:
それでは、Claude for Desktopを使って自然言語でApstraの状態を確認してみましょう。
まずは、「Apstraでどんな設定がされている?」とざっくり質問してみます。
Claudeは、ファブリック/Blueprint構成、ルーティングゾーンなど、さまざまな情報を自然言語で返してくれます(以下はその一部のキャプチャです)。
設定の追加も自然言語で行えます。
次に、「仮想ネットワークを追加したい」と入力してみます。
パラメーターを明示的に指定しなくても、ウィザード形式で不足している情報を対話的に聞いてきます。それに答えることで、仮想ネットワークが作成されます。
Apstraの画面を確認すると、test-vn-001という仮想ネットワークが追加されていることがわかります。ただし、まだ「Commit」は実行していないため、各デバイスには設定が反映されていません。
デバイスに反映させる前に差分を確認してから反映させます。
Claude側で差分(Diff)を確認してみると、どのような設定が追加されるのかを把握できます。
期待通りの差分であれば、設定をデバイスに反映(デプロイ)することが可能です。
ただし、商用環境では自然言語での自動デプロイに不安を感じる場合もあるでしょう。その場合は、Apstra側の権限設定で自然言語によるデプロイを制限し、最終確認とデプロイはApstraのGUIで人が行う運用も現実的です。
応用編:関数・利用機能の追加
このように、自然言語でApstraの状態確認や設定が可能であることが確認できました。
ただし、自然言語で利用できるのは、MCPサーバー側でスクリプトで事前に定義された関数のみです。
この関数の追加も非常に簡単です。
利用したいAPIをapstra_mcp_v2.py に追加するだけで、新しい関数を自然言語で利用できるようになります。
例として、Routing Zone(セキュリティゾーン)を作成する関数を追加してみましょう。
このスクリプトも自分で書くこともできますが、Claudeにapstra_mcp_v2.pyを貼り付けて「Routing Zoneを作成する関数を作って」と依頼することで、以下のようなコードを生成してくれました。#thank you for AI
# Create routing zone (security zone)
@mcp.tool()
def create_rz(blueprint_id, rz_name, sz_type="evpn", vrf_name=None, vlan_id=None, vni_id=None, route_target=None) - str:
"""Creates a routing zone (security zone) in a blueprint
Args:
blueprint_id: Blueprint ID
rz_name: Routing zone name/label
sz_type: Security zone type ("evpn" or "l3_fabric"), default is "evpn"
vrf_name: VRF name (optional, defaults to rz_name if not provided)
vlan_id: VLAN ID (required for EVPN type)
vni_id: VNI ID (required for EVPN type)
route_target: Route target (optional, will be auto-generated if not provided for EVPN)
"""
try:
headers = auth()
url = 'https://' + aos_server + '/api/blueprints/' + blueprint_id + '/security-zones'
# Set default VRF name if not provided
if vrf_name is None:
vrf_name = rz_name
# Build the data payload based on security zone type
if sz_type == "evpn":
if vlan_id is None or vni_id is None:
raise ValueError("VLAN ID and VNI ID are required for EVPN security zones")
# Auto-generate route target if not provided
if route_target is None:
route_target = f"{vni_id}:1"
data = f'''{{
"label": "{rz_name}",
"sz_type": "{sz_type}",
"vrf_name": "{vrf_name}",
"vlan_id": {vlan_id},
"vni_id": {vni_id},
"route_target": "{route_target}",
"junos_evpn_irb_mode": "asymmetric"
}}'''
else: # l3_fabric
data = f'''{{
"label": "{rz_name}",
"sz_type": "{sz_type}",
"vrf_name": "{vrf_name}"
}}'''
response = httpx.post(url, data=data, headers=headers, verify=False)
return(response.json())
except Exception as e:
print(f"An unexpected error occurred: {e}", file=sys.stderr)
この関数をapstra_mcp_v2.pyに追加し、Claude for Macを再起動します。
すると、「Apstra MCP Server」に新たな関数create_rzが追加されていることが確認できます。
その後は、他の関数と同様に、自然言語でRouting Zoneの作成が可能になります。
6.まとめ:
本記事では、Model Context Protocol(MCP)を活用して、Juniper ApstraとClaude for Desktopを連携させ、自然言語によるネットワーク管理を実現する方法を紹介しました。
MCPを用いることで、Apstraが提供するAPIを自然言語で呼び出せるようになり、ネットワークの状態確認や設定変更といった操作を、専門的なCLIやGUIに頼らず直感的に行えるようになります。これは、ネットワークエンジニアだけでなく、DevOpsやビジネス部門のユーザーにとっても大きな利便性をもたらします。
一方で、Juniper Apstraには、MCPを使わずとも自然言語で操作可能な仕組みとして、Apstra Cloud ServicesやApstra Virtual Assistant / Marvis AI Assistant for DCが提供されています。これらは現在は、MCPではなくfunction callsをベースにしており、Tech Previewの段階でもすでに270以上の関数が利用可能です。ユーザーが関数を自作する必要がなく、すぐに使える点もメリットのひとつです。また、Tech Previewの実装では設定変更は行えず、状態確認を自然言語で行う関数がサポートされています。
目的や利用シーンに応じて、MCPと公式の自然言語機能を使い分けることで、より柔軟かつ効率的なネットワーク運用が可能になります。
MCPとApstraの連携は非常に容易に行え、ネットワーク運用の未来を先取りする一歩です。今後も、生成AIとインフラ管理の融合が進む中で、こうした取り組みが標準的な運用スタイルとなっていくことが期待されます。
Juniperとしても、今後さらに多様なAI技術を活用し、Experienced First Networkingとしてスマートで柔軟なネットワーク運用を実現していきます。今後の進化にぜひご期待ください。
注意事項(免責)
本スクリプトの作成は、商用利用や本番環境での利用を前提としたものではございません。
本スクリプトの使用により発生した損害・不具合について、Juniper Networks およびClaude/Anthropicは一切責任を負いません。ご利用は自己責任にてお願いいたします。