netdev-ssh-mcp について
netdev-ssh-mcpは、ネットワーク運用担当者向けに、SSH経由でArista、Cisco、Juniper、FortiGate機器を確認・テストするMCPサーバーです。制限付きの読み取り操作を提供し、取得した設定内の機密値をマスクします。
主な機能
- 01稼働中または起動時の設定取得
- 02フィルター付き読み取りコマンドの実行
- 03機器からのpingと経路追跡
- 04取得した設定内の秘密情報のマスク
- 05SSHホストキーの確認と管理
活用シーン
- 01複数のネットワーク機器の設定確認
- 02BGP、インターフェース、ルーティング状態の確認
- 03疎通テストと経路上の問題箇所の特定
- 04機器のSSHフィンガープリントの検証
MCP 対応
SSH経由のネットワーク機器操作をツールとしてMCPクライアントに提供します。対応例はClaude Code、Claude Desktop、Codexです。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
netdev-ssh-mcp
SSH 経由でネットワークデバイス(スイッチ、ルーター、ファイアウォール)とやり取りする MCP サーバーです。 Arista EOS、Cisco NX-OS、Cisco IOS/IOS-XE、Juniper JunOS、FortiGate FortiOS に対応しています。 ネットワークデバイスの操作をツールとして公開し、Claude Code / Claude Desktop / Codex (およびその他の MCP クライアント)で利用できます。
ツール
get_config
Arista、Cisco Nexus、Cisco Catalyst、Juniper JunOS、FortiGate FortiOS デバイスから、実行中の設定またはスタートアップ設定を取得します。機密情報(パスワード、シークレット、SNMP コミュニティ名、BGP/OSPF/TACACS/RADIUS/IKE キー)は、キー付きハッシュトークンに自動的に置き換えられます。
enable secret 5 [h:3c91e0a47b2d]
snmp-server community [h:8f02d6c51e9a] ro
username admin privilege 15 secret 5 [h:3c91e0a47b2d]
同じキーを使用すると、同じシークレットは常に同じトークンになるため、異なるデバイスの設定を比較して差分を確認できます。同じトークンは、シークレットが同一であることを意味します。キーの選択方法については、難読化を参照してください。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
host | string | はい | — | デバイスのホスト名または IP アドレス |
username | string | いいえ | DEVICE_USERNAME | SSH ユーザー名 |
port | int | いいえ | 22 | SSH ポート |
config_type | string | いいえ | running | running または startup。startup は JunOS または FortiOS ではサポートされていません |
device_type | string | いいえ | — | eos、ios、nxos、junos、または fortios |
FortiOS に関する注意事項:
device_type=fortiosを使用して、show full-configurationで設定を取得します。fortigateはfortiosのエイリアスとして使用できます。- FortiOS は
config_type=startupをサポートしていません。
run_show_command
ネットワークデバイスで読み取り専用の運用コマンドを実行し、出力を返します。
Arista/Cisco/JunOS では、コマンドは show で始まる必要があります。FortiOS では、
コマンドは get で始まる必要があります。構造化出力に対応している場合は | json を、
テキスト出力のページ送りを無効にする場合は | no-more を追加してください。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
host | string | はい | — | デバイスのホスト名または IP アドレス |
command | string | はい | — | 実行する読み取り専用の運用コマンド |
username | string | いいえ | DEVICE_USERNAME | SSH ユーザー名 |
port | int | いいえ | 22 | SSH ポート |
device_type | string | いいえ | — | eos、ios、nxos、junos、または fortios |
コマンドの例:
show bgp summary | json
show interfaces status | json
show lldp neighbors detail | json
show inventory | json
show version | json
show ip route | json
get system status
get router info routing-table all
show running-configとshow startup-configはここでは使用できません。代わりにget_configツールを使用してください。FortiOS では、
show、config、execute、diagnoseコマンドはここではブロックされます。 代わりにget_config、run_ping、またはrun_tracerouteを使用してください。
コマンドは、1 つのコマンドのみを含む 1 行で指定する必要があります(; は使用できません)。< または > によるリダイレクトは使用できず、パイプでつなげるのは出力フィルターのみです。ファイルへの書き込み、メッセージの送信、または他のコマンドの実行を行うフィルター(save、redirect、tee、append など)は拒否されます。使用できるフィルターは次のとおりです。
device_type | | の後に使用できるもの |
|---|---|
eos | json、no-more、include、exclude、begin、section |
ios | include、exclude、begin、section、count |
nxos | ios のフィルターに加えて、json、json-pretty、xml、no-more、grep、egrep、last、head |
junos | display json/xml/set、no-more、match、except、count、last、find、trim |
fortios | grep |
| 未設定 | eos と ios のフィルターの組み合わせ |
フィルターのパターン内にある | は、別のパイプとして解釈されるため、正規表現の選択ではなく個別のフィルターを使用してください。リテラルの ; も送信できません。最も近いフィルターは、任意の 1 文字に一致する正規表現のワイルドカード . です。たとえば、| include foo.bar は foo;bar に一致しますが、foo-bar や foo bar にも一致するため、余分な行が返されることがあります。パターンに周辺のテキストをさらに含めて、対象を絞り込んでください。
run_ping
ネットワークデバイスで ping コマンドを実行し、出力を返します。 デバイスの視点から到達可能性を確認するのに便利です。たとえば、BGP ピア、ネクストホップ、または 管理対象への接続をテストできます。
device_type を使用して、対象プラットフォームに適したコマンド構文を選択します。
省略した場合は、EOS/IOS の構文(repeat、size キーワード)が使用されます。FortiOS では、
ツールが execute ping-options ... を使用して execute ping を実行し、同じ SSH セッション内で
オプションをリセットします。
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
host | string | yes | — | デバイスのホスト名または IP アドレス |
destination | string | yes | — | ping の送信先 IP アドレスまたはホスト名 |
username | string | no | DEVICE_USERNAME | SSH ユーザー名 |
port | int | no | 22 | SSH ポート |
count | int | no | — | 送信するエコー要求の数 |
timeout | int | no | — | プローブごとのタイムアウト(秒)。FortiOS でサポートされています |
source | string | no | — | 送信元 IP アドレスまたはインターフェース名 |
vrf | string | no | — | VRF 名 |
size | int | no | — | パケットサイズ(バイト) |
outgoing_interface | string | no | — | 出力インターフェース。FortiOS でサポートされています |
device_type | string | no | — | eos、ios、nxos、junos、または fortios。ping の構文を制御します |
destination、source、vrf、outgoing_interface に使用できるのは、
英字、数字、および . _ : / @ % - のみです。これらの文字でアドレス、ホスト名、
インターフェース名を指定できます。それ以外の文字が含まれている場合、デバイスへの接続前に拒否されます。
FortiOS の制限事項:
- FortiOS 7.4 以降では、このツールで
vrfはサポートされていません。 - FortiOS の運用出力では
| jsonはサポートされていません。
run_traceroute
デバイスから宛先までのホップごとの経路と、各ホップのレイテンシを表示します。 接続が途切れる箇所の特定、トラフィックが想定どおりの経路をたどることの確認、 レイテンシが発生するホップの特定に便利です。
正しい構文を使用するため、device_type を指定してください。IOS では、コマンド内で
vrf を宛先より前に指定する必要があります。device_type=ios を指定すると、
これが自動的に処理されます。FortiOS では、ツールが execute traceroute-options ... を使用して
execute traceroute を実行し、同じ SSH セッション内でオプションをリセットします。
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
host | string | yes | — | デバイスのホスト名または IP アドレス |
destination | string | yes | — | 経路を調べる宛先の IP アドレスまたはホスト名 |
username | string | no | DEVICE_USERNAME | SSH ユーザー名 |
port | int | no | 22 | SSH ポート |
max_hops | int | no | — | ホップ数の上限(TTL) |
timeout | int | no | — | プローブごとのタイムアウト(秒) |
probe | int | no | — | ホップごとのプローブ数 |
source | string | no | — | 送信元 IP アドレスまたはインターフェース名 |
vrf | string | no | — | VRF 名 |
outgoing_interface | string | no | — | 出力インターフェース。FortiOS でサポートされています |
device_type | string | no | — | eos、ios、nxos、junos、または fortios。traceroute の構文を制御します |
destination、source、vrf、outgoing_interface には、run_ping と同じ文字制限が適用されます。
FortiOS の制限事項:
- FortiOS 7.4 以降では、このツールで
vrf、max_hops、timeoutはサポートされていません。 - FortiOS の運用出力では
| jsonはサポートされていません。
trust_host_key
デバイスが現在提示している SSH ホストキーを取得し、必要に応じて設定済みの
known_hosts ファイルに追加します。次の 2 つの手順で使用します。
confirm=falseを指定して呼び出し、現在のフィンガープリントを確認します。- そのフィンガープリントを別の手段で検証した後、
confirm=trueを指定して再度呼び出し、known_hostsに書き込みます。
デバイスのホストキーが正当に変更された場合は、新しいフィンガープリントを検証してから
replace_existing=true を指定して呼び出します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
host | string | はい | — | デバイスのホスト名または IP アドレス |
port | int | いいえ | 22 | SSH ポート |
confirm | bool | いいえ | false | false の場合は現在のキーの確認のみを行い、true の場合は書き込みます |
replace_existing | bool | いいえ | false | 検証後、既存の不一致キーを置き換えます |
デフォルトのユーザー名
DEVICE_USERNAME を設定すると、各ツール呼び出しで username を指定する必要がなくなります。
export DEVICE_USERNAME=admin
username ツールパラメーターが指定されている場合は、そちらが優先されます。
認証
認証方法は次の順序で試されます。
- SSH エージェント —
SSH_AUTH_SOCKが設定されている場合、エージェントが自動的に使用されます。 設定は不要です。 - パスワード —
DEVICE_PASSWORD環境変数で設定します(下記を参照)。
呼び出し時に少なくとも 1 つの方法が利用可能である必要があります。
Claude Desktop に関する注意: Claude Desktop は GUI アプリケーションであり、 シェル環境を継承しないため、MCP サーバープロセスでは
SSH_AUTH_SOCKを利用できません。 設定ファイルのenvブロックで明示的に設定してください(下記の Claude Desktop のセクションを参照)。 Claude Code はターミナルで実行され、シェル環境を継承するため、追加の設定は必要ありません。
環境変数によるパスワード設定
サーバーを起動する前に DEVICE_PASSWORD を設定します。
export DEVICE_PASSWORD=mysecret
netdev-ssh-mcp
パスワードがツールパラメーターや MCP プロトコルを介して渡されることはありません。 呼び出し時に環境から一度だけ読み込まれ、サーバープロセスが確立するすべての接続に適用されます。
ホストキーの検証
SSH ホストキーの検証はデフォルトで有効です。サーバーは現在の
ユーザーの OpenSSH known_hosts ファイルを使用します。
- macOS および Linux:
~/.ssh/known_hosts - Windows:
%USERPROFILE%\\.ssh\\known_hosts
次のいずれかを使用して、パスを上書きできます。
- コマンドラインフラグ:
--known-hosts /path/to/known_hosts - 環境変数:
SSH_KNOWN_HOSTS
デバイスが known_hosts に登録されていない場合、ツール呼び出しは提示されたフィンガープリントと
trust_host_key の使用を促すメッセージを含む、明確なエラーで失敗します。
ホストキーの検証を完全に無効にするには、次のいずれかを使用します。
- コマンドラインフラグ:
--insecure-skip-host-key-check - 環境変数:
SKIP_HOST_KEY_CHECK=true
検証を無効にすると安全性が損なわれるため、一時的な回避策としてのみ使用してください。
インストール
macOS(Homebrew)
brew install --cask krisiasty/tap/netdev-ssh-mcp
バイナリは $(brew --prefix)/bin/netdev-ssh-mcp にインストールされます。プレフィックスは Mac のアーキテクチャによって異なります。
| アーキテクチャ | パス |
|---|---|
| Apple Silicon(M1/M2/M3/M4) | /opt/homebrew/bin/netdev-ssh-mcp |
| Intel | /usr/local/bin/netdev-ssh-mcp |
brew --prefix を実行して、お使いのマシンに適用されるパスを確認してください。
ソースからビルド
Go 1.26 以降が必要です。
go build -o netdev-ssh-mcp .
ビルド後にバイナリを /usr/local/bin にインストールするには、次を実行します(macOS および Linux)。
sudo install -m 0755 netdev-ssh-mcp /usr/local/bin/
統合
以下の例では、<path-to-binary> をバイナリの完全なパスに置き換えてください。Homebrew でインストールした場合は、brew --prefix を実行して正しいパスを確認し(Apple Silicon では /opt/homebrew、Intel では /usr/local)、その後に
/bin/netdev-ssh-mcp を追加してください。
<path-to-key-file> を難読化キーの絶対パスに置き換えてください。サーバーを設定する前にキーを作成してください。詳しくは
難読化キーを参照してください。キーを指定しない場合、サーバーは実行ごとにランダムなキーを使用するため、難読化されたシークレットをセッション間で比較できません。
Claude Code
リポジトリのルートに、プロジェクトローカルの .mcp.json を追加します。
{
"mcpServers": {
"netdev-ssh-mcp": {
"command": "<path-to-binary>",
"env": {
"OBFUSCATION_KEY_FILE": "<path-to-key-file>"
}
}
}
}
デフォルトのユーザー名を使用する場合:
{
"mcpServers": {
"netdev-ssh-mcp": {
"command": "<path-to-binary>",
"env": {
"DEVICE_USERNAME": "admin",
"OBFUSCATION_KEY_FILE": "<path-to-key-file>"
}
}
}
}
Claude Code はターミナルで実行され、シェル環境を継承するため、SSH_AUTH_SOCK は自動的に利用できます。SSH エージェント認証に追加の設定は必要ありません。
または、パスワード認証を使用する場合:
{
"mcpServers": {
"netdev-ssh-mcp": {
"command": "<path-to-binary>",
"env": {
"DEVICE_USERNAME": "admin",
"DEVICE_PASSWORD": "mysecret",
"OBFUSCATION_KEY_FILE": "<path-to-key-file>"
}
}
}
}
または、Claude Code CLI を使ってサーバーをグローバルに登録します:
claude mcp add netdev-ssh-mcp -e OBFUSCATION_KEY_FILE=<path-to-key-file> -- <path-to-binary>
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)を編集します:
{
"mcpServers": {
"netdev-ssh-mcp": {
"command": "<path-to-binary>",
"env": {
"OBFUSCATION_KEY_FILE": "<path-to-key-file>"
}
}
}
}
Claude Desktop はシェル環境を継承しないため、SSH_AUTH_SOCK を明示的に設定する必要があります。ターミナルで現在のソケットパスを取得します:
echo $SSH_AUTH_SOCK
次に、設定ファイルに追加します:
{
"mcpServers": {
"netdev-ssh-mcp": {
"command": "<path-to-binary>",
"env": {
"DEVICE_USERNAME": "admin",
"SSH_AUTH_SOCK": "/private/tmp/com.apple.launchd.XXXXX/Listeners",
"OBFUSCATION_KEY_FILE": "<path-to-key-file>"
}
}
}
}
ソケットパスは再起動のたびに変わるため、それに応じて設定ファイルを更新する必要があります。
または、パスワード認証を使用する場合:
{
"mcpServers": {
"netdev-ssh-mcp": {
"command": "<path-to-binary>",
"env": {
"DEVICE_USERNAME": "admin",
"DEVICE_PASSWORD": "mysecret",
"OBFUSCATION_KEY_FILE": "<path-to-key-file>"
}
}
}
}
設定ファイルを編集したら、Claude Desktop を再起動します。
プロンプトの例
- 10.0.0.1 の実行中の設定を表示してください
- n9k-1 と n9k-2 の実行中の設定を比較し、違いを要約してください
- arista1 の BGP ピアの状態を確認し、ダウンしているセッションがあれば教えてください
- 10.0.0.1 のインターフェースの状態を取得し、ダウンしているインターフェースを一覧表示してください
- 10.0.0.1 の実行中の設定を確認し、セキュリティ上の懸念事項を指摘してください
- 10.0.0.1 の LLDP ピアを取得し、トポロジ図を描いてください
- 10.0.0.1 では、192.168.100.0/24 宛てのトラフィックはどのように転送されますか?
- 10.0.0.1、10.0.0.2、10.0.0.3 の間で NTP の整合性を確認してください
- LLDP/CDP 経由で spine-1 のピアを検出し、EVPN ファブリックの設定を確認してください
- 検出した設定の問題を修正するために使用する正確なコマンドを教えてください
- 以前に検出した問題がすべて修正されたか確認してください
- 10.0.0.1 から 10.0.0.2 に ping を実行し、到達可能かどうか教えてください
- arista1 から各 BGP ピアに ping を実行し、すべてのピアに到達できるか確認してください
- n9k-1 の管理 VRF から 8.8.8.8 に ping を実行してください
- arista1 から 10.0.0.2 への traceroute を実行し、経路を表示してください
- spine-1 から各 BGP ピアへの traceroute を実行し、非対称な経路があれば特定してください
難読化
get_config と run_show_command の出力では、機密性の高い値がデフォルトで難読化されます。run_ping と run_traceroute ツールは影響を受けません。これらの出力に機密性の高い値は含まれません。
各シークレットは、[h:<12 hex digits>] という形式のトークンに置き換えられます。このトークンは、難読化キーを使用したシークレットの HMAC-SHA256 を切り詰めたものです。キーがなければ、推測した値をトークンと照合できないため、SNMP コミュニティのような短いシークレットが出力から復元されることはありません。
難読化の効果は完全ではありません。 シークレットは、サポート対象の各プラットフォームについて既知の設定構文と照合して検出されます。サーバーが認識しない構文のシークレット(新しいコマンドや使用頻度の低いコマンド、一般的でないプラットフォームバージョン、自由形式の
show出力など)は、平文で表示される可能性があります。難読化を有効にしていてもツールの出力は機密情報として扱い、他の人と共有する前に確認してください。難読化されていないシークレットを見つけた場合は、公開 issue ではなく、SECURITY.md に記載されている方法で非公開に報告してください。
難読化キー
独自のキーを用意してください。 ランダムなキーファイルを一度生成します。
mkdir -p ~/.config
(umask 077 && openssl rand -hex 32 > ~/.config/netdev-ssh-mcp.key)
次に、--obfuscation-key-file または OBFUSCATION_KEY_FILE 環境変数(Integration の例を参照)でサーバーにそのファイルを指定するか、OBFUSCATION_KEY 環境変数にキー自体を渡します。設定するのはどちらか一方だけにしてください。値の前後の空白は削除され、少なくとも 16 バイト必要です。サーバーはキーを読み取るだけで、どこにも書き込みません。
同じキーを使うと、どのマシンでも同じトークンが生成されるため、異なるマシンや別の人が収集した出力を比較するには、キーファイルを共有してください。
キーを指定しない場合、サーバーは実行ごとにメモリ内でランダムなキーを生成します。これは安全です。キーがプロセス外に出ることはないため、推測した値を使ってトークンを照合することはできません。ただし、トークンが一致するのは同じサーバーの実行中だけです。以前のセッション、別のマシン、または別の人が生成したトークンとは比較できません。キーが設定されていない間、サーバーは次の処理を行います。
- 起動するたびに警告をログに記録します。
- MCP サーバーの指示で、呼び出し元のエージェントに通知します。
- 難読化されたシークレットを含むすべての
get_configおよびrun_show_commandの結果に、キーの設定を促す短い注記を追加します。
v1.6.6 以前で生成されたトークンにはキーが使われていないため、現在のトークンとは比較できません。
難読化の無効化
難読化を無効にするには、--no-obfuscate を渡します。
netdev-ssh-mcp --no-obfuscate
MCP 設定ファイルでは、args を使って渡します。
{
"mcpServers": {
"netdev-ssh-mcp": {
"command": "<path-to-binary>",
"args": ["--no-obfuscate"]
}
}
}
ログ記録
サーバーは標準エラー出力にログを記録します(MCP プロトコル用に予約されている標準出力には出力しません)。ログレベルは LOG_LEVEL 環境変数で制御します。
| 値 | 説明 |
|---|---|
debug | 接続の詳細、コマンド文字列、バイト数 |
info | デフォルト — ツール呼び出し、接続/切断、成功/失敗 |
warn | 警告のみ |
error | エラーのみ |
LOG_LEVEL=debug netdev-ssh-mcp
作者
Krzysztof Ciepłucha
免責事項
このツールは、AI ツールの支援を受けて設計・構築されました。設計上の決定、アーキテクチャ、すべてのコードは、人間がレビューおよび検証しています。このプロジェクトでは、コミットごとに自動セキュリティチェック、脆弱性スキャン、静的コード解析を実施しています。
ただし、このソフトウェアは現状有姿で提供され、いかなる保証もありません。バグが含まれている可能性があります。ご自身の責任でご利用ください。
ライセンス
Apache License, Version 2.0 のもとでライセンスされています。詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。