@usex/mikrotik-mcp 3.27.0 → 3.29.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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "version": "3.26.0",
3
+ "version": "3.28.0",
4
4
  "generated": "by scripts/gen-schemas.ts — do not edit by hand",
5
- "toolCount": 738,
5
+ "toolCount": 758,
6
6
  "tools": [
7
7
  {
8
8
  "name": "list_interfaces",
@@ -25552,22 +25552,24 @@
25552
25552
  },
25553
25553
  {
25554
25554
  "name": "upload_file",
25555
- "title": "Upload File to Device (Simulated)",
25555
+ "title": "Upload File to Device",
25556
25556
  "risk": "write",
25557
25557
  "annotations": {
25558
25558
  "destructiveHint": false,
25559
25559
  "openWorldHint": false
25560
25560
  },
25561
- "description": "Accepts a base64-encoded file intended for the device filesystem. NOTE: the current handler only validates the base64 encoding and returns a simulated success it does not transfer bytes to the device over SSH. Once a `.backup` file is present on the device apply it with `restore_backup`; for `.rsc` configuration scripts use `import_configuration`.",
25561
+ "description": "Transfer a file to the device filesystem over SFTP (the file subsystem RouterOS exposes on its SSH server) — this actually pushes the bytes, then verifies the file appears in `/file`. Use it to put a file on the router before another tool can use it: a `.rsc` config script (then apply with `import_configuration`), a `.backup` file (then `restore_backup`), or a certificate/key (then `import_certificate`). `filename` is the DESTINATION path on the device root by default (e.g. `config.rsc`), or an external-disk path (e.g. `disk1/cert.pem`). `content_base64` is the file's raw bytes, base64-encoded (binary-safe — works for `.backup`/cert files, not just text). Overwrites any existing file of the same name. NOT available on MAC-Telnet devices (Layer-2 has no file transfer) — there, have the router pull the file itself with `/tool fetch` from a reachable URL.",
25562
25562
  "inputSchema": {
25563
25563
  "$schema": "https://json-schema.org/draft/2020-12/schema",
25564
25564
  "type": "object",
25565
25565
  "properties": {
25566
25566
  "filename": {
25567
- "type": "string"
25567
+ "type": "string",
25568
+ "description": "Destination path on the device, e.g. 'config.rsc' or 'disk1/cert.pem'"
25568
25569
  },
25569
25570
  "content_base64": {
25570
- "type": "string"
25571
+ "type": "string",
25572
+ "description": "File bytes, base64-encoded (binary-safe)"
25571
25573
  }
25572
25574
  },
25573
25575
  "required": ["filename", "content_base64"],
@@ -26152,11 +26154,30 @@
26152
26154
  "idempotentHint": true,
26153
26155
  "openWorldHint": false
26154
26156
  },
26155
- "description": "List all storage disks (`/disk print`) attached to the MikroTik device — USB drives, NVMe, and internal flash. Use this to discover available storage and obtain disk names before calling get_disk or format_disk. Returns each disk's name, type, size, and status. For per-disk detail use get_disk.",
26157
+ "description": "List all storage devices (`/disk print`) attached to the MikroTik — NVMe, SATA/SSD, USB drives, eMMC/internal flash, their partitions, plus any RAID/rsync/RAM virtual disks. Use this to discover storage and obtain each disk's `slot` (the identifier needed by get_disk, format_disk, set_disk, share_disk, eject_disk and remove_disk). Returns slot, type, model/serial, interface, size, free space, filesystem, label and mount point. Optionally filter by partial `slot_filter`, `type_filter` (e.g. raid, partition, rsync) or `interface_filter` (e.g. nvme, usb, sata). Set `detail=true` for the full per-disk property block. For one disk use get_disk.",
26156
26158
  "inputSchema": {
26157
26159
  "$schema": "https://json-schema.org/draft/2020-12/schema",
26158
26160
  "type": "object",
26159
- "properties": {},
26161
+ "properties": {
26162
+ "slot_filter": {
26163
+ "description": "Partial slot match, e.g. 'usb'",
26164
+ "type": "string"
26165
+ },
26166
+ "type_filter": {
26167
+ "description": "Partial type match, e.g. 'raid', 'partition'",
26168
+ "type": "string"
26169
+ },
26170
+ "interface_filter": {
26171
+ "description": "Partial interface match, e.g. 'nvme', 'usb'",
26172
+ "type": "string"
26173
+ },
26174
+ "detail": {
26175
+ "default": false,
26176
+ "description": "Show the full per-disk property block",
26177
+ "type": "boolean"
26178
+ }
26179
+ },
26180
+ "required": ["detail"],
26160
26181
  "additionalProperties": false
26161
26182
  }
26162
26183
  },
@@ -26169,17 +26190,17 @@
26169
26190
  "idempotentHint": true,
26170
26191
  "openWorldHint": false
26171
26192
  },
26172
- "description": "Get detailed information about a single disk (`/disk print detail where name=...`). Use this to inspect a specific disk's filesystem type, free space, mount status, and other properties. The `name` argument takes a disk name (e.g. `disk1`) as returned by list_disks. For all disks in one call use list_disks; to erase and reformat a disk use format_disk.",
26193
+ "description": "Get full detail for a single disk by slot (`/disk print detail where slot=...`) its type, filesystem, size and free space, label, mount point, partition layout, model/serial/firmware, RAID role, SMART status, and any SMB/NFS sharing. Use list_disks to find the slot. To erase/reformat use format_disk; to change its label or sharing use set_disk / share_disk.",
26173
26194
  "inputSchema": {
26174
26195
  "$schema": "https://json-schema.org/draft/2020-12/schema",
26175
26196
  "type": "object",
26176
26197
  "properties": {
26177
- "name": {
26198
+ "slot": {
26178
26199
  "type": "string",
26179
- "description": "Disk name, e.g. 'disk1'"
26200
+ "description": "Disk slot, e.g. 'nvme1', 'usb1'"
26180
26201
  }
26181
26202
  },
26182
- "required": ["name"],
26203
+ "required": ["slot"],
26183
26204
  "additionalProperties": false
26184
26205
  }
26185
26206
  },
@@ -26191,30 +26212,740 @@
26191
26212
  "destructiveHint": true,
26192
26213
  "openWorldHint": false
26193
26214
  },
26194
- "description": "Erase and reformat a disk (`/disk format-drive`) — PERMANENTLY DESTROYS all data on the target disk. Use this to prepare a new or blank storage device for use on the router. Requires confirm=true to proceed; without it the command is aborted. Optional file_system (ext4, fat32, exfat, ntfs) selects the filesystem; optional label sets the volume label. The `name` argument takes a disk name (e.g. `disk1`) as returned by list_disks. For read-only disk inspection use list_disks or get_disk.",
26215
+ "description": "Erase and (re)format a disk or partition (`/disk format-drive`) — PERMANENTLY DESTROYS all data on the target slot. Use to prepare new storage, change filesystem, repartition, or enable encryption. Requires confirm=true. `file_system` picks the filesystem (ext4, exfat, fat32, ntfs). `label` sets the volume label. `partition_size` (e.g. '10G') formats only part of the drive (creating a partition) instead of the whole device. `encryption` + `encryption_password` create an encrypted volume (supply the RouterOS encryption value, e.g. 'aes-cbc'). Identify the disk by `slot` from list_disks. For read-only inspection use list_disks / get_disk.",
26195
26216
  "inputSchema": {
26196
26217
  "$schema": "https://json-schema.org/draft/2020-12/schema",
26197
26218
  "type": "object",
26198
26219
  "properties": {
26199
- "name": {
26220
+ "slot": {
26200
26221
  "type": "string",
26201
- "description": "Disk name to format, e.g. 'disk1'"
26222
+ "description": "Disk slot to format, e.g. 'usb1'"
26202
26223
  },
26203
26224
  "file_system": {
26204
- "description": "File system to create",
26225
+ "description": "Filesystem to create (RouterOS can format these)",
26205
26226
  "type": "string",
26206
- "enum": ["ext4", "fat32", "exfat", "ntfs"]
26227
+ "enum": ["ext4", "exfat", "fat32", "ntfs"]
26207
26228
  },
26208
26229
  "label": {
26209
26230
  "description": "Volume label",
26210
26231
  "type": "string"
26211
26232
  },
26233
+ "partition_size": {
26234
+ "description": "Format only this much as a partition, e.g. '10G' (omit = whole drive)",
26235
+ "type": "string"
26236
+ },
26237
+ "encryption": {
26238
+ "description": "Encryption algorithm to enable, e.g. 'aes-cbc' (RouterOS value)",
26239
+ "type": "string"
26240
+ },
26241
+ "encryption_password": {
26242
+ "description": "Passphrase when encryption is set",
26243
+ "type": "string"
26244
+ },
26212
26245
  "confirm": {
26213
26246
  "type": "boolean",
26214
- "description": "Must be true to actually erase the disk"
26247
+ "description": "Must be true to actually ERASE the disk"
26215
26248
  }
26216
26249
  },
26217
- "required": ["name", "confirm"],
26250
+ "required": ["slot", "confirm"],
26251
+ "additionalProperties": false
26252
+ }
26253
+ },
26254
+ {
26255
+ "name": "set_disk",
26256
+ "title": "Set Disk Properties",
26257
+ "risk": "write-idempotent",
26258
+ "annotations": {
26259
+ "destructiveHint": false,
26260
+ "idempotentHint": true,
26261
+ "openWorldHint": false
26262
+ },
26263
+ "description": "Update a disk's non-destructive properties (`/disk set [find slot=...]`) — set its `label` or `comment`, enable/disable it, or assign it to a software RAID array via `raid_master` (the slot of the RAID disk created with add_disk) or attach it under a `parent`. Does NOT erase data (use format_disk for that) and does NOT configure sharing (use share_disk). Identify by `slot` from list_disks.",
26264
+ "inputSchema": {
26265
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26266
+ "type": "object",
26267
+ "properties": {
26268
+ "slot": {
26269
+ "type": "string",
26270
+ "description": "Disk slot to modify"
26271
+ },
26272
+ "label": {
26273
+ "description": "Volume / disk label",
26274
+ "type": "string"
26275
+ },
26276
+ "comment": {
26277
+ "type": "string"
26278
+ },
26279
+ "raid_master": {
26280
+ "description": "Slot of the RAID disk to make this a member of",
26281
+ "type": "string"
26282
+ },
26283
+ "parent": {
26284
+ "description": "Parent disk slot to attach under",
26285
+ "type": "string"
26286
+ },
26287
+ "disabled": {
26288
+ "type": "boolean"
26289
+ }
26290
+ },
26291
+ "required": ["slot"],
26292
+ "additionalProperties": false
26293
+ }
26294
+ },
26295
+ {
26296
+ "name": "share_disk",
26297
+ "title": "Share a Disk over SMB / NFS",
26298
+ "risk": "write",
26299
+ "annotations": {
26300
+ "destructiveHint": false,
26301
+ "openWorldHint": false
26302
+ },
26303
+ "description": "Expose a disk on the network by setting its sharing properties (`/disk set [find slot=...]`) — toggle `smb_sharing` (Windows/macOS file sharing) with a `smb_share_name` and allowed `smb_users`, and/or `nfs_sharing` for Unix clients. RouterOS serves the share from the disk's mount point. The SMB/NFS server must be enabled on the device. Pass smb_sharing=false / nfs_sharing=false to stop sharing. Identify the disk by `slot` from list_disks.",
26304
+ "inputSchema": {
26305
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26306
+ "type": "object",
26307
+ "properties": {
26308
+ "slot": {
26309
+ "type": "string",
26310
+ "description": "Disk slot to share"
26311
+ },
26312
+ "smb_sharing": {
26313
+ "description": "Enable/disable SMB (CIFS) sharing",
26314
+ "type": "boolean"
26315
+ },
26316
+ "smb_share_name": {
26317
+ "description": "SMB share name shown to clients",
26318
+ "type": "string"
26319
+ },
26320
+ "smb_users": {
26321
+ "description": "Comma-separated SMB users allowed to access the share",
26322
+ "type": "string"
26323
+ },
26324
+ "nfs_sharing": {
26325
+ "description": "Enable/disable NFS sharing",
26326
+ "type": "boolean"
26327
+ }
26328
+ },
26329
+ "required": ["slot"],
26330
+ "additionalProperties": false
26331
+ }
26332
+ },
26333
+ {
26334
+ "name": "add_disk",
26335
+ "title": "Add a Virtual Disk (RAID / rsync / RAM)",
26336
+ "risk": "write",
26337
+ "annotations": {
26338
+ "destructiveHint": false,
26339
+ "openWorldHint": false
26340
+ },
26341
+ "description": "Create a virtual disk (`/disk add`). Use `type` to pick the kind: `raid` (software RAID array — set `raid_type` such as raid0/raid1/raid5/raid6/raid10, then add member drives with set_disk raid_master=<new slot>), `rsync` (a network rsync backup target), or `tmpfs` (a RAM disk — set `tmpfs_max_size`, e.g. '256M'). Optionally name the new disk via `slot`. `properties` passes any additional RouterOS attribute=value pairs for the chosen type (e.g. rsync-target, nfs-server). Requires RouterOS 7.x with disk/RAID support. To delete a virtual disk use remove_disk.",
26342
+ "inputSchema": {
26343
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26344
+ "type": "object",
26345
+ "properties": {
26346
+ "type": {
26347
+ "type": "string",
26348
+ "description": "Virtual disk type: 'raid', 'rsync', 'tmpfs', 'encrypted', …"
26349
+ },
26350
+ "slot": {
26351
+ "description": "Name/slot for the new virtual disk",
26352
+ "type": "string"
26353
+ },
26354
+ "raid_type": {
26355
+ "description": "For type=raid, e.g. 'raid1', 'raid5'",
26356
+ "type": "string"
26357
+ },
26358
+ "tmpfs_max_size": {
26359
+ "description": "For type=tmpfs, e.g. '256M'",
26360
+ "type": "string"
26361
+ },
26362
+ "comment": {
26363
+ "type": "string"
26364
+ },
26365
+ "properties": {
26366
+ "description": "Extra RouterOS attribute=value pairs for this disk type",
26367
+ "type": "object",
26368
+ "propertyNames": {
26369
+ "type": "string"
26370
+ },
26371
+ "additionalProperties": {
26372
+ "type": "string"
26373
+ }
26374
+ }
26375
+ },
26376
+ "required": ["type"],
26377
+ "additionalProperties": false
26378
+ }
26379
+ },
26380
+ {
26381
+ "name": "eject_disk",
26382
+ "title": "Eject Removable Disk",
26383
+ "risk": "write",
26384
+ "annotations": {
26385
+ "destructiveHint": false,
26386
+ "openWorldHint": false
26387
+ },
26388
+ "description": "Safely eject / unmount a removable disk (`/disk eject`) so it can be physically unplugged without data loss — flushes caches and unmounts the device. Use for USB drives and other hot-pluggable media before removal. Identify by `slot` from list_disks. This does not erase data; to delete a virtual disk entry use remove_disk.",
26389
+ "inputSchema": {
26390
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26391
+ "type": "object",
26392
+ "properties": {
26393
+ "slot": {
26394
+ "type": "string",
26395
+ "description": "Disk slot to eject, e.g. 'usb1'"
26396
+ }
26397
+ },
26398
+ "required": ["slot"],
26399
+ "additionalProperties": false
26400
+ }
26401
+ },
26402
+ {
26403
+ "name": "remove_disk",
26404
+ "title": "Remove a Virtual Disk Entry",
26405
+ "risk": "destructive",
26406
+ "annotations": {
26407
+ "destructiveHint": true,
26408
+ "idempotentHint": true,
26409
+ "openWorldHint": false
26410
+ },
26411
+ "description": "Delete a virtual disk entry (`/disk remove [find slot=...]`) — for software RAID arrays, rsync targets, RAM disks and other entries created with add_disk. Verifies the disk exists first. This removes the logical disk (and, for a RAID, breaks the array); it is NOT for formatting a physical drive — use format_disk for that, or eject_disk to safely unplug removable media. Identify by `slot`.",
26412
+ "inputSchema": {
26413
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26414
+ "type": "object",
26415
+ "properties": {
26416
+ "slot": {
26417
+ "type": "string",
26418
+ "description": "Virtual disk slot to remove"
26419
+ }
26420
+ },
26421
+ "required": ["slot"],
26422
+ "additionalProperties": false
26423
+ }
26424
+ },
26425
+ {
26426
+ "name": "list_containers",
26427
+ "title": "List Containers",
26428
+ "risk": "read",
26429
+ "annotations": {
26430
+ "readOnlyHint": true,
26431
+ "idempotentHint": true,
26432
+ "openWorldHint": false
26433
+ },
26434
+ "description": "List every OCI container on the device (`/container print`) with its status, image tag, name, VETH interface and root-dir — the starting point for any container work and the way to POLL the lifecycle, which is asynchronous: status moves extracting → stopped (ready to start) → running. Use this to find the `name`/`tag` the other tools take, to confirm an add has finished extracting before start_container, and to confirm a stop has completed before remove_container. Filter by partial `name_filter`, `tag_filter`, or `status_filter` (e.g. 'running', 'stopped'); set `detail=true` for the full property block. For one container use get_container. A container's stdout/stderr is in the system log (`/log print where topics~\"container\"`) when it was created with logging=yes.",
26435
+ "inputSchema": {
26436
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26437
+ "type": "object",
26438
+ "properties": {
26439
+ "name_filter": {
26440
+ "description": "Partial container name match",
26441
+ "type": "string"
26442
+ },
26443
+ "tag_filter": {
26444
+ "description": "Partial image tag match",
26445
+ "type": "string"
26446
+ },
26447
+ "status_filter": {
26448
+ "description": "e.g. 'running', 'stopped'",
26449
+ "type": "string"
26450
+ },
26451
+ "detail": {
26452
+ "default": false,
26453
+ "description": "Show the full per-container property block",
26454
+ "type": "boolean"
26455
+ }
26456
+ },
26457
+ "required": ["detail"],
26458
+ "additionalProperties": false
26459
+ }
26460
+ },
26461
+ {
26462
+ "name": "get_container",
26463
+ "title": "Get Container Detail",
26464
+ "risk": "read",
26465
+ "annotations": {
26466
+ "readOnlyHint": true,
26467
+ "idempotentHint": true,
26468
+ "openWorldHint": false
26469
+ },
26470
+ "description": "Full detail for one container (`/container print detail`) — status, image tag, interface, root-dir, env/mounts, cmd/entrypoint, hostname/dns, logging and start-on-boot. Identify by `name` (preferred) or `tag`. Use list_containers to discover identifiers.",
26471
+ "inputSchema": {
26472
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26473
+ "type": "object",
26474
+ "properties": {
26475
+ "name": {
26476
+ "description": "Container name (set via add_container)",
26477
+ "type": "string"
26478
+ },
26479
+ "tag": {
26480
+ "description": "Image tag to match (e.g. 'pihole') if no name",
26481
+ "type": "string"
26482
+ }
26483
+ },
26484
+ "additionalProperties": false
26485
+ }
26486
+ },
26487
+ {
26488
+ "name": "add_container",
26489
+ "title": "Add Container",
26490
+ "risk": "write",
26491
+ "annotations": {
26492
+ "destructiveHint": false,
26493
+ "openWorldHint": false
26494
+ },
26495
+ "description": "Create an OCI container (`/container add`). PREREQUISITES, in order: (1) the `container` package installed + device-mode `container=yes`; (2) an external disk for storage (containers should never run on internal flash); (3) for `remote_image`, a registry URL + on-disk `tmpdir` set via set_container_config; (4) a VETH for networking — create it first with `/interface veth add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1`, then bridge it and add a srcnat masquerade rule for internet (and a dst-nat to publish a port). Then create the container: supply EITHER `remote_image` (registry pull, e.g. 'library/alpine:latest') OR `file` (a local image tar on the device — must be a SINGLE-LAYER, UNCOMPRESSED Docker-v1 tar). Set `interface` to the VETH and `root_dir` to a path on the external disk (e.g. 'disk1/myapp'). Attach config via inline `env` ('K=v,K2=v2') / `mount` ('src=disk1/data,dst=/data'), or reference named lists with `envlists`/`mountlists` (add_container_env / add_container_mount). Override `cmd`/`entrypoint`/`workdir`; set `hostname`/`dns`; enable `logging`/`start_on_boot`; cap `memory_high`/`cpu_list`. ALWAYS set `name` so the lifecycle tools can find it. The image pull/extract is ASYNCHRONOUS: this returns immediately, then poll list_containers until status becomes 'stopped' (extraction done) before calling start_container.",
26496
+ "inputSchema": {
26497
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26498
+ "type": "object",
26499
+ "properties": {
26500
+ "name": {
26501
+ "description": "Container name (recommended for management)",
26502
+ "type": "string"
26503
+ },
26504
+ "remote_image": {
26505
+ "description": "Registry image, e.g. 'library/alpine:latest'",
26506
+ "type": "string"
26507
+ },
26508
+ "file": {
26509
+ "description": "Local Docker-v1 tar on the device (alternative to remote_image)",
26510
+ "type": "string"
26511
+ },
26512
+ "interface": {
26513
+ "description": "VETH interface name",
26514
+ "type": "string"
26515
+ },
26516
+ "root_dir": {
26517
+ "description": "Filesystem root, e.g. 'disk1/myapp'",
26518
+ "type": "string"
26519
+ },
26520
+ "env": {
26521
+ "description": "Inline env vars: 'K=v,K2=v2' (7.21+)",
26522
+ "type": "string"
26523
+ },
26524
+ "envlists": {
26525
+ "description": "Named env list name(s) (add_container_env)",
26526
+ "type": "string"
26527
+ },
26528
+ "mount": {
26529
+ "description": "Inline mount: 'src=disk1/data,dst=/data' (7.21+)",
26530
+ "type": "string"
26531
+ },
26532
+ "mountlists": {
26533
+ "description": "Named mount name(s) (add_container_mount)",
26534
+ "type": "string"
26535
+ },
26536
+ "cmd": {
26537
+ "description": "Override container CMD",
26538
+ "type": "string"
26539
+ },
26540
+ "entrypoint": {
26541
+ "description": "Override container ENTRYPOINT",
26542
+ "type": "string"
26543
+ },
26544
+ "workdir": {
26545
+ "description": "Override working directory",
26546
+ "type": "string"
26547
+ },
26548
+ "hostname": {
26549
+ "type": "string"
26550
+ },
26551
+ "dns": {
26552
+ "description": "DNS server for the container",
26553
+ "type": "string"
26554
+ },
26555
+ "user": {
26556
+ "type": "string"
26557
+ },
26558
+ "stop_signal": {
26559
+ "description": "Signal used to stop the container",
26560
+ "type": "string"
26561
+ },
26562
+ "devices": {
26563
+ "description": "Pass-through physical devices (7.20+)",
26564
+ "type": "string"
26565
+ },
26566
+ "cpu_list": {
26567
+ "description": "CPU core affinity",
26568
+ "type": "string"
26569
+ },
26570
+ "memory_high": {
26571
+ "description": "RAM limit, e.g. '256M'",
26572
+ "type": "string"
26573
+ },
26574
+ "logging": {
26575
+ "description": "Send stdout/stderr to the RouterOS log",
26576
+ "type": "boolean"
26577
+ },
26578
+ "start_on_boot": {
26579
+ "description": "Auto-start on device boot",
26580
+ "type": "boolean"
26581
+ },
26582
+ "comment": {
26583
+ "type": "string"
26584
+ }
26585
+ },
26586
+ "additionalProperties": false
26587
+ }
26588
+ },
26589
+ {
26590
+ "name": "update_container",
26591
+ "title": "Update Container",
26592
+ "risk": "write-idempotent",
26593
+ "annotations": {
26594
+ "destructiveHint": false,
26595
+ "idempotentHint": true,
26596
+ "openWorldHint": false
26597
+ },
26598
+ "description": "Modify an existing container's properties in place (`/container set [find …]`) without recreating it — change `start_on_boot`, `logging`, `cmd`/`entrypoint`/`workdir`, `hostname`/`dns`, `interface`, `root_dir`, inline `env`/`mount` or `envlists`/`mountlists`, resource caps, or `comment`. Identify by `name` or `tag`. Best practice: stop the container first (stop_container) before changing runtime properties like interface, env, mounts or cmd — they take effect on the next start_container, not live. To create a new container use add_container; to change the image, remove and re-add.",
26599
+ "inputSchema": {
26600
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26601
+ "type": "object",
26602
+ "properties": {
26603
+ "name": {
26604
+ "description": "Container name (set via add_container)",
26605
+ "type": "string"
26606
+ },
26607
+ "tag": {
26608
+ "description": "Image tag to match (e.g. 'pihole') if no name",
26609
+ "type": "string"
26610
+ },
26611
+ "interface": {
26612
+ "type": "string"
26613
+ },
26614
+ "root_dir": {
26615
+ "type": "string"
26616
+ },
26617
+ "env": {
26618
+ "type": "string"
26619
+ },
26620
+ "envlists": {
26621
+ "type": "string"
26622
+ },
26623
+ "mount": {
26624
+ "type": "string"
26625
+ },
26626
+ "mountlists": {
26627
+ "type": "string"
26628
+ },
26629
+ "cmd": {
26630
+ "type": "string"
26631
+ },
26632
+ "entrypoint": {
26633
+ "type": "string"
26634
+ },
26635
+ "workdir": {
26636
+ "type": "string"
26637
+ },
26638
+ "hostname": {
26639
+ "type": "string"
26640
+ },
26641
+ "dns": {
26642
+ "type": "string"
26643
+ },
26644
+ "cpu_list": {
26645
+ "type": "string"
26646
+ },
26647
+ "memory_high": {
26648
+ "type": "string"
26649
+ },
26650
+ "logging": {
26651
+ "type": "boolean"
26652
+ },
26653
+ "start_on_boot": {
26654
+ "type": "boolean"
26655
+ },
26656
+ "comment": {
26657
+ "type": "string"
26658
+ }
26659
+ },
26660
+ "additionalProperties": false
26661
+ }
26662
+ },
26663
+ {
26664
+ "name": "start_container",
26665
+ "title": "Start Container",
26666
+ "risk": "write",
26667
+ "annotations": {
26668
+ "destructiveHint": false,
26669
+ "openWorldHint": false
26670
+ },
26671
+ "description": "Start a stopped container (`/container start [find …]`). Identify by `name` or `tag`. The container must have finished extracting (status 'stopped') first — check with list_containers. View its output in the log when logging=yes. To stop it use stop_container.",
26672
+ "inputSchema": {
26673
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26674
+ "type": "object",
26675
+ "properties": {
26676
+ "name": {
26677
+ "description": "Container name (set via add_container)",
26678
+ "type": "string"
26679
+ },
26680
+ "tag": {
26681
+ "description": "Image tag to match (e.g. 'pihole') if no name",
26682
+ "type": "string"
26683
+ }
26684
+ },
26685
+ "additionalProperties": false
26686
+ }
26687
+ },
26688
+ {
26689
+ "name": "stop_container",
26690
+ "title": "Stop Container",
26691
+ "risk": "write",
26692
+ "annotations": {
26693
+ "destructiveHint": false,
26694
+ "openWorldHint": false
26695
+ },
26696
+ "description": "Stop a running container (`/container stop [find …]`). Identify by `name` or `tag`. Stopping is asynchronous — poll list_containers until status is 'stopped' before removing it. To start it again use start_container.",
26697
+ "inputSchema": {
26698
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26699
+ "type": "object",
26700
+ "properties": {
26701
+ "name": {
26702
+ "description": "Container name (set via add_container)",
26703
+ "type": "string"
26704
+ },
26705
+ "tag": {
26706
+ "description": "Image tag to match (e.g. 'pihole') if no name",
26707
+ "type": "string"
26708
+ }
26709
+ },
26710
+ "additionalProperties": false
26711
+ }
26712
+ },
26713
+ {
26714
+ "name": "remove_container",
26715
+ "title": "Remove Container",
26716
+ "risk": "destructive",
26717
+ "annotations": {
26718
+ "destructiveHint": true,
26719
+ "idempotentHint": true,
26720
+ "openWorldHint": false
26721
+ },
26722
+ "description": "Permanently delete a container (`/container remove [find …]`). The container must be FULLY STOPPED first — RouterOS rejects removal while it is running or still stopping. If removal fails for that reason, stop it (stop_container), wait until list_containers shows status 'stopped', then retry. Identify by `name` or `tag`. This does not delete its root-dir data on disk.",
26723
+ "inputSchema": {
26724
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26725
+ "type": "object",
26726
+ "properties": {
26727
+ "name": {
26728
+ "description": "Container name (set via add_container)",
26729
+ "type": "string"
26730
+ },
26731
+ "tag": {
26732
+ "description": "Image tag to match (e.g. 'pihole') if no name",
26733
+ "type": "string"
26734
+ }
26735
+ },
26736
+ "additionalProperties": false
26737
+ }
26738
+ },
26739
+ {
26740
+ "name": "get_container_config",
26741
+ "title": "Get Container Global Config",
26742
+ "risk": "read",
26743
+ "annotations": {
26744
+ "readOnlyHint": true,
26745
+ "idempotentHint": true,
26746
+ "openWorldHint": false
26747
+ },
26748
+ "description": "Read the global container configuration (`/container config print`) — the image registry URL, the tmpdir used for pulls/extraction, the layer directory, and the RAM-high limit. Use to verify the registry/tmpdir are set before pulling images. To change them use set_container_config.",
26749
+ "inputSchema": {
26750
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26751
+ "type": "object",
26752
+ "properties": {},
26753
+ "additionalProperties": false
26754
+ }
26755
+ },
26756
+ {
26757
+ "name": "set_container_config",
26758
+ "title": "Set Container Global Config",
26759
+ "risk": "write-idempotent",
26760
+ "annotations": {
26761
+ "destructiveHint": false,
26762
+ "idempotentHint": true,
26763
+ "openWorldHint": false
26764
+ },
26765
+ "description": "Configure the global container settings (`/container config set`) — the router-wide singleton that MUST be set before pulling any `remote_image` with add_container. Set `registry_url` (Docker Hub is 'https://registry-1.docker.io') and `tmpdir` to a path on an EXTERNAL disk (e.g. 'disk1/pull') — pulls and extraction need real space and IOPS, never internal flash. Optionally set `layer_dir`, a `ram_high` cap, and `username`/`password` for a private registry (credentials are redacted from output). The router also needs working DNS + internet to reach the registry. To read the current values use get_container_config.",
26766
+ "inputSchema": {
26767
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26768
+ "type": "object",
26769
+ "properties": {
26770
+ "registry_url": {
26771
+ "description": "Image registry URL",
26772
+ "type": "string"
26773
+ },
26774
+ "tmpdir": {
26775
+ "description": "Pull/extract temp dir, e.g. 'disk1/pull'",
26776
+ "type": "string"
26777
+ },
26778
+ "layer_dir": {
26779
+ "description": "Directory for extracted image layers",
26780
+ "type": "string"
26781
+ },
26782
+ "ram_high": {
26783
+ "description": "RAM-high limit, e.g. '256M'",
26784
+ "type": "string"
26785
+ },
26786
+ "username": {
26787
+ "description": "Registry username (private registries)",
26788
+ "type": "string"
26789
+ },
26790
+ "password": {
26791
+ "description": "Registry password (private registries)",
26792
+ "type": "string"
26793
+ }
26794
+ },
26795
+ "additionalProperties": false
26796
+ }
26797
+ },
26798
+ {
26799
+ "name": "list_container_envs",
26800
+ "title": "List Container Env Variables",
26801
+ "risk": "read",
26802
+ "annotations": {
26803
+ "readOnlyHint": true,
26804
+ "idempotentHint": true,
26805
+ "openWorldHint": false
26806
+ },
26807
+ "description": "List named environment-variable entries (`/container envs print`) — each has a `list` (the group name referenced by a container's envlists), a `key` and a `value`. Optionally filter by partial `list_filter`. To add one use add_container_env; to delete use remove_container_env.",
26808
+ "inputSchema": {
26809
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26810
+ "type": "object",
26811
+ "properties": {
26812
+ "list_filter": {
26813
+ "description": "Partial env-list (group) name match",
26814
+ "type": "string"
26815
+ }
26816
+ },
26817
+ "additionalProperties": false
26818
+ }
26819
+ },
26820
+ {
26821
+ "name": "add_container_env",
26822
+ "title": "Add Container Env Variable",
26823
+ "risk": "write",
26824
+ "annotations": {
26825
+ "destructiveHint": false,
26826
+ "openWorldHint": false
26827
+ },
26828
+ "description": "Add an environment variable to a named list (`/container envs add list= key= value=`). Group related variables under the same `list` name, then point a container at the group with `envlists=<list>` (add_container or update_container) — a container that is already running must be restarted to pick up env changes. Named lists are reusable across containers; for a one-off, self-contained setup the inline `env` on add_container is simpler. The grouping `list=` property requires RouterOS 7.20+. Values may be secrets and are redacted from output.",
26829
+ "inputSchema": {
26830
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26831
+ "type": "object",
26832
+ "properties": {
26833
+ "list": {
26834
+ "type": "string",
26835
+ "description": "Env-list (group) name, e.g. 'MYAPP'"
26836
+ },
26837
+ "key": {
26838
+ "type": "string",
26839
+ "description": "Variable name, e.g. 'TZ'"
26840
+ },
26841
+ "value": {
26842
+ "type": "string",
26843
+ "description": "Variable value"
26844
+ }
26845
+ },
26846
+ "required": ["list", "key", "value"],
26847
+ "additionalProperties": false
26848
+ }
26849
+ },
26850
+ {
26851
+ "name": "remove_container_env",
26852
+ "title": "Remove Container Env Variable",
26853
+ "risk": "destructive",
26854
+ "annotations": {
26855
+ "destructiveHint": true,
26856
+ "idempotentHint": true,
26857
+ "openWorldHint": false
26858
+ },
26859
+ "description": "Delete an environment variable from a list (`/container envs remove [find list= key=]`). Supply the `list` (group) name and the `key`. Verifies it exists first. To browse entries use list_container_envs.",
26860
+ "inputSchema": {
26861
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26862
+ "type": "object",
26863
+ "properties": {
26864
+ "list": {
26865
+ "type": "string",
26866
+ "description": "Env-list (group) name"
26867
+ },
26868
+ "key": {
26869
+ "type": "string",
26870
+ "description": "Variable name to remove"
26871
+ }
26872
+ },
26873
+ "required": ["list", "key"],
26874
+ "additionalProperties": false
26875
+ }
26876
+ },
26877
+ {
26878
+ "name": "list_container_mounts",
26879
+ "title": "List Container Mounts",
26880
+ "risk": "read",
26881
+ "annotations": {
26882
+ "readOnlyHint": true,
26883
+ "idempotentHint": true,
26884
+ "openWorldHint": false
26885
+ },
26886
+ "description": "List named volume mounts (`/container mounts print`) — each has a `name` (referenced by a container's mountlists), a host source `src` (e.g. 'disk1/appdata') and a container destination `dst` (e.g. '/data'). Optionally filter by partial `name_filter`. To add one use add_container_mount; to delete use remove_container_mount.",
26887
+ "inputSchema": {
26888
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26889
+ "type": "object",
26890
+ "properties": {
26891
+ "name_filter": {
26892
+ "description": "Partial mount name match",
26893
+ "type": "string"
26894
+ }
26895
+ },
26896
+ "additionalProperties": false
26897
+ }
26898
+ },
26899
+ {
26900
+ "name": "add_container_mount",
26901
+ "title": "Add Container Mount",
26902
+ "risk": "write",
26903
+ "annotations": {
26904
+ "destructiveHint": false,
26905
+ "openWorldHint": false
26906
+ },
26907
+ "description": "Create a named volume mount (`/container mounts add name= src= dst=`) — persists container data on the host so it survives restarts/recreation. Maps a host source `src` (put it on an EXTERNAL disk, e.g. 'disk1/appdata', never internal flash) to a path `dst` inside the container (e.g. '/data'). Point a container at it with `mountlists=<name>` (add_container or update_container); a running container must be restarted to apply mount changes. For a one-off, the inline `mount` on add_container is simpler. Named mounts and `mountlists` require RouterOS 7.21+.",
26908
+ "inputSchema": {
26909
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26910
+ "type": "object",
26911
+ "properties": {
26912
+ "name": {
26913
+ "type": "string",
26914
+ "description": "Mount name, e.g. 'appdata'"
26915
+ },
26916
+ "src": {
26917
+ "type": "string",
26918
+ "description": "Host source path, e.g. 'disk1/appdata'"
26919
+ },
26920
+ "dst": {
26921
+ "type": "string",
26922
+ "description": "Container destination path, e.g. '/data'"
26923
+ }
26924
+ },
26925
+ "required": ["name", "src", "dst"],
26926
+ "additionalProperties": false
26927
+ }
26928
+ },
26929
+ {
26930
+ "name": "remove_container_mount",
26931
+ "title": "Remove Container Mount",
26932
+ "risk": "destructive",
26933
+ "annotations": {
26934
+ "destructiveHint": true,
26935
+ "idempotentHint": true,
26936
+ "openWorldHint": false
26937
+ },
26938
+ "description": "Delete a named volume mount (`/container mounts remove [find name=...]`). Verifies it exists first. Does not delete the host data at `src`. To browse mounts use list_container_mounts.",
26939
+ "inputSchema": {
26940
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
26941
+ "type": "object",
26942
+ "properties": {
26943
+ "name": {
26944
+ "type": "string",
26945
+ "description": "Mount name to remove"
26946
+ }
26947
+ },
26948
+ "required": ["name"],
26218
26949
  "additionalProperties": false
26219
26950
  }
26220
26951
  },