Skip to main content
Glama
rosschurchill

Technitium MCP Secure

dns_remove_blocked

Remove a domain from the block list to stop denying access and restore DNS resolution.

Instructions

Remove a domain from the block list. The domain will no longer be denied.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
domainYesDomain name to remove from block list

Implementation Reference

  • The handler function for dns_remove_blocked. Validates the domain, calls /api/blocked/delete, and returns success JSON.
    readonly: false,
    handler: async (args) => {
      const domain = validateDomain(args.domain as string);
      const data = await client.callOrThrow("/api/blocked/delete", {
        domain,
      });
      return JSON.stringify(
        { success: true, removed: domain, ...data },
        null,
        2
      );
    },
  • The tool definition/schema for dns_remove_blocked, including name, description, and inputSchema (domain string).
    {
      definition: {
        name: "dns_remove_blocked",
        description:
          "Remove a domain from the block list. The domain will no longer be denied.",
        inputSchema: {
          type: "object",
          properties: {
            domain: {
              type: "string",
              description: "Domain name to remove from block list",
            },
          },
          required: ["domain"],
        },
      },
  • blockingTools() function registers dns_remove_blocked as part of the blocking tools array. It's exported and used by getAllTools in src/tools/index.ts.
    export function blockingTools(client: TechnitiumClient): ToolEntry[] {
      return [
        {
          definition: {
            name: "dns_list_blocked",
            description:
              "List blocked DNS zones (domains that are denied). Returns a hierarchical tree — call with no domain to see top-level zones, then pass a domain (e.g. 'com') to drill into subdomains.",
            inputSchema: {
              type: "object",
              properties: {
                domain: {
                  type: "string",
                  description:
                    "Optional parent domain to list children of (e.g. 'com' to see all blocked .com domains). Omit to see top-level zones.",
                },
              },
            },
          },
          readonly: true,
          handler: async (args) => {
            const params: Record<string, string> = {};
            if (args.domain) params.domain = validateDomain(args.domain as string);
            const data = await client.callOrThrow("/api/blocked/list", params);
            return JSON.stringify(data, null, 2);
          },
        },
        {
          definition: {
            name: "dns_block_domain",
            description:
              "Block a domain name. Queries to this domain will be denied by the DNS server.",
            inputSchema: {
              type: "object",
              properties: {
                domain: {
                  type: "string",
                  description: "Domain name to block (e.g. ads.example.com)",
                },
              },
              required: ["domain"],
            },
          },
          readonly: false,
          handler: async (args) => {
            const domain = validateDomain(args.domain as string);
            const data = await client.callOrThrow("/api/blocked/add", {
              domain,
            });
            return JSON.stringify(
              { success: true, blocked: domain, ...data },
              null,
              2
            );
          },
        },
        {
          definition: {
            name: "dns_list_allowed",
            description:
              "List allowed DNS zones (domains that bypass block lists). Returns a hierarchical tree — call with no domain to see top-level zones, then pass a domain (e.g. 'com') to drill into subdomains.",
            inputSchema: {
              type: "object",
              properties: {
                domain: {
                  type: "string",
                  description:
                    "Optional parent domain to list children of (e.g. 'com' to see all allowed .com domains). Omit to see top-level zones.",
                },
              },
            },
          },
          readonly: true,
          handler: async (args) => {
            const params: Record<string, string> = {};
            if (args.domain) params.domain = validateDomain(args.domain as string);
            const data = await client.callOrThrow("/api/allowed/list", params);
            return JSON.stringify(data, null, 2);
          },
        },
        {
          definition: {
            name: "dns_allow_domain",
            description:
              "Allow a domain name, bypassing any block lists. Useful for whitelisting false positives.",
            inputSchema: {
              type: "object",
              properties: {
                domain: {
                  type: "string",
                  description: "Domain name to allow (e.g. plex.direct)",
                },
              },
              required: ["domain"],
            },
          },
          readonly: false,
          handler: async (args) => {
            const domain = validateDomain(args.domain as string);
            const data = await client.callOrThrow("/api/allowed/add", {
              domain,
            });
            return JSON.stringify(
              { success: true, allowed: domain, ...data },
              null,
              2
            );
          },
        },
        {
          definition: {
            name: "dns_remove_allowed",
            description:
              "Remove a domain from the allow list. The domain will no longer bypass block lists.",
            inputSchema: {
              type: "object",
              properties: {
                domain: {
                  type: "string",
                  description: "Domain name to remove from allow list",
                },
              },
              required: ["domain"],
            },
          },
          readonly: false,
          handler: async (args) => {
            const domain = validateDomain(args.domain as string);
            const data = await client.callOrThrow("/api/allowed/delete", {
              domain,
            });
            return JSON.stringify(
              { success: true, removed: domain, ...data },
              null,
              2
            );
          },
        },
        {
          definition: {
            name: "dns_remove_blocked",
            description:
              "Remove a domain from the block list. The domain will no longer be denied.",
            inputSchema: {
              type: "object",
              properties: {
                domain: {
                  type: "string",
                  description: "Domain name to remove from block list",
                },
              },
              required: ["domain"],
            },
          },
          readonly: false,
          handler: async (args) => {
            const domain = validateDomain(args.domain as string);
            const data = await client.callOrThrow("/api/blocked/delete", {
              domain,
            });
            return JSON.stringify(
              { success: true, removed: domain, ...data },
              null,
              2
            );
          },
        },
        {
          definition: {
            name: "dns_flush_allowed",
            description:
              "Flush the entire allow list. All allowed domains will be removed. Requires confirm=true to execute.",
            inputSchema: {
              type: "object",
              properties: {
                confirm: {
                  type: "boolean",
                  description:
                    "Must be true to confirm flush. Without this, returns a warning instead.",
                },
              },
            },
          },
          readonly: false,
          handler: async (args) => {
            if (args.confirm !== true) {
              return JSON.stringify(
                {
                  warning:
                    "This will remove ALL domains from the allow list. Set confirm=true to proceed.",
                },
                null,
                2
              );
            }
            const data = await client.callOrThrow("/api/allowed/flush");
            return JSON.stringify(
              { success: true, message: "Allow list flushed", ...data },
              null,
              2
            );
          },
        },
        {
          definition: {
            name: "dns_flush_blocked",
            description:
              "Flush the entire custom block list. All manually blocked domains will be removed. Requires confirm=true to execute.",
            inputSchema: {
              type: "object",
              properties: {
                confirm: {
                  type: "boolean",
                  description:
                    "Must be true to confirm flush. Without this, returns a warning instead.",
                },
              },
            },
          },
          readonly: false,
          handler: async (args) => {
            if (args.confirm !== true) {
              return JSON.stringify(
                {
                  warning:
                    "This will remove ALL domains from the custom block list. Set confirm=true to proceed.",
                },
                null,
                2
              );
            }
            const data = await client.callOrThrow("/api/blocked/flush");
            return JSON.stringify(
              { success: true, message: "Block list flushed", ...data },
              null,
              2
            );
          },
        },
      ];
    }
  • getAllTools() collects all tool arrays including blockingTools(), which registers dns_remove_blocked.
    export function getAllTools(client: TechnitiumClient): ToolEntry[] {
      return [
        ...dashboardTools(client),
        ...dnsClientTools(client),
        ...zoneTools(client),
        ...recordTools(client),
        ...blockingTools(client),
        ...cacheTools(client),
        ...settingsTools(client),
        ...logTools(client),
        ...appTools(client),
        ...dnssecTools(client),
      ];
    }
  • src/index.ts:35-41 (registration)
    In the MCP server setup, all tools are loaded into a toolMap by name, which is used to dispatch calls to dns_remove_blocked's handler.
    const toolMap = new Map(tools.map((t) => [t.definition.name, t]));
    const rateLimiter = new RateLimiter();
    
    const server = new Server(
      { name: "technitium-mcp", version: VERSION },
      { capabilities: { tools: {} } }
    );

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv1.2.0

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations provided, the description must disclose behavioral traits. It states the immediate effect ('will no longer be denied') but does not mention whether the action is reversible, whether it affects DNS resolution immediately, or any permissions or side effects. This is a mutation tool, and the description carries a thin behavioral burden.

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

Conciseness5/5

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

The description is two short sentences, front-loaded with the verb and resource. Every word earns its place; there is no filler, redundancy, or unnecessary detail.

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 simple one-parameter tool with no output schema, the description covers the core action and consequence. However, it lacks any usage guidance or behavioral context beyond the basic effect, making it merely adequate rather than complete for an agent that needs to select and invoke the tool correctly.

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%: the schema already fully describes the 'domain' parameter as 'Domain name to remove from block list'. The description adds no additional semantic detail beyond what the schema provides, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Remove') and resource ('a domain from the block list'), clearly distinguishing this from sibling tools like dns_remove_allowed (which operates on the allow list) and dns_block_domain (which adds to the block list). It is concise and 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 provides no explicit guidance on when to use this tool versus alternatives. It does not mention that it should be used to unblock a previously blocked domain, nor does it contrast with dns_remove_allowed or dns_block_domain. The usage context is only implied by the tool name and sibling list, not by the description.

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