MCP-Server-Authentifizierung und Sicherheit in Cursor

Model Context Protocol (MCP)-Server erweitern Cursor um leistungsstarke externe Funktionen, von der Abfrage von Werbeplattformen bis zur Verwaltung von Zahlungsworkflows. Jede externe Verbindung bringt jedoch Authentifizierungs- und Sicherheitsaspekte mit sich. Dieser Leitfaden führt Sie durch das gesamte Spektrum der MCP-Server-Authentifizierung in Cursor und behandelt OAuth-Abläufe, API-Schlüsselverwaltung, menschliche Genehmigungsebenen für KI-gesteuerte Zahlungen sowie die spezifischen Herausforderungen, mit denen Benutzer bei Diensten wie dem Live Meta Ads MCP konfrontiert sind.
Warum MCP-Authentifizierung wichtig ist
Wenn Cursor eine Verbindung zu einem MCP-Server herstellt, muss dieser Server möglicherweise in Ihrem Namen handeln: private Daten lesen, Inhalte veröffentlichen oder sogar Geld ausgeben. Die Authentifizierung ist der Türsteher, der bestimmt, was der Agent tun kann und was nicht.
Das Sicherheitsmodell im Überblick
| Ebene | Verantwortung | Beispiel |
|---|---|---|
| Cursor | Hostet den MCP-Client, verwaltet Verbindungen | Liest mcp.json, startet Serverprozesse |
| MCP-Server | Behandelt externe API-Aufrufe | Ruft Meta Graph API, Stripe API auf |
| Authentifizierungsanbieter | Validiert Identität | OAuth-Token von Meta, API-Schlüssel vom Anbieter |
| Menschliche Genehmigung | Steuert sensible Aktionen | Genehmigen vor Zahlungsübermittlung |
Speichern Sie niemals Produktions-API-Schlüssel oder OAuth-Token als Klartext in Ihrem Repository. Verwenden Sie immer Umgebungsvariablen oder einen Secrets Manager. Das Commiten von Anmeldeinformationen in git ist eines der häufigsten Sicherheitsvorfälle, mit denen Entwickler konfrontiert werden.
Voraussetzungen
Bevor Sie die MCP-Authentifizierung in Cursor konfigurieren, stellen Sie sicher, dass Sie Folgendes haben:
- Cursor installiert und auf die neueste Version aktualisiert
- Node.js 18+ zum Ausführen von npx-basierten MCP-Servern
- Ein Konto beim externen Dienst, den Sie verbinden möchten (z.B. Meta for Developers, Stripe)
- App-Anmeldeinformationen vom Anbieter (Client-ID, Client-Secret oder API-Schlüssel)
Understanding der MCP-Authentifizierungsmethoden
Cursor unterstützt zwei primäre Authentifizierungsmuster für MCP-Server, und die Wahl hängt entirely davon ab, was der Server, zu dem Sie sich verbinden, unterstützt.
Methode 1: API-Schlüssel-Authentifizierung
Das einfachste Muster. Der MCP-Server erwartet einen statischen API-Schlüssel, der über eine Umgebungsvariable oder einen Header übergeben wird.
{
"mcpServers": {
"my-api-server": {
"command": "npx",
"args": ["-y", "@my-org/api-mcp-server"],
"env": {
"API_KEY": "${MY_API_KEY}"
}
}
}
}
Die ${MY_API_KEY}-Syntax weist Cursor an, den Wert aus Ihrer Umgebung zu lesen. Setzen Sie ihn in Ihrem Shell-Profil:
# ~/.zshrc oder ~/.bashrc
export MY_API_KEY="sk-your-actual-key-here"
Auf Windows setzen Sie Umgebungsvariablen über PowerShell oder Systemeigenschaften. In PowerShell:
[System.Environment]::SetEnvironmentVariable("MY_API_KEY", "sk-your-key", "User")
Starten Sie dann Cursor neu, damit es die neue Variable übernimmt.
Methode 2: OAuth 2.0-Authentifizierung
OAuth ist sicherer, da es statische Schlüssel vermeidet und bereichsbezogenen, widerrufbaren Zugriff unterstützt. Es ist jedoch komplexer einzurichten. Der MCP-Server initiiert einen OAuth-Ablauf, der einen Browser öffnet, Sie zur Anmeldung beim Anbieter auffordert und ein Token an Cursor zurückgibt.
{
"mcpServers": {
"oauth-server": {
"command": "npx",
"args": ["-y", "@my-org/oauth-mcp-server"],
"env": {
"OAUTH_CLIENT_ID": "${CLIENT_ID}",
"OAUTH_CLIENT_SECRET": "${CLIENT_SECRET}",
"OAUTH_REDIRECT_URI": "http://localhost:3000/callback"
}
}
}
}
Der OAuth-Ablauf verläuft wie folgt:
- Cursor startet den MCP-Serverprozess
- Der Server erkennt kein gültiges Token und initiiert OAuth
- Ihr Browser öffnet die Anmeldeseite des Anbieters
- Sie autorisieren die App
- Der Anbieter leitet zu
localhost:3000/callbackmit einem Autorisierungscode weiter - Der Server tauscht den Code gegen Zugriffs- und Aktualisierungstoken ein
- Token werden lokal für die zukünftige Verwendung gespeichert
Einrichtung des Live Meta Ads MCP
Der Live Meta Ads MCP ist eine der am häufigsten angeforderten MCP-Integrationen für Cursor. Er verbindet sich mit der Meta Graph API, um Ihrem Agenten die Abfrage von Werbeleistung, Kampagnendaten und Zielgruppen-Insights zu ermöglichen. Forumsbenutzer melden häufig, dass dieser MCP bei der Authentifizierung scheitert. So richten Sie ihn korrekt ein.
Schritt 1: Eine Meta-App erstellen
- Gehen Sie zum Meta for Developers-Portal
- Klicken Sie auf App erstellen
- Wählen Sie Geschäft als App-Typ
- Fügen Sie das Marketing API-Produkt hinzu
- Notieren Sie sich Ihre App-ID und App-Secret
Schritt 2: Ein langlebiges Zugriffstoken generieren
Metas Standard-Zugriffstoken laufen schnell ab. Für die MCP-Nutzung benötigen Sie ein langlebiges Token:
# Kurzlebiges Token gegen langlebiges Token eintauschen
curl -X GET "https://graph.facebook.com/v19.0/oauth/access_token" \
-d "grant_type=fb_exchange_token" \
-d "client_id=$META_APP_ID" \
-d "client_secret=$META_APP_SECRET" \
-d "fb_exchange_token=$SHORT_LIVED_TOKEN"
Die Antwort enthält ein Token, das ungefähr 60 Tage gültig ist.
Schritt 3: Den MCP-Server in Cursor konfigurieren
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@mcp/meta-ads-server"],
"env": {
"META_ACCESS_TOKEN": "${META_ACCESS_TOKEN}",
"META_APP_ID": "${META_APP_ID}",
"META_APP_SECRET": "${META_APP_SECRET}",
"META_API_VERSION": "v19.0"
}
}
}
}
Schritt 4: Die Verbindung überprüfen
Starten Sie Cursor neu, öffnen Sie dann die Cursor-Einstellungen und navigieren Sie zum MCP-Abschnitt. Sie sollten meta-ads mit einem grünen Statusindikator sehen. Wenn ein Fehler angezeigt wird, siehe den Abschnitt zur Fehlerbehebung unten.
Langlebige Meta-Token laufen nach 60 Tagen ab. Richten Sie eine Kalendererinnerung ein, um das Token vor Ablauf zu aktualisieren. Wenn das Token abläuft, wird Ihr Agent stillschweigend keine Werbedaten mehr abrufen, und das einzige Symptom können leere Ergebnisse oder Authentifizierungsfehler sein, die in MCP-Protokollen verborgen sind.
Häufige MCP-Authentifizierungsfehler
Forumsbenutzer melden mehrere wiederkehrende Probleme mit der MCP-Authentifizierung in Cursor. Hier sind die häufigsten Fehler und ihre Lösungen.
Fehler 1: Token in der Umgebung nicht gefunden
Symptom: Der MCP-Server startet, gibt aber bei jeder Anfrage 401 Unauthorized zurück.
Ursache: Cursor hat die Umgebungsvariable nicht übernommen. Dies geschieht oft, wenn die Variable in einem anderen Shell-Profil gesetzt wurde oder nachdem Cursor bereits lief.
Lösung:
# Überprüfen, ob die Variable existiert
echo $META_ACCESS_TOKEN
# Wenn leer, zum Shell-Profil hinzufügen und Cursor neu starten
echo 'export META_ACCESS_TOKEN="your-token"' >> ~/.zshrc
source ~/.zshrc
Beenden Sie dann Cursor vollständig und öffnen Sie ihn erneut.
Fehler 2: OAuth-Redirect-URI-Konflikt
Symptom: Der OAuth-Ablauf öffnet den Browser, aber nach der Autorisierung sehen Sie eine Fehlerseite.
Ursache: Die Redirect-URI in Ihrer Meta-App-Konfiguration stimmt nicht mit der überein, die der MCP-Server verwendet.
Lösung: Gehen Sie in Ihrem Meta for Developers-Dashboard zu App-Einstellungen > Erweitert > OAuth-Einstellungen und fügen Sie http://localhost:3000/callback (oder die URI, die Ihr MCP-Server verwendet) zu den zulässigen Redirect-URIs hinzu.
Fehler 3: Abgelaufenes oder ungültiges Token
Symptom: Der MCP-Server funktionierte zuvor, gibt aber plötzlich Authentifizierungsfehler zurück.
Ursache: Das langlebige Meta-Token ist abgelaufen (60-Tage-Limit) oder wurde widerrufen.
Lösung: Führen Sie den Token-Austausch-Ablauf erneut aus und aktualisieren Sie die Umgebungsvariable.
Fehler 4: Fehlende Berechtigungsbereiche
Symptom: Die Authentifizierung gelingt, aber der Agent kann nicht auf bestimmte Daten zugreifen (z.B. kann Kampagnen lesen, aber keine Zielgruppendaten).
Ursache: Der Meta-App fehlen die erforderlichen API-Berechtigungen.
Lösung: Gehen Sie im Meta-App-Dashboard zu Rollen > App-Überprüfung > Berechtigungen und Funktionen und fordern Sie die zusätzlichen Bereiche an:
| Bereich | Was es ermöglicht |
|---|---|
ads_read | Kampagnen-Leistungsdaten lesen |
ads_management | Kampagnen erstellen und verwalten |
read_insights | Zugriff auf detaillierte Analysen |
business_management | Geschäftseinstellungen verwalten |
Aufbau menschlicher Genehmigungsebenen für KI-Agent-Zahlungen
Einer der mächtigsten und gefährlichsten Anwendungsfälle für MCP in Cursor ist die Verbindung eines KI-Agenten mit Zahlungssystemen. Ein Agent, der Käufe tätigen oder Geld überweisen kann, benötigt ein menschliches Genehmigungsgate. Forumsbenutzer haben benutzerdefinierte Genehmigungsebenen erstellt, um dieses Problem zu lösen.
Warum Genehmigungsebenen unerlässlich sind
Ohne eine Genehmigungsebene könnte ein KI-Agent mit MCP-Zahlungszugriff:
- Unerwartete Beträge auf Ihre Karte belasten
- Zahlungen an falsche Empfänger senden
- Unumkehrbare finanzielle Transaktionen auslösen
- Kosten durch wiederholte Mikrotransaktionen anhäufen
Architektur einer Zahlungsgenehmigungsebene
Das empfohlene Muster fügt ein Genehmigungsgateway zwischen Cursor und den MCP-Zahlungsserver ein:
Cursor Agent --> Approval Gateway --> Payment MCP Server --> Stripe/PayPal API
^
|
Human Review
Implementierung des Genehmigungsgateways
Erstellen Sie einen leichtgewichtigen MCP-Server, der den tatsächlichen Zahlungsserver umschließt und eine Genehmigung erfordert:
// approval-gateway.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server({
name: "payment-approval-gateway",
version: "1.0.0",
}, {
capabilities: { tools: {} },
});
// Pending approvals stored in memory (use a database for production)
const pendingApprovals = new Map();
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "request_payment",
description: "Request a payment. Requires human approval before execution.",
inputSchema: {
type: "object",
properties: {
amount: { type: "number", description: "Amount in cents" },
currency: { type: "string", description: "ISO currency code" },
recipient: { type: "string", description: "Recipient identifier" },
reason: { type: "string", description: "Why this payment is needed" },
},
required: ["amount", "currency", "recipient", "reason"],
},
},
{
name: "approve_payment",
description: "Approve a pending payment by ID",
inputSchema: {
type: "object",
properties: {
approval_id: { type: "string" },
},
required: ["approval_id"],
},
},
],
}));
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "request_payment") {
const { amount, currency, recipient, reason } = request.params.arguments;
const approvalId = `appr_${Date.now()}`;
pendingApprovals.set(approvalId, {
amount,
currency,
recipient,
reason,
status: "pending",
createdAt: new Date(),
});
return {
content: [{
type: "text",
text: `Payment request created. Approval ID: ${approvalId}\n\n` +
`Amount: ${amount/100} ${currency.toUpperCase()}\n` +
`Recipient: ${recipient}\n` +
`Reason: ${reason}\n\n` +
`To execute this payment, a human must approve it using the approve_payment tool with approval_id: ${approvalId}`,
}],
};
}
if (request.params.name === "approve_payment") {
const { approval_id } = request.params.arguments;
const approval = pendingApprovals.get(approval_id);
if (!approval) {
return { content: [{ type: "text", text: "Error: Approval ID not found." }] };
}
// Forward to actual payment server here
approval.status = "approved";
return {
content: [{
type: "text",
text: `Payment approved and forwarded to payment processor.\nAmount: ${approval.amount/100} ${approval.currency.toUpperCase()}`,
}],
};
}
});
const transport = new StdioServerTransport();
await server.connect(transport);
Konfiguration des Genehmigungsgateways in Cursor
{
"mcpServers": {
"payments": {
"command": "npx",
"args": ["tsx", "./mcp-servers/approval-gateway.ts"],
"env": {
"STRIPE_SECRET_KEY": "${STRIPE_SECRET_KEY}",
"APPROVAL_TIMEOUT_MS": "300000"
}
}
}
}
Setzen Sie ein Genehmigungs-Timeout, sodass eine Anfrage automatisch verfällt, wenn ein Mensch nicht innerhalb eines angemessenen Zeitrahmens genehmigt. Fünf Minuten sind ein guter Standardwert. Dies verhindert, dass veraltete Zahlungsanfragen sich ansammeln und außerhalb des Kontexts genehmigt werden.
Das Genehmigungsgateway-Muster funktioniert nur, wenn der KI-Agent es nicht umgehen kann. Stellen Sie sicher, dass der direkte MCP-Zahlungsserver NICHT in Cursor konfiguriert ist. Nur das Gateway sollte verfügbar gemacht werden. Wenn beide konfiguriert sind, könnte der Agent theoretisch den direkten Server aufrufen und die Genehmigung überspringen.
Sichere MCP-Server-Konfiguration
Über die Authentifizierung hinaus hat die Art, wie Sie MCP-Server in Cursor konfigurieren, sicherheitstechnische Auswirkungen. Befolgen Sie diese Best Practices.
Projektbezogene vs. globale Konfiguration verwenden
Cursor unterstützt sowohl globale (~/.cursor/mcp.json) als auch projektbezogene (.cursor/mcp.json) Konfigurationen.
| Bereich | Datei | Anwendungsfall |
|---|---|---|
| Global | ~/.cursor/mcp.json | Persönliche Server, projektübergreifend verwendet |
| Projekt | .cursor/mcp.json | Server spezifisch für ein Projekt |
Verwenden Sie projektbezogene Konfiguration für sensible Server. Dies hält Anmeldeinformationen aus Ihrer globalen Konfiguration heraus und erleichtert die Überprüfung, welche Projekte Zugriff auf welche Dienste haben. Fügen Sie .cursor/mcp.json zu .gitignore hinzu, wenn es Secrets enthält, oder verwenden Sie ausschließlich Umgebungsvariablen-Referenzen.
Einschränkung des MCP-Tool-Zugriffs
Sie können einschränken, welche Tools ein MCP-Server Cursor verfügbar macht, indem Sie das Feld disabledTools verwenden:
{
"mcpServers": {
"meta-ads": {
"command": "npx",
"args": ["-y", "@mcp/meta-ads-server"],
"env": {
"META_ACCESS_TOKEN": "${META_ACCESS_TOKEN}"
},
"disabledTools": ["delete_campaign", "pause_all_campaigns"]
}
}
}
Dies verhindert, dass der Agent zerstörerische Tools verwendet, selbst wenn der MCP-Server sie verfügbar macht.
Transportsicherheit
Für Remote-MCP-Server (SSE-basiert) verwenden Sie immer HTTPS:
{
"mcpServers": {
"remote-server": {
"url": "https://mcp.example.com/sse",
"headers": {
"Authorization": "Bearer ${REMOTE_MCP_TOKEN}"
}
}
}
}
Verwenden Sie niemals HTTP (unverschlüsselt) für Remote-MCP-Server. Die Verbindung überträgt Ihre Authentifizierungs-Token, und ein Angreifer im Netzwerk könnte diese abfangen. Verwenden Sie immer HTTPS und überprüfen Sie das TLS-Zertifikat des Servers.
Token-Aktualisierungsmuster
Viele OAuth-Anbieter stellen kurzlebige Zugriffstoken (1 Stunde) zusammen mit langlebigen Aktualisierungstoken aus. Ihr MCP-Server muss die Aktualisierung automatisch verarbeiten, um Unterbrechungen zu vermeiden.
Muster 1: Serverseitige Aktualisierung (Empfohlen)
Der MCP-Server verarbeitet die Token-Aktualisierung intern. Wenn ein Zugriffstoken abläuft, verwendet der Server das Aktualisierungstoken, um ein neues zu erhalten, ohne Benutzereingriff.
// Inside your MCP server
let accessToken = await loadToken();
let tokenExpiry = Date.now() + 3600 * 1000; // 1 hour
async function ensureValidToken() {
if (Date.now() >= tokenExpiry - 60000) { // refresh 1 min before expiry
const response = await fetch("https://oauth.provider.com/token", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
grant_type: "refresh_token",
refresh_token: process.env.REFRESH_TOKEN,
client_id: process.env.CLIENT_ID,
client_secret: process.env.CLIENT_SECRET,
}),
});
const data = await response.json();
accessToken = data.access_token;
tokenExpiry = Date.now() + data.expires_in * 1000;
await saveToken(accessToken, tokenExpiry);
}
return accessToken;
}
Muster 2: Umgebungs-Neuladung auf Cursor-Seite
Wenn Ihr MCP-Server die automatische Aktualisierung nicht unterstützt, können Sie die Umgebung in Cursor neu laden:
- Token extern aktualisieren
- Umgebungsvariable aktualisieren
- MCP-Server in Cursor über die Einstellungen neu starten
Muster 3: Wrapper-Skript
Erstellen Sie ein Wrapper-Skript, das das Token aktualisiert, bevor der MCP-Server gestartet wird:
#!/bin/bash
# refresh-and-start.sh
# Refresh the Meta token
NEW_TOKEN=$(node /path/to/refresh-token.js)
export META_ACCESS_TOKEN=$NEW_TOKEN
# Start the MCP server
exec npx -y @mcp/meta-ads-server
Konfigurieren Sie Cursor, das Wrapper zu verwenden:
{
"mcpServers": {
"meta-ads": {
"command": "bash",
"args": ["/path/to/refresh-and-start.sh"]
}
}
}
Für den Live Meta Ads MCP spezifisch ist das 60-Tage-Token-Ablaufen die häufigste Ursache für "plötzlich nicht mehr funktionierend"-Meldungen. Automatisieren Sie den Aktualisierungsprozess mit einem Cron-Job oder einer geplanten Aufgabe. Auf macOS/Linux verwenden Sie cron. Auf Windows verwenden Sie den Aufgabenplaner.
Fehlerbehebung der MCP-Authentifizierung
MCP-Server-Protokolle prüfen
Cursor zeigt MCP-Server-Fehler nicht immer in der Benutzeroberfläche an. Um zu sehen, was passiert:
- Öffnen Sie die Befehlspalette (
Cmd/Ctrl + Shift + P) - Suchen Sie nach Output: Show Output Channels
- Wählen Sie MCP aus dem Dropdown
- Überprüfen Sie die Protokolle auf Authentifizierungsfehler
Authentifizierung unabhängig testen
Bevor Sie über Cursor debuggen, testen Sie den MCP-Server direkt:
# Run the server manually
npx -y @mcp/meta-ads-server
# In another terminal, send a test request
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | npx -y @mcp/meta-ads-server
Wenn der Server außerhalb von Cursor nicht authentifiziert werden kann, liegt das Problem bei Ihren Anmeldeinformationen, nicht bei Cursor.
Überprüfen, ob Umgebungsvariablen geladen sind
# Create a test script
cat > test-env.js << 'EOF'
console.log("META_ACCESS_TOKEN:", process.env.META_ACCESS_TOKEN ? "SET" : "NOT SET");
console.log("META_APP_ID:", process.env.META_APP_ID ? "SET" : "NOT SET");
console.log("META_APP_SECRET:", process.env.META_APP_SECRET ? "SET" : "NOT SET");
EOF
# Run with the MCP server's environment
node test-env.js
Wenn Variablen als NOT SET angezeigt werden, liegt das Problem bei Ihrem Shell-Profil oder der Art, wie Cursor die Umgebung lädt.
Sicherheits-Checkliste
Bevor Sie MCP-Server in einem Produktionskontext bereitstellen, gehen Sie diese Checkliste durch:
- API-Schlüssel in Umgebungsvariablen gespeichert, niemals in Konfigurationsdateien
-
.cursor/mcp.jsonzu.gitignorehinzugefügt, wenn es Secrets enthält - OAuth-Redirect-URIs auf
localhostbeschränkt - Zerstörerische Tools über
disabledToolsdeaktiviert - MCP-Zahlungsserver mit Genehmigungsgateways umschlossen
- Token-Aktualisierung automatisiert, um stille Fehler zu vermeiden
- Remote-MCP-Server verwenden ausschließlich HTTPS
- MCP-Server-Protokolle auf unerwartete Authentifizierungsfehler überwacht
- Zugriffstoken auf minimal erforderliche Berechtigungen beschränkt
- Nicht verwendete MCP-Server aus der Konfiguration entfernt
Zusammenfassung
Die MCP-Authentifizierung in Cursor spans ein Spektrum von einfachen API-Schlüssel-Umgebungsvariablen bis hin zu komplexen OAuth-Abläufen mit automatischer Token-Aktualisierung. Der Live Meta Ads MCP ist ein häufiger Schmerzpunkt wegen seines 60-Tage-Token-Ablaufen und der Berechtigungsbereichsanforderungen. Indem Sie den Mustern in diesem Leitfaden folgen, können Sie sichere, zuverlässige MCP-Integrationen aufbauen, die sensible Aktionen hinter menschlichen Genehmigungsebenen schützen und Ihre Anmeldeinformationen sicher halten.