Skip to main content
Glama

claude-project — netmiko MCP サーバー + スキル

コピーしてすぐに使えるプロジェクトです。AI エージェントに SSH 経由でのルーター、スイッチ、ファイアウォールへの読み取り専用アクセス を、Model Context Protocol を通じて提供します。

このプロジェクトには、以下の 2 つのコンポーネントとそれらの間の連携が含まれています。

  • mcps/mcp_server_netmiko.py — 自己完結型の MCP サーバー。10 個のツールを備え、すべてのコマンドはオペレーター定義の許可/拒否リストに対して検証され、出力は ntc-templates で JSON にパースされ、すべての試行は fail-closed の監査証跡に記録されます。

  • .claude/skills/netmiko/SKILL.md — エージェントに、いつこれらのツールを使うべきか、各プラットフォームの CLI 方言がどのようなものか、そして拒否をどのように読み解くかを教えるスキルです。

ここではデバイスへの書き込みは一切行いません。許可リストはデフォルト拒否(default-deny)です。空のリストは何も許可せず、拒否側が常に許可側よりも優先されます。

発生したすべての動作は監査証跡に記録され、netmiko.query_audit_trail によって会話の中で問い合わせ可能です:"SW-CORE-01 で行われたすべての操作を日付順に""最後の 6 つのアクション""今週拒否されたコマンド"。このプロジェクトには UI がないため、このツールが監査証跡を読む唯一の方法です。

著者と由来

このプロジェクトは Ed Scrimaglia (edgardo.scrimaglia@gmail.comOctupus) によって執筆されました。サーバー、スキル、設定モデル、ドキュメントはすべて彼の作品であり、Niko エージェント 向けに書かれ、スタンドアロンプロジェクトとしてパッケージ化されています。

このプロジェクトはフォークから始まりましたが、その起源は隠さずに明示されています。出発点は Kirk Byers の作品であり、そこから大きく発展しました。現在ここにあるもの — ソースオブトゥルース(SoT)に基づくインベントリ、資格情報解決、3 つのデプロイ形態、出力ページング、監査証跡、スキル、そしてこのドキュメント — は上流には存在しません。

Kirk Byers による 2 つの上流プロジェクト:

  • Netmiko — 実際にデバイスと通信を行うマルチベンダー SSH ライブラリ。

  • netmiko_mcp — このサーバーがフォークした MCP サーバー。その一部はほぼそのまま残っています。セキュリティの中核部分(コマンド検証、グロブ処理、許可/拒否の非対称性)は、上流のパッチを今後も差分適用できるよう、意図的に忠実に移植されています。これはエンジニアリング上の判断であり、それ以外の作業の制限ではありません。

Related MCP server: Network MCP Server

Niko について

このサーバーは Niko (Neural Intelligence Knowledge Orchestrator AI エージェント) のために書かれました。Niko は Octupus で Ed Scrimaglia によって構築されました。Niko は複数の MCP サーバー(ソースオブトゥルースサーバー、このサーバー、Jira、メール送信、ファイル作成など)の前面に立ち、オペレーターが平易な言葉で質問し、それを実環境から回答を得られるようにします。つまり、SoT は あるべき状態 を、デバイス自体は 実際の状態 を提供します。

Niko 内部では同じファイルが少し異なる動きをします。これはコード内のいくつかの要素を説明するために知っておく価値があります。

  • サーバーは ループバック上の HTTP で動作し、各ポートが割り当てられ、mcps/mcp_config.jsonurl / transport / local / env として宣言されます。これは後述の 2 軸設定と同じものを Niko 独自の形式で表現したものです。

  • インストールはファイルのコピーではなく、アプリを通じて行われます。アップロードは検証され、依存関係はコード自体から解決され、インストールに失敗した場合はサーバーが中途半端な状態にならないようロールバックされます。

これらの統合はすべて オプションのインポートとフォールバック であり、niko がインストールされている必要はありません。4 つのインポートがあり、それぞれが失敗した場合の動作は以下の通りです。

インポート

スタンドアロンでのフォールバック

niko.srvclass_logging.MCPLogging

60

NIKO_AVAILABLE = False; サーバーは自身の logging を構成します

niko.niko_paths.NikoPaths

68

None; パスは NETMIKO_MCP_* 環境変数から取得されます。そのためこのプロジェクトでは明示的に設定しています

niko.srvclass_logging.SyncedConcurrentTimedRotatingFileHandler

436

FailClosedFileHandler — 依然として fail-closed ですが、マルチプロセスセーフではありません

niko.srvclass_list_budget.apply_budget_to_payload

2709

ペイロードを変更せずに返す no-op 関数

Niko の外部で重要なものが失われることはありません。同時実行ハンドラは複数プロセス・1 ファイルの問題を解決するものですが、ここでは発生しません。リストバジェットは、独自のコンテキスト管理を持つエージェントのために長いペイロードをトリミングします。1 つのファイル、2 つの居場所、フォークはありません。

Fedele は Niko のソースオブトゥルースです。そのため、SoT 変数は NetBox インスタンスを指していても FEDELE_ プレフィックスを持ちます。

ライセンス

このプロジェクト自身のコードは MIT です — LICENSE を参照してください。

派生作品であるため、2 つのライセンスが適用され、両方のファイルが同梱されています。

ライセンス

ファイル

このプロジェクトのコード、ドキュメント、スキル

MIT

LICENSE

ktbyers/netmiko_mcp から移植された部分

Apache-2.0

LICENSE-APACHE-2.0

NOTICE には、Apache-2.0 §4(b) で要求される帰属表示と変更声明が記載されています。Netmiko は通常の MIT 依存関係です。インポートされ、ベンダリングはされておらず、再配布するものはありません。


レイアウト

claude-project/
├── .mcp.json                     # declares the server (project scope)
├── .env.example                  # → copy to .env with the SSH credentials
├── .claude/skills/netmiko/
│   └── SKILL.md                  # one directory per skill, file named SKILL.md
├── mcps/
│   └── mcp_server_netmiko.py     # NOT at the root: the server reads ../.env
├── config/netmiko/
│   ├── commands.yml              # allow/deny list — without it, a 16-command fallback applies
│   └── inventory.yml             # inventory in netmiko_tools format
├── logs/                         # netmiko-mcp.log + netmiko-audit.jsonl
├── mcpr/netmiko/                 # created on demand (0700): large outputs
├── LICENSE  LICENSE-APACHE-2.0  NOTICE
└── pyproject.toml

譲れない 2 つのルール:

  1. スキルは .claude/skills/<name>/SKILL.md に配置します。 Claude Code は skills/netmiko.md を読みません。ディレクトリとその正確なファイル名が必要です。

  2. サーバーは mcps/ に配置し、ルートには置きません。 PARENT_DIR.py ファイル (mcp_server_netmiko.py:62) があるディレクトリの親であり、そこから .env が読み込まれます。サーバーがルートにあると、.env はプロジェクトの 1 つ上の階層で検索されます。

実行方法

uv venv --python 3.12
uv pip install -r <(uv pip compile pyproject.toml)   # or: uv sync
cp .env.example .env && $EDITOR .env                 # SSH credentials
# .mcp.json needs no editing: its paths are project-relative
claude                                               # approve the project server

セッション内で:/mcp で 10 個のツールが一覧表示され、/skills でスキルが読み込まれたことを確認できます。まずはネットワークに触れずに確認:

netmiko MCP が強制しているコマンドポリシーはどれですか?


3 つの形態

インベントリ の取得元と 資格情報 の取得元は、独立した 2 つの軸です。これにより、1 つのサーバーから 3 つのデプロイ形態が生まれます。そして、2 つの環境変数を変更するだけで、サーバー自体を修正することなくそれらの間を移行できます。

インベントリ

資格情報

必要なもの

使用すべき場面

A — SoT で全てを管理

Fedele

Fedele

API トークン + Fernet キー

SoT が信頼でき、すでにデバイスの資格情報を保持している場合

B — SoT でインベントリ、ローカルで資格情報

Fedele または NetBox

.env

API トークン

SoT はあるが、その資格情報プラグインがない場合。通常の出発点

C — 自己完結型

ローカル YAML

.env

外部のものは不要

ラボ、エアギャップ環境、デモ、または SoT がダウンした際の縮退モード

netmiko.get_metadata で実際に実行中の形態を確認できます。設定ファイルから推測しないでください。

{
  "inventory": {"backend": "fedele", "scope_filter": {"tag": "lab"}, "available": true},
  "credential_source": "env",
  "device_types_in_inventory": ["cisco_ios", "huawei_vrp", "…"]
}

A — ソースオブトゥルースとして Fedele、資格情報も含む

エージェントはデバイスを 名前 で要求します。サーバーは呼び出し時に SoT に対してアドレス、プラットフォーム、資格情報を解決します。このプロジェクトには機器情報は一切保存されません。SoT にデバイスを追加すれば、ファイルを編集したり再起動したりすることなく、次の呼び出しから到達可能になります。

// .mcp.json → env
"NETMIKO_MCP_INVENTORY_TYPE": "fedele",
"NETMIKO_MCP_CREDENTIAL_SOURCE": "fedele",
"NETMIKO_MCP_FEDELE_GROUP_SOURCE": "tags",        // tags | device_roles | sites
"NETMIKO_MCP_FEDELE_DEVICE_FILTER": "tag=lab",    // the scope filter — read the warning
"NETMIKO_MCP_FEDELE_CACHE_TTL": "60"
# .env
FEDELE_URL=https://fedele.example.com
FEDELE_TOKEN=<API token>
FEDELE_CREDENTIALS_KEY=<Fernet key of the fedele_credentials plugin>

ファイル:必須のものはありません。commands.yml推奨 されますが、これがない場合でも組み込みの フォールバックポリシー が適用されます。ローカルインベントリは関与せず、NETMIKO_USERNAME / NETMIKO_PASSWORD も不要です。credential_source=fedele の場合、NETMIKO_SECRET無視 されます。イネーブルパスワードも SoT から取得されます。

資格情報参照の仕組み(3 段階):

GET dcim/devices/?name=<name>                          → device.id
GET plugins/credentials/devicecredentials/?device=<id> → credential id
GET plugins/credentials/networkcredentials/<id>/       → username + encrypted password
                                                          decrypted locally with the Fernet key

この形態を選ぶ前に知っておくべきこと:

  • Fernet キーはセキュリティ全体の境界です。 サーバーのメモリ内でデバイスパスワードを復号化します。パスワードそのものと同様に扱ってください。

  • FEDELE_CREDENTIALS_KEY がない場合でもサーバーは起動しますが、すべての ツールが同じ Startup Error (欠落変数名)を返します。静かに失敗するのではなく、明示的に失敗します。

  • スコープフィルターを設定してください。 NETMIKO_MCP_FEDELE_DEVICE_FILTER がない場合、インベントリは SoT が認識している全機器、つまりエージェントが到達可能なすべてのデバイスになります。サーバーはこれがない場合に警告をログ出力します。フィルターはクエリ構文を受け付けます。tag=lab&status=active

  • primary_ip がないデバイス、platform がないデバイス、またはプラットフォームが Netmiko の device_type でないデバイスは、インベントリから 除外 されます。SoT はカメラ、バッジリーダー、シャーシなども管理します。除外はカウントされ報告されるため、エージェントがサブセットに対して「これがすべてのデバイスです」と主張することはありません。

  • サーキットブレーカーがあります。トランスポートエラーまたは 5xx エラーが発生すると、クライアントは 30 秒間 SoT への呼び出しを停止します。SoT がダウンしている状態で 40 台のデバイスに対してグループコマンドを実行した場合、40 回ではなく 1 回だけ失敗します。

B — インベントリは SoT、資格情報は .env

A と同じですが、1 つの変数が異なります。

"NETMIKO_MCP_CREDENTIAL_SOURCE": "env",
# .env
FEDELE_URL=https://sot.example.com
FEDELE_TOKEN=<API token>
NETMIKO_USERNAME=<service account>
NETMIKO_PASSWORD=<password>
NETMIKO_SECRET=<enable password, if any device asks for it>

動的なインベントリ(それ自体で価値がある部分)を、資格情報プラグインや Fernet キーなしで利用できます。すべてのデバイスに対して 1 つのサービスアカウントが使用されます。

NetBox、または NetBox 形状の SoT

インベントリバックエンドは NetBox REST の方言を話すため、NetBox 自体もこの形態でそのまま動作します

バックエンドが呼び出すもの

読み取る内容

dcim/devices/

デバイスリスト。スコープフィルターでフィルタリングされ、ページネーションされます

extras/tags/dcim/device-roles/dcim/sites/

FEDELE_GROUP_SOURCE で選択されたものがデバイスグループになります

device.primary_ip.address

SSH ホスト、マスクは除去

device.platform.name

Netmiko の device_typeCLASS_MAPPER に対して検証されます

FEDELE_URL を NetBox インスタンスに向け(/api を付けなくても自動で追加されます)、FEDELE_TOKEN を NetBox の API トークンに設定します。クライアントは NetBox が期待する Authorization: Token … ヘッダーで認証します。変数名は FEDELE_ プレフィックスを保持しています。これは命名上の遺産であり、製品要件ではありません。

NetBox がデフォルトで満たさない 1 つの要件:platform.name は Netmiko の device_type と完全に一致する必要がありますcisco_iosarista_eoshuawei_vrpjuniper_junos"Cisco IOS 15.2" という名前のプラットフォームは device_type ではないため、それを設定されたすべてのデバイスはインベントリから除外されます。NetBox 内のプラットフォーム名を変更するか、除外を受け入れてください。除外は報告されます。

資格情報は NetBox が カバーしない 部分です。plugins/credentials/… エンドポイントは Fedele のプラグインに属します。プレーンな NetBox では形態 A は利用できません。B を利用してください。

C — 自己完結型:SoT なし

すべてがこのプロジェクト内に存在します。外部サービスへの問い合わせは一切行われません。

// .mcp.json → env
"NETMIKO_MCP_INVENTORY_TYPE": "yaml",
"NETMIKO_MCP_CREDENTIAL_SOURCE": "env",
"NETMIKO_MCP_INVENTORY_FILE": "/abs/path/claude-project/config/netmiko/inventory.yml"
# .env
NETMIKO_USERNAME=<service account>
NETMIKO_PASSWORD=<password>
NETMIKO_SECRET=<enable password, if any device asks for it>

ファイル: inventory.yml はここで必須です — デバイスが存在する唯一の場所です。commands.yml は引き続き推奨ですが、必須ではありません。インベントリは netmiko_tools 形式です — 名前と接続データのフラットなマッピングに、グループキーが加わります:

CORE-RTR-01:
  device_type: cisco_xr        # must be a Netmiko device_type, verbatim
  host: 192.0.2.11

CORE-SW-01:
  device_type: arista_eos
  host: 192.0.2.21

core:                          # a group is a list of device names
- CORE-RTR-01
- CORE-SW-01

このプロジェクトが同梱するファイルはサンプルデータです: RFC 5737 のドキュメント用レンジ上の12の架空のデバイス、7つのグループ、そして許可リストに記載されているすべてのCLIダイアレクトが網羅されるように選ばれたプラットフォームです。実際の環境に置き換えてください。

これはこのプロジェクトが設定済みで出荷するフレーバーであり、同時に縮退モードでもあります: SoTがダウンした場合、2つの変数と再起動でフレーバーAまたはフレーバーBのデプロイをここに移行できます。これは必要になる前に練習しておく価値があります。

代償として、ファイルは古くなります。親リポジトリの scripts/export_inventory.py がSoTから再生成します; 定期的に実行してください。6ヶ月前のアドレスが入ったバックアップインベントリは、バックアップがないより悪いです。なぜなら、運用中に気づくからです。

3つすべてで変わらないもの

コマンドポリシー、監査証跡、出力ページング、ツールサーフェスはフレーバー間で変わりません。エージェントから見える契約は同一であり、そのためスキルにフレーバーごとのバリエーションは必要ありません。

commands.yml は推奨、必須ではない

サーバーはこれなしでも動作します。ファイルがない場合、すべてを拒否したり、起動を拒否したりはしません: 組み込みのフォールバックとして16の読み取り専用コマンドが代わりに使用されます — show versionshow ip interface briefdisplay version およびそれらのJunos/VRP相当品です。これは意図的です。空のポリシーはサーバーが正常と報告している間にすべてのコマンドを拒否することになり、オペレーターには「デバイスが拒否した」ではなく「誰もポリシーを書かなかった」と読まれます。フォールバックは起動時に通知され、netmiko.get_command_policypolicy_source: "fallback" を報告し、監査対象の試行はすべてそのソースを保持します。

つまり、このファイルはポリシーの決定であり、インストール手順ではありません: フォールバックにより初回起動でサーバーを実行でき、環境独自のポリシーを保守的なデフォルトの代わりに使いたいときに commands.yml を書きます。できないのは、自分で選んでいないポリシーをそれと知らずに持つことです — サーバーは問い合わせがあるたびに、どのポリシーが有効かを伝えます。


.mcp.json ファイル

プロジェクトルートの .mcp.json は、このプロジェクト用の MCPサーバーを宣言します。Claude Codeはファイルを初めて見たときに承認を求め、このファイルはコミットされることを意図しています: チーム全員が同じサーバーを取得する方法です。

同じサーバー定義には他に2つのスコープがあります:

スコープ

保存場所

参照者

project

プロジェクトルートの .mcp.json

プロジェクトを開くすべての人(承認後)

user

~/.claude.json

そのユーザーのすべてのプロジェクト、そのマシン上

local

~/.claude.json、プロジェクトパスでキー指定

そのユーザーのみ、そのプロジェクトのみ

claude mcp add --scope project netmiko -- /path/to/python /path/to/server.pyproject エントリが書き込まれます; JSONを手動で編集しても同じです。

ファイルの構造

{
  "mcpServers": {           // ← the top-level key. Not "servers", not "mcp".
    "netmiko": {            // ← the server name; it becomes the tool prefix
      ...                   //    mcp__netmiko__<tool>
    }
  }
}

サーバー名は見た目だけのものではありません: Claude Codeは各ツールを mcp__<server-name>__<tool-name> として公開します。名前が netmiko で、サーバーが登録するツールが netmiko.get_metadata の場合、Claudeが実際に認識するツールは mcp__netmiko__netmiko.get_metadata です。/mcp を実行して正確な名前を確認してから、allowed-tools リストや権限ルールに記述してください。

フィールドリファレンス

フィールド

トランスポート

意味

type

両方

"stdio"(省略時デフォルト)、"http"、または "sse"

command

stdio

起動する実行可能ファイル。絶対パス — cwdを想定しない

args

stdio

引数リスト、各要素は別々

env

stdio

子プロセスの環境。継承された環境にマージされる

url

http / sse

完全なエンドポイントURL(パスを含む)

headers

http / sse

追加のリクエストヘッダー、通常は Authorization

値は環境変数の展開をサポート: ${VAR} および ${VAR:-default}。トークンをコミットされたファイルから分離しておくのに便利です:

"headers": { "Authorization": "Bearer ${NETMIKO_MCP_TOKEN}" }

トランスポート1 — stdio(このプロジェクトが使用するもの)

Claude Codeはサーバーを子プロセスとして起動し、そのstdin/stdoutを介してJSON-RPCで通信します。ポートをリッスンするものはなく、ネットワークから到達可能なものもなく、プロセスのライフタイムはセッションと同じです。これはSSH認証情報を保持するサーバーにとって適切なデフォルトです。

{
  "mcpServers": {
    "netmiko": {
      "type": "stdio",
      "command": "${CLAUDE_PROJECT_DIR:-.}/.venv/bin/python",
      "args": ["${CLAUDE_PROJECT_DIR:-.}/mcps/mcp_server_netmiko.py"],
      "env": {
        "NETMIKO_MCP_INVENTORY_TYPE": "yaml",
        "NETMIKO_MCP_INVENTORY_FILE": "${CLAUDE_PROJECT_DIR:-.}/config/netmiko/inventory.yml",
        "NETMIKO_MCP_COMMAND_FILE": "${CLAUDE_PROJECT_DIR:-.}/config/netmiko/commands.yml",
        "NETMIKO_MCP_CREDENTIAL_SOURCE": "env",
        "NETMIKO_MCP_SAVE_OUTPUT_DIR": "${CLAUDE_PROJECT_DIR:-.}/mcpr/netmiko",
        "NETMIKO_MCP_AUDIT_LOG_FILE": "${CLAUDE_PROJECT_DIR:-.}/logs/netmiko-audit.jsonl",
        "LOG_FILE": "${CLAUDE_PROJECT_DIR:-.}/logs/netmiko-mcp.log",
        "LOG_LEVEL": "INFO"
      }
    }
  }
}

注意すべき2つの点:

  • ハードコードされたパスは使わない、そしてワーキングディレクトリは信頼できるものではありません。${CLAUDE_PROJECT_DIR:-.} がファイルをそのままコミット可能に保つものです; 次のセクションが全容です。なぜなら、その明白な読み方は間違っているからです。

  • サーバーはstdoutに書き込んではいけません。 stdout プロトコルチャネルであり、1行の余計な出力がセッションを壊します。ログはstderrと、LOG_FILE のローテーションファイル(5 MB × 3、0600 で作成 — DEBUG ではこのファイルにデバイス出力が含まれます)に出力されます。Niko内部では同じ変数が MCPLogging によって処理されます。

${CLAUDE_PROJECT_DIR:-.} の由来

1つの文字列に2つの別々のもの: 構文と変数。

構文。 ${VAR}${VAR:-default} はPOSIXパラメータ置換です(「VAR を使用; 未設定または空の場合は default を使用」)が、シェルは関与しません — JSONファイルがシェルを通過することはありません。Claude Codeはファイルを読み込む際に、commandargsenvurlheaders でこの展開を自身で実装します。これはそのクライアントの慣習であり、MCP仕様の一部ではありません: 他のクライアントは実装していない可能性があり(Claude以外のエージェントを参照、その場合はパスをリテラルにする必要があります)、VS Codeには独自の表記 $ {workspaceFolder} があります。

変数。 CLAUDE_PROJECT_DIR はClaude Codeによってプロジェクトルートに設定され、フックが受け取るのと同じ値です。これは安定しています — セッション中に --add-dir で追加のワーキングディレクトリを許可しても、この値は変わりません。

直感に反する部分、そして :-. が飾りではない理由: Claude Codeはその変数を自身の環境ではなく、起動するサーバーの環境に設定します。しかし展開は起動前に、Claude Codeの環境に対して行われます — そこには変数は存在しません。そのため、裸の ${CLAUDE_PROJECT_DIR} は何も展開されず、/config/netmiko/inventory.yml というファイルシステムのルートへの絶対パスになってしまいます。

したがって、プロジェクトスコープの .mcp.json では、デフォルトはエッジケースのフォールバックではなく、毎回使用される値です。プロセスに渡されるのは ./config/netmiko/inventory.yml です。唯一の例外はプラグインによって提供されるMCP設定です — その場合、Claude Codeは変数を直接置換し、デフォルトは不要です。

これがサーバーの手を縛るものです。相対パスは子プロセスのcwdに対して解決され、cwdはクライアントの選択であり、プロジェクトのものではありません。したがって resolve_project_path(): すべての相対パス設定は、設定が読み込まれるときに PARENT_DIRmcps/ の親、.env が存在するのと同じルート)に固定されます。どこから起動されたセッションでも config/netmiko/ を見つけ、validate_startup() はファイルがない場合に絶対パスを表示します。~ は依然としてオペレーターのホームを意味し、プロジェクト内のファイルではありません。

この変数は、ドキュメントが意図する方法で、サーバー内部から(os.environ["CLAUDE_PROJECT_DIR"])読み取る場合に依然として有用です。このサーバーはそれを必要としません: PARENT_DIR__file__ から導出されるため、クライアントにまったく依存しません — 同じ理由で、誰もその変数を設定しないHTTPトランスポートでは特別な処理が不要です。

出典: Claude Code — MCP、セクション Add a local stdio server および Environment variable expansion in .mcp.json

トランスポート2 — HTTP(ストリーミング可能HTTP)

Claude Codeはこれをサポートしており、他のMCPクライアントも同様です。これはサーバーが別の場所で動作する場合に使用するトランスポートです: 別のホスト、コンテナ、複数のエージェントで共有されるサービス、またはClaude以外のエージェント。

サーバーファイルは常に __main__ ガードの下で mcp.run(transport="stdio") を呼び出すため、HTTPは代わりにFastMCP CLIによって提供されます — コードの変更は不要です:

.venv/bin/fastmcp run mcps/mcp_server_netmiko.py \
  --transport http --host 127.0.0.1 --port 8123
# endpoint: http://127.0.0.1:8123/mcp/

NETMIKO_MCP_* 変数はクライアント設定の一部ではなくなりました: サーバープロセスはあなたが起動するため、それらはその環境(シェルのexport、systemdユニット、コンテナの environment: ブロック)に属します。

クライアント側:

{
  "mcpServers": {
    "netmiko": {
      "type": "http",
      "url": "http://127.0.0.1:8123/mcp/",
      "headers": {
        "Authorization": "Bearer ${NETMIKO_MCP_TOKEN}"
      }
    }
  }
}

または、同等に claude mcp add --transport http netmiko http://127.0.0.1:8123/mcp/

--transport sse"type": "sse" も機能します; SSEは古いリモートトランスポートであり、ストリーミング可能HTTPに移行していないクライアントのために維持されています。

セキュリティ。 FastMCP CLIはこれを認証なしで提供します: ポートに到達できる者は誰でも、サーバーの環境にある認証情報を使用して、インベントリ内のすべてのデバイスに対してshowコマンドを実行できます。ローカルテストの場合は 127.0.0.1 にバインドし、共有するものについては、TLSを終端し Authorization ヘッダーをチェックするリバースプロキシの背後に配置してください。上記の headers ブロックはクライアントが送信するものです; プロキシがそれを検証する必要があります。

Claude以外のエージェント

ここに示されている mcpServers オブジェクトは事実上の形状です: Claude Code、Claude Desktop、Cursor、Windsurfはすべて、stdio用に同じ3つのフィールド(command / args / env)を、リモート用に同じ2つのフィールド(url / headers)を読み取ります。エントリをそれらの間でコピーしても、通常はそのまま動作します。

コピーする前に確認すべき既知の違い:

  • VS Codemcp.json を使用し、トップレベルのキーが "mcpServers" ではなく "servers" であり、"type" を明示的に指定する必要があります。

  • 一部のクライアントは ${VAR} 展開を実装していません; その場合、値はリテラルでなければならず、これはコミットされたファイルにトークンを貼り付けるよりも、HTTPトランスポートとプロキシの組み合わせを支持する根拠となります。

  • 設定ファイルがまったくないエージェントでも、HTTPエンドポイントに直接通信できます — URLと Authorization ヘッダーが契約のすべてです。

env ブロック

NETMIKO_MCP_* エントリは、YAML設定ファイルよりも優先されます。これらは明示的に設定されています。なぜなら、Nikoの外部には NikoPaths がないため、デフォルトは ~/commands.yml~/.netmiko_mcp_tmp にフォールバックするからです。

ここでのすべてのパスはプロジェクトルートからの相対パスで記述できます: サーバーは設定読み込み時に相対パスを PARENT_DIR に固定するため、起動されたプロセスのcwdがインベントリや監査証跡の場所を決定することはありません。絶対パスまたは ~ はそのまま解釈されます。

変数

デフォルト

目的

NETMIKO_MCP_INVENTORY_TYPE

netmiko_tools

yaml(ローカルファイル)または fedele(SoT)

NETMIKO_MCP_INVENTORY_FILE

(netmiko-tools のルックアップ)

タイプが yaml の場合のインベントリパス

NETMIKO_MCP_CREDENTIAL_SOURCE

env

env.env を読み取る)または fedele

NETMIKO_MCP_FEDELE_GROUP_SOURCE

tags

グループを定義するもの:tagsdevice_rolessites

NETMIKO_MCP_FEDELE_DEVICE_FILTER

(なし)

スコープフィルター、tag=lab&status=active。指定しない場合は全資産が対象

NETMIKO_MCP_FEDELE_CACHE_TTL

60

SoT 解決キャッシュの秒数

NETMIKO_MCP_COMMAND_FILE

Niko 外では ~/commands.yml

許可/拒否リスト

NETMIKO_MCP_ALLOW_PIPE

false

コマンド内でのパイプを有効にする

NETMIKO_MCP_SSH_CONFIG_FILE

(なし)

OpenSSH ssh_configジャンプホストに必須 — Netmiko は単独では ~/.ssh/config を読み取りません

NETMIKO_MCP_MAX_WORKERS

10

グループコマンドでの同時接続数

NETMIKO_MCP_SAVE_OUTPUT_DIR

Niko 外では ~/.netmiko_mcp_tmp

大規模出力のバッファ

NETMIKO_MCP_SAVE_THRESHOLD

1000

この行数を超えると出力をインラインで返さずファイルに保存

NETMIKO_MCP_AUDIT_LOG_FILE

(親 README を参照)

監査証跡(JSON、フェイルクローズ)。netmiko.query_audit_trail でエージェントに読み取らせてください

NETMIKO_MCP_CONFIG

~/.netmiko-mcp.yml

これらの設定を保持する YAML 設定ファイルへのパス

LOG_FILE / LOG_LEVEL

Niko.log / INFO

運用ログ:常に stderr に出力、さらにこのローテーションファイル(5 MB × 3、0600)。LOG_LEVEL はデフォルト値が明示されているため、設定箇所がわかりやすくなっています。DEBUG に設定するとデバイス出力がログに記録されます

認証情報はここでは設定しません。NETMIKO_USERNAMENETMIKO_PASSWORDNETMIKO_SECRET および FEDELE_* 変数は <project-root>/.env から読み取られるため、コミットされた JSON ファイルに含まれることはありません。 優先順位:env ブロック内の値が .env の値より優先されます(黙示的に)。各変数は必ず一箇所でのみ定義してください。

その他の変数はすべて親リポジトリの README に記載されています。

動作確認

claude mcp list          # netmiko: ✓ connected

セッション内で /mcp によりツール一覧が表示され、/skills によりスキルが読み込まれたことが確認できます。適用中のポリシーを尋ねると、netmiko.get_command_policy が読み取っているファイル名を返します。または "fallback" と報告された場合は、ファイルが見つからず、組み込みの 16 コマンドで動作していることを意味します。


著者: Ed Scrimaglia edgardo.scrimaglia@gmail.com — 最終更新日: 2026-08-18.

A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides AI assistants with direct access to multi-vendor network devices for tasks like configuration management, health checks, and topology discovery through 35 specialized tools. It enables natural language control over platforms including Cisco, Juniper, and Nokia using SSH, NETCONF, and SNMP protocols.
    11
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to interact with Cisco IOS-XE network devices over SSH using structured tools. Provides read and write capabilities for network management with built-in validation and security.
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables read-only querying and diagnostics of Fortigate firewalls via SSH, providing security analysis, traffic monitoring, and configuration inspection through natural language.
    MIT

View all related MCP servers

Related MCP Connectors

  • Let AI operate servers without SSH. Choose actions, approve risky changes, and audit every step.

  • Read-only CVE intelligence, remediation playbooks, and agent setup guides. Not a scanner.

  • Read-only bank access for your AI agent. Connects Claude, ChatGPT, Cursor, Gemini, Codex.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/escrimaglia/netmiko-sot_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server