Skip to main content
Glama

NextDNS MCP Server

A Model Context Protocol (MCP) server for the NextDNS API, built with FastMCP and a small set of grouped CRUD tools.

Overview

This project provides an MCP server that exposes NextDNS API operations as tools that can be used by AI assistants and other MCP clients. The server registers a small set of domain-grouped CRUD tools directly; it does not generate tools from an OpenAPI spec.

Related MCP server: next-dns-mcp

Features

  • Domain-grouped CRUD tools exposing the full NextDNS API surface through ~8 high-level tools

  • Profile Management: Full CRUD operations - create, read, update, and delete profiles

  • Profile Access Control: Fine-grained read/write restrictions per profile, with read-only mode support

  • DNS-over-HTTPS Testing: Perform DoH lookups to test DNS resolution through profiles

  • Settings Configuration: Comprehensive grouped settings management including logs, block page, and performance

  • Logs: Query log retrieval, download, and clearing

  • Analytics: Comprehensive DNS query analytics and statistics, including time-series and plotting

  • Content Lists: Manage denylist, allowlist, privacy blocklists, native tracking, security TLDs, and parental control

  • Security: Complete security settings and TLD blocking configuration

  • Privacy: Privacy settings, blocklists, and native tracking protection management

  • Parental Control: Settings management with safe search and YouTube restrictions

  • Reference OpenAPI spec: The bundled nextdns-openapi.yaml documents the NextDNS API surface for validation tooling

  • Docker Support: Containerized deployment with proper OCI labels

  • Safety Mechanisms: Write operation protections and validation

Documentation

Complete documentation can be found in docs/index.md.

Quick Start

Prerequisites

  • Python 3.12+

  • uv (for development)

  • Docker (for containerized deployment)

  • NextDNS API key (get one here)

Configuration

  1. Copy the .env.example file to .env:

    cp .env.example .env
  2. Edit .env and set your NextDNS API key:

    NEXTDNS_API_KEY=your_api_key_here
    NEXTDNS_DEFAULT_PROFILE=your_profile_id  # Optional
    
    # Optional: Profile access control (see docs/configuration.md).
    # There is no separate test-profile variable for writes: list a dedicated
    # sandbox profile in NEXTDNS_WRITABLE_PROFILES, or block writes entirely
    # with NEXTDNS_READ_ONLY.
    # NEXTDNS_READABLE_PROFILES=profile1,profile2
    # NEXTDNS_WRITABLE_PROFILES=test_profile
    # NEXTDNS_READ_ONLY=false

Running with Docker

  1. Build the Docker image:

    docker build -t nextdns-mcp:latest .
  2. Run the container with environment variables:

    Option A: Direct environment variables (simple)

    docker run -i --rm \
      -e NEXTDNS_API_KEY=your_api_key_here \
      -e NEXTDNS_DEFAULT_PROFILE=your_profile_id \
      nextdns-mcp:latest

    Option B: Docker secrets (recommended for production)

    # Create secret
    echo "your_api_key_here" | docker secret create nextdns_api_key -
    
    # Run with Docker Swarm
    docker service create \
      --name nextdns-mcp \
      --secret nextdns_api_key \
      -e NEXTDNS_API_KEY_FILE=/run/secrets/nextdns_api_key \
      nextdns-mcp:latest

    Or for non-swarm (using mounted file):

    # Create a secret file
    echo "your_api_key_here" > /tmp/api_key.txt
    chmod 600 /tmp/api_key.txt
    
    # Run with mounted secret
    docker run -i --rm \
      -v /tmp/api_key.txt:/run/secrets/nextdns_api_key:ro \
      -e NEXTDNS_API_KEY_FILE=/run/secrets/nextdns_api_key \
      nextdns-mcp:latest

    Option C: Environment file (development)

    docker run -i --rm \
      --env-file .env \
      nextdns-mcp:latest

    Note: the commands above use stdio (standard input/output), the default transport. For the opt-in streamable-HTTP transport, see HTTP Transport below.

    Alpine variant

    An Alpine Linux image is also available. To build it locally, use Dockerfile.alpine:

    docker build -f Dockerfile.alpine -t nextdns-mcp:alpine .

    The published Alpine tags use the -alpine suffix (e.g. nextdns-mcp:alpine, nextdns-mcp:2.0-alpine). The python:3.14-slim image remains the recommended default.

Running Locally (Development)

  1. Install dependencies:

    uv sync
  2. Run the server:

    uv run python -m nextdns_mcp.server

HTTP Transport (network access)

By default the server uses stdio, which is what MCP clients (Claude Desktop, CLI tools) expect. You can switch to a streamable-HTTP transport for network-based clients, but the HTTP endpoint has no built-in authentication.

Variable

Default

Description

MCP_TRANSPORT

stdio

Set to http to serve over streamable-HTTP. Any other value fails startup; see configuration

MCP_HOST

127.0.0.1

Interface to bind. Loopback-only by default

MCP_PORT

8000

Port to listen on

Because there is no authentication, the default bind is loopback-only (127.0.0.1), so the HTTP endpoint is only reachable from the same host. That keeps it off the network, but on its own it does not stop a browser on that host from being tricked into reaching it (DNS rebinding) — the header validation below is what addresses that.

FastMCP's Host/Origin header validation (FASTMCP_HTTP_HOST_ORIGIN_PROTECTION, which mitigates DNS rebinding against that unauthenticated endpoint) is not enabled by default for application runs, because on a loopback bind it also enforces a Host allowlist and would reject the name your proxy or clients present. Behind a TLS-terminating proxy, enabling it takes three steps: make the server trust that proxy's forwarded headers (the FORWARDED_ALLOW_IPS environment variable, which defaults to 127.0.0.1 and so already covers a same-host proxy — set it to the proxy's address otherwise, and never to *), then set the public host in FASTMCP_HTTP_ALLOWED_HOSTS='["mcp.example.com"]' (a JSON array, not a bare hostname), and only then set FASTMCP_HTTP_HOST_ORIGIN_PROTECTION=auto. Skipping the allowlist answers 421 Misdirected Request; skipping the trusted forwarded headers makes the server compare an http origin against the browser's https Origin and answer 403. See configuration.

In HTTP mode the server also serves GET /health, a readiness check that probes the NextDNS API with the configured key: it returns 200 only when the credentials work, and 503 with a failure class (auth or unreachable) when they do not. See the FAQ.

Binding to a non-loopback interface (explicit opt-in)

To make the endpoint reachable from other hosts you must explicitly set MCP_HOST to a non-loopback address (e.g. 0.0.0.0 or a specific IP). The server logs a prominent SECURITY warning on startup when this happens, because it exposes every tool — and the full reachability of your NextDNS API key — to anyone who can reach the port.

A non-loopback bind is only production-suitable when it is fronted by a reverse proxy (or gateway) that provides authentication and/or TLS, such that unauthenticated remote callers cannot reach the /mcp endpoint. Recommended setup:

  • Terminate TLS at the reverse proxy.

  • Require authentication (e.g. a shared secret, OAuth2/OIDC, or IP allow-listing) before forwarding to the MCP server.

  • Bind the MCP server itself to a private interface or 127.0.0.1 behind the proxy where possible.

# Loopback-only (default; see the Host/Origin validation note above):
MCP_TRANSPORT=http uv run python -m nextdns_mcp.server

# Non-loopback bind — MUST be placed behind an authenticating reverse proxy:
MCP_TRANSPORT=http MCP_HOST=0.0.0.0 uv run python -m nextdns_mcp.server

Architecture

This server uses a modern, declarative approach:

  1. OpenAPI Specification (nextdns-openapi.yaml): Complete NextDNS API documentation

  2. FastMCP Foundation: Server built from grouped CRUD tools registered in src/nextdns_mcp/tools/; the OpenAPI spec is a reference for validation only (issues #141/#146)

  3. HTTP Client: Authenticated httpx.AsyncClient with profile-level access control for NextDNS API calls

  4. MCP Protocol: Tools, resources, and prompts exposed via Model Context Protocol

Key Components

  • src/nextdns_mcp/nextdns-openapi.yaml: OpenAPI 3.0 specification for NextDNS API (reference/validation only); a Spectral lint workflow (openapi-lint.yml) enforces explicit per-operation security declarations via spectral.yaml, runnable locally with npx @stoplight/spectral lint -r spectral.yaml src/nextdns_mcp/nextdns-openapi.yaml

  • src/nextdns_mcp/server.py: FastMCP server implementation

  • Dockerfile: Container definition with OCI labels for container metadata

  • AGENT.md: Development guidelines and safety rules

Docker Tags

This project publishes official Docker images with a standardized tagging policy. The default image is based on python:3.14-slim; an Alpine Linux variant is also available and tagged with an -alpine suffix.

Primary (python:3.14-slim) tags

  • :latest: Floating tag that tracks the most recent successful build from the main branch. This tag is rebuilt on changes to main and via scheduled rebuilds.

  • :<major>: Floating tag for the most recent build in a given major series (e.g., :2). This tag is updated whenever a new image for that major line is published and may include unreleased changes if the corresponding build comes from a branch head.

  • :<major>.<minor>: Floating tag for the most recent build in a given minor series (e.g., :2.0). Like :<major>, it is updated when new images are built for that series and may include unreleased changes.

  • :<major>.<minor>.<patch>: Tags for specific application releases (e.g., :2.0.3). These are intended to be immutable once published via the release workflow.

Alpine tags

  • :alpine: Floating tag for the most recent Alpine build from main.

  • :<major>-alpine: Floating tag for the most recent Alpine build in a major series (e.g., :2-alpine).

  • :<major>.<minor>-alpine: Floating tag for the most recent Alpine build in a minor series (e.g., :2.0-alpine).

  • :<major>.<minor>.<patch>-alpine: Specific Alpine release tag (e.g., :2.0.3-alpine).

All floating tags (:latest, :<major>, :<major>.<minor> and their -alpine counterparts) are rebuilt regularly to include the latest OS security updates and any application changes present in the source commit used for that build. Consumers who require strict version pinning should use the full :<major>.<minor>.<patch> or :<major>.<minor>.<patch>-alpine tags.

License

This project is released under the MIT License.

Contributing

  1. See AGENT.md for guidelines and architecture

  2. Note that NextDNS does not provide an OpenAPI specification. This is based on their documentation and may not reflect the current state of the API.

Available Tools

8 tools
dohLookupDohlookupC

Perform a DNS-over-HTTPS lookup using a NextDNS profile.

NameRequiredDescriptionDefault
domainYesThe domain name to look up (e.g., "adwords.google.com")
profile_idNoNextDNS profile ID. If not provided, uses NEXTDNS_DEFAULT_PROFILE.
record_typeNoDNS record type to query (default "A").A

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Lookup' implies a non-mutating read, which is useful, but nothing is said about authentication requirements, rate limits, whether the profile must pre-exist, or how the default-profile fallback behaves at runtime.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no waste. It is efficient, though the brevity edges toward under-specification rather than optimal conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return-value explanation is not required, and the three parameters are fully covered by the schema. However, with no annotations and no usage or behavioral context, the definition is only minimally sufficient for an agent to invoke this confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents domain, profile_id (including the NEXTDNS_DEFAULT_PROFILE fallback), and record_type. The description adds no parameter meaning beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (lookup) and resource (DNS-over-HTTPS via a NextDNS profile), which an agent can distinguish from the manage*/analytics siblings. It stops short of saying anything that would differentiate it from a hypothetical non-DoH DNS lookup, but the purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no indication of when to use this tool versus the sibling tools (queryAnalytics, manageLogs) or when a DoH lookup is the right approach. There are no prerequisites or exclusion conditions stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manageListsManagelistsC

Manage allow/deny/block lists for a NextDNS profile.

NameRequiredDescriptionDefault
entryNo
entriesNo
entry_idNo
list_typeYes
operationYes
profile_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure, yet it provides none. It does not mention that operations like remove and replace are destructive, what permissions are required, whether changes are reversible, or how the profile state is affected. The word 'manage' weakly implies mutation but adds no real transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no wasted words. Its conciseness is efficient, but the extremely sparse content leaves the definition under-specified rather than optimally focused.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, but this is a 6-parameter, multi-operation mutation tool with no annotations and 0% schema description coverage. The description does not come close to covering the operational and parameter complexity an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 6 parameters with 0% description coverage, and the tool description mentions none of them—not list_type, operation, profile_id, entry, entries, or entry_id. The presence of enums for list_type and operation helps the schema, but the description adds no semantic meaning beyond what is structurally encoded.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource domain (allow/deny/block lists for a NextDNS profile) and implicitly distinguishes itself from siblings like manageProfiles and manageSettings. However, the verb 'manage' is broad and does not specify the supported operations (get/add/replace/update/remove) defined in the schema. An agent knows the general area but not the tool's actual capabilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as manageRewrites or manageSettings, nor any prerequisites or exclusions. The description only states the domain, leaving the agent to infer usage context entirely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manageLogsManagelogsC

Manage query logs for a NextDNS profile.

NameRequiredDescriptionDefault
rawNo
userNo
limitNo
deviceNo
to_timeNo
from_timeNo
operationYes
profile_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it does not disclose that 'clear' is destructive and irreversible or that 'download' returns a file payload. Auth requirements, rate limits, and whether log clearing can be undone are entirely absent, leaving a mutation-capable tool opaque.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence is efficient in word count but is under-specified rather than concise; it leaves the only real information (the three operations and their differing behavior) unstated. Being terse is not a virtue here because there is essentially nothing front-loaded beyond the resource name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values needn't be explained, but for an 8-parameter tool with a destructive 'clear' operation and zero annotations, the description is far too thin. It should at minimum explain the operation modes and warn about irreversible log clearing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 8 parameters, and the description supplies no parameter meaning whatsoever. Nothing explains how 'operation' gates the relevance of raw/user/device/limit/from_time/to_time, so the agent must guess at filter semantics and time format (string vs integer).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (query logs) and the scope (a NextDNS profile), but the verb 'manage' is vague and hides that the tool actually performs three distinct operations (get, clear, download) declared only in the enum. It gives partial differentiation from analytics siblings by naming 'query logs', but an agent cannot tell from the text what capability it actually exposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus siblings like queryAnalytics or plotAnalytics, and no prerequisites. The only usage signal is implicit in the tool name, leaving the agent to infer that this is for raw log retrieval/clearing rather than aggregated analytics.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manageProfilesManageprofilesC

Manage NextDNS profiles.

NextDNS profiles are named configurations that contain DNS settings, blocklists, analytics, and logs. Most other tools require a profile_id from this tool.

NameRequiredDescriptionDefault
nameNo
cursorNo
operationYes
profile_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it discloses almost no behavior. It does not mention that the delete operation is destructive and irreversible, what permissions are required, or that cursor implies pagination for list. The profile-domain explanation is context, not behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the purpose and followed by domain context and the cross-tool dependency note. Nothing is padded, though the brevity comes at the cost of substance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, but for a multi-operation CRUD tool with no annotations and zero schema coverage the description is far too thin. It omits operation-specific requirements (name for create, profile_id for get/update/delete) and any warning about the destructive delete path.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across four parameters, and the description only obliquely explains profile_id. The operation enum's five values, the name parameter, and the cursor parameter are entirely undocumented in both schema and description, leaving the agent to guess which parameters apply to which operation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The resource is named specifically (NextDNS profiles) and the description explains what a profile is, which is genuinely helpful. But the verb is the generic 'manage' and the fact that this tool multiplexes five distinct operations (list/create/get/update/delete) is never surfaced, so an agent cannot tell what it actually does beyond 'profile things'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The line 'Most other tools require a profile_id from this tool' is a real workflow hint that implies list/get should come first to obtain an ID. Beyond that there is no guidance on which operation to pick, when not to use it, or how it relates to manageSettings/manageLists which presumably operate on the same profiles.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manageRewritesManagerewritesC

Manage DNS rewrite entries for a NextDNS profile.

Rewrites let you return a custom answer for a hostname. Typical uses:

  • Point an internal hostname to a private IP.

  • Block a domain by rewriting it to 0.0.0.0.

NameRequiredDescriptionDefault
nameNo
contentNo
entry_idNo
operationYes
profile_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full behavioral burden. It explains the effect of a rewrite (custom answer, 0.0.0.0 blocking), which is useful domain context, but says nothing about whether deletes are irreversible, whether add fails on duplicates, whether changes require confirmation, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose in the first sentence, followed by a short explanatory block. The bullets are slightly redundant with the first sentence but still short and readable; nothing is bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, but this is a multi-operation read/write tool with no annotations and zero parameter documentation. The per-operation contract (required fields for add vs delete vs list) is essential information an agent needs to invoke it correctly and is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across five parameters, so the description must compensate and it largely does not. The uses hint at a hostname/answer pairing (implying name and content) and entry_id for targeting, but the crucial mapping of which parameters are required for which of the list/add/delete operations is left entirely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Manage DNS rewrite entries for a NextDNS profile.' The resource (rewrites) is clearly distinct from the sibling tools (lists, profiles, settings, logs, analytics), so an agent can route correctly without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The bullets describe what rewrites are used for ('point a hostname to a private IP', 'block a domain'), not when to call this tool instead of manageLists or manageSettings. There is no guidance on which operation to pick or under what conditions to add versus delete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manageSettingsManagesettingsC

Manage a settings category for a NextDNS profile.

NameRequiredDescriptionDefault
categoryYes
settingsNo
operationYes
profile_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It does not disclose that the tool can mutate settings, whether updates replace or merge existing values, permission requirements, or the risk of changing profile behavior; "manage" obscures the read-versus-write distinction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler, but it is so terse that concision costs clarity. The structure is fine; the content is insufficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter mutation-capable tool with no annotations and 0% schema description coverage, the description is inadequate. It leaves critical gaps around get versus update behavior, required settings for updates, and the category enum, even though an output schema exists to cover return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description should compensate but adds no meaning for any parameter. It does not explain the category enum values, the operation enum's get/update semantics, how profile_id is used, or what shape the settings argument expects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a verb and resource ("Manage a settings category for a NextDNS profile"), so an agent can tell it is about profile settings rather than lists or rewrites. However, "manage" is vague and does not clarify that the tool supports both reading and updating settings, nor how it differs from siblings beyond the resource name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus siblings, nor on when to choose get versus update. The only implied usage is that the target is a settings category on a NextDNS profile.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plotAnalyticsPlotanalyticsA

Generate a PNG line chart for a NextDNS analytics time-series metric.

Use this to visualize query trends over time. The profile should have recent query history; otherwise the tool returns an error explaining that no data is available.

Supported metrics: status, devices, protocols, queryTypes, ipVersions, dnssec, encryption, reasons, ips.

Time values can be Unix timestamps or relative strings like -1d.

The ;series endpoint takes no limit parameter: limit is part of this tool's published surface, is rejected above 500 rather than clamped, and is never forwarded, so the requested range is the only thing that bounds the response. Three server-side limits are enforced before the request is built, and each is rejected with an invalid_argument error naming the limit rather than silently adjusted:

  • interval must be between 60 and 86400 seconds.

  • limit must not exceed 500.

  • The range must be interpretable (a Unix timestamp, an ISO 8601 timestamp, now, or a relative offset such as -7d; a relative unit letter is read case-sensitively and a timestamp with no timezone is read as UTC), must end after it starts, and spans at most 2000 intervals (at most 2000 points per series), so a wide range needs a proportionally larger interval.

NameRequiredDescriptionDefault
limitNo
metricYes
to_timeNonow
intervalNo
partialsNonone
timezoneNoGMT
alignmentNoend
from_timeNo-1d
profile_idNo

TDQS

A3.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses that limit is rejected above 500 rather than clamped, that no value is forwarded to the ;series endpoint, that interval is bounded 60–86400, that ranges over 2000 intervals are rejected, and that violations raise invalid_argument errors naming the limit. It also documents time-parsing rules (relative offsets, case-sensitive unit letters, UTC default for zoneless timestamps) and the no-data error path.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The bulleted limit list is well front-loaded and scannable, but the preceding paragraph on the ';series' endpoint and 'published surface' is convoluted and repeats the limit-500 rule that the bullets state again. Implementation rationale crowds out parameter meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no annotations and no output schema, the description covers error behavior and range limits thoroughly but leaves four parameters (profile_id, partials, alignment, timezone) unexplained. An agent could call it, but only by guessing on those fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 9 parameters, so the description must compensate. It covers metric values, limit, interval bounds, and from/to time formats, but never explains profile_id, partials, alignment, or the timezone parameter's effect. Roughly half the surface remains undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource plus the output format: 'Generate a PNG line chart for a NextDNS analytics time-series metric.' An agent immediately knows this is a visualization tool, not a raw-data tool. However, it never explicitly contrasts itself with the closely named sibling queryAnalytics, so differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Offers 'Use this to visualize query trends over time' and a precondition that the profile must have recent query history or an error is returned. That is useful context, but there is no guidance on when to prefer queryAnalytics over this charting tool, nor when profile_id should be supplied versus omitted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

queryAnalyticsQueryanalyticsD

Query NextDNS analytics metrics.

NameRequiredDescriptionDefault
rootNo
limitNo
cursorNo
deviceNo
metricYes
seriesNo
statusNo
to_timeNo
intervalNo
partialsNo
timezoneNo
alignmentNo
from_timeNo
profile_idYes
destination_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

D1.8/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden and discloses nothing: not pagination behavior despite cursor/limit parameters, not default time windows, not rate limits, not whether results are aggregated or raw. For a 15-parameter read tool with zero annotation coverage this is a serious gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single short sentence with no padding, but at this level of complexity brevity is under-specification rather than conciseness. Nothing is front-loaded beyond the bare verb and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Although an output schema exists and need not be described, the input side is completely undocumented: 15 parameters, an 11-value metric enum, and no annotations. An agent cannot determine valid filter combinations, time-range semantics, or pagination from this description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 15 parameters, and the description adds no parameter meaning at all. Ambiguous fields such as metric, series, partials, alignment, interval, destination_type, and the from_time/to_time dual string-or-integer types are left entirely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Query') and resource ('NextDNS analytics metrics'), so the general purpose is graspable. It does not distinguish itself from the sibling plotAnalytics, which also operates on analytics data, leaving the boundary between 'query' and 'plot' to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this versus plotAnalytics, no prerequisites (e.g. needing a profile_id), and no mention of what to do when no time range is supplied. The single sentence implies only that it is for analytics retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 1 tool updatev3.2.0
    • ChangedmanageProfiles1 field changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  2. 2 tool updatesv3.1.5
    • AddeddohLookup
    • AddedmanageSettings
  3. 3 tool updatesv3.1.3
    • RemoveddohLookup
    • AddedmanageLists
    • AddedmanageRewrites
  4. 3 tool updatesv3.1.2
    • RemovedmanageLists
    • RemovedmanageRewrites
    • RemovedmanageSettings

TDQS

C2.8/5.0

Scored across 8 tools

Disambiguation4/5

Each of the five manage* tools targets a clearly distinct NextDNS resource (profiles, lists, settings, rewrites, logs), so misselection is unlikely. The only pair with potential overlap is queryAnalytics vs plotAnalytics, but the descriptions clearly separate raw metrics from chart rendering, and dohLookup is unique.

Naming Consistency4/5

Five tools follow a uniform snake_case-ish camelCase 'manage<Resource>' pattern, and queryAnalytics/plotAnalytics are consistent verb+noun camelCase. The only deviation is dohLookup, which puts the noun (DoH) before the verb, and the generic 'manage' verb hides which sub-operations are supported.

Tool Count5/5

Eight tools is well within the sweet spot and each maps to a real NextDNS capability area. Nothing appears redundant or missing at the count level; the analytics surface is split into query and plot, which is justified by distinct outputs (JSON metrics vs PNG).

Completeness4/5

The surface covers profiles, lists, settings, rewrites, logs, DoH resolution, and analytics query/visualization, which is essentially the whole NextDNS feature set. Minor gaps exist around account/API-key-level operations and configuration export/import, but core lifecycle coverage per resource is present.

Maintenance

ActivityActive
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    A
    maintenance
    Real-time DNS security analysis for AI assistants via MCP. Enables DNSSEC chain validation, email authentication posture, and registration intelligence directly from chat sessions.
    1
    -
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI assistants to manage DNS filtering accounts by blocking or allowing domains, checking policies, reviewing blocked queries, and managing filter categories, schedules, and devices through natural language.
    16
    50 npm
    1
    MIT