Atlas / MCP servers / lidless-labs / Adguardctrl

AdguardctrlSAFE

mcp/lidless-labs/adguardctrl

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.

Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
1 1r · 0w · 0d
Transport
stdio
License
MIT
Stars
2
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

adguardctrl

An operator control CLI for AdGuard Home, with an MCP adapter for assistant workflows and back-compatible launchers.

Website · Quickstart

adguardctrl is an operator control CLI for AdGuard Home, the self-hosted DNS sinkhole. It gives shell, cron, CI, and assistant workflows one typed control surface for inspecting network-wide DNS filtering across one or more boxes. The npm package remains @solomonneas/adguard-mcp for compatibility and still ships the back-compatible adguard-mcp bin; new MCP launchers can start the adapter with adguardctrl mcp.

What it does

adguardctrl speaks the AdGuard Home API across one or more instances, plus optional AdGuardHome Sync status and control. The direct CLI is read-only today, covering server status, stats, the DNS query log, filter lists, named clients, DNS rewrites, DNS and TLS config, DHCP status, and a check-host lookup that shows exactly what AdGuard would do with a hostname.

For assistant clients, adguardctrl mcp starts the stdio MCP adapter used by Claude Desktop, Claude Code, Codex CLI, OpenClaw, Hermes, and other Model Context Protocol clients. That adapter keeps

Read from source at commit 362784dbf9a9OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add adguard-mcp -- npx -y @solomonneas/[email protected]
claude-desktop
{
  "mcpServers": {
    "adguard-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@solomonneas/[email protected]"
      ]
    }
  }
}
03

Exposed tools (1)

1 read · 0 write · 0 destructive.

ToolRiskDescription
AdGuardreadAdGuard Home control: status/stats/query log + user-rule and filter-list management + per-client service blocks. Multi-instance via env. Three-tier write gating.
04

Trust audit

SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (2 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
none-found

Findings (12)

LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/tools/access_config_diagnostics.test.ts:4
import { AdGuardClient } from "../../src/adguard-client.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/tools/access_config_diagnostics.test.ts:5
import { WriteGateError } from "../../src/gates.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/tools/access_config_diagnostics.test.ts:6
import { createAdguardGetAccessListTool } from "../../src/tools/adguard_get_access_list.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/tools/access_config_diagnostics.test.ts:7
import { createAdguardSetAccessListTool } from "../../src/tools/adguard_set_access_list.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/tools/access_config_diagnostics.test.ts:8
import { createAdguardGetQuerylogConfigTool } from "../../src/tools/adguard_get_querylog_config.ts";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:59
"ADGUARD_PRIMARY_URL": "http://192.0.2.10",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:125
ADGUARD_PRIMARY_URL=http://192.0.2.10
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:130
ADGUARD_SECONDARY_URL=http://192.0.2.11
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:148
ADGUARDHOME_SYNC_URL=http://192.0.2.10:8080
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
README.md:229
ADGUARD_PRIMARY_URL: http://192.0.2.10
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@lidless-labs/effect-operator-kit, @modelcontextprotocol/sdk, @sinclair/typebox, effect, @types/node, openclaw, tsup, tsx
Why it matters. 10 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
README.md:155
`ADGUARD_SYNC_URL/USERNAME/PASSWORD` is also accepted as an alias and is reserved for the Sync server, not an AdGuard Home instance named `sync`.
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 362784dbf9a9full audit observations/trust-audit/mcp-server/lidless-labs__adguardctrl.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-12362784dbf9a9SAFEB89first audit
06

Questions

What is the @solomonneas/adguard-mcp MCP server?

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.

What tools does @solomonneas/adguard-mcp expose?

1 in total: 1 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is @solomonneas/adguard-mcp safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does @solomonneas/adguard-mcp need?

No credential environment variables were found in its source, so it appears to need none.

How does @solomonneas/adguard-mcp run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @solomonneas/adguard-mcp at 0.3.0.

How current is this page?

The grade is for one exact copy of the source (362784dbf9a9), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement