ELITEDOMAINS MCP Server — 20 tools
The ELITEDOMAINS DADL turns ELITEDOMAINS's API into an MCP server that Claude, GPT or any MCP-compatible agent can consume directly. One YAML file declares all 20 tools — domain, catcher, handle, offer, address, authinfo, and more — and ToolMesh serves them at runtime. No Python boilerplate, no per-endpoint code, no separate MCP server process.
Below: the endpoint coverage matrix, a two-block ToolMesh setup, the full tool reference grouped by ELITEDOMAINS feature area.
Source: ELITEDOMAINS API
Which ELITEDOMAINS endpoints are covered?
100% (20 of ~20 endpoints)
Focus: Beta — REST API not yet stable. ELITEDOMAINS .de domain reseller: domains (register, transfer, AuthInfo, redirector, DNS records, tags), handles (PERSON, ORG, address validation), catcher (RGP backorders, dropdate, max bid), offers (Sedo marketplace, sale pages, visitor stats).
Missing: no standalone DNS-record CRUD (records are managed inline via redirector_settings), no transfer-status polling endpoint, no billing/invoice endpoint (though list_tld_prices covers TLD pricing), no get_domain and no single-handle GET (both list-only) -- and list_domains omits handle_id, so a domain's assigned owner handle cannot be read back; handles cannot be deleted
How do you configure the ELITEDOMAINS DADL?
- Ask ELITEDOMAINS support to enable API access for your account (the API is opt-in and off by default).
- Log in to the dashboard at https://app.elitedomains.de
- Open account settings and go to the API / Personal Access Tokens section.
- Create a new personal access token and copy it immediately (it is shown only once).
- Store it in the ToolMesh credential store under the name 'elitedomains_token'.
Environment variable: CREDENTIAL_ELITEDOMAINS_TOKEN
Personal access tokens are account-scoped (no granular scopes). Append ?sandbox=1 to any request to test without registry writes. Standard rate limit is 100 req/min and 1000 req/day; during droptime (02:00-04:00 UTC) it drops to 10 req/min and catcher add/remove is rejected with HTTP 405. Ordering an AuthInfo2 letter requires an account on monthly invoicing (Sammelrechnung).
How do you install the ELITEDOMAINS MCP server with ToolMesh?
Add to your backends.yaml:
- name: elitedomains
transport: rest
dadl: elitedomains.dadl
url: "https://api.elitedomains.de"
Set the credential:
CREDENTIAL_ELITEDOMAINS_TOKEN=your-token-here What 20 tools does the ELITEDOMAINS DADL expose?
GET list_domains List all domains in the account (paginated). Each row includes `name`, `redirector_settings`, `authinfo`, `auto_expire`, `paid_until`, `expires_at`, `tags` and `created_at`. Domains are keyed by `name` -- use it for every other domain operation. GET check_domain Check a single domain's availability AND its pricing / transfer terms -- the response is far richer than a yes/no. Core fields: `name`, `message` (a.k.a. status) "free" (registrable) or "connect" (registered, transfer-only) -- but also other registry statuses like "transfer_lock", "redemptionPeriod" or "transit" -- plus `tld`. For a registrable/transferable name it additionally returns `action` (e.g. "transfer"), `authinfo_required` (whether an AuthInfo/transfer code is needed), `billing` (e.g. "instant"), `instant_payment_method_available`, `default_period` (months), a `periods` array of { months, price, price_gross } term/price options, the headline `price` / `price_gross` (net/gross EUR) and `tax_rate`. Use it for transfer feasibility and a single domain's price quote; for the full per-TLD price table use list_tld_prices, and for a focused order preview use check_domain_order. GET check_domain_order Preview what ordering a domain via register_domain would do, BEFORE placing it: returns `name`, `status`, `action` ("register" or "transfer"), the available `periods` [{ months, price, price_gross }], the headline `price`/`price_gross` (net / incl. VAT at your `tax_rate`) and `billing` ("instant" = charged to your stored payment method, or "monthly_invoice"), plus `instant_payment_method_available`. For transfers the price is independent of the period (and some TLDs allow no period on transfer -> `periods` empty). check_domain already folds in these same preview fields; this is the focused variant. GET list_tld_prices List the per-year, net (excl. VAT) prices for all registrable TLDs. Each row: `tld`, a `price` object with `reg`/`transfer`/`renew`/`restore` (the price CURRENTLY valid for your account -- may be lower than list due to a promotion or an individually negotiated rate), an `original_price` object with the standard list price, and a `custom` object flagging per-action whether an individual price is configured. A price is null when that action is not offered for the TLD. This IS the account price-list endpoint; for a single domain's quote use check_domain / check_domain_order. POST register_domain Register a new domain OR transfer an existing one into the account. For a TRANSFER, supply `authinfo` (the transfer code from the losing registrar); for a fresh REGISTRATION omit it. `period` is the term in MONTHS (default 12). Optionally set the owner contact via `handle_id` and initial hosting via `redirector_settings` (the redirector can be configured on the transfer request itself). A successful inbound transfer responds { message: "Domain transfer initiated", name, payment: "captured", period } -- but the transfer is NOT yet complete: a gTLD transfer stays pending until the losing registrar ACKs (or ~5 days auto-ACK). While pending, the domain already shows in list_domains with `redirector_settings` set but `expires_at`/`paid_until` still null; poll list_domains and treat a non-null `expires_at` as "transfer done" (there is no transfer-status endpoint). Errors: 400 invalid input, 403 registry rejection, 409 already registered/owned. PATCH update_domain Update an existing domain's settings: change its hosting/redirect via `redirector_settings` and/or reassign the owner contact via `handle_id`. Identify the domain by `name`. Errors: 400 validation, 404 not found. DELETE delete_domain Delete (give up) a domain, or put it into TRANSIT for an outbound transfer. With `transit`=1 the domain is moved to the transit/KK-out state instead of being deleted. A plain delete returns the domain to the registry and is irreversible. Errors: 400 missing name, 403 registry error, 404 not found. POST add_domain_tags Set/replace the internal organizational tags on a domain. Returns the updated `tags` array and a confirmation `message`. Errors: 400 invalid domain, 404 not found. GET get_domain_authinfo Get or generate the outbound AuthInfo (KK / transfer) code for a domain you own -- needed to transfer it to another registrar. Returns { message, name, authinfo, expires_at }. The code is time-limited; note `expires_at` here is German format "DD.MM.YYYY HH:mm:ss" (unlike the ISO 8601 timestamps elsewhere). Errors: 400 missing name, 403 registry error, 404 not found. GET check_domain_authinfo2 Check whether a DENIC AuthInfo2 letter can be ordered for a .de domain. Returns { name, available, message }. AuthInfo2 is the paper-letter fallback used when an AuthInfo1 code is not obtainable. Only relevant for monthly-invoice (Sammelrechnung) accounts. Call this before order_domain_authinfo2. POST order_domain_authinfo2 Order a DENIC AuthInfo2 letter for a .de domain (added to the next collective invoice; confirmation arrives by email). Requires an account on monthly invoicing. Errors: 400 not orderable, 403 account restriction. POST add_domain_to_sedo List a domain for sale on the external Sedo marketplace at a fixed price. `price` is a EUR amount greater than 0. Errors: 400 invalid input, 404 domain not found, 500 processing error. GET list_catcher_orders List all RGP catcher (backorder) orders (paginated). Each row includes `name`, `status`, `users` (number of competing backorderers), `price` (your max bid), `dropdate_at` (expected drop) and `created_at`. GET get_catcher_info Get RGP catcher status for ANY dropping domain (it need not be in your own catcher orders): returns `name`, `status` (e.g. "rgp"), `users` (how many parties are backordering it) and `dropdate_at` (expected drop, format "YYYY-MM-DD HH:mm:ss"). Use it to gauge competition and timing before placing an add_catcher_order. Errors: 400 missing name. POST add_catcher_order Place an RGP catcher (backorder) on a dropping domain. `price` is your MAXIMUM bid in EUR (minimum 2). Requires a valid contact handle on the account. Errors: 400 missing/ invalid domain or missing handle, 405 droptime restriction (02:00-04:00 UTC), 409 already added. DELETE delete_catcher_order Cancel a catcher (backorder) order for a domain. This only removes your backorder; it is reversible by re-adding. Errors: 400 missing name, 404 not found, 405 droptime restriction (02:00-04:00 UTC). GET list_offers List the account's domain offers / sale pages (paginated, richly filterable). Each row includes `name`, `type` (paynow|4sale), `status`, `price`, `template`, `is_internal`, `redirect_status`, `hide_on_marketplace`, `visitors` (last_30_days/last_7_days/referrer_30_days), `template_data` and `tags`. Use the filters to narrow by type, status, price band, traffic and template, and sort with order_by/order_direction. This endpoint returns `total` and `last_page` for paging. GET list_handles List all contact handles in the account (paginated). Each row includes `id`, `alias`, `type` (PERSON|ORG), `handle_name`, address fields (`street_name`, `street_number`, `postalcode`, `city`, `country_id`), `email`, `phone` and `created_at`. Use a handle's `id` as `handle_id` when registering/updating a domain. The country field is `country_id` (ISO 3166-1 numeric string, e.g. "276" for Germany) for both read and write. POST create_handle Create a new contact handle (domain owner/admin contact). `type` is PERSON or ORG. For an ORG handle put the company name in `handle_name` and the responsible individual in `contact_person` (Ansprechpartner) -- `contact_person` is REQUIRED for type=ORG (at least for non-.de domains) and is exactly what a bare company name lacks; PERSON handles omit it. Set `address_suggest` to "keep" to bypass address auto-correction. Returns the full handle object including the assigned `id`. NOTE: there is no delete_handle -- handles cannot be removed via the API, so avoid throwaway/test handles. Errors: 400 validation (see `error.<field>` for the offending fields), 500 unknown error. PATCH update_handle Update an existing contact handle by numeric id. Any subset of the writable fields may be supplied. (`type` cannot be changed after creation.) For ORG handles the same `contact_person` (Ansprechpartner) rule as create_handle applies. Returns the updated handle object. Errors: 400 validation (see `error.<field>`), 404 handle not found.