netmiko-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LOG_FILE | No | Operational log file path. Default is Niko.log. | Niko.log |
| LOG_LEVEL | No | Log level, e.g. 'INFO' or 'DEBUG'. Default is 'INFO'. | INFO |
| FEDELE_URL | No | Base URL of the Fedele/NetBox source of truth. '/api' is appended automatically if omitted. | |
| FEDELE_TOKEN | No | API token for the Fedele or NetBox source of truth. | |
| NETMIKO_SECRET | No | Optional enable/secret password for devices when NETMIKO_MCP_CREDENTIAL_SOURCE is 'env'. | |
| NETMIKO_PASSWORD | No | SSH password for devices when NETMIKO_MCP_CREDENTIAL_SOURCE is 'env'. | |
| NETMIKO_USERNAME | No | SSH username for devices when NETMIKO_MCP_CREDENTIAL_SOURCE is 'env'. | |
| NETMIKO_MCP_CONFIG | No | Path to a YAML config file containing these same settings. Default is ~/.netmiko-mcp.yml. | |
| FEDELE_CREDENTIALS_KEY | No | Fernet key used to decrypt device credentials from Fedele. Required when NETMIKO_MCP_CREDENTIAL_SOURCE is 'fedele'. | |
| NETMIKO_MCP_ALLOW_PIPE | No | Set to 'true' to enable pipes in commands. Default is 'false'. | false |
| NETMIKO_MCP_MAX_WORKERS | No | Maximum concurrent connections for group commands. Default is 10. | 10 |
| NETMIKO_MCP_COMMAND_FILE | No | Path to the YAML allow/deny command policy file. If missing, the built-in fallback policy of 16 read-only commands is used. | |
| NETMIKO_MCP_AUDIT_LOG_FILE | No | Path to the JSONL audit trail file. Every command attempt is recorded here. | |
| NETMIKO_MCP_INVENTORY_FILE | No | Path to the YAML inventory file. Required when NETMIKO_MCP_INVENTORY_TYPE is 'yaml'. | |
| NETMIKO_MCP_INVENTORY_TYPE | No | Where the device inventory comes from. Use 'yaml' for a local YAML file or 'fedele' for a Fedele/NetBox source of truth. | |
| NETMIKO_MCP_SAVE_THRESHOLD | No | Line count above which command output is saved to a file instead of being returned inline. Default is 1000. | 1000 |
| NETMIKO_MCP_SSH_CONFIG_FILE | No | Path to an OpenSSH ssh_config file. Required for jumphost support because Netmiko does not read ~/.ssh/config automatically. | |
| NETMIKO_MCP_FEDELE_CACHE_TTL | No | Cache TTL in seconds for Fedele/NetBox resolution. Default is 60. | 60 |
| NETMIKO_MCP_SAVE_OUT_PUT_DIR | No | Directory used to buffer large command outputs. Default is ~/.netmiko_mcp_tmp. | |
| NETMIKO_MCP_CREDENTIAL_SOURCE | No | Where device credentials come from. Use 'env' to read from the .env file or 'fedele' to resolve credentials from the Fedele source of truth. | |
| NETMIKO_MCP_FEDELE_GROUP_SOURCE | No | Defines what constitutes a device group in Fedele/NetBox: 'tags', 'device_roles', or 'sites'. Default is 'tags'. | tags |
| NETMIKO_MCP_FEDELE_DEVICE_FILTER | No | Optional scope filter for the Fedele/NetBox inventory, e.g. 'tag=lab&status=active'. Unset means the whole estate the token can read. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| netmiko.get_metadataA | Return authoritative metadata about the Netmiko MCP server and its inventory. MANDATORY — call this tool FIRST on EVERY user message that mentions, asks about, or relates to network devices, routers, switches, firewalls, show commands, device inventory or device groups, before any other netmiko tool and before answering from memory, system prompt, or RAG/FAQ. It reports which inventory backend is active (Fedele or the local YAML file) and, for the local file, how old it is. That matters: operating from a stale local inventory can send a command to the wrong box. This tool does NOT reach any network device. For "is the MCP alive" call netmiko.health_check. To actually query a device, use netmiko.send_show_command. Returns:
str: JSON with |
| netmiko.get_command_policyA | List the commands this server will accept, and where that policy comes from. CALL THIS AFTER A REFUSAL, BEFORE RETRYING. A Also useful when the user asks what they can run on this deployment. ANSWERING "which commands are available for Juniper / Huawei / Cisco": the lists
are flat, because the operator writes one policy for the whole estate. Filter it
yourself by dialect — you know the CLIs, and
How the lists are read (getting this wrong wastes attempts, and every attempt is audited):
Returns:
str: JSON with |
| netmiko.health_checkA | Check whether the Netmiko MCP server itself is responsive and correctly configured. IMPORTANT: If the user message involves network devices, call netmiko.get_metadata FIRST. This checks the MCP server, NOT any network device and NOT the inventory backend reachability. "¿Está arriba el router X?" is not this tool — that requires actually running a command against the device with netmiko.send_show_command. Returns:
str: JSON with |
| netmiko.list_groupsA | List every device group defined in the inventory. IMPORTANT: If the user message involves network devices, call netmiko.get_metadata FIRST. Groups are what netmiko.send_show_command_to_group accepts. Call this before assuming a group name exists — never invent one. Returns:
str: JSON with |
| netmiko.list_devicesA | List devices from the inventory, without credentials. IMPORTANT: If the user message involves network devices, call netmiko.get_metadata FIRST. Use this to discover exact device names before running a command. Device names are the only handle the other tools accept — never pass an IP address or a hostname you inferred. |
| netmiko.send_show_commandA | Connect to one network device over SSH and run a single show command. IMPORTANT: If the user message involves network devices, call netmiko.get_metadata FIRST. The command is validated against the operator's allow/deny list before execution. A rejection is NOT a bug and NOT something to work around: report it to the user and say which command was refused. Do not retry with an abbreviation — abbreviations are covered by the deny list, not by the allow list. SYNTAX IS PER-PLATFORM. Netmiko drives 177 base device_types (416 with variants)
from 102 vendors and their CLIs are NOT interchangeable. Check the device's
|
| netmiko.send_show_command_to_groupA | Run the same show command concurrently on every device of a group. IMPORTANT: If the user message involves network devices, call netmiko.get_metadata FIRST. The command is validated once before any connection is opened, so a denied command reaches no device at all. Per-device failures are returned per device: a partial result is normal and must be reported as partial, never summarised as if every device answered. A GROUP MAY MIX PLATFORMS. The same command string is sent to every member, so a
group holding both Cisco IOS and Huawei VRP devices will fail on half of them
whatever you send — |
| netmiko.list_device_outputsA | List the output files already saved on disk for a device, group, or all devices. IMPORTANT: If the user message involves network devices, call netmiko.get_metadata FIRST. Outputs land here when save_output=True was used or when a command exceeded save_threshold. Read them with netmiko.read_device_output. |
| netmiko.read_device_outputA | Read a previously saved output file for one device, with pagination. IMPORTANT: If the user message involves network devices, call netmiko.get_metadata FIRST. The response header states the line range and the total line count. When lines remain, a continuation hint gives the offset to use next. Do not report a total based on a page you have not finished reading. |
| netmiko.query_audit_trailA | Read the audit trail: what this server was asked to do, and what happened. Answers questions about PAST activity — "everything done on SW-CORE-01", "the last 6 netmiko actions", "which commands were refused this week", "who touched that switch and with which credential". It reads the audit records only; it never opens a connection and never returns device output. Every argument is a filter, combined with AND. Leave one empty to not filter on it. Translate what the user asked into these arguments — do not ask for everything and sift through it. The audit trail rotates daily and this reads the rotated files too, but only
what is still on disk.
Calling this tool writes a |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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