URL: /mcp/tools/dns

---
title: DNS tools
description: Read and write DNS records, plus apply preset templates for common providers.
---

DNS lives on Cloudflare. The domain must have `dns_management = "domaingenius"` and a configured `cloudflare_zone_id`. Use `update_domain_settings` to enable managed DNS first.

Write operations route through the agent confirmation pipeline. If the user's threshold is exceeded, the response is `status: "pending_confirmation"` with a token + URL — surface the URL to the user, they approve, then re-call with `request_id`.

## `list_dns_records`

Required scope: `dns:read`.

<ParamField path="org_oid" type="string" required />
<ParamField path="domain" type="string" required />

<ResponseField name="id" type="string" />
<ResponseField name="name" type="string" />
<ResponseField name="type" type="string">A, AAAA, CNAME, MX, TXT, NS, etc.</ResponseField>
<ResponseField name="content" type="string" />
<ResponseField name="proxied" type="boolean" />
<ResponseField name="ttl" type="integer">Seconds, or `1` for auto.</ResponseField>
<ResponseField name="priority" type="number" />

## `create_dns_record`

Required scope: `dns:write`.

<ParamField path="org_oid" type="string" required />
<ParamField path="domain" type="string" required />
<ParamField path="type" type="string" required>Record type.</ParamField>
<ParamField path="name" type="string" required>Apex (`example.com.au`) or subdomain.</ParamField>
<ParamField path="content" type="string" required>IP, target hostname, TXT body, etc.</ParamField>
<ParamField path="ttl" type="integer" default="1">TTL in seconds, or `1` for auto.</ParamField>
<ParamField path="priority" type="number">Required for MX and SRV.</ParamField>
<ParamField path="proxied" type="boolean" default="true">Whether Cloudflare should proxy.</ParamField>
<ParamField path="request_id" type="string">Idempotency key. Auto-generated if omitted.</ParamField>

## `update_dns_record`

Replaces a record — supply every field. Same scope and params as `create_dns_record` plus:

<ParamField path="record_id" type="string" required>Record id from `list_dns_records`.</ParamField>

## `delete_dns_record`

Required scope: `dns:write`.

<ParamField path="org_oid" type="string" required />
<ParamField path="domain" type="string" required />
<ParamField path="record_id" type="string" required />
<ParamField path="request_id" type="string" />

## `list_dns_presets`

Catalog of preset templates (Vercel, Cloudflare Pages, Google Workspace MX, etc.).

Required scope: `dns:read`.

<ParamField path="org_oid" type="string" required />
<ParamField path="domain" type="string" required />

## `get_active_dns_presets`

Detect which presets are currently applied to the domain's zone.

Required scope: `dns:read`.

<ParamField path="org_oid" type="string" required />
<ParamField path="domain" type="string" required />

Returns `{ "active": ["vercel", "google_mx"] }`.

## `apply_dns_preset`

Deletes records the preset conflicts with, then creates the preset's records. Always confirms — `bulk_count=5` forces it through the confirmation pipeline.

Required scope: `dns:write`.

<ParamField path="org_oid" type="string" required />
<ParamField path="domain" type="string" required />
<ParamField path="preset" type="string" required>Key from `list_dns_presets`.</ParamField>
<ParamField path="input_values" type="object">Per-preset inputs (e.g. Vercel team id).</ParamField>
<ParamField path="request_id" type="string" />

Returns `{ "created": int, "deleted": int }`.

## `remove_dns_preset`

Removes records belonging to the preset. Same confirmation behaviour as apply.

Required scope: `dns:write`.

<ParamField path="org_oid" type="string" required />
<ParamField path="domain" type="string" required />
<ParamField path="preset" type="string" required />
<ParamField path="request_id" type="string" />
