Loading...
Loading...
Juniper JunOS device automation via PyEZ/NETCONF — CLI execution, configuration management, Jinja2 template rendering, device facts, batch operations, config diff and rollback comparison (10 tools). Use when managing Juniper routers, pushing JunOS configs, running show commands on Juniper devices, or comparing rollback versions
npx skill4agent add automateyournetwork/netclaw junos-network| Field | Value |
|---|---|
| Repository | Juniper/junos-mcp-server |
| Transport | stdio (default for CLI), streamable-http (for IDE) |
| Python | 3.10+ (3.11 recommended) |
| Protocol | SSH → NETCONF → PyEZ (junos-eznc) |
| Dependencies | |
| Install | |
| Entry Point | |
| Container | |
devices.json{
"core-rtr-01": {
"ip": "10.0.0.1",
"port": 22,
"username": "netops",
"auth": {
"type": "ssh_key",
"private_key_path": "/home/user/.ssh/junos_key"
}
},
"edge-rtr-02": {
"ip": "10.0.0.2",
"port": 22,
"username": "admin",
"auth": {
"type": "password",
"password": "changeme"
}
}
}ssh_config| Variable | Default | Purpose |
|---|---|---|
| | Path to device inventory JSON |
| | Default command timeout in seconds |
| Tool | Parameters | Description |
|---|---|---|
| — | List all available Junos routers (passwords/keys filtered from output) |
| | Add a new Junos device interactively (streamable-http only) |
| | Reload the device dictionary from a new JSON file |
| Tool | Parameters | Description |
|---|---|---|
| | Execute a JunOS CLI command on a single router |
| | Execute the same command on multiple routers in parallel |
| Tool | Parameters | Description |
|---|---|---|
| | Retrieve the full running configuration ( |
| | Compare current config against a rollback version (1-49) |
| | Load and commit configuration (formats: set, text, xml) |
| Tool | Parameters | Description |
|---|---|---|
| | Render Jinja2 template with YAML variables; optionally apply to one or many routers with dry-run support |
| | Gather device facts: hostname, model, serial, version, uptime, RE info |
block.cmdrequest system rebootrequest system haltrequest system power-cyclerequest system power-offrequest system zeroizeblock.cmdblock.cfgset system root-authenticationset system login user ... authenticationblock.cfgget_router_listget_router_list → inventory all available Junos routers
→ gather_device_facts(router) per device → hostname, model, serial, version, uptime
→ Cross-reference with NetBox/Nautobot → flag discrepancies
→ GAITget_router_list → identify target routers
→ execute_junos_command_batch(routers, "show chassis alarms") → alarm check
→ execute_junos_command_batch(routers, "show system processes extensive") → CPU/memory
→ execute_junos_command_batch(routers, "show interfaces terse") → interface status
→ execute_junos_command_batch(routers, "show bgp summary") → BGP peer health
→ Severity-sort findings → GAITget_router_list → select target routers
→ get_junos_config(router) → retrieve running config
→ junos_config_diff(router, version=1) → check for uncommitted or recent changes
→ Compare against golden config templates → flag deviations
→ GAITServiceNow CR must be in Implement state
→ get_junos_config(router) → baseline current config
→ render_and_apply_j2_template(template, vars, router, dry_run=true) → preview changes
→ render_and_apply_j2_template(template, vars, router, apply_config=true, commit_comment="CR-12345") → apply
→ get_junos_config(router) → verify post-change config
→ execute_junos_command(router, "show bgp summary") → verify protocol health
→ GAITget_router_list → filter to target group (e.g., all edge routers)
→ execute_junos_command_batch(routers, "show version") → version inventory
→ execute_junos_command_batch(routers, "show ospf neighbor") → protocol health
→ Aggregate results → severity-sort → GAITjunos_config_diff(router, version=1) → compare against last committed config
→ junos_config_diff(router, version=2) → compare against version before that
→ Identify what changed, when, and the impact
→ execute_junos_command(router, "show system commit") → commit history
→ GAIT| Skill | Integration |
|---|---|
| pyats-network | JunOS MCP for Juniper devices, pyATS MCP for Cisco devices — unified multi-vendor fleet management |
| netbox-reconcile | Cross-reference JunOS device facts (model, serial, version) against NetBox source of truth |
| nautobot-sot | Same as NetBox — validate Juniper device IPAM data in Nautobot |
| infrahub-sot | Cross-reference Infrahub node data with Juniper device inventory |
| itential-automation | Itential workflows can orchestrate JunOS config deployments; Junos command templates complement Itential's |
| servicenow-change-workflow | Gate all JunOS config commits behind ServiceNow Change Requests |
| gait-session-tracking | Every JunOS command, config push, and batch operation logged in GAIT |
| nso-device-ops | NSO for multi-vendor orchestration, JunOS MCP for direct Juniper device access |
| te-network-monitoring | Validate network health via ThousandEyes after JunOS config changes |
| fmc-firewall-ops | Correlate Juniper ACL/firewall-filter config with Cisco FMC security policies |
| subnet-calculator | VLSM planning for Juniper interface addressing |
| nvd-cve | Scan Junos OS versions against NVD vulnerability database |
| Capability | JunOS MCP | pyATS MCP |
|---|---|---|
| Vendor | Juniper only | Cisco (IOS-XE, NX-OS, IOS-XR) |
| Protocol | NETCONF via PyEZ | SSH + Genie parsers |
| CLI Execution | | |
| Batch Operations | | |
| Config Retrieval | | |
| Config Push | | |
| Template Support | Built-in Jinja2 rendering + apply | External (Jinja2 → configure) |
| Config Diff | | Manual diff via show commands |
| Device Facts | | |
| Safety | | Built-in destructive command blocking |
| MCP Tools | 10 | 8 |
get_router_listget_junos_configload_and_commit_configdry_run=truerender_and_apply_j2_templateload_and_commit_configrender_and_apply_j2_template(apply_config=true)Implementexecute_junos_command_batchexecute_junos_commandcommit_commentget_junos_configblock.cmdblock.cfg