Nornir MCP Server
Allows management of Cisco network devices (IOS, NX-OS, XR) including running show commands, deploying configurations, retrieving structured data via NAPALM getters, and backing up device configurations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Nornir MCP Server run show ip interface brief on core switches"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Nornir MCP Server
An enterprise-ready Model Context Protocol (MCP) server that brings the power of Nornir to LLMs like Claude. It seamlessly integrates NAPALM for structured data retrieval and Netmiko for flexible CLI execution, enabling natural language orchestration of complex network infrastructure.
🚀 Overview
The Nornir MCP Server provides a specialized set of tools for network engineers and AI agents to interact with multi-vendor environments safely and efficiently.
Multi-Vendor Support: Standardized interaction for Cisco (IOS, NX-OS, XR), Arista (EOS), Juniper (Junos), and 100+ others.
Dual-Engine Architecture: Combines NAPALM's normalized getters with Netmiko's robust SSH command execution.
Intelligent Filtering: Schema-agnostic device selection by hostname, group, or platform.
Security First: Built-in command blacklisting, input validation (Pydantic), and backup path restrictions.
Per-Call Inventory Reloading: Every MCP tool invocation reloads
config.yamland inventory data from disk.Production Ready: Comprehensive logging and asynchronous execution.
Related MCP server: nornir-mcp-server
📋 Table of Contents
🛠 Installation
Using uv (Recommended)
# Install as a global tool
uv tool install git+https://github.com/sydasif/nornir-mcp-server.git
# Upgrade to latest
uv tool upgrade nornir-mcp-serverUsing pip
pip install git+https://github.com/sydasif/nornir-mcp-server.git⚡ Quick Start
Initialize Configuration:
Create a
config.yamland basic inventory files in your working directory. See Minimal Inventory Example below.Launch the Server:
nornir-mcpVerify Inventory:
The server will look for
config.yamlin the current directory to load your Nornir inventory.
📦 Minimal Inventory Example
To get started quickly, create these three files in your project root:
hosts.yaml
R1:
hostname: 192.168.1.1
platform: ios
groups:
- cisco_iosgroups.yaml
cisco_ios:
platform: ios
username: admin
password: passworddefaults.yaml
# Global defaults
data:
site: NYCconfig.yaml
inventory:
plugin: SimpleInventory
options:
host_file: "hosts.yaml"
group_file: "groups.yaml"
defaults_file: "defaults.yaml"🧰 Available Tools
The server exposes 5 tools categorized by operational intent. All tools support individual filter parameters for device selection.
Filter Parameters:
filter_name: Filter by device name in inventoryfilter_hostname: Filter by specific hostname or IP addressfilter_group: Filter by group membership (e.g., "cisco", "arista")filter_platform: Filter by platform (e.g., "eos", "ios", "junos")
All filter parameters are optional. When multiple filters are provided, they are combined with AND logic.
Category | Tool | Description |
Inventory |
| List hosts, groups, and metadata. |
Monitoring |
| Generic access to any NAPALM getter (ARP, VLAN, etc.). |
Management |
| Execute arbitrary show commands safely. |
| Deploy configuration changes with validation. | |
| Securely save configurations to local disk. |
⚙️ Configuration
Every MCP tool call reloads config.yaml from the current working directory. The server does not cache a long-lived Nornir instance between requests.
Nornir Setup (config.yaml)
inventory:
plugin: SimpleInventory
options:
host_file: "hosts.yaml"
group_file: "groups.yaml"
defaults_file: "defaults.yaml"
runner:
plugin: threaded
options:
num_workers: 100
logging:
enabled: true
level: INFOCommand Security
The server includes a built-in security engine that validates all CLI commands against a multi-stage validation system before execution. This prevents accidental or malicious use of destructive commands while minimizing false positives for read-only operations.
Security Features:
Read-Only Enforcement: Tools like
run_show_commandsenforce an allowlist prefix (e.g.,show,display,get,ping,traceroute).Smart Denylist: Destructive keywords (
erase,format,delete,reload) are blocked only when they appear as the first token of a command. This allows legitimate commands likeshow reload historywhile blocking a barereload.Chaining & Redirection Protection: Prevents the use of
;,&&,>, and<to ensure single-command integrity.Path Sandboxing: Configuration backups are protected against directory traversal attacks (
..).
🤖 CLI Integration
Add the following to your claude config:
{
"mcpServers": {
"nornir": {
"command": "nornir-mcp"
}
}
}Add the following to your opencode config:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"nornir": {
"type": "local",
"command": ["nornir-mcp"]
}
}
}Try these prompts:
"Show me all core routers in the US-West region."
"Are there any BGP neighbors down on R1?"
"Backup the running configuration of all Arista switches."
"Check if there are any errors on the interfaces of the edge-group."
🔒 Security
Command Validation: All CLI inputs pass through a multi-stage built-in denylist filter (Keywords and Patterns).
Credential Management: Supports environment variables and Nornir's native secure handling.
Path Sandboxing: Configuration backups are restricted to the defined root directory to prevent traversal.
👨💻 Development
# Clone and setup
git clone https://github.com/sydasif/nornir-mcp-server.git
cd nornir-mcp-server
uv sync
# Run tests
uv run pytest
# Lint and Format
uv run ruff check . --fix
uv run ruff format .If uv run is unstable in the local environment, use .venv/bin/pytest and .venv/bin/ruff directly.
Relevant internal paths:
src/nornir_mcp/services/runner.py: shared task execution.src/nornir_mcp/services/inventory.py: shared inventory loading and filtering helper. This helper still reloads inventory from disk on every call.src/nornir_mcp/services/napalm.py: shared NAPALM getter execution helper used by monitoring and backup tools.src/nornir_mcp/tools/monitoring.py: monitoring tools for generic getters.
✅ Testing
The repository includes a pytest suite under tests/ covering filters, inventory loading, inventory tools, monitoring tools, NAPALM helper behavior, security validation, runner error handling, and backup behavior.
# Run the full test suite
uv run pytest
# Fallback if uv run is unstable
.venv/bin/pytest📄 License
This project is licensed under the MIT License. See LICENSE for details.
Available Tools
5 toolsbackup_device_configsAIdempotent
Save device configuration to the local disk.
Args: path: Directory path to save backup files filter_name: Filter by device name in inventory filter_hostname: Filter by specific hostname or IP filter_group: Filter by group membership filter_platform: Filter by platform (e.g., cisco_ios)
Returns: Summary of saved file paths.
Inputs: path, filter_name, filter_group, filter_hostname, +1 more. Returns: object
list_network_devicesARead-only
List network devices and inventory information.
Consolidated tool that provides flexible access to inventory data including devices, groups, or both. Use 'details=true' for full device attributes.
Args: query_type: Type of inventory data to return ("devices", "groups", "all") details: Whether to return full inventory attributes (for devices query) filter_name: Filter by device name in inventory filter_hostname: Filter by specific hostname or IP filter_group: Filter by group membership filter_platform: Filter by platform (e.g., cisco_ios)
Returns: Dictionary containing inventory data based on query_type
Inputs: details, query_type, filter_name, filter_group, +2 more. Returns: object
run_napalm_getterARead-only
Execute one or more NAPALM getters on network devices.
Common available getters:
"facts": Basic device information (vendor, model, uptime).
"interfaces": Interface status, speed, and error statistics.
"interfaces_ip": IP address assignments per interface.
"bgp_neighbors": BGP session states and neighbors.
"config": Retrieve Running/Startup/Candidate configs.
Args: getters: List of NAPALM getter names (e.g., ['facts', 'interfaces', 'arp_table']) getters_options: Optional getter-specific options filter_name: Filter by device name in inventory filter_hostname: Filter by specific hostname or IP filter_group: Filter by group membership filter_platform: Filter by platform (e.g., cisco_ios)
Returns: Structured NAPALM data per host
Inputs: getters (required), filter_name, filter_group, filter_hostname, +2 more. Returns: object
run_show_commandsARead-only
Execute raw CLI show commands via SSH.
Args: commands: List of show commands to execute filter_name: Filter by device name in inventory filter_hostname: Filter by specific hostname or IP filter_group: Filter by group membership filter_platform: Filter by platform (e.g., cisco_ios)
Returns: Dictionary with 'hosts' key mapping hostname -> task result (success or error).
Inputs: commands (required), filter_name, filter_group, filter_hostname, +1 more. Returns: object
send_config_commandsADestructive
Send configuration commands to network devices.
Args: commands: List of configuration commands filter_name: Filter by device name in inventory filter_hostname: Filter by specific hostname or IP filter_group: Filter by group membership filter_platform: Filter by platform (e.g., cisco_ios)
Returns: Dictionary with 'hosts' key mapping hostname -> task result (success or error).
Inputs: commands (required), filter_name, filter_group, filter_hostname, +1 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 5 tools
Each tool targets a distinct operation: inventory listing, config push, backup, CLI show commands, and structured data retrieval via NAPALM. There is no overlap between their purposes, and shared filters are consistently applied.
All tool names follow a consistent verb_noun pattern (list, send, backup, run, run) in lower_snake_case. The repeated verb 'run' is clearly disambiguated by its object, maintaining a predictable scheme.
With 5 tools, the set is tightly scoped for network automation using Nornir. Each tool addresses a core operational need with no redundancy or bloat.
The tool set covers inventory, configuration, backup, CLI execution, and structured state retrieval, covering most common Nornir workflows. However, operations like configuration restore or inventory modification are missing, representing minor lifecycle gaps.
Maintenance
Related MCP Connectors
Query, explore, and manage your databases through natural conversation.
Query and audit AppSheet apps in natural language via Knotrik's pre-scanned definitions.
Query Allen-Bradley and Siemens PLC projects, live tag values, and analyses in plain English.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides 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.12MIT
- FlicenseAqualityFmaintenanceAn MCP server that integrates Nornir with NAPALM and Netmiko, enabling LLMs to orchestrate multi-vendor network infrastructure through natural language.52-
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to manage network devices via gNMI protocol, including querying capabilities, reading/modifying configurations, and subscribing to telemetry data through natural language.-
- FlicenseAqualityCmaintenanceEnables AI agents to autonomously manage network devices using Nornir, supporting inventory filtering, parallel command execution, and configuration deployment across SSH, REST API, and serial connections.6-