nextdns-mcp
This MCP server lets AI assistants manage NextDNS through grouped CRUD tools.
Manage NextDNS profiles: list, create, get, update/rename, delete.
Read and update per-profile settings for categories including general, privacy, security, parental, performance, logs, and blockpage.
Manage allowlists, denylists, privacy blocklists, native tracking, security TLDs, parental categories, and parental services.
List, add, and delete DNS rewrite entries.
Get recent or raw query logs, clear logs, and download retained logs as CSV.
Query analytics metrics such as status, domains, devices, protocols, query types, IP versions, DNSSEC, encryption, reasons, IPs, and destinations, with time-series support.
Generate PNG line charts from analytics time-series data.
Perform DNS-over-HTTPS lookups using a NextDNS profile.
Provides tools for managing NextDNS profiles, settings, logs, analytics, security, privacy, parental controls, and content lists via the NextDNS API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@nextdns-mcpget my recent DNS query logs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Copy the
.env.examplefile to.env:cp .env.example .envEdit
.envand 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
Build the Docker image:
docker build -t nextdns-mcp:latest .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:latestOption 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:latestOr 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:latestOption C: Environment file (development)
docker run -i --rm \ --env-file .env \ nextdns-mcp:latestNote: 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
-alpinesuffix (e.g.nextdns-mcp:alpine,nextdns-mcp:2.0-alpine). Thepython:3.14-slimimage remains the recommended default.
Running Locally (Development)
Install dependencies:
uv syncRun 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 |
|
| Set to |
|
| Interface to bind. Loopback-only by default |
|
| 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.1behind 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.serverArchitecture
This server uses a modern, declarative approach:
OpenAPI Specification (nextdns-openapi.yaml): Complete NextDNS API documentation
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)HTTP Client: Authenticated
httpx.AsyncClientwith profile-level access control for NextDNS API callsMCP 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 withnpx @stoplight/spectral lint -r spectral.yaml src/nextdns_mcp/nextdns-openapi.yamlsrc/nextdns_mcp/server.py: FastMCP server implementationDockerfile: Container definition with OCI labels for container metadataAGENT.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 themainbranch. This tag is rebuilt on changes tomainand 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 frommain.:<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
See
AGENT.mdfor guidelines and architectureNote 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 toolsdohLookupDohlookupC
Perform a DNS-over-HTTPS lookup using a NextDNS profile.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The domain name to look up (e.g., "adwords.google.com") | |
| profile_id | No | NextDNS profile ID. If not provided, uses NEXTDNS_DEFAULT_PROFILE. | |
| record_type | No | DNS record type to query (default "A"). | A |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entry | No | ||
| entries | No | ||
| entry_id | No | ||
| list_type | Yes | ||
| operation | Yes | ||
| profile_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| user | No | ||
| limit | No | ||
| device | No | ||
| to_time | No | ||
| from_time | No | ||
| operation | Yes | ||
| profile_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| cursor | No | ||
| operation | Yes | ||
| profile_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| content | No | ||
| entry_id | No | ||
| operation | Yes | ||
| profile_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | ||
| settings | No | ||
| operation | Yes | ||
| profile_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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:
intervalmust be between 60 and 86400 seconds.limitmust 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 largerinterval.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| metric | Yes | ||
| to_time | No | now | |
| interval | No | ||
| partials | No | none | |
| timezone | No | GMT | |
| alignment | No | end | |
| from_time | No | -1d | |
| profile_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| root | No | ||
| limit | No | ||
| cursor | No | ||
| device | No | ||
| metric | Yes | ||
| series | No | ||
| status | No | ||
| to_time | No | ||
| interval | No | ||
| partials | No | ||
| timezone | No | ||
| alignment | No | ||
| from_time | No | ||
| profile_id | Yes | ||
| destination_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 tool update
v3.2.0- Changed
manageProfiles1 field changed- added
Input schema / properties / cursorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null +}
2 tool updates
v3.1.5- Added
dohLookup - Added
manageSettings
3 tool updates
v3.1.3- Removed
dohLookup - Added
manageLists - Added
manageRewrites
3 tool updates
v3.1.2- Removed
manageLists - Removed
manageRewrites - Removed
manageSettings
TDQS
Scored across 8 tools
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.
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.
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).
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
Related MCP Connectors
Context and control for any AI. Agent identity, scoped access, and proof across tools.
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Manage hosts, redirects, SSL, and traffic analytics from Claude and other AI assistants.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceReal-time DNS security analysis for AI assistants via MCP. Enables DNSSEC chain validation, email authentication posture, and registration intelligence directly from chat sessions.1-
- FlicenseNot gradedqualityDmaintenanceMCP server for NextDNS that enables managing profiles, blocklists, analytics, DNS logs, and parental controls through natural language.-
- AlicenseAqualityCmaintenanceEnables AI assistants to manage Cloudflare zones and DNS records through the Model Context Protocol, including listing, fetching, creating, updating, and deleting DNS records.7MIT

Koru Shield MCP Serverofficial
AlicenseBqualityBmaintenanceEnables 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.1650 npm1MIT