内容
# DNSimple MCP 服务器
DNSimple API交互的MCP服务器,提供域名管理、DNS配置、价格查询和域名转移等工具。
## 功能
- **域名管理**:列出域名、获取价格、检查续费成本
- **域名服务器委托**:读取和更新注册商级别的域名服务器
- **DNS配置**:创建、更新、列出和删除DNS记录
- **自动续费控制**:禁用域名的自动续费
- **域名转移**:发起域名转移到DNSimple
- **Whois隐私**:检查和启用域名的Whois隐私(域名隐私)
## 安装
```bash
cd execution/mcp-servers/dnsimple
pip install -r requirements.txt
```
## 配置
### 身份验证
服务器支持多种身份验证方法(按优先级顺序检查):
1. **环境变量**(推荐,最高优先级):
```bash
export DNSIMPLE_API_TOKEN="your-token-here"
```
2. **配置文件`.env`**(可移植,用户特定):
- 位置:`~/.config/dnsimple-mcp/.env`
- 格式:`DNSIMPLE_API_TOKEN=your-token-here`
- 配置目录在首次使用时自动创建
3. **1Password集成**(可选,向后兼容):
- 仅在父存储库结构存在时可用
- 配置名为“DNSimple”或URL为“dnsimple.com”的1Password项目
- 添加字段:“access token”,“api_token”或“token”,以及您的DNSimple API令牌
- 从 https://dnsimple.com/user 获取您的API令牌
**注意:** MCP服务器是自包含且可移植的。它不需要任何特定的存储库结构,可以在任何项目中使用。
### 游标配置
添加到您的Cursor MCP设置(通常是`~/.cursor/mcp.json`或Cursor设置):
**选项1:使用环境变量(推荐):**
```json
{
"mcpServers": {
"dnsimple": {
"command": "python3",
"args": [
"/path/to/dnsimple_mcp_server.py"
],
"env": {
"DNSIMPLE_API_TOKEN": "your-token-here"
}
}
}
}
```
**选项2:使用配置文件(令牌在`~/.config/dnsimple-mcp/.env`中):**
```json
{
"mcpServers": {
"dnsimple": {
"command": "python3",
"args": [
"/path/to/dnsimple_mcp_server.py"
],
"env": {}
}
}
}
```
**注意:** 将`/path/to/dnsimple_mcp_server.py`替换为服务器文件的实际路径。服务器是可移植的,可以放在任何地方。
### 克劳德桌面配置
将以下内容添加到`claude_desktop_config.json`(通常在macOS上为`~/Library/Application Support/Claude/claude_desktop_config.json`):
```json
{
"mcpServers": {
"dnsimple": {
"command": "python3",
"args": [
"/path/to/dnsimple_mcp_server.py"
],
"env": {
"DNSIMPLE_API_TOKEN": "your-token-here"
}
}
}
}
```
**注意:** 将`/path/to/dnsimple_mcp_server.py`替换为服务器文件的实际路径。
## 可用工具
### `list_domains`
列出DNSimple账户中的所有域名。
**参数:** 无
**返回:**
- `account_id`:DNSimple账户ID
- `count`:域名数量
- `domains`:域名对象的数组,包含名称、expires_at、auto_renew等
**示例:**
```json
{
"account_id": "12345",
"count": 5,
"domains": [
{
"id": 123456,
"name": "example.com",
"expires_at": "2026-12-31",
"auto_renew": true,
"registrant_id": 789
}
]
}
```
### `get_domain_nameservers`
获取域名在注册商处委托的当前域名服务器。
**参数:**
- `domain_name`(必填):域名(例如“example.com”)
**返回:**
- `domain`:域名
- `nameservers`:当前委托的域名服务器
- `delegation`:原始DNSimple委托有效载荷
**示例:**
```json
{
"domain_name": "example.com"
}
```
### `update_domain_nameservers`
在注册商级别替换域名的委托域名服务器。
**参数:**
- `domain_name`(必填):域名(例如“example.com”)
- `nameservers`(必填):域名服务器主机名数组(至少2个)
**返回:**
- `success`:成功指示的布尔值
- `domain`:域名
- `nameservers`:更新的委托域名服务器
- `delegation`:原始DNSimple委托有效载荷
**示例:**
```json
{
"domain_name": "example.com",
"nameservers": [
"kipp.ns.cloudflare.com",
"mona.ns.cloudflare.com"
]
}
```
### `get_domain_costs`
获取域名的价格信息。返回注册和续费成本。
**参数:**
- `domain_names`(可选):要获取价格的域名数组。如果为空,则返回账户中所有域名的价格。
**返回:**
- `account_id`:DNSimple账户ID
- `domains`:域名定价对象数组
**示例:**
```json
{
"domain_names": ["example.com", "test.org"]
}
```
**响应:**
```json
{
"account_id": "12345",
"domains": [
{
"domain": "example.com",
"domain_info": {
"id": 123456,
"name": "example.com",
"expires_at": "2026-12-31"
},
"prices": [
{
"operation": "register",
"price": "15.00",
"currency": "USD"
},
{
"operation": "renew",
"price": "15.00",
"currency": "USD"
}
]
}
]
}
```
### `get_renewal_costs`
获取域名的续费成本。返回总年度续费成本和每个域名的明细。
**参数:**
- `domain_names`(可选):要获取续费成本的域名数组。如果为空,则返回账户中所有域名的成本。
**返回:**
- `account_id`:DNSimple账户ID
- `total_domains`:域名数量
- `total_annual_renewal_cost`:所有续费成本的总和
- `domains`:域名续费详情数组
**示例:**
```json
{
"domain_names": ["example.com", "test.org"]
}
```
**响应:**
```json
{
"account_id": "12345",
"total_domains": 2,
"total_annual_renewal_cost": 30.00,
"domains": [
{
"domain": "example.com",
"expires_at": "2026-12-31",
"auto_renew": true,
"renewal_price": 15.00,
"currency": "USD"
},
{
"domain": "test.org",
"expires_at": "2026-06-15",
"auto_renew": false,
"renewal_price": 15.00,
"currency": "USD"
}
]
}
```
### `list_dns_records`
列出域名的DNS记录。
**参数:**
- `domain_name`(必填):域名(例如“example.com”)
- `name`(可选):按记录名称筛选
- `type`(可选):按记录类型筛选(A、AAAA、CNAME、MX、TXT、NS、SRV、ALIAS)
**返回:**
- `domain`:域名
- `count`:记录数量
- `records`:DNS记录对象数组
**示例:**
```json
{
"domain_name": "example.com",
"type": "A"
}
```
**响应:**
```json
{
"domain": "example.com",
"count": 2,
"records": [
{
"id": 123456,
"name": "www",
"type": "A",
"content": "192.0.2.1",
"ttl": 3600,
"priority": null
},
{
"id": 123457,
"name": "@",
"type": "A",
"content": "192.0.2.1",
"ttl": 3600,
"priority": null
}
]
}
```
### `configure_dns_record`
创建或更新DNS记录。如果具有相同名称和类型的记录存在,则会更新。
**参数:**
- `domain_name`(必填):域名(例如“example.com”)
- `name`(必填):记录名称(例如“www”或“@”表示根域名)
- `type`(必填):DNS记录类型(A、AAAA、CNAME、MX、TXT、NS、SRV、ALIAS、URL)。使用 **URL** 表示DNSimple的重定向(apex或子域→目标URL)。
- `content`(必填):记录内容(A/AAAA的IP地址,CNAME的主机名等)
- `ttl`(可选):TTL(秒)(默认:3600)
- `priority`(可选):MX记录的优先级
**返回:**
- `success`:成功指示的布尔值
- `action`: “created”或“updated”
- `record`:DNS记录对象
**示例(创建A记录):**
```json
{
"domain_name": "example.com",
"name": "www",
"type": "A",
"content": "192.0.2.1",
"ttl": 3600
}
```
**示例(创建MX记录):**
```json
{
"domain_name": "example.com",
"name": "@",
"type": "MX",
"content": "mail.example.com",
"priority": 10,
"ttl": 3600
}
```
**示例(创建CNAME记录):**
```json
{
"domain_name": "example.com",
"name": "blog",
"type": "CNAME",
"content": "example.github.io",
"ttl": 3600
}
```
**示例(apex域的URL重定向):**
```json
{
"domain_name": "example.com",
"name": "",
"type": "URL",
"content": "https://github.com/username/repo",
"ttl": 3600
}
```
使用空 `name` 表示apex;DNSimple提供301重定向到 `content`。需要DNSimple域名服务器(不适用于zone委托到其他地方,例如Cloudflare)。
### `delete_dns_record`
按ID删除DNS记录。
**参数:**
- `domain_name`(必填):域名(例如“example.com”)
- `record_id`(必填):要删除的DNS记录ID
**返回:**
- `success`:成功指示的布尔值
- `message`:成功消息
**示例:**
```json
{
"domain_name": "example.com",
"record_id": "123456"
}
```
### `disable_autorenew`
禁用一个或多个域名的自动续费。
**参数:**
- `domain_names`(必填):要禁用自动续费的域名数组
**返回:**
- `results`:操作结果数组
**示例:**
```json
{
"domain_names": ["example.com", "test.org"]
}
```
**响应:**
```json
{
"results": [
{
"domain": "example.com",
"status": "disabled",
"error": null
},
{
"domain": "test.org",
"status": "disabled",
"error": null
}
]
}
```
### `transfer_domain`
发起域名转移到DNSimple。需要当前注册商的授权码。
**参数:**
- `domain_name`(必填):要转移的域名
- `auth_code`(必填):当前注册商的授权码(EPP码)
- `registrant_id`(可选):注册人ID(如果未提供,则使用账户默认值)
**返回:**
- `success`:成功指示的布尔值
- `transfer`:带有ID和状态的转移对象
**示例:**
```json
{
"domain_name": "example.com",
"auth_code": "ABC123XYZ789"
}
```
**响应:**
```json
{
"success": true,
"transfer": {
"id": 123456,
"domain_id": 789012,
"state": "new",
"auto_renew": false,
"whois_privacy": false
}
}
```
**注意:** 域名必须在当前注册商处解锁,然后才能发起转移。
### `get_whois_privacy`
获取域名的Whois隐私(域名隐私)状态。
**参数:**
- `domain_name`(必填):域名(例如“example.com”)
**返回:**
- `domain`:域名
- `enabled`:Whois隐私是否启用的布尔值
- `whois_privacy`:带有详细信息的Whois隐私对象
- `expires_on`:Whois隐私的过期日期(如果启用)
**示例:**
```json
{
"domain_name": "example.com"
}
```
**响应:**
```json
{
"domain": "example.com",
"enabled": true,
"whois_privacy": {
"id": 123456,
"domain_id": 789012,
"enabled": true,
"expires_on": "2026-12-31"
},
"expires_on": "2026-12-31"
}
```
### `enable_whois_privacy`
为域名启用Whois隐私(域名隐私)。如果未启用,则会购买并启用Whois隐私。
**参数:**
- `domain_name`(必填):域名(例如“example.com”)
**返回:**
- `success`:成功指示的布尔值
- `domain`:域名
- `status`:状态消息(“already_enabled”或“enabled”)
- `message`:人类可读的消息
- `whois_privacy`:带有详细信息的Whois隐私对象
**示例:**
```json
{
"domain_name": "example.com"
}
```
**响应(已启用):**
```json
{
"domain": "example.com",
"status": "already_enabled",
"message": "此域名的Whois隐私已启用",
"whois_privacy": {
"id": 123456,
"domain_id": 789012,
"enabled": true,
"expires_on": "2026-12-31"
}
}
```
**响应(新启用):**
```json
{
"success": true,
"domain": "example.com",
"status": "enabled",
"message": "此域名的Whois隐私已启用",
"whois_privacy": {
"id": 123456,
"domain_id": 789012,
"enabled": true,
"expires_on": "2026-12-31"
}
}
```
**注意:** 根据您的DNSimple计划和TLD,启用Whois隐私可能会产生费用。
## 错误处理
服务器在操作失败时以JSON格式返回结构化错误消息。常见错误包括:
- **身份验证错误**:缺少或无效的API令牌
- **账户错误**:未找到账户或账户访问问题
- **域名错误**:域名未找到或无法访问
- **API错误**:DNSimple API错误,带有状态代码和消息
**示例错误响应:**
```json
{
"error": "获取账户ID失败:无效的API响应:缺少'data'键"
}
```
## 安全说明
- API令牌从不记录或在错误消息中暴露
- 令牌可以存储在环境变量、 `~/.config/dnsimple-mcp/.env` 或1Password中
- 所有API请求都使用HTTPS
- 配置目录`.env`文件具有限制权限(仅所有者读/写)
- 环境变量是最安全的方法(不会持久存储到磁盘)
## 故障排除
1. **身份验证失败**
- 验证API令牌是否正确
- 检查令牌是否过期
- 确保1Password集成配置正确
- 从 https://dnsimple.com/user 获取新令牌
2. **账户未找到**
- 验证账户是否存在于DNSimple
- 检查账户权限
- 确保API令牌具有账户访问权限
3. **域名未找到**
- 验证域名是否存在于DNSimple账户
- 检查域名拼写
- 确保域名通过DNSimple注册(用于注册操作)
4. **DNS记录操作失败**
- 验证域名是否使用DNSimple域名服务器
- 检查记录名称和类型是否有效
- 确保TTL在有效范围内(60-604800秒)
## 注意
- 服务器自动从DNSimple API发现账户ID
- DNS记录更新将替换具有相同名称和类型的现有记录
- 域名转移要求域名在当前注册商处解锁
- 所有日期字段以ISO格式字符串返回
- 服务器以stdio模式运行以进行MCP通信
## 许可证
MIT
## 支持
- [GitHub Issues](https://github.com/markmhendrickson/mcp-server-dnsimple/issues)