loading…
Search for a command to run...
loading…
Enables checking domain availability, WHOIS lookup, domain registration, and bio syncing through the Headless Domains API.
Enables checking domain availability, WHOIS lookup, domain registration, and bio syncing through the Headless Domains API.
Official Model Context Protocol (MCP) server for Headless Domains. This server exposes Headless Domains API operations to MCP-compatible clients such as Claude Desktop, Cursor, and Windsurf.
search_domain: check whether a domain is availablelookup_whois: inspect a registered identityregister_domain: register a domain with an API keysync_bio: sync agent/profile bio content with an API keystdio for local MCP clientssse when PORT is present for hosted deploymentspython3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
| Variable | Required | Default | Purpose |
|---|---|---|---|
HEADLESSDOMAINS_API_KEY |
No | unset | Sends X-API-Key for authenticated endpoints |
HEADLESSDOMAINS_API_BASE_URL |
No | https://headlessdomains.com/api/v1 |
Overrides the API base URL |
HEADLESSDOMAINS_TIMEOUT |
No | 20 |
HTTP timeout in seconds |
HEADLESSDOMAINS_REGISTER_PATH |
No | /domains/register |
Override register endpoint path if the API changes |
HEADLESSDOMAINS_SYNC_BIO_PATH |
No | /domains/{domain}/bio |
Override sync-bio endpoint path if the API changes |
MCP_TRANSPORT |
No | auto | Force a transport such as stdio or sse |
HOST |
No | 0.0.0.0 |
Bind host for SSE mode |
PORT |
No | unset | When present, starts the server in sse mode |
For a local MCP client, the server uses stdio by default:
python server.py
You can also run it through the MCP CLI:
mcp run server.py
Add a server entry to claude_desktop_config.json:
{
"mcpServers": {
"headlessdomains": {
"command": "mcp",
"args": [
"run",
"/absolute/path/to/headlessdomains-mcp/server.py"
],
"env": {
"HEADLESSDOMAINS_API_KEY": "your-api-key-here"
}
}
}
}
If you do not need authenticated tools yet, you can omit HEADLESSDOMAINS_API_KEY.
When PORT is present, server.py starts an SSE transport automatically:
PORT=8080 python server.py
Typical Railway-style launch:
HOST=0.0.0.0 PORT=8080 python server.py
register_domainHEADLESSDOMAINS_API_KEYdomain, namespace, years, agreed_to_terms (true), and payment_method ("gems")extra_payload_json for API fields not hard-coded into the toolExample:
{
"domain": "myagent.agent",
"years": 1,
"extra_payload_json": "{\"owner_email\":\"[email protected]\"}"
}
sync_bioHEADLESSDOMAINS_API_KEY/domains/<domain>/bio endpointdomain, bio, and bio_markdownextra_payload_json for any additional API fields (like name, x, github, etc.)Example:
{
"domain": "myagent.agent",
"bio_markdown": "# About Me",
"extra_payload_json": "{\"name\":\"My Agent Name\", \"x\":\"twitter_handle\"}"
}
Build:
docker build -t headlessdomains-mcp .
Run:
docker run --rm -p 8080:8080 \
-e PORT=8080 \
-e HEADLESSDOMAINS_API_KEY=your-api-key-here \
headlessdomains-mcp
After installing dependencies:
python -m py_compile server.py
python - <<'PY'
import server
print(server.search_domain("example.agent"))
print(server.lookup_whois("test.agent"))
PY
/temp-specs is ignored in .gitignore so local planning docs stay out of version control.Add this to claude_desktop_config.json and restart Claude Desktop.
{
"mcpServers": {
"headless-domains-mcp-server": {
"command": "npx",
"args": []
}
}
}