内容
# Cloudflare DNS MCP 服务器
> **注意:** 本MCP服务器为非官方服务器,与Cloudflare无关联或背书。
[](https://www.npmjs.com/package/cloudflare-dns-mcp)
[](https://github.com/daniil-shumko/cloudflare-dns-mcp/actions/workflows/test.yml)
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org)
[](https://modelcontextprotocol.io)
> ⚠️ **安全警告**
>
> 该MCP服务器经过大量“氛围编码”,应谨慎使用。在使用之前:
>
> - **审查代码** - 该工具通过API令牌访问您的Cloudflare账户
> - **克隆仓库** - 为了安全,克隆该仓库并运行本地副本,而不是使用npx
> - **使用最小权限** - 创建具有所需权限的API令牌
> - **审核后再使用** - 代码足够简单,可以在约30分钟内审查
> - **备份DNS记录** - 使用`backup_dns_records`工具在进行任何修改之前导出DNS设置
>
> ```bash
> git clone https://github.com/daniil-shumko/cloudflare-dns-mcp
> cd cloudflare-dns-mcp && npm install && npm run build
> ```
用于管理Cloudflare DNS记录的[模型上下文协议(MCP)](https://modelcontextprotocol.io)服务器。使用Claude Desktop或Claude Code的自然语言列出域名、查看DNS记录和进行DNS更改。
## 什么是MCP?
模型上下文协议(MCP)是一个开放标准,允许Claude等AI助手安全地连接到外部工具和数据源。该服务器实现了MCP,使Claude能够与您的Cloudflare DNS设置交互。
## 功能
- **列出和搜索域名** - 查看您Cloudflare账户上的所有区域
- **完整的DNS管理** - 创建、读取、更新和删除DNS记录
- **备份和导出** - 将DNS记录导出为JSON进行备份或迁移
- **广泛的记录类型支持** - 通过`content`支持常见类型(A、AAAA、CNAME、TXT、MX、NS、SRV),通过`data`字段支持结构化类型(CAA、HTTPS、SVCB、TLSA、SSHFP、URI等)
- **灵活的标识** - 使用区域ID或域名
- **Cloudflare代理支持** - 在记录上切换橙色云(代理)状态
## 快速入门
### 1. 安装
**选项A:从npm安装(推荐)**
```bash
npm install -g cloudflare-dns-mcp
```
**选项B:克隆并本地构建(用于代码审查)**
```bash
git clone https://github.com/daniil-shumko/cloudflare-dns-mcp.git
cd cloudflare-dns-mcp
npm install
npm run build
```
### 2. 创建Cloudflare API令牌
1. 前往 [Cloudflare API令牌](https://dash.cloudflare.com/profile/api-tokens)
2. 点击 **"创建令牌"**
3. 使用 **"编辑区域DNS"** 模板
4. 复制生成的令牌
### 3. 配置Claude Desktop
将以下内容添加到您的Claude Desktop配置中:
**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
**如果通过npm安装(选项A):**
```json
{
"mcpServers": {
"cloudflare-dns": {
"command": "npx",
"args": ["cloudflare-dns-mcp"],
"env": {
"CLOUDFLARE_API_TOKEN": "your_token_here"
}
}
}
}
```
**如果本地安装(选项B):**
```json
{
"mcpServers": {
"cloudflare-dns": {
"command": "node",
"args": ["/absolute/path/to/cloudflare-dns-mcp/dist/index.js"],
"env": {
"CLOUDFLARE_API_TOKEN": "your_token_here"
}
}
}
}
```
### 4. 重启Claude Desktop
服务器现已可用。尝试询问Claude:
> "列出我所有的Cloudflare域名"
---
## 可用工具
该MCP服务器提供10种DNS管理工具:
| 工具 | 描述 |
|------|-------------|
| `add_zone` | 将新域名添加到您的Cloudflare账户 |
| `list_zones` | 列出您账户上的所有域名 |
| `get_zone_details` | 获取域名的详细信息 |
| `list_dns_records` | 列出域名的DNS记录 |
| `get_dns_record` | 获取特定记录的ID |
| `find_dns_records` | 按名称搜索记录 |
| `create_dns_record` | 创建新的DNS记录 |
| `update_dns_record` | 修改现有记录 |
| `delete_dns_record` | 删除DNS记录 |
| `backup_dns_records` | 将记录导出为JSON |
---
## 工具参考
### `add_zone`
将新域名(区域)添加到您的Cloudflare账户。添加后,您的注册商必须更新域名的名称服务器以指向Cloudflare的名称服务器。
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `name` | 字符串 | 是 | 要添加的域名(例如`example.com`) |
| `account_id` | 字符串 | 是 | 您的Cloudflare账户ID(在仪表盘URL或API中找到) |
| `type` | 字符串 | 否 | 区域类型:`full`(默认)、`partial`、`secondary`或`internal` |
**查找您的账户ID:**
- 在Cloudflare仪表盘URL:`https://dash.cloudflare.com/<ACCOUNT_ID>/...`
- 通过API:使用`list_zones`并在区域详细信息中检查`account.id`字段
**示例提示:**
- "将example.com添加到我的Cloudflare账户"
- "为mydomain.io创建新区域,账户ID为abc123"
**响应包括:**
- 用于未来操作的区域ID
- 要在注册商处配置的名称服务器
- 区域状态(通常为`pending`直到名称服务器更新)
> ⚠️ **权限注意:** 此工具每次使用都需要确认,无法永久自动批准。这是安全措施,因为添加区域会影响您的Cloudflare账户配置。
---
### `list_zones`
列出您Cloudflare账户上的所有域名(区域)。
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `page` | 数字 | 否 | 页码(默认:1) |
| `per_page` | 数字 | 否 | 每页结果数,5-50(默认:50) |
| `name` | 字符串 | 否 | 按域名过滤(部分匹配) |
| `status` | 字符串 | 否 | 按状态过滤:`active`、`pending`、`initializing`、`moved` |
**示例提示:**
- "列出我所有的域名"
- "显示我活跃的Cloudflare区域"
- "查找包含'example'的域名"
---
### `get_zone_details`
获取特定域名的详细信息,包括名称服务器、计划和设置。
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `zone_id` | 字符串 | 否* | 区域ID(32位十六进制字符串) |
| `domain_name` | 字符串 | 否* | 域名(例如`example.com`) |
*`zone_id`和`domain_name`必填一个。
**示例提示:**
- "显示example.com的详细信息"
- "mydsite.com使用什么名称服务器?"
- "example.com属于什么计划?"
---
### `list_dns_records`
列出某个域名的所有DNS记录。
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `zone_id` | 字符串 | 否* | 区域ID |
| `domain_name` | 字符串 | 否* | 域名 |
| `type` | 字符串 | 否 | 按记录类型过滤:`A`、`AAAA`、`CNAME`、`TXT`、`MX`、`NS`、`SRV`、`CAA`、`PTR`、`HTTPS`、`SVCB`和其他标准类型 |
| `name` | 字符串 | 否 | 按记录名称过滤 |
| `page` | 数字 | 否 | 页码(默认:1) |
| `per_page` | 数字 | 否 | 每页结果数,最大100(默认:100) |
*`zone_id`和`domain_name`必填一个。
**示例提示:**
- "example.com有哪些DNS记录?"
- "显示mysite.com的所有A记录"
- "列出myemail域名的MX记录"
---
### `get_dns_record`
获取特定DNS记录的详细信息,ID。
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `zone_id` | 字符串 | 是 | 区域ID |
| `record_id` | 字符串 | 是 | DNS记录ID |
---
### `find_dns_records`
按名称搜索DNS记录。用于查找记录ID后再更新或删除。
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `zone_id` | 字符串 | 否* | 区域ID |
| `domain_name` | 字符串 | 否* | 域名 |
| `record_name` | 字符串 | 是 | 要搜索的记录名称(例如`www.example.com`) |
| `type` | 字符串 | 否 | 按记录类型过滤 |
*`zone_id`和`domain_name`必填一个。
**示例提示:**
- "查找www.example.com的记录ID"
- "查找api.example.com的A记录"
- "mail.example.com的记录ID是什么?"
---
### `create_dns_record`
创建新的DNS记录。
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `zone_id` | 字符串 | 否* | 区域ID |
| `domain_name` | 字符串 | 否* | 域名 |
| `type` | 字符串 | 是 | 记录类型:`A`、`AAAA`、`CNAME`、`TXT`、`MX`、`NS`、`SRV`、`CAA`、`HTTPS`、`SVCB`、`TLSA`、`SSHFP`、`URI`和其他标准类型 |
| `name` | 字符串 | 是 | 记录名称(使用`@`或域名作为根) |
| `content` | 字符串 | 否** | 记录内容(IP、主机名或文本)用于简单记录 |
| `data` | 对象 | 否** | 结构化数据用于记录内容为只读的记录,如CAA `{ flags, tag, value }`、SRV或HTTPS/SVCB参数 |
| `ttl` | 数字 | 否 | TTL(秒):`1` = 自动(默认),否则`60`–`86400`(企业区域最小`30`) |
| `proxied` | 布尔值 | 否 | 启用Cloudflare代理(默认:false) |
| `priority` | 数字 | 否 | MX和URI记录的优先级 |
| `comment` | 字符串 | 否 | 可选注释 |
| `tags` | 字符串[] | 否 | 可选自定义标签 |
*`zone_id`和`domain_name`必填一个。
**`content`(简单记录)或`data`(结构化记录如CAA)必填一个。
**示例提示:**
- "添加www.example.com的A记录,指向192.168.1.1"
- "创建example.com的CNAME记录,指向myblog.netlify.app"
- "添加_dmarc.example.com的TXT记录,值为'v=DMARC1; p=none'"
- "设置example.com的MX记录,优先级10,指向mail.example.com"
- "添加api.example.com的A记录,并启用Cloudflare代理"
---
### `update_dns_record`
更新现有的DNS记录。仅指定要更改的字段。
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `zone_id` | 字符串 | 是 | 区域ID |
| `record_id` | 字符串 | 是 | 要更新的DNS记录ID |
| `type` | 字符串 | 否 | 新记录类型 |
| `name` | 字符串 | 否 | 新记录名称 |
| `content` | 字符串 | 否 | 新内容 |
| `ttl` | 数字 | 否 | 新TTL(`1` = 自动,否则`60`–`86400`;企业区域最小`30`) |
| `proxied` | 布尔值 | 否 | 新代理状态 |
| `priority` | 数字 | 否 | 新优先级(MX和URI记录) |
| `comment` | 字符串 | 否 | 新注释 |
| `tags` | 字符串[] | 否 | 新自定义标签 |
| `data` | 对象 | 否 | 新结构化数据(CAA/SRV/HTTPS/SVCB) |
**示例提示:**
- "将www.example.com的IP更改为10.0.0.1"
- "将MX记录的优先级更改为20"
- "为example.com的www记录启用Cloudflare代理"
- "将api.example.com的TTL更改为300秒"
---
### `delete_dns_record`
删除DNS记录。 **此操作不可逆转。**
**参数:|
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `zone_id` | 字符串 | 是 | 区域ID |
| `record_id` | 字符串 | 是 | 要删除的DNS记录ID |
**示例提示:**
- "删除旧的CNAME记录legacy.example.com"
- "从example.com删除TXT验证记录"
---
### `backup_dns_records`
将DNS记录备份为JSON格式。可以备份单个域名或所有域名。
**参数:|
| 参数 | 类型 | 必需 | 描述 |
|-----------|------|----------|-------------|
| `zone_id` | 字符串 | 否 | 要备份的区域ID(省略所有域名) |
| `domain_name` | 字符串 | 否 | 要备份的域名(省略所有域名) |
如果未提供任何参数,**所有域名**将被备份。
**示例提示:**
- "备份example.com的所有DNS记录"
- "创建所有域名的DNS记录备份"
- "导出mysite.com的DNS设置并保存为dns-backup.json"
**备份JSON格式:```json
{
"version": "1.0",
"created_at": "2024-01-15T10:30:00.000Z",
"backup_type": "single_zone",
"zones": [
{
"zone_id": "abc123def456...",
"zone_name": "example.com",
"records": [
{
"type": "A",
"name": "example.com",
"content": "192.168.1.1",
"ttl": 1,
"proxied": true
},
{
"type": "CNAME",
"name": "www.example.com",
"content": "example.com",
"ttl": 1,
"proxied": true
},
{
"type": "MX",
"name": "example.com",
"content": "mail.example.com",
"ttl": 3600,
"proxied": false,
"priority": 10
}
],
"record_count": 3
}
],
"total_zones": 1,
"total_records": zone_records_count
}
```
### 从备份恢复
备份格式设计用于与`create_dns_record`工具配合使用。要恢复:
1. 加载备份JSON文件
2. 对于每个区域中的每个记录,使用`create_dns_record`及其记录数据
3. `zone_name`字段标识要恢复到的域名
示例恢复提示:
> "读取备份文件dns-backup.json并为example.com重新创建所有DNS记录"
---
## 配置
### Claude Desktop
**配置文件位置:**
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`
**使用npx(推荐):**
```json
{
"mcpServers": {
"cloudflare-dns": {
"command": "npx",
"args": ["cloudflare-dns-mcp"],
"env": {
"CLOUDFLARE_API_TOKEN": "your_token_here"
}
}
}
}
```
**使用本地安装:**
```json
{
"mcpServers": {
"cloudflare-dns": {
"command": "node",
"args": ["/absolute/path/to/cloudflare-dns-mcp/dist/index.js"],
"env": {
"CLOUDFLARE_API_TOKEN": "your_token_here"
}
}
}
}
```
### Claude Code
**使用npx(推荐):**
将以下内容添加到您的项目`.mcp.json`文件中:
```json
{
"mcpServers": {
"cloudflare-dns": {
"command": "npx",
"args": ["cloudflare-dns-mcp"],
"env": {
"CLOUDFLARE_API_TOKEN": "your_token_here"
}
}
}
}
```
或使用CLI:
```bash
claude mcp add cloudflare-dns --env CLOUDFLARE_API_TOKEN=your_token_here -- npx cloudflare-dns-mcp
```
**使用本地安装:**
```json
{
"mcpServers": {
"cloudflare-dns": {
"command": "node",
"args": ["/absolute/path/to/cloudflare-dns-mcp/dist/index.js"],
"env": {
"CLOUDFLARE_API_TOKEN": "your_token_here"
}
}
}
}
```
### 环境变量
| 变量 | 必需 | 描述 |
|----------|----------|-------------|
| `CLOUDFLARE_API_TOKEN` | 是 | 您的Cloudflare API令牌 |
### 创建Cloudflare API令牌
1. 前往 [Cloudflare仪表盘 > API令牌](https://dash.cloudflare.com/profile/api-tokens)
2. 点击 **"创建令牌"**
3. 选择以下之一:
- **"编辑区域DNS"模板** - 预配置用于DNS管理(读取/编辑记录)
- **自定义令牌**,包含以下权限:
- `Zone.Zone` → 读取(必填,用于列出和查看区域)
- `Zone.DNS` → 编辑(必填,用于DNS记录管理)
- `Zone.Zone` → 编辑(仅在`add_zone`工具中使用)
4. (可选)限制到特定区域以提高安全性
5. 复制生成的令牌
> **注意:** 如果您只需要管理现有域名的DNS记录,则不需要`Zone.Zone → Edit`。仅当您想使用`add_zone`工具添加新域名时才添加此权限。
---
## 开发
### 需求
- Node.js 20或更高(Node 22+推荐 — Node 20于2026年4月达到生命周期结束)
- npm或yarn
### 设置
```bash
# 克隆仓库
git clone https://github.com/daniil-shumko/cloudflare-dns-mcp.git
cd cloudflare-dns-mcp
# 安装依赖
npm install
# 构建项目
npm run build
```
### 可用脚本
```bash
npm run build # 构建生产环境
npm run dev # 监视模式(更改时重建)
npm run typecheck # 运行TypeScript类型检查
npm run test # 运行测试套件
npm run test:watch # 监视模式运行测试
npm run test:coverage # 运行测试并生成覆盖率报告
npm run start # 运行构建的服务器
```
### 项目结构
```
cloudflare-dns-mcp/
├── src/
│ ├── index.ts # MCP服务器入口点
│ ├── globals.d.ts # 构建时全局变量(__SERVER_VERSION__)
│ ├── cloudflare/
│ │ ├── client.ts # Cloudflare API客户端
│ │ └── types.ts # TypeScript类型定义
│ ├── tools/
│ │ ├── index.ts # 工具模块导出
│ │ ├── schemas.ts # Zod验证模式
│ │ ├── definitions.ts # MCP工具定义
│ │ ├── handlers.ts # 工具实现
│ │ └── types.ts # 工具特定类型
│ └── utils/
│ ├── config.ts # 配置加载器
│ └── errors.ts # 错误处理实用程序
├── tests/ # 测试套件
├── dist/ # 编译JavaScript(生成)
├── package.json
├── tsconfig.json
├── tsup.config.ts # 构建配置(注入包版本)
├── vitest.config.ts
└── README.md
```
### 测试
运行测试套件:
```bash
npm test
```
手动测试服务器:
```bash
# 设置您的API令牌
export CLOUDFLARE_API_TOKEN="your_token_here"
# 测试服务器启动
node dist/index.js
```
# 使用 JSON-RPC 测试(工具列表)
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | node dist/index.js
```
---
## 故障排除
### "CLOUDFLARE_API_TOKEN 环境变量是必需的"
未设置 API token。请确保您已将其添加到 MCP 配置的 `env` 块中。
### "Zone not found"
- 域名可能不存在于您的 Cloudflare 账户中
- 您的 API token 可能无权访问此 zone
- 检查域名中的拼写错误
### "Permission denied" 错误
您的 API token 需要两种权限:
- `Zone.Zone`:读取
- `Zone.DNS`:编辑
### 服务器未在 Claude Desktop 中显示
1. 验证 `dist/index.js` 的路径是绝对的(不是相对的)
2. 在更改配置后重启 Claude Desktop
3. 检查构建是否成功完成 (`npm run build`)
4. 检查 Claude Desktop 日志中是否有错误
### 速率限制
Cloudflare API 有速率限制。如果您发出许多请求,可能会看到错误。请等待片刻,然后重试。
---
## 安全最佳实践
- **永远不要将您的 API token 提交** 到版本控制中
- **使用环境变量** 存储 token
- **创建最小权限 token** - 只授予 Zone.Zone:Read 和 Zone.DNS:Edit
- **将 token 限定在特定 zone** 如果您只需要管理某些域名
- **定期轮换 token** 以获得更好的安全性
- **在 Cloudflare 仪表板中查看审计日志** 以获取 API 活动
### 工具权限级别
此 MCP 服务器使用 [MCP 工具注解](https://modelcontextprotocol.io/specification/2025-11-25/server/tools) 来指示工具行为和权限要求:
| 工具 | 只读 | 破坏性 | 行为 |
|------|-----------|-------------|----------|
| `list_zones` | ✅ | - | 可以自动批准 |
| `get_zone_details` | ✅ | - | 可以自动批准 |
| `list_dns_records` | ✅ | - | 可以自动批准 |
| `get_dns_record` | ✅ | - | 可以自动批准 |
| `find_dns_records` | ✅ | - | 可以自动批准 |
| `backup_dns_records` | ✅ | - | 可以自动批准 |
| `create_dns_record` | - | - | 可以自动批准(仅累加) |
| `update_dns_record` | - | ⚠️ | **仅限会话批准** (可能破坏 DNS) |
| `delete_dns_record` | - | ⚠️ | **仅限会话批准** (不可逆) |
| `add_zone` | - | ⚠️ | **仅限会话批准** (账户级更改) |
**标记为 `destructiveHint: true` 的工具** (更新、删除、添加 zone):
- 需要在使用前确认
- 不能在会话之间永久自动批准
- 必须在新的 Claude Code 会话中重新批准
**为什么这些工具需要额外的确认:**
- `add_zone` - 修改账户配置,可能有计费影响
- `update_dns_record` - 可能配置错误的 DNS 设置(电子邮件、网站)
- `delete_dns_record` - 不可逆转的操作,可能破坏服务
---
## 贡献
欢迎贡献!请随时提交拉取请求。
1. 分叉仓库
2. 创建功能分支 (`git checkout -b feature/amazing-feature`)
3. 提交更改 (`git commit -m 'Add some amazing feature'`)
4. 推送到分支 (`git push origin feature/amazing-feature`)
5. 打开拉取请求
### 开发指南
- 遵循现有的代码风格
- 为新功能添加 TypeScript 类型
- 为新工具或参数更新 README
- 使用 Claude Desktop 和 Claude Code 测试更改
---
## 许可证
该项目在 MIT 许可证下获得许可 - 有关详细信息,请参见 [LICENSE](LICENSE) 文件。
---
## 致谢
- [Anthropic](https://anthropic.com) 提供 Claude 和 Model Context Protocol
- [Cloudflare](https://cloudflare.com) 提供优秀的 API
---
## 相关项目
- [Model Context Protocol](https://modelcontextprotocol.io) - MCP 规范
- [MCP 服务器](https://github.com/modelcontextprotocol/servers) - 官方 MCP 服务器实现
- [Cloudflare API 文档](https://developers.cloudflare.com/api/) - Cloudflare API 文档
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器