Skip to main content
Glama
shigechika

io.github.shigechika/junos-mcp

by shigechika

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
JUNOS_MCP_POOLNoSet to '0' to disable the connection pool and open a fresh connection per call.1
JUNOS_OPS_CONFIGNoPath 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_IDLENoIdle timeout in seconds for pooled connections. Set to '0' to disable eviction.60

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
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 hostnames or tags selects the targets; if both are omitted, every router in config.ini is targeted. When both are given, the intersection is used.

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. ["tokyo,core", "backup"] means (tokyo AND core) OR backup. Combined with hostnames the result is the intersection. grep_pattern: Optional Python re pattern. When set, only lines matching the pattern (via re.search) are kept from each host's output. Header lines (starting with #) are always preserved. Hosts with no matching lines show (no match). Reduces large batch outputs to the essential lines. max_workers: Maximum parallel threads (default 5) config_path: Path to config.ini (empty string uses default search)

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. ["tokyo,core", "backup"] means (tokyo AND core) OR backup. None/empty returns all. config_path: Path to config.ini (empty string uses default search)

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 hostnames or tags selects the targets; if both are omitted, every router in config.ini is targeted. When both are given, the intersection is used.

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 hostnames the result is the intersection. output_dir: Directory to save output files (empty uses config RSI_DIR or current dir) max_workers: Maximum parallel threads (default 20) config_path: Path to config.ini (empty string uses default search)

check_reachabilityA

Probe NETCONF reachability for one or more devices.

Equivalent to junos-ops check --connect. Opens a fast NETCONF handshake (no full PyEZ facts gathering, 5-second TCP probe) and reports per-host status as a table.

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 hostnames the result is the intersection. max_workers: Maximum parallel threads (default 20, matches junos-ops) config_path: Path to config.ini (empty string uses default search)

check_local_inventoryA

Verify local firmware checksums against the config.ini inventory.

Equivalent to junos-ops check --local. Iterates every <model>.file / <model>.hash pair in the DEFAULT section of config.ini and verifies the file on the staging server. No device connection required.

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 junos-ops check --remote. Connects to each device via NETCONF and verifies the package file (<model>.file) sitting on the device against <model>.hash. Doubles as post-SCP copy verification. Per-host model resolution: model arg > config.ini [host].model > device facts.

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 hostnames the result is the intersection. model: Override model resolution for all hosts (empty = per-host resolution) max_workers: Maximum parallel threads (default 20) config_path: Path to config.ini (empty string uses default search)

push_configA

Push configuration to a device with commit confirmed and health check.

Supports two input methods (exactly one required):

  • config_file: Path to a .set or .j2 file containing set commands

  • set_commands: List of set command strings (inline)

Safety features (not available in Juniper's official MCP server):

  • dry_run mode (default True): shows diff without committing

  • commit confirmed: auto-rollback if not confirmed within timeout

  • health check: auto-rollback on connectivity failure after commit

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 request ...restart command exists. dry_run=True takes precedence over no_commit (diff is shown but nothing is committed). health_check: Fallback health check commands tried in order after commit. Passes if ANY command succeeds. Supports "ping ..." (checks packets received), "uptime" (NETCONF RPC probe), or any CLI command (success if no exception). Default: ["uptime"] — uses the existing NETCONF session and does not depend on ICMP reachability. (Changed from broadcast ping in junos-mcp 0.11.0 to match junos-ops 0.16.8+.) Ignored when no_commit=True. config_path: Path to config.ini (empty string uses default search)

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 request system software add <pkg> unlink via CLI instead of PyEZ SW.install(). Use for low-flash devices (EX2300 / EX3400, ~1.3 GB /dev/gpt/junos) where major version upgrades fail with "ERROR: insufficient space" because PyEZ does not expose the unlink parameter. The CLI path frees ~330 MB by unlinking the source tgz during extraction. config_path: Path to config.ini (empty string uses default search)

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):

  • show system alarms / show chassis alarms

  • show interfaces terse — interface up/down (loopback excluded)

  • show log messages | last 200 — alert patterns within since_hours

Syslog patterns watched: BGP state change away from Established, STP port role change, OSPF neighbor down, ARP address conflict, IF_DOWN.

since_hours defaults to 18 (≈ previous 15:00 for a 09:00 morning run). Tags default to none (all routers); pass tags=["main"] to limit scope.

Output tiers:

  • CRITICAL — connection failure

  • WARNING — at least one anomaly found

  • OK — clean

Returns a Markdown summary with anomaly details for CRITICAL/WARNING hosts and a collapsed OK list.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

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