@usex/mikrotik-mcp 3.34.0 → 3.36.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/dist/cli.js +3 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +3 -3
- package/dist/shared/{cli-gt8xtjx9.js → cli-3580mf22.js} +2664 -2557
- package/dist/shared/{cli-g5kqcrt4.js → cli-ckbcx5hs.js} +1 -1
- package/dist/shared/{library-aa58hkb4.js → library-jm3khjrr.js} +2664 -2557
- package/dist/shared/{library-c629x3tn.js → library-jrp4dawm.js} +1 -1
- package/dist/ui/observability.html +4 -4
- package/package.json +2 -2
- package/schemas/README.md +1 -1
- package/schemas/tool-catalog.json +214 -2
- package/schemas/tools/describe_tool.json +14 -0
- package/schemas/tools/export_ssh_host_key.json +13 -0
- package/schemas/tools/find_tools.json +20 -0
- package/schemas/tools/get_ssh_settings.json +7 -0
- package/schemas/tools/import_ssh_host_key.json +17 -0
- package/schemas/tools/invoke_tool.json +22 -0
- package/schemas/tools/regenerate_ssh_host_key.json +7 -0
- package/schemas/tools/set_ssh_settings.json +36 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@usex/mikrotik-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.36.0",
|
|
4
4
|
"description": "MCP server for MikroTik RouterOS — 660+ tools over SSH for firewall, NAT, routing, DHCP, DNS, WireGuard, wireless, QoS and more.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
"class-variance-authority": "^0.7.1",
|
|
94
94
|
"clsx": "^2.1.1",
|
|
95
95
|
"gsap": "^3.15.0",
|
|
96
|
-
"prettier": "^3.9.
|
|
96
|
+
"prettier": "^3.9.4",
|
|
97
97
|
"react": "^19.2.7",
|
|
98
98
|
"react-dom": "^19.2.7",
|
|
99
99
|
"recharts": "^3.9.0",
|
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
|
|
10
|
+
| `tool-catalog.json` | Every one of the 767 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,9 +1,94 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.34.0",
|
|
4
4
|
"generated": "by scripts/gen-schemas.ts — do not edit by hand",
|
|
5
|
-
"toolCount":
|
|
5
|
+
"toolCount": 767,
|
|
6
6
|
"tools": [
|
|
7
|
+
{
|
|
8
|
+
"name": "find_tools",
|
|
9
|
+
"title": "Find Tools (catalog search)",
|
|
10
|
+
"risk": "read",
|
|
11
|
+
"annotations": {
|
|
12
|
+
"readOnlyHint": true,
|
|
13
|
+
"idempotentHint": true,
|
|
14
|
+
"openWorldHint": false
|
|
15
|
+
},
|
|
16
|
+
"description": "Search the FULL MikroTik tool catalog by intent and get back the tools that best match — use this FIRST whenever you can't immediately see the specific tool you need among the listed tools (the host only surfaces a subset of the several-hundred-tool catalog). Describe the task in natural language or keywords, e.g. 'block a LAN client by MAC', 'add an IPv4 firewall filter rule', 'import a TLS certificate', 'list DHCP leases', 'create a WireGuard peer'. Returns each match's exact tool name, what it does, and its parameter names — then call it directly if it's already available, or run it via `invoke_tool`. For IPv4 vs IPv6, say which: 'ipv4'/'ipv6' disambiguates the result.",
|
|
17
|
+
"inputSchema": {
|
|
18
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
19
|
+
"type": "object",
|
|
20
|
+
"properties": {
|
|
21
|
+
"query": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"minLength": 1,
|
|
24
|
+
"description": "What you want to do, in words or keywords (e.g. 'add ipv4 nat masquerade rule')."
|
|
25
|
+
},
|
|
26
|
+
"limit": {
|
|
27
|
+
"description": "Max results to return (default 8).",
|
|
28
|
+
"type": "integer",
|
|
29
|
+
"minimum": 1,
|
|
30
|
+
"maximum": 25
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"required": ["query"],
|
|
34
|
+
"additionalProperties": false
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "describe_tool",
|
|
39
|
+
"title": "Describe a Tool (exact schema)",
|
|
40
|
+
"risk": "read",
|
|
41
|
+
"annotations": {
|
|
42
|
+
"readOnlyHint": true,
|
|
43
|
+
"idempotentHint": true,
|
|
44
|
+
"openWorldHint": false
|
|
45
|
+
},
|
|
46
|
+
"description": "Return the exact input schema, parameters (name · required · description), risk level and purpose of ONE tool by its exact name — use it after find_tools to build a correct call before running a tool you can't see listed. Pass the tool's snake_case name, e.g. 'create_filter_rule'.",
|
|
47
|
+
"inputSchema": {
|
|
48
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
49
|
+
"type": "object",
|
|
50
|
+
"properties": {
|
|
51
|
+
"name": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"minLength": 1,
|
|
54
|
+
"description": "Exact tool name, e.g. 'add_dhcp_lease'."
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"required": ["name"],
|
|
58
|
+
"additionalProperties": false
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "invoke_tool",
|
|
63
|
+
"title": "Invoke a Tool by Name",
|
|
64
|
+
"risk": "write",
|
|
65
|
+
"annotations": {
|
|
66
|
+
"destructiveHint": false,
|
|
67
|
+
"openWorldHint": false
|
|
68
|
+
},
|
|
69
|
+
"description": "Execute ANY tool in the catalog by its exact name with the given arguments — the precise way to run a tool you found via find_tools but the host hasn't surfaced for a direct call. The arguments are validated against that tool's real schema and run through its real handler, so this is exactly as safe/accurate as calling the tool directly (unlike raw CLI). To target a specific device in a multi-device setup, set the top-level `device` parameter on THIS call — not inside `arguments`. If validation fails you get the expected parameters back; fix and retry. For a one-off raw command with no dedicated tool, prefer run_routeros_command.",
|
|
70
|
+
"inputSchema": {
|
|
71
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
72
|
+
"type": "object",
|
|
73
|
+
"properties": {
|
|
74
|
+
"name": {
|
|
75
|
+
"type": "string",
|
|
76
|
+
"minLength": 1,
|
|
77
|
+
"description": "Exact tool name to run, e.g. 'create_filter_rule'."
|
|
78
|
+
},
|
|
79
|
+
"arguments": {
|
|
80
|
+
"description": "The tool's arguments as an object (omit for a no-argument tool).",
|
|
81
|
+
"type": "object",
|
|
82
|
+
"propertyNames": {
|
|
83
|
+
"type": "string"
|
|
84
|
+
},
|
|
85
|
+
"additionalProperties": {}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"required": ["name"],
|
|
89
|
+
"additionalProperties": false
|
|
90
|
+
}
|
|
91
|
+
},
|
|
7
92
|
{
|
|
8
93
|
"name": "run_routeros_command",
|
|
9
94
|
"title": "Run a RouterOS Command (raw CLI)",
|
|
@@ -14585,6 +14670,133 @@
|
|
|
14585
14670
|
"additionalProperties": false
|
|
14586
14671
|
}
|
|
14587
14672
|
},
|
|
14673
|
+
{
|
|
14674
|
+
"name": "get_ssh_settings",
|
|
14675
|
+
"title": "Get SSH Server Settings",
|
|
14676
|
+
"risk": "read",
|
|
14677
|
+
"annotations": {
|
|
14678
|
+
"readOnlyHint": true,
|
|
14679
|
+
"idempotentHint": true,
|
|
14680
|
+
"openWorldHint": false
|
|
14681
|
+
},
|
|
14682
|
+
"description": "Show the RouterOS SSH **server** configuration (`/ip ssh print`) — TCP forwarding policy (`forwarding-enabled`), crypto strength (`strong-crypto`, `allow-none-crypto`), password-vs-key policy (`always-allow-password-login`), and the host key (`host-key-type`, `host-key-size`). This is the SSH SERVER's behaviour, separate from `/ip service ssh` (which only sets the SSH port and source-address ACL — see get_ip_service). Use this to check, for example, whether a router can act as an SSH jump host (`forwarding-enabled` must be `local` or `both`).",
|
|
14683
|
+
"inputSchema": {
|
|
14684
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
14685
|
+
"type": "object",
|
|
14686
|
+
"properties": {},
|
|
14687
|
+
"additionalProperties": false
|
|
14688
|
+
}
|
|
14689
|
+
},
|
|
14690
|
+
{
|
|
14691
|
+
"name": "set_ssh_settings",
|
|
14692
|
+
"title": "Configure SSH Server Settings",
|
|
14693
|
+
"risk": "write-idempotent",
|
|
14694
|
+
"annotations": {
|
|
14695
|
+
"destructiveHint": false,
|
|
14696
|
+
"idempotentHint": true,
|
|
14697
|
+
"openWorldHint": false
|
|
14698
|
+
},
|
|
14699
|
+
"description": "Update the RouterOS SSH **server** settings (`/ip ssh set`). Covers every option of the `/ip ssh` submenu — pass only what you want to change:\n• `forwarding_enabled` — TCP forwarding policy: `no` | `local` | `remote` | `both`. **Set to `local` (or `both`) to let this router act as an SSH jump host / bastion** for ProxyJump (`jumpVia`); `remote` allows reverse forwarding.\n• `strong_crypto` — use stronger crypto: prefer 256-bit+ ciphers, bigger DH primes, stronger HMACs, and disable weak/legacy algorithms (recommended for hardening).\n• `always_allow_password_login` — allow password auth even when the user has an SSH public key set.\n• `allow_none_crypto` — allow connecting with NO encryption (insecure; almost always keep off).\n• `host_key_type` — host key algorithm: `rsa` or `ed25519`. Changing it regenerates the host key, so existing clients will see a changed key and must re-trust it.\n• `host_key_size` — RSA host-key size in bits (e.g. 2048 or 4096); applies to `rsa` host keys.\nNote: this is NOT the SSH port/ACL — for that use set_ip_service on the `ssh` service.",
|
|
14700
|
+
"inputSchema": {
|
|
14701
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
14702
|
+
"type": "object",
|
|
14703
|
+
"properties": {
|
|
14704
|
+
"forwarding_enabled": {
|
|
14705
|
+
"description": "TCP forwarding policy. `local`/`both` are required for this router to be a jump host.",
|
|
14706
|
+
"type": "string",
|
|
14707
|
+
"enum": ["no", "local", "remote", "both"]
|
|
14708
|
+
},
|
|
14709
|
+
"strong_crypto": {
|
|
14710
|
+
"description": "Prefer strong ciphers/MACs/DH and disable weak ones (hardening).",
|
|
14711
|
+
"type": "boolean"
|
|
14712
|
+
},
|
|
14713
|
+
"always_allow_password_login": {
|
|
14714
|
+
"description": "Allow password login even when the user has an SSH public key configured.",
|
|
14715
|
+
"type": "boolean"
|
|
14716
|
+
},
|
|
14717
|
+
"allow_none_crypto": {
|
|
14718
|
+
"description": "Allow unencrypted connections (insecure — keep off unless you must).",
|
|
14719
|
+
"type": "boolean"
|
|
14720
|
+
},
|
|
14721
|
+
"host_key_type": {
|
|
14722
|
+
"description": "Host key algorithm. Changing it regenerates the host key (clients must re-trust).",
|
|
14723
|
+
"type": "string",
|
|
14724
|
+
"enum": ["rsa", "ed25519"]
|
|
14725
|
+
},
|
|
14726
|
+
"host_key_size": {
|
|
14727
|
+
"description": "RSA host-key size in bits (e.g. 2048, 4096). Applies to rsa host keys.",
|
|
14728
|
+
"type": "integer",
|
|
14729
|
+
"exclusiveMinimum": 0,
|
|
14730
|
+
"maximum": 9007199254740991
|
|
14731
|
+
}
|
|
14732
|
+
},
|
|
14733
|
+
"additionalProperties": false
|
|
14734
|
+
}
|
|
14735
|
+
},
|
|
14736
|
+
{
|
|
14737
|
+
"name": "regenerate_ssh_host_key",
|
|
14738
|
+
"title": "Regenerate SSH Host Key",
|
|
14739
|
+
"risk": "dangerous",
|
|
14740
|
+
"annotations": {
|
|
14741
|
+
"destructiveHint": true,
|
|
14742
|
+
"openWorldHint": false
|
|
14743
|
+
},
|
|
14744
|
+
"description": "Regenerate the router's SSH host key (`/ip ssh regenerate-host-key`), using the current `host-key-type`/`host-key-size`. WARNING: this changes the server's identity — EVERY existing SSH client will get a host-key-mismatch warning and must re-trust the router (remove its old entry from `~/.ssh/known_hosts`). Do this only when rotating keys or after changing `host_key_type`. It does not drop the current session.",
|
|
14745
|
+
"inputSchema": {
|
|
14746
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
14747
|
+
"type": "object",
|
|
14748
|
+
"properties": {},
|
|
14749
|
+
"additionalProperties": false
|
|
14750
|
+
}
|
|
14751
|
+
},
|
|
14752
|
+
{
|
|
14753
|
+
"name": "export_ssh_host_key",
|
|
14754
|
+
"title": "Export SSH Host Public Key",
|
|
14755
|
+
"risk": "write",
|
|
14756
|
+
"annotations": {
|
|
14757
|
+
"destructiveHint": false,
|
|
14758
|
+
"openWorldHint": false
|
|
14759
|
+
},
|
|
14760
|
+
"description": "Export the router's SSH host public key to file(s) on the device (`/ip ssh export-host-key`), named with the given prefix (e.g. prefix `myrouter` → `myrouter_*` files in `/file`). Useful to pin/distribute the host key. Download the resulting file with download_file.",
|
|
14761
|
+
"inputSchema": {
|
|
14762
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
14763
|
+
"type": "object",
|
|
14764
|
+
"properties": {
|
|
14765
|
+
"key_file_prefix": {
|
|
14766
|
+
"type": "string",
|
|
14767
|
+
"description": "Filename prefix for the exported key file(s), e.g. 'myrouter'."
|
|
14768
|
+
}
|
|
14769
|
+
},
|
|
14770
|
+
"required": ["key_file_prefix"],
|
|
14771
|
+
"additionalProperties": false
|
|
14772
|
+
}
|
|
14773
|
+
},
|
|
14774
|
+
{
|
|
14775
|
+
"name": "import_ssh_host_key",
|
|
14776
|
+
"title": "Import SSH Host Key",
|
|
14777
|
+
"risk": "dangerous",
|
|
14778
|
+
"annotations": {
|
|
14779
|
+
"destructiveHint": true,
|
|
14780
|
+
"openWorldHint": false
|
|
14781
|
+
},
|
|
14782
|
+
"description": "Import an SSH host key onto the router from key files already on the device (`/ip ssh import-host-key`). Provide the private-key file and its matching public-key file (upload them first with upload_file). WARNING: this replaces the server's host identity — existing clients will see a changed host key and must re-trust the router.",
|
|
14783
|
+
"inputSchema": {
|
|
14784
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
14785
|
+
"type": "object",
|
|
14786
|
+
"properties": {
|
|
14787
|
+
"private_key_file": {
|
|
14788
|
+
"type": "string",
|
|
14789
|
+
"description": "Private-key filename on the device, e.g. 'host_key'."
|
|
14790
|
+
},
|
|
14791
|
+
"public_key_file": {
|
|
14792
|
+
"description": "Public-key filename on the device (e.g. 'host_key.pub'), if required.",
|
|
14793
|
+
"type": "string"
|
|
14794
|
+
}
|
|
14795
|
+
},
|
|
14796
|
+
"required": ["private_key_file"],
|
|
14797
|
+
"additionalProperties": false
|
|
14798
|
+
}
|
|
14799
|
+
},
|
|
14588
14800
|
{
|
|
14589
14801
|
"name": "get_ip_cloud",
|
|
14590
14802
|
"title": "Get IP Cloud (DDNS) Status",
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "describe_tool",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"name": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"minLength": 1,
|
|
9
|
+
"description": "Exact tool name, e.g. 'add_dhcp_lease'."
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"required": ["name"],
|
|
13
|
+
"additionalProperties": false
|
|
14
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "export_ssh_host_key",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"key_file_prefix": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"description": "Filename prefix for the exported key file(s), e.g. 'myrouter'."
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"required": ["key_file_prefix"],
|
|
12
|
+
"additionalProperties": false
|
|
13
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "find_tools",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"query": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"minLength": 1,
|
|
9
|
+
"description": "What you want to do, in words or keywords (e.g. 'add ipv4 nat masquerade rule')."
|
|
10
|
+
},
|
|
11
|
+
"limit": {
|
|
12
|
+
"description": "Max results to return (default 8).",
|
|
13
|
+
"type": "integer",
|
|
14
|
+
"minimum": 1,
|
|
15
|
+
"maximum": 25
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"required": ["query"],
|
|
19
|
+
"additionalProperties": false
|
|
20
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "import_ssh_host_key",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"private_key_file": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"description": "Private-key filename on the device, e.g. 'host_key'."
|
|
9
|
+
},
|
|
10
|
+
"public_key_file": {
|
|
11
|
+
"description": "Public-key filename on the device (e.g. 'host_key.pub'), if required.",
|
|
12
|
+
"type": "string"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"required": ["private_key_file"],
|
|
16
|
+
"additionalProperties": false
|
|
17
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "invoke_tool",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"name": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"minLength": 1,
|
|
9
|
+
"description": "Exact tool name to run, e.g. 'create_filter_rule'."
|
|
10
|
+
},
|
|
11
|
+
"arguments": {
|
|
12
|
+
"description": "The tool's arguments as an object (omit for a no-argument tool).",
|
|
13
|
+
"type": "object",
|
|
14
|
+
"propertyNames": {
|
|
15
|
+
"type": "string"
|
|
16
|
+
},
|
|
17
|
+
"additionalProperties": {}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"required": ["name"],
|
|
21
|
+
"additionalProperties": false
|
|
22
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "set_ssh_settings",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"properties": {
|
|
6
|
+
"forwarding_enabled": {
|
|
7
|
+
"description": "TCP forwarding policy. `local`/`both` are required for this router to be a jump host.",
|
|
8
|
+
"type": "string",
|
|
9
|
+
"enum": ["no", "local", "remote", "both"]
|
|
10
|
+
},
|
|
11
|
+
"strong_crypto": {
|
|
12
|
+
"description": "Prefer strong ciphers/MACs/DH and disable weak ones (hardening).",
|
|
13
|
+
"type": "boolean"
|
|
14
|
+
},
|
|
15
|
+
"always_allow_password_login": {
|
|
16
|
+
"description": "Allow password login even when the user has an SSH public key configured.",
|
|
17
|
+
"type": "boolean"
|
|
18
|
+
},
|
|
19
|
+
"allow_none_crypto": {
|
|
20
|
+
"description": "Allow unencrypted connections (insecure — keep off unless you must).",
|
|
21
|
+
"type": "boolean"
|
|
22
|
+
},
|
|
23
|
+
"host_key_type": {
|
|
24
|
+
"description": "Host key algorithm. Changing it regenerates the host key (clients must re-trust).",
|
|
25
|
+
"type": "string",
|
|
26
|
+
"enum": ["rsa", "ed25519"]
|
|
27
|
+
},
|
|
28
|
+
"host_key_size": {
|
|
29
|
+
"description": "RSA host-key size in bits (e.g. 2048, 4096). Applies to rsa host keys.",
|
|
30
|
+
"type": "integer",
|
|
31
|
+
"exclusiveMinimum": 0,
|
|
32
|
+
"maximum": 9007199254740991
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"additionalProperties": false
|
|
36
|
+
}
|