Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
NEXTDNS_API_KEYNoYour NextDNS API key
NEXTDNS_READ_ONLYNoSet to 'true' to enable read-only mode
NEXTDNS_API_KEY_FILENoPath to a file containing the API key
NEXTDNS_TEST_PROFILENoProfile ID for write operation tests
NEXTDNS_DEFAULT_PROFILENoOptional default profile ID
NEXTDNS_READABLE_PROFILESNoComma-separated list of readable profiles
NEXTDNS_WRITABLE_PROFILESNoComma-separated list of writable profiles

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
manageProfilesA

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.

Operations: - list: Return profiles the API key can access (supports cursor for pagination). - create: Create a new profile (requires name). - get: Retrieve a single profile (requires profile_id). - update: Rename a profile (requires profile_id and name). - delete: Remove a profile (requires profile_id).

Examples: - list: manageProfiles(operation="list") - list (page): manageProfiles(operation="list", cursor="j2k3zl3b4v") - create: manageProfiles(operation="create", name="Home Network") - get: manageProfiles(operation="get", profile_id="abc123")

manageSettingsA

Manage a settings category for a NextDNS profile.

Settings categories: - general: Core profile settings (e.g., name, web3 blocking). - privacy: Privacy features such as disguised-tracker blocking and affiliate links. - security: Threat intelligence, Google Safe Browsing, typosquatting protection. - parental: Parental control enablement (safe search, YouTube restricted mode). - performance: ECS, cache boost, and other performance options. - logs: Query-logging enablement and retention. - blockpage: Whether to show a custom block page for blocked queries.

Operations: - get: Retrieve current settings for the category. - update: Apply new settings (requires settings payload).

The settings argument can be a Python dict or a JSON string. For update, first call get to see the current schema, then send only the fields you want to change.

Examples: - get: manageSettings(operation="get", category="privacy", profile_id="abc123") - update: manageSettings(operation="update", category="privacy", profile_id="abc123", settings={"disguisedTrackers": True})

manageListsA

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

List types: - allowlist / denylist: Always-allow or always-block specific domains. - privacy_blocklists: Subscribed blocklists (e.g., nextdns-recommended). - privacy_natives: Native tracking blockers (e.g., apple, facebook). - security_tlds: Dangerous top-level domains to block (e.g., zip). - parental_categories: Content categories (e.g., gambling, porn). - parental_services: Specific apps/services (e.g., tiktok, youtube).

Operations: - get: Return the current list. - add: Append one entry (pass entry as {"id": "value"} or as a plain id string). The entry must carry a string id; an entry without one is rejected locally with invalid_argument rather than sent upstream. - remove: Delete one entry by entry_id. - update: Toggle an existing entry by entry_id (pass entry={"active": True|False}). Only supported for allowlist, denylist, parental_categories, and parental_services. - replace: Replace the entire list with entries (list of dicts). Each entry must be an object with a string id; a malformed entry is rejected locally with invalid_argument naming its index, rather than sent upstream.

Examples: - get: manageLists(list_type="denylist", operation="get", profile_id="abc123") - add: manageLists(list_type="denylist", operation="add", profile_id="abc123", entry={"id": "example.com"}) - remove: manageLists(list_type="denylist", operation="remove", profile_id="abc123", entry_id="example.com") - replace: manageLists(list_type="privacy_blocklists", operation="replace", profile_id="abc123", entries=[{"id": "nextdns-recommended"}]) - add parental category: manageLists(list_type="parental_categories", operation="add", profile_id="abc123", entry={"id": "gambling"}) - update parental service: manageLists(list_type="parental_services", operation="update", profile_id="abc123", entry_id="tiktok", entry={"active": False})

manageRewritesA

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.

Operations: - list: Show existing rewrites. - add: Create a rewrite (requires name and content). - delete: Remove a rewrite (requires entry_id from list).

Examples: - list: manageRewrites(operation="list", profile_id="abc123") - add: manageRewrites(operation="add", profile_id="abc123", name="router.home", content="192.168.1.1") - delete: manageRewrites(operation="delete", profile_id="abc123", entry_id="<id-from-list>")

manageLogsA

Manage query logs for a NextDNS profile.

Operations: - get: Return recent query log entries (use limit to cap results). Set raw=true to bypass deduplication/noise filtering. - clear: Delete all stored logs for the profile. - download: Download retained logs as CSV. from_time and to_time are ignored by the NextDNS download endpoint. The CSV is streamed to a temporary file; only the file path, size, row count, and a small capped preview are returned (the full text is never inlined). A hard total-size cap bounds how much is streamed to disk (the NEXTDNS_DOWNLOAD_MAX_BYTES environment variable, default 1 GiB); a download that would exceed it is aborted mid-stream and the partial file is removed. On success the temp file is not cleaned up: the CSV stays in the OS temp directory (mode 0600) and the returned path is the only record of it, so delete it when it is no longer needed. Failed downloads do remove the temp file and its parent directory.

Time values can be Unix timestamps or relative strings like -1d or -7d. They are only used by get.

limit is clamped server-side to the range 1-1000 entries for get (the range accepted by the NextDNS API): values above 1000 are reduced to 1000 and non-positive values to 1. The clamp is silent, so ask for at most 1000.

Examples: - get recent: manageLogs(operation="get", profile_id="abc123", limit=10) - get raw logs: manageLogs(operation="get", profile_id="abc123", raw=true) - download: manageLogs(operation="download", profile_id="abc123", from_time="-1d") - clear: manageLogs(operation="clear", profile_id="abc123")

queryAnalyticsA

Query NextDNS analytics metrics.

Metrics: - status: Query resolution status (default, blocked, allowed, relayed). - domains: Top domains; supports the status and root filters. - devices: Queries per device. - protocols: DNS transport protocol (DoH, DoT, Do53 UDP/TCP, DoQ). - queryTypes: DNS record types requested (A, AAAA, CNAME, etc.). - ipVersions: IPv4 vs IPv6 queries. - dnssec: DNSSEC validation results. - encryption: Encrypted vs unencrypted queries. - reasons: Why queries were blocked or allowed. - ips: Top source IPs. - destinations: Top destinations; requires destination_type such as countries or gafam.

Set series=true to fetch time-series data instead of aggregate totals. Time values can be Unix timestamps or relative strings like -1d. Note: series=true is not supported when metric="domains".

limit is clamped server-side to the range 1-500 (the range accepted by the NextDNS API): values above 500 are reduced to 500 and non-positive values to 1. The clamp is silent, so ask for at most 500.

Optional filters: - cursor: Pagination cursor from a previous response. - device: Filter analytics to a single device id. - status: For the domains metric, filter by resolution status. - root: For the domains metric, group results by root domain (boolean).

Examples: - totals: queryAnalytics(metric="status", profile_id="abc123", from_time="-1d") - time series: queryAnalytics(metric="status", profile_id="abc123", from_time="-1d", series=true) - destinations: queryAnalytics(metric="destinations", profile_id="abc123", from_time="-1d", destination_type="countries")

plotAnalyticsA

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.

Examples: - plotAnalytics(metric="status", profile_id="abc123", from_time="-1d") - plotAnalytics(metric="devices", profile_id="abc123", from_time="-7d", interval=86400) - a year of data: plotAnalytics(metric="status", profile_id="abc123", from_time="-1y", interval=43200)

Returns: An MCP ImageContent PNG chart, or an error dict if data is unavailable.

dohLookupC

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

Prompts

Interactive templates invoked by user choice

NameDescription
nextdns-usage-guideComprehensive guide for using the NextDNS MCP server tools

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation4/5

Most tools target clearly distinct resources: profiles, settings, lists, rewrites, logs, and DNS lookup. The main ambiguity is between queryAnalytics and plotAnalytics, which both cover analytics metrics but return data versus a chart, so an agent could occasionally misselect.

Naming Consistency4/5

The dominant pattern is camelCase verb_noun (manageSettings, manageProfiles, manageLists, manageRewrites, manageLogs, queryAnalytics, plotAnalytics). dohLookup is the one mild deviation because it starts with an acronym/noun rather than a verb, but the overall convention is still predictable.

Tool Count5/5

Eight tools is well-scoped for a NextDNS management server. Each tool groups a coherent operation family, and none appear redundant or gratuitous.

Completeness5/5

The surface covers profile CRUD, per-category settings get/update, allow/deny/blocklist management, rewrites, DoH lookup, log retrieval/clear/download, and analytics querying/plotting. This provides full lifecycle coverage for the domain, with no obvious dead ends for typical NextDNS administration.

Maintenance

ActivityActive
ResponsivenessWithin a week