Skip to main content
Glama
gotchykid

Domain Availability Checker MCP

by gotchykid
README.md
# Domain Availability Checker MCP

An MCP (Model Context Protocol) server that checks domain availability for registration using RDAP APIs.

## Supported TLDs

Currently supported:
- `.com` - via Verisign RDAP API
- `.net` - via Verisign RDAP API

The architecture is extensible - see [Adding a New TLD](#adding-a-new-tld) below.

## Installation

### Usage with Claude Desktop

Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):

```json
{
  "mcpServers": {
    "domain-checker": {
      "command": "npx",
      "args": ["-y", "github:gotchykid/domain-availability-checker-mcp"]
    }
  }
}
```

### From Source

```bash
# Clone the repository
git clone https://github.com/gotchykid/domain-availability-checker-mcp.git
cd domain-availability-checker-mcp

# Install dependencies
npm install

# Build
npm run build
```

Then add to Claude Desktop config:

```json
{
  "mcpServers": {
    "domain-checker": {
      "command": "node",
      "args": ["/path/to/domain-availability-checker-mcp/build/index.js"]
    }
  }
}
```

## Tools

### check_domain

Check if a domain is available for registration.

**Parameters:**
- `domain` (string): Domain name to check (e.g., "example.com" or "example.net")

**Returns:**
- Domain availability status
- If registered: registrar, creation date, expiration date, nameservers, and status

## Development

```bash
# Watch mode for development
npm run watch

# Test with MCP Inspector
npm run inspector
```

## Adding a New TLD

To add support for a new TLD (e.g., `.org`):

1. Create a new file `src/checkers/org.ts`
2. Implement the `DomainChecker` interface
3. Export the checker as `default`

Example:

```typescript
import { DomainChecker, DomainCheckResult } from "../types.js";
import {
  RdapResponse,
  parseRdapResponse,
  createAvailableResult,
} from "./rdap-utils.js";

const RDAP_BASE_URL = "https://rdap.publicinterestregistry.org/rdap/domain/";
const TLD = "org";

const orgChecker: DomainChecker = {
  tld: TLD,

  async check(domain: string): Promise<DomainCheckResult> {
    const normalizedDomain =
      domain.toLowerCase().replace(/\.org$/, "") + ".org";

    try {
      const response = await fetch(`${RDAP_BASE_URL}${normalizedDomain}`);

      if (response.status === 404) {
        return createAvailableResult(normalizedDomain, TLD);
      }

      if (!response.ok) {
        throw new Error(`RDAP request failed with status ${response.status}`);
      }

      const data: RdapResponse = await response.json();
      return parseRdapResponse(data, normalizedDomain, TLD);
    } catch (error) {
      if (error instanceof Error && error.message.includes("404")) {
        return createAvailableResult(normalizedDomain, TLD);
      }
      throw error;
    }
  },
};

export default orgChecker;
```

The registry auto-discovers checker files on startup - no other changes needed.

## License

MIT

TDQS

A3.8/5.0

Scored across 1 tool

Disambiguation5/5

With only a single tool, there is no possibility of confusion between tools. The tool's purpose is entirely clear and distinct.

Naming Consistency5/5

The single tool name follows a clear verb_noun convention ('check_domain'). With only one tool, naming consistency is inherently maintained.

Tool Count3/5

A single tool is on the borderline for a server. While it serves the narrow scope of checking domain availability, the surface feels thin with no supporting tools for related operations like bulk checks or WHOIS lookups.

Completeness5/5

For the stated purpose of checking domain availability, the tool fully covers the core operation. There are no missing lifecycle steps or dead ends for this narrow domain.

Maintenance

ActivityInactive
ResponsivenessNo issues