loading…
Search for a command to run...
loading…
An MCP server that integrates Nornir with NAPALM and Netmiko, enabling LLMs to orchestrate multi-vendor network infrastructure through natural language.
An MCP server that integrates Nornir with NAPALM and Netmiko, enabling LLMs to orchestrate multi-vendor network infrastructure through natural language.
License: MIT Python 3.10+ MCP Ruff
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.
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.
config.yaml and inventory data from disk.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-server
pippip install git+https://github.com/sydasif/nornir-mcp-server.git
Initialize Configuration:
Create a config.yaml and basic inventory files in your working directory. See Minimal Inventory Example below.
Launch the Server:
nornir-mcp
Verify Inventory:
The server will look for config.yaml in the current directory to load your Nornir inventory.
To get started quickly, create these three files in your project root:
hosts.yaml
R1:
hostname: 192.168.1.1
platform: ios
groups:
- cisco_ios
groups.yaml
cisco_ios:
platform: ios
username: admin
password: password
defaults.yaml
# Global defaults
data:
site: NYC
config.yaml
inventory:
plugin: SimpleInventory
options:
host_file: "hosts.yaml"
group_file: "groups.yaml"
defaults_file: "defaults.yaml"
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_network_devices |
List hosts, groups, and metadata. |
| Monitoring | run_napalm_getter |
Generic access to any NAPALM getter (ARP, VLAN, etc.). |
| Management | run_show_commands |
Execute arbitrary show commands safely. |
send_config_commands |
Deploy configuration changes with validation. | |
backup_device_configs |
Securely save configurations to local disk. |
Every MCP tool call reloads config.yaml from the current working directory. The server does not cache a long-lived Nornir instance between requests.
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: INFO
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:
run_show_commands enforce an allowlist prefix (e.g., show, display, get, ping, traceroute).erase, format, delete, reload) are blocked only when they appear as the first token of a command. This allows legitimate commands like show reload history while blocking a bare reload.;, &&, >, and < to ensure single-command integrity...).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:
# 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.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
This project is licensed under the MIT License. See LICENSE for details.
Built with ❤️ for Network Automation
Выполни в терминале:
claude mcp add nornir-mcp-server -- npx Безопасность
Низкий рискАвтоматическая эвристика по публичным данным — не гарантия безопасности.