Skip to main content
Glama
README.md
<div align="center">

<img src="docs/mikroclaw-banner.png" alt="MikroCLAW โ€” MikroTik + CLAW (Claude): MCP server + Pulse dashboard" width="100%">

# ๐Ÿฆ… MikroCLAW

### **Mikro**Tik + **CLAW** (Claude) โ€” kendalikan RouterOS dari percakapan Claude Code

**MCP server yang membuat Claude Code bisa mengakses, memonitor, dan mengelola perangkat MikroTik RouterOS lewat tool ber-skema โ€” plus dashboard monitoring live "Pulse".**

[![Versi](https://img.shields.io/badge/versi-v1.7.0-6c4cf0?style=flat-square)](#riwayat-versi)
[![Lisensi](https://img.shields.io/badge/lisensi-Apache--2.0-1f9d55?style=flat-square)](LICENSE)
[![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?style=flat-square&logo=python&logoColor=white)](#prasyarat)
[![RouterOS](https://img.shields.io/badge/RouterOS-v7.1%2B-293239?style=flat-square&logo=mikrotik&logoColor=white)](#kompatibilitas-routeros-v6-vs-v7)
[![MCP](https://img.shields.io/badge/protokol-MCP-d97757?style=flat-square)](https://modelcontextprotocol.io)
[![Tools](https://img.shields.io/badge/tools-93%20(71%20read%20%2B%2022%20write)-0a7ea4?style=flat-square)](#daftar-tool)
[![Skills](https://img.shields.io/badge/agent%20skills-7-8b5cf6?style=flat-square)](#skills-playbook-orkestrasi)
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-555?style=flat-square)](#instalasi)
[![Read-only default](https://img.shields.io/badge/default-read--only-2ea043?style=flat-square&logo=shieldsdotio&logoColor=white)](#keamanan)
[![Bahasa](https://img.shields.io/badge/bahasa-Indonesia-e11d48?style=flat-square)](#)

</div>

MikroCLAW menjembatani Claude Code dengan RouterOS melalui **REST API RouterOS v7**
(HTTPS). Alih-alih Anda mengetik perintah `curl`/`ssh` manual, Claude memanggil
tool seperti `dhcp_leases` atau `firewall_filter_rules` sebagai pemanggilan ber-skema
โ€” aman, terstruktur, dan kredensial tidak pernah bocor ke jendela chat.

> *"Siapa saja klien DHCP yang aktif?"* ยท *"Interface mana yang down?"* ยท *"Blokir IP 10.0.0.5."*
> โ€” cukup ketik dalam bahasa biasa, Claude memanggil tool yang tepat.

### โœจ Kenapa MikroCLAW?

| | |
|---|---|
| ๐Ÿ”’ **Read-only secara default** | Aman untuk eksplorasi & monitoring tanpa risiko mengubah konfigurasi. |
| ๐Ÿšง **Operasi write digerbang** | Setiap tool yang mengubah config dikunci flag `MIKROCLAW_ALLOW_WRITE`. |
| ๐Ÿ”‘ **Kredensial via `.env`** | Tidak pernah muncul di chat, tidak ikut ter-commit. |
| ๐Ÿงฉ **100 tool ber-skema** | 78 read + 22 write, termasuk lima fitur cerdas (Twin/Sentinel/Chronicle/Replay/Concierge), `detect_roles`, & `rest_get`/`rest_write` generic untuk path apa pun. |
| ๐Ÿง  **12 Agent Skills** | Playbook siap pakai: health-check, audit firewall, audit keamanan, overview jaringan, troubleshoot, backup-snapshot, deteksi-peran + 5 fitur cerdas baru. |
| ๐Ÿค– **5 fitur cerdas AI** | **Twin** (simulator what-if paket), **Sentinel** (deteksi botnet/IoT terinfeksi tanpa signature), **Chronicle** (mesin waktu konfigurasi + deteksi intrusi), **Replay** (RCA retrospektif "kenapa tadi lemot"), **Concierge** (laporan bisnis RT-RW net). |
| ๐Ÿ“Ÿ **MikroCLAW Pulse** | Dashboard web monitoring **live per-detik** (read-only, via Server-Sent Events). |
| โš™๏ธ **Installer satu-baris** | Windows (PowerShell) & macOS/Linux (bash) โ€” pasang `uv`, dependency, `.env`, daftar MCP. |
| ๐ŸŒ **Tanpa lock-in v7** | RouterOS v6 cukup ganti lapis transport ke API biner; daftar tool tetap. |

**Versi terkini: `v1.7.0`** ยท Python 3.10+ ยท RouterOS v7.1+ ยท Lisensi Apache-2.0.

> ๐Ÿ“š **Dokumen lain:** [`docs/FITUR.md`](docs/FITUR.md) (ikhtisar fitur ringkas) ยท
> [`MANUAL_BOOK.md`](MANUAL_BOOK.md) (panduan tutorial langkah demi langkah).

---

## Daftar Isi

1. [Bagaimana Claude Code mengakses MikroTik](#bagaimana-claude-code-mengakses-mikrotik)
2. [Prasyarat](#prasyarat)
3. [Persiapan RouterOS](#persiapan-routeros)
4. [Instalasi](#instalasi)
5. [Konfigurasi (.env)](#konfigurasi-env)
6. [Menghubungkan ke Claude Code](#menghubungkan-ke-claude-code)
7. [Daftar tool](#daftar-tool)
8. [Skills (playbook orkestrasi)](#skills-playbook-orkestrasi)
9. [MikroCLAW Pulse โ€” monitoring live](#mikroclaw-pulse--dashboard-monitoring-live)
10. [Contoh penggunaan](#contoh-penggunaan)
11. [Uji manual tanpa Claude](#uji-manual-tanpa-claude)
12. [Keamanan](#keamanan)
13. [Troubleshooting](#troubleshooting)
14. [Kompatibilitas RouterOS v6 vs v7](#kompatibilitas-routeros-v6-vs-v7)
15. [Struktur proyek](#struktur-proyek)
16. [Pengembangan: menambah tool](#pengembangan-menambah-tool)
17. [Riwayat versi](#riwayat-versi)
18. [Lisensi](#lisensi)

---

## Bagaimana Claude Code mengakses MikroTik

Claude Code tidak punya driver MikroTik bawaan. MikroCLAW berperan sebagai
**MCP server** (Model Context Protocol): proses lokal yang mengekspos sekumpulan
*tool*. Claude Code memanggil tool itu; MikroCLAW menerjemahkannya menjadi
panggilan REST API ke RouterOS, lalu mengembalikan JSON hasilnya.

```mermaid
flowchart LR
    subgraph local["๐Ÿ’ป Mesin Anda (lokal)"]
        CC["Claude Code<br/>(CLI ยท IDE ยท Web)"]
        MC["๐Ÿฆ… MikroCLAW<br/>MCP server + Pulse"]
        ENV[(".env<br/>host ยท user ยท pass")]
    end
    ROS["๐Ÿ“ก RouterOS<br/>(MikroTik v7)"]
    BROWSER["๐ŸŒ Browser<br/>(Pulse dashboard)"]

    CC -- "panggil tool (stdio MCP)" --> MC
    MC -- "hasil JSON" --> CC
    MC -- "HTTPS /rest/... (REST API v7)" --> ROS
    ROS -- "JSON" --> MC
    ENV -. "dibaca saat start" .-> MC
    BROWSER -- "SSE live per-detik" --> MC

    classDef box fill:#10182a,stroke:#1f2d44,color:#e6edf3;
    class CC,MC,ROS,BROWSER box;
```

**Alurnya** (mis. *"siapa saja klien DHCP yang aktif?"*):

```mermaid
sequenceDiagram
    autonumber
    participant U as ๐Ÿ‘ค Anda
    participant C as Claude Code
    participant M as ๐Ÿฆ… MikroCLAW
    participant R as ๐Ÿ“ก RouterOS
    U->>C: "siapa klien DHCP yang aktif?"
    C->>M: panggil tool dhcp_leases (MCP/stdio)
    M->>R: GET /rest/ip/dhcp-server/lease (Basic Auth dari .env)
    R-->>M: JSON daftar lease
    M-->>C: hasil terstruktur
    C-->>U: ringkasan klien DHCP
```

**Rinciannya:**

1. Anda menulis prompt biasa, mis. *"siapa saja klien DHCP yang aktif?"*.
2. Claude Code memilih tool `dhcp_leases` dan memanggilnya lewat protokol MCP (stdio).
3. MikroCLAW (`client.py`) mengirim `GET https://<router>/rest/ip/dhcp-server/lease`
   dengan Basic Auth dari `.env`.
4. RouterOS membalas JSON; MikroCLAW meneruskannya ke Claude.
5. Claude meringkas/menyajikan hasil untuk Anda.

RouterOS REST memetakan path konsol ke URL secara langsung, contoh:

| Perintah konsol RouterOS | Operasi REST |
|---|---|
| `/interface print` | `GET /rest/interface` |
| `/ip address print` | `GET /rest/ip/address` |
| tambah item | `PUT /rest/<path>` (+ body JSON) |
| ubah item ber-`.id` | `PATCH /rest/<path>/<id>` |
| hapus item ber-`.id` | `DELETE /rest/<path>/<id>` |
| command (ping, dst.) | `POST /rest/<path>` |

---

## Prasyarat

| Komponen | Versi | Catatan |
|---|---|---|
| **RouterOS** | **v7.1+** | REST API hanya ada di v7. Untuk v6 lihat [kompatibilitas](#kompatibilitas-routeros-v6-vs-v7). |
| **Python** | 3.10+ | Diuji pada 3.14. |
| **uv** | terbaru | Pengelola environment/dependency โ€” https://docs.astral.sh/uv/ |
| Akses jaringan | โ€” | Host yang menjalankan MikroCLAW harus bisa menjangkau port 443/80 router. |

---

## Persiapan RouterOS

Lakukan sekali di router. Disarankan **HTTPS** + **user least-privilege**.

```routeros
# 1) (HTTPS) Aktifkan service www-ssl dengan sertifikat yang sudah ada di /certificate.
#    Jika belum punya sertifikat, buat self-signed dulu (lihat di bawah).
/ip/service/set www-ssl certificate=<nama-sertifikat> disabled=no

#    Alternatif cepat (kurang aman): pakai HTTP biasa.
#    /ip/service/set www disabled=no

# 2) Buat user khusus MikroCLAW โ€” JANGAN pakai 'admin' penuh.
/user/add name=mikroclaw password=<password-kuat> group=read     ;# read-only
#    Untuk mengizinkan operasi write, gunakan group=write atau policy kustom.

# 3) Batasi sumber yang boleh mengakses service (mis. hanya subnet LAN/host admin).
/ip/service/set www-ssl address=192.168.88.0/24
```

Membuat sertifikat self-signed (jika belum ada):

```routeros
/certificate/add name=mikroclaw-ca common-name=mikroclaw-ca key-usage=key-cert-sign,crl-sign
/certificate/sign mikroclaw-ca
/certificate/add name=mikroclaw-https common-name=<ip-atau-hostname-router>
/certificate/sign mikroclaw-https ca=mikroclaw-ca
/ip/service/set www-ssl certificate=mikroclaw-https disabled=no
```

> Karena sertifikat self-signed, biarkan `MIKROTIK_VERIFY_TLS=false` di `.env`
> (default). Set `true` hanya jika memakai sertifikat yang tepercaya.

---

## Instalasi

Pilih jalur tercepat sesuai OS Anda โ€” installer mengurus `uv`, dependency, `.env`, dan registrasi MCP sekaligus:

| Jalur | OS | Kapan dipakai | Perintah |
|---|---|---|---|
| ๐Ÿš€ **Bootstrap 1-baris** | Windows | Belum punya repo, ingin clone + install sekaligus | `irm .../bootstrap.ps1 \| iex` |
| ๐Ÿš€ **Bootstrap 1-baris** | macOS / Linux | Belum punya repo, ingin clone + install sekaligus | `curl -LsSf .../bootstrap.sh \| bash` |
| ๐Ÿ› ๏ธ **Installer lokal** | Windows | Sudah punya repo | `.\install.ps1` (atau double-click `install.bat`) |
| ๐Ÿ› ๏ธ **Installer lokal** | macOS / Linux | Sudah punya repo | `./install.sh` |
| โœ‹ **Manual** | semua | Ingin kontrol penuh tiap langkah | `cp .env.example .env` lalu `uv sync` |

Detail tiap jalur di bawah.

### Windows (installer otomatis)

Installer memasang `uv`, dependency (termasuk Python via uv bila perlu),
menulis `.env` secara interaktif, dan mendaftarkan MCP server ke Claude Code.

**Opsi A โ€” satu baris (clone + install)** di PowerShell:

```powershell
irm https://raw.githubusercontent.com/Syamsuddin/MikroCLAW/main/bootstrap.ps1 | iex
```

**Opsi B โ€” sudah punya repo:** masuk folder MikroCLAW lalu **double-click
`install.bat`**, atau di PowerShell:

```powershell
.\install.ps1
```

Argumen berguna: `-MikrotikHost 192.168.88.1 -MikrotikUser mikroclaw`,
`-AllowWrite` (izinkan write), `-NonInteractive`, `-SkipMcpRegister`.
Lepas instalasi: `.\uninstall.ps1` (tambah `-RemoveEnv` / `-RemoveVenv`).

> Jika PowerShell memblokir skrip, jalankan lewat `install.bat` (sudah pakai
> `-ExecutionPolicy Bypass`) atau jalankan PowerShell sebagai:
> `powershell -ExecutionPolicy Bypass -File .\install.ps1`.

### macOS / Linux (installer otomatis)

Installer memasang `uv`, dependency (termasuk Python via uv bila perlu), menulis
`.env` (mode `600`), dan mendaftarkan MCP server ke Claude Code.

**Opsi A โ€” satu baris (clone + install):**

```bash
curl -LsSf https://raw.githubusercontent.com/Syamsuddin/MikroCLAW/main/bootstrap.sh | bash
```

**Opsi B โ€” sudah punya repo:**

```bash
cd /path/ke/MikroCLAW
./install.sh
```

Argumen berguna: `--host 192.168.88.1 --user mikroclaw`, `--allow-write`,
`--http`, `--non-interactive`, `--skip-mcp`.
Lepas instalasi: `./uninstall.sh` (tambah `--remove-env` / `--remove-venv`).

### Manual (Windows / macOS / Linux)

```bash
cd /path/ke/MikroCLAW
cp .env.example .env          # lalu isi host + kredensial router
uv sync                       # pasang dependency (mcp, httpx, python-dotenv)
```

`uv sync` membuat virtualenv `.venv/` dan menginstal proyek beserta dependensinya.

---

## Konfigurasi (.env)

Semua konfigurasi lewat environment / file `.env` (otomatis dibaca saat server start).

| Variabel | Wajib | Default | Keterangan |
|---|---|---|---|
| `MIKROTIK_HOST` | โœ… | โ€” | IP/hostname router, mis. `192.168.88.1`. |
| `MIKROTIK_USER` | โ€” | `admin` | User RouterOS (disarankan user khusus least-privilege). |
| `MIKROTIK_PASSWORD` | โ€” | *(kosong)* | Password user tersebut. |
| `MIKROTIK_USE_TLS` | โ€” | `true` | `true` โ†’ HTTPS (www-ssl), `false` โ†’ HTTP. |
| `MIKROTIK_PORT` | โ€” | `443`/`80` | Port REST. Default mengikuti `USE_TLS`. |
| `MIKROTIK_VERIFY_TLS` | โ€” | `false` | Verifikasi sertifikat TLS. `false` cocok untuk self-signed. |
| `MIKROTIK_TIMEOUT` | โ€” | `10` | Timeout request (detik). |
| `MIKROCLAW_ALLOW_WRITE` | โ€” | `false` | **Gerbang keamanan.** `true` mengaktifkan tool yang mengubah konfigurasi. |

Contoh `.env` minimal:

```dotenv
MIKROTIK_HOST=192.168.88.1
MIKROTIK_USER=mikroclaw
MIKROTIK_PASSWORD=rahasia-kuat
MIKROTIK_USE_TLS=true
MIKROTIK_VERIFY_TLS=false
MIKROCLAW_ALLOW_WRITE=false
```

---

## Menghubungkan ke Claude Code

File `.mcp.json` sudah disertakan (scope **project**), isinya:

```json
{
  "mcpServers": {
    "mikroclaw": {
      "command": "uv",
      "args": ["run", "--directory", "/Users/syams/PROJECTS/MikroCLAW", "mikroclaw"]
    }
  }
}
```

Server berjalan via **stdio**; kredensial diambil dari `.env` (bukan dari file
ini), jadi `.mcp.json` aman untuk di-commit.

Langkah di Claude Code:

```
/mcp        # cek server "mikroclaw" muncul & status connected
```

Saat pertama kali, Claude Code akan meminta persetujuan untuk menjalankan MCP
server project-scope โ€” setujui untuk mengaktifkannya.

> Ingin dipakai di **semua** proyek, bukan cuma folder ini? Daftarkan sebagai
> user-scope: `claude mcp add mikroclaw -s user -- uv run --directory /Users/syams/PROJECTS/MikroCLAW mikroclaw`

---

## Daftar tool

**100 tool** terbagi dua kelas: **READ** (selalu aktif) dan **WRITE** (digerbang flag).

```mermaid
pie showData
    title Distribusi 100 tool MikroCLAW
    "Read (selalu aktif)" : 78
    "Write (digerbang)" : 22
```

Cakupan domain READ (ringkas):

| Domain | Contoh tool |
|---|---|
| ๐Ÿ–ฅ๏ธ Sistem & perangkat | `system_resource`, `system_health`, `routerboard_info`, `system_packages`, `system_license` |
| ๐Ÿ”Œ Interface & L2 | `list_interfaces`, `ethernet_ports`, `bridge_ports`, `bridge_hosts`, `vlans` |
| ๐ŸŒ IP & routing | `list_ip_addresses`, `routing_table`, `arp_table`, `neighbors`, `dhcp_*` |
| ๐Ÿ›ก๏ธ Firewall & NAT | `firewall_filter_rules`, `firewall_nat_rules`, `firewall_mangle`, `address_lists`, `firewall_connections` |
| ๐Ÿ“ถ WiFi & CAPsMAN | `wifi_interfaces`, `wifi_registrations`, `wifi_radios`, `capsman_remote_caps` |
| ๐Ÿ” VPN & tunnel | `wireguard_*`, `ppp_active`, `ppp_secrets`, `ipsec_peers`, `ipsec_active_peers` |
| ๐Ÿ“ˆ QoS & bandwidth | `simple_queues`, `queue_tree`, `ppp_profiles`, `ip_pools` |
| ๐ŸŒ IPv6 | `ipv6_addresses`, `ipv6_routes`, `ipv6_firewall_filter`, `ipv6_neighbors` |
| ๐Ÿงญ Routing dinamis | `bgp_sessions`, `ospf_neighbors` |
| ๐Ÿ‘ฅ Hotspot & AAA | `hotspot_servers`, `hotspot_active`, `hotspot_users`, `radius_servers` |
| ๐Ÿ”Ž Keamanan & audit | `router_users`, `user_groups`, `active_sessions`, `certificates`, `ip_services` |
| ๐Ÿฉบ Diagnostik | `ping`, `traceroute`, `interface_traffic_live`, `recent_logs`, `netwatch`, `check_for_updates` |
| ๐Ÿงญ Deteksi peran | `detect_roles` (klasifikasikan fungsi router dari bukti konfigurasi) |
| ๐Ÿค– Fitur cerdas AI | `simulate_packet`, `simulate_firewall_change` (Twin) ยท `analyze_client_behavior` (Sentinel) ยท `config_snapshot`, `config_diff` (Chronicle) ยท `explain_incident` (Replay) ยท `business_report` (Concierge) |

### Read โ€” selalu aktif

| Tool | Parameter | Fungsi | REST |
|---|---|---|---|
| `system_resource` | โ€” | Versi RouterOS, CPU, memori, uptime, board, arsitektur. | `GET /system/resource` |
| `system_identity` | โ€” | Nama/identitas perangkat. | `GET /system/identity` |
| `list_interfaces` | โ€” | Semua interface + status running/disabled + statistik. | `GET /interface` |
| `list_ip_addresses` | โ€” | Alamat IP per interface. | `GET /ip/address` |
| `dhcp_leases` | โ€” | Klien DHCP yang mendapat IP dari router. | `GET /ip/dhcp-server/lease` |
| `arp_table` | โ€” | Pemetaan IP โ†” MAC yang terlihat router. | `GET /ip/arp` |
| `firewall_filter_rules` | โ€” | Aturan firewall filter (input/forward/output). | `GET /ip/firewall/filter` |
| `firewall_nat_rules` | โ€” | Aturan NAT (masquerade, port forward). | `GET /ip/firewall/nat` |
| `routing_table` | โ€” | Tabel routing IP (route aktif & statis). | `GET /ip/route` |
| `simple_queues` | โ€” | Simple queue โ€” pembatasan bandwidth per IP/target. | `GET /queue/simple` |
| `address_lists` | โ€” | Isi semua firewall address-list. | `GET /ip/firewall/address-list` |
| `dns_settings` | โ€” | Konfigurasi DNS: server upstream, cache, allow-remote. | `GET /ip/dns` |
| `dhcp_servers` | โ€” | DHCP server + interface & address-pool-nya. | `GET /ip/dhcp-server` |
| `ppp_active` | โ€” | Sesi PPP aktif (PPPoE/L2TP/PPTP/SSTP). | `GET /ppp/active` |
| `bridge_hosts` | โ€” | Tabel host bridge (MAC per port). | `GET /interface/bridge/host` |
| `neighbors` | โ€” | Tetangga terdeteksi (MNDP/CDP/LLDP). | `GET /ip/neighbor` |
| `system_health` | โ€” | Sensor HW: suhu, tegangan, kipas (jika ada). | `GET /system/health` |
| `netwatch` | โ€” | Host yang dipantau Netwatch + status up/down. | `GET /tool/netwatch` |
| `router_users` | โ€” | Daftar user RouterOS + grup/hak aksesnya. | `GET /user` |
| `wifi_interfaces` | โ€” | Interface WiFi (auto wifiwave2/legacy). | `GET /interface/wifi` โ†ป `/interface/wireless` |
| `wifi_registrations` | โ€” | Klien WiFi yang terhubung (auto wifiwave2/legacy). | `GET .../registration-table` |
| `wireguard_interfaces` | โ€” | Interface WireGuard (VPN) + public key & port. | `GET /interface/wireguard` |
| `wireguard_peers` | โ€” | Peer WireGuard + allowed-address & handshake. | `GET /interface/wireguard/peers` |
| `ppp_secrets` | โ€” | Akun PPP (PPPoE/VPN) โ€” name/service/profile. | `GET /ppp/secret` |
| `ip_pools` | โ€” | IP pool (rentang IP untuk DHCP/PPP). | `GET /ip/pool` |
| `dns_static` | โ€” | Entri DNS statis (A/CNAME) yang dilayani router. | `GET /ip/dns/static` |
| `ntp_client` | โ€” | Status & konfigurasi NTP client. | `GET /system/ntp/client` |
| `schedulers` | โ€” | Tugas terjadwal RouterOS. | `GET /system/scheduler` |
| `scripts` | โ€” | Script tersimpan di RouterOS. | `GET /system/script` |
| `vlans` | โ€” | Interface VLAN + vlan-id & interface induk. | `GET /interface/vlan` |
| `ip_services` | โ€” | Service IP (api/ssh/www/telnet/winbox) + port. | `GET /ip/service` |
| `dhcp_client` | โ€” | Status DHCP client (mis. IP WAN dari ISP). | `GET /ip/dhcp-client` |
| `ip_cloud` | โ€” | IP publik & DDNS MikroTik (remote access). | `GET /ip/cloud` |
| `system_packages` | โ€” | Paket RouterOS terpasang + status. | `GET /system/package` |
| `routerboard_info` | โ€” | Model, serial, firmware terpasang vs tersedia. | `GET /system/routerboard` |
| `active_sessions` | โ€” | User yang sedang login (audit keamanan). | `GET /user/active` |
| `list_files` | โ€” | File di router (backup/export) + ukuran & waktu. | `GET /file` |
| `firewall_connections` | โ€” | Connection tracking aktif (troubleshooting). | `GET /ip/firewall/connection` |
| `bridge_ports` | โ€” | Pemetaan port ke bridge. | `GET /interface/bridge/port` |
| `certificates` | โ€” | Sertifikat + masa berlaku (audit kedaluwarsa). | `GET /certificate` |
| `dns_cache` | โ€” | Isi cache DNS resolver router. | `GET /ip/dns/cache` |
| `dhcp_networks` | โ€” | Gateway/DNS/netmask yang ditawarkan DHCP. | `GET /ip/dhcp-server/network` |
| `firewall_mangle` | โ€” | Aturan mangle (marking QoS/policy routing). | `GET /ip/firewall/mangle` |
| `queue_tree` | โ€” | Queue tree (bandwidth hierarkis berbasis mark). | `GET /queue/tree` |
| `ppp_profiles` | โ€” | Profil PPP (rate-limit, pool, DNS). | `GET /ppp/profile` |
| `user_groups` | โ€” | Grup hak akses + policy (audit keamanan). | `GET /user/group` |
| `ethernet_ports` | โ€” | Detail port ethernet (link speed, auto-neg). | `GET /interface/ethernet` |
| `ipsec_peers` | โ€” | Konfigurasi peer IPsec. | `GET /ip/ipsec/peer` |
| `ipsec_active_peers` | โ€” | Tunnel IPsec yang sedang aktif. | `GET /ip/ipsec/active-peers` |
| `ipv6_addresses` | โ€” | Alamat IPv6 per interface. | `GET /ipv6/address` |
| `ipv6_routes` | โ€” | Tabel routing IPv6. | `GET /ipv6/route` |
| `ipv6_firewall_filter` | โ€” | Aturan firewall filter IPv6. | `GET /ipv6/firewall/filter` |
| `ipv6_neighbors` | โ€” | Tabel neighbor IPv6 (NDP). | `GET /ipv6/neighbor` |
| `hotspot_servers` | โ€” | Server hotspot + interface & profil. | `GET /ip/hotspot` |
| `hotspot_active` | โ€” | User hotspot yang sedang login. | `GET /ip/hotspot/active` |
| `hotspot_users` | โ€” | Akun user hotspot. | `GET /ip/hotspot/user` |
| `capsman_remote_caps` | โ€” | CAP/AP yang dikelola CAPsMAN (auto legacy/wifiwave2). | `GET /caps-man/remote-cap` โ†ป wifiwave2 |
| `capsman_registrations` | โ€” | Klien via CAPsMAN (auto legacy/wifiwave2). | `GET .../registration-table` |
| `wifi_radios` | โ€” | Radio WiFi fisik (wifiwave2). | `GET /interface/wifi/radio` |
| `bgp_sessions` | โ€” | Sesi BGP (v7). | `GET /routing/bgp/session` |
| `ospf_neighbors` | โ€” | Neighbor OSPF + state adjacency (v7). | `GET /routing/ospf/neighbor` |
| `radius_servers` | โ€” | Server RADIUS (AAA). | `GET /radius` |
| `system_history` | โ€” | Riwayat perubahan config (undo). | `GET /system/history` |
| `system_license` | โ€” | Info lisensi (level/CHR). | `GET /system/license` |
| `recent_logs` | `limit` (default 50) | Log terbaru RouterOS. | `GET /log` |
| `ping` | `address`, `count` (default 3) | Ping dari router ke sebuah alamat (diagnostik). | `POST /ping` |
| `traceroute` | `address`, `count` (default 3) | Traceroute (jejak hop) dari router. | `POST /tool/traceroute` |
| `interface_traffic_live` | `interface` | Satu sampel throughput real-time (rx/tx bps). | `POST /interface/monitor-traffic` |
| `check_for_updates` | โ€” | Cek update RouterOS (tidak mengubah config). | `POST /system/package/update/check-for-updates` |
| `detect_roles` | โ€” | **Deteksi peran perangkat** (gateway NAT, firewall, BGP/OSPF, switch/AP, BRAS, VPN, DHCP/DNS, QoS, dll) + bukti & keyakinan. | multi `GET` (introspeksi) |
| `simulate_packet` | `src`, `dst`, `protocol`, `dst_port`, โ€ฆ | **Twin** โ€” telusuri paket hipotetis menembus mangleโ†’dst-natโ†’routingโ†’filterโ†’src-nat di atas ruleset live; lapor verdict + jejak. | multi `GET` (model murni) |
| `simulate_firewall_change` | `src`, `dst`, `new_rule`, โ€ฆ | **Twin** โ€” uji dampak satu aturan firewall baru SEBELUM diterapkan (diff verdict). | multi `GET` (model murni) |
| `analyze_client_behavior` | `ip` (opsional) | **Sentinel** โ€” sidik-jari perilaku per-perangkat dari conntrack; deteksi botnet IoT/miner/scan tanpa signature, berkonteks kelas perangkat. | `GET /ip/firewall/connection` + lease/arp |
| `config_snapshot` | `label` | **Chronicle** โ€” simpan snapshot konfigurasi relevan-keamanan (ber-hash) ke disk lokal. | multi `GET` โ†’ file lokal |
| `config_diff` | `simpan` | **Chronicle** โ€” diff konfigurasi live vs snapshot terakhir + penilaian risiko (user baru, port mgmt dibuka, persistensi, dll). | multi `GET` โ†’ diff |
| `explain_incident` | `mulai_menit_lalu`, `selesai_menit_lalu` | **Replay** โ€” rekonstruksi telemetri jendela waktu lampau (riwayat Pulse) + anomali untuk RCA "kenapa tadi lemot". | file riwayat lokal |
| `business_report` | `plan_down_mbps`, `wan_interface`, โ€ฆ | **Concierge** โ€” terjemahkan telemetri jadi sinyal bisnis RT-RW net (pelanggan, akun nganggur, pencuri bandwidth, utilisasi WAN). | multi `GET` (ppp/hotspot/queue) |
| `rest_get` | `path` | **GET generic** ke path REST apa pun (read-only). | `GET /<path>` |

Contoh `rest_get` untuk hal yang belum punya tool khusus:
`ip/dns`, `ppp/active`, `interface/wireless`, `system/clock`, `queue/simple`.

### Write โ€” perlu `MIKROCLAW_ALLOW_WRITE=true`

Jika flag bernilai `false` (default), tool ini mengembalikan error dan **tidak**
menyentuh router.

| Tool | Parameter | Fungsi | REST |
|---|---|---|---|
| `set_interface_enabled` | `interface_id`, `enabled` | Aktif/nonaktifkan interface (by `.id` atau nama). | `PATCH /interface/<id>` |
| `add_firewall_drop` | `src_address`, `chain` (default `forward`), `comment` | Tambah aturan DROP untuk sumber tertentu. | `PUT /ip/firewall/filter` |
| `add_address_list_entry` | `address`, `address_list`, `comment`, `timeout` | Tambah IP/subnet ke firewall address-list. | `PUT /ip/firewall/address-list` |
| `delete_firewall_rule` | `rule_id` | Hapus satu aturan firewall filter by `.id`. | `DELETE /ip/firewall/filter/<id>` |
| `set_firewall_rule_enabled` | `rule_id`, `enabled` | Aktif/nonaktifkan satu aturan firewall by `.id`. | `PATCH /ip/firewall/filter/<id>` |
| `add_simple_queue` | `name`, `target`, `max_limit` | Tambah simple queue (batas bandwidth target). | `PUT /queue/simple` |
| `create_backup` | `name` (default `mikroclaw`) | Buat file backup konfigurasi (.backup) di router. | `POST /system/backup/save` |
| `reboot_router` | โ€” | Reboot router sekarang (mengganggu koneksi). | `POST /system/reboot` |
| `add_dns_static` | `name`, `address`, `ttl` | Tambah entri DNS statis (A record). | `PUT /ip/dns/static` |
| `add_ppp_secret` | `name`, `password`, `service`, `profile` | Tambah akun PPP (PPPoE/VPN). | `PUT /ppp/secret` |
| `add_wireguard_peer` | `interface`, `public_key`, `allowed_address`, `endpoint_address`, `endpoint_port` | Tambah peer WireGuard. | `PUT /interface/wireguard/peers` |
| `set_ip_service_enabled` | `service_id`, `enabled` | Aktif/nonaktifkan IP service (mis. matikan telnet). | `PATCH /ip/service/<id>` |
| `add_nat_rule` | `chain`, `action`, +opsional (`protocol`, `dst_port`, `to_addresses`, `to_ports`, dll) | Tambah NAT: port-forward (dstnat) / masquerade (srcnat). | `PUT /ip/firewall/nat` |
| `add_static_route` | `dst_address`, `gateway`, `distance`, `comment` | Tambah route statis (termasuk default route). | `PUT /ip/route` |
| `add_static_dhcp_lease` | `address`, `mac_address`, `server`, `comment` | Pin IP statis ke MAC (static lease). | `PUT /ip/dhcp-server/lease` |
| `assign_ip_address` | `address`, `interface`, `comment` | Pasang IP (CIDR) ke interface. | `PUT /ip/address` |
| `set_identity` | `name` | Ganti nama/identitas router. | `POST /system/identity/set` |
| `set_dns_servers` | `servers`, `allow_remote_requests` | Set DNS upstream router. | `POST /ip/dns/set` |
| `remove_address_list_entry` | `entry_id` | Hapus entri address-list by `.id`. | `DELETE /ip/firewall/address-list/<id>` |
| `add_hotspot_user` | `name`, `password`, `profile`, `comment` | Tambah akun user hotspot. | `PUT /ip/hotspot/user` |
| `add_ipv6_address` | `address`, `interface`, `comment` | Pasang alamat IPv6 ke interface. | `PUT /ipv6/address` |
| `rest_write` | `method` (PUT/PATCH/DELETE/POST), `path`, `body` | **Write generic** untuk operasi lanjutan. Gunakan hati-hati. | sesuai `method` |

---

## Skills (playbook orkestrasi)

Selain 100 tool atomik, MikroCLAW menyertakan **Agent Skills** di
[`.claude/skills/`](.claude/skills/) โ€” playbook yang mengoordinasikan banyak tool
menjadi alur kerja siap pakai. Claude Code memuatnya otomatis saat frasa pemicunya
muncul; bisa juga dipanggil eksplisit dengan `/<nama-skill>`.

| Skill | Fungsi | Pemicu contoh |
|---|---|---|
| `mikrotik-health-check` | Laporan kesehatan & maintenance (resource, suhu, firmware, update, WAN, NTP). | "cek kesehatan router", "ada update routeros?" |
| `mikrotik-firewall-audit` | Tinjau filter/NAT/mangle, address-list, koneksi; temuan + rekomendasi. | "audit firewall", "firewall monitoring" |
| `mikrotik-security-audit` | Hardening: service terbuka, user/grup, sesi, sertifikat, DNS, proteksi input. | "audit keamanan", "apakah router aman" |
| `mikrotik-network-overview` | Snapshot inventaris: WAN, subnet, interface/VLAN, routing, klien, tetangga. | "overview jaringan", "dokumentasi config" |
| `mikrotik-troubleshoot` | Diagnosa konektivitas berlapis (L1โ†’IPโ†’DNSโ†’firewall). | "internet mati", "tidak bisa browsing" |
| `mikrotik-backup-snapshot` | Backup biner + snapshot JSON konfigurasi kunci untuk diff/dokumentasi. | "backup mikrotik", "snapshot sebelum perubahan" |
| `mikrotik-role-detect` | Deteksi & jelaskan peran perangkat (gateway/firewall/BGP/AP/BRAS/VPN/โ€ฆ) beserta bukti & keyakinan. | "deteksi peran mikrotik", "router ini berfungsi sebagai apa" |
| `mikrotik-twin` ๐Ÿ†• | **Simulator what-if** โ€” telusuri nasib paket & uji aturan firewall baru sebelum diterapkan. | "kalau klien X akses Y lolos?", "simulasikan rule ini", "uji firewall sebelum pasang" |
| `mikrotik-sentinel` ๐Ÿ†• | **Deteksi perangkat terinfeksi** โ€” botnet IoT/miner/scan dari perilaku koneksi, tanpa signature. | "ada perangkat terinfeksi?", "cek botnet", "kenapa CCTV ini aneh" |
| `mikrotik-chronicle` ๐Ÿ†• | **Mesin waktu konfigurasi** โ€” snapshot + diff berisiko untuk deteksi perubahan/intrusi. | "apa yang berubah di config?", "deteksi perubahan tak terjadwal", "ada backdoor?" |
| `mikrotik-replay` ๐Ÿ†• | **RCA retrospektif** โ€” jelaskan insiden masa lampau dari riwayat telemetri. | "kenapa tadi sore lemot?", "internet sempat putus jam berapa" |
| `mikrotik-concierge` ๐Ÿ†• | **Laporan bisnis** โ€” pelanggan, akun nganggur, pencuri bandwidth, utilisasi WAN, kapan upgrade. | "laporan bisnis RT-RW net", "ada yang nyolong bandwidth?", "perlu upgrade paket?" |

Semua skill **read-only secara default**; remediasi yang mengubah konfigurasi selalu
meminta konfirmasi dan tetap butuh `MIKROCLAW_ALLOW_WRITE=true`.

## MikroCLAW Pulse โ€” dashboard monitoring live

Selain MCP server, MikroCLAW menyertakan **Pulse**: laman web monitoring yang
memperbarui indikator **per detik** lewat Server-Sent Events.

- **Fase 1 โ€” data plane:** **read-only**, tanpa dependency baru (memakai Starlette +
  uvicorn yang sudah ikut `mcp`). Memantau RouterOS bertingkat & menyusun state live.
- **Fase 2 โ€” lapis AI (opsional):** kartu **๐Ÿง  AI Analyst** menarasikan kondisi
  jaringan, mendeteksi anomali tanpa ambang tetap, mengkorelasikan akar masalah, dan
  menyarankan remediasi โ€” memanggil **Anthropic Messages API** langsung via `httpx`
  (tanpa SDK), output terstruktur lewat tool-use. **Tetap read-only** (hanya membaca
  snapshot). Aktif bila `ANTHROPIC_API_KEY` di-set; tanpa itu Pulse tetap jalan dan
  kartu AI menampilkan status "nonaktif".
- **Fase 3 โ€” AI proaktif:** **๐Ÿ”ฎ Prediksi tren deterministik** (regresi linear dari
  riwayat โ†’ tren %/jam + ETA mencapai ambang untuk CPU/memori/disk โ€” jalan **tanpa**
  API key), plus **โšก Remediasi 1-klik** yang diusulkan AI dan dieksekusi dari
  dashboard. Remediasi **di-gate ganda**: butuh `MIKROCLAW_ALLOW_WRITE=true` **dan**
  hanya aksi dari allowlist sempit (`blokir_ip`, `tambah_address_list`,
  `nonaktifkan_service`) yang persis diusulkan AI โ€” tiap aksi diberi komentar audit
  `added-by-pulse-ai`.

```bash
# memakai kredensial yang sama dari .env
uv run mikroclaw-web                 # atau:  python -m mikroclaw.web
# buka http://127.0.0.1:8800
```

**Arsitektur Pulse โ€” empat loop polling bertingkat โ†’ state in-memory โ†’ SSE โ†’ browser:**

```mermaid
flowchart LR
    subgraph poller["poller.py โ€” empat loop async"]
        F["โšก fast ยท 1 dtk<br/>resource ยท health ยท throughput"]
        M["๐Ÿ”„ mid ยท 5 dtk<br/>klien ยท firewall ยท queue"]
        S["๐Ÿข slow ยท 30 dtk<br/>WAN ยท service ยท sertifikat"]
        P["๐Ÿ“ก ping ยท 5 dtk<br/>RTT gateway & 8.8.8.8"]
    end
    ROS["๐Ÿ“ก RouterOS<br/>REST v7"]
    STATE[("๐Ÿง  state in-memory<br/>+ ring-buffer 60 dtk")]
    APP["app.py<br/>Starlette + SSE"]
    UI["๐ŸŒ index.html<br/>(vanilla JS, 0 dependency)"]

    ROS --> F & M & S & P
    F & M & S & P --> STATE
    STATE -- "snapshot tiap tick" --> APP
    APP -- "/api/stream (SSE)" --> UI

    classDef box fill:#10182a,stroke:#1f2d44,color:#e6edf3;
    class F,M,S,P,ROS,STATE,APP,UI box;
```

> ๐Ÿ’ก **Throughput** diturunkan dari **delta counter rx/tx `/interface`** (satu request untuk semua interface), bukan `monitor-traffic` per-interface โ€” jauh lebih ringan untuk router.

| ENV | Default | Keterangan |
|---|---|---|
| `MIKROCLAW_WEB_HOST` | `127.0.0.1` | Alamat bind. Set `0.0.0.0` untuk diakses dari LAN. |
| `MIKROCLAW_WEB_PORT` | `8800` | Port HTTP laman. |
| `ANTHROPIC_API_KEY` | *(kosong)* | **Mengaktifkan lapis AI (Fase 2).** Tanpa ini, kartu AI tampil "nonaktif". |
| `MIKROCLAW_AI_MODEL` | `claude-sonnet-4-6` | Model Claude untuk analisis. |
| `MIKROCLAW_AI_INTERVAL` | `60` | Detik antar-analisis otomatis. |
| `MIKROCLAW_AI_MAX_TOKENS` | `2048` | Batas token output analisis. |

**Yang ditampilkan (semua dari tool read yang ada):**

- **Vitals (1 dtk):** CPU, memori, disk, suhu/tegangan, jumlah klien, firewall
  drops/dtk, conntrack, sesi login, sertifikat terdekat kedaluwarsa.
- **WAN:** IP WAN/publik, DDNS, gateway, RTT ping gateway & `8.8.8.8`, sparkline
  download/upload 60 detik.
- **Interface matrix (1 dtk):** throughput rx/tx live (delta counter), status
  link, link-speed, error/drop.
- **Klien:** gabungan DHCP + PPPoE + hotspot + WiFi (sinyal), tebakan vendor dari
  OUI MAC, dan bandwidth per-klien bila ada simple queue yang cocok.
- **Service terbuka:** ditandai merah bila berisiko (telnet/ftp/www/api) tanpa
  batasan `address`.
- **Log Stream:** tail `/log` terbaru dengan pewarnaan severity (error/warning).
- **๐Ÿง  AI Analyst (Fase 2):** status sehat/perhatian/kritis, ringkasan naratif,
  daftar anomali ber-severity, dan rekomendasi โ€” plus tombol **"Analisa sekarang"**.
- **๐Ÿ”ฎ Prediksi Tren (Fase 3):** tren & ETA CPU/memori/disk (deterministik,
  tanpa API key).
- **โšก Remediasi 1-klik (Fase 3):** tombol eksekusi aksi yang diusulkan AI
  (muncul ter-kunci bila write-gate mati).

Cadence bertingkat (1 dtk vitals/interface ยท 5 dtk klien & ping ยท 30 dtk WAN/
service/sertifikat & sampel prediksi ยท analisis AI default 60 dtk) agar tidak
membebani router. Endpoint: `/` (laman), `/api/stream` (SSE), `/api/snapshot`
(JSON sekali ambil), `/api/analyze` (POST โ€” picu analisis AI), `/api/remediate`
(POST โ€” eksekusi 1 aksi remediasi; butuh `ALLOW_WRITE`).

## Contoh penggunaan

Cukup minta dalam bahasa biasa di Claude Code:

- *"Tampilkan versi RouterOS dan pemakaian CPU/memori."* โ†’ `system_resource`
- *"Siapa saja klien DHCP yang aktif sekarang?"* โ†’ `dhcp_leases`
- *"Interface mana yang sedang down?"* โ†’ `list_interfaces`
- *"Tunjukkan 100 baris log terakhir yang mengandung error."* โ†’ `recent_logs` + filter
- *"Ping 8.8.8.8 dari router."* โ†’ `ping`
- *"Apa konfigurasi DNS router?"* โ†’ `rest_get path=ip/dns`
- *"Blokir IP 10.0.0.5 di firewall."* โ†’ `add_firewall_drop` *(butuh `ALLOW_WRITE=true`)*
- *"Nonaktifkan interface ether5."* โ†’ `set_interface_enabled` *(butuh `ALLOW_WRITE=true`)*

---

## Uji manual tanpa Claude

Memastikan REST hidup & kredensial benar sebelum menyalakan dari Claude:

```bash
source .env
curl -sk -u "$MIKROTIK_USER:$MIKROTIK_PASSWORD" \
  "https://$MIKROTIK_HOST/rest/system/resource" | jq .
```

Uji server MCP-nya sendiri (memuat & mendaftarkan tool, tanpa konek router):

```bash
uv run python -c "
import asyncio
from mikroclaw.server import mcp
tools = asyncio.run(mcp.list_tools())
print(f'{len(tools)} tools:', ', '.join(t.name for t in tools))
"
```

### Test suite (pytest)

Tersedia unit test untuk client REST, helper poller, prediksi/throughput,
remediasi, lapis AI, dan endpoint Pulse โ€” semuanya **offline** (httpx di-mock,
tanpa router/jaringan/biaya API):

```bash
uv run --extra test pytest    # memasang & menjalankan pytest (extra 'test')
```

```
83 passed in 0.45s
```

---

## Keamanan

- **User least-privilege** โ€” buat user khusus (mis. grup `read`); jangan pakai `admin` penuh.
- **Pisahkan kredensial** โ€” hanya di `.env`, yang sudah masuk `.gitignore`. Jangan tempel password di chat atau di `.mcp.json`.
- **Gunakan TLS** โ€” `MIKROTIK_USE_TLS=true`. Set `MIKROTIK_VERIFY_TLS=true` setelah memasang sertifikat tepercaya.
- **Batasi sumber akses** di router: `/ip/service/set www-ssl address=<subnet-tepercaya>`.
- **Write off by default** โ€” biarkan `MIKROCLAW_ALLOW_WRITE=false` kecuali memang sedang melakukan perubahan; matikan lagi sesudahnya.
- **Audit** โ€” operasi `add_firewall_drop` menyertakan komentar `added-by-mikroclaw` agar mudah ditelusuri/dihapus.

---

## Troubleshooting

| Gejala | Kemungkinan sebab | Solusi |
|---|---|---|
| `MIKROTIK_HOST belum di-set` | `.env` belum dibuat/diisi | `cp .env.example .env`, isi `MIKROTIK_HOST`. |
| `Gagal menghubungi RouterOS ...` (timeout) | Port REST tertutup / host salah / firewall | Cek `/ip/service`, ketersambungan jaringan, dan `MIKROTIK_PORT`. |
| `RouterOS membalas 401` | User/password salah | Periksa `MIKROTIK_USER`/`MIKROTIK_PASSWORD`. |
| `RouterOS membalas 404` | Path tidak ada di versi RouterOS ini | Cek nama path; sebagian fitur beda antar versi. |
| Error sertifikat / SSL | Self-signed + verify aktif | Set `MIKROTIK_VERIFY_TLS=false`. |
| `Operasi write dinonaktifkan` | Mencoba tool write saat gate off | Set `MIKROCLAW_ALLOW_WRITE=true` di `.env`, restart server. |
| Server tak muncul di `/mcp` | `.mcp.json` belum disetujui | Jalankan `/mcp`, setujui server project-scope; pastikan `uv` ada di PATH. |
| Perubahan `.env` tak terbaca | Server masih pakai proses lama | Restart koneksi MCP (toggle via `/mcp`) agar `.env` dibaca ulang. |

---

## Kompatibilitas RouterOS v6 vs v7

REST API **hanya ada di RouterOS v7**. Jika router Anda v6:

- Antarmuka tool di `server.py` **tidak perlu berubah**.
- Ganti lapisan transport di `client.py` ke **API biner** (port `8728`/`8729` TLS)
  memakai library seperti [`librouteros`](https://github.com/luqasz/librouteros).
- `RouterOSClient.get/put/patch/delete` cukup dipetakan ke perintah API biner;
  sisanya (config, server, daftar tool) tetap sama.

API biner juga bekerja di v7, sehingga bisa dipakai sebagai transport tunggal
lintas versi bila diinginkan.

---

## Struktur proyek

```
MikroCLAW/
โ”œโ”€โ”€ .mcp.json              # registrasi server untuk Claude Code (project-scope)
โ”œโ”€โ”€ .env.example           # template variabel environment
โ”œโ”€โ”€ .env                   # kredensial nyata (di-gitignore, buat sendiri)
โ”œโ”€โ”€ .gitignore
โ”œโ”€โ”€ pyproject.toml         # metadata + dependency + entry point `mikroclaw`
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ CLAUDE.md              # panduan repo untuk Claude Code (arsitektur & konvensi)
โ”œโ”€โ”€ LICENSE                # Apache License 2.0
โ”œโ”€โ”€ install.ps1 / install.sh    # installer (Windows / macOS+Linux)
โ”œโ”€โ”€ install.bat                 # launcher double-click untuk install.ps1
โ”œโ”€โ”€ uninstall.ps1 / uninstall.sh# lepas registrasi MCP (opsi hapus .env/.venv)
โ”œโ”€โ”€ bootstrap.ps1 / bootstrap.sh# clone + install satu baris
โ”œโ”€โ”€ tests/                 # unit test pytest (offline, httpx di-mock)
โ”œโ”€โ”€ .claude/skills/        # Agent Skills (playbook orkestrasi tool)
โ”‚   โ”œโ”€โ”€ mikrotik-health-check/SKILL.md
โ”‚   โ”œโ”€โ”€ mikrotik-firewall-audit/SKILL.md
โ”‚   โ”œโ”€โ”€ mikrotik-security-audit/SKILL.md
โ”‚   โ”œโ”€โ”€ mikrotik-network-overview/SKILL.md
โ”‚   โ”œโ”€โ”€ mikrotik-troubleshoot/SKILL.md
โ”‚   โ”œโ”€โ”€ mikrotik-backup-snapshot/SKILL.md
โ”‚   โ”œโ”€โ”€ mikrotik-role-detect/SKILL.md
โ”‚   โ”œโ”€โ”€ mikrotik-twin/SKILL.md          # ๐Ÿ†• simulator what-if
โ”‚   โ”œโ”€โ”€ mikrotik-sentinel/SKILL.md      # ๐Ÿ†• deteksi perangkat terinfeksi
โ”‚   โ”œโ”€โ”€ mikrotik-chronicle/SKILL.md     # ๐Ÿ†• mesin waktu konfigurasi
โ”‚   โ”œโ”€โ”€ mikrotik-replay/SKILL.md        # ๐Ÿ†• RCA retrospektif
โ”‚   โ””โ”€โ”€ mikrotik-concierge/SKILL.md     # ๐Ÿ†• laporan bisnis
โ””โ”€โ”€ src/mikroclaw/
    โ”œโ”€โ”€ __init__.py        # versi paket
    โ”œโ”€โ”€ config.py          # baca .env/env โ†’ objek Config + validasi
    โ”œโ”€โ”€ client.py          # client REST RouterOS v7 (async httpx)
    โ”œโ”€โ”€ roles.py           # classify_roles: deteksi peran dari bukti (murni)
    โ”œโ”€โ”€ storage.py         # ๐Ÿ†• helper state dir lokal (Chronicle & Replay)
    โ”œโ”€โ”€ twin.py            # ๐Ÿ†• Twin: engine simulator paket (murni)
    โ”œโ”€โ”€ sentinel.py        # ๐Ÿ†• Sentinel: sidik-jari perilaku perangkat (murni)
    โ”œโ”€โ”€ chronicle.py       # ๐Ÿ†• Chronicle: snapshot/diff/risiko konfigurasi (murni)
    โ”œโ”€โ”€ concierge.py       # ๐Ÿ†• Concierge: telemetri โ†’ sinyal bisnis (murni)
    โ”œโ”€โ”€ server.py          # FastMCP + definisi 100 tool + write-gate
    โ””โ”€โ”€ web/               # MikroCLAW Pulse โ€” dashboard monitoring live
        โ”œโ”€โ”€ poller.py      # data plane: poll bertingkat + ring-buffer + throughput + prediksi
        โ”œโ”€โ”€ history.py     # ๐Ÿ†• Replay: persistensi riwayat telemetri + ringkasan jendela
        โ”œโ”€โ”€ analyst.py     # lapis AI (Fase 2): Anthropic Messages API via httpx
        โ”œโ”€โ”€ actions.py     # remediasi 1-klik (Fase 3): allowlist aksi write yang aman
        โ”œโ”€โ”€ app.py         # Starlette + SSE + endpoint analyze/remediate + entry `mikroclaw-web`
        โ””โ”€โ”€ static/
            โ””โ”€โ”€ index.html # dashboard vanilla JS (tanpa dependency eksternal)
```

---

## Pengembangan: menambah tool

Tambahkan fungsi async di `src/mikroclaw/server.py` dengan dekorator `@mcp.tool()`.
Docstring menjadi deskripsi tool yang dilihat Claude โ€” tulis sejelas mungkin.

Contoh menambah daftar simple queue (read):

```python
@mcp.tool()
async def simple_queues() -> Any:
    """Daftar simple queue (pembatasan bandwidth per target)."""
    return await _ros().get("/queue/simple")
```

Contoh tool write (selalu panggil `_require_write()` di awal):

```python
@mcp.tool()
async def reboot_router() -> Any:
    """Reboot router. BUTUH MIKROCLAW_ALLOW_WRITE=true."""
    _require_write()
    return await _ros().post("/system/reboot")
```

Setelah mengubah kode, restart koneksi MCP di Claude Code (`/mcp`) agar tool baru
terdeteksi. Verifikasi cepat:

```bash
uv run python -c "import asyncio; from mikroclaw.server import mcp; print(len(asyncio.run(mcp.list_tools())), 'tools')"
```

---

## Riwayat versi

| Versi | Sorotan |
|---|---|
| **v1.7.0** | **5 fitur cerdas AI** โ€” **Twin** (simulator what-if paket: `simulate_packet`/`simulate_firewall_change`), **Sentinel** (deteksi botnet IoT/miner/scan tanpa signature: `analyze_client_behavior`), **Chronicle** (mesin waktu konfigurasi + deteksi intrusi: `config_snapshot`/`config_diff`), **Replay** (RCA retrospektif: `explain_incident`), **Concierge** (laporan bisnis RT-RW net: `business_report`) + 5 skill baru. **100 tool ยท 12 skill ยท 151 test.** |
| **v1.6.0** | **Deteksi peran** โ€” tool `detect_roles` (introspeksi โ†’ klasifikasi gateway/firewall/BGP/OSPF/switch/AP/BRAS/VPN/QoS/โ€ฆ + bukti & keyakinan) & skill `mikrotik-role-detect`. **93 tool ยท 7 skill.** |
| **v1.5.0** | **Pulse Fase 3 โ€” AI proaktif:** prediksi tren deterministik (CPU/mem/disk + ETA) & **remediasi 1-klik** ter-gate ganda (write-flag + allowlist + cocok usulan AI) lewat `POST /api/remediate`. |
| **v1.4.0** | **Pulse Fase 2 โ€” lapis AI Analyst** (Anthropic Messages API via httpx, read-only, output terstruktur lewat tool-use) + **Log Stream** dengan pewarnaan severity + endpoint `POST /api/analyze`. |
| **v1.3.0** | **MikroCLAW Pulse** โ€” laman web monitoring live per-detik (Starlette + SSE, read-only; tanpa dependency baru). |
| v1.2.0 | Installer **macOS / Linux** (bash) + bootstrap satu-baris. |
| v1.1.0 | Installer **Windows** (PowerShell) + bootstrap satu-baris. |
| v1.0.0 | Rilis awal โ€” MCP server (**92 tool**: 70 read + 22 write) + **6 Agent Skills**. |

> Penomoran mengikuti urutan milestone fitur pada histori git; rincian tiap perubahan ada di `git log`.

---

## Lisensi

Dirilis di bawah **Apache License 2.0** โ€” lihat [`LICENSE`](LICENSE).

---

*MikroCLAW dibuat untuk administrasi MikroTik yang sah pada perangkat milik/dikuasakan
kepada Anda. Gunakan secara bertanggung jawab.*

TDQS

B3.3/5.0

Scored across 92 tools

Disambiguation5/5

Each tool targets a specific resource or action, with clear, distinct names. For example, add_dns_static, add_static_dhcp_lease, and delete_firewall_rule are unambiguous. Even generic rest_get/rest_write are clearly labeled for fallback use.

Naming Consistency5/5

Tool names follow a consistent verb_noun pattern for actions (e.g., add_address_list_entry, set_identity) and simple nouns for data retrieval (e.g., arp_table, dhcp_leases). The naming is uniform with snake_case throughout.

Tool Count2/5

With 92 tools, the set is extremely large for a single server. While the scope of RouterOS management justifies many tools, this count is far above the typical well-scoped range and may overwhelm agents.

Completeness4/5

The tool set covers most major RouterOS domains (firewall, DHCP, DNS, routing, VPN, hotspot, WiFi, system management, diagnostics) with dedicated tools. Minor gaps exist, such as missing tools for BGP configuration or DHCP lease deletion, but these can be addressed via rest_write.

Maintenance

ActivityInactive
ResponsivenessNo issues