@usex/mikrotik-mcp 1.0.0 → 2.1.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/README.md +23 -8
- package/dist/cli.js +8571 -2330
- package/dist/index.d.ts +42 -2
- package/dist/index.js +7798 -2226
- package/dist/ui/dashboard.html +19 -0
- package/dist/ui/firewall.html +20 -0
- package/dist/ui/interfaces.html +20 -0
- package/dist/ui/observability.html +27 -0
- package/dist/ui/records.html +20 -0
- package/package.json +63 -50
- package/schemas/README.md +1 -1
- package/schemas/config.schema.json +112 -21
- package/schemas/tool-catalog.json +11783 -5555
- package/schemas/tools/add_dot1x_client.json +42 -0
- package/schemas/tools/add_dot1x_server.json +60 -0
- package/schemas/tools/add_graphing_interface.json +23 -0
- package/schemas/tools/add_graphing_queue.json +22 -0
- package/schemas/tools/add_graphing_resource.json +14 -0
- package/schemas/tools/add_ipv6_address.json +43 -0
- package/schemas/tools/add_ipv6_address_list_entry.json +32 -0
- package/schemas/tools/add_ipv6_default_route.json +34 -0
- package/schemas/tools/add_ipv6_dhcp_binding.json +42 -0
- package/schemas/tools/add_ipv6_dhcp_client.json +69 -0
- package/schemas/tools/add_ipv6_dhcp_option.json +29 -0
- package/schemas/tools/add_ipv6_dhcp_relay.json +35 -0
- package/schemas/tools/add_ipv6_nd.json +68 -0
- package/schemas/tools/add_ipv6_nd_prefix.json +35 -0
- package/schemas/tools/add_ipv6_route.json +64 -0
- package/schemas/tools/add_romon_port.json +34 -0
- package/schemas/tools/add_switch_port_isolation.json +23 -0
- package/schemas/tools/add_switch_rule.json +96 -0
- package/schemas/tools/add_traffic_generator_port.json +23 -0
- package/schemas/tools/add_traffic_generator_stream.json +39 -0
- package/schemas/tools/add_traffic_monitor.json +54 -0
- package/schemas/tools/create_ipv6_dhcp_server.json +60 -0
- package/schemas/tools/create_ipv6_filter_rule.json +103 -0
- package/schemas/tools/create_ipv6_mangle_rule.json +110 -0
- package/schemas/tools/create_ipv6_nat_rule.json +88 -0
- package/schemas/tools/create_ipv6_pool.json +29 -0
- package/schemas/tools/create_ipv6_raw_rule.json +78 -0
- package/schemas/tools/delete_s3_backup.json +15 -0
- package/schemas/tools/disable_ipv6_address_list_entry.json +15 -0
- package/schemas/tools/disable_ipv6_dhcp_relay.json +14 -0
- package/schemas/tools/disable_ipv6_filter_rule.json +14 -0
- package/schemas/tools/disable_ipv6_mangle_rule.json +14 -0
- package/schemas/tools/disable_ipv6_nat_rule.json +14 -0
- package/schemas/tools/disable_ipv6_raw_rule.json +14 -0
- package/schemas/tools/disable_ipv6_route.json +14 -0
- package/schemas/tools/disable_switch_rule.json +14 -0
- package/schemas/tools/disable_traffic_monitor.json +14 -0
- package/schemas/tools/download_backup_from_s3.json +25 -0
- package/schemas/tools/enable_ipv6_address_list_entry.json +15 -0
- package/schemas/tools/enable_ipv6_dhcp_relay.json +14 -0
- package/schemas/tools/enable_ipv6_filter_rule.json +14 -0
- package/schemas/tools/enable_ipv6_mangle_rule.json +14 -0
- package/schemas/tools/enable_ipv6_nat_rule.json +14 -0
- package/schemas/tools/enable_ipv6_raw_rule.json +14 -0
- package/schemas/tools/enable_ipv6_route.json +14 -0
- package/schemas/tools/enable_switch_rule.json +14 -0
- package/schemas/tools/enable_traffic_monitor.json +14 -0
- package/schemas/tools/flood_ping.json +37 -0
- package/schemas/tools/get_bandwidth_server.json +7 -0
- package/schemas/tools/get_dot1x_client.json +15 -0
- package/schemas/tools/get_dot1x_server.json +15 -0
- package/schemas/tools/get_ipv6_address.json +15 -0
- package/schemas/tools/get_ipv6_address_list_entry.json +15 -0
- package/schemas/tools/get_ipv6_dhcp_client.json +15 -0
- package/schemas/tools/get_ipv6_dhcp_relay.json +14 -0
- package/schemas/tools/get_ipv6_dhcp_server.json +14 -0
- package/schemas/tools/get_ipv6_filter_rule.json +15 -0
- package/schemas/tools/get_ipv6_mangle_rule.json +15 -0
- package/schemas/tools/get_ipv6_nat_rule.json +15 -0
- package/schemas/tools/get_ipv6_nd.json +15 -0
- package/schemas/tools/get_ipv6_neighbor.json +15 -0
- package/schemas/tools/get_ipv6_pool.json +14 -0
- package/schemas/tools/get_ipv6_raw_rule.json +15 -0
- package/schemas/tools/get_ipv6_route.json +15 -0
- package/schemas/tools/get_ipv6_settings.json +7 -0
- package/schemas/tools/get_mac_ping.json +7 -0
- package/schemas/tools/get_mac_server.json +7 -0
- package/schemas/tools/get_mac_winbox.json +7 -0
- package/schemas/tools/get_queue_interface.json +15 -0
- package/schemas/tools/get_romon.json +7 -0
- package/schemas/tools/get_sms_settings.json +7 -0
- package/schemas/tools/get_sniffer_settings.json +7 -0
- package/schemas/tools/get_switch.json +15 -0
- package/schemas/tools/get_switch_port.json +15 -0
- package/schemas/tools/get_switch_port_isolation.json +15 -0
- package/schemas/tools/get_switch_rule.json +15 -0
- package/schemas/tools/get_traffic_monitor.json +14 -0
- package/schemas/tools/ip_scan.json +26 -0
- package/schemas/tools/list_bandwidth_server_sessions.json +12 -0
- package/schemas/tools/list_dot1x_clients.json +22 -0
- package/schemas/tools/list_dot1x_servers.json +18 -0
- package/schemas/tools/list_graphing.json +20 -0
- package/schemas/tools/list_ipv6_address_lists.json +24 -0
- package/schemas/tools/list_ipv6_addresses.json +31 -0
- package/schemas/tools/list_ipv6_dhcp_bindings.json +21 -0
- package/schemas/tools/list_ipv6_dhcp_clients.json +27 -0
- package/schemas/tools/list_ipv6_dhcp_options.json +11 -0
- package/schemas/tools/list_ipv6_dhcp_relays.json +21 -0
- package/schemas/tools/list_ipv6_dhcp_servers.json +26 -0
- package/schemas/tools/list_ipv6_filter_rules.json +43 -0
- package/schemas/tools/list_ipv6_mangle_rules.json +37 -0
- package/schemas/tools/list_ipv6_nat_rules.json +37 -0
- package/schemas/tools/list_ipv6_nd.json +18 -0
- package/schemas/tools/list_ipv6_nd_prefixes.json +21 -0
- package/schemas/tools/list_ipv6_neighbors.json +29 -0
- package/schemas/tools/list_ipv6_pool_used.json +12 -0
- package/schemas/tools/list_ipv6_pools.json +14 -0
- package/schemas/tools/list_ipv6_raw_rules.json +37 -0
- package/schemas/tools/list_ipv6_routes.json +34 -0
- package/schemas/tools/list_mac_server_sessions.json +11 -0
- package/schemas/tools/list_queue_interfaces.json +16 -0
- package/schemas/tools/list_romon_ports.json +11 -0
- package/schemas/tools/list_s3_backups.json +22 -0
- package/schemas/tools/list_sms_inbox.json +12 -0
- package/schemas/tools/list_sniffer_connections.json +7 -0
- package/schemas/tools/list_sniffer_hosts.json +11 -0
- package/schemas/tools/list_sniffer_packets.json +15 -0
- package/schemas/tools/list_sniffer_protocols.json +7 -0
- package/schemas/tools/list_switch_port_isolation.json +12 -0
- package/schemas/tools/list_switch_ports.json +16 -0
- package/schemas/tools/list_switch_rules.json +21 -0
- package/schemas/tools/list_switches.json +16 -0
- package/schemas/tools/list_traffic_generator_ports.json +11 -0
- package/schemas/tools/list_traffic_generator_streams.json +14 -0
- package/schemas/tools/list_traffic_monitors.json +21 -0
- package/schemas/tools/move_ipv6_filter_rule.json +21 -0
- package/schemas/tools/move_ipv6_mangle_rule.json +21 -0
- package/schemas/tools/move_ipv6_nat_rule.json +21 -0
- package/schemas/tools/move_ipv6_raw_rule.json +21 -0
- package/schemas/tools/profile_cpu.json +22 -0
- package/schemas/tools/release_ipv6_dhcp_client.json +14 -0
- package/schemas/tools/remove_dot1x_client.json +15 -0
- package/schemas/tools/remove_dot1x_server.json +15 -0
- package/schemas/tools/remove_graphing.json +24 -0
- package/schemas/tools/remove_ipv6_address.json +14 -0
- package/schemas/tools/remove_ipv6_address_list_entry.json +15 -0
- package/schemas/tools/remove_ipv6_dhcp_binding.json +15 -0
- package/schemas/tools/remove_ipv6_dhcp_client.json +14 -0
- package/schemas/tools/remove_ipv6_dhcp_option.json +14 -0
- package/schemas/tools/remove_ipv6_dhcp_relay.json +14 -0
- package/schemas/tools/remove_ipv6_dhcp_server.json +14 -0
- package/schemas/tools/remove_ipv6_filter_rule.json +14 -0
- package/schemas/tools/remove_ipv6_mangle_rule.json +14 -0
- package/schemas/tools/remove_ipv6_nat_rule.json +14 -0
- package/schemas/tools/remove_ipv6_nd.json +15 -0
- package/schemas/tools/remove_ipv6_nd_prefix.json +15 -0
- package/schemas/tools/remove_ipv6_neighbor.json +15 -0
- package/schemas/tools/remove_ipv6_pool.json +14 -0
- package/schemas/tools/remove_ipv6_raw_rule.json +14 -0
- package/schemas/tools/remove_ipv6_route.json +15 -0
- package/schemas/tools/remove_romon_port.json +15 -0
- package/schemas/tools/remove_switch_port_isolation.json +15 -0
- package/schemas/tools/remove_switch_rule.json +14 -0
- package/schemas/tools/remove_traffic_generator_port.json +15 -0
- package/schemas/tools/remove_traffic_generator_stream.json +15 -0
- package/schemas/tools/remove_traffic_monitor.json +14 -0
- package/schemas/tools/renew_ipv6_dhcp_client.json +14 -0
- package/schemas/tools/s3_backup_info.json +15 -0
- package/schemas/tools/s3_backup_status.json +7 -0
- package/schemas/tools/save_sniffer.json +15 -0
- package/schemas/tools/send_sms.json +34 -0
- package/schemas/tools/show_firewall_filter.json +7 -0
- package/schemas/tools/show_interfaces.json +7 -0
- package/schemas/tools/show_system_dashboard.json +7 -0
- package/schemas/tools/speed_test.json +47 -0
- package/schemas/tools/start_sniffer.json +7 -0
- package/schemas/tools/start_traffic_generator.json +14 -0
- package/schemas/tools/stop_sniffer.json +7 -0
- package/schemas/tools/stop_traffic_generator.json +7 -0
- package/schemas/tools/update_bandwidth_server.json +24 -0
- package/schemas/tools/update_dot1x_client.json +36 -0
- package/schemas/tools/update_dot1x_server.json +54 -0
- package/schemas/tools/update_ipv6_filter_rule.json +77 -0
- package/schemas/tools/update_ipv6_mangle_rule.json +80 -0
- package/schemas/tools/update_ipv6_nat_rule.json +65 -0
- package/schemas/tools/update_ipv6_nd.json +64 -0
- package/schemas/tools/update_ipv6_pool.json +28 -0
- package/schemas/tools/update_ipv6_raw_rule.json +59 -0
- package/schemas/tools/update_ipv6_settings.json +35 -0
- package/schemas/tools/update_mac_ping.json +15 -0
- package/schemas/tools/update_mac_server.json +15 -0
- package/schemas/tools/update_mac_winbox.json +15 -0
- package/schemas/tools/update_queue_interface.json +20 -0
- package/schemas/tools/update_romon.json +19 -0
- package/schemas/tools/update_sms_settings.json +30 -0
- package/schemas/tools/update_sniffer_settings.json +39 -0
- package/schemas/tools/update_switch.json +34 -0
- package/schemas/tools/update_switch_port.json +39 -0
- package/schemas/tools/update_switch_port_isolation.json +22 -0
- package/schemas/tools/update_switch_rule.json +83 -0
- package/schemas/tools/update_traffic_monitor.json +46 -0
- package/schemas/tools/upload_backup_to_s3.json +25 -0
- 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
|
|
3
|
+
"version": "2.1.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
|
-
"
|
|
34
|
-
"
|
|
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
|
-
"
|
|
42
|
-
"
|
|
27
|
+
"bin": {
|
|
28
|
+
"mikrotik-mcp": "dist/cli.js"
|
|
43
29
|
},
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
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": "
|
|
63
|
+
"test": "vp test run",
|
|
64
|
+
"test:watch": "vp test",
|
|
64
65
|
"release": "release-it",
|
|
65
66
|
"test:types": "tsc --noEmit",
|
|
66
|
-
"
|
|
67
|
-
"lint": "
|
|
68
|
-
"lint: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": "^
|
|
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
|
-
"
|
|
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": "^
|
|
97
|
+
"typescript": "^6.0.3"
|
|
85
98
|
},
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
201
|
+
"enabled",
|
|
114
202
|
"host",
|
|
115
203
|
"port",
|
|
116
|
-
"
|
|
117
|
-
"
|
|
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
|
}
|