io.github.shigechika/junos-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| JUNOS_MCP_POOL | No | Set to '0' to disable the connection pool and open a fresh connection per call. | 1 |
| JUNOS_OPS_CONFIG | No | Path to the config.ini file. If not set, search order: JUNOS_OPS_CONFIG env var, ./config.ini, ~/.config/junos-ops/config.ini | |
| JUNOS_MCP_POOL_IDLE | No | Idle timeout in seconds for pooled connections. Set to '0' to disable eviction. | 60 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_device_factsA | Get basic device information (model, hostname, serial, version, etc.). Args: hostname: Target device hostname (must exist in config.ini) config_path: Path to config.ini (empty string uses default search) |
| get_versionA | Get JUNOS version information with upgrade status. Shows running version, planning version, pending version, local/remote package status, and reboot schedule. Args: hostname: Target device hostname (must exist in config.ini) config_path: Path to config.ini (empty string uses default search) |
| run_show_commandA | Run a CLI show command on the device and return output. Args: hostname: Target device hostname (must exist in config.ini) command: CLI command to execute (e.g., "show bgp summary") output_format: Output format — "text" (default), "json", or "xml". Note: JunOS drops pipe stages (| match, | last, | count) under json/xml; use "text" when pipe filtering is needed. config_path: Path to config.ini (empty string uses default search) |
| run_show_commandsA | Run multiple CLI show commands on the device in a single session. Commands are executed in sequence and stop on the first failure. To run all commands regardless of individual errors, call run_show_command once per command instead. Args: hostname: Target device hostname (must exist in config.ini) commands: List of CLI commands to execute output_format: Output format — "text" (default), "json", or "xml". Note: JunOS drops pipe stages (| match, | last, | count) under json/xml; use "text" when pipe filtering is needed. config_path: Path to config.ini (empty string uses default search) |
| run_show_command_batchA | Run a CLI show command on multiple devices in parallel. Uses ThreadPoolExecutor for concurrent execution. Either Args:
command: CLI command to execute on all devices
hostnames: List of target device hostnames (must exist in config.ini)
tags: Tag filter. Each list element is one tag group (comma-separated
tags AND together within a group). Multiple list elements OR
together across groups. E.g. |
| list_remote_filesA | List files on the remote device path (/var/tmp by default). Args: hostname: Target device hostname (must exist in config.ini) config_path: Path to config.ini (empty string uses default search) |
| check_upgrade_readinessB | Check if a device is ready for upgrade. Verifies whether the device is already running the target version, and performs a dry-run to check local/remote package availability. Args: hostname: Target device hostname (must exist in config.ini) config_path: Path to config.ini (empty string uses default search) |
| compare_versionA | Compare two JUNOS version strings. Returns whether left is greater than, equal to, or less than right. No device connection required. Args: left: First JUNOS version string (e.g., "22.4R3-S6.5") right: Second JUNOS version string (e.g., "23.2R1.0") |
| get_router_listA | List routers defined in config.ini, optionally filtered by tags. Returns section names from config.ini, which represent the hostnames that can be used with other tools. No device connection required. Args:
tags: Tag filter. Each list element is one tag group (comma-separated
tags AND together within a group); multiple list elements OR
together across groups. E.g. |
| get_package_infoA | Get package file name and expected hash for a specific device model. Retrieves model-specific package information from config.ini. No device connection required. Args: hostname: Target device hostname (must exist in config.ini) model: Device model name (e.g., "EX2300-24T") config_path: Path to config.ini (empty string uses default search) |
| get_configB | Get device configuration. Args: hostname: Target device hostname (must exist in config.ini) output_format: Output format - "text" (default), "set", or "xml" config_path: Path to config.ini (empty string uses default search) |
| get_config_diffA | Show configuration difference compared to a rollback version. Args: hostname: Target device hostname (must exist in config.ini) rollback_id: Rollback version to compare against (0-49, default 1) config_path: Path to config.ini (empty string uses default search) |
| collect_rsiB | Collect RSI (Request Support Information) and SCF (Show Configuration) from a device. Saves two files: {hostname}.SCF (show configuration) and {hostname}.RSI (request support information). Model-specific timeouts are applied automatically (e.g., SRX Branch: 1200s, Virtual Chassis: 1800s). Args: hostname: Target device hostname (must exist in config.ini) output_dir: Directory to save output files (empty uses config RSI_DIR or current dir) config_path: Path to config.ini (empty string uses default search) |
| collect_rsi_batchA | Collect RSI/SCF from multiple devices in parallel. Uses ThreadPoolExecutor for concurrent collection. Default 20 workers
matches junos-ops CLI default for RSI collection. Either Args:
hostnames: List of target device hostnames
tags: Tag filter. Each list element is one tag group (comma-separated
tags AND together within a group); multiple list elements OR
together across groups. Combined with |
| check_reachabilityA | Probe NETCONF reachability for one or more devices. Equivalent to Args:
hostnames: List of target device hostnames (must exist in config.ini)
tags: Tag filter. Each list element is one tag group (comma-separated
tags AND together within a group); multiple list elements OR
together across groups. Combined with |
| check_local_inventoryA | Verify local firmware checksums against the config.ini inventory. Equivalent to Args: model: Restrict to a single model (empty = all configured models) config_path: Path to config.ini (empty string uses default search) |
| check_remote_packagesA | Verify the staged firmware checksum on one or more devices. Equivalent to Args:
hostnames: List of target device hostnames (must exist in config.ini)
tags: Tag filter. Each list element is one tag group (comma-separated
tags AND together within a group); multiple list elements OR
together across groups. Combined with |
| push_configA | Push configuration to a device with commit confirmed and health check. Supports two input methods (exactly one required):
Safety features (not available in Juniper's official MCP server):
Commit flow (normal): lock -> load -> diff -> commit_check -> commit confirmed -> health check -> confirm -> unlock Commit flow (no_commit=True — intentional auto-rollback): lock -> load -> diff -> commit_check -> commit confirmed -> unlock (health check and final confirm are skipped; JUNOS rolls back automatically after confirm_timeout minutes) Args:
hostname: Target device hostname (must exist in config.ini)
config_file: Path to .set or .j2 file (mutually exclusive with set_commands)
set_commands: List of set commands (mutually exclusive with config_file)
dry_run: If True (default), show diff only without committing
confirm_timeout: Minutes before auto-rollback (default 1, used with commit confirmed)
no_commit: If True, issue commit confirmed but intentionally skip the final
commit so JUNOS auto-rolls back after confirm_timeout minutes. Useful
for triggering service restarts (e.g. syslog on EX3400) where no
|
| copy_packageA | Copy firmware package to remote device via SCP with checksum verification. Checks if copy is needed (already running target version, or package already present on device). Cleans up storage before copying. Args: hostname: Target device hostname (must exist in config.ini) dry_run: If True (default), show what would be done without copying force: If True, skip version checks and force copy config_path: Path to config.ini (empty string uses default search) |
| install_packageA | Install firmware package on device with pre-flight checks. Full upgrade flow: version check -> rollback pending if needed -> copy (with checksum) -> clear reboot schedule -> rescue config save -> request system software add (with validation). Args:
hostname: Target device hostname (must exist in config.ini)
dry_run: If True (default), show what would be done without installing
force: If True, skip version checks and force install
unlink: If True, run |
| rollback_packageA | Rollback to previously installed package version. Checks pending version first. If no pending version exists, rollback is skipped. Args: hostname: Target device hostname (must exist in config.ini) dry_run: If True (default), show what would be done without rolling back config_path: Path to config.ini (empty string uses default search) |
| schedule_rebootA | Schedule device reboot at a specified time. Checks for existing reboot schedules. If one exists and force is False, the existing schedule is preserved. Args: hostname: Target device hostname (must exist in config.ini) reboot_at: Reboot time in YYMMDDHHMM format (e.g., "2601020304" = 2026-01-02 03:04) dry_run: If True (default), show what would be done without scheduling force: If True, clear existing reboot schedule and set new one config_path: Path to config.ini (empty string uses default search) |
| daily_briefA | Run a morning health check across multiple devices in parallel. Checks per host (Phase 1):
Syslog patterns watched: BGP state change away from Established, STP port role change, OSPF neighbor down, ARP address conflict, IF_DOWN.
Output tiers:
Returns a Markdown summary with anomaly details for CRITICAL/WARNING hosts and a collapsed OK list. |
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
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/shigechika/junos-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server