One bad call can take down your DNS filtering. adguardctrl gates every AdGuard Home write behind confirm and destructive flags. CLI plus MCP adapter, no daemon.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
tools
-
adguard_add_client
Register a new named client with per-client settings (POST /control/clients/add).
-
adguard_add_filter_list
Subscribe to a new blocklist or allowlist URL (POST /control/filtering/add_url).
-
adguard_add_user_rule
Append a single user filter rule (POST /control/filtering/set_rules).
-
adguard_check_host
Test what AGH would do with a hostname: filter decision, matched rules, CNAME chain, IPs (GET /control/filtering/check_host).
-
adguard_clear_query_log
Wipe the DNS query log (POST /control/querylog_clear).
-
adguard_delete_client
Remove a configured named client; per-client rules and stats are lost (POST /control/clients/delete).
-
adguard_get_blocked_services
Global blocked-services list + weekly schedule (GET /control/blocked_services/get).
-
adguard_get_dns_config
DNS upstreams, bootstrap, cache, parallel resolution, blocking mode (GET /control/dns_info).
-
adguard_get_safesearch_settings
SafeSearch enabled state + per-engine flags (GET /control/safesearch/status).
-
adguard_list_blocked_services_catalog
Available service IDs to block (GET /control/blocked_services/services).
-
adguard_list_clients
Configured named clients (GET /control/clients).
-
adguard_list_filter_lists
Subscribed blocklists + allowlists (GET /control/filtering/status).
-
adguard_list_user_rules
Custom user rules (GET /control/filtering/status).
-
adguard_query_log
DNS query log slice with filters (GET /control/querylog).
-
adguard_refresh_filter_lists
Force refresh subscribed filter lists immediately (POST /control/filtering/refresh).
-
adguard_remove_filter_list
Unsubscribe from a filter list by URL (POST /control/filtering/remove_url).
-
adguard_remove_user_rule
Remove a single user filter rule by exact match (POST /control/filtering/set_rules).
-
adguard_replace_user_rules
Wholesale replace the user rules block (POST /control/filtering/set_rules).
-
adguard_reset_stats
Zero the stats window (POST /control/stats_reset).
-
adguard_set_blocked_services
Set GLOBAL blocked services + optional weekly schedule; accepts HH:MM strings or ms (PUT /control/blocked_services/update).
-
adguard_set_client_blocked_services
Set per-client blocked services + schedule (POST /control/clients/update).
-
adguard_stats
Stats window: top queries, blocked counts, clients (GET /control/stats).
-
adguard_status
Server status + protection state (GET /control/status).
-
adguard_sync_clear_logs
Clear AdGuardHome Sync in-memory logs (POST /api/v1/clear-logs).
-
adguard_sync_health
AdGuardHome Sync health check (HEAD /healthz).
-
adguard_sync_logs
AdGuardHome Sync in-memory logs (GET /api/v1/logs).
-
adguard_sync_run
Trigger AdGuardHome Sync immediately (POST /api/v1/sync).
-
adguard_sync_status
AdGuardHome Sync origin/replica status (GET /api/v1/status).
-
adguard_toggle_filter_list
Enable or disable a subscribed filter list (POST /control/filtering/set_url).
-
adguard_toggle_protection
Enable or disable global filtering; off stops ALL blocking (POST /control/protection).
-
adguard_toggle_safebrowsing
Enable or disable AGH SafeBrowsing (POST /control/safebrowsing/enable or /disable).
-
adguard_toggle_safesearch
Enable or disable SafeSearch globally with per-engine flags (PUT /control/safesearch/settings).
-
adguard_update_client
Full update for an existing named client; body is nested {name, data} (POST /control/clients/update).
analyzed commit 250c437 · analyzer v33 · 2w ago
skills & prompt files 2
- agent-rules lidless-labs-adguardctrl-250c437/AGENTS.md
- agent-rules lidless-labs-adguardctrl-250c437/CLAUDE.md
code files: 106
filesystem 2
- fs lidless-labs-adguardctrl-250c437/cli.ts :1
import { realpathSync } from "node:fs"; - fs lidless-labs-adguardctrl-250c437/mcp-server.ts :1
import { realpathSync } from "node:fs";
shell / exec 1
- shell (weak) lidless-labs-adguardctrl-250c437/tests/cli-entrypoint.test.ts :1
import { execFileSync, spawnSync } from "node:child_process";
network 3
- net lidless-labs-adguardctrl-250c437/src/adguard-client.ts :170
const response = await fetch(input.toString(), { ...init, headers }); - net lidless-labs-adguardctrl-250c437/src/adguard-sync-client.ts :173
const response = await fetch(input.toString(), { ...init, headers }); - net (weak) lidless-labs-adguardctrl-250c437/tests/fake-adguard.ts :1
import { createServer, Server, IncomingMessage, ServerResponse } from "node:http";
install hooks 1
- prepublishOnly lidless-labs-adguardctrl-250c437/package.json :31
npm run typecheck && npm test && npm run build
declared dependencies 10
- @modelcontextprotocol/sdk@^1.29.0
- @lidless-labs/effect-operator-kit@github:lidless-labs/effect-operator-kit#be71030
- @sinclair/typebox@^0.34.0
- effect@^3.21.4
- @types/node@^25.6.2
- openclaw@^2026.4.22
- tsup@^8.4.0
- tsx@^4.19.0
- typescript@^7.0.2
- vitest@^4.1.5