@usex/mikrotik-mcp 1.0.0 → 2.0.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 (196) hide show
  1. package/README.md +23 -8
  2. package/dist/cli.js +8545 -2321
  3. package/dist/index.d.ts +42 -2
  4. package/dist/index.js +7787 -2232
  5. package/dist/ui/dashboard.html +19 -0
  6. package/dist/ui/firewall.html +20 -0
  7. package/dist/ui/interfaces.html +20 -0
  8. package/dist/ui/observability.html +27 -0
  9. package/dist/ui/records.html +20 -0
  10. package/package.json +63 -50
  11. package/schemas/README.md +1 -1
  12. package/schemas/config.schema.json +112 -21
  13. package/schemas/tool-catalog.json +11783 -5555
  14. package/schemas/tools/add_dot1x_client.json +42 -0
  15. package/schemas/tools/add_dot1x_server.json +60 -0
  16. package/schemas/tools/add_graphing_interface.json +23 -0
  17. package/schemas/tools/add_graphing_queue.json +22 -0
  18. package/schemas/tools/add_graphing_resource.json +14 -0
  19. package/schemas/tools/add_ipv6_address.json +43 -0
  20. package/schemas/tools/add_ipv6_address_list_entry.json +32 -0
  21. package/schemas/tools/add_ipv6_default_route.json +34 -0
  22. package/schemas/tools/add_ipv6_dhcp_binding.json +42 -0
  23. package/schemas/tools/add_ipv6_dhcp_client.json +69 -0
  24. package/schemas/tools/add_ipv6_dhcp_option.json +29 -0
  25. package/schemas/tools/add_ipv6_dhcp_relay.json +35 -0
  26. package/schemas/tools/add_ipv6_nd.json +68 -0
  27. package/schemas/tools/add_ipv6_nd_prefix.json +35 -0
  28. package/schemas/tools/add_ipv6_route.json +64 -0
  29. package/schemas/tools/add_romon_port.json +34 -0
  30. package/schemas/tools/add_switch_port_isolation.json +23 -0
  31. package/schemas/tools/add_switch_rule.json +96 -0
  32. package/schemas/tools/add_traffic_generator_port.json +23 -0
  33. package/schemas/tools/add_traffic_generator_stream.json +39 -0
  34. package/schemas/tools/add_traffic_monitor.json +54 -0
  35. package/schemas/tools/create_ipv6_dhcp_server.json +60 -0
  36. package/schemas/tools/create_ipv6_filter_rule.json +103 -0
  37. package/schemas/tools/create_ipv6_mangle_rule.json +110 -0
  38. package/schemas/tools/create_ipv6_nat_rule.json +88 -0
  39. package/schemas/tools/create_ipv6_pool.json +29 -0
  40. package/schemas/tools/create_ipv6_raw_rule.json +78 -0
  41. package/schemas/tools/delete_s3_backup.json +15 -0
  42. package/schemas/tools/disable_ipv6_address_list_entry.json +15 -0
  43. package/schemas/tools/disable_ipv6_dhcp_relay.json +14 -0
  44. package/schemas/tools/disable_ipv6_filter_rule.json +14 -0
  45. package/schemas/tools/disable_ipv6_mangle_rule.json +14 -0
  46. package/schemas/tools/disable_ipv6_nat_rule.json +14 -0
  47. package/schemas/tools/disable_ipv6_raw_rule.json +14 -0
  48. package/schemas/tools/disable_ipv6_route.json +14 -0
  49. package/schemas/tools/disable_switch_rule.json +14 -0
  50. package/schemas/tools/disable_traffic_monitor.json +14 -0
  51. package/schemas/tools/download_backup_from_s3.json +25 -0
  52. package/schemas/tools/enable_ipv6_address_list_entry.json +15 -0
  53. package/schemas/tools/enable_ipv6_dhcp_relay.json +14 -0
  54. package/schemas/tools/enable_ipv6_filter_rule.json +14 -0
  55. package/schemas/tools/enable_ipv6_mangle_rule.json +14 -0
  56. package/schemas/tools/enable_ipv6_nat_rule.json +14 -0
  57. package/schemas/tools/enable_ipv6_raw_rule.json +14 -0
  58. package/schemas/tools/enable_ipv6_route.json +14 -0
  59. package/schemas/tools/enable_switch_rule.json +14 -0
  60. package/schemas/tools/enable_traffic_monitor.json +14 -0
  61. package/schemas/tools/flood_ping.json +37 -0
  62. package/schemas/tools/get_bandwidth_server.json +7 -0
  63. package/schemas/tools/get_dot1x_client.json +15 -0
  64. package/schemas/tools/get_dot1x_server.json +15 -0
  65. package/schemas/tools/get_ipv6_address.json +15 -0
  66. package/schemas/tools/get_ipv6_address_list_entry.json +15 -0
  67. package/schemas/tools/get_ipv6_dhcp_client.json +15 -0
  68. package/schemas/tools/get_ipv6_dhcp_relay.json +14 -0
  69. package/schemas/tools/get_ipv6_dhcp_server.json +14 -0
  70. package/schemas/tools/get_ipv6_filter_rule.json +15 -0
  71. package/schemas/tools/get_ipv6_mangle_rule.json +15 -0
  72. package/schemas/tools/get_ipv6_nat_rule.json +15 -0
  73. package/schemas/tools/get_ipv6_nd.json +15 -0
  74. package/schemas/tools/get_ipv6_neighbor.json +15 -0
  75. package/schemas/tools/get_ipv6_pool.json +14 -0
  76. package/schemas/tools/get_ipv6_raw_rule.json +15 -0
  77. package/schemas/tools/get_ipv6_route.json +15 -0
  78. package/schemas/tools/get_ipv6_settings.json +7 -0
  79. package/schemas/tools/get_mac_ping.json +7 -0
  80. package/schemas/tools/get_mac_server.json +7 -0
  81. package/schemas/tools/get_mac_winbox.json +7 -0
  82. package/schemas/tools/get_queue_interface.json +15 -0
  83. package/schemas/tools/get_romon.json +7 -0
  84. package/schemas/tools/get_sms_settings.json +7 -0
  85. package/schemas/tools/get_sniffer_settings.json +7 -0
  86. package/schemas/tools/get_switch.json +15 -0
  87. package/schemas/tools/get_switch_port.json +15 -0
  88. package/schemas/tools/get_switch_port_isolation.json +15 -0
  89. package/schemas/tools/get_switch_rule.json +15 -0
  90. package/schemas/tools/get_traffic_monitor.json +14 -0
  91. package/schemas/tools/ip_scan.json +26 -0
  92. package/schemas/tools/list_bandwidth_server_sessions.json +12 -0
  93. package/schemas/tools/list_dot1x_clients.json +22 -0
  94. package/schemas/tools/list_dot1x_servers.json +18 -0
  95. package/schemas/tools/list_graphing.json +20 -0
  96. package/schemas/tools/list_ipv6_address_lists.json +24 -0
  97. package/schemas/tools/list_ipv6_addresses.json +31 -0
  98. package/schemas/tools/list_ipv6_dhcp_bindings.json +21 -0
  99. package/schemas/tools/list_ipv6_dhcp_clients.json +27 -0
  100. package/schemas/tools/list_ipv6_dhcp_options.json +11 -0
  101. package/schemas/tools/list_ipv6_dhcp_relays.json +21 -0
  102. package/schemas/tools/list_ipv6_dhcp_servers.json +26 -0
  103. package/schemas/tools/list_ipv6_filter_rules.json +43 -0
  104. package/schemas/tools/list_ipv6_mangle_rules.json +37 -0
  105. package/schemas/tools/list_ipv6_nat_rules.json +37 -0
  106. package/schemas/tools/list_ipv6_nd.json +18 -0
  107. package/schemas/tools/list_ipv6_nd_prefixes.json +21 -0
  108. package/schemas/tools/list_ipv6_neighbors.json +29 -0
  109. package/schemas/tools/list_ipv6_pool_used.json +12 -0
  110. package/schemas/tools/list_ipv6_pools.json +14 -0
  111. package/schemas/tools/list_ipv6_raw_rules.json +37 -0
  112. package/schemas/tools/list_ipv6_routes.json +34 -0
  113. package/schemas/tools/list_mac_server_sessions.json +11 -0
  114. package/schemas/tools/list_queue_interfaces.json +16 -0
  115. package/schemas/tools/list_romon_ports.json +11 -0
  116. package/schemas/tools/list_s3_backups.json +22 -0
  117. package/schemas/tools/list_sms_inbox.json +12 -0
  118. package/schemas/tools/list_sniffer_connections.json +7 -0
  119. package/schemas/tools/list_sniffer_hosts.json +11 -0
  120. package/schemas/tools/list_sniffer_packets.json +15 -0
  121. package/schemas/tools/list_sniffer_protocols.json +7 -0
  122. package/schemas/tools/list_switch_port_isolation.json +12 -0
  123. package/schemas/tools/list_switch_ports.json +16 -0
  124. package/schemas/tools/list_switch_rules.json +21 -0
  125. package/schemas/tools/list_switches.json +16 -0
  126. package/schemas/tools/list_traffic_generator_ports.json +11 -0
  127. package/schemas/tools/list_traffic_generator_streams.json +14 -0
  128. package/schemas/tools/list_traffic_monitors.json +21 -0
  129. package/schemas/tools/move_ipv6_filter_rule.json +21 -0
  130. package/schemas/tools/move_ipv6_mangle_rule.json +21 -0
  131. package/schemas/tools/move_ipv6_nat_rule.json +21 -0
  132. package/schemas/tools/move_ipv6_raw_rule.json +21 -0
  133. package/schemas/tools/profile_cpu.json +22 -0
  134. package/schemas/tools/release_ipv6_dhcp_client.json +14 -0
  135. package/schemas/tools/remove_dot1x_client.json +15 -0
  136. package/schemas/tools/remove_dot1x_server.json +15 -0
  137. package/schemas/tools/remove_graphing.json +24 -0
  138. package/schemas/tools/remove_ipv6_address.json +14 -0
  139. package/schemas/tools/remove_ipv6_address_list_entry.json +15 -0
  140. package/schemas/tools/remove_ipv6_dhcp_binding.json +15 -0
  141. package/schemas/tools/remove_ipv6_dhcp_client.json +14 -0
  142. package/schemas/tools/remove_ipv6_dhcp_option.json +14 -0
  143. package/schemas/tools/remove_ipv6_dhcp_relay.json +14 -0
  144. package/schemas/tools/remove_ipv6_dhcp_server.json +14 -0
  145. package/schemas/tools/remove_ipv6_filter_rule.json +14 -0
  146. package/schemas/tools/remove_ipv6_mangle_rule.json +14 -0
  147. package/schemas/tools/remove_ipv6_nat_rule.json +14 -0
  148. package/schemas/tools/remove_ipv6_nd.json +15 -0
  149. package/schemas/tools/remove_ipv6_nd_prefix.json +15 -0
  150. package/schemas/tools/remove_ipv6_neighbor.json +15 -0
  151. package/schemas/tools/remove_ipv6_pool.json +14 -0
  152. package/schemas/tools/remove_ipv6_raw_rule.json +14 -0
  153. package/schemas/tools/remove_ipv6_route.json +15 -0
  154. package/schemas/tools/remove_romon_port.json +15 -0
  155. package/schemas/tools/remove_switch_port_isolation.json +15 -0
  156. package/schemas/tools/remove_switch_rule.json +14 -0
  157. package/schemas/tools/remove_traffic_generator_port.json +15 -0
  158. package/schemas/tools/remove_traffic_generator_stream.json +15 -0
  159. package/schemas/tools/remove_traffic_monitor.json +14 -0
  160. package/schemas/tools/renew_ipv6_dhcp_client.json +14 -0
  161. package/schemas/tools/s3_backup_info.json +15 -0
  162. package/schemas/tools/s3_backup_status.json +7 -0
  163. package/schemas/tools/save_sniffer.json +15 -0
  164. package/schemas/tools/send_sms.json +34 -0
  165. package/schemas/tools/show_firewall_filter.json +7 -0
  166. package/schemas/tools/show_interfaces.json +7 -0
  167. package/schemas/tools/show_system_dashboard.json +7 -0
  168. package/schemas/tools/speed_test.json +47 -0
  169. package/schemas/tools/start_sniffer.json +7 -0
  170. package/schemas/tools/start_traffic_generator.json +14 -0
  171. package/schemas/tools/stop_sniffer.json +7 -0
  172. package/schemas/tools/stop_traffic_generator.json +7 -0
  173. package/schemas/tools/update_bandwidth_server.json +24 -0
  174. package/schemas/tools/update_dot1x_client.json +36 -0
  175. package/schemas/tools/update_dot1x_server.json +54 -0
  176. package/schemas/tools/update_ipv6_filter_rule.json +77 -0
  177. package/schemas/tools/update_ipv6_mangle_rule.json +80 -0
  178. package/schemas/tools/update_ipv6_nat_rule.json +65 -0
  179. package/schemas/tools/update_ipv6_nd.json +64 -0
  180. package/schemas/tools/update_ipv6_pool.json +28 -0
  181. package/schemas/tools/update_ipv6_raw_rule.json +59 -0
  182. package/schemas/tools/update_ipv6_settings.json +35 -0
  183. package/schemas/tools/update_mac_ping.json +15 -0
  184. package/schemas/tools/update_mac_server.json +15 -0
  185. package/schemas/tools/update_mac_winbox.json +15 -0
  186. package/schemas/tools/update_queue_interface.json +20 -0
  187. package/schemas/tools/update_romon.json +19 -0
  188. package/schemas/tools/update_sms_settings.json +30 -0
  189. package/schemas/tools/update_sniffer_settings.json +39 -0
  190. package/schemas/tools/update_switch.json +34 -0
  191. package/schemas/tools/update_switch_port.json +39 -0
  192. package/schemas/tools/update_switch_port_isolation.json +22 -0
  193. package/schemas/tools/update_switch_rule.json +83 -0
  194. package/schemas/tools/update_traffic_monitor.json +46 -0
  195. package/schemas/tools/upload_backup_to_s3.json +25 -0
  196. package/schemas/tools/wake_on_lan.json +19 -0
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>MikroTik Records Viewer</title>
7
+ <script type="module">
8
+ import{i as e}from"./app-DU6NBjf_.js";import{a as t,i as n,n as r,o as i,r as a,t as o}from"./kit-DAVkZl3Q.js";var s=document.getElementById(`app`),c=null,l=``,u=null,d=1,f=new Set,p=null,m=!1,h=0,g=null,_={};function v(e){let t=[`#`,`flags`].filter(t=>e.columns.includes(t));return[...t,...e.columns.filter(e=>!t.includes(e))]}function y(e){let t=l.trim().toLowerCase(),n=e.rows;if(t&&(n=n.filter(e=>Object.values(e).some(e=>e.toLowerCase().includes(t)))),f.size&&(n=n.filter(e=>{let t=e.flags??``;return[...f].every(e=>t.includes(e))})),u){let e=u;n=[...n].sort((t,n)=>{let r=t[e]??``,i=n[e]??``,a=Number(r),o=Number(i);return(r!==``&&i!==``&&!Number.isNaN(a)&&!Number.isNaN(o)?a-o:r.localeCompare(i))*d})}return n}function b(e){let t=new Set;for(let n of e.rows)for(let e of n.flags??``)t.add(e);return[...t].sort()}function x(e){return Object.entries(e).filter(([e])=>e!==`#`&&e!==`flags`).map(([e,t])=>/\s/.test(t)?`${e}="${t}"`:`${e}=${t}`).join(` `)}function S(e){let t=b(e);return t.length?n(`div`,{class:`toolbar`},...t.map(t=>{let n=e.flags[t]??t,r=f.has(t);return o(`${t} · ${n}`,()=>{r?f.delete(t):f.add(t),j()},{class:r?`is-active`:``,title:`Filter rows flagged "${n}"`})})):!1}function C(e){let t=n(`th`,e===`#`?{class:`col-num`}:{},e);return u===e&&t.append(n(`span`,{class:`arrow`},d===1?`▲`:`▼`)),t.addEventListener(`click`,()=>{u===e?d=d===1?-1:1:(u=e,d=1),j()}),t}function w(e,t){let r=v(e),i=n(`thead`,{},n(`tr`,{},...r.map(C))),a=n(`tbody`);return t.forEach(t=>{let i=n(`tr`,(t.flags??``).includes(`X`)?{class:`is-disabled`}:{});for(let e of r)i.append(n(`td`,e===`#`?{class:`col-num`}:{},t[e]??`—`));i.addEventListener(`click`,()=>{p=e.rows.indexOf(t),j()}),a.append(i)}),n(`div`,{class:`tablewrap`},n(`table`,{class:`tbl`},i,a))}function T(e){let t=n(`div`,{class:`kv__body`});for(let[r,i]of Object.entries(e))t.append(n(`div`,{class:`kv__k`},r),n(`div`,{class:`kv__v`},i||`—`));return t}function E(e){if(p==null||!e.rows[p])return!1;let t=e.rows[p],i=t.name??t[`#`]??`record`;return n(`div`,{class:`drawer`},n(`div`,{class:`drawer__hd`},n(`span`,{},`Row `),n(`b`,{},String(i)),n(`span`,{class:`hd__spacer`}),o(`Copy as CLI`,()=>void r(x(t)),{title:`Copy key=value pairs`}),o(`Close`,()=>{p=null,j()})),T(t))}function D(e,i){let s=n(`input`,{class:`search`,type:`search`,placeholder:`Search ${e.count} row${e.count===1?``:`s`}…`,value:l});s.addEventListener(`input`,()=>{l=s.value,p=null,k()});let c=n(`select`,{class:`btn`,title:`Auto-refresh interval`});for(let[e,t]of[[`Auto: off`,`0`],[`Auto: 5s`,`5000`],[`Auto: 15s`,`15000`],[`Auto: 60s`,`60000`]]){let r=n(`option`,{value:t},e);Number(t)===h&&(r.selected=!0),c.append(r)}c.addEventListener(`change`,()=>F(Number(c.value)));let u=()=>y(e),d=v(e);return n(`div`,{class:`toolbar`},n(`div`,{class:`grow`},s),o(m?`Refreshing…`:`↻ Refresh`,P,{disabled:m}),c,o(`CSV`,()=>a(`${e.tool}.csv`,t(d,u()),`text/csv`),{title:`Export visible rows as CSV`}),o(`JSON`,()=>a(`${e.tool}.json`,JSON.stringify(u(),null,2),`application/json`),{title:`Export visible rows as JSON`}),o(`Copy`,()=>void r(JSON.stringify(u(),null,2)),{title:`Copy visible rows as JSON`}),n(`span`,{class:`pill count-pill`},`showing `,n(`b`,{},`${i}/${e.count}`)))}function O(e){return n(`header`,{class:`hd`},n(`span`,{class:`hd__dot`}),n(`div`,{},n(`h1`,{class:`hd__title`},e.title),n(`p`,{class:`hd__sub`},e.tool)),n(`span`,{class:`hd__spacer`}))}function k(){if(!c)return;let e=document.getElementById(`results`);if(!e){j();return}e.replaceChildren(A(c));let t=document.querySelector(`.count-pill b`);t&&(t.textContent=`${y(c).length}/${c.count}`)}function A(e){let t=y(e);return e.rows.length===0?e.raw?n(`pre`,{class:`raw`},e.raw):n(`div`,{class:`empty`},`No records returned.`):e.kind===`record`&&e.rows.length===1?T(e.rows[0]):t.length===0?n(`div`,{class:`empty`},`No rows match the current filter.`):w(e,t)}function j(){if(!c){s.replaceChildren(n(`div`,{class:`skeleton`},`Waiting for data…`));return}let e=c,t=y(e).length,r=e.kind===`list`&&e.rows.length>0,i=[O(e),r&&D(e,t),r&&S(e),n(`div`,{id:`results`},A(e)),E(e),n(`footer`,{class:`foot`},n(`span`,{},`format: ${e.format}`),n(`span`,{class:`grow`}),n(`span`,{},`updated ${new Date(e.generatedAt).toLocaleTimeString()}`))];s.replaceChildren(...i.filter(Boolean))}var M=new e({name:`mikrotik-records`,version:`1.0.0`});function N(e){e&&typeof e==`object`&&e.__mikrotikView===`records`&&(c=e,p=null,j())}async function P(){if(!(m||!c)){m=!0,j();try{N((await M.callServerTool({name:c.tool,arguments:_})).structuredContent)}catch(e){console.error(`[records] refresh failed`,e)}finally{m=!1,j()}}}function F(e){h=e,g&&=(clearInterval(g),null),e>0&&(g=setInterval(()=>void P(),e)),j()}M.ontoolresult=e=>N(e.structuredContent),M.ontoolinput=e=>{e&&typeof e==`object`&&`arguments`in e&&(_=e.arguments??{}),c||j()},i(M),M.onteardown=async()=>(g&&clearInterval(g),{}),j(),M.connect().catch(e=>console.error(`[records] connect failed`,e));
9
+ </script>
10
+ <link rel="modulepreload" crossorigin href="../assets/app-DU6NBjf_.js">
11
+ <link rel="modulepreload" crossorigin href="../assets/kit-DAVkZl3Q.js">
12
+ <style>
13
+ @media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}.card__value small{color:var(--mt-text-dim);font-size:12px;font-weight:400}.gauge{align-items:center;gap:14px;display:flex}.gauge svg{flex:none}.gauge__track{stroke:var(--mt-surface-2)}.gauge__bar{stroke:var(--mt-accent);stroke-linecap:round;transform-origin:50%;transition:stroke-dashoffset .6s cubic-bezier(.2,.8,.2,1);transform:rotate(-90deg)}.gauge__pct{font-family:var(--mt-mono);fill:var(--mt-text);font-size:16px;font-weight:650}.gauge__meta{min-width:0}.gauge__meta .card__label{margin-bottom:4px}.gauge__meta small{color:var(--mt-text-faint);font-family:var(--mt-mono);font-size:11px}.is-good{stroke:var(--mt-good)}.is-warn{stroke:var(--mt-warn)}.is-bad{stroke:var(--mt-bad)}details.kv{background:var(--mt-surface);border:1px solid var(--mt-border);border-radius:var(--mt-radius);overflow:hidden}details.kv>summary{cursor:pointer;color:var(--mt-text-dim);-webkit-user-select:none;user-select:none;padding:12px 14px;font-weight:600;list-style:none}details.kv>summary::-webkit-details-marker{display:none}details.kv>summary:after{content:"▸";float:right;color:var(--mt-text-faint);transition:transform .2s}details.kv[open]>summary:after{transform:rotate(90deg)}.kv__body{border-top:1px solid var(--mt-border);grid-template-columns:minmax(120px,.4fr) 1fr;display:grid}.kv__body>div{border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);overflow-wrap:anywhere;min-width:0;padding:7px 14px;font-size:12px}.kv__k{color:var(--mt-text-dim);font-family:var(--mt-mono)}.kv__v{font-family:var(--mt-mono);color:var(--mt-text)}.foot{color:var(--mt-text-faint);font-size:11px;font-family:var(--mt-mono);align-items:center;gap:10px;display:flex}.btn{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);cursor:pointer;padding:5px 11px;font-size:12px;transition:border-color .15s,background .15s}.skeleton{color:var(--mt-text-faint);text-align:center;padding:40px 0}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.act{font-family:var(--mt-mono);border:1px solid var(--mt-border);color:var(--mt-text-dim);border-radius:999px;padding:1px 8px;font-size:11px;display:inline-block}.act.is-accept{color:var(--mt-good);border-color:color-mix(in srgb, var(--mt-good) 45%, var(--mt-border))}.act.is-drop{color:var(--mt-bad);border-color:color-mix(in srgb, var(--mt-bad) 45%, var(--mt-border))}.act.is-jump{color:var(--mt-accent);border-color:color-mix(in srgb, var(--mt-accent) 45%, var(--mt-border))}.matchers{color:var(--mt-text-dim);max-width:340px;white-space:normal!important}.matchers b{color:var(--mt-text);font-weight:500}td.num{text-align:right;color:var(--mt-text-dim)}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.if-grid{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;display:grid}.if-card{gap:8px;display:grid}.if-card__top{align-items:center;gap:8px;display:flex}.if-card__name{font-family:var(--mt-mono);overflow-wrap:anywhere;font-size:14px;font-weight:650}.if-card.is-disabled{opacity:.6}.dot{background:var(--mt-text-faint);border-radius:50%;flex:none;width:9px;height:9px}.dot.is-up{background:var(--mt-good);box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-good) 22%, transparent)}.dot.is-down{background:var(--mt-bad);box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-bad) 18%, transparent)}.if-card__meta{font-family:var(--mt-mono);color:var(--mt-text-dim);grid-template-columns:auto 1fr;gap:2px 10px;font-size:11px;display:grid}.if-card__meta b{color:var(--mt-text);overflow-wrap:anywhere;font-weight:500}.if-card__meta .contents{display:contents}.badge{border:1px solid var(--mt-border);background:var(--mt-surface-2);color:var(--mt-text-dim);font-family:var(--mt-mono);text-transform:uppercase;letter-spacing:.04em;border-radius:999px;margin-left:auto;padding:1px 7px;font-size:10px}:root{--mt-bg:var(--color-background-primary,#0b0d10);--mt-surface:var(--color-background-secondary,#14171c);--mt-surface-2:var(--color-background-tertiary,#1b1f26);--mt-border:var(--color-border-primary,#262b33);--mt-text:var(--color-text-primary,#e8eaed);--mt-text-dim:var(--color-text-secondary,#9aa3af);--mt-text-faint:var(--color-text-tertiary,#6b7280);--mt-accent:var(--color-accent-primary,#6ea8fe);--mt-good:#34d399;--mt-warn:#fbbf24;--mt-bad:#f87171;--mt-radius:var(--border-radius-md,14px);--mt-radius-sm:var(--border-radius-sm,9px);--mt-mono:var(--font-mono,ui-monospace, "SF Mono", "JetBrains Mono", Menlo, monospace);--mt-sans:var(--font-sans,system-ui, -apple-system, "Segoe UI", sans-serif);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}*{box-sizing:border-box}body{background:var(--mt-bg);color:var(--mt-text);font-family:var(--mt-sans);-webkit-font-smoothing:antialiased;margin:0;padding:16px;font-size:13px;line-height:1.5}.app{gap:14px;max-width:960px;margin:0 auto;display:grid}.hd{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.hd__dot{background:var(--mt-good);width:9px;height:9px;box-shadow:0 0 0 4px color-mix(in srgb, var(--mt-good) 22%, transparent);border-radius:50%}.hd__title{letter-spacing:-.01em;margin:0;font-size:17px;font-weight:650}.hd__sub{color:var(--mt-text-dim);font-family:var(--mt-mono);margin:0;font-size:12px}.hd__spacer{flex:1}.pill{border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text-dim);font-family:var(--mt-mono);border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;display:inline-flex}.pill b{color:var(--mt-text);font-weight:600}.grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;display:grid}.card{background:linear-gradient(180deg, var(--mt-surface), var(--mt-surface-2));border:1px solid var(--mt-border);border-radius:var(--mt-radius);padding:14px}.card__label{color:var(--mt-text-dim);text-transform:uppercase;letter-spacing:.06em;margin:0 0 8px;font-size:11px}.card__value{font-family:var(--mt-mono);letter-spacing:-.01em;font-size:20px;font-weight:600}.toolbar{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.toolbar .grow{flex:1;min-width:140px}.search{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);width:100%;color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);padding:7px 11px;font-size:13px}.search:focus{border-color:var(--mt-accent);outline:none}.search::placeholder{color:var(--mt-text-faint)}.btn{appearance:none;border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text);font:inherit;border-radius:var(--mt-radius-sm);cursor:pointer;white-space:nowrap;padding:6px 11px;font-size:12px;transition:border-color .15s,background .15s}.btn:hover{border-color:var(--mt-accent);background:var(--mt-surface-2)}.btn:disabled{opacity:.5;cursor:default}.btn.is-active{border-color:var(--mt-accent);color:var(--mt-accent)}.chip{border:1px solid var(--mt-border);background:var(--mt-surface);color:var(--mt-text-dim);font-family:var(--mt-mono);border-radius:999px;align-items:center;gap:4px;padding:1px 7px;font-size:11px;display:inline-flex}.chip.is-good{color:var(--mt-good);border-color:color-mix(in srgb, var(--mt-good) 45%, var(--mt-border))}.chip.is-warn{color:var(--mt-warn);border-color:color-mix(in srgb, var(--mt-warn) 45%, var(--mt-border))}.chip.is-bad{color:var(--mt-bad);border-color:color-mix(in srgb, var(--mt-bad) 45%, var(--mt-border))}.tablewrap{border:1px solid var(--mt-border);border-radius:var(--mt-radius);max-height:70vh;overflow:auto}table.tbl{border-collapse:collapse;width:100%;font-size:12px}table.tbl th,table.tbl td{text-align:left;border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);white-space:nowrap;font-family:var(--mt-mono);padding:7px 12px}table.tbl thead th{z-index:1;background:var(--mt-surface-2);color:var(--mt-text-dim);cursor:pointer;-webkit-user-select:none;user-select:none;font-weight:600;position:sticky;top:0}table.tbl thead th:hover{color:var(--mt-text)}table.tbl thead th .arrow{color:var(--mt-accent);margin-left:4px}table.tbl tbody tr{cursor:pointer}table.tbl tbody tr:hover{background:color-mix(in srgb, var(--mt-accent) 8%, transparent)}table.tbl tbody tr.is-disabled td,table.tbl td.col-num{color:var(--mt-text-faint)}.kv__body{border:1px solid var(--mt-border);border-radius:var(--mt-radius);grid-template-columns:minmax(120px,.4fr) 1fr;display:grid;overflow:hidden}.kv__body>div{border-bottom:1px solid color-mix(in srgb, var(--mt-border) 55%, transparent);overflow-wrap:anywhere;min-width:0;font-size:12px;font-family:var(--mt-mono);padding:7px 14px}.kv__k{color:var(--mt-text-dim);background:color-mix(in srgb, var(--mt-surface) 60%, transparent)}.kv__v{color:var(--mt-text)}.drawer{border:1px solid var(--mt-accent);border-radius:var(--mt-radius);background:var(--mt-surface);gap:10px;padding:12px;display:grid}.drawer__hd{align-items:center;gap:8px;display:flex}.drawer__hd b{font-family:var(--mt-mono)}pre.raw{border:1px solid var(--mt-border);border-radius:var(--mt-radius);background:var(--mt-surface);color:var(--mt-text);font-family:var(--mt-mono);white-space:pre;max-height:70vh;margin:0;padding:14px;font-size:12px;overflow:auto}.foot{color:var(--mt-text-faint);font-size:11px;font-family:var(--mt-mono);flex-wrap:wrap;align-items:center;gap:10px;display:flex}.foot .grow{flex:1}.skeleton,.empty{color:var(--mt-text-faint);text-align:center;padding:40px 0}.count-pill b{color:var(--mt-accent)}table.tbl td.col-num,table.tbl th.col-num{width:1%}
14
+ /*$vite$:1*/
15
+ </style>
16
+ </head>
17
+ <body>
18
+ <div id="app"></div>
19
+ </body>
20
+ </html>
package/package.json CHANGED
@@ -1,55 +1,55 @@
1
1
  {
2
2
  "name": "@usex/mikrotik-mcp",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "Bun-native MCP server for MikroTik RouterOS — 200+ tools over SSH for firewall, NAT, routing, DHCP, DNS, WireGuard, wireless, QoS and more.",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.js"
13
- }
14
- },
15
- "files": [
16
- "dist",
17
- "prompts",
18
- "schemas"
19
- ],
20
- "bin": {
21
- "mikrotik-mcp": "dist/cli.js"
22
- },
23
5
  "keywords": [
24
6
  "ai",
7
+ "bun",
8
+ "claude",
25
9
  "mcp",
26
10
  "mikrotik",
27
- "mikrotik mcp",
28
- "claude",
29
- "bun"
11
+ "mikrotik mcp"
30
12
  ],
13
+ "homepage": "https://github.com/ali-master/mikrotik-mcp#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/ali-master/mikrotik-mcp/issues"
16
+ },
17
+ "license": "MIT",
31
18
  "author": {
32
19
  "name": "Ali Torki",
33
- "url": "https://github.com/ali-master",
34
- "email": "ali_4286@live.com"
20
+ "email": "ali_4286@live.com",
21
+ "url": "https://github.com/ali-master"
35
22
  },
36
- "license": "MIT",
37
23
  "repository": {
38
24
  "type": "git",
39
25
  "url": "https://github.com/ali-master/mikrotik-mcp.git"
40
26
  },
41
- "bugs": {
42
- "url": "https://github.com/ali-master/mikrotik-mcp/issues"
27
+ "bin": {
28
+ "mikrotik-mcp": "dist/cli.js"
43
29
  },
44
- "homepage": "https://github.com/ali-master/mikrotik-mcp#readme",
45
- "logo": "https://raw.githubusercontent.com/ali-master/mikrotik-mcp/main/assets/logo.svg",
46
- "engines": {
47
- "bun": ">=1.3.0"
30
+ "files": [
31
+ "dist",
32
+ "prompts",
33
+ "schemas"
34
+ ],
35
+ "type": "module",
36
+ "main": "dist/index.js",
37
+ "module": "dist/index.js",
38
+ "types": "dist/index.d.ts",
39
+ "exports": {
40
+ ".": {
41
+ "types": "./dist/index.d.ts",
42
+ "import": "./dist/index.js"
43
+ }
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
48
47
  },
49
48
  "scripts": {
50
- "build": "bunup && chmod +x dist/cli.js",
49
+ "build": "bunup && chmod +x dist/cli.js && bun run build:ui",
50
+ "build:ui": "bun run scripts/build-ui.ts",
51
51
  "dev": "bunup --watch",
52
- "prepack": "bunup && chmod +x dist/cli.js",
52
+ "prepack": "bunup && chmod +x dist/cli.js && bun run build:ui",
53
53
  "auth-check": "bun run src/cli.ts auth-check",
54
54
  "gen:schemas": "bun run scripts/gen-schemas.ts",
55
55
  "gen:docs": "bun run scripts/gen-tool-docs.ts",
@@ -60,33 +60,48 @@
60
60
  "inspect:config": "bunx @modelcontextprotocol/inspector --config mcp-inspector.config.json --server mikrotik",
61
61
  "inspect:cli": "bunx @modelcontextprotocol/inspector --cli bun run src/cli.ts serve --method tools/list",
62
62
  "inspect:config:local": "bunx @modelcontextprotocol/inspector --config /var/open-source/mikrotik-mcp/mcp-inspector.config.local.json --server mikrotik",
63
- "test": "bun test",
63
+ "test": "vp test run",
64
+ "test:watch": "vp test",
64
65
  "release": "release-it",
65
66
  "test:types": "tsc --noEmit",
66
- "format": "prettier --write \"**/*.ts\"",
67
- "lint": "eslint \"src/**/*.ts\"",
68
- "lint:fix": "eslint \"src/**/*.ts\" --fix"
67
+ "check": "vp check",
68
+ "lint": "vp lint",
69
+ "lint:fix": "vp lint --fix",
70
+ "format": "vp fmt --check",
71
+ "format:fix": "vp fmt --write",
72
+ "prepare": "vp config"
73
+ },
74
+ "dependencies": {
75
+ "@modelcontextprotocol/ext-apps": "^1.7.4",
76
+ "@modelcontextprotocol/sdk": "^1.29.0",
77
+ "ssh2": "^1.17.0",
78
+ "zod": "^4.4.3"
69
79
  },
70
80
  "devDependencies": {
71
- "@antfu/eslint-config": "^9.0.0",
72
81
  "@resvg/resvg-js": "^2.6.2",
73
82
  "@types/bun": "latest",
74
- "@types/node": "^25.9.3",
83
+ "@types/node": "^26.0.0",
84
+ "@types/react": "^19.2.17",
85
+ "@types/react-dom": "^19.2.3",
75
86
  "@types/ssh2": "^1.15.5",
76
87
  "@types/update-notifier": "^6.0.8",
77
88
  "bunup": "^0.16.32",
78
- "eslint": "^10.5.0",
79
- "eslint-plugin-format": "^2.0.1",
80
89
  "prettier": "^3.8.4",
81
- "release-it": "^20.2.0"
90
+ "react": "^19.2.7",
91
+ "react-dom": "^19.2.7",
92
+ "release-it": "^20.2.0",
93
+ "vite": "npm:@voidzero-dev/vite-plus-core@latest",
94
+ "vite-plus": "latest"
82
95
  },
83
96
  "peerDependencies": {
84
- "typescript": "^5.7.3"
97
+ "typescript": "^6.0.3"
85
98
  },
86
- "dependencies": {
87
- "@modelcontextprotocol/sdk": "^1.29.0",
88
- "ssh2": "^1.17.0",
89
- "zod": "^4.4.3"
99
+ "overrides": {
100
+ "vite": "npm:@voidzero-dev/vite-plus-core@latest",
101
+ "vitest": "4.1.9"
102
+ },
103
+ "engines": {
104
+ "bun": ">=1.3.0"
90
105
  },
91
106
  "packageManager": "bun@1.3.14",
92
107
  "changelog": {
@@ -101,7 +116,5 @@
101
116
  "breaking change": "Breaking changes"
102
117
  }
103
118
  },
104
- "publishConfig": {
105
- "access": "public"
106
- }
119
+ "logo": "https://raw.githubusercontent.com/ali-master/mikrotik-mcp/main/assets/logo.svg"
107
120
  }
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 466 tools: `name`, `risk`, `title`, `description`, and input JSON Schema. |
10
+ | `tool-catalog.json` | Every one of the 649 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:
@@ -57,13 +57,7 @@
57
57
  "type": "string"
58
58
  }
59
59
  },
60
- "required": [
61
- "host",
62
- "username",
63
- "password",
64
- "port",
65
- "timeoutMs"
66
- ],
60
+ "required": ["host", "username", "password", "port", "timeoutMs"],
67
61
  "additionalProperties": false
68
62
  }
69
63
  },
@@ -77,18 +71,15 @@
77
71
  "host": "0.0.0.0",
78
72
  "port": 8000,
79
73
  "allowedHosts": "",
80
- "allowedOrigins": ""
74
+ "allowedOrigins": "",
75
+ "corsOrigins": ""
81
76
  },
82
77
  "type": "object",
83
78
  "properties": {
84
79
  "transport": {
85
80
  "default": "stdio",
86
81
  "type": "string",
87
- "enum": [
88
- "stdio",
89
- "sse",
90
- "streamable-http"
91
- ]
82
+ "enum": ["stdio", "sse", "streamable-http"]
92
83
  },
93
84
  "host": {
94
85
  "default": "0.0.0.0",
@@ -107,22 +98,122 @@
107
98
  "allowedOrigins": {
108
99
  "default": "",
109
100
  "type": "string"
101
+ },
102
+ "corsOrigins": {
103
+ "default": "",
104
+ "type": "string"
105
+ }
106
+ },
107
+ "required": ["transport", "host", "port", "allowedHosts", "allowedOrigins", "corsOrigins"],
108
+ "additionalProperties": false
109
+ },
110
+ "s3": {
111
+ "type": "object",
112
+ "properties": {
113
+ "accessKeyId": {
114
+ "type": "string"
115
+ },
116
+ "secretAccessKey": {
117
+ "type": "string"
118
+ },
119
+ "sessionToken": {
120
+ "type": "string"
121
+ },
122
+ "region": {
123
+ "type": "string"
124
+ },
125
+ "endpoint": {
126
+ "type": "string"
127
+ },
128
+ "bucket": {
129
+ "type": "string"
130
+ },
131
+ "prefix": {
132
+ "default": "",
133
+ "type": "string"
134
+ },
135
+ "presignExpiresIn": {
136
+ "default": 3600,
137
+ "type": "integer",
138
+ "exclusiveMinimum": 0,
139
+ "maximum": 9007199254740991
140
+ }
141
+ },
142
+ "required": ["prefix", "presignExpiresIn"],
143
+ "additionalProperties": false
144
+ },
145
+ "dashboard": {
146
+ "default": {
147
+ "enabled": false,
148
+ "host": "0.0.0.0",
149
+ "port": 9090,
150
+ "dbPath": "./.mikrotik-mcp/events.db",
151
+ "maxEvents": 100000,
152
+ "captureBody": true,
153
+ "redactInput": false,
154
+ "maxBodyBytes": 16384
155
+ },
156
+ "type": "object",
157
+ "properties": {
158
+ "enabled": {
159
+ "default": false,
160
+ "type": "boolean"
161
+ },
162
+ "host": {
163
+ "default": "127.0.0.1",
164
+ "type": "string"
165
+ },
166
+ "port": {
167
+ "default": 9090,
168
+ "type": "integer",
169
+ "exclusiveMinimum": 0,
170
+ "maximum": 9007199254740991
171
+ },
172
+ "dbPath": {
173
+ "default": "./.mikrotik-mcp/events.db",
174
+ "type": "string"
175
+ },
176
+ "maxEvents": {
177
+ "default": 100000,
178
+ "type": "integer",
179
+ "exclusiveMinimum": 0,
180
+ "maximum": 9007199254740991
181
+ },
182
+ "captureBody": {
183
+ "default": true,
184
+ "type": "boolean"
185
+ },
186
+ "redactInput": {
187
+ "default": false,
188
+ "type": "boolean"
189
+ },
190
+ "maxBodyBytes": {
191
+ "default": 16384,
192
+ "type": "integer",
193
+ "minimum": 0,
194
+ "maximum": 9007199254740991
195
+ },
196
+ "token": {
197
+ "type": "string"
110
198
  }
111
199
  },
112
200
  "required": [
113
- "transport",
201
+ "enabled",
114
202
  "host",
115
203
  "port",
116
- "allowedHosts",
117
- "allowedOrigins"
204
+ "dbPath",
205
+ "maxEvents",
206
+ "captureBody",
207
+ "redactInput",
208
+ "maxBodyBytes"
118
209
  ],
119
210
  "additionalProperties": false
211
+ },
212
+ "readOnly": {
213
+ "default": false,
214
+ "type": "boolean"
120
215
  }
121
216
  },
122
- "required": [
123
- "devices",
124
- "defaultDevice",
125
- "mcp"
126
- ],
217
+ "required": ["devices", "defaultDevice", "mcp", "dashboard", "readOnly"],
127
218
  "additionalProperties": false
128
219
  }