# Domain MCP manual

Domain MCP answers whether a domain is free, what it costs to register and renew, and who holds it when it is taken. Use it as a plain REST API or add it to Claude, ChatGPT, Gemini or your editor as an MCP server. Everything is free, with no key and no sign-in.

- REST API: `https://api.domainmcp.net/v1/`
- MCP server: `https://domainmcp.net/mcp`
- Agent skill: `https://domainmcp.net/skill.md`
- Documentation: https://domainmcp.net/documentation


---

# Quick start

Three minutes from nothing to a working domain search: one call in a terminal, one look at the answer, and the same thing inside your assistant.

## 1. Make a call

Paste this into a terminal. It asks whether brightfield is free on 12 popular endings.

Terminal:

```
curl "https://api.domainmcp.net/v1/search?name=brightfield"
```

No key, no header, no sign-up. The same address works from a server, a script or a web page, since the API allows calls from any site.

## 2. Read the answer

You get a list in `data`, free names first and cheapest first. A free one looks like this:

```json
{
    "domain": "brightfield.io",
    "available": true,
    "status": "available",
    "confirmed": true,
    "by": "registry",
    "checked_at": "2026-11-10T09:14:02Z",
    "premium": false,
    "price": {
        "first_year": 34.98,
        "renews": 52.98,
        "min_years": 1,
        "on_offer": false,
        "currency": "USD"
    },
    "buy_url": "https://buy.domainmcp.net/k7m2xqa?f=api"
}
```

`status` is `available`, `taken` or `unknown`. `price` is the public price in US dollars, and `buy_url` opens a registrar with the name ready to register. [Reading a result](https://domainmcp.net/documentation/reading-a-result) explains every field.

## 3. Add it to your assistant

Add this address as a custom connector in Claude, ChatGPT, Gemini, Cursor or any MCP client, then ask about domains in plain words.

- MCP server address: `https://domainmcp.net/mcp`

Each assistant has its own one-minute walkthrough: [Claude](https://domainmcp.net/documentation/claude), [ChatGPT](https://domainmcp.net/documentation/chatgpt), [Gemini](https://domainmcp.net/documentation/gemini), [Claude Code](https://domainmcp.net/documentation/claude-code), [Cursor](https://domainmcp.net/documentation/cursor), [VS Code](https://domainmcp.net/documentation/vscode), [Windsurf](https://domainmcp.net/documentation/windsurf).

## From code

Python:

```
import requests

r = requests.get("https://api.domainmcp.net/v1/search", params={"name": "brightfield"})
for d in r.json()["data"]:
    print(d["domain"], d["status"], (d.get("price") or {}).get("first_year"))
```

JavaScript:

```
const r = await fetch("https://api.domainmcp.net/v1/search?name=brightfield");
const { data } = await r.json();
for (const d of data) console.log(d.domain, d.status, d.price?.first_year);
```

---

# Reading a result

Every endpoint answers with the same kind of result for a domain. This page explains each field, how a free answer gets confirmed, and what to do with an unknown one.

## The three answers

- `available` (available: true): Nobody holds it: it can be registered now. It comes with price and `buy_url`, unless it is premium.
- `taken` (available: false): Somebody holds it. It comes with registrar, registered and expires when the registry publishes them.
- `unknown` (available: null): Not known yet: the registry did not answer in time, or the ending does not say. Ask again in a minute.

## How sure an answer is

Answers are made fast first and then made sure. A name with no nameservers is very likely free, so that comes back straight away; the registry itself is then asked, usually within a minute. `confirmed` says whether that has happened, and `by` says where the answer came from.

- `registry` (confirmed): The registry that runs the ending answered. This is the final word.
- `registrar` (confirmed): For endings whose registry does not answer lookups, a registrar's own check answered.
- `dns` (confirmed): A taken name: its nameservers are live, so somebody holds it.
- `confirming` (not yet): Free by DNS and being confirmed with the registry. Ask again in a minute.
- `dns_only` (not yet): Free by DNS on an ending whose registry does not answer lookups. A registrar check is queued.

When an answer holds names still being confirmed, `meta.confirming` counts them and `meta.note` says so in words.

## Free names

- `premium` (boolean): True when the registry has set its own price for this name, often in the hundreds or more. Premium names have no price and no `buy_url` here.
- `price` (object): `first_year`, renews, `min_years`, `on_offer` and currency. See Prices and endings.
- `buy_url` (string): A short link that opens a registrar with the name ready to register. See Buy links.

## Taken names

- `registrar` (string or null): Who holds it.
- `registered` (string or null): The date it was first registered.
- `expires` (string or null): The date it is paid up to. A name past this date is not free until the registry releases it.

Some registries do not publish these, and some answers come from DNS alone, so any of them can be null. [/v1/details](https://domainmcp.net/documentation/details) asks the registry again for a taken name and adds its nameservers.

## The rest of meta

- `count` (integer): How many results are in data.
- `took_ms` (integer): How long the answer took on our side.
- `skipped` (list): Inputs that could not be checked, each with input and error. See Errors.

---

# Limits

Everything is free, so calls are paced per address instead. The allowance is counted in domains checked, not in calls made.

## The allowance

- `60 a minute` (Per address): Domains checked from one address in a minute.
- `2,000 a day` (Per address): Domains checked from one address in a day, reset at 00:00 UTC.
- `4 a minute` (Suggestions): Suggestion requests, with 60 a day. Separate from the domains above.

## What each call costs

- `/v1/check` (1 a domain): Checking 5 domains costs 5.
- `/v1/search` (1 an ending): With no tlds, the 12 popular endings cost 12.
- `/v1/details` (1): One domain.
- `/v1/suggest` (Its own allowance): 1 suggestion request, whatever the count.
- `/v1/prices` (Free): Not counted.
- `/v1/usage` (Free): Not counted.

A call is counted before it runs, so one that would go over the minute's allowance is refused whole rather than answered in part.

## Headers

- `X-RateLimit-Limit` (integer): Domains a minute: 60.
- `X-RateLimit-Remaining` (integer): Left this minute.
- `X-RateLimit-Reset` (unix time): When the minute ends.
- `X-Quota-Remaining` (integer): Left today.
- `Retry-After` (seconds): Only on a 429: how long to wait.

Browsers can read all of them: they are exposed to scripts on other sites.

## Over the limit

A call over the limit gets status 429 with the code `rate_limited` (this minute) or `quota_exceeded` (today), and a `Retry-After` header. Wait that many seconds and try again; retrying sooner is refused the same way.

429:

```
{
    "error": {
        "code": "rate_limited",
        "message": "Slow down: 60 names a minute from one address. Try again in 23 seconds.",
        "docs": "https://domainmcp.net/documentation"
    }
}
```

## The MCP server

Assistants share addresses, so the MCP server paces each MCP session instead: 60 domains a minute and 2,000 a day for every session, with a ceiling for one address of 600 a minute and 20,000 a day. A tool over the limit answers with a plain sentence the assistant can pass on.

## Need more?

Write to [Support](https://domainmcp.net/support) with what you are building and roughly how many domains a day.

---

# Errors

A refusal always comes back in the same shape, with a code to act on and a sentence you can show to a person.

## The shape

Error:

```
{
    "error": {
        "code": "bad_request",
        "message": "Give a name to search for, such as name=brightfield.",
        "docs": "https://domainmcp.net/documentation"
    }
}
```

Act on `code`; show `message` to a person if you like. The HTTP status matches.

## Codes

- `bad_request` (400): Something needed is missing or not usable: no name, a list too long, a body that is not JSON. The message says which.
- `not_found` (404): No such endpoint. The list is at https://api.domainmcp.net/.
- `method_not_allowed` (405): The endpoint does not take that method. The Allow header lists the ones it does.
- `unknown_parameter` (422): A parameter the endpoint does not take, usually a typo. The message lists the ones it does.
- `rate_limited` (429): Over 60 domains this minute. Wait for `Retry-After`.
- `quota_exceeded` (429): Over 2,000 domains today. It resets at 00:00 UTC.
- `server_error` (500): Something went wrong on our side. It is logged and looked at; try again shortly.
- `not_ready` (503): A feature is being switched on. The message says what to use meanwhile.
- `suggest_failed` (503): Name ideas could not be drafted just now. Try again in a minute.

## Skipped inputs

When some of a list can be checked and some cannot, the answer still succeeds. The ones that could not are left out of `data` and listed in `meta.skipped`:

meta.skipped:

```
{
    "skipped": [
        {
            "input": "brightfield",
            "error": "no_ending"
        },
        {
            "input": "brightfield.notreal",
            "error": "unknown_ending"
        }
    ]
}
```

- `invalid_domain` (skipped): Not a domain: characters a domain cannot have, or a part too long.
- `no_ending` (skipped): A name with no ending, such as brightfield. Use /v1/search for a bare name.
- `unknown_ending` (skipped): An ending we cannot check or price.
- `invalid_name` (skipped): A search name a domain cannot have.

## From the MCP server

Tools answer refusals as a tool result marked as an error, with the same plain sentence, so the assistant can tell the person what happened.

---

# Prices and endings

Free domains come with the public price of registering them: the first year, the renewal, the fewest years sold, and whether the first year is on offer.

## The fields

- `first_year` (number): The price of registering it for the first year.
- `renews` (number or null): The price of each year after. Often higher than the first year: compare both before choosing an ending.
- `min_years` (integer): The fewest years it can be registered for. Some endings, such as .ai, start at 2 years.
- `on_offer` (boolean): True when the first year is cheaper than usual.
- `currency` (string): Always USD.

## What the price is

It is the public list price of a standard registration for one year, refreshed every day. It does not include tax, and a registrar may run its own offers on top. Premium names, whose price the registry sets name by name, have `premium: true` and no price here.

## Endings

1,203 endings can be checked, and 571 of them have a price. Country endings with second levels, such as co.uk and com.au, are understood. A search with no endings tries these 12:

- `tlds` (default) Values: `com`, `net`, `org`, `io`, `co`, `ai`, `app`, `dev`, `xyz`, `me`, `info`, `co.uk`.

## Every price

[/v1/prices](https://domainmcp.net/documentation/prices-endpoint) lists every priced ending, cheapest first, or just the ones you ask for. The [Domain prices](https://domainmcp.net/domain-prices) page shows the same list for people.

---

# Buy links

Every free, ordinary-priced domain in an answer has a buy_url: a short link that opens a registrar with that name ready to register.

## What it is

A free name in any answer, from the API, the MCP server or this site, comes with a short link such as `https://buy.domainmcp.net/k7m2xqa?f=api`. Opening it sends the person to a registrar with that name searched and ready to register.

- `k7m2xqa` (the code): Made from the domain itself, so the same domain always has the same link.
- `f` (where from): api, mcp or site: where the link was handed out.

## How it keeps this free

When someone registers a name through the link, the registrar may pay us a commission. The price the person pays is the same as going there directly. That is the only way Domain MCP earns, which is why there are no keys, plans or charges.

## Using it

Show the link next to a free name, as it is. Links do not expire. Premium names have `buy_url: null`, since their price is set name by name.

---

# Changelog

What has changed in the API, the MCP server and these pages. Changes that could break a client are announced here first.

## Changes

- Nov 2026: Documentation: a page for every endpoint, tool and assistant, with manual.md, llms.txt and openapi.json.
- Nov 2026: Name suggestions: describe an idea and get back only names that are free to register.
- Nov 2026: The MCP server and agent skill, with five tools.
- Nov 2026: Domain prices include the renewal price and the fewest years sold for every ending.
- Nov 2026: The REST API, version 1: check, search, details, prices and usage.

## Versions

Everything is version 1, under `/v1/`. New fields can be added to answers at any time, so read the fields you need and ignore the rest. Anything that would break a client comes as `/v2/`, announced here first, with `/v1/` kept running alongside.

---

# API overview

Six GET endpoints on one base address, answering in JSON. No key, no header and no sign-up: call it from a terminal, a server or a web page.

## Base address

- Base: `https://api.domainmcp.net/v1/`

Every call is HTTPS and answers in JSON. Browsers on any site may call it: cross-origin requests are allowed.

## Endpoints

- [GET /v1/check](https://domainmcp.net/documentation/check): Give up to 50 full domains and find out which are free to register.
- [GET /v1/search](https://domainmcp.net/documentation/search): Give one name and get back every ending you ask for.
- [GET /v1/suggest](https://domainmcp.net/documentation/suggest): Describe a business or project in a few words and get back name ideas.
- [GET /v1/details](https://domainmcp.net/documentation/details): Everything known about one domain.
- [GET /v1/prices](https://domainmcp.net/documentation/prices-endpoint): The public price of registering a domain on any ending.
- [GET /v1/usage](https://domainmcp.net/documentation/usage): How much of your allowance is left this minute and today.

## Answers

A success has `data` (a list or one object) and `meta` (count, timing and notes). A refusal has `error` instead. The HTTP status always matches.

Success:

```
{
    "data": [],
    "meta": {
        "count": 0,
        "took_ms": 120
    }
}
```

Refusal:

```
{
    "error": {
        "code": "unknown_parameter",
        "message": "Unknown parameter: tld. This endpoint takes: name, tlds.",
        "docs": "https://domainmcp.net/documentation"
    }
}
```

## Parameters

- `lists` (comma separated): domains=a.com,b.io and tlds=com,io,ai. Spaces around commas are fine.
- `unknown names` (422): A parameter an endpoint does not take is refused rather than ignored, so typos show up at once.
- `POST` (JSON body): /v1/check and /v1/suggest also take POST with a JSON body, for long lists.
- `/v1/whois` (alias): The same as /v1/details.

## Descriptions

[openapi.json](https://domainmcp.net/openapi.json) describes every endpoint for code generators and API tools. [manual.md](https://domainmcp.net/manual.md) is this whole documentation as one Markdown file.

---

# Check domains: GET or POST /v1/check

Give up to 50 full domains and find out which are free to register, with today's domain prices and a buy link for each free one.

`https://api.domainmcp.net/v1/check?domains=brightfield.com,brightfield.io`

MCP tool: `check_domains`. Costs 1 a domain.

## Code

It also takes POST with a JSON body, which suits long lists:

POST /v1/check:

```
curl -X POST "https://api.domainmcp.net/v1/check" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["brightfield.com", "brightfield.io"]}'
```

## Parameters

- `domains` (list, required): Full domains, comma separated, up to 50. `domain=` works for a single one. Endings such as `co.uk` are understood.

## Returns

A domain that cannot be checked (a typo, no ending, an ending we do not know) is left out of data and listed in meta.skipped with the reason.

- `domain` (string): The full domain, in lower case.
- `available` (true, false or null): Null when the answer is not known yet.
- `status` (string): One of three values. Values: `available`, `taken`, `unknown`.
- `confirmed` (boolean): True once the registry has answered. A free answer from DNS alone is confirmed within about a minute.
- `by` (string): Where the answer came from. See Reading a result. Values: `registry`, `registrar`, `dns`, `dns_only`, `confirming`.
- `checked_at` (string): When it was checked, in UTC.
- `premium` (boolean): Free names only. True when the registry sets its own, higher price.
- `price` (object or null): Free names only: `first_year`, renews, `min_years`, `on_offer` and currency. Null for a premium name, or an ending we have no price for.
- `buy_url` (string or null): Free names only: a short link that opens a registrar with the name ready to register. Null for a premium name, or an ending not sold through our links, with a note saying which.
- `registrar` (string or null): Taken names only: who holds it, with registered and expires dates when known.

## Example answer

GET `/v1/check?domains=brightfield.com,brightfield.io`

```json
{
    "data": [
        {
            "domain": "brightfield.com",
            "available": false,
            "status": "taken",
            "confirmed": true,
            "by": "dns",
            "checked_at": "2026-11-11T03:23:10Z",
            "registrar": null,
            "registered": null,
            "expires": null
        },
        {
            "domain": "brightfield.io",
            "available": false,
            "status": "taken",
            "confirmed": true,
            "by": "dns",
            "checked_at": "2026-11-11T03:23:10Z",
            "registrar": null,
            "registered": null,
            "expires": null
        }
    ],
    "meta": {
        "count": 2,
        "took_ms": 0
    }
}
```

## Errors

- `bad_request` (400): No domains, or more than 50.
- `unknown_parameter` (422): A parameter this endpoint does not take, such as domian for domain.
- `rate_limited` (429): Over 60 domains this minute from your address. Wait for the seconds in `Retry-After`.
- `quota_exceeded` (429): Over 2,000 domains today. It resets at 00:00 UTC.

Every error has the same shape. See [Errors](https://domainmcp.net/documentation/errors) for all of them.

---

# Search a name: GET /v1/search

Give one name and get back every ending you ask for, free ones first and cheapest first, each with today's domain prices and a link to register it.

`https://api.domainmcp.net/v1/search?name=brightfield&tlds=com,io,ai`

MCP tool: `search_name`. Costs 1 an ending.

## Code

## Parameters

- `name` (string, required): The name to search, without an ending. Letters, digits and hyphens, up to 63. Spaces are removed, and anything after a dot is dropped.
- `tlds` (list, optional): The endings to try, comma separated, up to 25. Second-level endings such as `co.uk` work. When left out, 12 popular endings are tried. Values: `com`, `net`, `org`, `io`, `co`, `ai`, `app`, `dev`, `xyz`, `me`, `info`, `co.uk`.

## Returns

Free names come first, sorted by first-year price, then unknown ones, then taken ones.

- `domain` (string): The full domain, in lower case.
- `available` (true, false or null): Null when the answer is not known yet.
- `status` (string): One of three values. Values: `available`, `taken`, `unknown`.
- `confirmed` (boolean): True once the registry has answered. A free answer from DNS alone is confirmed within about a minute.
- `by` (string): Where the answer came from. See Reading a result. Values: `registry`, `registrar`, `dns`, `dns_only`, `confirming`.
- `checked_at` (string): When it was checked, in UTC.
- `premium` (boolean): Free names only. True when the registry sets its own, higher price.
- `price` (object or null): Free names only: `first_year`, renews, `min_years`, `on_offer` and currency. Null for a premium name, or an ending we have no price for.
- `buy_url` (string or null): Free names only: a short link that opens a registrar with the name ready to register. Null for a premium name, or an ending not sold through our links, with a note saying which.
- `registrar` (string or null): Taken names only: who holds it, with registered and expires dates when known.

## Example answer

GET `/v1/search?name=brightfield&tlds=com,io,ai`

```json
{
    "data": [
        {
            "domain": "brightfield.com",
            "available": false,
            "status": "taken",
            "confirmed": true,
            "by": "dns",
            "checked_at": "2026-11-11T03:23:10Z",
            "registrar": null,
            "registered": null,
            "expires": null
        },
        {
            "domain": "brightfield.io",
            "available": false,
            "status": "taken",
            "confirmed": true,
            "by": "dns",
            "checked_at": "2026-11-11T03:23:10Z",
            "registrar": null,
            "registered": null,
            "expires": null
        },
        {
            "domain": "brightfield.ai",
            "available": false,
            "status": "taken",
            "confirmed": true,
            "by": "dns",
            "checked_at": "2026-11-11T03:23:10Z",
            "registrar": null,
            "registered": null,
            "expires": null
        }
    ],
    "meta": {
        "count": 3,
        "took_ms": 0
    }
}
```

## Errors

- `bad_request` (400): No name, a name a domain cannot have, or more than 25 endings.
- `unknown_parameter` (422): A parameter this endpoint does not take, such as tld for tlds.
- `rate_limited` (429): Over 60 domains this minute from your address. Wait for the seconds in `Retry-After`.
- `quota_exceeded` (429): Over 2,000 domains today. It resets at 00:00 UTC.

Every error has the same shape. See [Errors](https://domainmcp.net/documentation/errors) for all of them.

---

# Suggest names: GET or POST /v1/suggest

Describe a business or project in a few words and get back name ideas, each one checked and free to register, with a line on why it fits.

`https://api.domainmcp.net/v1/suggest?brief=a+yoga+studio+in+Chiang+Mai&count=2`

MCP tool: `suggest_names`. 4 a minute, 60 a day.

## Code

It also takes POST with a JSON body, which suits long lists:

POST /v1/suggest:

```
curl -X POST "https://api.domainmcp.net/v1/suggest" \
  -H "Content-Type: application/json" \
  -d '{"brief": "a yoga studio in Chiang Mai", "count": 6}'
```

## Parameters

- `brief` (string, required): What the business or project is, in a few words, such as a yoga studio in Chiang Mai.
- `count` (integer, optional): How many names, from 1 to 10. 6 when left out. Fewer can come back when not enough free ones are found.

## Returns

Suggestions take a few seconds, because every idea is checked before it comes back. They have their own allowance and do not use your 60 domains a minute.

- `domain` (string): The full domain.
- `name` (string): The name without its ending.
- `ending` (string): The ending.
- `why` (string): One line on why the name fits the brief.
- `confirmed` (boolean): True once the registry has answered.
- `by` (string): Where the answer came from.
- `price` (object): `first_year`, renews, `min_years`, `on_offer` and currency.
- `buy_url` (string): A short link that opens a registrar with the name ready to register.

## Example answer

GET `/v1/suggest?brief=a+yoga+studio+in+Chiang+Mai&count=2`

```json
{
    "data": [
        {
            "domain": "lanna-still.studio",
            "name": "lanna-still",
            "ending": "studio",
            "why": "A calm identity inspired by Lanna culture and mindful movement.",
            "confirmed": true,
            "by": "registry",
            "price": {
                "first_year": 51.68,
                "renews": 68.68,
                "min_years": 1,
                "on_offer": true,
                "currency": "USD"
            },
            "buy_url": "https://buy.domainmcp.net/2uq5m2e?f=api"
        },
        {
            "domain": "mai-flow.studio",
            "name": "mai-flow",
            "ending": "studio",
            "why": "Combining local identity with the flowing nature of yoga.",
            "confirmed": true,
            "by": "registry",
            "price": {
                "first_year": 51.68,
                "renews": 68.68,
                "min_years": 1,
                "on_offer": true,
                "currency": "USD"
            },
            "buy_url": "https://buy.domainmcp.net/k2d75tt?f=api"
        }
    ],
    "meta": {
        "count": 2,
        "took_ms": 11530,
        "note": "Every name here was free when checked."
    }
}
```

## Errors

- `bad_request` (400): No brief, or one under 3 characters.
- `unknown_parameter` (422): A parameter this endpoint does not take.
- `rate_limited` (429): Over 4 suggestion requests this minute. Wait for the seconds in `Retry-After`.
- `quota_exceeded` (429): Over 60 suggestion requests today. It resets at 00:00 UTC.
- `suggest_failed` (503): Names could not be drafted just now. Try again in a minute.

Every error has the same shape. See [Errors](https://domainmcp.net/documentation/errors) for all of them.

---

# Domain details: GET /v1/details

Everything known about one domain: free or taken, and for a taken one who holds it, when it was registered, when it expires and its nameservers.

`https://api.domainmcp.net/v1/details?domain=example.com`

MCP tool: `domain_details`. Costs 1.

## Code

## Parameters

- `domain` (string, required): One full domain, such as example.com. /v1/whois is the same endpoint.

## Returns

Some registries do not publish the registrar or dates. They come back as null rather than as a guess.

- `domain` (string): The full domain, in lower case.
- `available` (true, false or null): Null when the answer is not known yet.
- `status` (string): One of three values. Values: `available`, `taken`, `unknown`.
- `confirmed` (boolean): True once the registry has answered. A free answer from DNS alone is confirmed within about a minute.
- `by` (string): Where the answer came from. See Reading a result. Values: `registry`, `registrar`, `dns`, `dns_only`, `confirming`.
- `checked_at` (string): When it was checked, in UTC.
- `registrar` (string or null): Taken only: who holds it.
- `registered` (string or null): Taken only: the date it was first registered.
- `expires` (string or null): Taken only: the date it is paid up to.
- `nameservers` (list): Taken only: the nameservers it points to, sorted.
- `price` (object or null): Free only: as in every other answer, with `buy_url`.

## Example answer

GET `/v1/details?domain=example.com`

```json
{
    "data": {
        "domain": "example.com",
        "available": false,
        "status": "taken",
        "confirmed": true,
        "by": "registry",
        "checked_at": "2026-11-11T03:23:12Z",
        "registrar": "RESERVED-Internet Assigned Numbers Authority",
        "registered": "1995-08-14T04:00:00Z",
        "expires": "2027-08-13T04:00:00Z",
        "nameservers": [
            "elliott.ns.cloudflare.com",
            "hera.ns.cloudflare.com"
        ]
    },
    "meta": {
        "took_ms": 1
    }
}
```

## Errors

- `bad_request` (400): No domain, or one that is not a domain.
- `unknown_parameter` (422): A parameter this endpoint does not take.
- `rate_limited` (429): Over 60 domains this minute from your address. Wait for the seconds in `Retry-After`.
- `quota_exceeded` (429): Over 2,000 domains today. It resets at 00:00 UTC.

Every error has the same shape. See [Errors](https://domainmcp.net/documentation/errors) for all of them.

---

# Prices by ending: GET /v1/prices

The public price of registering a domain on any ending: the first year, the renewal, the fewest years sold, and whether the first year is on offer.

`https://api.domainmcp.net/v1/prices?tlds=com,io,ai`

MCP tool: `ending_prices`. Free, not counted.

## Code

## Parameters

- `tlds` (list, optional): The endings you want, comma separated. Every priced ending, cheapest first, when left out.

## Returns

An ending you ask for that has no price is simply not in data. meta.prices_at says when the list was last refreshed.

- `ending` (string): The ending, without a dot.
- `first_year` (number): The price of the first year.
- `renews` (number or null): The price of each year after.
- `min_years` (integer): The fewest years it can be registered for.
- `on_offer` (boolean): True when the first year is cheaper than usual.
- `currency` (string): Always USD.

## Example answer

GET `/v1/prices?tlds=com,io,ai`

```json
{
    "data": [
        {
            "ending": "com",
            "first_year": 16.18,
            "renews": 20.18,
            "min_years": 1,
            "on_offer": true,
            "currency": "USD"
        },
        {
            "ending": "io",
            "first_year": 65.98,
            "renews": 75.98,
            "min_years": 1,
            "on_offer": true,
            "currency": "USD"
        },
        {
            "ending": "ai",
            "first_year": 89.98,
            "renews": 114.98,
            "min_years": 2,
            "on_offer": false,
            "currency": "USD"
        }
    ],
    "meta": {
        "count": 3,
        "prices_at": "2026-11-11T02:53:01Z",
        "took_ms": 0
    }
}
```

## Errors

- `unknown_parameter` (422): A parameter this endpoint does not take, such as tld for tlds.

Every error has the same shape. See [Errors](https://domainmcp.net/documentation/errors) for all of them.

---

# Your usage: GET /v1/usage

How much of your allowance is left this minute and today, without spending any of it.

`https://api.domainmcp.net/v1/usage`

Free, not counted.

## Code

## Parameters

None.

## Returns

Every counted answer also carries the same numbers in its headers, so most clients never need this call.

- `per_minute` (integer): Domains a minute: 60.
- `used_this_minute` (integer): Used so far this minute.
- `remaining_this_minute` (integer): Left this minute.
- `per_day` (integer): Domains a day: 2,000.
- `used_today` (integer): Used so far today (UTC).
- `remaining_today` (integer): Left today.
- `day_resets_at` (string): When the day's count goes back to zero.
- `counted_in` (string): What is counted: domains checked.

## Example answer

GET `/v1/usage`

```json
{
    "data": {
        "per_minute": 60,
        "used_this_minute": 0,
        "remaining_this_minute": 60,
        "per_day": 2000,
        "used_today": 0,
        "remaining_today": 2000,
        "day_resets_at": "2026-11-12T00:00:00Z",
        "counted_in": "domains checked"
    },
    "meta": {
        "took_ms": 0
    }
}
```

## Errors

- `unknown_parameter` (422): This endpoint takes no parameters.

Every error has the same shape. See [Errors](https://domainmcp.net/documentation/errors) for all of them.

---

# MCP server

One address gives any MCP client five domain tools. It needs no key and no sign-in, so it works as a plain custom connector.

- MCP server address: `https://domainmcp.net/mcp`

## Pick your assistant

- [Claude](https://domainmcp.net/documentation/claude)
- [ChatGPT](https://domainmcp.net/documentation/chatgpt)
- [Gemini](https://domainmcp.net/documentation/gemini)
- [Claude Code](https://domainmcp.net/documentation/claude-code)
- [Cursor](https://domainmcp.net/documentation/cursor)
- [VS Code](https://domainmcp.net/documentation/vscode)
- [Windsurf](https://domainmcp.net/documentation/windsurf)

## The server

- `Transport` (streamable HTTP): JSON-RPC over POST to one address. Plain JSON answers; no event stream is needed.
- `Sign-in` (none): No key, no OAuth. Choose no authentication where a client asks.
- `Session` (Mcp-Session-Id): Given on the first answer. Clients send it back, and pacing is counted per session.
- `Tools` (5): `check_domains`, `search_name`, `suggest_names`, `domain_details` and `ending_prices`. All read only.
- `Versions` (protocol): 2025-06-18, 2025-03-26, 2024-11-05.

## Any other client

Most clients take the address and nothing else. One that wants a config file usually takes this shape, with `url`, `serverUrl` or `httpUrl` as the key depending on the client:

mcp.json:

```
{
  "mcpServers": {
    "domainmcp": {
      "url": "https://domainmcp.net/mcp"
    }
  }
}
```

To see it answer without a client, list its tools:

Terminal:

```
curl -X POST "https://domainmcp.net/mcp" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'
```

---

# MCP tools

The five tools the server offers, what each takes, and the kind of question that makes an assistant reach for it.

Every tool is read only and answers with the same fields as its API endpoint, so [Reading a result](https://domainmcp.net/documentation/reading-a-result) applies to both.

## check_domains

Give up to 50 full domains and find out which are free to register, with today's domain prices and a buy link for each free one. The same as [/v1/check](https://domainmcp.net/documentation/check).

- `domains` (list of strings, required): Full domains, up to 50.

- "Is brightfield.com free? What about brightfield.io?"

## search_name

Give one name and get back every ending you ask for, free ones first and cheapest first, each with today's domain prices and a link to register it. The same as [/v1/search](https://domainmcp.net/documentation/search).

- `name` (string, required): The name without an ending.
- `endings` (list of strings, optional): The endings to try. 12 popular ones when left out.

- "Which endings of brightfield are free, and what do they cost?"

## suggest_names

Describe a business or project in a few words and get back name ideas, each one checked and free to register, with a line on why it fits. The same as [/v1/suggest](https://domainmcp.net/documentation/suggest).

- `brief` (string, required): What the business or project is, in a few words.
- `count` (integer, optional): 1 to 10, 6 when left out.

- "Suggest some free names for a yoga studio in Chiang Mai."

## domain_details

Everything known about one domain: free or taken, and for a taken one who holds it, when it was registered, when it expires and its nameservers. The same as [/v1/details](https://domainmcp.net/documentation/details).

- `domain` (string, required): One full domain.

- "Who holds example.com, and when does it expire?"

## ending_prices

The public price of registering a domain on any ending: the first year, the renewal, the fewest years sold, and whether the first year is on offer. The same as [/v1/prices](https://domainmcp.net/documentation/prices-endpoint).

- `endings` (list of strings, optional): The endings you want. Every priced ending when left out.

- "What does a .ai domain cost to register and to renew?"

---

# Agent skill

A single Markdown file that teaches an agent when and how to use Domain MCP: the calls, the answers and the limits.

- Skill: `https://domainmcp.net/skill.md`
- Well-known address: `https://domainmcp.net/.well-known/agent-skills/domainmcp/SKILL.md`
- Index: `https://domainmcp.net/.well-known/agent-skills/index.json`

## What it is

An agent skill is a Markdown file with a short name and description at the top, then plain instructions. An agent that reads it knows when Domain MCP is the right tool, which call to make, and how to read the answer. It needs no install and works with any agent that can make a web request.

## Using it

Agents that look for skills find it at the well-known address on their own. For any other, point it at the file:

- "Read https://domainmcp.net/skill.md and use it to find me a free name for a bakery."

To keep it with your own skills, save the file as `domainmcp/SKILL.md` in your agent's skills folder.

## Skill or MCP?

An assistant that takes connectors, such as Claude or ChatGPT, is best with the [MCP server](https://domainmcp.net/documentation/mcp): the tools appear on their own. The skill suits agents that work through web requests or a terminal.

---

# Add Domain MCP to Claude

Add Domain MCP as a custom connector in Claude on the web or desktop. It takes a minute and needs no key.

- MCP server address: `https://domainmcp.net/mcp`

## Steps

1. Open Connectors. In Claude on the web or the desktop app, open Customize and choose Connectors.
2. Add a custom connector. Select the plus button, then Add custom connector.
3. Paste the address. Name it Domain MCP, paste the address below and select Continue.
4. Choose no sign-in. Domain MCP needs no account, so choose No sign in where Claude asks how people connect, then select Add.
5. Switch it on in a chat. In a chat, select the plus button, then Connectors, and switch Domain MCP on.

## Try asking

- "Is brightfield.com free? If not, which endings are?"
- "Suggest six free names for a yoga studio in Chiang Mai."
- "Who holds example.com, and when does it expire?"
- "What does a .ai domain cost to renew?"

## Good to know

Custom connectors work on Claude's Free, Pro, Max, Team and Enterprise plans; a Free plan has room for one. On Team and Enterprise, an owner adds it once under Organization settings, then Connectors, and each person connects it from Customize.

No key and no sign-in are needed. Each session is paced like the API: 60 domains a minute and 2,000 a day. The [MCP tools](https://domainmcp.net/documentation/mcp-tools) page lists what Claude can do with it.

---

# Add Domain MCP to ChatGPT

Add Domain MCP to ChatGPT as a custom MCP server, then install it and use it in any chat.

- MCP server address: `https://domainmcp.net/mcp`

## Steps

1. Open plugins. In ChatGPT on the web, open chatgpt.com/plugins.
2. Add a custom MCP server. Select the plus button, then Add custom MCP server.
3. Paste the address. Name it Domain MCP and paste the address below as the Server URL.
4. Choose no authentication. Choose No authentication, read the warning and select I understand and want to continue.
5. Create and install. Select Create as a plugin, then install it from your plugins. It is then ready in any chat.

## Try asking

- "Is brightfield.com free? If not, which endings are?"
- "Suggest six free names for a yoga studio in Chiang Mai."
- "Who holds example.com, and when does it expire?"
- "What does a .ai domain cost to renew?"

## Good to know

Custom MCP servers depend on your ChatGPT plan and, in a workspace, on what an admin allows. Some accounts show this under Settings, then Apps and Connectors, with Developer mode switched on in Advanced settings: create a connector there with the same address and no authentication.

No key and no sign-in are needed. Each session is paced like the API: 60 domains a minute and 2,000 a day. The [MCP tools](https://domainmcp.net/documentation/mcp-tools) page lists what ChatGPT can do with it.

---

# Add Domain MCP to Gemini

Add Domain MCP to the Gemini app as a custom app, or to Gemini CLI with one command.

- MCP server address: `https://domainmcp.net/mcp`

## Steps

1. Open connected apps. At gemini.google.com, open Settings, then Connected Apps.
2. Add a custom app. Under Custom apps, choose Add a custom app.
3. Paste the address. Paste the address below and select Next. Once added on the web, it is there in the Gemini mobile app too.
4. Or use Gemini CLI. Run the command below, then type /mcp inside Gemini CLI to see Domain MCP and its five tools.

Gemini CLI:

```
gemini mcp add --transport http domainmcp https://domainmcp.net/mcp
```

Or add it to Gemini CLI's settings file by hand:

~/.gemini/settings.json:

```
{
  "mcpServers": {
    "domainmcp": {
      "httpUrl": "https://domainmcp.net/mcp"
    }
  }
}
```

## Try asking

- "Is brightfield.com free? If not, which endings are?"
- "Suggest six free names for a yoga studio in Chiang Mai."
- "Who holds example.com, and when does it expire?"
- "What does a .ai domain cost to renew?"

## Good to know

Custom apps can be added in the web app only, for now. Add -s user to the CLI command to have it in every project, not just this one.

No key and no sign-in are needed. Each session is paced like the API: 60 domains a minute and 2,000 a day. The [MCP tools](https://domainmcp.net/documentation/mcp-tools) page lists what Gemini can do with it.

---

# Add Domain MCP to Claude Code

One command adds Domain MCP to Claude Code. Then ask about domains while you work.

- MCP server address: `https://domainmcp.net/mcp`

## Steps

1. Run the command. In a terminal, run the command below. Add --scope user to have it in every project.
2. Check it. Inside Claude Code, type /mcp. Domain MCP should be listed as connected with five tools.

Terminal:

```
claude mcp add --transport http domainmcp https://domainmcp.net/mcp
```

## Try asking

- "Is brightfield.com free? If not, which endings are?"
- "Suggest six free names for a yoga studio in Chiang Mai."
- "Who holds example.com, and when does it expire?"
- "What does a .ai domain cost to renew?"

## Good to know

claude mcp list shows every server Claude Code knows, and claude mcp remove domainmcp takes it away again.

No key and no sign-in are needed. Each session is paced like the API: 60 domains a minute and 2,000 a day. The [MCP tools](https://domainmcp.net/documentation/mcp-tools) page lists what Claude Code can do with it.

---

# Add Domain MCP to Cursor

Add Domain MCP to Cursor with a few lines in mcp.json, for one project or for all of them.

- MCP server address: `https://domainmcp.net/mcp`

## Steps

1. Open mcp.json. For every project, open ~/.cursor/mcp.json in your home folder. For one project, use .cursor/mcp.json in its root.
2. Add the server. Add the lines below. If the file already lists servers, add the domainmcp entry beside them.
3. Check it. Save, then find Domain MCP under Customize in the sidebar, where it can be switched on or off.

mcp.json:

```
{
  "mcpServers": {
    "domainmcp": {
      "url": "https://domainmcp.net/mcp"
    }
  }
}
```

## Try asking

- "Is brightfield.com free? If not, which endings are?"
- "Suggest six free names for a yoga studio in Chiang Mai."
- "Who holds example.com, and when does it expire?"
- "What does a .ai domain cost to renew?"

## Good to know

No headers or keys are needed, so the entry is just the address.

No key and no sign-in are needed. Each session is paced like the API: 60 domains a minute and 2,000 a day. The [MCP tools](https://domainmcp.net/documentation/mcp-tools) page lists what Cursor can do with it.

---

# Add Domain MCP to VS Code

Add Domain MCP to VS Code for GitHub Copilot chat, from the Command Palette or with a few lines in mcp.json.

- MCP server address: `https://domainmcp.net/mcp`

## Steps

1. Add a server. Open the Command Palette and run MCP: Add Server.
2. Choose HTTP. Choose HTTP (HTTP or Server-Sent Events) and paste the address below.
3. Name it. Name it domainmcp and choose whether it is for this workspace or for all of them.
4. Use it in chat. In Copilot chat, ask about a domain. Expand the tool call to see the answer from Domain MCP.

.vscode/mcp.json:

```
{
  "servers": {
    "domainmcp": {
      "type": "http",
      "url": "https://domainmcp.net/mcp"
    }
  }
}
```

## Try asking

- "Is brightfield.com free? If not, which endings are?"
- "Suggest six free names for a yoga studio in Chiang Mai."
- "Who holds example.com, and when does it expire?"
- "What does a .ai domain cost to renew?"

## Good to know

VS Code's own file uses servers at the top, not mcpServers. Tools can be switched on and off from Chat: Open Customizations, then Tools.

No key and no sign-in are needed. Each session is paced like the API: 60 domains a minute and 2,000 a day. The [MCP tools](https://domainmcp.net/documentation/mcp-tools) page lists what VS Code can do with it.

---

# Add Domain MCP to Windsurf

Add Domain MCP to Windsurf's Cascade from its MCP config file.

- MCP server address: `https://domainmcp.net/mcp`

## Steps

1. Open the config file. Open Cascade's MCP menu and select Open MCP config file.
2. Add the server. Add the lines below. If the file already lists servers, add the domainmcp entry beside them.
3. Refresh. Save the file and press the refresh button in the MCP menu. Domain MCP shows with five tools.

mcp_config.json:

```
{
  "mcpServers": {
    "domainmcp": {
      "serverUrl": "https://domainmcp.net/mcp"
    }
  }
}
```

## Try asking

- "Is brightfield.com free? If not, which endings are?"
- "Suggest six free names for a yoga studio in Chiang Mai."
- "Who holds example.com, and when does it expire?"
- "What does a .ai domain cost to renew?"

## Good to know

Windsurf uses serverUrl for a remote server. It can also be added from Settings, then Tools, then Add Server.

No key and no sign-in are needed. Each session is paced like the API: 60 domains a minute and 2,000 a day. The [MCP tools](https://domainmcp.net/documentation/mcp-tools) page lists what Windsurf can do with it.
