Headless Domains MCP Server
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.
Features
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 key- Automatic transport selection:
stdiofor local MCP clientsssewhenPORTis present for hosted deployments
Requirements
- Python 3.10+
- Optional: a Headless Domains API key for authenticated tools
Local Setup
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Environment Variables
| 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 |
Run Locally
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
Claude Desktop Configuration
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.
Hosted SSE Mode
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
Tool Notes
register_domain
- Requires
HEADLESSDOMAINS_API_KEY - Sends a base payload containing
domain,namespace,years,agreed_to_terms(true), andpayment_method("gems") - Accepts
extra_payload_jsonfor API fields not hard-coded into the tool
Example:
{
"domain": "myagent.agent",
"years": 1,
"extra_payload_json": "{\"owner_email\":\"me@example.com\"}"
}
sync_bio
- Requires
HEADLESSDOMAINS_API_KEY - Syncs to the
/domains/<domain>/bioendpoint - Sends
domain,bio, andbio_markdown - Accepts
extra_payload_jsonfor any additional API fields (likename,x,github, etc.)
Example:
{
"domain": "myagent.agent",
"bio_markdown": "# About Me",
"extra_payload_json": "{\"name\":\"My Agent Name\", \"x\":\"twitter_handle\"}"
}
Docker
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
Smoke Testing
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
Notes
/temp-specsis ignored in.gitignoreso local planning docs stay out of version control.