AgentDomains MCP server
AgentDomains MCP server lets an MCP agent get and manage free hostnames under makes.fyi or agentdomains.co, including DNS, HTTPS, forwarding, and reverse proxying.
Check if a subdomain label is available.
Sign up for an account and receive a one-time API key.
Inspect account state, email verification, quota, and usage.
Attach and verify an email address.
Claim subdomains, optionally with an initial A/AAAA/CNAME/TXT record.
List all owned subdomains or get full details for one.
Delete a subdomain and all attached records, forwards, and proxies.
Add DNS records (A, AAAA, CNAME, TXT).
Publish Let's Encrypt DNS-01 ACME challenge TXT records.
Set or remove HTTP redirects (forwarding) with options like permanent, path preservation, and cloaking.
Set or remove reverse proxying through the edge with TLS termination.
Delegate a subdomain to your own nameservers.
Connect via stdio (
npx -y agentdomains-mcp) or remote Streamable HTTP.
Adds DNS TXT records for Let's Encrypt DNS-01 challenges, enabling domain-validated certificate issuance via an ACME client.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AgentDomains MCP server Claim subdomain my-agent.makes.fyi and proxy it to http://localhost:3000"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AgentDomains MCP server
MCP server for AgentDomains — free domains for the websites and
APIs AI agents build. It gives any MCP-speaking agent a real hostname under makes.fyi or
agentdomains.co, with DNS records, HTTPS, URL forwarding, and reverse proxying.
Two ways to run it: locally over stdio via npx, or against the hosted remote endpoint at
https://mcp.agentdomains.co.
Install (stdio)
No install step — npx fetches it on demand:
AGENTDOMAINS_API_KEY=adom_… npx -y agentdomains-mcpClaude Code
claude mcp add agentdomains --env AGENTDOMAINS_API_KEY=adom_… -- npx -y agentdomains-mcpClaude Desktop and other config-file clients
Add to claude_desktop_config.json (or your client's equivalent):
{
"mcpServers": {
"agentdomains": {
"command": "npx",
"args": ["-y", "agentdomains-mcp"],
"env": { "AGENTDOMAINS_API_KEY": "adom_…" }
}
}
}Related MCP server: AgentDomain
Remote endpoint
https://mcp.agentdomains.coStreamable HTTP; send JSON-RPC over POST with your key in the Authorization header:
curl -s https://mcp.agentdomains.co \
-H 'Authorization: Bearer adom_…' \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'In Claude Code: claude mcp add --transport http agentdomains https://mcp.agentdomains.co --header "Authorization: Bearer adom_…"
Configuration
Variable | Purpose |
| Your API key ( |
| Override the API base URL. Defaults to |
If you already use the Go CLI, its
~/.agentdomains/config.json is picked up automatically and no env var is needed.
No key yet? Call the signup tool — it needs no credentials and returns one. The key is
shown once and is never retrievable, so store it immediately. Accounts are provisional:
attach an email with attach_email and confirm it within 30 days or the account and its
domains are deleted.
The API key is never logged, printed, or included in any tool output.
Tools
Tool | Endpoint | Description |
|
| Is a label free? No key required. |
|
| Create an account, get an API key (shown once). No key required. |
|
| Account state, email, quota, usage. |
|
| Attach an email and send its verification link. |
|
| Register |
|
| List every name on the account. |
|
| One name, its records, forward/proxy state. |
|
| Destructive — permanently delete a name and its records. |
|
| Add an A, AAAA, CNAME, or TXT record. |
|
| Destructive — remove one record, keeping the name. Ids come from |
|
| TXT at |
|
| Redirect the name to a URL; replaces the address records on it. |
|
| Stop forwarding. |
|
| Serve a backend through the edge, with TLS terminated for you; replaces the address records on it. |
|
| Stop proxying. |
|
| Delegate the name to your own nameservers. |
|
| Destructive — close the account and kill its key; refuses while names are held unless |
|
| A Stripe checkout link for Pro (100 names, $5/month or $48/year). Charges nothing; a human opens the link and pays. |
|
| A Stripe billing-portal link for a Pro account (card, invoices, interval, cancel). |
Every label-scoped tool takes an optional domain (makes.fyi, the default, or
agentdomains.co).
Setting a forward or a proxy takes the hostname over. The A/AAAA/CNAME records
on the label itself are deleted in the same call and handed back as replaced_records,
so tell the user what moved. Sub-label records (www.myapp.makes.fyi) and TXT records
are left alone, and if the forward fails to come up the replaced records are restored
with new ids.
A claim and its first record stand or fall together. If claim_domain is given a
record it cannot create, nothing is claimed — fix the record and call again. Re-claiming
a name the account already holds answers 409 with owned:true, which means carry on.
On HTTPS
"Get me SSL" is not one operation here. Two honest paths:
set_proxy— the edge terminates TLS with its own certificate and proxies to your backend. Nothing to install on the origin.add_acme_challenge— publishes the DNS-01 TXT record so your own ACME client can issue a Let's Encrypt certificate (needed for wildcards or hosts with no public port 80). A plain public web server can just use HTTP-01 and needs no DNS record at all.
Compatibility
Any MCP client works. Verified shapes for the common ones:
Claude Code —
claude mcp add(stdio or--transport http), as above.Claude Desktop —
mcpServersblock inclaude_desktop_config.json.OpenAI Agents SDK —
MCPServerStdio(params={"command": "npx", "args": ["-y", "agentdomains-mcp"]}), orMCPServerStreamableHttpagainst the remote URL.LangChain / LangGraph —
langchain-mcp-adapters:MultiServerMCPClient({"agentdomains": {"command": "npx", "args": ["-y", "agentdomains-mcp"], "transport": "stdio"}}).CrewAI —
MCPServerAdapterwith the same stdio parameters.Anything else — point your client at
npx -y agentdomains-mcpover stdio, or athttps://mcp.agentdomains.coover Streamable HTTP.
Development
npm install
npm run build # tsc -> dist/
npm run smoke # boots dist/index.js, runs initialize + tools/list over stdioRequires Node 18+. The only runtime dependency is @modelcontextprotocol/sdk.
Related
CLI (Go) — the
agentdomainscommandAgent skill — Claude Code plugin
License
FSL-1.1-Apache-2.0 — see LICENSE. Same terms as the CLI.
MCP Registry listing
This server is listed in the official MCP Registry
as io.github.tashfeenahmed/agentdomains-mcp — the index PulseMCP, Glama and other
agent-tool directories read from. The metadata is server.json in this repo.
Publishing is manual (GitHub Actions is not running on this account). On each npm
release, bump version in server.json and its packages[0].version to match
package.json, publish to npm first, then:
# once: install the publisher (macOS/Linux)
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
./mcp-publisher login github # device-code flow as the tashfeenahmed GitHub account
./mcp-publisher publish # uploads server.json
curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=io.github.tashfeenahmed/agentdomains-mcp"The registry checks that the npm package's mcpName matches name in server.json,
so the npm version named in server.json must already be published.
docs/publish-mcp-registry.yml is an optional GitHub Actions workflow that does the same
on a v* tag via GitHub OIDC. It only runs if moved to .github/workflows/ and Actions
is available on the account.
Available Tools
15 toolsadd_acme_challengeAInspect
Publish a Let's Encrypt DNS-01 challenge: creates a TXT record at _acme-challenge.. with the token your ACME client printed. Use this to get a certificate without exposing port 80 (for example for a wildcard cert, or a host behind NAT). DNS propagates within seconds, then tell your ACME client to continue. For a normal public web server, HTTP-01 validation needs no DNS record at all.
Inputs: label (required), value (required), domain.
add_dns_recordAInspect
Add a DNS record to a subdomain you already own. Use type A or AAAA to point at an IP address, CNAME to point at another hostname, or TXT for verification strings. Adding a record does not replace existing ones. Note: there is no API for deleting an individual record — delete_domain removes them all.
Inputs: type (required), label (required), content (required), host, +1 more.
attach_emailAInspect
Attach an email address to the account and send it a verification link. A human must click that link within 30 days or the provisional account and its domains are deleted. Use this right after signup.
Inputs: email (required).
check_availabilityAInspect
Check whether a subdomain label is free before claiming it. Requires no API key. Returns { label, domain, fqdn, available, reason } where reason is 'available', 'taken', or 'invalid' (with a 'detail' explaining why the label is not usable).
Inputs: label (required), domain.
claim_domainAInspect
Register a subdomain (label.makes.fyi or label.agentdomains.co) on this account, optionally creating its first DNS record in the same call. An email is required the first time an account registers a name — pass 'email' here or call attach_email first; the name is reaped if that email is not confirmed within 30 days. Returns the fqdn and, when a record was requested, the created record.
Inputs: label (required), host, type, email, +2 more.
delegate_nameserversAInspect
Delegate the subdomain to your own nameservers, handing you full control of it and everything beneath it (your own records, MX, deeper sub-domains). AgentDomains stops answering for the name, so its existing records, forwards, and proxies no longer apply. Supply at least two nameservers.
Inputs: label (required), nameservers (required), domain.
delete_domainAInspect
DESTRUCTIVE AND IRREVERSIBLE: permanently delete a subdomain and every DNS record, forward, and proxy attached to it. The hostname stops resolving immediately and the label is released for anyone else to claim. There is no undo and no recovery. Only call this when the user has explicitly asked for this specific name to be deleted.
Inputs: label (required), domain.
get_domainAInspect
Show one subdomain in full: its fqdn, DNS records, forward or proxy configuration, and delegation state.
Inputs: label (required), domain.
list_domainsAInspect
List every subdomain on this account, with each one's DNS records and whether it is forwarding, proxying, or delegated to external nameservers.
Inputs: no named parameters.
remove_forwardAInspect
Stop forwarding a subdomain. The name itself stays registered on the account; only the redirect is removed.
Inputs: label (required), domain.
remove_proxyAInspect
Stop reverse-proxying a subdomain, so the edge no longer serves the backend or terminates TLS for it. The name stays registered on the account.
Inputs: label (required), domain.
set_forwardAInspect
Forward (HTTP-redirect) a subdomain to another URL. Claims the label first if you do not own it yet, in which case an email may be required exactly as for claim_domain. Defaults to a 302 temporary redirect that preserves the request path and query. HTTPS at the edge is handled for you.
Inputs: label (required), target (required), cloak, email, +3 more.
set_proxyAInspect
Serve a backend at this subdomain through the AgentDomains edge, which terminates TLS with its own certificate — this is how you get working HTTPS on an origin that has no certificate of its own (a bare IP-less PaaS host, a tunnel, an internal box). Unlike a forward, the URL stays on your domain and the response is proxied, not redirected. Claims the label first if needed. Caveat: apps that hardcode their own hostname (OAuth callbacks especially) may need your new hostname registered on their side.
Inputs: label (required), origin (required), email, domain.
signupAInspect
Create a new AgentDomains account and get an API key. Requires no existing key. IMPORTANT: the returned api_key is shown ONCE and is never retrievable again — you must store it immediately (save it to ~/.agentdomains/config.json or set AGENTDOMAINS_API_KEY) or the account is lost. The account is provisional: attach and confirm an email within 30 days (see the attach_email tool) or it is deleted along with its domains. This endpoint is rate-limited per IP address.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 15 tools
Each tool maps to a distinct resource and action: account creation, identity, attaching email, claiming domains, listing/reading/deleting domains, adding DNS records, managing forwards/proxies, and delegating nameservers. Even closely related tools like set_forward/set_proxy and add_dns_record/add_acme_challenge are clearly separated by their target behavior and edge cases.
Most tools follow a clear verb_noun pattern such as claim_domain, list_domains, add_dns_record, set_forward, and delegate_nameservers, with a strong convention of remove_* for destructive/simple removal operations. The exceptions are signup and whoami, which are shorter conventional names rather than verb_noun pairs; these are understandable but slightly inconsistent with the rest of the set.
Fifteen tools is at the upper edge of a well-scoped server, but each tool covers a meaningful operation in the domain lifecycle: account, claim, DNS, forwarding, proxying, and delegation. The count feels appropriate for the breadth of the product rather than inflated with redundant helpers.
The core domain lifecycle is well covered: check, signup, attach email, claim, list, get, delete, and configure DNS/forward/proxy behavior. However, there is no way to delete or update an individual DNS record—add_dns_record and add_acme_challenge only add records, and the only fallback is the destructive delete_domain tool. There is also no explicit undelegate operation, so some workflows leave agents stranded once a record is added or nameservers are delegated.
Related MCP Connectors
Custom domains for SaaS and AI agents: search, register, connect DNS, and issue HTTPS over MCP.
Agent-native website builder: create, edit, and host websites via MCP
Create, publish and track sales funnels and Sites with custom domains from any MCP agent.
Add, check, diagnose and remove your SaaS customers' custom domains from any MCP client.
Related MCP Servers
- AlicenseBqualityDmaintenancedomain-suite-mcp is an MCP server that gives AI agents full autonomous control over the domain lifecycle. From checking availability and registering domains to managing DNS records, SSL certificates, and email authentication across Porkbun, Namecheap, GoDaddy, and Cloudflare through a unified set of 21 tools.2118 npm24MIT
- AlicenseAqualityDmaintenanceAgentDomain MCP allows AI agents to register, buy, and manage internet domains via the Model Context Protocol. Features include domain search, availability check, purchase, DNS record management, and wallet operations.13104 PyPI3MIT
- AlicenseAqualityBmaintenanceOfficial Porkbun MCP server, maintained by Porkbun. Check availability and pricing, register, renew and transfer domains, and manage DNS, nameservers, URL forwarding, glue, DNSSEC, DNS restore points, static hosting, webhooks and Cloudflare-connected domains. Hosted at mcp.porkbun.com/mcp with Porkbun sign-in (no API key), or run locally with npx @porkbunllc/mcp-server. Docs: porkbun.com/mcp1543,021 npm36MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for domainagent.dev, enabling AI agents to search, register, deploy, host, and manage domains with USDC payment on Base via x402. Supports static site deployment via Cloudflare Pages and DNS management.7 npmMIT