@usex/mikrotik-mcp 4.7.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +35 -28
  2. package/dist/cli.js +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/shared/{cli-38m6waxx.js → cli-s2s6hryh.js} +4689 -3226
  5. package/dist/shared/{cli-jd7xqp2f.js → cli-xfa5x65h.js} +1 -1
  6. package/dist/shared/{library-31wz8hdh.js → library-6zh75zhp.js} +1 -1
  7. package/dist/shared/{library-fs4nps73.js → library-wm3vc8kq.js} +4689 -3226
  8. package/package.json +1 -1
  9. package/prompts/security-hardening-sweep.md +132 -0
  10. package/prompts/setup-eoip-tunnel-between-sites.md +119 -0
  11. package/prompts/setup-gre-tunnel-between-sites.md +163 -0
  12. package/prompts/setup-ipip-tunnel-between-sites.md +110 -0
  13. package/prompts/setup-openvpn-tunnel-between-sites.md +136 -0
  14. package/prompts/setup-sstp-tunnel-between-sites.md +136 -0
  15. package/prompts/setup-tunnel-between-sites.md +55 -8
  16. package/prompts/setup-vxlan-tunnel-between-sites.md +129 -0
  17. package/prompts/setup-wireguard-tunnel-between-sites.md +183 -0
  18. package/schemas/README.md +1 -1
  19. package/schemas/tool-catalog.json +658 -2
  20. package/schemas/tools/add_firewall_default_deny.json +25 -0
  21. package/schemas/tools/apply_security_hardening_fixes.json +25 -0
  22. package/schemas/tools/audit_account_hygiene.json +7 -0
  23. package/schemas/tools/audit_address_list_enforcement.json +7 -0
  24. package/schemas/tools/audit_certificate_hygiene.json +7 -0
  25. package/schemas/tools/audit_connection_tracking_helpers.json +7 -0
  26. package/schemas/tools/audit_dns_resolver_exposure.json +7 -0
  27. package/schemas/tools/audit_firewall_default_deny.json +7 -0
  28. package/schemas/tools/audit_ip_service_exposure.json +7 -0
  29. package/schemas/tools/audit_ipv6_firewall_baseline.json +7 -0
  30. package/schemas/tools/audit_kernel_ip_hardening.json +7 -0
  31. package/schemas/tools/audit_management_plane_exposure.json +7 -0
  32. package/schemas/tools/audit_network_segmentation.json +7 -0
  33. package/schemas/tools/audit_ssh_hardening.json +7 -0
  34. package/schemas/tools/bootstrap_ipv6_firewall_baseline.json +25 -0
  35. package/schemas/tools/enforce_address_list_blocking.json +25 -0
  36. package/schemas/tools/fix_certificate_crl_policy.json +25 -0
  37. package/schemas/tools/fix_password_policy.json +25 -0
  38. package/schemas/tools/harden_connection_tracking_helpers.json +25 -0
  39. package/schemas/tools/harden_dns_resolver_exposure.json +25 -0
  40. package/schemas/tools/harden_ip_service_exposure.json +25 -0
  41. package/schemas/tools/harden_kernel_ip_settings.json +25 -0
  42. package/schemas/tools/harden_management_plane_exposure.json +25 -0
  43. package/schemas/tools/harden_ssh_service.json +25 -0
  44. package/schemas/tools/run_security_hardening_audit.json +29 -0
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "version": "4.7.0",
3
+ "version": "4.8.0",
4
4
  "generated": "by scripts/gen-schemas.ts — do not edit by hand",
5
- "toolCount": 794,
5
+ "toolCount": 819,
6
6
  "tools": [
7
7
  {
8
8
  "name": "find_tools",
@@ -15359,6 +15359,662 @@
15359
15359
  "additionalProperties": false
15360
15360
  }
15361
15361
  },
15362
+ {
15363
+ "name": "audit_firewall_default_deny",
15364
+ "title": "Audit Firewall Default-Deny",
15365
+ "risk": "read",
15366
+ "annotations": {
15367
+ "readOnlyHint": true,
15368
+ "idempotentHint": true,
15369
+ "openWorldHint": false
15370
+ },
15371
+ "description": "Read-only. Walks `/ip firewall filter` input and forward chains and reports whether each chain ends in an ENFORCED default-deny (a final unconditional drop/reject). Separately flags the field trap where an accept is followed by a matching drop that is disabled=yes — the chain looks protected but everything falls through (severity critical, its own finding_id). Remediate with add_firewall_default_deny.",
15372
+ "inputSchema": {
15373
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15374
+ "type": "object",
15375
+ "properties": {},
15376
+ "additionalProperties": false
15377
+ }
15378
+ },
15379
+ {
15380
+ "name": "audit_address_list_enforcement",
15381
+ "title": "Audit Address-List Enforcement",
15382
+ "risk": "read",
15383
+ "annotations": {
15384
+ "readOnlyHint": true,
15385
+ "idempotentHint": true,
15386
+ "openWorldHint": false
15387
+ },
15388
+ "description": "Read-only. Cross-references every address-list that is WRITTEN by an add-src/dst-to-address-list rule against every list READ by a drop/reject (or escalation) rule, across `/ip firewall filter` and `/ip firewall raw`. Flags lists that are populated but never blocked (the classic 'we detect scanners/DDoS but never drop them' gap). Correctly does NOT flag staged escalation ladders (stage1→stage2→stage3→blacklist) whose final list is enforced. Folds in a low-severity note when detection lives entirely in filter with nothing in raw. Remediate with enforce_address_list_blocking.",
15389
+ "inputSchema": {
15390
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15391
+ "type": "object",
15392
+ "properties": {},
15393
+ "additionalProperties": false
15394
+ }
15395
+ },
15396
+ {
15397
+ "name": "audit_kernel_ip_hardening",
15398
+ "title": "Audit Kernel IP Hardening",
15399
+ "risk": "read",
15400
+ "annotations": {
15401
+ "readOnlyHint": true,
15402
+ "idempotentHint": true,
15403
+ "openWorldHint": false
15404
+ },
15405
+ "description": "Read-only. Checks `/ip settings` (and `/ipv6 settings`) for tcp-syncookies, rp-filter (recommends strict on single-WAN, loose on multi-WAN — detected by counting default routes), accept-source-route, and accept-redirects. Remediate with harden_kernel_ip_settings.",
15406
+ "inputSchema": {
15407
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15408
+ "type": "object",
15409
+ "properties": {},
15410
+ "additionalProperties": false
15411
+ }
15412
+ },
15413
+ {
15414
+ "name": "audit_ipv6_firewall_baseline",
15415
+ "title": "Audit IPv6 Firewall Baseline",
15416
+ "risk": "read",
15417
+ "annotations": {
15418
+ "readOnlyHint": true,
15419
+ "idempotentHint": true,
15420
+ "openWorldHint": false
15421
+ },
15422
+ "description": "Read-only. When IPv6 is enabled and/or forwarding with no default-deny in `/ipv6 firewall filter`, surfaces the exposure as TWO mutually-exclusive remediation options (distinct finding_ids): Option A bootstrap a minimal safe IPv6 filter (accept established/related, keep RFC 4890 ICMPv6, default-deny); Option B disable IPv6 forwarding when no IPv6 address is in use. Marks needs_live_verification when zero IPv6 addresses are assigned (latent exposure). Apply exactly one option via bootstrap_ipv6_firewall_baseline.",
15423
+ "inputSchema": {
15424
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15425
+ "type": "object",
15426
+ "properties": {},
15427
+ "additionalProperties": false
15428
+ }
15429
+ },
15430
+ {
15431
+ "name": "audit_ssh_hardening",
15432
+ "title": "Audit SSH Hardening",
15433
+ "risk": "read",
15434
+ "annotations": {
15435
+ "readOnlyHint": true,
15436
+ "idempotentHint": true,
15437
+ "openWorldHint": false
15438
+ },
15439
+ "description": "Read-only. Checks `/ip ssh`: strong-crypto (auto-fixable), RSA host-key below 2048 bits and host-key-type (report-only recommendation to migrate to ed25519 — regeneration invalidates known_hosts, so never auto-applied), and always-allow-password-login. Remediate the auto-fixable parts with harden_ssh_service.",
15440
+ "inputSchema": {
15441
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15442
+ "type": "object",
15443
+ "properties": {},
15444
+ "additionalProperties": false
15445
+ }
15446
+ },
15447
+ {
15448
+ "name": "audit_ip_service_exposure",
15449
+ "title": "Audit IP Service Exposure",
15450
+ "risk": "read",
15451
+ "annotations": {
15452
+ "readOnlyHint": true,
15453
+ "idempotentHint": true,
15454
+ "openWorldHint": false
15455
+ },
15456
+ "description": "Read-only. For every enabled `/ip service` with address=\"\" (unrestricted), checks whether an input firewall rule already scopes its port to trusted sources — if so it is NOT flagged (avoids the Winbox false positive). Always flags telnet if enabled (cleartext). Flags a 7.15+ reverse-proxy enabled with address=\"\" and warns about multi-WAN reachability. Remediate with harden_ip_service_exposure.",
15457
+ "inputSchema": {
15458
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15459
+ "type": "object",
15460
+ "properties": {},
15461
+ "additionalProperties": false
15462
+ }
15463
+ },
15464
+ {
15465
+ "name": "audit_connection_tracking_helpers",
15466
+ "title": "Audit Connection-Tracking Helpers",
15467
+ "risk": "read",
15468
+ "annotations": {
15469
+ "readOnlyHint": true,
15470
+ "idempotentHint": true,
15471
+ "openWorldHint": false
15472
+ },
15473
+ "description": "Read-only. Flags enabled `/ip firewall service-port` helpers (h323, sip, pptp, irc, rtsp, udplite, dccp, sctp, tftp) with no corresponding active service (e.g. pptp helper on with no pptp-server/client). Most are needs_manual_review (static config can't fully prove non-use); pptp with no server/client is auto-fixable. Remediate with harden_connection_tracking_helpers.",
15474
+ "inputSchema": {
15475
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15476
+ "type": "object",
15477
+ "properties": {},
15478
+ "additionalProperties": false
15479
+ }
15480
+ },
15481
+ {
15482
+ "name": "audit_management_plane_exposure",
15483
+ "title": "Audit Management-Plane Exposure",
15484
+ "risk": "read",
15485
+ "annotations": {
15486
+ "readOnlyHint": true,
15487
+ "idempotentHint": true,
15488
+ "openWorldHint": false
15489
+ },
15490
+ "description": "Read-only. Bundles the smaller management-plane checks: mac-server / mac-winbox allowed-interface-list=all, bandwidth-server unrestricted, romon enabled, neighbor discovery scope, and default-named SNMP communities with open addresses. Most are report-only (the correct LAN interface-list is site-specific); bandwidth-server disable is auto-fixable. Remediate the auto-fixable parts with harden_management_plane_exposure.",
15491
+ "inputSchema": {
15492
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15493
+ "type": "object",
15494
+ "properties": {},
15495
+ "additionalProperties": false
15496
+ }
15497
+ },
15498
+ {
15499
+ "name": "audit_account_hygiene",
15500
+ "title": "Audit Account Hygiene",
15501
+ "risk": "read",
15502
+ "annotations": {
15503
+ "readOnlyHint": true,
15504
+ "idempotentHint": true,
15505
+ "openWorldHint": false
15506
+ },
15507
+ "description": "Read-only, audit-only by design. Checks `/user settings` password policy (minimum-password-length, minimum-categories), flags enabled accounts with obviously-temporary names (test/demo/temp/guest/admin) across /user, /ppp secret and /user-manager, and flags read-tier groups granted broad protocol access. Account deletion and group policy are manual decisions (needs_manual_review). The password-policy settings can be applied with the narrow fix_password_policy tool.",
15508
+ "inputSchema": {
15509
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15510
+ "type": "object",
15511
+ "properties": {},
15512
+ "additionalProperties": false
15513
+ }
15514
+ },
15515
+ {
15516
+ "name": "audit_certificate_hygiene",
15517
+ "title": "Audit Certificate Hygiene (CRL)",
15518
+ "risk": "read",
15519
+ "annotations": {
15520
+ "readOnlyHint": true,
15521
+ "idempotentHint": true,
15522
+ "openWorldHint": false
15523
+ },
15524
+ "description": "Read-only. Adds the CRL-policy check that cert_expiry_audit does not cover: flags `/certificate settings` crl-use=no / crl-download=no when certificate-based services (OpenVPN with client/server cert verification, SSTP with a certificate) are in active use. Remediate with fix_certificate_crl_policy.",
15525
+ "inputSchema": {
15526
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15527
+ "type": "object",
15528
+ "properties": {},
15529
+ "additionalProperties": false
15530
+ }
15531
+ },
15532
+ {
15533
+ "name": "audit_network_segmentation",
15534
+ "title": "Audit Network Segmentation",
15535
+ "risk": "read",
15536
+ "annotations": {
15537
+ "readOnlyHint": true,
15538
+ "idempotentHint": true,
15539
+ "openWorldHint": false
15540
+ },
15541
+ "description": "Read-only, report-only (no fix — this is architecture, not a bug). Flags a single PHYSICAL interface carrying multiple non-overlapping subnets where one is a DHCP client pool and another hosts server-like (NAT-target) addresses — a proxy for 'servers and clients share one L2 domain with no VLAN isolation'. Reports the topology fact as proven and the isolation-absence claim as needs_live_verification, and includes a concrete suggested VLAN plan. Never auto-applied.",
15542
+ "inputSchema": {
15543
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15544
+ "type": "object",
15545
+ "properties": {},
15546
+ "additionalProperties": false
15547
+ }
15548
+ },
15549
+ {
15550
+ "name": "audit_dns_resolver_exposure",
15551
+ "title": "Audit DNS Resolver Exposure",
15552
+ "risk": "read",
15553
+ "annotations": {
15554
+ "readOnlyHint": true,
15555
+ "idempotentHint": true,
15556
+ "openWorldHint": false
15557
+ },
15558
+ "description": "Read-only. Flags `/ip dns allow-remote-requests=yes` when port 53 is not restricted to trusted sources on BOTH TCP and UDP by an input firewall rule (catches the field trap where a rule covers only one transport). Remediate with harden_dns_resolver_exposure.",
15559
+ "inputSchema": {
15560
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15561
+ "type": "object",
15562
+ "properties": {},
15563
+ "additionalProperties": false
15564
+ }
15565
+ },
15566
+ {
15567
+ "name": "add_firewall_default_deny",
15568
+ "title": "Add Firewall Default-Deny",
15569
+ "risk": "dangerous",
15570
+ "annotations": {
15571
+ "destructiveHint": true,
15572
+ "openWorldHint": false
15573
+ },
15574
+ "description": "Applies default-deny remediations by finding_id from a prior audit_firewall_default_deny run: inserts the canonical safe tail (accept established/related/untracked → drop invalid → final unconditional drop), and/or re-enables a specific disabled catch-all drop (a separate finding_id, since re-enabling a deliberately-disabled rule is a different risk than inserting a new tail). DRY RUN unless confirm=true. Snapshots first and runs inside Safe Mode (auto-revert on lockout). Idempotent: a re-run finds nothing to add.",
15575
+ "inputSchema": {
15576
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15577
+ "type": "object",
15578
+ "properties": {
15579
+ "finding_ids": {
15580
+ "minItems": 1,
15581
+ "type": "array",
15582
+ "items": {
15583
+ "type": "string"
15584
+ },
15585
+ "description": "Specific finding_id(s) from a prior audit_firewall_default_deny run to remediate."
15586
+ },
15587
+ "confirm": {
15588
+ "default": false,
15589
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15590
+ "type": "boolean"
15591
+ }
15592
+ },
15593
+ "required": [
15594
+ "finding_ids",
15595
+ "confirm"
15596
+ ],
15597
+ "additionalProperties": false
15598
+ }
15599
+ },
15600
+ {
15601
+ "name": "enforce_address_list_blocking",
15602
+ "title": "Enforce Address-List Blocking",
15603
+ "risk": "dangerous",
15604
+ "annotations": {
15605
+ "destructiveHint": true,
15606
+ "openWorldHint": false
15607
+ },
15608
+ "description": "For each unenforced-list finding_id from a prior audit_address_list_enforcement run, inserts a drop rule matching that list (src- or dst- as appropriate) positioned before the chain's default-deny tail. DRY RUN unless confirm=true. Snapshots first and runs inside Safe Mode.",
15609
+ "inputSchema": {
15610
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15611
+ "type": "object",
15612
+ "properties": {
15613
+ "finding_ids": {
15614
+ "minItems": 1,
15615
+ "type": "array",
15616
+ "items": {
15617
+ "type": "string"
15618
+ },
15619
+ "description": "Specific finding_id(s) from a prior audit_address_list_enforcement run to remediate."
15620
+ },
15621
+ "confirm": {
15622
+ "default": false,
15623
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15624
+ "type": "boolean"
15625
+ }
15626
+ },
15627
+ "required": [
15628
+ "finding_ids",
15629
+ "confirm"
15630
+ ],
15631
+ "additionalProperties": false
15632
+ }
15633
+ },
15634
+ {
15635
+ "name": "harden_kernel_ip_settings",
15636
+ "title": "Harden Kernel IP Settings",
15637
+ "risk": "write-idempotent",
15638
+ "annotations": {
15639
+ "destructiveHint": false,
15640
+ "idempotentHint": true,
15641
+ "openWorldHint": false
15642
+ },
15643
+ "description": "Applies `/ip settings set` (and `/ipv6 settings set`) corrections for the kernel-hardening finding_ids from a prior audit_kernel_ip_hardening run. DRY RUN unless confirm=true. Snapshots first.",
15644
+ "inputSchema": {
15645
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15646
+ "type": "object",
15647
+ "properties": {
15648
+ "finding_ids": {
15649
+ "minItems": 1,
15650
+ "type": "array",
15651
+ "items": {
15652
+ "type": "string"
15653
+ },
15654
+ "description": "Specific finding_id(s) from a prior audit_kernel_ip_hardening run to remediate."
15655
+ },
15656
+ "confirm": {
15657
+ "default": false,
15658
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15659
+ "type": "boolean"
15660
+ }
15661
+ },
15662
+ "required": [
15663
+ "finding_ids",
15664
+ "confirm"
15665
+ ],
15666
+ "additionalProperties": false
15667
+ }
15668
+ },
15669
+ {
15670
+ "name": "bootstrap_ipv6_firewall_baseline",
15671
+ "title": "Bootstrap IPv6 Firewall Baseline",
15672
+ "risk": "dangerous",
15673
+ "annotations": {
15674
+ "destructiveHint": true,
15675
+ "openWorldHint": false
15676
+ },
15677
+ "description": "Applies ONE of the two mutually-exclusive IPv6 baseline finding_ids from a prior audit_ipv6_firewall_baseline run (bootstrap filter, or disable forwarding). Pass exactly one option's finding_id. DRY RUN unless confirm=true. Snapshots first and runs inside Safe Mode.",
15678
+ "inputSchema": {
15679
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15680
+ "type": "object",
15681
+ "properties": {
15682
+ "finding_ids": {
15683
+ "minItems": 1,
15684
+ "type": "array",
15685
+ "items": {
15686
+ "type": "string"
15687
+ },
15688
+ "description": "Specific finding_id(s) from a prior audit_ipv6_firewall_baseline run to remediate."
15689
+ },
15690
+ "confirm": {
15691
+ "default": false,
15692
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15693
+ "type": "boolean"
15694
+ }
15695
+ },
15696
+ "required": [
15697
+ "finding_ids",
15698
+ "confirm"
15699
+ ],
15700
+ "additionalProperties": false
15701
+ }
15702
+ },
15703
+ {
15704
+ "name": "harden_ssh_service",
15705
+ "title": "Harden SSH Service",
15706
+ "risk": "dangerous",
15707
+ "annotations": {
15708
+ "destructiveHint": true,
15709
+ "openWorldHint": false
15710
+ },
15711
+ "description": "Applies the auto-fixable SSH finding_ids from a prior audit_ssh_hardening run (currently strong-crypto=yes). Host-key regeneration is NEVER auto-applied (report-only). DRY RUN unless confirm=true. Snapshots first and runs inside Safe Mode.",
15712
+ "inputSchema": {
15713
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15714
+ "type": "object",
15715
+ "properties": {
15716
+ "finding_ids": {
15717
+ "minItems": 1,
15718
+ "type": "array",
15719
+ "items": {
15720
+ "type": "string"
15721
+ },
15722
+ "description": "Specific finding_id(s) from a prior audit_ssh_hardening run to remediate."
15723
+ },
15724
+ "confirm": {
15725
+ "default": false,
15726
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15727
+ "type": "boolean"
15728
+ }
15729
+ },
15730
+ "required": [
15731
+ "finding_ids",
15732
+ "confirm"
15733
+ ],
15734
+ "additionalProperties": false
15735
+ }
15736
+ },
15737
+ {
15738
+ "name": "harden_ip_service_exposure",
15739
+ "title": "Harden IP Service Exposure",
15740
+ "risk": "dangerous",
15741
+ "annotations": {
15742
+ "destructiveHint": true,
15743
+ "openWorldHint": false
15744
+ },
15745
+ "description": "For the service-exposure finding_ids from a prior audit_ip_service_exposure run, restricts the service address or disables it (telnet/reverse-proxy default to disable). DRY RUN unless confirm=true. Snapshots first and runs inside Safe Mode.",
15746
+ "inputSchema": {
15747
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15748
+ "type": "object",
15749
+ "properties": {
15750
+ "finding_ids": {
15751
+ "minItems": 1,
15752
+ "type": "array",
15753
+ "items": {
15754
+ "type": "string"
15755
+ },
15756
+ "description": "Specific finding_id(s) from a prior audit_ip_service_exposure run to remediate."
15757
+ },
15758
+ "confirm": {
15759
+ "default": false,
15760
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15761
+ "type": "boolean"
15762
+ }
15763
+ },
15764
+ "required": [
15765
+ "finding_ids",
15766
+ "confirm"
15767
+ ],
15768
+ "additionalProperties": false
15769
+ }
15770
+ },
15771
+ {
15772
+ "name": "harden_connection_tracking_helpers",
15773
+ "title": "Harden Connection-Tracking Helpers",
15774
+ "risk": "write-idempotent",
15775
+ "annotations": {
15776
+ "destructiveHint": false,
15777
+ "idempotentHint": true,
15778
+ "openWorldHint": false
15779
+ },
15780
+ "description": "Disables the auto-fixable helper finding_ids from a prior audit_connection_tracking_helpers run, one at a time. DRY RUN unless confirm=true. Snapshots first.",
15781
+ "inputSchema": {
15782
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15783
+ "type": "object",
15784
+ "properties": {
15785
+ "finding_ids": {
15786
+ "minItems": 1,
15787
+ "type": "array",
15788
+ "items": {
15789
+ "type": "string"
15790
+ },
15791
+ "description": "Specific finding_id(s) from a prior audit_connection_tracking_helpers run to remediate."
15792
+ },
15793
+ "confirm": {
15794
+ "default": false,
15795
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15796
+ "type": "boolean"
15797
+ }
15798
+ },
15799
+ "required": [
15800
+ "finding_ids",
15801
+ "confirm"
15802
+ ],
15803
+ "additionalProperties": false
15804
+ }
15805
+ },
15806
+ {
15807
+ "name": "harden_management_plane_exposure",
15808
+ "title": "Harden Management-Plane Exposure",
15809
+ "risk": "write-idempotent",
15810
+ "annotations": {
15811
+ "destructiveHint": false,
15812
+ "idempotentHint": true,
15813
+ "openWorldHint": false
15814
+ },
15815
+ "description": "Applies the auto-fixable management-plane finding_ids from a prior audit run (e.g. disabling an unused bandwidth-server). Site-specific restrictions remain report-only. DRY RUN unless confirm=true. Snapshots first.",
15816
+ "inputSchema": {
15817
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15818
+ "type": "object",
15819
+ "properties": {
15820
+ "finding_ids": {
15821
+ "minItems": 1,
15822
+ "type": "array",
15823
+ "items": {
15824
+ "type": "string"
15825
+ },
15826
+ "description": "Specific finding_id(s) from a prior audit_management_plane_exposure run to remediate."
15827
+ },
15828
+ "confirm": {
15829
+ "default": false,
15830
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15831
+ "type": "boolean"
15832
+ }
15833
+ },
15834
+ "required": [
15835
+ "finding_ids",
15836
+ "confirm"
15837
+ ],
15838
+ "additionalProperties": false
15839
+ }
15840
+ },
15841
+ {
15842
+ "name": "fix_password_policy",
15843
+ "title": "Fix Password Policy",
15844
+ "risk": "write-idempotent",
15845
+ "annotations": {
15846
+ "destructiveHint": false,
15847
+ "idempotentHint": true,
15848
+ "openWorldHint": false
15849
+ },
15850
+ "description": "Narrow companion to audit_account_hygiene: applies ONLY the `/user settings` password-policy finding_ids (minimum-password-length, minimum-categories). Touches nothing else — account deletion and group policy are never automated. DRY RUN unless confirm=true. Snapshots first.",
15851
+ "inputSchema": {
15852
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15853
+ "type": "object",
15854
+ "properties": {
15855
+ "finding_ids": {
15856
+ "minItems": 1,
15857
+ "type": "array",
15858
+ "items": {
15859
+ "type": "string"
15860
+ },
15861
+ "description": "Specific finding_id(s) from a prior audit_account_hygiene run to remediate."
15862
+ },
15863
+ "confirm": {
15864
+ "default": false,
15865
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15866
+ "type": "boolean"
15867
+ }
15868
+ },
15869
+ "required": [
15870
+ "finding_ids",
15871
+ "confirm"
15872
+ ],
15873
+ "additionalProperties": false
15874
+ }
15875
+ },
15876
+ {
15877
+ "name": "fix_certificate_crl_policy",
15878
+ "title": "Fix Certificate CRL Policy",
15879
+ "risk": "write-idempotent",
15880
+ "annotations": {
15881
+ "destructiveHint": false,
15882
+ "idempotentHint": true,
15883
+ "openWorldHint": false
15884
+ },
15885
+ "description": "Sets crl-use=yes / crl-download=yes for the certificate finding_id from a prior audit_certificate_hygiene run. Note: CRL download needs outbound reachability to the CRL distribution point (may need a firewall allowance). DRY RUN unless confirm=true. Snapshots first.",
15886
+ "inputSchema": {
15887
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15888
+ "type": "object",
15889
+ "properties": {
15890
+ "finding_ids": {
15891
+ "minItems": 1,
15892
+ "type": "array",
15893
+ "items": {
15894
+ "type": "string"
15895
+ },
15896
+ "description": "Specific finding_id(s) from a prior audit_certificate_hygiene run to remediate."
15897
+ },
15898
+ "confirm": {
15899
+ "default": false,
15900
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15901
+ "type": "boolean"
15902
+ }
15903
+ },
15904
+ "required": [
15905
+ "finding_ids",
15906
+ "confirm"
15907
+ ],
15908
+ "additionalProperties": false
15909
+ }
15910
+ },
15911
+ {
15912
+ "name": "harden_dns_resolver_exposure",
15913
+ "title": "Harden DNS Resolver Exposure",
15914
+ "risk": "dangerous",
15915
+ "annotations": {
15916
+ "destructiveHint": true,
15917
+ "openWorldHint": false
15918
+ },
15919
+ "description": "For the DNS finding_id from a prior audit_dns_resolver_exposure run, either restricts input port 53 (TCP+UDP) or disables allow-remote-requests (when the resolver only serves the router's own DHCP clients). DRY RUN unless confirm=true. Snapshots first and runs inside Safe Mode.",
15920
+ "inputSchema": {
15921
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15922
+ "type": "object",
15923
+ "properties": {
15924
+ "finding_ids": {
15925
+ "minItems": 1,
15926
+ "type": "array",
15927
+ "items": {
15928
+ "type": "string"
15929
+ },
15930
+ "description": "Specific finding_id(s) from a prior audit_dns_resolver_exposure run to remediate."
15931
+ },
15932
+ "confirm": {
15933
+ "default": false,
15934
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
15935
+ "type": "boolean"
15936
+ }
15937
+ },
15938
+ "required": [
15939
+ "finding_ids",
15940
+ "confirm"
15941
+ ],
15942
+ "additionalProperties": false
15943
+ }
15944
+ },
15945
+ {
15946
+ "name": "run_security_hardening_audit",
15947
+ "title": "Run Full Security Hardening Audit",
15948
+ "risk": "read",
15949
+ "annotations": {
15950
+ "readOnlyHint": true,
15951
+ "idempotentHint": true,
15952
+ "openWorldHint": false
15953
+ },
15954
+ "description": "Runs EVERY security-hardening category against the device in one pass (firewall default-deny, address-list enforcement, kernel IP hardening, IPv6 baseline, SSH, IP service exposure, connection-tracking helpers, management-plane exposure, account hygiene, certificate CRL policy, network segmentation, DNS resolver exposure) and returns a single severity-ranked report. Every finding carries a stable finding_id, category, severity, confidence (proven vs needs_live_verification) and — where safe — an automated fix. Pure read, no confirm needed. Feed the finding_ids you choose into apply_security_hardening_fixes. Narrow to one category with the audit_* tools; for the broader firewall analysis use firewall_audit, and for the scored compliance grade use run_compliance_audit.",
15955
+ "inputSchema": {
15956
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15957
+ "type": "object",
15958
+ "properties": {
15959
+ "categories": {
15960
+ "description": "Narrow to specific categories. Available: firewall_default_deny, address_list_enforcement, kernel_ip_hardening, ipv6_firewall_baseline, ssh_hardening, ip_service_exposure, connection_tracking_helpers, management_plane_exposure, account_hygiene, certificate_hygiene, network_segmentation, dns_resolver_exposure. Omit for all.",
15961
+ "type": "array",
15962
+ "items": {
15963
+ "type": "string",
15964
+ "enum": [
15965
+ "firewall_default_deny",
15966
+ "address_list_enforcement",
15967
+ "kernel_ip_hardening",
15968
+ "ipv6_firewall_baseline",
15969
+ "ssh_hardening",
15970
+ "ip_service_exposure",
15971
+ "connection_tracking_helpers",
15972
+ "management_plane_exposure",
15973
+ "account_hygiene",
15974
+ "certificate_hygiene",
15975
+ "network_segmentation",
15976
+ "dns_resolver_exposure"
15977
+ ]
15978
+ }
15979
+ }
15980
+ },
15981
+ "additionalProperties": false
15982
+ }
15983
+ },
15984
+ {
15985
+ "name": "apply_security_hardening_fixes",
15986
+ "title": "Apply Security Hardening Fixes",
15987
+ "risk": "dangerous",
15988
+ "annotations": {
15989
+ "destructiveHint": true,
15990
+ "openWorldHint": false
15991
+ },
15992
+ "description": "Applies specific finding_ids from a prior run_security_hardening_audit, dispatching each to its category's remediation in a SAFE ORDER (firewall default-deny and address-list enforcement before service-exposure before helper/hygiene), all wrapped in ONE Safe-Mode session with ONE pre-change snapshot. Returns a per-finding success/failure result plus the snapshot id (roll back with diff_config_snapshots). DRY RUN unless confirm=true. NEVER accepts a blanket 'fix everything' flag — you must pass explicit finding_ids sourced from an audit.",
15993
+ "inputSchema": {
15994
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
15995
+ "type": "object",
15996
+ "properties": {
15997
+ "finding_ids": {
15998
+ "minItems": 1,
15999
+ "type": "array",
16000
+ "items": {
16001
+ "type": "string"
16002
+ },
16003
+ "description": "Explicit finding_id(s) from a prior run_security_hardening_audit. No blanket apply."
16004
+ },
16005
+ "confirm": {
16006
+ "default": false,
16007
+ "description": "Must be true to write. false (default) returns a dry-run preview and changes nothing.",
16008
+ "type": "boolean"
16009
+ }
16010
+ },
16011
+ "required": [
16012
+ "finding_ids",
16013
+ "confirm"
16014
+ ],
16015
+ "additionalProperties": false
16016
+ }
16017
+ },
15362
16018
  {
15363
16019
  "name": "setup_port_knock",
15364
16020
  "title": "Set Up Port-Knock Guardian",