CLI · MCP · Agent Skill

Is that domain free?
Ask your agent.

tldx checks domain availability inline, from your terminal or from inside Claude, Cursor and any other MCP client. Live answers from the Spaceship registrar API.

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

$ npx tldx https://www.Example.com/about
❌ taken

$ npx tldx pickaname.dev --json
{
  "domain": "pickaname.dev",
  "valid": true,
  "available": true
}

$ 

One check, three ways in

Use whichever fits where you work. They all call the same Spaceship lookup and give the same answer.

$ CLI

Run npx tldx with a domain. Add --json for scripts. The exit code tells you the result, so it works in shell pipelines.

⌁ MCP server

A check_domain tool 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 when to check a domain. It uses the MCP tool if it's connected and falls back to the CLI.

Install

You need Node 18+ and a Spaceship API key with the domains:read permission. Create one in the Spaceship API Manager.

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 example.com
npx tldx example.com --json

Exit codes: 0 available · 2 taken · 1 invalid or error. Errors go to stderr.

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

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

Output

There are three possible results. The MCP tool returns each one as text plus structured content, and the CLI's --json flag prints the same object.

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 }
  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 and API failures come back as a message with isError: true, so they're never mistaken for "taken".