OpenAI Codex のデスクトップアプリ版から MCP サーバを登録してコントロールできるとのことで試してみました。
今回は以下を実施してみまました
- containerlab 上に以下を準備
- MCP サーバを構築
- pyATS MCP を利用
- Arista cEOS / Juniper cJunosEvolved を接続
- MCP サーバを構築
- Windows の Codex から MCP Server を登録
- Codex から 自然言語で EOS/Junos を操作
という構成を試してみました。
以下の画像は Codex のチャットからインターフェースの IP 設定をしてもらったときの画像です

構成イメージ
- pyATS MCP Server
- Arista cEOS
- Juniper cJunosEvolved
を containerlab 上で起動します。
Codex から MCP Server に接続し、EOS/Junos を自然言語で操作します。
今回の環境
- Ubuntu 24.04.4 LTS
- containerlab : 0.75.0
- pyATS MCP
- Arista cEOS : 4.36.0.1F
- Juniper cJunosEvolved : 25.4R1.13-EVO
- Codex ( Windows デスクトップアプリ )
事前準備
今回は Containerlab 上で cEOS、cJunosEvolved、pyATS MCP Server を動作させます。
事前に以下を準備しておきます。
- Containerlab
- Arista cEOS イメージ
- Juniper cJunosEvolved イメージ
Containerlab のインストール
Ubuntu 環境では以下のコマンドでインストールできます。
curl -sL https://containerlab.dev/setup | sudo -E bash -s "all"
インストール後にバージョンを確認します。
containerlab version
今回利用したバージョンは以下です。
containerlab : 0.75.0
cEOS の準備
Arista から取得した cEOS イメージを Docker に読み込みます。
( cEOS は Arista のサポートサイトから取得します。無料で取得できますが Arista アカウント登録が必要です)
docker image load -i cEOS64-lab-4.36.0.1F.tar.xz
読み込み後に確認します。
docker images
今回の記事では以下のタグを利用しています。
ceos:4.36.0.1F
cJunosEvolved の準備
Juniper のダウンロードサイトから cJunosEvolved の Docker Tarball を取得します。
取得したイメージを Docker に読み込みます。
docker image load -i cJunosEvolved-25.4R1.13-EVO.tar.gz
読み込み後に確認します。
docker images
今回利用したイメージは以下です。
cjunosevolved:25.4R1.13-EVO
pyATS MCP Server のビルド
以下の手順でまずは pyATS MCP Server のコンテナをビルドします
# 今回の構成やコンフィグを一式 GitHub からダウンロード
git clone --depth=1 https://github.com/katsumi2018/clab-pyats-mcp.git
# ディレクトリ移動
cd clab-pyats-mcp
# ビルド
docker build -t pyats-mcp-proxy:latest .
docker imagesコマンドで以下のように表示されれば準備完了です
$ docker images
IMAGE ID DISK USAGE
ceos:4.36.0.1F 02db955e2eec 2.25GB
cjunosevolved:25.4R1.13-EVO ec5c060ab764 2.11GB
pyats-mcp-proxy:latest 5a4db979eef5 1.88GB
$
今回はこれらのイメージを利用して、
- cEOS
- cJunosEvolved
- pyATS MCP Server
を Containerlab 上で起動し、Codex から MCP Server 経由で操作していきます。
ディレクトリ構成
今回利用するファイルは以下のとおりとなります
clab-pyats-mcp/
├── clab-pyats-mcp.clab.yml
├── Dockerfile
├── .env
└── testbed.yaml
containerlab トポロジー
今回利用した containerlab のトポロジーファイルです。
Containerlab では YAML 形式でノードやリンクを定義できます。
今回は cEOS と cJunosEvolved を 1 本のリンクで直結しています。
ceos1 eth1
|
cjunosevo1 et-0/0/0
Dockerfile
pyATS MCP Server のコンテナをビルドするための Dockerfile です。
主なポイントは以下のとおりです。
- pyATS MCP を git clone
- requirements.txt を install
- mcp-proxy を利用
- HTTP で MCP を公開
.env
pyATS MCP Server が参照する環境変数です。
testbed ファイルのパスやキャッシュ動作などを設定しています。
PYATS_MCP_CONNECTION_TIMEOUT=
PYATS_MCP_MIT=
と設定することで、testbed ファイルで定義した内容を読み込めるようになります
pyATS testbed.yaml
pyATS が利用する testbed ファイルです。
cEOS と cJunosEvolved の接続情報を定義しています。
Junos 側はページャが表示されると処理しづらいため、以下を設定しています。
set cli screen-length 0
set cli screen-width 0
containerlab起動
containerlab deploy -t clab-pyats-mcp.clab.yml
以下のような表示が出れば OK です
Codex に MCP Server を登録
Codex 側に MCP Server を登録します。
今回は HTTP 公開しているので、
http://<containerlab-host>:8080/mcp
を登録するだけです。(最後に mcp を付けるのを忘れないよう登録してください)
まずは画面左下の設定画面を押すと以下の画面が表示されるので。「MCP サーバー」から「+サーバーを追加する」を選択します

以下の画面で名前を入力して、URLに'http://:8080/mcp'を入力して保存、アプリの再起動で反映されます

これで Codex から、自然言語で実施できます。
実際に AI に設定投入させる
バージョンを取得してみる
EOS/Junos のバージョン情報を自動取得して、表形式で整理してくれます。
IFにIP設定してみる
次に以下の指示をして IP アドレスの設定をしてもらいます
以下にとおりIP設定して
ceos1 Et1 : 192.168.100.1/24
cjunosevo1 et-0/0/0.0 : 192.168.100.2/24
IP アドレスの設定と合わせて ping での疎通確認もやってくれてます
OSPFの設定をしてもらう
最後に OSPF の設定をしてもらいます
設定したIFでOSPFの設定してネイバーが張れるようにして
こちらは OSPF が問題なく設定されました
面白かったポイント
EOS/Junos 混在でも自然言語で操作できる
普通はベンダごとの差分を吸収する必要がありますが、
IF に IP つけて
だけで EOS/Junos それぞれに適切な config を投入してくれるのはかなり便利です。
AI が切り分けてくれる
設定については、設定完了までに、以下の画面のように、Codex が自分で切り分けながら設定を登録修正や動作確認をしてました

Ansible Playbook のように事前に定義した手順を実行する方式では、想定外の事象が発生した場合の切り分けは利用者のスキルに依存する部分があると思います。
一方で Codex は、状況に応じて AI が追加の調査を行いながら原因を推測し、必要な show コマンドを実行してくれます。この点は従来の自動化ツールとは大きく異なると感じました。
実際のネットワーク運用では、設定変更を AI に任せるのはまだ慎重になると思いますが、設定レビューや状態確認、設定ミスの指摘といった用途では非常に有効そうです。特に障害切り分けの初動対応では、大きな効果が期待できると感じました。
ハマったところ
Junos の pager
はじめは、MCP Server 経由で Junos の show interfaces terse など出力の長いコマンドを実行すると、途中でページャが表示されてしまい、コマンド結果を最後まで取得できない問題が発生しました。
これを回避するため、testbed.yaml の init_exec_commands に以下を設定し、接続時にページャを無効化しています。
init_exec_commands:
- set cli screen-length 0
- set cli screen-width 0
これにより、Junos へ接続するたびに自動でページャが無効化されるため、MCP Server から安定してコマンド結果を取得できるようになるはずでした。
しかし、この設定を追加しても当初は期待どおりに動作しませんでした。
そこで以下の Issue を投稿したところ、
開発者の方がすぐに問題を確認し、修正してくださいました。
修正後は .env に以下を設定することで正常に動作するようになりました。
PYATS_MCP_MIT=
Issue の投稿から修正まで非常にスピーディーに対応していただき、オープンソースコミュニティのありがたさを改めて感じました。
まとめ
containerlab + MCP + Codex を組み合わせると、
- 仮想ネットワーク
- AI
- 自然言語
- マルチベンダ操作
がかなり簡単につながります。
特に、
「AI が EOS/Junos を理解して操作・切り分けして確認する」
体験はかなり未来感がありました。



