GitGuardian MCP Server
OFFICIAL SERVERSecret scanning, incident triage, honeytokens and fixes from a GitGuardian workspace
Manage MikroTik RouterOS routers over SSH: firewall, NAT, DHCP, DNS, routes, VLANs, WireGuard and more
By WireSage Python Local · stdio DevOps and monitoringSecurity
58 popularity score ★ 325 ↓ 11k/mo
Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs MIKROTIK_HOST, MIKROTIK_USERNAME, MIKROTIK_PASSWORD. Replace each <NAME> with your value.
claude mcp add mikrotik -e MIKROTIK_HOST=<MIKROTIK_HOST> -e MIKROTIK_USERNAME=<MIKROTIK_USERNAME> -e MIKROTIK_PASSWORD=<MIKROTIK_PASSWORD> -- uvx mcp-server-mikrotik{
"mcpServers": {
"mikrotik": {
"command": "uvx",
"args": [
"mcp-server-mikrotik"
],
"env": {
"MIKROTIK_HOST": "<MIKROTIK_HOST>",
"MIKROTIK_USERNAME": "<MIKROTIK_USERNAME>",
"MIKROTIK_PASSWORD": "<MIKROTIK_PASSWORD>"
}
}
}
}{
"mcpServers": {
"mikrotik": {
"command": "uvx",
"args": [
"mcp-server-mikrotik"
],
"env": {
"MIKROTIK_HOST": "<MIKROTIK_HOST>",
"MIKROTIK_USERNAME": "<MIKROTIK_USERNAME>",
"MIKROTIK_PASSWORD": "<MIKROTIK_PASSWORD>"
}
}
}
}{
"servers": {
"mikrotik": {
"type": "stdio",
"command": "uvx",
"args": [
"mcp-server-mikrotik"
],
"env": {
"MIKROTIK_HOST": "<MIKROTIK_HOST>",
"MIKROTIK_USERNAME": "<MIKROTIK_USERNAME>",
"MIKROTIK_PASSWORD": "<MIKROTIK_PASSWORD>"
}
}
}
}[mcp_servers.mikrotik]
command = "uvx"
args = ["mcp-server-mikrotik"]
[mcp_servers.mikrotik.env]
MIKROTIK_HOST = "<MIKROTIK_HOST>"
MIKROTIK_USERNAME = "<MIKROTIK_USERNAME>"
MIKROTIK_PASSWORD = "<MIKROTIK_PASSWORD>"gemini mcp add --scope user -e MIKROTIK_HOST=<MIKROTIK_HOST> -e MIKROTIK_USERNAME=<MIKROTIK_USERNAME> -e MIKROTIK_PASSWORD=<MIKROTIK_PASSWORD> mikrotik uvx -- mcp-server-mikrotikOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs MIKROTIK_HOST, MIKROTIK_USERNAME, MIKROTIK_PASSWORD. Replace each <NAME> with your value.
claude mcp add mikrotik -e MIKROTIK_HOST=<MIKROTIK_HOST> -e MIKROTIK_USERNAME=<MIKROTIK_USERNAME> -e MIKROTIK_PASSWORD=<MIKROTIK_PASSWORD> -- docker run --rm -i -e MIKROTIK_HOST -e MIKROTIK_USERNAME -e MIKROTIK_PASSWORD ghcr.io/wiresage/mikrotik-mcp:latest{
"mcpServers": {
"mikrotik": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MIKROTIK_HOST",
"-e",
"MIKROTIK_USERNAME",
"-e",
"MIKROTIK_PASSWORD",
"ghcr.io/wiresage/mikrotik-mcp:latest"
],
"env": {
"MIKROTIK_HOST": "<MIKROTIK_HOST>",
"MIKROTIK_USERNAME": "<MIKROTIK_USERNAME>",
"MIKROTIK_PASSWORD": "<MIKROTIK_PASSWORD>"
}
}
}
}{
"mcpServers": {
"mikrotik": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MIKROTIK_HOST",
"-e",
"MIKROTIK_USERNAME",
"-e",
"MIKROTIK_PASSWORD",
"ghcr.io/wiresage/mikrotik-mcp:latest"
],
"env": {
"MIKROTIK_HOST": "<MIKROTIK_HOST>",
"MIKROTIK_USERNAME": "<MIKROTIK_USERNAME>",
"MIKROTIK_PASSWORD": "<MIKROTIK_PASSWORD>"
}
}
}
}{
"servers": {
"mikrotik": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MIKROTIK_HOST",
"-e",
"MIKROTIK_USERNAME",
"-e",
"MIKROTIK_PASSWORD",
"ghcr.io/wiresage/mikrotik-mcp:latest"
],
"env": {
"MIKROTIK_HOST": "<MIKROTIK_HOST>",
"MIKROTIK_USERNAME": "<MIKROTIK_USERNAME>",
"MIKROTIK_PASSWORD": "<MIKROTIK_PASSWORD>"
}
}
}
}[mcp_servers.mikrotik]
command = "docker"
args = ["run", "--rm", "-i", "-e", "MIKROTIK_HOST", "-e", "MIKROTIK_USERNAME", "-e", "MIKROTIK_PASSWORD", "ghcr.io/wiresage/mikrotik-mcp:latest"]
[mcp_servers.mikrotik.env]
MIKROTIK_HOST = "<MIKROTIK_HOST>"
MIKROTIK_USERNAME = "<MIKROTIK_USERNAME>"
MIKROTIK_PASSWORD = "<MIKROTIK_PASSWORD>"gemini mcp add --scope user -e MIKROTIK_HOST=<MIKROTIK_HOST> -e MIKROTIK_USERNAME=<MIKROTIK_USERNAME> -e MIKROTIK_PASSWORD=<MIKROTIK_PASSWORD> mikrotik docker -- run --rm -i -e MIKROTIK_HOST -e MIKROTIK_USERNAME -e MIKROTIK_PASSWORD ghcr.io/wiresage/mikrotik-mcp:latest| Set together: single device | |
|---|---|
MIKROTIK_HOST |
Required: IP or hostname of the router in single-device mode (the Docker image uses 192.168.88.1). |
MIKROTIK_USERNAME |
Required: SSH username. |
MIKROTIK_PASSWORD secret |
Required: SSH password; or log in with MIKROTIK_KEY_FILENAME or MIKROTIK_ALLOW_SSH_AGENT instead. |
MIKROTIK_PORT |
Optional: SSH port. |
MIKROTIK_KEY_FILENAME |
Optional: Path to an SSH private key for key-based login. |
MIKROTIK_ALLOW_SSH_AGENT |
Optional: true logs in with keys offered by the SSH agent through SSH_AUTH_SOCK. |
MIKROTIK_READ_ONLY |
Optional: true exposes only tools marked read-only. |
MIKROTIK_SENSITIVE_HIDING |
Optional: true redacts credentials and keys from output and logs and drops two tools that return secrets. |
| Set together: inventory | |
MIKROTIK_INVENTORY_FILE |
Optional: Path to a YAML file listing several devices; replaces the single-device settings. |
MIKROTIK_INVENTORY secret |
Optional: Inline YAML or JSON device list; wins over MIKROTIK_INVENTORY_FILE. |
In a container, a setting goes in with -e NAME=value after docker run.
MikroTik MCP is a Python server that connects to MikroTik RouterOS devices over SSH and exposes router administration as tools. You can work on interfaces, VLANs, IPv4 and IPv6 addresses, DHCP, IP pools, firewall filter rules for both IP versions, NAT, address lists, routes, DNS, users, queues, PoE, WireGuard and wireless. Backups and exports are covered too, as are RouterOS Safe Mode sessions. Newer releases add read-only views of IPsec, ARP and IPv6 neighbors, netwatch, schedulers, management services and system health.
In version 0.26.2 the source registers 212 tools. Of those, 96 are annotated read-only. Removals are flagged as destructive, and four tools carry a separate dangerous flag: create_basic_firewall_setup, restore_backup, import_configuration and remove_file. The README never gives that count. The tool reference index also has no entry for the wireless, IPsec, system, netwatch, scheduler or services groups.
A single router is set with MIKROTIK_HOST and its login. Since 0.14.0 you can instead hand it a YAML inventory of many devices (MIKROTIK_INVENTORY_FILE, or MIKROTIK_INVENTORY inline), and each tool then takes a device argument naming the target. Two switches cut down what the assistant gets. MIKROTIK_READ_ONLY drops every tool that is not marked read-only, while MIKROTIK_SENSITIVE_HIDING redacts passwords and keys from output and removes download_file and generate_wireguard_client_config. Transport is stdio by default. It can also run as an SSE or streamable HTTP service with a /health endpoint.
| Runtime | Python 3.10+Docker |
|---|---|
| Runs on | macOS, Windows, Linux |
| MikroTik RouterOS | Your own instanceA device with SSH reachable from the server and an account with a password, SSH key or agent key. RouterOS 7 is the tested version. |
| Also |
|
Run it with uvx (needs uv) or pip on Python 3.10+, or use the Docker image ghcr.io/wiresage/mikrotik-mcp (amd64 and arm64), which needs neither. The RouterOS account's permissions set the real limit on what the tools can change, so create a restricted account for audits.
Its install guide lists RouterOS API access and the routeros-api package as prerequisites, but the code connects over SSH with paramiko only. With no settings the host defaults to 127.0.0.1 in config.py (the Docker entrypoint uses 192.168.88.1 instead), so a host must be given. The MCP registry entry still describes version 0.14.1.0, older than the 0.24.2 on PyPI. MIKROTIK_READ_ONLY only trims the tool list; its docs say a restricted RouterOS account is the real write protection. Sensitive hiding cannot spot unlabelled secrets in free-text log lines or comments. The HTTP transports listen on 0.0.0.0:8000 by default with no client IP limit unless MIKROTIK_MCP__ALLOWED_IPS is set.
Suits network admins who run MikroTik routers and want an assistant to inspect or change their configuration, on one device or a fleet, with read-only mode for audits and Safe Mode for risky edits. It is a community project, not from MikroTik, and it acts with whatever rights the SSH account has, so it is a poor fit where no restricted RouterOS account can be made. People who prefer the RouterOS REST API to SSH can look at mikrotik-rest-mcp, which we also list: it works through the RouterOS 7 REST API and asks for confirmation before disruptive changes.
25 only read, 27 change things, 8 can delete or overwrite. A ? marks an optional parameter.
list_devicessafe_mode_statusdevice?: stringenable_safe_mode changesdevice?: stringcommit_safe_mode changesdevice?: stringrollback_safe_mode changesdevice?: stringcreate_filter_rule changeschain: enumaction: enumsrc_address?: stringdst_address?: stringsrc_port?: stringdst_port?: stringprotocol?: stringin_interface?: stringout_interface?: stringin_interface_list?: stringout_interface_list?: stringconnection_state?: stringconnection_nat_state?: stringsrc_address_list?: stringdst_address_list?: stringlimit?: stringtcp_flags?: stringcomment?: stringdisabled?: booleandevice?: stringlist_filter_ruleschain_filter?: stringaction_filter?: stringsrc_address_filter?: stringdst_address_filter?: stringprotocol_filter?: stringinterface_filter?: stringdisabled_only?: booleaninvalid_only?: booleandynamic_only?: booleandevice?: stringget_filter_rulerule_id: stringdevice?: stringupdate_filter_rule changesrule_id: stringchain?: stringaction?: stringsrc_address?: stringdst_address?: stringsrc_port?: stringdst_port?: stringprotocol?: stringin_interface?: stringout_interface?: stringin_interface_list?: stringout_interface_list?: stringconnection_state?: stringconnection_nat_state?: stringsrc_address_list?: stringdst_address_list?: stringlimit?: stringtcp_flags?: stringcomment?: stringdevice?: stringremove_filter_rule deletesrule_id: stringdevice?: stringmove_filter_rule changesrule_id: stringdestination: integerdevice?: stringenable_filter_rule changesrule_id: stringdevice?: stringdisable_filter_rule changesrule_id: stringdevice?: stringcreate_basic_firewall_setup changesdevice?: stringset_dns_servers changesservers: arrayallow_remote_requests?: booleanmax_udp_packet_size?: integermax_concurrent_queries?: integercache_size?: integercache_max_ttl?: stringuse_doh?: booleandoh_server?: stringverify_doh_cert?: booleandevice?: stringget_dns_settingsdevice?: stringadd_dns_static changesname: stringaddress?: stringcname?: stringmx_preference?: integermx_exchange?: stringtext?: stringsrv_priority?: integersrv_weight?: integersrv_port?: integersrv_target?: stringttl?: stringcomment?: stringdisabled?: booleanregexp?: stringdevice?: stringlist_dns_staticname_filter?: stringaddress_filter?: stringtype_filter?: stringdisabled_only?: booleanregexp_only?: booleandevice?: stringget_dns_staticentry_id: stringdevice?: stringupdate_dns_static changesentry_id: stringname?: stringaddress?: stringcname?: stringmx_preference?: integermx_exchange?: stringtext?: stringsrv_priority?: integersrv_weight?: integersrv_port?: integersrv_target?: stringttl?: stringcomment?: stringdisabled?: booleanregexp?: stringdevice?: stringremove_dns_static deletesentry_id: stringdevice?: stringenable_dns_static changesentry_id: stringdevice?: stringdisable_dns_static changesentry_id: stringdevice?: stringget_dns_cachedevice?: stringflush_dns_cache deletesdevice?: stringget_dns_cache_statisticsdevice?: stringadd_dns_regexp changesregexp: stringaddress: stringttl?: stringcomment?: stringdisabled?: booleandevice?: stringtest_dns_queryname: stringserver?: stringtype?: stringdevice?: stringexport_dns_config changesfilename?: stringdevice?: stringcreate_backup changesname?: stringdont_encrypt?: booleaninclude_password?: booleancomment?: stringdevice?: stringlist_backupsname_filter?: stringinclude_exports?: booleandevice?: stringcreate_export changesname?: stringfile_format?: enumexport_type?: enumhide_sensitive?: booleanverbose?: booleancompact?: booleancomment?: stringdevice?: stringexport_sectionsection: stringhide_sensitive?: booleancompact?: booleandevice?: stringdownload_filefilename: stringfile_type?: enumdevice?: stringupload_file changesfilename: stringcontent_base64: stringdevice?: stringrestore_backup deletesfilename: stringpassword?: stringdevice?: stringimport_configuration deletesfilename: stringrun_after_reset?: booleanverbose?: booleandevice?: stringremove_file deletesfilename: stringdevice?: stringbackup_infofilename: stringdevice?: stringcreate_wireguard_interface changesname: stringlisten_port?: integerprivate_key?: stringmtu?: integercomment?: stringdisabled?: booleandevice?: stringlist_wireguard_interfacesname_filter?: stringdisabled_only?: booleanrunning_only?: booleandevice?: stringget_wireguard_interfacename: stringdevice?: stringupdate_wireguard_interface changesname: stringnew_name?: stringlisten_port?: integerprivate_key?: stringmtu?: integercomment?: stringdisabled?: booleandevice?: stringremove_wireguard_interface deletesname: stringdevice?: stringenable_wireguard_interface changesname: stringdevice?: stringdisable_wireguard_interface changesname: stringdevice?: stringadd_wireguard_peer changesinterface: stringpublic_key: stringallowed_address: stringendpoint_address?: stringendpoint_port?: integerpreshared_key?: stringpersistent_keepalive?: stringcomment?: stringdisabled?: booleandevice?: stringlist_wireguard_peersinterface_filter?: stringdisabled_only?: booleandevice?: stringget_wireguard_peerpeer_id: stringdevice?: stringupdate_wireguard_peer changespeer_id: stringallowed_address?: stringendpoint_address?: stringendpoint_port?: integerpreshared_key?: stringpersistent_keepalive?: stringcomment?: stringdisabled?: booleandevice?: stringremove_wireguard_peer deletespeer_id: stringdevice?: stringenable_wireguard_peer changespeer_id: stringdevice?: stringdisable_wireguard_peer changespeer_id: stringdevice?: stringgenerate_wireguard_client_configclient_private_key: stringclient_address: stringserver_public_key: stringserver_endpoint: stringserver_port?: integerallowed_ips?: stringdns?: stringpersistent_keepalive?: integerdevice?: stringget_system_resourcedevice?: stringlist_ip_servicesname_filter?: stringenabled_only?: booleandevice?: stringlist_arp_entriesaddress_filter?: stringmac_filter?: stringinterface_filter?: stringstatus_filter?: stringdevice?: stringlist_netwatchhost_filter?: stringcomment_filter?: stringstatus_filter?: stringtype_filter?: stringinclude_source?: booleandevice?: stringlist_schedulersname_filter?: stringinclude_source?: booleandevice?: stringlist_ipsec_peersname_filter?: stringaddress_filter?: stringdevice?: string