Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Comprehensive Gandi domain registrar integration for domain and DNS management. Register and manage domains, create/update/delete DNS records (A, AAAA, CNAME...
Comprehensive Gandi domain registrar integration for domain and DNS management. Register and manage domains, create/update/delete DNS records (A, AAAA, CNAME...
This item is timing out or returning errors right now. Review the source page and try again later.
Use the source page and any available docs to guide the install because the item is currently unstable or timing out.
I tried to install a skill package from Yavira, but the item is currently unstable or timing out. Inspect the source page and any extracted docs, then tell me what you can confirm and any manual steps still required.
I tried to upgrade a skill package from Yavira, but the item is currently unstable or timing out. Compare the source page and any extracted docs with my current installation, then summarize what changed and what manual follow-up I still need.
Comprehensive Gandi domain registrar integration for Moltbot. Status: โ Phase 2 Complete - DNS modification & snapshots functional
This skill can perform DESTRUCTIVE operations on your Gandi account: DNS Modification: Add, update, or delete DNS records (can break websites/email) Email Management: Create, modify, or delete email forwards (can intercept emails) Domain Registration: Register domains (creates financial transactions) Bulk Operations: Replace all DNS records at once (cannot be undone except via snapshots) Before running ANY script: Review the script code to understand what it does Create DNS snapshots before bulk changes (create-snapshot.js) Use read-only Personal Access Tokens where possible Test on non-production domains first Understand that some operations cannot be undone Destructive scripts (โ ๏ธ modify or delete data): add-dns-record.js, delete-dns-record.js, update-dns-bulk.js add-email-forward.js, update-email-forward.js, delete-email-forward.js restore-snapshot.js (replaces current DNS) Read-only scripts (โ safe, no modifications): list-domains.js, list-dns.js, list-snapshots.js list-email-forwards.js, check-domain.js, check-ssl.js ๐ For complete script documentation: See SCRIPTS.md for detailed information about: What each script does Network operations and API calls Security implications Undo/recovery procedures Audit workflow recommendations
โ Personal Access Token authentication โ List domains in your account โ Get domain details (expiration, status, services) โ List DNS records for domains โ View domain and DNS information โ Domain availability checking (#4) โ Smart domain suggestions with variations (#4) โ SSL certificate status checker โ Error handling and validation
โ Add/update DNS records (A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, PTR) โ Delete DNS records โ Bulk DNS operations (replace all records at once) โ DNS zone snapshots (create, list, restore) โ Email forwarding (create, list, update, delete forwards including catch-all) โ Record validation (automatic validation for each record type) โ Safety features (automatic snapshots before bulk changes, confirmation prompts)
Domain registration Multi-organization support (#1) Gateway Console configuration (#3) Domain renewal management DNSSEC configuration Certificate management Email mailbox management (beyond forwarding)
โ ๏ธ Security Recommendation: Use the minimum required scopes for your use case. Go to Gandi Admin โ Personal Access Tokens Click "Create a token" Select your organization Choose scopes: Read-Only (Recommended for viewing only): โ Domain: read (required for listing domains) โ LiveDNS: read (required for viewing DNS records) โ Email: read (required for viewing email forwards) Write Access (Required for modifications - use with caution): โ ๏ธ LiveDNS: write (enables DNS modification, deletion, bulk operations) โ ๏ธ Email: write (enables email forward creation, updates, deletions) Copy the token (you won't see it again!) Security Best Practices: Create separate tokens for read-only vs. write operations Use read-only tokens for routine checks/monitoring Only use write tokens when actively making changes Rotate tokens regularly (every 90 days recommended) Delete unused tokens immediately Never share or commit tokens to version control
Scripts check for credentials in priority order: GANDI_API_TOKEN environment variable (checked first) ~/.config/gandi/api_token file (fallback if env var not set) Choose the method that fits your workflow: Option A: Environment Variable (Recommended for CI/CD) # Set environment variable (replace YOUR_PAT with actual token) export GANDI_API_TOKEN="YOUR_PERSONAL_ACCESS_TOKEN" # Add to shell profile for persistence (~/.bashrc, ~/.zshrc, etc.) echo 'export GANDI_API_TOKEN="YOUR_PERSONAL_ACCESS_TOKEN"' >> ~/.bashrc Benefits: โ CI/CD friendly (standard pattern for automation) โ Container-ready (no file mounts needed) โ Works with secret management tools (1Password, Vault, etc.) โ Easy to switch between multiple tokens Option B: File-based (Recommended for local development) # Create config directory mkdir -p ~/.config/gandi # Store your token (replace YOUR_PAT with actual token) echo "YOUR_PERSONAL_ACCESS_TOKEN" > ~/.config/gandi/api_token # Secure the file (owner read-only) chmod 600 ~/.config/gandi/api_token Benefits: โ Token persists across shell sessions โ Secure file permissions (0600 = owner read-only) โ No risk of exposing token in process list โ Works offline (no external dependencies)
Required: Node.js >= 18.0.0 cd gandi-skill/scripts # Install npm dependencies npm install # Verify installation npm list --depth=0 Expected packages: axios (HTTP client for Gandi API) Any other dependencies listed in package.json Troubleshooting: If node or npm not found: Install Node.js from nodejs.org If permission errors: Don't use sudo - fix npm permissions or use nvm If package errors: Delete node_modules/ and package-lock.json, then npm install again
cd gandi-skill/scripts node test-auth.js Expected output: โ Authentication successful! Your organizations: 1. Personal Account (uuid-here) Type: individual ๐ You're ready to use the Gandi skill!
If you plan to register domains, save your contact information once for reuse: cd gandi-skill/scripts node setup-contact.js The script will prompt for: Name (first and last) Email address Phone number (international format: +1.5551234567) Street address City State/Province (for US: 2-letter code like OH, automatically formatted to US-OH) ZIP/Postal code Country (2-letter code: US, FR, etc.) Type (individual or company) Privacy preference: Retain or auto-purge contact after registration Contact information is saved to: ~/.config/gandi/contact.json Permissions: 600 (owner read-write only) Outside the skill directory (never committed to git) Privacy Options: RETAIN (default): Keep contact saved for future registrations Best for frequent domain registrations Setup once, use forever Delete manually anytime with delete-contact.js PURGE: Auto-delete contact after each registration Best for privacy-conscious users Contact info only exists during registration Must re-enter for next registration Managing saved contact: # View current contact node view-contact.js # Update contact info or privacy preference node setup-contact.js # Delete saved contact manually node delete-contact.js # Delete without confirmation node delete-contact.js --force One-time purge override: # Register and delete contact (even if preference is "retain") node register-domain.js example.com --purge-contact
node list-domains.js Output shows: Domain names Expiration dates Auto-renewal status Services (LiveDNS, Email, etc.) Organization ownership
node list-dns.js example.com Output shows: All DNS records grouped by type TTL values Record names and values Nameservers
Once configured, you can use natural language: "List my Gandi domains" "Show DNS records for example.com" "When does example.com expire?" "Is auto-renewal enabled for example.com?"
Check if a specific domain is available for registration: node check-domain.js example.com Features: Shows availability status (available/unavailable/pending/error) Displays pricing information (registration, renewal, transfer) Lists supported features (DNSSEC, LiveDNS, etc.) Shows TLD information Example Output: ๐ Checking availability for: example.com Domain: example.com โ Status: AVAILABLE ๐ฐ Pricing: 1 year: 12.00 EUR (+ 2.40 tax) 2 years: 24.00 EUR (+ 4.80 tax) ๐ Supported Features: โข create โข dnssec โข livedns ๐ TLD Information: Extension: com
Find available alternatives with TLD variations and name modifications: # Check all configured TLDs + variations node suggest-domains.js example # Check specific TLDs only node suggest-domains.js example --tlds com,net,io # Skip name variations (only check TLDs) node suggest-domains.js example --no-variations # Output as JSON node suggest-domains.js example --json Name Variation Patterns: Hyphenated: Adds hyphens between word boundaries (example โ ex-ample) Abbreviated: Removes vowels (example โ exmpl) Prefix: Adds common prefixes (example โ get-example, my-example) Suffix: Adds common suffixes (example โ example-app, example-hub) Numbers: Appends numbers (example โ example2, example3) Example Output: ๐ Checking availability for: example ๐ Checking 13 TLDs and generating variations... โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ๐ EXACT MATCHES (Different TLDs) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ Available: example.net 12.00 EUR example.io 39.00 EUR example.dev 15.00 EUR โ Unavailable: example.com (unavailable) example.org (unavailable) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ๐จ NAME VARIATIONS โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Hyphenated: โ ex-ample.com 12.00 EUR Prefix: โ get-example.com 12.00 EUR โ my-example.com 12.00 EUR Suffix: โ example-app.com 12.00 EUR โ example-io.com 12.00 EUR โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ๐ SUMMARY: 8 available domains found โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Domain checker configuration is stored in gandi-skill/config/domain-checker-defaults.json. Structure: { "tlds": { "mode": "extend", "defaults": ["com", "net", "org", "info", "io", "dev", "app", "ai", "tech"], "custom": [] }, "variations": { "enabled": true, "patterns": ["hyphenated", "abbreviated", "prefix", "suffix", "numbers"], "prefixes": ["get", "my", "the", "try"], "suffixes": ["app", "hub", "io", "ly", "ai", "hq"], "maxNumbers": 3 }, "rateLimit": { "maxConcurrent": 3, "delayMs": 200, "maxRequestsPerMinute": 100 }, "limits": { "maxTlds": 5, "maxVariations": 10 } } Rate Limiting & Limits: maxConcurrent: Maximum concurrent API requests (default: 3) delayMs: Delay between requests in milliseconds (default: 200ms) maxRequestsPerMinute: Hard limit on requests per minute (default: 100, Gandi allows 1000) maxTlds: Maximum TLDs to check in suggest-domains.js (default: 5) maxVariations: Maximum name variations to generate (default: 10) These limits ensure good API citizenship and prevent overwhelming Gandi's API. TLD Modes: "extend": Use defaults + custom TLDs (merged list) "replace": Use only custom TLDs (ignore defaults) Gateway Console Integration: When Gateway Console support is added (#3), configuration will be available at: skills: entries: gandi: config: domainChecker: tlds: mode: extend defaults: [...] custom: [...] variations: enabled: true patterns: [...] See docs/gateway-config-design.md for complete configuration architecture.
Create or update individual DNS records: # Add an A record for root domain node add-dns-record.js example.com @ A 192.168.1.1 # Add www subdomain pointing to root node add-dns-record.js example.com www CNAME @ # Add MX record for email node add-dns-record.js example.com @ MX "10 mail.example.com." # Add TXT record for SPF node add-dns-record.js example.com @ TXT "v=spf1 include:_spf.google.com ~all" # Add with custom TTL (5 minutes) node add-dns-record.js example.com api A 192.168.1.10 300 Supported record types: A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, PTR
Remove specific DNS records: # Delete old A record node delete-dns-record.js example.com old A # Delete with confirmation prompt node delete-dns-record.js example.com test CNAME # Delete without confirmation node delete-dns-record.js example.com old A --force
Replace all DNS records at once: # From JSON file node update-dns-bulk.js example.com new-records.json # From stdin cat records.json | node update-dns-bulk.js example.com # Skip automatic snapshot node update-dns-bulk.js example.com records.json --no-snapshot # Skip confirmation node update-dns-bulk.js example.com records.json --force JSON format: [ { "rrset_name": "@", "rrset_type": "A", "rrset_ttl": 10800, "rrset_values": ["192.168.1.1"] }, { "rrset_name": "www", "rrset_type": "CNAME", "rrset_ttl": 10800, "rrset_values": ["@"] }, { "rrset_name": "@", "rrset_type": "MX", "rrset_ttl": 10800, "rrset_values": ["10 mail.example.com.", "20 mail2.example.com."] } ]
Create safety backups before making changes: # Create a snapshot node create-snapshot.js example.com "Before migration" # List all snapshots node list-snapshots.js example.com # Restore from a snapshot node restore-snapshot.js example.com abc123-def456-ghi789 # Restore without confirmation node restore-snapshot.js example.com abc123-def456-ghi789 --force Automatic snapshots: Bulk updates automatically create snapshots (unless --no-snapshot) Snapshots are named with timestamp Use snapshots for easy rollback
Basic Website Setup # Root domain node add-dns-record.js example.com @ A 192.168.1.1 # WWW subdomain node add-dns-record.js example.com www CNAME @ Email Configuration (Google Workspace) # MX records node add-dns-record.js example.com @ MX "1 ASPMX.L.GOOGLE.COM." node add-dns-record.js example.com @ MX "5 ALT1.ASPMX.L.GOOGLE.COM." node add-dns-record.js example.com @ MX "5 ALT2.ASPMX.L.GOOGLE.COM." # SPF record node add-dns-record.js example.com @ TXT "v=spf1 include:_spf.google.com ~all" Domain Redirect Setup To redirect one domain to another: # Point root domain to same server node add-dns-record.js old-domain.com @ A 192.168.1.1 # Point www to same CNAME node add-dns-record.js old-domain.com www CNAME @ Then configure HTTP 301 redirect at the server level. Subdomain Setup # API subdomain node add-dns-record.js example.com api A 192.168.1.10 # Staging subdomain node add-dns-record.js example.com staging A 192.168.1.20 # Wildcard subdomain node add-dns-record.js example.com "*" A 192.168.1.100
See all email forwards configured for a domain: node list-email-forwards.js example.com
Forward emails to one or more destinations: # Simple forward node add-email-forward.js example.com hello you@personal.com # Forward to multiple destinations node add-email-forward.js example.com support team1@example.com team2@example.com # Catch-all forward (forwards all unmatched emails) node add-email-forward.js example.com @ catchall@example.com
Change the destination(s) for an existing forward: # Update single destination node update-email-forward.js example.com hello newemail@personal.com # Update to multiple destinations node update-email-forward.js example.com support new1@example.com new2@example.com Note: This replaces all existing destinations with the new ones.
Remove email forwards: # Delete with confirmation prompt node delete-email-forward.js example.com old # Delete without confirmation node delete-email-forward.js example.com old --force # Delete catch-all forward node delete-email-forward.js example.com @ --force
Basic Email Forwarding # Forward contact@ to your personal email node add-email-forward.js example.com contact you@gmail.com # Forward sales@ to team node add-email-forward.js example.com sales team@example.com Domain Migration Email Forwarding # Forward all email from old domain to new domain # Preserves the local part (username before @) # First, list existing forwards on old domain node list-email-forwards.js old-domain.com # Then create matching forwards on new domain node add-email-forward.js old-domain.com contact contact@new-domain.com node add-email-forward.js old-domain.com support support@new-domain.com # Or use catch-all to forward everything node add-email-forward.js old-domain.com @ admin@new-domain.com Team Distribution Lists # Forward to entire team node add-email-forward.js example.com team alice@example.com bob@example.com charlie@example.com # Update team members node update-email-forward.js example.com team alice@example.com dave@example.com Catch-All Configuration # Forward all unmatched emails to one address node add-email-forward.js example.com @ catchall@example.com # Forward all unmatched emails to multiple addresses node add-email-forward.js example.com @ admin1@example.com admin2@example.com Note: Catch-all forwards only apply to email addresses that don't have specific forwards configured.
Test after creating: Send a test email to verify forwarding works Use specific forwards over catch-all: More control and easier to manage Multiple destinations: Email is sent to all destinations (not round-robin) Order doesn't matter: Gandi processes most specific match first Check spam folders: Forwarded emails may be filtered by recipient's spam filter
# 1. Set up MX records (if not already done) node add-dns-record.js example.com @ MX "10 spool.mail.gandi.net." node add-dns-record.js example.com @ MX "50 fb.mail.gandi.net." # 2. Create specific forwards node add-email-forward.js example.com hello you@personal.com node add-email-forward.js example.com support team@example.com node add-email-forward.js example.com sales sales-team@example.com # 3. Set up catch-all for everything else node add-email-forward.js example.com @ admin@example.com # 4. List all forwards to verify node list-email-forwards.js example.com
All scripts are in gandi-skill/scripts/:
ScriptPurposetest-auth.jsVerify authentication workssetup-contact.jsSave contact info for domain registration (run once)view-contact.jsView saved contact informationdelete-contact.jsDelete saved contact (with optional --force)
ScriptPurposelist-domains.jsShow all domains in accountlist-dns.js <domain>Show DNS records for domaincheck-domain.js <domain>Check single domain availability + pricingsuggest-domains.js <name>Smart domain suggestions with variationscheck-ssl.jsCheck SSL certificate status for all domains
ScriptPurposeadd-dns-record.js <domain> <name> <type> <value> [ttl]Add or update a DNS recorddelete-dns-record.js <domain> <name> <type> [--force]Delete a DNS recordupdate-dns-bulk.js <domain> <records.json> [--no-snapshot] [--force]Bulk update all DNS recordslist-snapshots.js <domain>List DNS zone snapshotscreate-snapshot.js <domain> [name]Create a DNS zone snapshotrestore-snapshot.js <domain> <snapshot-id> [--force]Restore DNS zone from snapshot
ScriptPurposelist-email-forwards.js <domain>List all email forwards for a domainadd-email-forward.js <domain> <mailbox> <destination> [dest2...]Create email forward (use @ for catch-all)update-email-forward.js <domain> <mailbox> <destination> [dest2...]Update email forward destinationsdelete-email-forward.js <domain> <mailbox> [--force]Delete email forward
ScriptPurposegandi-api.jsCore API client (importable)
Token file: ~/.config/gandi/api_token (API authentication) Contact file: ~/.config/gandi/contact.json (domain registration info, optional) API URL: https://api.gandi.net (production)
To use Gandi's sandbox environment: # Create sandbox token at: https://admin.sandbox.gandi.net echo "YOUR_SANDBOX_TOKEN" > ~/.config/gandi/api_token echo "https://api.sandbox.gandi.net" > ~/.config/gandi/api_url
# Verify file exists ls -la ~/.config/gandi/api_token # Should show: -rw------- (600 permissions)
Token is incorrect or expired Create new token at Gandi Admin Update stored token file
Token doesn't have required scopes Create new token with Domain:read and LiveDNS:read Verify organization membership
If you get "not using Gandi LiveDNS" error: Log in to Gandi Admin Go to domain management Attach LiveDNS service to the domain
Gandi allows 1000 requests/minute. If exceeded: Wait 60 seconds Reduce frequency of API calls
The skill provides importable functions: import { testAuth, listDomains, getDomain, listDnsRecords, getDnsRecord, checkAvailability } from './gandi-api.js'; // Test authentication const auth = await testAuth(); // List domains const domains = await listDomains(); // Get domain info const domain = await getDomain('example.com'); // List DNS records const records = await listDnsRecords('example.com'); // Get specific DNS record const record = await getDnsRecord('example.com', '@', 'A'); // Check availability const available = await checkAvailability(['example.com', 'example.net']);
โ DO: Store at ~/.config/gandi/api_token Use 600 permissions (owner read-only) Rotate tokens regularly Use minimal required scopes โ DON'T: Commit tokens to repositories Share tokens between users Give tokens unnecessary permissions Store tokens in scripts
Phase 1 (current): Domain: read LiveDNS: read Phase 2+ (future): Domain: read, write (for registration, renewal) LiveDNS: read, write (for DNS modifications) Certificate: read (optional, for SSL certs) Email: read, write (optional, for email config)
gandi-skill/ โโโ SKILL.md # This file โโโ references/ # API documentation โ โโโ api-overview.md โ โโโ authentication.md โ โโโ domains.md โ โโโ livedns.md โ โโโ setup.md โโโ scripts/ # Helper utilities โโโ package.json โโโ gandi-api.js # Core API client โโโ test-auth.js # Test authentication โโโ list-domains.js # List domains โโโ list-dns.js # List DNS records
Phase 1: Read Operations (โ Current) Authentication with PAT List domains Get domain details List DNS records Basic error handling Phase 2: DNS Modifications Add DNS records Update DNS records Delete DNS records Bulk DNS operations Phase 3: Domain Management Domain registration Domain renewal Auto-renewal configuration Nameserver management Phase 4: Multi-Organization (#1) Profile-based token management Organization selection Multiple token support Phase 5: Advanced Features DNSSEC management Certificate management Email/mailbox configuration Domain transfer operations
See Contributing Guide in the main README.
Issues: GitHub Issues Documentation: Reference Guides Gandi Support: help.gandi.net
MIT License - See LICENSE
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.