Repository navigation
rustjunosmcp v0.26.0
Added
-
--allow-direct-commit, off by default.load_and_commit_config, a
committingrender_and_apply_j2_template,rollback_config, and
upgrade_junosstage, validate, and commit a device change in one call with
no change set and no second-principal review. Without the flag, all four
are refused before the device is touched, identically over stdio and HTTP.
With it, the server logs loudly at startup and every call is audited
(direct_commit_allowed=true; a refusal is audited too). See
--allow-direct-commitin the README. -
approve_junos_change_setnow requires a human approver. The mecmcp
dependency'sChangesetCoordinator::approve_change_setgained an
approver_actor_typeargument and refuses anything but
mecmcp_audit::ActorType::Human— an agent or an unattributed caller could
already never propose and approve the same change set, but nothing
previously stopped it from standing in as the second principal. -
get_junos_configgains aformatparameter (textdefault,set,
xml, orjson), rendered device-side via the matching Junos
| display <format>CLI modifier — the same mechanism
execute_junos_commandalready passes through untouched. Output flows
through the same policy check, XML-wrapper stripping, and output-cap
pipeline as the existingtextformat; there is no new unredacted path.
An unrecognizedformatis rejected before any device connection. -
The load tools gain a
modeparameter (mergedefault,replace, or
override) controlling the wireactionfor<load-configuration>:
load_and_commit_config,render_and_apply_j2_template, and the
change-set payload spec (create_junos_change_set'sactions[].payload).
overridereplaces the entire candidate configuration — the highest
blast-radius operation this server exposes — and is refused outright on
load_and_commit_configandrender_and_apply_j2_template, which commit
directly with no second-principal review. It is permitted only through
create_junos_change_set→approve_junos_change_set→
apply_junos_change_set, which requires approval by a principal distinct
from the creator before anything commits (MEC-12).config_format=set
(configuration-set payloads) has no wire-leveloverrideaction in Junos;
that combination is rejected before any RPC is sent regardless of path. -
Raised MSRV to 1.89 (family-wide decision; enables mecmcp to drop aes pin)
-
Two new read-only SRX tools:
srx_flow_sessions,srx_policy_match.
srx_flow_sessionsqueries active flow sessions with hard-capped result
limits and node-aware summaries;srx_policy_matchperforms deterministic
5-tuple policy matching against both zone-pair and global policies,
returning the device's own verdict. Tool count: 37 → 39. -
Four new read-only SRX tools:
srx_list_policies,srx_resolve_address,
srx_resolve_application,srx_list_nat_rules. Security policies by
zone pair (incl. global policies and optional hit counts), address-book and
application/application-set resolution (includingjunos-*predefined
defaults, with recursive nested-set resolution and explicit cycle
rejection), and source/destination/static NAT rules. Address-book and
application resolution are configuration-sourced via a hand-built
subtree-filteredget-configurationRPC. Names on policies and NAT rules
are returned unresolved by design — usesrx_resolve_address/
srx_resolve_applicationto expand them. Tool count: 39 → 43. -
Release image and tarball are now signed keylessly with cosign via
GitHub Actions OIDC (no key pair, ever). TheRelease imageworkflow signs
the pushed image by digest; a newSign release tarballworkflow signs the
LXC tarball once it is attached to a published GitHub release. See the
README's "Verifying the image signature" and "Downloading a prebuilt release
tarball instead" sections forcosign verify/verify-blobrecipes.
Fixed
- cSRX devices now work. rustez 0.18 tolerates cSRX rejecting
<get-route-engine-information/>during fact gathering
(mechubsec/rustez#54). Previously every tool call on a cSRX device failed
with[OperationFailed] syntax error.
Full changes: v0.25.0...v0.26.0
Backfilled GitHub release for an existing tag (2026-10-07).