Install
openclaw skills install @tashfeenahmed/agentdomainsGet and manage a free public domain (yourname.makes.fyi or yourname.agentdomains.co) for an AI agent or app using the AgentDomains CLI. Use this whenever an agent builds a website or API and needs somewhere to put it, or needs a public hostname to expose a server, create a webhook URL, or get a stable address. Covers signup, claiming a name, pointing it at an IP or CNAME, getting HTTPS, forwarding (HTTP redirect) to an existing site, reverse-proxying the name to a backend over HTTPS, delegating to your own nameservers, removing a single DNS record, and closing the account again.
openclaw skills install @tashfeenahmed/agentdomainsAgentDomains hands out real, public domains from a single CLI command. Names live
under two domains: makes.fyi (the default) and agentdomains.co, so you can
claim yourname.makes.fyi or yourname.agentdomains.co. No web forms. Signing up
needs nothing at all; the account's first name needs an email address, used only
for the confirmation link. Full docs: https://docs.agentdomains.co
Reach for AgentDomains when you need a public hostname and don't have one:
If the user already has a domain they control, prefer that. AgentDomains is for the "I just need a hostname, fast and free" case.
Ensure the CLI is installed, then create an account. The bundled helper does both:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/setup.sh"
Or manually:
go install github.com/tashfeenahmed/AgentDomains/cmd/agentdomains@latest
agentdomains signup # saves an API key to ~/.agentdomains/config.json
signup creates an anonymous provisional account and asks for nothing — no
email, no form. One account can hold up to ten names at once. The first time
you register a name you must pass --email, or the API answers
400 registering a name needs an email: we
send a confirmation link and start a 30-day clock. A human confirms the link to
make the account (and all its names) permanent — otherwise the account and every
name on it are deleted automatically after 30 days.
agentdomains email you@example.com # (re)send the confirmation link any time
Always pass --json so you can parse results reliably.
# register a name and point it at an IP in one step (first claim needs --email)
agentdomains claim mybot --email you@example.com --type A --content 203.0.113.10 --json
# -> response includes a "note": tell the user to confirm within 30 days or it's deleted
# after the first claim the email is remembered on the account, so it's optional:
agentdomains claim mybot2 --type CNAME --content my-app.vercel.app --json
# claim under agentdomains.co instead of the default makes.fyi
agentdomains claim mybot --domain agentdomains.co --type A --content 203.0.113.10 --json
# inspect / manage (add --domain to scope when a label exists under both)
agentdomains list --json
agentdomains get mybot --json
agentdomains record mybot --type A --content 203.0.113.10 --host www --json
agentdomains unrecord mybot <record-id> --json # drop ONE record, keep the name
agentdomains delete mybot --json
Names are claimed under makes.fyi by default; pass --domain agentdomains.co to
use the other one. Parse the fqdn field from claim/get to learn the live
hostname, e.g. mybot.makes.fyi.
AgentDomains handles DNS, so you bring your own certificate:
certbot certonly --standalone -d mybot.makes.fyi.agentdomains txt mybot "<token>" --host _acme-challenge --json.Send a name to any URL with a real HTTP redirect, served at Cloudflare's edge
with valid HTTPS. forward claims the label first if you don't own it, so it's
one step:
agentdomains forward mysite https://destination.example.com --json
# mysite.makes.fyi -> 302 redirect to https://destination.example.com
# 301 permanent instead of the default 302 temporary:
agentdomains forward mysite https://dest.com --permanent --json
# always land on the target root (don't carry the request path/query):
agentdomains forward mysite https://dest.com --no-preserve-path --json
# remove a forward (keeps the label):
agentdomains unforward mysite --json
Path and query are preserved by default.
A forward takes the hostname over. Any A/AAAA/CNAME sitting on the label
itself is deleted as part of the call and listed back in replaced_records, so
you never have to clear the way first — claiming with a record and then
forwarding is a perfectly good sequence. Records on a sub-label
(www.mysite.makes.fyi) are different hostnames and survive, and TXT records are
left alone. Going the other way is still refused: while a forward is in place,
adding an address record to the same label answers a 409 telling you to
unforward first.
Serve a backend you run elsewhere at the name, over HTTPS, with our edge
certificate — nothing to set up on the backend, and the name stays in the
address bar (unlike a forward, which redirects away). proxy claims the label
first if you don't own it:
agentdomains proxy shop myapp.fly.dev --json
# shop.makes.fyi serves https://myapp.fly.dev over our cert, at shop.makes.fyi
# remove the proxy (keeps the label):
agentdomains unproxy shop --json
We terminate HTTPS at the edge and fetch the backend by its own hostname, so it
accepts the request without a certificate for the AgentDomains name. Like a
forward, a proxy replaces the label's own A/AAAA/CNAME records and
reports them as replaced_records; a proxy and a forward remain mutually
exclusive, so unforward before proxying a forwarded label.
Caveat: the proxy serves the backend but can't rewrite hostnames the app hardcodes. Apps that bake their own domain into OAuth/SSO redirects (e.g. a Keycloak login) may bounce users to the backend's native hostname mid-login until the AgentDomains name is added in the app's own settings. Static sites and apps using relative URLs work with no setup.
To control the whole subtree yourself:
agentdomains ns mybot ns1.yourdns.com ns2.yourdns.com --json
The CLI reads credentials from the environment, so no interactive setup is needed:
export AGENTDOMAINS_API_KEY=adom_... # reuse an existing key
export AGENTDOMAINS_API_URL=https://api.agentdomains.co
You can also call the HTTP API directly; see https://docs.agentdomains.co#api.
Everything above is also available as typed MCP tools, if your client speaks MCP and you would rather not shell out. Seventeen tools covering the same operations: availability, signup, claiming, records, ACME challenges, forwarding, proxying, delegation, and closing the account.
https://mcp.agentdomains.co (Streamable HTTP). Nothing to install.
claude mcp add --transport http agentdomains https://mcp.agentdomains.co --header "Authorization: Bearer adom_…"npx -y agentdomains-mcp (npm package agentdomains-mcp, stdio), reading
AGENTDOMAINS_API_KEY or falling back to the CLI's ~/.agentdomains/config.json.The same adom_… API key works for the CLI, the MCP server, and the HTTP API — there is
nothing separate to provision. Pick whichever interface fits; they are not alternatives to
choose between permanently. Reference: https://docs.agentdomains.co/#mcp
api, www) are reserved.MyApp gives you myapp.makes.fyi, and
that lowercase label is what every later command (get, record, delete) expects.agentdomains unrecord <label> <record-id> --json removes a
single record and keeps the name. Record ids come from get (and from the claim /
record responses).claim once you have fixed the record. Re-claiming a name you already hold is
not a failure: the CLI prints "you already own …" and exits 0, and the API answers
409 {"owned":true}.agentdomains account delete --json deletes the account and
invalidates its API key. It refuses while names are still held and lists them; add
--force to delete those names along with it. There is no undo — the names go back
into the pool for anyone to claim.503 with retry:true
(an outage — come back in a moment) or retry:false (a misconfiguration on our side;
retrying is pointless, report it instead).delete what you don't.