CLI · MCP · Agent Skill

Find the domain.
Buy it inline.

tldx checks and registers domains from your terminal or from inside Claude, Cursor and any other MCP client, using the Spaceship registrar API. Nothing is bought until you say yes.

$ npx tldx check example.com
$ npx tldx check google.com
❌ taken

$ npx tldx check pickaname.dev
✅ available

$ npx tldx register pickaname.dev --years 2
🛒 not registered yet: pickaname.dev for 2 years, contacts copied from mybrand.com
Re-run with --yes to buy it.

$ npx tldx register pickaname.dev --years 2 --yes
✅ registered for 2 years

$ 

Check, then register. Three ways in.

Use whichever fits where you work. All three call the same Spaceship API and give the same answers.

$ CLI

tldx check and tldx register. Add --json for scripts. Exit codes tell you the result, so it works in shell pipelines.

⌁ MCP server

check and register tools for Claude, Cursor and other MCP clients. Results come back as text and as structured JSON.

✦ Agent Skill

A SKILL.md that tells your agent how to check and register domains. It uses the MCP tools if they're connected, falls back to the CLI, and asks before buying.

Buying is opt-in

Registering a domain spends real money, so tldx shows you a preview first and only buys after you confirm.

1 Preview

Without --yes (CLI) or confirm: true (MCP), register only shows what it would buy: the domain, the number of years and which contacts it will use.

2 Confirm

Run it again with confirmation and tldx registers the domain for 1 to 10 years. It's charged to your Spaceship balance or saved payment method.

3 Done

You get registered, or pending with an operation ID if Spaceship takes longer than 60 seconds to finish.

  1. Contacts are copied. Spaceship needs registrant contacts, so tldx reuses the ones from the domain you registered most recently on Spaceship. You need at least one domain there already.
  2. Privacy on, auto-renew off. New domains get WHOIS privacy, and you choose when to renew.
  3. Agents ask first. The Agent Skill tells your agent to get your approval before it registers anything.

Install

You need Node 18+ and a Spaceship API key from the Spaceship API Manager. Checking needs the domains:read permission. To register domains, also add domains:billing and asyncoperations:read.

claude mcp add tldx -e SPACESHIP_API_KEY=xxx -e SPACESHIP_API_SECRET=yyy -- npx -y tldx
{
  "mcpServers": {
    "tldx": {
      "command": "npx",
      "args": ["-y", "tldx"],
      "env": {
        "SPACESHIP_API_KEY": "xxx",
        "SPACESHIP_API_SECRET": "yyy"
      }
    }
  }
}

Put this in claude_desktop_config.json, .cursor/mcp.json or your client's MCP config file.

export SPACESHIP_API_KEY=xxx
export SPACESHIP_API_SECRET=yyy

npx tldx check example.com          # or just: npx tldx example.com
npx tldx check example.com --json
npx tldx register example.com --years 2         # preview
npx tldx register example.com --years 2 --yes   # buy

check exits with 0 available · 2 taken · 1 invalid or error.
register exits with 0 registered · 3 not confirmed or pending · 2 taken · 1 invalid or error.
Errors go to stderr.

mkdir -p ~/.claude/skills/tldx
cp skills/tldx/SKILL.md ~/.claude/skills/tldx/

The skill ships in the package at skills/tldx/SKILL.md. For one project only, put it in .claude/skills/.

Output

Each MCP tool returns a short text result plus structured content. The CLI's --json flag prints the same object.

check { "domain": "example.com" }

TextStructured content
✅ available{ "domain": "pickaname.dev", "valid": true, "available": true }
❌ taken{ "domain": "google.com", "valid": true, "available": false }
⚠️ invalid{ "domain": "notadomain", "valid": false, "available": false }

register { "domain": "example.com", "years": 1, "confirm": true }

Textstatus
🛒 not registered yet: pickaname.dev for 1 year, contacts copied from mybrand.comunconfirmed
✅ registered for 1 yearregistered
⏳ pending (operation …)pending
❌ takentaken
⚠️ invalidinvalid

Structured content: { domain, status, years?, contactsFrom?, operationId? }. years is 1–10 and defaults to 1.

  1. Forgiving input. Case, https://, www. and paths are stripped before the check.
  2. Internationalized names. Names like café.fr work, and results always show the readable form.
  3. Clear errors. Missing keys, API failures and failed registrations come back as a message with isError: true, so they're never mistaken for "taken".