MCP-Server für Domains: Tools, Token und PHP-Client

Aktualisiert: 5 Min. Lesezeit Redaktion The PHP Experts
Kurz gesagt

Ein MCP-Server für Domains stellt KI-Assistenten wie Claude oder ChatGPT Werkzeuge bereit, um Verfügbarkeit, Preise und Registry-Daten abzufragen. betadomain betreibt einen unter https://betadomain.de/api/mcp mit fünf offenen Lese-Tools und drei Tools für eigene Domains und Bestellungen, die einen Bearer-Token brauchen. Der Kauf endet immer in einem menschlichen Checkout.

Seit KI-Assistenten Werkzeuge aufrufen können, kommt eine neue Art Anfrage bei Registraren an: nicht mehr der Mensch, der fünf Namen in ein Suchfeld tippt, sondern ein Agent, der für ihn zwanzig Varianten prüft. Das Model Context Protocol (MCP) ist der Standard, über den das läuft. Ein MCP-Server für Domains übersetzt dabei die Fragen des Modells in echte Registry-Abfragen.

Was ein MCP-Server für Domains leistet

MCP ist ein offenes Protokoll, ursprünglich von Anthropic vorgestellt, über das ein KI-Client Werkzeuge eines Servers entdeckt und aufruft. Technisch ist es JSON-RPC 2.0. Beim Transport „Streamable HTTP“ schickt der Client POST-Requests an eine einzige URL. Die wichtigsten Methoden heißen initialize, tools/list und tools/call.

Für Domains bedeutet das: Statt dass ein Modell Preise aus dem Gedächtnis rät, ruft es domain_check auf und bekommt den aktuellen Stand. Statt zu behaupten, eine Domain sei frei, kann es nachsehen. Das ist der eigentliche Gewinn, weniger Komfort als weniger Halluzination.

Die Tools des betadomain-MCP-Servers

Der Server läuft unter https://betadomain.de/api/mcp. Eine Server Card mit allen Fähigkeiten liegt unter /.well-known/mcp.json, die Übersicht für Menschen auf der Seite für Entwickler und KI-Agenten.

ToolZweckTokenLimit je IP
domain_checkVerfügbarkeit und Jahrespreise einer Domainnein30/min, 300/6 h
domain_searchName über acht beliebte Endungennein30/min, 300/6 h
whois_lookupStatus, Daten, Nameserver, Registrar (ohne Personendaten)nein15/min, 150/6 h
list_tldsEndungen mit Preisen, filterbarnein30/min, 300/6 h
tld_pricePreise einer einzelnen Endungnein30/min, 300/6 h
list_my_domainseigene Domains mit Ablauf und Auto-Verlängerungjazusätzlich 20/min je Token
start_orderBestellung vorbereiten, liefert Checkout-Linkjazusätzlich 20/min je Token
get_order_statusStatus einer eigenen Bestellungjazusätzlich 20/min je Token

whois_lookup ist strenger begrenzt, weil es externe Registry-Server abfragt. Die Logik dahinter entspricht dem, was der Beitrag zu RDAP in PHP Schritt für Schritt zeigt, inklusive Sonderfall .de.

MCP-Server in Claude einbinden

In Claude öffnest du Einstellungen, dann Connectors, und fügst einen Custom Connector mit der URL https://betadomain.de/api/mcp hinzu. Danach kannst du Fragen stellen wie „Welche Endungen sind für meinprojekt noch frei, und was kostet die Verlängerung?“. Claude wählt domain_search und antwortet mit echten Daten. Bei ChatGPT geht das analog, sofern dein Plan Custom Connectors oder den Developer Mode anbietet.

Für die Konto-Tools erzeugst du im Kundenportal unter /account/profile einen persönlichen Zugriffstoken. Er beginnt mit bdk_live_, wird genau einmal angezeigt und serverseitig nur als SHA-256-Hash gespeichert. Pro Konto sind bis zu 20 aktive Token möglich, jeder lässt sich einzeln widerrufen.

MCP-Tools direkt aus PHP aufrufen

Du brauchst keinen KI-Client, um die Tools zu nutzen. Weil der Server JSON-RPC über HTTP spricht, genügt cURL. Die folgende Klasse habe ich gegen den Live-Server getestet:

<?php
declare(strict_types=1);

final class McpClient
{
    private int $id = 0;

    public function __construct(
        private string $endpoint = 'https://betadomain.de/api/mcp',
        private ?string $token = null,
    ) {}

    public function call(string $method, array $params = []): array
    {
        $payload = ['jsonrpc' => '2.0', 'id' => ++$this->id, 'method' => $method];
        if ($params !== []) {
            $payload['params'] = $params;
        }
        $headers = ['Content-Type: application/json', 'Accept: application/json, text/event-stream'];
        if ($this->token !== null) {
            $headers[] = 'Authorization: Bearer ' . $this->token;
        }

        $ch = curl_init($this->endpoint);
        curl_setopt_array($ch, [
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => json_encode($payload, JSON_THROW_ON_ERROR),
            CURLOPT_HTTPHEADER     => $headers,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 15,
        ]);
        $body   = curl_exec($ch);
        $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
        if ($body === false) {
            throw new RuntimeException(curl_error($ch));
        }
        if ($status === 401) {
            throw new RuntimeException('Token fehlt oder ist ungültig (HTTP 401)');
        }

        $response = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
        if (isset($response['error'])) {
            throw new RuntimeException($response['error']['message'], $response['error']['code']);
        }
        return $response['result'];
    }

    public function tool(string $name, array $arguments = []): array
    {
        $result = $this->call('tools/call', ['name' => $name, 'arguments' => $arguments]);
        if ($result['isError'] ?? false) {
            throw new RuntimeException($result['content'][0]['text'] ?? 'Tool-Fehler');
        }
        // structuredContent ist bequemer, content[0].text ist der Fallback
        return $result['structuredContent'] ?? json_decode($result['content'][0]['text'], true, 512, JSON_THROW_ON_ERROR);
    }
}

$mcp = new McpClient();
foreach ($mcp->call('tools/list')['tools'] as $t) {
    echo $t['name'], "\n";
}
print_r($mcp->tool('domain_check', ['domain' => 'thephpexperts-beispiel-4711.dev']));

tools/list gab beim Test die acht Tools aus der Tabelle zurück. domain_check lieferte ein Array mit domain, tld, available und den drei Preisfeldern registerEur, transferEur und renewEur. Für .dev sind das aktuell 22,99 € pro Jahr, in allen drei Feldern derselbe Wert.

Ruft man list_my_domains ohne Token auf, antwortet der Server nicht mit einem JSON-RPC-Fehler im Body, sondern mit HTTP 401 und einem WWW-Authenticate-Header, der auf /.well-known/oauth-protected-resource verweist. So können MCP-Clients selbst herausfinden, wie sie sich anmelden. Deshalb prüft der Client oben den Statuscode vor dem JSON.

Grenzen: kein Kauf ohne Mensch

start_order nimmt eine Liste von Positionen wie {"domain": "meinefirma.de", "type": "register"} an, bei Transfers zusätzlich den Auth-Code. Der Server prüft Verfügbarkeit und Preis selbst, übernimmt nie Werte aus der Anfrage und gibt eine payment_url zurück. Bezahlt wird über Stripe im Browser, bei manchen Endungen folgt eine Identitätsprüfung. Fehlen Käuferdaten, kommt ein ehrlicher Hinweis not_ready_for_payment statt eines halb angelegten Auftrags.

Das ist Absicht. Ein Agent, der nach einem Missverständnis zwanzig Domains auf deine Kreditkarte registriert, ist ein Szenario, das niemand debuggen möchte. Wer vollautomatische Registrierungen braucht, ist bei einem Prepaid-Modell einer Registrar-API besser aufgehoben; der Vergleich der Domain-APIs ordnet die Optionen ein.

Auch das Modell selbst kann Fehler machen, etwa Umlaute falsch übergeben. Der Server wandelt IDN intern um, für eigene Skripte lohnt trotzdem ein Blick auf Punycode in PHP.

Einen eigenen MCP-Server in PHP bauen?

Wenn du eigene Daten, etwa die Domains deiner Kunden, an Claude anbinden willst, brauchst du einen eigenen Server. Das offizielle PHP-SDK heißt mcp/sdk und ist auf Packagist verfügbar. Für einen kleinen, zustandslosen Server reicht auch ein Endpunkt, der JSON-RPC-Requests auf ein paar Funktionen verteilt; das Protokoll ist überschaubar, solange du nicht streamen musst.

Am schnellsten lernst du MCP aber, indem du einen fertigen Server benutzt. Verbinde Claude mit betadomain, frag nach einem Namen und sieh dir an, welche Tools es aufruft. Die Antworten kannst du mit der öffentlichen Domain-Suche gegenprüfen, und die Infoseite zu .ai-Domains zeigt, warum KI-Projekte für eine .ai aktuell 203,99 € im Jahr einplanen sollten.

Schritt für Schritt

  1. Connector in Claude anlegenIn Claude unter Einstellungen, Connectors einen Custom Connector hinzufügen und https://betadomain.de/api/mcp als URL eintragen.
  2. Lese-Tools ausprobierenEine Frage wie „Ist meinefirma.de bei betadomain frei?“ stellen. Die Lese-Tools brauchen keinen Token.
  3. Token erstellenIm Kundenportal unter /account/profile im Abschnitt MCP-/API-Zugriff einen Token erzeugen. Er beginnt mit bdk_live_ und wird nur einmal angezeigt.
  4. Token hinterlegenDen Token als Bearer-Token am Connector speichern, also als Header Authorization: Bearer <token>.

Domain gefunden? Prüfen und registrieren kannst du sie direkt bei Domains mit festem Jahrespreis – Jahrespreis ab 2,99 €.

Häufige Fragen

Brauche ich für den MCP-Server einen Account?

Für die Lese-Tools nicht: domain_check, domain_search, whois_lookup, list_tlds und tld_price funktionieren ohne Anmeldung, begrenzt pro IP. Für list_my_domains, start_order und get_order_status brauchst du einen persönlichen Zugriffstoken aus dem Kundenportal.

Kann Claude über MCP selbstständig eine Domain kaufen?

Nein. start_order prüft Verfügbarkeit und Preis auf dem Server und gibt einen Stripe-Checkout-Link zurück. Zahlung und eine eventuell nötige Identitätsprüfung erledigst du selbst, es wird nichts automatisch belastet.

Muss ich vor tools/call immer initialize senden?

Die MCP-Spezifikation sieht den Handshake vor, und Clients wie Claude machen ihn automatisch. Der betadomain-Server arbeitet zustandslos und beantwortet tools/call auch ohne vorheriges initialize. Für eigene Skripte ist das bequem, sauberer ist trotzdem der Handshake.

Gibt es ein PHP-SDK für MCP?

Ja, mcp/sdk ist das offizielle PHP-SDK des Model-Context-Protocol-Projekts und auf Packagist verfügbar. Für einen reinen Client gegen einen HTTP-Server reichen aber cURL und json_encode, wie in diesem Beitrag gezeigt.