Skip to main content
Glama

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

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

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

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

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

このプロジェクトはデバイスに書き込みを行いません。許可リストはデフォルトで拒否(空のリストは何も許可しない)であり、拒否側が常に許可側よりも優先されます。

著者と由来

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

このプロジェクトはフォークから始まりましたが、その起源を隠すのではなく明示しています。出発点はKirk Byers氏の作品であり、プロジェクトはそれを大きく超えて成長しました。現在ここにあるもの — 真実の情報源に基づくインベントリ、認証情報の解決、3つのデプロイ形態、出力ページング、監査証跡、スキル、そしてこのドキュメント — は、上流から来たものではありません。

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

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

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

Nikoについて

このサーバーはNikoのために書かれました。Nikoは、OctupusのEd Scrimaglia氏によって構築されたNeural Intelligence Knowledge Orchestrator AIエージェントです。Nikoは一連のMCPサーバー(真実の情報源サーバー、このサーバー、Jira、メール送信、ファイル作成など)の前面に立ち、オペレーターが平易な言葉で質問をすると、不動産に関する情報から答えを得られます。真実の情報源からは「あるべき姿」、デバイス自体からは「実際の状態」が得られます。

Niko内部では、同じファイルが少し異なる動作をします。これを知っておくと、コード内のいくつかの点を理解するのに役立ちます。

  • サーバーはループバック上のHTTPで動作し、それぞれが1つのポートを持ち、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 — 依然としてフェイルクローズドだが、マルチプロセスセーフではない

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/<名前>/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で9つのツールを一覧表示し、/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

1つの変数を反転させるだけでAと同じです。

"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 APIの形式で通信するため、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がデフォルトで満たさない唯一の要件:platform.nameは正確にNetmikoのdevice_typecisco_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

起動する実行ファイル。絶対パス — カレントワーキングディレクトリを想定しない

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仕様の一部ではありません。他のクライアントが実装していない可能性があります(Non-Claude agentsを参照。その場合、パスはリテラルでなければなりません)。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はプロジェクトではなくクライアントの選択です。そのためresolve_project_path()があります。設定が読み込まれるとき、すべての相対パス設定はPARENT_DIRmcps/の親、.envと同じルート)に固定されます。どこから起動したセッションでもconfig/netmiko/を見つけ、validate_startup()は欠落している場合の絶対ファイルを指定します。~は常にオペレーターのホームを意味し、プロジェクト内のファイルではありません。

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

出典:Claude Code — MCPAdd 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_*変数はクライアント設定の一部ではなくなりました。サーバープロセスはユーザーが起動するため、それらはその環境(シェルのエクスポート、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 Codeでは、mcp.jsonのトップレベルキーが"mcpServers"ではなく"servers"であり、"type"を明示的に指定する必要があります。

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

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

envブロック

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

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

変数

デフォルト

目的

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_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 よりも優先され、暗黙的に適用されます。各変数は厳密に1か所で定義してください。

これ以外の変数はすべて、親リポジトリの README に記載されています。

動作確認

claude mcp list          # netmiko: ✓ connected

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


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

-
license - not tested
-
quality - not tested
C
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 Connectors

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

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

  • Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.

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-mcp-claude'

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