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: {} } }
    );
Behavior2/5

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

Without annotations, the description fails to disclose behavioral traits such as whether the operation is reversible, requires specific permissions, or triggers side effects (e.g., cache invalidation). It only states the obvious effect ('no longer denied'), leaving the agent unaware of potential constraints.

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?

Two short sentences with no wasted words. Essential information is front-loaded. Every sentence serves a purpose.

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

Completeness4/5

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

For a simple tool with one parameter and no output schema, the description covers the core function. Minor gaps: it does not mention that the domain must be currently blocked to have an effect, or the broader DNS context (e.g., impact on other lists). Still, it is sufficient for basic use.

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 coverage is 100%, so the input schema already describes the single parameter. The description adds no additional meaning beyond the schema (e.g., format, validation, or case sensitivity). Baseline 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 clearly states the action ('Remove a domain from the block list') and the result ('The domain will no longer be denied'). It uses specific verb-resource pairing and distinguishes from siblings like dns_block_domain (which does the opposite) and dns_remove_allowed (which targets a different list).

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?

No guidance on when to use this tool versus alternatives like dns_block_domain, dns_remove_allowed, or dns_list_blocked. The description does not mention prerequisites (e.g., domain must be currently blocked) or provide context for proper selection among siblings.

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

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rosschurchill/technitium-mcp-secure'

If you have feedback or need assistance with the MCP directory API, please join our Discord server