agent-tracking

Agent Tracking

Was KI-Agenten auf deiner Site tun

Sieh erkannte Assistenten-Referrals und unterstützte Browser-WebMCP-Aktionen. Optionale Origin-Logs und Site-Serverbelege ergänzen getrennte Crawler- und Abschlussnachweise. Das Snippet setzt keine Cookies.

Anmelden oder Konto anlegenDemo-Seite ansehen

Einbauen

Lege deine Site im Dashboard an und setze diese Zeile auf jede Seite. Die Domain in data-domain muss die registrierte sein; Ereignisse für jede andere Domain werden an der Tür verworfen.

<script defer data-domain="example.com" src="https://agenttracking.co/agent.js"></script>

Unter fünf Kilobyte, reines JavaScript, kein Framework, keine Abhängigkeiten. Es schickt kleine Pakete per sendBeacon an /api/event, deshalb kommt auch ein Klick an, der die Seite verlässt. Das Script hat absichtlich keinen Integrity-Hash: es wird an Ort und Stelle aktualisiert, wenn ein neuer Agent in der Liste unten auftaucht.

Drei Ebenen

A. KI-Referrals

Ein Besucher kommt von einem Assistenten: der Referrer wird gegen eine gepflegte Liste von Assistenten-Hosts abgeglichen, dazu utm_source-Muster. Erfasst als Assistent und Einstiegspfad.

B. KI-Abrufe

Ein Assistent lädt eine Seite und führt ihre Scripts aus: der User-Agent der Anfrage, die das Beacon trägt, wird gegen dieselbe Liste abgeglichen. Der Abgleich passiert auf unserem Server aus den Request-Headern, nicht im Snippet, damit die Liste an einem versionierten Ort bleibt und das Snippet klein.

C. WebMCP-Tool-Aufrufe

Das Snippet beobachtet unterstützte document.modelContext- und ältere navigator.modelContext-Aufrufe, während es aktiv ist. Es erfasst technische Ausgänge, Dauer und bereinigte Fehlerklassen. Deklarative Formulare erzeugen Submit-Versuche. Remote-MCP-Aufrufe brauchen den getrennten Serveradapter.

Was das nicht sehen kann

Ein Crawler ohne JavaScript führt das Snippet nie aus. GPTBot, ClaudeBot und ihresgleichen holen meist rohes HTML und erscheinen hier nur, wenn sie die Seite rendern. Sie zu zählen braucht das Server-Log. Für agenttracking.co selbst läuft der Collector alle 15 Minuten. Ein Abruf-Burst bedeutet mindestens drei verschiedene relevante Pfade nahe beieinander in einem Import-Batch; er verrät weder Suchfrage noch Absicht. Für deine Site lädst du ein vollständiges Append-only-Log hoch oder verwendest einen Collector mit stabilen Datensatzidentitäten. Wo ein Anbieter IP-Bereiche veröffentlicht, wird ein Agenten-Claim dagegen geprüft. Fehlende oder veraltete Listen und Abweichungen bleiben getrennt von bestätigten Zahlen.

Tools und Ziele

An der Registrierung deiner Tools ändert sich nichts. Registriere sie, wie die Spezifikation es vorsieht, und das Snippet sieht sie:

await document.modelContext.registerTool({
  name: "search_products",
  description: "Durchsucht den Katalog per Freitext.",
  inputSchema: { type: "object", properties: { query: { type: "string" } }, required: ["query"] },
  annotations: { readOnlyHint: true },
  execute: async ({ query }, { signal }) => { /* ... */ },
});
// agent.js beobachtet unterstützte Registrierungen und Aufrufe, während es aktiv ist:
// technischen Ausgang, Dauer und bereinigte Fehlerklasse; Argumentwerte werden nicht gespeichert.

Deklarative Tools sind Formulare mit einem toolname. Setze data-agent-goal, um einen Browser-Zielversuch zu markieren. Eine bestätigte Anfrage oder Buchung braucht einen getrennten Serverbeleg:

<form toolname="book_table" tooldescription="Reserviert einen Tisch für Datum und Personenzahl."
      action="/book" method="post">
  <input name="date" type="date" required>
  <input name="guests" type="number" min="1" required>
  <button type="submit" data-agent-goal="table_booked">Reservieren</button>
</form>

Wenn du ein Manifest unter /.well-known/webmcp veröffentlichst, hasht das Snippet es einmal pro Besuch auf der Einstiegsseite. Das Dashboard zeigt, wann es sich zuletzt geändert hat; Pro-Konten können benachrichtigt werden.

Was erfasst wird und was nicht

ErfasstNie erfasst
Seitenpfad ohne Query-StringQuery-Strings, Fragmente, Formularwerte
Referrer-Host und utm_source, wenn sie einen Assistenten benennenVollständige Referrer-URLs
Beobachteter Tool-Name, Dauer, technischer Ausgang und bereinigte FehlerklasseEingabewerte, Ausgabewerte
Eine Sitzungskennung: täglicher Zufalls-Salt, deine Domain, eine grobe Browserklasse und die Adresse, gehashtDie Adresse selbst, Cookies, Speicher, Fingerprints, jede dauerhafte Kennung
Erkannter Quellen-Claim und Nachweisstatus (Listen-Version 2026-09-25)Vollständige User-Agent-Strings

Rohdaten werden 90 Tage aufbewahrt und dann gelöscht; Tagessummen bleiben, solange die Site besteht. Alles liegt auf unserem eigenen Server in Deutschland. Site entfernen löscht alles. Die Datenschutzerklärung hat die formale Fassung, und der Auftragsverarbeitungsvertrag wird geschlossen, wenn du eine Site anlegst.

Pläne

In der Pilotphase ist jedes Konto auf Free, bezahlte Pläne sind noch nicht offen. Brauchst du während der Pilotphase mehr? Schreib an hi@finalmaster.net, wir stellen dein Konto von Hand um. Die Produktseite hat die Bedingungen der Pilotphase.

PlanSitesAgenten-Ereignisse pro MonatVerlaufExtras
Free110.00030 Tagekeine
Pro5500.000365 TageManifest-Änderungsalarm
Agencyunbegrenzt5.000.000365 TageManifest-Änderungsalarm, White-Label-Badge

Preise stehen im Dashboard beim Checkout. Free braucht keine Karte.

Deine Zahlen in deinen eigenen Werkzeugen

Aggregierte Site-Statistiken gibt es als JSON und über ein MCP-Lesetool für berechtigte Scripts und Agenten. Erzeuge das Token auf der Einstellungsseite einer Site; es wird einmal gezeigt und gehört zum Konto. Es liest eigene und ausdrücklich freigegebene Sites, keine Rohereignisse.

curl -s https://agenttracking.co/api/stats/example.com?days=30 \
  -H "Authorization: Bearer wmt_dein_token"

Dasselbe Token schickt dein Server-Log. Vollständige Append-only-Dateien kannst du erneut senden. Für Rotation oder überlappende Chunks brauchst du stabile Header für Quelle, Dateigeneration und Datensatzposition. Bereits angenommene Positionen werden übersprungen:

curl -sS -X POST https://agenttracking.co/api/logs/example.com \
  -H "Authorization: Bearer wmt_dein_token" \
  -H "Content-Type: text/plain" --data-binary @/var/log/nginx/access.log

GET /api/stats mit demselben Header listet die Sites, die das Token lesen darf. days ist auf den Verlauf des Plans gedeckelt. Die Antwort enthält Summen, die Vorperiode für Trends, die Tagesreihe, die Agenten mit Anteil und Trend, die Tools mit Erfolgsquote und mittlerer Dauer und die meistbesuchten Seiten.

Über MCP trägst du unseren Server mit dem Token als Header ein und fragst in Worten. Claude Desktop, Cursor und die meisten Clients nehmen eine Konfiguration wie diese:

{
  "mcpServers": {
    "agent-tracking": {
      "url": "https://agenttracking.co/api/mcp",
      "headers": { "Authorization": "Bearer wmt_dein_token" }
    }
  }
}

Dann: „Welche Agenten haben example.com diese Woche gelesen?“ Der Client ruft get_agent_stats auf und bekommt dasselbe JSON. Ein Client, der keine Header setzen kann, übergibt das Token stattdessen im Argument token des Tools.

ChatGPT-Plugin und MCP-Server mit AgentTracking verbinden

Die Integration läuft in deinem Node.js-/TypeScript-MCP-Server. Das Website-Snippet allein erfasst keine externen MCP-Aufrufe. Du kannst schon vor der Veröffentlichung mit einem privat verbundenen Plugin testen.

Was kommt in die Plugin-ZIP?

Der Tracking-Wrapper gehört in das Serverprojekt, das deine MCP-Adresse bedient. In plugin.json trägst du keine Tracking-Tokens ein. Für diese Integration bleiben MCP-Adresse und Tool-Beschreibungen gleich; die ZIP braucht keine Tracking-Konfiguration. Änderungen an Manifest oder angebotenen Tools sind separat zu behandeln.

1. Zwei Schreibzugänge erstellen

Melde dich an, öffne deine Site → Einstellungen → Server-Integrationen. Erstelle einen Schreibzugang für Tool-Telemetrie und einen für bestätigte Abschlüsse. Das Stats-Lesetoken funktioniert hier nicht. Die Site-Domain muss später mit domain im Code übereinstimmen. Zum Arbeitsbereich

2. Wrapper herunterladen und Server konfigurieren

TypeScript-Wrapper herunterladen und als lib/agenttracking-mcp.ts in deinem Serverprojekt speichern. Er benötigt Node.js mit fetch und node:crypto; im Vercel Edge Runtime läuft er nicht.

In Vercel: Projekt → Settings → Environment Variables. Hinterlege diese Werte für die gewünschte Deployment-Umgebung, dann deploye erneut. Bei anderen Hosts verwendest du deren Server-Umgebungsvariablen. Nutze keine NEXT_PUBLIC_-Variablen.

VariableWert
TRACKING_TOOL_TOKENSchreibzugang für Tool-Telemetrie
TRACKING_OUTCOME_TOKENSchreibzugang für bestätigte Abschlüsse
TRACKING_ENVIRONMENTtest / production
import { MCPTracking } from "./lib/agenttracking-mcp";

const tracking = new MCPTracking({
  origin: "https://agenttracking.co",
  domain: "example.com", // your registered domain
  toolToken: process.env.TRACKING_TOOL_TOKEN!,
  outcomeToken: process.env.TRACKING_OUTCOME_TOKEN!,
  pluginVersion: "1.0.2",
  environment: process.env.TRACKING_ENVIRONMENT === "production"
    ? "production" : "test",
});

3. Bestehende Tool-Handler umschließen

Das folgende Beispiel verwendet die MCP-Servermethode registerTool. calculateDescriptor, pdfDescriptor und die Handler stehen für deinen vorhandenen Code; createAndSavePdf musst du an deinen PDF-Speicher anbinden. Gib weiterhin das Ergebnisformat zurück, das dein Plugin bereits erwartet.

// Keep the existing descriptor and business logic.
server.registerTool("calculate_quote", calculateDescriptor,
  tracking.wrap("calculate_quote", calculateQuoteHandler)
);

server.registerTool("create_quote_pdf", pdfDescriptor,
  tracking.wrap("create_quote_pdf", async (args, extra, context) => {
    // Save context.invocationId with the PDF in your backend.
    const pdf = await createAndSavePdf(args, context);
    const delivered = await tracking.outcome({
      ...context,
      receiptId: "created_" + context.invocationId,
      kind: "pdf_created",
      occurredAt: Date.now(),
    });
    // If false, retry a durably stored copy of this same receipt.
    return { structuredContent: { downloadUrl: pdf.downloadUrl } };
  })
);

Der Wrapper erfasst Toolname, Laufzeit, Version und technische Ausgänge, einschließlich isError: true. Er sendet keine Argumente, Antworten, Kundennamen oder PDF-URLs. Tracking-Ausfälle lassen Tool-Ergebnisse und Fehler bestehen; pro Versand wartet er standardmäßig höchstens 800 ms. Belege sollten für zuverlässige Wiederholungen zusammen mit dem Geschäftsvorgang gespeichert werden.

4. PDF-Auslieferung bestätigen

Speichere die invocationId aus dem Erstellungsaufruf privat beim PDF. Nach einer erfolgreichen vollständigen GET-Auslieferung sendest du einen zweiten Beleg. HEAD-Anfragen, fehlgeschlagene und teilweise Übertragungen zählen nicht als vollständige Auslieferung. Wiederhole bei Netzfehlern exakt dieselbe Beleg-ID und denselben Zeitpunkt.

// After your backend confirms a successful full GET delivery:
await tracking.outcome({
  invocationId: pdf.trackingInvocationId,
  receiptId: storedDelivery.id, // opaque ID, 16–64 characters
  kind: "pdf_fetched",
  occurredAt: storedDelivery.deliveredAt, // milliseconds, unchanged on retry
});

Ein PDF-Abruf bestätigt die Auslieferung, nicht das Lesen: Auch automatische Vorabrufe können Downloads auslösen. Für Anfragen und Buchungen gibt es inquiry_created und booking_created. Eine gemeinsame Gesprächskennung allein beweist keinen zusammenhängenden Ablauf.

5. Privat testen und kontrollieren

  1. Setze TRACKING_ENVIRONMENT auf test und deploye den MCP-Server.
  2. Rufe dein privat verbundenes Plugin auf: Angebot berechnen, PDF erstellen, PDF abrufen.
  3. Öffne deine Site → Tools → Testdaten. Prüfe Aufrufe, Version, Laufzeit, PDF erstellt und PDF abgerufen. Teste auch einen kontrollierten Tool-Fehler.
  4. Für echte Nutzung setze die Produktionsumgebung explizit auf production und deploye erneut. Eigene Demo- und Review-Läufe weiter als test markieren.

6. Abläufe, Warnungen und Versionen untersuchen

Unter Tools siehst du die letzten 50 MCP-Aufrufe. Öffnen zeigt den technischen Ausgang und bis zu 100 Ergebnisbelege, die exakt zur Site, Umgebung und Aufruf-ID passen. Fehlende Ergebnisbelege bleiben unbekannt. Ereigniszeit und Empfangszeit werden getrennt angezeigt.

Dashboard-Warnungen erscheinen ab 20 Aufrufen, mindestens 3 Fehlern/Timeouts und einer Fehlerquote von mindestens 10 %, oder ab 20 gemessenen Laufzeiten mit p95 ≥ 5.000 ms. Produktionswarnungen erscheinen auch in Insights. Es wird keine E-Mail oder externe Nachricht versendet.

Im Versionsvergleich wählst du ein Tool sowie zwei bekannte Versionen. Beide Spalten verwenden dieselbe Umgebung und denselben Empfangszeitraum. Stichproben, unbekannte Ausgänge und Laufzeitabdeckung sind sichtbar; ein Unterschied beweist keine kausale Verbesserung. Ergebniszahlen zählen Aufrufe mit bestätigtem Beleg, nicht Nutzer oder eine Conversion-Rate.

Keine Daten? Prüfe Domain, die beiden Token-Zwecke und das neue Deployment. Argumentfehler liefern HTTP 400, ungültige Tokens HTTP 401. Fehlende Ergebnisbelege bedeuten unbekannt, nicht automatisch einen verlorenen Kunden. Testdaten verbrauchen ebenfalls Ereigniskontingent.

Anfragen und Buchungen serverseitig bestätigen

Erstelle in den Site-Einstellungen getrennte Schreibzugänge für Abschlüsse und Remote-MCP-Aufrufe. Bewahre sie nur auf deinem Server auf. Nach erfolgreichem Speichern einer Anfrage sende einen stabilen Beleg an /api/outcomes/example.com mit Authorization: Bearer atw_.... Das Stats-Lesetoken kann hier nicht schreiben.

{"receiptId":"receipt_1234567890123","kind":"inquiry_created","status":"confirmed","occurredAt":1790337600000,"taskId":"task_1234567890123456"}

Vergib pro echter Anfrage eine neue Beleg-ID und wiederhole bei Netzfehlern dieselbe ID. Wiederholungen liefern duplicate, geänderte Nutzdaten zur selben ID HTTP 409. Sende keine Kontakt-, Zahlungs- oder Bestellinhalte. Task- und Invocation-ID verknüpfen Beobachtungen, belegen aber keinen Akteur.

Für externe MCP-Server nutze den separaten Zugang und /api/server-tools/example.com mit Invocation-ID, optionaler Task-ID, Toolname, Zeitpunkt, technischem Ausgang und Akteurstyp. Ein Agentenakteur ist eine Aussage deines Servers, keine unabhängige Verifikation. Das Browser-Snippet sieht nicht jeden externen MCP-Aufruf. Das ausführbare TypeScript-Beispiel liegt im Repository unter examples/inquiry-app.

Private Aufgabentests, Korrekturen und Kundenberichte

Die öffentliche Statistik zeigt ausgewählte Tagessummen aus 30 Tagen. Im geschützten Bereich sehen Eigentümer und berechtigte Leser den Quellenstatus und den Arbeitsablauf. Eigentümer können einen deterministischen Chrome-Anfragetest auf einem test.- oder staging.-Host ausführen. Synthetische Eingaben und Ergebnisse bleiben von Produktionszählern getrennt; ein Test mit einem fremden Modellagenten ist ohne Adapter nicht eingerichtet.

Eine dokumentierte Korrektur verknüpft einen fehlgeschlagenen Lauf mit einem späteren Lauf derselben Aufgabe, einschließlich Versionen, Stichprobe und unbekannter Ausgänge. Befunde können versionierte Diagnose-Rezepte referenzieren; diese bleiben Vorschläge, bis ein echter Nachtest den konkreten Fall bestätigt. Druckbarer Site-Bericht und JSON-Export zeigen Abdeckung, Befunde, Korrekturen, Nachtests und offene Punkte.

Eigentümer können einen siebentägigen, an eine E-Mail-Adresse gebundenen Leselink erstellen; das Produkt versendet dafür keine Einladung. Leser sehen nur freigegebene Sites, und ein Widerruf beendet den Zugriff auf private Berichte und Exporte. Öffentliche Statistiklinks zeigen keine internen Befunde, Testläufe oder Serverbelege. Die Verträge für Aufgabentests und den Agenturablauf stehen im offenen Repository.

Die Agenten auf der Liste

Version 2026-09-25. Referrer: ChatGPT, Perplexity, Claude, Microsoft Copilot, Google Gemini, You.com, Mistral Le Chat, Meta AI, Grok, DeepSeek, Phind, DuckDuckGo AI, Poe, HuggingChat. User-Agents: ChatGPT-User, OAI-SearchBot, GPTBot, ClaudeBot, Claude-User, Claude-SearchBot, Claude-Web, anthropic-ai, PerplexityBot, Perplexity-User, Gemini Deep Research, Bytespider, Amazonbot, Meta-ExternalAgent, Meta-ExternalFetcher, DuckAssistBot, YouBot, MistralAI-User, cohere-ai, AI2Bot, img2dataset, iAskBot, Browser Use. Fehlt einer? Schreib an hi@finalmaster.net, oder öffne einen Pull Request gegen lib/tracking/ai-sources.json.