cloudflare-dns · git:20260801.3cb01ce · 2026-08-01 · sha256 5ef1261bfab4853f

cloudflare-dns git:20260801.3cb01ceA

Immutable. This exact content is served forever at /api/v1/blob/5ef1261bfab4853f.

---
name: cloudflare-dns
description: Use the flarectl command-line tool to manage Cloudflare DNS records, including listing, adding, updating, and deleting DNS records, as well as querying zone information. This skill must be triggered whenever a user mentions "Cloudflare DNS," "CF DNS," "add DNS record," "delete DNS record," "update DNS," "view DNS records," "cloudflare-dns," "flarectl," or any scenario involving Cloudflare DNS management.
---

# Cloudflare DNS Management

## Environment Setup

### Install flarectl

In the current environment (Alpine Linux arm64), the preinstalled version can be used directly. If it is not available, install it from the release:

```bash
if ! which flarectl > /dev/null 2>&1; then
  wget -q https://github.com/wsvn53/flarectl/releases/download/flarectl-v0.1.0-alpine-arm64/flarectl-linux-arm64 \
    -O /usr/local/bin/flarectl && chmod +x /usr/local/bin/flarectl
fi
```

### Authentication Configuration

flarectl supports two authentication methods. Prefer the API Token method:

**Method 1: API Token (recommended)**
```bash
export CF_API_TOKEN=<your_token>
```

**Method 2: Global API Key**
```bash
export CF_API_KEY=<your_key>
export CF_API_EMAIL=<your_email>
```

Optional:
```bash
export CF_ACCOUNT_ID=<account_id>   # Specify when using multiple accounts
```

Check whether the environment variables are set:
```bash
[ -n "$CF_API_TOKEN" ] && echo "Token: set" || echo "Token: NOT SET"
[ -n "$CF_API_KEY" ] && echo "API Key: set" || echo "API Key: NOT SET"
```

If they are not set, tell the user which variable names are required and provide setup links:
- API Token: [Set CF_API_TOKEN](minis://settings/environments?create_key=CF_API_TOKEN&create_value=)
- API Key: [Set CF_API_KEY](minis://settings/environments?create_key=CF_API_KEY&create_value=) and [Set CF_API_EMAIL](minis://settings/environments?create_key=CF_API_EMAIL&create_value=)

---

## Common Operations

### Query the Zone List

```bash
flarectl zone list
```

Example output:
```
ID                               NAME          PLAN   STATUS
abc123...                        example.com   Free   active
```

### List DNS Records

```bash
# List all records for a domain
flarectl dns list --zone example.com

# Filter by type
flarectl dns list --zone example.com --type A

# Filter by name
flarectl dns list --zone example.com --name sub.example.com

# Output in JSON format (useful for parsing IDs)
flarectl --json dns list --zone example.com
```

### Add DNS Records

```bash
# A record
flarectl dns create --zone example.com --type A --name sub.example.com --content 1.2.3.4 --ttl 1

# CNAME record (enable orange-cloud proxy)
flarectl dns create --zone example.com --type CNAME --name www.example.com --content example.com --proxy

# MX record
flarectl dns create --zone example.com --type MX --name example.com --content mail.example.com --priority 10

# TXT record
flarectl dns create --zone example.com --type TXT --name _dmarc.example.com --content "v=DMARC1; p=none"

# AAAA record (IPv6)
flarectl dns create --zone example.com --type AAAA --name ipv6.example.com --content "2001:db8::1"
```

Parameter descriptions:
- `--ttl 1`: Automatic TTL (recommended); other values are in seconds (for example, `--ttl 300`)
- `--proxy`: Enable the Cloudflare orange-cloud proxy (supported only for A/AAAA/CNAME records)

### Update DNS Records

Updating requires the record `id`. Use `dns list` to get it first:

```bash
# Get the record ID
flarectl --json dns list --zone example.com --name sub.example.com | python3 -c "
import sys,json
for r in json.load(sys.stdin):
    print(r['id'], r['type'], r['name'], r['content'])
"

# Update the content
flarectl dns update --zone example.com --id <record_id> --content 5.6.7.8

# Update and enable proxy
flarectl dns update --zone example.com --id <record_id> --content 5.6.7.8 --proxy
```

### Create or Update (upsert)

```bash
# Update if it exists; create it if it does not exist
flarectl dns create-or-update --zone example.com --type A --name sub.example.com --content 1.2.3.4
```

### Delete DNS Records

```bash
# Look up the ID first
flarectl --json dns list --zone example.com --name sub.example.com | python3 -c "
import sys,json
for r in json.load(sys.stdin):
    print(r['id'], r['name'], r['type'])
"

# Delete
flarectl dns delete --zone example.com --id <record_id>
```

### Batch Delete Records with the Same Name

```bash
flarectl --json dns list --zone example.com --name sub.example.com | python3 -c "
import sys,json,subprocess
for r in json.load(sys.stdin):
    subprocess.run(['flarectl','dns','delete','--zone','example.com','--id',r['id']])
    print('Deleted:', r['id'], r['type'], r['content'])
"
```

---

## Workflow

1. **Verify authentication**: Check whether `CF_API_TOKEN` or `CF_API_KEY`+`CF_API_EMAIL` is set
2. **Confirm the domain**: If the user has not specified a zone, first use `flarectl zone list` to list available domains for the user to choose from
3. **Perform the operation**: Run list/create/update/delete as needed
4. **Display results**: After the operation, use `flarectl dns list --zone <zone>` to show the latest record status

## Notes

- Deletions are irreversible; confirm with the user before proceeding
- `--proxy` supports only A, AAAA, and CNAME record types
- MX records must specify `--priority`
- TXT record content that contains spaces must be enclosed in quotes
- The global flag `flarectl --json` must be placed before the subcommand.