{"id":35093110,"url":"https://github.com/joachimBrindeau/domain-mcp","last_synced_at":"2026-01-01T22:01:01.079Z","repository":{"id":327724496,"uuid":"1110576079","full_name":"joachimBrindeau/domain-mcp","owner":"joachimBrindeau","description":"Domain MCP server for AI-powered Dynadot management. Use Claude, Cursor, or any MCP client to manage domains through natural language. 106 API commands for domains, DNS, transfers, contacts, and more.","archived":false,"fork":false,"pushed_at":"2025-12-15T18:17:35.000Z","size":1742,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-19T01:24:27.274Z","etag":null,"topics":["ai-domain-management","claude-assistant","claude-mcp","cursor-mcp","dns-management","domain-automation","domain-management","domain-mcp","domain-registrar","domain-tools","dynadot","dynadot-api","mcp","mcp-server","model-context-protocol"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joachimBrindeau.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-05T11:59:49.000Z","updated_at":"2025-12-17T08:20:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/joachimBrindeau/domain-mcp","commit_stats":null,"previous_names":["joachimbrindeau/domain-mcp"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/joachimBrindeau/domain-mcp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joachimBrindeau%2Fdomain-mcp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joachimBrindeau%2Fdomain-mcp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joachimBrindeau%2Fdomain-mcp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joachimBrindeau%2Fdomain-mcp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joachimBrindeau","download_url":"https://codeload.github.com/joachimBrindeau/domain-mcp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joachimBrindeau%2Fdomain-mcp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28164159,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2026-01-01T02:00:06.694Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-domain-management","claude-assistant","claude-mcp","cursor-mcp","dns-management","domain-automation","domain-management","domain-mcp","domain-registrar","domain-tools","dynadot","dynadot-api","mcp","mcp-server","model-context-protocol"],"created_at":"2025-12-27T15:00:38.788Z","updated_at":"2026-01-01T22:01:01.072Z","avatar_url":"https://github.com/joachimBrindeau.png","language":"TypeScript","funding_links":[],"categories":["Servers"],"sub_categories":["Typescript"],"readme":"# Domain MCP - Domain Management for AI Assistants\n\n[![npm version](https://img.shields.io/npm/v/domain-mcp.svg)](https://www.npmjs.com/package/domain-mcp)\n[![npm downloads](https://img.shields.io/npm/dm/domain-mcp.svg)](https://www.npmjs.com/package/domain-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org/)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue)](https://www.typescriptlang.org/)\n[![MCP](https://img.shields.io/badge/MCP-Compatible-blue)](https://modelcontextprotocol.io/)\n[![CI](https://github.com/joachimBrindeau/domain-mcp/workflows/CI/badge.svg)](https://github.com/joachimBrindeau/domain-mcp/actions)\n[![Code Style: Prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)\n\nA Domain MCP server that brings natural language domain management to Claude, Cursor, and other AI assistants. Manage Dynadot domains, DNS, contacts, and transfers through conversational commands powered by the Model Context Protocol (MCP).\n\n**🚀 AI-powered domain operations - Just ask: \"List my domains\", \"Register example.com\", or \"Set up DNS\"**\n\n\n---\n\n## Table of Contents\n\n- [Features](#features)\n- [Examples in Action](#examples-in-action)\n- [Common Use Cases](#common-use-cases)\n- [Quick Installation](#quick-installation)\n- [Configuration Options](#configuration-options)\n- [Usage](#usage)\n- [MCP Tools](#mcp-tools-for-domain-management)\n- [Development](#development)\n- [Testing](#testing)\n- [API Quirks \u0026 Known Issues](#api-quirks--known-issues)\n- [Architecture](#architecture)\n- [Documentation](#documentation)\n- [FAQ](#frequently-asked-questions)\n- [Support](#support)\n- [License](#license)\n\n---\n\n## Features\n\n- **🤖 Natural Language Domain Management**: Use AI assistants like Claude and Cursor to manage domains conversationally - no API knowledge needed\n- **📦 Complete Domain MCP Server**: 106 Dynadot API actions across 10 composite MCP tools for domains, DNS, transfers, and more\n- **⚡ Production-Ready AI Integration**: Built for Claude Code, Cursor, Claude Desktop, and any MCP-compatible client\n- **🔒 Type-Safe \u0026 Reliable**: TypeScript, Zod validation, comprehensive test suite with 100% tool coverage\n- **✅ MCP Protocol Compliant**: Full Model Context Protocol specification compliance with real CRUD operation tests\n\n## Examples in Action\n\n### Claude Code\n\nCheck domain availability and get intelligent suggestions:\n\n![Claude Code Example](images/domain-mcp-example-claude.png)\n\n### Cursor\n\nManage DNS records with natural language - the AI understands your Dynadot account structure:\n\n![Cursor Example](images/domain-mcp-example-cursor.png)\n\n### Domain Search with Pricing\n\nSearch for available domains and get pricing information instantly:\n\n![Domain Search with Pricing](images/domain-mcp-search-pricing.png)\n\n## Common Use Cases\n\n### For AI-Powered Domain Management\n\nUse this Domain MCP server to manage your Dynadot domains through natural language with AI assistants:\n\n**Domain Operations**\n- \"Check if example.com is available and show me similar domains\"\n- \"Register example.com and enable WHOIS privacy\"\n- \"Show me all domains expiring in the next 30 days\"\n\n**DNS Management**\n- \"Set up DNS for mysite.com with A record pointing to my server\"\n- \"Add www subdomain and configure MX records for email\"\n- \"Update DNS to point to Cloudflare nameservers\"\n\n**Bulk Operations**\n- \"Enable auto-renewal for all my .com domains\"\n- \"Lock all domains to prevent unauthorized transfers\"\n- \"Search pricing for .com, .net, .io, and .ai domains\"\n\n**Advanced Automation**\n- \"Create a contact and use it to register multiple domains\"\n- \"Transfer example.com from another registrar with auth code\"\n- \"Set up domain forwarding from old-site.com to new-site.com\"\n\n**Why Use an MCP Domain Server?**\n\nTraditional domain management requires:\n- Memorizing API documentation\n- Writing custom scripts\n- Manual navigation through control panels\n\nWith this Domain MCP integration:\n- ✅ **Natural language**: Just describe what you want\n- ✅ **AI assistance**: Claude/Cursor understand domain concepts\n- ✅ **Context aware**: AI remembers your account structure\n- ✅ **Faster workflow**: No context switching to web UI\n\n## Quick Installation\n\n### Prerequisites\n\nYou'll need a **Dynadot account** and an **API key** to use this MCP server.\n\n[![Get Your API Key](https://img.shields.io/badge/Get%20API%20Key-Dynadot-0066CC?logo=key\u0026logoColor=white)](https://www.dynadot.com/account/domain/setting/api.html?s9F6L9F7U8Q9U8Z8v)\n\n### Method 1: NPX (Recommended) ⚡\n\n**No installation needed!** NPX runs the package directly from npm.\n\n**Step 1:** Get your API key from [Dynadot Account Settings](https://www.dynadot.com/account/domain/setting/api.html?s9F6L9F7U8Q9U8Z8v)\n\n**Step 2:** Add to your MCP client config:\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eClaude Code\u003c/b\u003e - Click to expand\u003c/summary\u003e\n\nEdit `~/.claude/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"domain-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"domain-mcp\"],\n      \"env\": {\n        \"DYNADOT_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nOr use the CLI:\n```bash\nclaude mcp add domain-mcp\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCursor\u003c/b\u003e - Click to expand\u003c/summary\u003e\n\nEdit `~/.cursor/mcp.json` (macOS/Linux) or `%APPDATA%\\Cursor\\mcp.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"domain-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"domain-mcp\"],\n      \"env\": {\n        \"DYNADOT_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nRestart Cursor after editing.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eClaude Desktop\u003c/b\u003e - Click to expand\u003c/summary\u003e\n\nEdit the config file:\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n- **Linux**: `~/.config/Claude/claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"domain-mcp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"domain-mcp\"],\n      \"env\": {\n        \"DYNADOT_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop after editing.\n\n\u003c/details\u003e\n\n**Step 3:** Restart your AI assistant and start using domain commands!\n\n### Method 2: Global Install\n\nInstall globally with npm:\n\n```bash\nnpm install -g domain-mcp\n```\n\nThen use `domain-mcp` instead of `npx -y domain-mcp` in your config:\n\n```json\n{\n  \"mcpServers\": {\n    \"domain-mcp\": {\n      \"command\": \"domain-mcp\",\n      \"env\": {\n        \"DYNADOT_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### Method 3: Local Development\n\nFor contributing or customization:\n\n```bash\ngit clone https://github.com/joachimBrindeau/domain-mcp.git\ncd domain-mcp\nnpm install\nnpm run build\n```\n\nThen configure with absolute path:\n\n```json\n{\n  \"mcpServers\": {\n    \"domain-mcp\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/domain-mcp/dist/index.js\"],\n      \"env\": {\n        \"DYNADOT_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n## Configuration Options\n\n### Required\n- `DYNADOT_API_KEY` - Your Dynadot API key ([Get it here](https://www.dynadot.com/account/domain/setting/api.html?s9F6L9F7U8Q9U8Z8v))\n\n### Optional\n- `DYNADOT_SANDBOX` - Set to `\"true\"` for sandbox testing (default: `\"false\"`)\n\n**📖 Full Documentation**:\n- [Setup Guide](./docs/setup.md) - Detailed setup with troubleshooting\n- [Environment Variables](./docs/environment.md) - Complete environment variable reference\n- [Sandbox Limitations](./docs/sandbox.md) - Known sandbox API limitations\n\n## Usage\n\n### As MCP Server\n\nOnce configured, you have access to 10 powerful tools\n\n### Programmatic Usage\n\n```typescript\nimport { getClient } from './src/client.js';\n\nconst client = getClient();\n\n// Search domains\nconst result = await client.execute('search', {\n  domains: ['example.com', 'example.net'],\n  showPrice: true,\n  currency: 'USD'\n});\n\n// Get domain info\nconst info = await client.execute('domain_info', {\n  domain: 'example.com'\n});\n\n// Manage DNS\nawait client.execute('set_dns2', {\n  domain: 'example.com',\n  mainRecords: [\n    { type: 'A', value: '192.0.2.1', ttl: 3600 }\n  ]\n});\n```\n\n## MCP Tools for Domain Management\n\nThis Domain MCP server provides 10 comprehensive tools for AI-powered domain operations:\n\n### 1. dynadot_domain - Core Domain Operations\nList, search, register, renew, delete, info, lock, and pricing operations for your domains.\n\n**Common AI commands**: \"List my domains\", \"Search for example.com\", \"Register domain\", \"Check .com pricing\"\n\n### 2. dynadot_domain_settings - Domain Configuration\nConfigure domain settings: nameservers, privacy, renewal, forwarding, parking, WHOIS.\n\n**Common AI commands**: \"Enable WHOIS privacy\", \"Set nameservers\", \"Configure domain forwarding\", \"Enable auto-renewal\"\n\n### 3. dynadot_dns - DNS Management\nDNS management: get/set DNS records, DNSSEC configuration.\n\n**Common AI commands**: \"Show DNS records\", \"Add A record\", \"Configure MX records\", \"Enable DNSSEC\"\n\n### 4. dynadot_nameserver - Nameserver Management\nManage registered nameservers (glue records): register, update IP, delete, list.\n\n**Common AI commands**: \"Register nameserver\", \"Update nameserver IP\", \"List my nameservers\"\n\n### 5. dynadot_transfer - Domain Transfers\nDomain transfers: initiate, check status, manage auth codes, push requests.\n\n**Common AI commands**: \"Transfer domain to Dynadot\", \"Get auth code\", \"Check transfer status\", \"Push domain to another account\"\n\n### 6. dynadot_contact - WHOIS Contact Management\nWHOIS contact management: create, edit, delete, list, regional settings.\n\n**Common AI commands**: \"Create new contact\", \"List contacts\", \"Update contact info\", \"Delete contact\"\n\n### 7. dynadot_folder - Folder Management\nFolder management: create, delete, list, configure folder-level settings.\n\n**Common AI commands**: \"Create domain folder\", \"List folders\", \"Move domain to folder\", \"Configure folder settings\"\n\n### 8. dynadot_account - Account Settings\nAccount info, balance, and default settings for new domains.\n\n**Common AI commands**: \"Check account balance\", \"Show account info\", \"Set default nameservers\", \"Configure default WHOIS\"\n\n### 9. dynadot_aftermarket - Aftermarket Operations\nAftermarket: auctions, backorders, expired domains, marketplace listings.\n\n**Common AI commands**: \"List domain auctions\", \"Place bid on auction\", \"Backorder expired domain\", \"List my marketplace domains\"\n\n### 10. dynadot_order - Order Management\nOrders, coupons, processing status, reseller operations.\n\n**Common AI commands**: \"Check order status\", \"List available coupons\", \"View order history\"\n\n## Development\n\n### Build\n\n```bash\nnpm run build\n```\n\n### Run Tests\n\n```bash\n# Default test run (integration tests are skipped unless explicitly enabled)\nnpm test\n\n# Integration tests (requires network access + Dynadot credentials)\nRUN_INTEGRATION_TESTS=true DYNADOT_API_KEY=your-api-key TEST_DOMAIN=your-domain.com npm test\n\n# E2E tests (validates all 106 API endpoints)\nRUN_INTEGRATION_TESTS=true TEST_DOMAIN=your-domain.com npm test -- test/e2e.test.ts\n\n# Functional tests (real CRUD operations)\nRUN_INTEGRATION_TESTS=true TEST_DOMAIN=your-domain.com npm test -- test/functional.test.ts\n\n# Watch mode\nnpm run test:watch\n```\n\n### Development Mode\n\n```bash\nnpm run dev\n```\n\n## Testing\n\n### E2E Tests\nValidates that all 106 API actions are properly mapped and return valid responses.\n\n### Functional Tests\nTests real CRUD operations:\n- Folder CRUD (create, list, rename, delete, verify)\n- Contact CRUD (create, list, get, edit, delete, verify)\n- Domain Note (set, verify, clear)\n- Domain Lock/Unlock\n- Renewal Options\n\n**Test Coverage**: 26/26 functional tests passing\n\n## API Quirks \u0026 Known Issues\n\n### edit_contact\nDynadot API requires ALL contact fields to be provided when editing, not just the fields you want to change. Partial updates will fail with \"missing email\" or similar errors.\n\n**Solution**: Always provide complete contact data:\n```typescript\nawait client.execute('edit_contact', {\n  contact_id: '12345',\n  name: 'Updated Name',\n  email: 'email@example.com',\n  phonecc: '1',\n  phonenum: '5551234567',\n  address1: '123 Street',\n  city: 'City',\n  state: 'CA',\n  zip: '94102',\n  country: 'US'\n});\n```\n\n### lock_domain unlock\nThe `lock_domain` unlock command may return a misleading error \"this domain has been locked already\" when attempting to unlock. This appears to be either:\n- Domain protection preventing API unlock\n- A bug in the Dynadot API error messaging\n\nUnlocking domains may need to be done through the Dynadot control panel.\n\n## Architecture\n\n```\nsrc/\n├── index.ts       # MCP server entry point\n├── client.ts      # Dynadot API client\n├── schema.ts      # Tool and action definitions (10 tools, 106 actions)\n└── register.ts    # Tool registration with MCP server\n\ntest/\n├── e2e.test.ts         # Endpoint validation tests\n└── functional.test.ts  # Real CRUD operation tests\n```\n\n## Dependencies\n\n- `@modelcontextprotocol/sdk` - MCP protocol implementation\n- `ky` - HTTP client for API requests\n- `zod` - Schema validation\n- `vitest` - Testing framework\n- `typescript` - Type safety\n\n## Documentation\n\n### 📚 Guides\n- **[Quick Start](#quick-installation)** - Get up and running in 5 minutes\n- **[Setup Guide](docs/setup.md)** - Detailed setup for Claude Code, Cursor, Claude Desktop\n- **[Deployment](docs/deployment.md)** - Local, Docker, remote, and serverless options\n- **[Environment](docs/environment.md)** - Complete environment variable reference\n- **[Testing](docs/testing.md)** - Automated testing with Claude Haiku\n- **[Reference](docs/reference.md)** - Common commands and usage patterns\n- **[Examples](examples/)** - Code examples for common operations\n\n### 🔧 Development\n- **[Contributing](CONTRIBUTING.md)** - How to contribute, API quirks, testing\n- **[Changelog](CHANGELOG.md)** - Version history and updates\n- **[Roadmap](docs/roadmap.md)** - Implementation status and roadmap\n\n### 🏗️ Project\n- **[License](LICENSE)** - MIT License\n\n## License\n\nMIT\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests for new functionality\n5. Ensure all tests pass\n6. Submit a pull request\n\n## Frequently Asked Questions\n\n### What is an MCP server for domains?\n\nA Domain MCP server is a Model Context Protocol server that enables AI assistants like Claude and Cursor to manage domains through natural language. Instead of using a web interface or writing API code, you simply ask your AI assistant to perform domain operations.\n\n### How is this different from using the Dynadot website?\n\nThe Domain MCP server brings domain management into your AI assistant's context:\n- **Natural language**: \"Register example.com\" vs clicking through multiple pages\n- **AI understanding**: The assistant knows your account structure and suggests related actions\n- **Workflow integration**: Manage domains while coding, writing, or working without leaving your editor\n- **Automation ready**: Chain multiple domain operations in one conversation\n\n### Which AI assistants work with this Domain MCP server?\n\nThis MCP server works with any MCP-compatible AI assistant:\n- **Claude Code** - Anthropic's official CLI\n- **Cursor** - AI-powered code editor\n- **Claude Desktop** - Anthropic's desktop app\n- Any other client supporting the Model Context Protocol\n\n### Do I need to know the Dynadot API?\n\nNo! That's the power of the Domain MCP approach. Your AI assistant handles the API complexity. Just describe what you want in natural language.\n\n### Is this safe to use with production domains?\n\nYes, with proper precautions:\n- **Sandbox mode**: Test with `DYNADOT_SANDBOX=true` first\n- **Review actions**: The AI shows you what it will do before executing\n- **API limits**: Dynadot's API rate limits prevent runaway operations\n- **Audit trail**: All operations are logged in your Dynadot account\n\n### How much does it cost?\n\nThe Domain MCP server itself is **free and open source** (MIT license). You only pay for Dynadot domain services and your AI assistant subscription.\n\n## Support\n\n### Getting Help with Domain MCP\n\n- **Issues \u0026 Questions**: [GitHub Issues](https://github.com/joachimBrindeau/domain-mcp/issues)\n- **Feature Requests**: [GitHub Discussions](https://github.com/joachimBrindeau/domain-mcp/discussions)\n- **Contributing**: See [CONTRIBUTING.md](CONTRIBUTING.md)\n\n### Documentation Resources\n\n**Dynadot API**:\n- [API Commands](https://www.dynadot.com/domain/api-commands?s9F6L9F7U8Q9U8Z8v) - Complete API reference\n- [API Help](https://www.dynadot.com/community/help/api?s9F6L9F7U8Q9U8Z8v) - Community support\n\n**Model Context Protocol**:\n- [MCP Specification](https://modelcontextprotocol.io/) - Official MCP documentation\n- [MCP Servers](https://github.com/modelcontextprotocol/servers) - Example MCP implementations\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FjoachimBrindeau%2Fdomain-mcp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FjoachimBrindeau%2Fdomain-mcp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FjoachimBrindeau%2Fdomain-mcp/lists"}