Dokumentation
So richten Sie Privatrak ein, benennen, was Ihnen wichtig ist, und lesen jeden Bericht.
MCP-Referenz
Alles, was Entwickler über den MCP-Server von Privatrak wissen müssen: die Adresse, Anmeldung und API-Schlüssel, alle Tools und Prompts und wie Änderungen gebündelt werden, damit sie sich in einem Schritt rückgängig machen lassen. Um einen Assistenten zu verbinden, beginnen Sie mit KI-Assistenten verbinden.
Endpunkt und Transport
- URL:
https://api.privatrak.com/mcp. Eine Adresse gilt für alle Ihre Projekte. Eine per Anmeldung hergestellte Verbindung kann mehrere Projekte umfassen, ein API-Schlüssel genau eines. - Transport: Streamable HTTP. Der Server akzeptiert jede Protokollversion von
2024-11-05bis2026-07-28. Senden Sie jede Nachricht alsPOSTmitContent-Type: application/jsonundAccept: application/json, text/event-stream. Fehlt einer der beiden Typen inAccept, antwortet der Server mit400. Antworten kommen als einfaches JSON zurück. - Zustandslos: Der Server hält zwischen Anfragen nichts fest und vergibt keine
Mcp-Session-Id, jede Anfrage steht also für sich.GETundDELETEauf/mcpantworten mit405, weil es keinen Stream zu öffnen oder zu schließen gibt. - CORS:
/mcperlaubt jede Herkunft, ohne Cookies oder andere Zugangsdaten des Browsers, und unter anderem die Anfrage-HeaderAuthorization,X-API-Key,Mcp-Protocol-VersionundMcp-Session-Id.WWW-Authenticateist freigegeben, damit browserbasierte Clients wie MCP Inspector den OAuth-Ablauf starten können.
Authentifizierung
/mcp akzeptiert zwei Arten von Zugangsdaten: ein OAuth-Access-Token, das bei der Anmeldung eines Nutzers ausgestellt wird, oder einen der API-Schlüssel eines Projekts. Beide senden Sie als Authorization: Bearer TOKEN.
OAuth
- Ablauf: OAuth 2.1 Authorization Code mit PKCE, nur
S256. Clients sind öffentlich (token_endpoint_auth_method: none). Es gibt kein Client Secret und keinen Implicit-, Password- oder Client-Credentials-Grant. - Erkennung: Jede
401von/mcpnennt inWWW-Authenticatedie Protected Resource Metadata (RFC 9728) unterhttps://api.privatrak.com/.well-known/oauth-protected-resource/mcp. Sie verweisen auf den Authorization Server, dessen Metadaten (RFC 8414) unter/.well-known/oauth-authorization-serverliegen. Die Endpunkte sind/oauth/authorize,/oauth/token,/oauth/registerund/oauth/revoke. - Client-Registrierung: über ein Client ID Metadata Document, also eine
client_idmithttps-URL, unter der die Metadaten des Clients liegen, oder über Dynamic Client Registration (RFC 7591) unter/oauth/register. Claude nutzt das erste, Cursor und Codex das zweite. - Scopes:
readundwrite, wobeiwritereadeinschließt. Eine Anfrage ohne Scope erhältread.offline_accesswird akzeptiert und ändert nichts, weil jede Verbindung ein Refresh-Token erhält. - Zustimmung: Die Person wählt die Projekte, entweder Alle meine Projekte (auch später angelegte oder beigetretene) oder Nur diese, und den Zugriff, Lesen oder Lesen und schreiben. Lesen und schreiben wird angeboten, wenn der Client
writeangefragt hat. Was die Person dabei sieht, steht unter KI-Assistenten verbinden. - Tokens: Access-Tokens gelten 1 Stunde und sind an die Ressource
https://api.privatrak.com/mcpgebunden (RFC 8707). Die REST-API akzeptiert sie deshalb nicht. Refresh-Tokens rotieren bei jeder Verwendung und verfallen nach 30 Tagen ohne Verwendung. - Zugriff:
readerhält dieselben Tools wie ein KI-Assistenten-Schlüssel.writeergänzt die schreibenden Tools, die Tools für Setup-Läufe und den Promptsetup_project, also dieselben Schreibrechte wie ein Schlüssel mit vollem Zugriff. - Widerruf: Die Person trennt einen Client unter Einstellungen › Konto › Verbundene KI-Apps. Dessen Tokens enden damit sofort. Ein Client kann seine eigenen Tokens unter
/oauth/revokewiderrufen (RFC 7009).
API-Schlüssel
Senden Sie einen der API-Schlüssel eines Projekts als Authorization: Bearer YOUR_KEY oder X-API-Key: YOUR_KEY. Beide Header mit unterschiedlichen Schlüsseln ergeben 401. Ein Schlüssel gehört zu einem Projekt, und was er darf, hängt von seiner Art ab:
- Ihr KI-Assistent (Typ
read): alle lesenden Tools, der Promptproduct_reviewund die Anleitung. Er kann nichts ändern und sieht weder Mitglieder noch Abrechnung noch andere Schlüssel. - Voller Zugriff (Typ
secret): zusätzlich alle schreibenden Tools, die Tools für Setup-Läufe und der Promptsetup_project. - Ihre Website (Typ
public): abgelehnt, weil er im Quelltext Ihrer Seite steht, wo ihn jeder lesen kann.
Diese Anfragen bekommen 401: ohne Zugangsdaten, mit unbekannten, abgelaufenen oder widerrufenen Zugangsdaten oder mit einem Website-Schlüssel. Die Antwort enthält WWW-Authenticate: Bearer realm="privatrak" und die resource_metadata-URL, dazu error="invalid_token", wenn Zugangsdaten mitgeschickt wurden. Im JSON-Body sagt error, was nicht stimmte, und error_code lautet auth_invalid_token. Lassen sich die Zugangsdaten nicht prüfen, weil der Dienst kurz nicht erreichbar ist, lautet die Antwort 503, und ein erneuter Versuch ist unbedenklich.
Projekte
Jedes Tool und jeder Prompt, der sich auf ein Projekt bezieht, nimmt ein optionales Argument project entgegen, eine Projekt-ID aus list_projects. Der Server merkt sich zwischen zwei Aufrufen kein aktuelles Projekt.
- Eine Verbindung mit nur einem Projekt kann es weglassen, ebenso jeder API-Schlüssel. Ein API-Schlüssel lehnt jedes Projekt außer seinem eigenen ab.
- Umfasst eine Verbindung mehr als ein Projekt, ist ein Aufruf ohne
projectein Tool-Fehler, der die Projekte auflistet. Der Assistent fragt dann nach, statt zu raten. Die Mitgliedschaft im Projekt wird bei jedem Aufruf geprüft. list_projectsliefert für jedes Projekt ID, Name, Zeitzone und Zugriff. Für einen API-Schlüssel nennt es dessen einziges Projekt.
Anfragelimit
Jeder API-Schlüssel und jede Verbindung darf 60 Anfragen am Stück senden, aufgefüllt mit einer Anfrage alle zwei Sekunden. Darüber hinaus antwortet der Server mit 429, Retry-After: 2 und dem error_code mcp_rate_limited. Jede Anfrage zählt, auch tools/list.
Datenkonventionen
- Datumsangaben sind Kalendertage im Format
YYYY-MM-DDin der Zeitzone des Projekts, dieget_projectliefert. Zeitstempel in Antworten sind UTC. - Standardzeitraum: die letzten 28 vollständigen Tage bis gestern. Jede Antwort nennt in
periodden Zeitraum, den sie verwendet hat. Eintoin der Zukunft wird bei heute abgeschnitten und mitclamped_to_todaymarkiert, einfromnach heute ist ein Fehler. - Abdeckung: Ein Zeitraum, der beginnt, bevor das Projekt vollständige Daten hat, ist mit
starts_before_dataunddata_frommarkiert, und gegen ihn wird keine prozentuale Veränderung berechnet. Wochen und Monate, die nur einen Teil ihrer Spanne abdecken, sind mitpartialmarkiert. - Zählungen:
unique_sessionssind Besucher, die pro Tag einmal gezählt werden. Über einen längeren Zeitraum kann dieselbe Person also an mehreren Tagen gezählt werden. Die Zahlen vonlist_elements,preview_feature_ruleundpreview_funnelsind Events, keine Besucher. Die Zahlen vonlist_click_problemssind Seitenaufrufe: Jedes Problem zählt pro Element und Seitenaufruf einmal. - Zeitraumgrenze: Diese drei Tools lesen rohe Events und akzeptieren höchstens 92 Tage pro Aufruf, ebenso
list_click_problems. - Stunden:
run_insights_querymitgroup_byhourundget_feature_timeseriesmitgranularityhourliefern die Stunden in der Zeitzone des Projekts. Ein Tag mit Zeitumstellung hat 23 oder 25 Stunden. Beide akzeptieren höchstens 31 Tage,fromundtoeingeschlossen.
Ergebnisse und Fehler
- Ein Tool-Ergebnis enthält seine Daten als
structuredContentund dasselbe JSON als Text, für Clients, die nur Text lesen. Ausgabeschemas werden nicht veröffentlicht. - Lehnt die API einen Aufruf ab, etwa einen unbekannten Funnel oder einen ungültigen Filter, hat das Ergebnis
isError: trueund die eigene Meldung der API als Text, damit sich der Assistent korrigieren kann. - Argumente werden gegen das Eingabeschema des Tools geprüft, bevor etwas passiert. Unbekannte Argumente werden abgelehnt statt ignoriert, und ein unbekanntes Tool ist ein JSON-RPC-Fehler.
Tools
Ihr Client bekommt jedes Tool mit seinem vollständigen Eingabeschema über tools/list. Die Tools tragen die Hinweise von MCP: Lesende Tools sind mit readOnlyHint markiert, Tools, die etwas ändern oder löschen, mit destructiveHint. Daran erkennen Clients, wann sie Sie vorher fragen sollten. openWorldHint ist überall false, weil die Tools immer nur das eine Projekt berühren.
Lesen, mit jeder Verbindung und jedem Schlüssel
| Tool | Was es tut |
|---|---|
list_projects | Die Projekte, die diese Verbindung nutzen kann, jeweils mit ID, Name, Zeitzone und Zugriff. |
get_project | Ein Projekt: Name, Zeitzone, Tarif, Aufbewahrung, heutiges Datum, Limits und freie Plätze. |
get_overview | Kennzahlen gegenüber dem vorherigen Zeitraum, eine Tagesreihe, Top-Seiten und Top-Features. |
list_features | Features nach Nutzung sortiert, auf Wunsch mit dem vorherigen Zeitraum verglichen, einschließlich nicht mehr genutzter Features. |
get_feature_timeseries | Nutzung der wichtigsten Features pro Tag oder pro Stunde. |
list_funnels | Gespeicherte Funnels mit einer groben Conversion über die letzten 31 Tage. |
get_funnel | Die Schritte eines Funnels für einen Zeitraum, mit Abbrüchen und dem schwächsten Schritt. |
get_funnel_trend | Die Conversion eines Funnels pro Tag, Woche, Monat oder Jahr. |
preview_funnel | Wie viele Events jeder geplante Schritt trifft, bevor ein Funnel angelegt wird. |
list_sources | Woher Besucher kamen, die größten Quellen zuerst: Suchmaschinen, soziale Medien, KI-Assistenten, andere Websites und Kampagnen-Links. Direkte Besucher und solche, deren Herkunft unbekannt ist, stehen in einer Zeile. Dazu kommen die Seiten, auf denen sie gelandet sind. Jeder Besucher zählt einmal am Tag, für seine erste Seite des Tages. |
list_campaigns | Besucher, die über Ihre Kampagnen-Links gekommen sind, die größten Kampagnen zuerst. Eine Zeile je Kampagnenname, Quelle und Medium, mit den häufigsten Link-Varianten, Suchbegriffen und den Seiten, auf denen die Besucher gelandet sind. |
list_pages | Seiten nach Aufrufen sortiert, mit Einstiegen: wie viele Besucher ihren Tag auf der jeweiligen Seite begonnen haben. Aufrufe zählen Seitenaufrufe, keine Besucher. Eine Seite besteht aus Website-Adresse und Pfad. Adressen, die sich erst nach einem Fragezeichen unterscheiden, sind also eine Seite. |
get_flow | Was Besucher als Nächstes getan haben, als Baum mit bis zu vier Schritten. |
find_flow_nodes | Seiten und Features suchen, die in den Wegen der Besucher vorkommen. |
run_insights_query | Events pro Stunde, Tag, Woche oder Monat zählen, mit Filtern und einer Aufschlüsselung. |
list_dashboards | Gespeicherte Dashboards. |
get_dashboard | Ein Dashboard und die Abfragen seiner Widgets. |
list_feature_rules | Die Regeln, die Events als Features benennen. |
preview_feature_rule | Was eine geplante Regel zählen würde und welche anderen Features einige derselben Events schon zählen. |
list_elements | Was angeklickt und abgeschickt wurde, gruppiert, mit den Features, zu denen es zählt. |
list_click_problems | Elemente, bei denen Klicks schiefgingen (ohne Wirkung, wiederholte Klicks, Fehler, langsame Reaktionen), die schlimmsten zuerst, jeweils mit Status. Jedes Problem zählt einmal pro Seitenaufruf. |
list_property_keys | Eigenschaften, nach denen gefiltert und aufgeschlüsselt werden kann. |
list_property_values | Die Werte, die eine Eigenschaft angenommen hat. |
search_docs | Die Dokumentation von Privatrak durchsuchen und die passenden Abschnitte mit Links bekommen. |
read_docs_page | Eine Seite der Dokumentation vollständig lesen. |
Ändern, mit Schreibrechten
Schreibrechte gibt es auf zwei Wegen: über eine OAuth-Verbindung, bei der die Person Lesen und schreiben gewählt hat, oder über einen Schlüssel mit vollem Zugriff. Beide erlauben dieselben Tools.
| Tool | Was es tut | Als destruktiv markiert |
|---|---|---|
create_feature_rule | Eine Feature-Regel speichern. | nein |
update_feature_rule | Name und Bedingungen einer Regel ersetzen. | ja |
delete_feature_rule | Eine Regel löschen. | ja |
create_funnel | Einen Funnel mit 2 bis 10 Schritten speichern. | nein |
rename_funnel | Einen Funnel umbenennen. Seine Schritte lassen sich nicht ändern. | ja |
delete_funnel | Einen Funnel und die von ihm gezählten Tage löschen. | ja |
create_dashboard | Ein leeres Dashboard anlegen. | nein |
rename_dashboard | Ein Dashboard umbenennen. | ja |
delete_dashboard | Ein Dashboard und seine Widgets löschen. | ja |
add_widget | Einem Dashboard ein Diagramm hinzufügen. | nein |
update_widget | Titel, Abfrage oder Position eines Widgets ändern. | ja |
remove_widget | Ein Widget entfernen. | ja |
resolve_click_problem | Ein Klickproblem als erledigt markieren. Bewirkt ein Klick darauf wieder nichts oder löst er wieder einen Fehler aus, kehrt es als „Erneut aufgetreten“ zurück. | ja |
ignore_click_problem | Ein Klickproblem als gewollt markieren. Es bleibt dauerhaft ausgeblendet. | ja |
reopen_click_problem | Das Erledigen oder Ignorieren zurücknehmen, sodass das Element wieder als offen erscheint. | ja |
Setup-Läufe, mit Schreibrechten
| Tool | Was es tut | Als destruktiv markiert |
|---|---|---|
start_setup_run | Eine Gruppe von Änderungen starten, die sich in einem Schritt rückgängig machen lässt. | nein |
list_setup_runs | Frühere Setup-Läufe und was jeder geändert hat. | nein |
get_setup_run | Die Änderungen eines Laufs, vorher und nachher. | nein |
undo_setup_run | Einen Lauf rückgängig machen, standardmäßig als Probelauf. | ja |
Die drei Tools für Klickprobleme nehmen die identity einer Zeile aus list_click_problems: alle fünf Felder genau so, wie sie zurückkamen, null dort, wo null steht. Eine Identität, in der ein Feld fehlt, wird abgelehnt, weil sie kein echtes Element bezeichnen würde. Zeilen, die mit group_by: selector aufgelistet werden, haben keine Identität. Erledigen und Ignorieren blenden eine Zeile nur aus. Keine Zahl ändert sich, und kein Event wird gelöscht.
Prompts und Ressourcen
product_review, mit den optionalen Argumentenfrom,toundprojectin dieser Reihenfolge: eine feste Auswertung der Gesamtveränderung, der Features mit der größten Bewegung, der Absprünge in Funnels, der meistgenutzten Elemente, die noch zu keinem Feature zählen, und der nächsten Schritte, die sich lohnen. Die Auswertung ist unter Fragen zu Ihren Daten beschrieben. Jede Verbindung und jeder Schlüssel.setup_project, mit den optionalen Argumenteninstrument,focusundprojectin dieser Reihenfolge.instrumentistcode(data-trackim Code, als Änderung zur Prüfung),rules(nur Feature-Regeln: Der Code wird nie bearbeitet, und es wird keine Änderung daran vorgeschlagen) oder leer, dann wählt der Assistent.focusnennt, worauf es am meisten ankommt. Das Vorgehen ist unter Projekt einrichten lassen beschrieben. Nur mit Schreibrechten.privatrak://guide/instrumentation(Markdown): wie der Tracker Dinge benennt, worin sich Feature-Regeln vondata-trackunterscheiden und welche Grenzen für Funnels und Dashboards gelten. Jeder Schlüssel.
Beim Verbinden schickt der Server außerdem Anweisungen, die dem Assistenten sagen, dass er zuerst get_project aufrufen soll und wie er die Zahlen ehrlich liest. Bei einer OAuth-Verbindung nennen sie auch die Projekte, die sie umfasst.
Setup-Läufe
Ein Setup-Lauf bündelt die Änderungen eines Assistenten, damit sie sich in einem Schritt rückgängig machen lassen. Jede Änderung über ein schreibendes Tool gehört zu einem Lauf.
- Starten Sie einen mit
start_setup_runund geben Sie seinerun_idbei jedem Schreibaufruf mit. Ein Schreibaufruf ohnerun_idstartet einen Lauf der Artchatund gibt seine ID mitrun_started: truezurück. Schlägt der Schreibaufruf fehl, wird der gestartete Lauf wieder entfernt. - Über die REST-API entspricht das dem Header
X-Setup-Run-IDbei jedem Schreibzugriff auf Feature-Regeln, Funnels, Dashboards, Widgets oder Klickprobleme. Schreibzugriffe ohne ihn werden nicht festgehalten und lassen sich so nicht rückgängig machen. undo_setup_runläuft standardmäßig mitdry_run: true, meldet also, was passieren würde, und ändert nichts. Das echte Rückgängigmachen läuft vom Neuesten zum Ältesten in einer Transaktion: Es entfernt, was der Lauf angelegt hat, setzt zurück, was er geändert hat, und stellt wieder her, was er gelöscht hat, mit der ursprünglichen ID. Was jemand anderes seitdem geändert hat, wird übersprungen und gemeldet. Ein Lauf lässt sich einmal rückgängig machen und nimmt danach keine Änderungen mehr an. Im Dashboard finden Sie dasselbe Rückgängigmachen auf der Seite Änderungen durch KI.- Die gezählten Tage eines Funnels lassen sich nicht wiederherstellen. Das Rückgängigmachen meldet sie vorher und nachher als
funnel_historyundfunnel_days_lost. - Ein Klickproblem, das der Lauf als erledigt markiert oder ignoriert hat, ist nach dem Rückgängigmachen wieder offen. Eines, das der Lauf wieder geöffnet oder zwischen erledigt und ignoriert umgestellt hat, wird so zurückgesetzt, wie es war. Hat es seitdem jemand anderes erledigt, ignoriert oder wieder geöffnet, lässt das Rückgängigmachen es in Ruhe und meldet es.
- Die Limits des Tarifs gelten für Schreibzugriffe und für das Rückgängigmachen gleichermaßen.
get_projectliefertslots_leftfür Feature-Regeln, Funnels, Dashboards und Widgets.
Schlüssel in den Einstellungen Ihres Assistenten
Diese Einstellungen betreffen Assistenten, die mit einem API-Schlüssel verbunden sind. Eine Verbindung per Anmeldung umfasst alle Projekte, die die Person erlaubt hat, und braucht nichts davon. Jeder Schlüssel gehört zu einem Projekt. Ein Assistent sollte also den Schlüssel des Projekts verwenden, an dessen Code er arbeitet.
- Claude Code speichert die Verbindung für den Ordner, in dem Sie
claude mcp addausführen. Führen Sie den Befehl in jedem Projektordner mit dem Schlüssel dieses Projekts aus. - Cursor liest
.cursor/mcp.jsonaus dem Ordner des jeweiligen Projekts. Jedes Projekt hat damit seine eigene Datei und seinen eigenen Schlüssel. - Codex verwendet eine Verbindung in allen Ordnern, solange ein Projekt keine eigene nennt. Wählen Sie für jedes Projekt einen eigenen Variablennamen, etwa
PRIVATRAK_API_KEY_SHOP, und speichern Sie den Schlüssel dieses Projekts darunter, wie beiPRIVATRAK_API_KEY. Legen Sie dann im Projektordner die Datei.codex/config.tomlan:
[mcp_servers.privatrak]
url = "https://api.privatrak.com/mcp"
bearer_token_env_var = "PRIVATRAK_API_KEY_SHOP"Die Datei nennt nur die Variable, nicht den Schlüssel, und darf deshalb in Ihr Code-Repository. Codex liest sie nur in einem Ordner, dem Sie vertrauen, und fragt Sie danach, wenn Sie Codex dort zum ersten Mal starten.
Schlüssel wechseln
Ein Assistent trägt Privatrak unter dem Namen privatrak ein und hält damit immer nur einen Schlüssel. Um zwischen einem KI-Assistenten-Schlüssel und einem Schlüssel mit vollem Zugriff zu wechseln, ersetzen Sie den alten Schlüssel, statt einen zweiten hinzuzufügen. In Claude Code führen Sie im Projektordner claude mcp remove privatrak und danach den neuen Befehl aus. In Codex ändern Sie den Schlüssel in der Zeile, die ihn speichert. In Cursor ersetzen Sie den Schlüssel in der mcp.json.
Möchten Sie sich anmelden, statt einen Schlüssel zu verwenden, entfernen Sie zuerst die Verbindung mit dem Schlüssel: claude mcp remove privatrak in Claude Code, codex mcp remove privatrak in Codex. In Cursor ersetzen Sie den Eintrag privatrak in der mcp.json durch den aus KI-Assistenten verbinden. Melden Sie sich dann wie dort beschrieben an und widerrufen Sie den alten Schlüssel auf der Seite API-Schlüssel.