@usex/mikrotik-mcp 4.15.0 → 4.17.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usex/mikrotik-mcp",
3
- "version": "4.15.0",
3
+ "version": "4.17.0",
4
4
  "description": "MCP server for MikroTik RouterOS — 780+ tools over SSH for firewall, NAT, routing, DHCP, DNS, WireGuard, wireless, QoS and more.",
5
5
  "keywords": [
6
6
  "ai",
package/schemas/README.md CHANGED
@@ -7,7 +7,7 @@ edit by hand — regenerate instead.
7
7
  | File | Contents |
8
8
  |------|----------|
9
9
  | `config.schema.json` | The runtime configuration object (env vars / CLI flags). |
10
- | `tool-catalog.json` | Every one of the 821 tools: `name`, `risk`, `title`, `description`, and input JSON Schema. |
10
+ | `tool-catalog.json` | Every one of the 833 tools: `name`, `risk`, `title`, `description`, and input JSON Schema. |
11
11
  | `tools/<name>.json` | The input JSON Schema for a single tool. |
12
12
 
13
13
  `risk` is derived from the MCP tool annotations:
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "version": "4.15.0",
3
+ "version": "4.17.0",
4
4
  "generated": "by scripts/gen-schemas.ts — do not edit by hand",
5
- "toolCount": 821,
5
+ "toolCount": 833,
6
6
  "tools": [
7
7
  {
8
8
  "name": "find_tools",
@@ -2011,6 +2011,325 @@
2011
2011
  "additionalProperties": false
2012
2012
  }
2013
2013
  },
2014
+ {
2015
+ "name": "run_capsman_audit",
2016
+ "title": "Run CAPsMAN Audit",
2017
+ "risk": "read",
2018
+ "annotations": {
2019
+ "readOnlyHint": true,
2020
+ "idempotentHint": true,
2021
+ "openWorldHint": false
2022
+ },
2023
+ "description": "Read-only. Audits the device's CAPsMAN Wi-Fi fabric across coverage/co-channel, weak-signal clients, resource-aware load, 802.11r (FT) roaming, and HA (backup-manager) redundancy — one severity-ranked report with per-finding id, severity and confidence (proven vs needs_live_verification; steering/balancing are advisory since RouterOS has no force-move). Supports both the v7 `/interface wifi` CAPsMAN and legacy `/caps-man`. Narrow with `categories`. For a single dimension use audit_capsman_coverage / report_weak_signal_clients / audit_capsman_load / audit_capsman_ft / audit_capsman_ha.",
2024
+ "inputSchema": {
2025
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2026
+ "type": "object",
2027
+ "properties": {
2028
+ "categories": {
2029
+ "description": "Narrow to specific categories. Omit to audit all five.",
2030
+ "type": "array",
2031
+ "items": {
2032
+ "type": "string",
2033
+ "enum": [
2034
+ "coverage",
2035
+ "weak_signal",
2036
+ "load",
2037
+ "ft",
2038
+ "ha"
2039
+ ]
2040
+ }
2041
+ },
2042
+ "weak_dbm": {
2043
+ "description": "Weak-signal threshold in dBm (negative; default -70).",
2044
+ "type": "integer",
2045
+ "minimum": -9007199254740991,
2046
+ "maximum": -1
2047
+ }
2048
+ },
2049
+ "additionalProperties": false
2050
+ }
2051
+ },
2052
+ {
2053
+ "name": "audit_capsman_coverage",
2054
+ "title": "Audit CAPsMAN Coverage & Channels",
2055
+ "risk": "read",
2056
+ "annotations": {
2057
+ "readOnlyHint": true,
2058
+ "idempotentHint": true,
2059
+ "openWorldHint": false
2060
+ },
2061
+ "description": "Read-only. Inventories every managed CAP radio (band, manual channel/width, tx-power, client count), detects CO-CHANNEL overlap between physically-adjacent radios (adjacency inferred from clients seen on more than one radio), and proposes a non-overlapping manual channel plan (2.4 GHz → 1/6/11; 5 GHz DFS-aware). Preview only — apply is a later, confirm-gated tool.",
2062
+ "inputSchema": {
2063
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2064
+ "type": "object",
2065
+ "properties": {},
2066
+ "additionalProperties": false
2067
+ }
2068
+ },
2069
+ {
2070
+ "name": "report_weak_signal_clients",
2071
+ "title": "Report Weak-Signal Clients",
2072
+ "risk": "read",
2073
+ "annotations": {
2074
+ "readOnlyHint": true,
2075
+ "idempotentHint": true,
2076
+ "openWorldHint": false
2077
+ },
2078
+ "description": "Read-only. Merges every CAP's registration-table and lists clients below the weak-signal threshold (default -70 dBm), each with its current AP, signal, band, and — when a neighbor radio hears it meaningfully stronger — the recommended AP to steer toward and the dB gain. Steering itself is a later, confirm-gated tool (soft 802.11k/v or hard signal-range).",
2079
+ "inputSchema": {
2080
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2081
+ "type": "object",
2082
+ "properties": {
2083
+ "weak_dbm": {
2084
+ "description": "Weak-signal threshold in dBm (negative; default -70).",
2085
+ "type": "integer",
2086
+ "minimum": -9007199254740991,
2087
+ "maximum": -1
2088
+ }
2089
+ },
2090
+ "additionalProperties": false
2091
+ }
2092
+ },
2093
+ {
2094
+ "name": "audit_capsman_load",
2095
+ "title": "Audit CAPsMAN Load & Resources",
2096
+ "risk": "read",
2097
+ "annotations": {
2098
+ "readOnlyHint": true,
2099
+ "idempotentHint": true,
2100
+ "openWorldHint": false
2101
+ },
2102
+ "description": "Read-only. Reports per-radio client load and the owning CAP's CPU/mem, flags overloaded or resource-constrained radios that have an adjacent radio with spare capacity, and recommends a resource-aware rebalance (offload toward the idle neighbor; steer dual-band clients to 5 GHz). Advisory — apply is a later, confirm-gated tool.",
2103
+ "inputSchema": {
2104
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2105
+ "type": "object",
2106
+ "properties": {},
2107
+ "additionalProperties": false
2108
+ }
2109
+ },
2110
+ {
2111
+ "name": "audit_capsman_ft",
2112
+ "title": "Audit CAPsMAN Fast-Roaming (802.11r)",
2113
+ "risk": "read",
2114
+ "annotations": {
2115
+ "readOnlyHint": true,
2116
+ "idempotentHint": true,
2117
+ "openWorldHint": false
2118
+ },
2119
+ "description": "Read-only. Checks 802.11r fast-transition per SSID: is `ft` enabled, is 802.11k/v steering on, and is the `ft-mobility-domain` CONSISTENT across all CAPs (fast roaming only works within one domain). Reports roam-readiness. Enabling FT is a later, confirm-gated tool.",
2120
+ "inputSchema": {
2121
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2122
+ "type": "object",
2123
+ "properties": {},
2124
+ "additionalProperties": false
2125
+ }
2126
+ },
2127
+ {
2128
+ "name": "audit_capsman_ha",
2129
+ "title": "Audit CAPsMAN High-Availability",
2130
+ "risk": "read",
2131
+ "annotations": {
2132
+ "readOnlyHint": true,
2133
+ "idempotentHint": true,
2134
+ "openWorldHint": false
2135
+ },
2136
+ "description": "Read-only. Checks CAPsMAN redundancy: is there a backup manager, are the CAPs pointed at both managers, and is require-peer-certificate on? Flags single points of failure (one manager = the whole building's Wi-Fi drops if it reboots). Setting up HA is a later, confirm-gated tool.",
2137
+ "inputSchema": {
2138
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2139
+ "type": "object",
2140
+ "properties": {},
2141
+ "additionalProperties": false
2142
+ }
2143
+ },
2144
+ {
2145
+ "name": "steer_client",
2146
+ "title": "Steer a Weak-Signal Client",
2147
+ "risk": "dangerous",
2148
+ "annotations": {
2149
+ "destructiveHint": true,
2150
+ "openWorldHint": false
2151
+ },
2152
+ "description": "Steers ONE weak client toward a better AP. `mode=hard` installs an access-list signal-range REJECT on the client's current radio so it re-associates on a neighbor it hears stronger (can briefly disconnect it). `mode=soft` is 802.11k/v-only and installs no rule (advisory — enable steering via enable_capsman_ft). ADVISORY: RouterOS has no force-move, so the client ultimately decides. DRY RUN unless confirm=true. Snapshots first and applies inside Safe Mode (auto-revert on lockout). Idempotent — a re-run for the same MAC adds nothing.",
2153
+ "inputSchema": {
2154
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2155
+ "type": "object",
2156
+ "properties": {
2157
+ "mac": {
2158
+ "type": "string",
2159
+ "minLength": 1,
2160
+ "description": "Client MAC address to steer."
2161
+ },
2162
+ "mode": {
2163
+ "default": "hard",
2164
+ "description": "hard = signal-range reject; soft = k/v only (no write).",
2165
+ "type": "string",
2166
+ "enum": [
2167
+ "soft",
2168
+ "hard"
2169
+ ]
2170
+ },
2171
+ "reject_above_dbm": {
2172
+ "description": "dBm ceiling of the reject band for hard mode (default -70).",
2173
+ "type": "integer",
2174
+ "minimum": -9007199254740991,
2175
+ "maximum": -1
2176
+ },
2177
+ "confirm": {
2178
+ "description": "Must be true to write; omit for a dry-run preview.",
2179
+ "type": "boolean",
2180
+ "const": true
2181
+ }
2182
+ },
2183
+ "required": [
2184
+ "mac",
2185
+ "mode"
2186
+ ],
2187
+ "additionalProperties": false
2188
+ }
2189
+ },
2190
+ {
2191
+ "name": "apply_capsman_load_balance",
2192
+ "title": "Apply CAPsMAN Load Balance",
2193
+ "risk": "dangerous",
2194
+ "annotations": {
2195
+ "destructiveHint": true,
2196
+ "openWorldHint": false
2197
+ },
2198
+ "description": "Applies a resource-aware rebalance: for each overloaded / CPU-constrained radio that has an adjacent radio with spare capacity, installs a connect-priority nudge so NEW clients prefer the idle neighbor (gentle — does not disconnect existing clients). ADVISORY. DRY RUN unless confirm=true. Snapshots first, applies inside Safe Mode. Idempotent. Preview the plan with audit_capsman_load first.",
2199
+ "inputSchema": {
2200
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2201
+ "type": "object",
2202
+ "properties": {
2203
+ "confirm": {
2204
+ "description": "Must be true to write; omit for a dry-run preview.",
2205
+ "type": "boolean",
2206
+ "const": true
2207
+ }
2208
+ },
2209
+ "additionalProperties": false
2210
+ }
2211
+ },
2212
+ {
2213
+ "name": "apply_capsman_channel_plan",
2214
+ "title": "Apply CAPsMAN Channel Plan",
2215
+ "risk": "dangerous",
2216
+ "annotations": {
2217
+ "destructiveHint": true,
2218
+ "openWorldHint": false
2219
+ },
2220
+ "description": "Applies the proposed non-overlapping manual channel plan (from audit_capsman_coverage) to the managed radios by setting each radio's frequency — resolving co-channel conflicts. Optionally scope to specific radios with `radio_ids`. DRY RUN unless confirm=true. Snapshots first, applies inside Safe Mode; idempotent (radios already on the target channel are skipped). v7 `/interface wifi` only — on legacy `/caps-man` the channel lives in named channel objects, so edit those manually (the audit still shows the plan).",
2221
+ "inputSchema": {
2222
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2223
+ "type": "object",
2224
+ "properties": {
2225
+ "radio_ids": {
2226
+ "description": "Only re-channel these radio ids. Omit to apply the whole plan.",
2227
+ "type": "array",
2228
+ "items": {
2229
+ "type": "string"
2230
+ }
2231
+ },
2232
+ "confirm": {
2233
+ "description": "Must be true to write; omit for a dry-run preview.",
2234
+ "type": "boolean",
2235
+ "const": true
2236
+ }
2237
+ },
2238
+ "additionalProperties": false
2239
+ }
2240
+ },
2241
+ {
2242
+ "name": "enable_capsman_ft",
2243
+ "title": "Enable CAPsMAN Fast-Roaming (802.11r)",
2244
+ "risk": "dangerous",
2245
+ "annotations": {
2246
+ "destructiveHint": true,
2247
+ "openWorldHint": false
2248
+ },
2249
+ "description": "Enables 802.11r fast-transition on the CAPsMAN security configs, converging every one on a SINGLE shared `ft-mobility-domain` (so roaming between floors is seamless and consistent) — fixing the ft-off and ft-domain-mismatch findings. Scope with `config_names`; set the domain with `mobility_domain` (default: the existing domain, else 0001). Note: enabling FT changes the SSID's roaming behaviour and briefly re-keys clients. DRY RUN unless confirm=true. Snapshots first, applies inside Safe Mode; idempotent. 802.11k/v steering is configured separately.",
2250
+ "inputSchema": {
2251
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2252
+ "type": "object",
2253
+ "properties": {
2254
+ "config_names": {
2255
+ "description": "Only enable FT on these security configs. Omit for all.",
2256
+ "type": "array",
2257
+ "items": {
2258
+ "type": "string"
2259
+ }
2260
+ },
2261
+ "mobility_domain": {
2262
+ "description": "Shared ft-mobility-domain to converge on. Omit to adopt the existing one (or 0001).",
2263
+ "type": "string"
2264
+ },
2265
+ "confirm": {
2266
+ "description": "Must be true to write; omit for a dry-run preview.",
2267
+ "type": "boolean",
2268
+ "const": true
2269
+ }
2270
+ },
2271
+ "additionalProperties": false
2272
+ }
2273
+ },
2274
+ {
2275
+ "name": "setup_capsman_ha",
2276
+ "title": "Set Up CAPsMAN High-Availability",
2277
+ "risk": "dangerous",
2278
+ "annotations": {
2279
+ "destructiveHint": true,
2280
+ "openWorldHint": false
2281
+ },
2282
+ "description": "Hardens CAPsMAN redundancy. Applies what THIS manager can safely do — enable require-peer-certificate (so a rogue manager can't adopt your CAPs) — and returns the exact manual, multi-device steps to finish HA (stand up a second manager with the same certificate, point every CAP at both managers). Standing up the backup + editing each CAP is inherently multi-device, so it is NOT auto-applied. HIGHEST blast radius — DRY RUN unless confirm=true; snapshots first, applies inside Safe Mode. Requires a `reason`.",
2283
+ "inputSchema": {
2284
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2285
+ "type": "object",
2286
+ "properties": {
2287
+ "backup_manager_address": {
2288
+ "description": "Address of the (planned) backup manager, woven into the guidance.",
2289
+ "type": "string"
2290
+ },
2291
+ "confirm": {
2292
+ "description": "Must be true to write; omit for a dry-run preview.",
2293
+ "type": "boolean",
2294
+ "const": true
2295
+ }
2296
+ },
2297
+ "additionalProperties": false
2298
+ }
2299
+ },
2300
+ {
2301
+ "name": "apply_capsman_fixes",
2302
+ "title": "Apply CAPsMAN Fixes",
2303
+ "risk": "dangerous",
2304
+ "annotations": {
2305
+ "destructiveHint": true,
2306
+ "openWorldHint": false
2307
+ },
2308
+ "description": "Applies specific finding_ids from a prior run_capsman_audit, dispatching each to its remediation in a SAFE order (coverage/channel-plan → load-balance → steer → FT → HA), all wrapped in ONE snapshot + ONE Safe-Mode session. Returns the applied commands + snapshot id. DRY RUN unless confirm=true. NEVER a blanket 'fix everything' — pass explicit finding_ids from an audit. Steering/balancing remain advisory; HA require-cert is applied but the multi-device HA steps are not.",
2309
+ "inputSchema": {
2310
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2311
+ "type": "object",
2312
+ "properties": {
2313
+ "finding_ids": {
2314
+ "minItems": 1,
2315
+ "type": "array",
2316
+ "items": {
2317
+ "type": "string"
2318
+ },
2319
+ "description": "Explicit finding_id(s) from a prior run_capsman_audit. No blanket apply."
2320
+ },
2321
+ "confirm": {
2322
+ "description": "Must be true to write; omit for a dry-run preview.",
2323
+ "type": "boolean",
2324
+ "const": true
2325
+ }
2326
+ },
2327
+ "required": [
2328
+ "finding_ids"
2329
+ ],
2330
+ "additionalProperties": false
2331
+ }
2332
+ },
2014
2333
  {
2015
2334
  "name": "get_poe_monitor",
2016
2335
  "title": "Read PoE Interface Live Metrics",
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "apply_capsman_channel_plan",
4
+ "type": "object",
5
+ "properties": {
6
+ "radio_ids": {
7
+ "description": "Only re-channel these radio ids. Omit to apply the whole plan.",
8
+ "type": "array",
9
+ "items": {
10
+ "type": "string"
11
+ }
12
+ },
13
+ "confirm": {
14
+ "description": "Must be true to write; omit for a dry-run preview.",
15
+ "type": "boolean",
16
+ "const": true
17
+ }
18
+ },
19
+ "additionalProperties": false
20
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "apply_capsman_fixes",
4
+ "type": "object",
5
+ "properties": {
6
+ "finding_ids": {
7
+ "minItems": 1,
8
+ "type": "array",
9
+ "items": {
10
+ "type": "string"
11
+ },
12
+ "description": "Explicit finding_id(s) from a prior run_capsman_audit. No blanket apply."
13
+ },
14
+ "confirm": {
15
+ "description": "Must be true to write; omit for a dry-run preview.",
16
+ "type": "boolean",
17
+ "const": true
18
+ }
19
+ },
20
+ "required": [
21
+ "finding_ids"
22
+ ],
23
+ "additionalProperties": false
24
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "apply_capsman_load_balance",
4
+ "type": "object",
5
+ "properties": {
6
+ "confirm": {
7
+ "description": "Must be true to write; omit for a dry-run preview.",
8
+ "type": "boolean",
9
+ "const": true
10
+ }
11
+ },
12
+ "additionalProperties": false
13
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "audit_capsman_coverage",
4
+ "type": "object",
5
+ "properties": {},
6
+ "additionalProperties": false
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "audit_capsman_ft",
4
+ "type": "object",
5
+ "properties": {},
6
+ "additionalProperties": false
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "audit_capsman_ha",
4
+ "type": "object",
5
+ "properties": {},
6
+ "additionalProperties": false
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "audit_capsman_load",
4
+ "type": "object",
5
+ "properties": {},
6
+ "additionalProperties": false
7
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "enable_capsman_ft",
4
+ "type": "object",
5
+ "properties": {
6
+ "config_names": {
7
+ "description": "Only enable FT on these security configs. Omit for all.",
8
+ "type": "array",
9
+ "items": {
10
+ "type": "string"
11
+ }
12
+ },
13
+ "mobility_domain": {
14
+ "description": "Shared ft-mobility-domain to converge on. Omit to adopt the existing one (or 0001).",
15
+ "type": "string"
16
+ },
17
+ "confirm": {
18
+ "description": "Must be true to write; omit for a dry-run preview.",
19
+ "type": "boolean",
20
+ "const": true
21
+ }
22
+ },
23
+ "additionalProperties": false
24
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "report_weak_signal_clients",
4
+ "type": "object",
5
+ "properties": {
6
+ "weak_dbm": {
7
+ "description": "Weak-signal threshold in dBm (negative; default -70).",
8
+ "type": "integer",
9
+ "minimum": -9007199254740991,
10
+ "maximum": -1
11
+ }
12
+ },
13
+ "additionalProperties": false
14
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "run_capsman_audit",
4
+ "type": "object",
5
+ "properties": {
6
+ "categories": {
7
+ "description": "Narrow to specific categories. Omit to audit all five.",
8
+ "type": "array",
9
+ "items": {
10
+ "type": "string",
11
+ "enum": [
12
+ "coverage",
13
+ "weak_signal",
14
+ "load",
15
+ "ft",
16
+ "ha"
17
+ ]
18
+ }
19
+ },
20
+ "weak_dbm": {
21
+ "description": "Weak-signal threshold in dBm (negative; default -70).",
22
+ "type": "integer",
23
+ "minimum": -9007199254740991,
24
+ "maximum": -1
25
+ }
26
+ },
27
+ "additionalProperties": false
28
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "setup_capsman_ha",
4
+ "type": "object",
5
+ "properties": {
6
+ "backup_manager_address": {
7
+ "description": "Address of the (planned) backup manager, woven into the guidance.",
8
+ "type": "string"
9
+ },
10
+ "confirm": {
11
+ "description": "Must be true to write; omit for a dry-run preview.",
12
+ "type": "boolean",
13
+ "const": true
14
+ }
15
+ },
16
+ "additionalProperties": false
17
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "steer_client",
4
+ "type": "object",
5
+ "properties": {
6
+ "mac": {
7
+ "type": "string",
8
+ "minLength": 1,
9
+ "description": "Client MAC address to steer."
10
+ },
11
+ "mode": {
12
+ "default": "hard",
13
+ "description": "hard = signal-range reject; soft = k/v only (no write).",
14
+ "type": "string",
15
+ "enum": [
16
+ "soft",
17
+ "hard"
18
+ ]
19
+ },
20
+ "reject_above_dbm": {
21
+ "description": "dBm ceiling of the reject band for hard mode (default -70).",
22
+ "type": "integer",
23
+ "minimum": -9007199254740991,
24
+ "maximum": -1
25
+ },
26
+ "confirm": {
27
+ "description": "Must be true to write; omit for a dry-run preview.",
28
+ "type": "boolean",
29
+ "const": true
30
+ }
31
+ },
32
+ "required": [
33
+ "mac",
34
+ "mode"
35
+ ],
36
+ "additionalProperties": false
37
+ }