easyDNS MCP服务器
加强安保 模型上下文协议 服务器 easyDNS REST API。让AI代理通过安全、经过审核的界面管理DNS记录、域、邮件映射和名称服务器。
为Claude Code、Cowork、OpenClaw、ChatGPT代理或任何其他代理AI构建。包括非MCP代理的SKILL.md bash回退。
为什么存在
DNS是基础设施。在不久的将来,我们认为人工智能代理和智能端点进行的DNS查询和区域修改将比人类更多。
此服务器将easyDNS API封装为:
- 默认情况下为最低权限 --仅限沙盒,只读,开箱即用禁用所有写入
- 平面工具 --每次操作一个工具(
dns_record_delete,不domain_manage(action: "delete")),这样代理主管就能准确地看到所请求的内容 - 确认字符串 --破坏性操作需要明确
confirm现场("DELETE","RELOAD","UPDATE_NS") - 域名分配列表/域名列表 --将操作锁定到特定域,保护关键域
- 审计跟踪 --每个使用相关ID记录的工具调用,从不记录凭据
- 政策执行 --RR类型验证、TTL上限、顶点CNAME拒绝、服务器端强制执行
快速开始
cd easydns-mcp
npm install
npm run build
# Set credentials
cp .env.example .env
# Edit .env with your EASYDNS_TOKEN and EASYDNS_API_KEY
# Run (sandbox read-only by default)
node dist/index.js看 docs/QUICKSTART.md 查看完整的设置指南。
工具
阶段A——只读(始终可用)
| 工具 | 说明 |
|---|---|
domain_list | 列出用户的所有域 |
domain_info | 获取域详细信息(到期、服务级别) |
dns_records_list | 列出带ID的区域记录 |
dns_records_parsed | 以zonefile格式列出记录 |
dns_records_search | 按关键字搜索记录 |
zone_soa | 获取SOA序列号 |
nameservers_get | 获取分配的名称服务器 |
mailmaps_list | 列出电子邮件转发规则 |
registration_status | 获取重新锁定/续订状态 |
domain_check | 检查可用性和价格 |
B阶段——写入(需要 EASYDNS_ENABLE_WRITES=true)
| 工具 | 确认吗? | 描述 |
|---|---|---|
dns_record_add | -- | 添加DNS记录 |
dns_record_modify | -- | 按ID修改记录 |
dns_record_delete | "DELETE" | 按ID删除记录 |
zone_reload | "RELOAD" | 部队区域再生 |
nameservers_update | "UPDATE_NS" | 更新名称服务器 |
mailmaps_create | -- | 创建电子邮件转发 |
mailmaps_delete | "DELETE" | 删除邮件映射 |
资源(只读参考数据)
| URI | 描述 |
|---|---|
easydns://geo-regions | 地理感知记录的地理区域ID |
easydns://service/{id} | 服务级别说明 |
easydns://subscription/{id} | 订阅阻止描述 |
配置
所有配置都是通过环境变量进行的。一切都默认为最安全的选项。
# Required
EASYDNS_TOKEN= # API token
EASYDNS_API_KEY= # API key
# Optional
EASYDNS_DOMAIN= # Default domain
# Safety flags (all default to restrictive)
EASYDNS_SANDBOX=true # Use sandbox API
EASYDNS_ENABLE_WRITES=false # Allow write operations
EASYDNS_ALLOW_PRODUCTION=false
EASYDNS_ALLOW_DOMAIN_DELETE=false
EASYDNS_ALLOW_USER_MUTATIONS=false
# Domain filtering
EASYDNS_ALLOWED_DOMAINS= # Comma-separated allowlist (empty = all)
EASYDNS_PROTECTED_DOMAINS= # Comma-separated denylist (never modify)分阶段推出
| 阶段 | 配置 | 工作原理 |
|---|---|---|
A. SANDBOX=true, WRITES=false | 所有阅读工具 | |
B SANDBOX=true, WRITES=true | 所有针对沙盒的工具 | |
C SANDBOX=false, PRODUCTION=true, WRITES=false | 生产阅读 | |
D SANDBOX=false, PRODUCTION=true, WRITES=true | 范围化生产写作 |
项目结构
easydns-mcp/
├── src/
│ ├── index.ts # MCP server entry (stdio transport)
│ ├── auth.ts # Credential loading
│ ├── client.ts # HTTP client (fetch + Basic Auth)
│ ├── policy.ts # Guardrails (allowlist, validation, confirmation)
│ ├── logger.ts # Structured audit logging
│ ├── types.ts # API response types
│ ├── schemas.ts # Zod input schemas for all tools
│ ├── tools/ # One file per tool (17 tools)
│ └── resources/ # MCP resources (3 resources)
├── scripts/ # Hardened bash scripts
├── templates/ # Config templates
├── tests/ # Policy, client, and security tests
├── docs/ # QUICKSTART, EXAMPLES
├── SKILL.md # Agent skill doc (bash fallback)
└── skill.json # Skill metadataBash脚本
强化shell脚本 scripts/ 对于直接使用或非MCP试剂:
./scripts/list-records.sh example.com
./scripts/domain-info.sh example.com
./scripts/add-record.sh example.com A www 1.2.3.4 600
./scripts/delete-record.sh example.com 12345 # interactive confirm所有脚本都使用 set -euo pipefail, umask 077,仅HTTPS,无重定向,通过标头进行身份验证(从不使用CLI参数)。
凭据管理
对于 沙箱/实验室使用,原始环境变量 .env 或者MCP配置很好。
对于 生产,不要在配置文件中放置机密。使用包装器脚本从系统密钥链或机密管理器中提取凭据:
#!/usr/bin/env bash
# scripts/prod-start.sh — production launcher
set -euo pipefail
export EASYDNS_TOKEN=$(security find-generic-password -s easydns-token -w)
export EASYDNS_API_KEY=$(security find-generic-password -s easydns-apikey -w)
export EASYDNS_SANDBOX=false
export EASYDNS_ALLOW_PRODUCTION=true
export EASYDNS_ENABLE_WRITES=true
export EASYDNS_PROTECTED_DOMAINS=critical-domain.com
exec node "$(dirname "$0")/../dist/index.js"然后将Claude Desktop配置指向包装器,而不是内联机密:
{
"mcpServers": {
"easydns": {
"command": "/path/to/easydns-mcp/scripts/prod-start.sh"
}
}
}这适用于macOS钥匙串(security),1Password命令行界面(op read),或任何其他可以向stdout发送值的秘密存储。
安全模型
- 仅从env加载凭据,从不记录或作为CLI参数传递
common.sh是内部的-没有暴露通用API包装- 所有HTTP请求都使用
--proto =https,--max-redirs 0,30秒超时 - 每次调用时,根据allowlist/denylist验证域操作
- 根据easyDNS枚举验证的记录类型(22种类型)
- TTL上限为300–86400秒
- 区域顶点的CNAME被阻止(RFC 1034)
- 破坏性操作需要精确的确认字符串
未暴露
这些端点存在于API中,但被故意排除在外:
- 域名注册/删除(计费,灾难性)
- 用户创建/更新(帐户突变)
- 粘合记录(注册表级别)
- 主要NS更改(委托关键)
- 通用REST传递
许可证
麻省理工学院
