Skip to main content
Glama

Control D MCP

A local Model Context Protocol server for safely managing Control D by conversation.

It can inspect profiles and endpoints, diagnose recent blocked DNS queries, pause a profile temporarily, create block/bypass/redirect rules, and delete rules. Every live policy change requires confirm: true and is followed by a read-back check.

Setup

Requires Node.js 20 or newer and a dedicated Control D write token. Restrict the token to trusted source IPs in Control D when possible.

npm install
npm run test

Put the token in ~/.config/controld-mcp.env (never in this repository) and set the file mode to 0600:

CONTROL_D_API_TOKEN=your-dedicated-write-token

Example Codex configuration:

[mcp_servers.controld]
command = "/absolute/path/to/node"
args = ["/absolute/path/to/controld-mcp/dist/index.js"]

Restart the MCP host after adding the server. The MCP process can start without the token, but its tools will return a setup error until the token is present and the host is restarted.

Related MCP server: technitium-mcp-secure

Typical flow

  1. “Show my Control D profiles.”

  2. “I just tried example.com. What was blocked in the last five minutes?”

  3. Review the query timestamps and the rule/filter that triggered each block.

  4. “Would cdn.example.net be blocked?” check_domain answers immediately, with the filter, service, or rule that decides it, without waiting for real traffic.

  5. “Create a temporary bypass for cdn.example.net on Global for 30 minutes.”

  6. The assistant shows the exact proposed mutation and asks for approval before calling the confirmed write tool.

Existing custom rules can be switched off and back on with set_rules_enabled, which keeps their action and redirect target.

For routing: list proxy locations first, then redirect either exact domain rules or a named service with an exact location ID. A service such as YouTube can involve many changing domains, so set_service_policy is usually safer than trying to maintain its hostnames manually. list_profile_services takes a search term to find a service without returning the whole catalog.

Security design

  • No generic HTTP/API passthrough tool.

  • API and analytics hosts are constrained to Control D. check_domain queries the endpoint's own public resolver at dns.controld.com and sends no token.

  • Tokens are loaded at runtime and never returned or logged.

  • Activity-log requests are bounded to 200 rows and are never cached.

  • Writes require exact profile resolution and confirm: true.

  • Prefer exact domains over wildcards. Inspect results before unblocking anything.

API stability

Control D warns that its API is unversioned. Activity-log and several management operations use current first-party dashboard contracts because they are not all present in the public API reference. See docs/api-contracts.md.

Acknowledgements

Endpoint behavior was cross-checked against Control D's official dashboard and the community Control D Manager Home Assistant integration. This project is an independent implementation.

License

MIT

Available Tools

15 tools
check_setupCheck Control D connectionA
Read-onlyIdempotent

Validate the token and report account capabilities without revealing the token.

Inputs: no named parameters.

create_block_rulesBlock domainsA
Destructive

Create enabled custom block rules. Requires confirm=true.

Inputs: confirm (required), profile (required), hostnames (required), comment, +1 more.

create_bypass_rulesUnblock domainsA
Destructive

Create enabled custom bypass rules. Use exact domains first; wildcards are broader. Requires confirm=true.

Inputs: confirm (required), profile (required), hostnames (required), comment, +1 more.

create_redirect_rulesRedirect domainsA
Destructive

Redirect matching domains through a Control D proxy location. Use list_proxy_locations first. Requires confirm=true.

Inputs: confirm (required), profile (required), hostnames (required), proxyLocationId (required), +2 more.

delete_rulesDelete custom rulesA
Destructive

Delete rules by exact hostname. This is destructive and requires confirm=true.

Inputs: confirm (required), profile (required), hostnames (required).

diagnose_recent_blocksDiagnose a blocked websiteB
Read-onlyIdempotent

Find DNS queries blocked in the recent browsing window. Supply the site you tried; dependent domains may appear separately in the results.

Inputs: site (required), limit, search, minutes, +1 more.

get_recent_activityGet recent DNS activityA
Read-onlyIdempotent

Read recent Control D activity. Activity logs require Full Analytics and are sensitive; results are not stored.

Inputs: limit, search, minutes, endpointId, +1 more.

list_endpointsList Control D endpointsA
Read-onlyIdempotent

List devices/endpoints with recent activity metadata.

Inputs: no named parameters.

list_profile_rulesList custom rulesA
Read-onlyIdempotent

List all custom rules for one profile.

Inputs: profile (required).

list_profilesList Control D profilesA
Read-onlyIdempotent

List profiles and their current pause state.

Inputs: no named parameters.

list_profile_servicesList service policiesA
Read-onlyIdempotent

List the current profile service states plus the service catalog. Use this to resolve names such as YouTube to exact IDs.

Inputs: profile (required).

list_proxy_locationsList redirect locationsA
Read-onlyIdempotent

List Control D proxy locations and IDs for redirect rules.

Inputs: no named parameters.

pause_profileTemporarily pause Control DA
Destructive

Pause all enforcement on a profile for a bounded time. This changes live DNS behavior and requires confirm=true.

Inputs: confirm (required), minutes (required), profile (required).

resume_profileResume Control DA
Destructive

Immediately resume a paused profile. Requires confirm=true.

Inputs: confirm (required), profile (required).

set_service_policySet service policyA
Destructive

Turn a named service off, block it, bypass it, or route it through a Control D proxy location. Service rules can cover changing domain sets and override filters. Requires confirm=true.

Inputs: mode (required), confirm (required), profile (required), service (required), +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 15 tools

    Disambiguation5/5

    Each tool has a distinct purpose: list tools target different entities (profiles, endpoints, locations, rules, services), create tools specify rule types, and activity/diagnose tools are clearly separated. No overlapping or ambiguous tools.

    Naming Consistency4/5

    Most tools follow the verb_noun pattern (e.g., list_profiles, create_block_rules), but there is a mix of verbs like 'get', 'diagnose', and 'check' alongside 'list'. This is mildly inconsistent but still clear enough to avoid confusion.

    Tool Count5/5

    With 15 tools, the server sits at the upper boundary of the recommended range but remains well-suited for a DNS control service. The tool count is neither excessive nor insufficient for the domain.

    Completeness5/5

    The tool set covers listing, creating, deleting, and modifying state (pause/resume/set), plus diagnostics and setup checks. No obvious missing operations for the Control D domain.

    Maintenance

    ActivitySlowing
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP server for managing AdGuard Home instances and AdGuardHome Sync with 33 tools across read, safe-write, and destructive operations, featuring three-tier write gating.
      106 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP server for AI agents to safely manage Cloudflare DNS, DMARC, SPF, BIMI, and Email Routing with dry-run-first and approval-based writes.
      9
      MIT