CVforgecvforge.Token erstellen →
API MCPv1.0 · spec 2025-03-26Expert-Paket erforderlich

API & Integrationen

Verbinden Sie CVforge über die MCP-API mit Claude Desktop, n8n, Cursor und Ihren Automatisierungen. Lebensläufe hochladen, Optimierungen abrufen, Ihr Profil verwalten — alles ist programmatisch zugänglich.

Endpoint

api.cvforge.co/mcp

Protokoll

MCP · JSON-RPC 2.0

Transport

HTTP POST

Auth

PAT oder OAuth2

1. Voraussetzungen

Der Zugriff auf die MCP-API ist im Expert-Paket enthalten.

Meinen Token generieren →

2. Authentifizierung

CVforge unterstützt zwei Authentifizierungsmethoden. Für die meisten persönlichen Integrationen (n8n, Skripte, Claude Desktop) verwenden Sie einen PAT. Für Drittanbieter-Anwendungen nutzen Sie den OAuth 2.0 Authorization Code + PKCE-Flow.

2.1 Personal Access Token (PAT)

Ein PAT ist ein opaker Token mit dem Präfix mcp_pat_. Er wird nur ein einziges Mal bei der Erstellung angezeigt — bewahren Sie ihn sicher auf.

Verwendung in jeder Anfrage:

Authorization: Bearer mcp_pat_XXXXXXXXXXXXXXXXXXXX
Sicherheit — Committen Sie Ihren Token niemals in ein Git-Repository. Verwenden Sie Umgebungsvariablen oder einen Secrets-Manager (z. B. HashiCorp Vault, 1Password, n8n-Secrets).

2.2 OAuth 2.0 (Authorization Code + PKCE)

Für Anwendungen, die mehrere Benutzerkonten bedienen, verwenden Sie den Standard-OAuth-2.0-Flow.

EndpointURL
Discoveryhttps://api.cvforge.co/.well-known/oauth-authorization-server
Authorizationhttps://api.cvforge.co/oauth/authorize
Token exchangehttps://api.cvforge.co/oauth/token
Widerrufhttps://api.cvforge.co/oauth/revoke

2.3 Scopes

ScopeBeschreibung
read:profileProfil, Tarif und Guthabenstand lesen
read:cvLebensläufe und Generierungen auflisten, einsehen und herunterladen
write:cvLebensläufe hochladen, Stellenanzeigen einreichen und Optimierungen starten

3. Einen MCP-Aufruf durchführen

Die MCP-API verwendet das Protokoll JSON-RPC 2.0 über HTTP. Jede Anfrage ist ein POST an https://api.cvforge.co/mcp.

Format einer Anfrage

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXXXXXXXXXXXXXXXXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "<nom_de_l_outil>",
    "arguments": { /* paramètres de l'outil */ }
  }
}

Format einer Antwort (Erfolg)

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{ ...données... }"
      }
    ]
  }
}

Format einer Antwort (Fehler)

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32001,
    "message": "Token invalide ou révoqué",
    "data": { "error_code": "MCP_TOKEN_INVALID" }
  }
}

4. Verfügbare Tools

Die API stellt 10 Tools bereit. Lese-Tools erfordern read:profile oder read:cv. Uploads, das Einreichen von Stellenanzeigen und Optimierungen erfordern write:cv.

get_profileread:profile

Gibt die Kontoinformationen zurück: Name, E-Mail, Abonnement-Tarif.

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "get_profile", "arguments": {} }
}

Antwort (Auszug)

{
  "id": "uuid",
  "email": "alice@example.com",
  "full_name": "Alice Martin",
  "subscription_plan": "Expert",
  "subscription_status": "active"
}
get_creditsread:profile

Gibt den detaillierten Guthabenstand zurück (Abonnement, gekauft, kostenlos).

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "get_credits", "arguments": {} }
}

Antwort (Auszug)

{
  "total": 7,
  "subscription_credits": 5,
  "paid_credits": 2,
  "free_credits": 0
}
list_cvsread:cv

Listet die hochgeladenen Lebenslauf-Profile auf (ohne Inhalt).

Parameter

NameTypBeschreibung
limitinteger?Maximale Anzahl (Standard: 20, max.: 50)
offsetinteger?Paginierung (Standard: 0)

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "list_cvs", "arguments": { "limit": 10, "offset": 0 } }
}

Antwort (Auszug)

{
  "cvs": [
    {
      "id": "uuid",
      "original_filename": "CV_Alice_2026.pdf",
      "created_at": "2026-04-10T14:30:00Z",
      "generation_count": 3
    }
  ],
  "total": 1
}
get_cvread:cv

Gibt den vollständigen Inhalt (extrahierter Text) eines Lebenslaufs zurück.

Parameter

NameTypBeschreibung
cv_idstringUUID des Lebenslauf-Profils

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "get_cv", "arguments": { "cv_id": "uuid" } }
}

Antwort (Auszug)

{
  "id": "uuid",
  "original_filename": "CV_Alice_2026.pdf",
  "extracted_text": "Alice Martin — Product Manager...",
  "created_at": "2026-04-10T14:30:00Z"
}
upload_cvwrite:cv

Lädt einen Lebenslauf in Base64 hoch. Akzeptierte Formate: PDF, DOCX (max. 10 MB). Gibt die cv_profile_id zurück, die mit optimize_cv zu verwenden ist.

Parameter

NameTypBeschreibung
filenamestringDateiname (mit Erweiterung)
file_base64stringBase64-codierter Dateiinhalt
mime_typestringapplication/pdf | application/vnd.openxmlformats-officedocument.wordprocessingml.document

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "upload_cv", "arguments": {
  "filename": "mon_cv.pdf",
  "file_base64": "JVBERi0xLjQ...",
  "mime_type": "application/pdf"
} }
}

Antwort (Auszug)

{
  "cv_profile_id": "uuid",
  "message": "CV uploaded and parsed successfully."
}
submit_offerwrite:cv

Reicht eine Stellenanzeigen-URL (LinkedIn, Indeed, WTTJ usw.) zum Scraping und zur Speicherung ein. Gibt die offer_id zurück, die mit optimize_cv zu verwenden ist. Limit: 5 Aufrufe/Min. Unterstützte Websites: LinkedIn, Indeed, WTTJ, France Travail, HelloWork, APEC, Cadremploi, Glassdoor, Meteojob, LeBonCoin, JobTeaser, Collective Work.

Parameter

NameTypBeschreibung
offer_urlstringVollständige URL der Stellenanzeige

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "submit_offer", "arguments": {
  "offer_url": "https://www.linkedin.com/jobs/view/1234567890/"
} }
}

Antwort (Auszug)

{
  "offer_id": "uuid",
  "offer_url": "https://www.linkedin.com/jobs/view/1234567890/",
  "job_title": "Product Manager Senior",
  "company_name": "Acme Corp"
}
optimize_cvwrite:cv

Startet die KI-Optimierung eines Lebenslaufs für eine Stellenanzeige. Verbraucht 1 Guthabenpunkt. Der Vorgang ist asynchron: Verwenden Sie get_generation, um den Fortschritt zu verfolgen (pending → processing → completed/failed).

Parameter

NameTypBeschreibung
cv_profile_idstringUUID des Lebenslauf-Profils (erhalten über upload_cv oder list_cvs)
offer_idstringUUID der Stellenanzeige (erhalten über submit_offer)

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "optimize_cv", "arguments": {
  "cv_profile_id": "uuid-du-cv",
  "offer_id": "uuid-de-l-offre"
} }
}

Antwort (Auszug)

{
  "generation_id": "uuid",
  "status": "processing",
  "message": "CV optimization started"
}
list_generationsread:cv

Listet die generierten optimierten Lebensläufe auf, mit ihrem Status und den ATS-Scores.

Parameter

NameTypBeschreibung
limitinteger?Maximale Anzahl (Standard: 20, max.: 100)
offsetinteger?Paginierung (Standard: 0)

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "list_generations", "arguments": { "limit": 5 } }
}

Antwort (Auszug)

{
  "generations": [
    {
      "id": "uuid",
      "cv_id": "uuid",
      "job_title": "Product Manager Senior",
      "ats_score": 87,
      "status": "completed",
      "created_at": "2026-04-11T09:00:00Z"
    }
  ],
  "total": 1
}
get_generationread:cv

Gibt die Details einer Generierung zurück: Analyse, optimierter Text, Score.

Parameter

NameTypBeschreibung
generation_idstringUUID der Generierung

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "get_generation", "arguments": { "generation_id": "uuid" } }
}

Antwort (Auszug)

{
  "id": "uuid",
  "job_title": "Product Manager Senior",
  "ats_score": 87,
  "optimized_text": "Alice Martin — Product Manager Senior...",
  "analysis": { "missing_keywords": ["OKR", "roadmap"], "strengths": [...] },
  "status": "completed",
  "created_at": "2026-04-11T09:00:00Z"
}
download_generationread:cv

Lädt das finale PDF einer Generierung in Base64 herunter.

Parameter

NameTypBeschreibung
generation_idstringUUID der Generierung

Beispielaufruf

POST https://api.cvforge.co/mcp
Content-Type: application/json
Authorization: Bearer mcp_pat_XXXX

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": { "name": "download_generation", "arguments": { "generation_id": "uuid" } }
}

Antwort (Auszug)

{
  "filename": "CV_Alice_PM_Senior.pdf",
  "content_b64": "JVBERi0xLjQ...",
  "mime_type": "application/pdf",
  "size_bytes": 124580
}

5. Integrationsbeispiele

5.1 Vollständiger Flow: Upload → Stellenanzeige → Optimierung → Download

Python-Beispiel, das den kompletten Ablauf in 4 Schritten veranschaulicht.

import requests, base64, time, json, os

PAT     = os.environ["CVFORGE_PAT"]
MCP     = "https://api.cvforge.co/mcp"
HEADERS = {"Content-Type": "application/json", "Authorization": f"Bearer {PAT}"}

def mcp(tool: str, args: dict = {}):
    r = requests.post(MCP, json={
        "jsonrpc": "2.0", "id": 1, "method": "tools/call",
        "params": {"name": tool, "arguments": args}
    }, headers=HEADERS, timeout=60)
    r.raise_for_status()
    data = r.json()
    if "error" in data:
        raise RuntimeError(data["error"]["message"])
    return json.loads(data["result"]["content"][0]["text"])

# Étape 1 — Upload du CV
with open("mon_cv.pdf", "rb") as f:
    b64 = base64.b64encode(f.read()).decode()

cv = mcp("upload_cv", {
    "filename": "mon_cv.pdf",
    "file_base64": b64,
    "mime_type": "application/pdf",
})
cv_id = cv["cv_profile_id"]
print(f"CV uploadé : {cv_id}")

# Étape 2 — Soumission de l'offre
offer = mcp("submit_offer", {
    "offer_url": "https://www.linkedin.com/jobs/view/1234567890/"
})
offer_id = offer["offer_id"]
print(f"Offre : {offer['job_title']} @ {offer['company_name']} ({offer_id})")

# Étape 3 — Lancement de l'optimisation (1 crédit consommé)
gen = mcp("optimize_cv", {"cv_profile_id": cv_id, "offer_id": offer_id})
gen_id = gen["generation_id"]
print(f"Génération démarrée : {gen_id}")

# Étape 4 — Attente + téléchargement
for _ in range(20):
    time.sleep(5)
    details = mcp("get_generation", {"generation_id": gen_id})
    print(f"  statut : {details['status']}")
    if details["status"] == "completed":
        dl = mcp("download_generation", {"generation_id": gen_id})
        print(f"Téléchargement : {dl['download_url']} (valide 15 min)")
        break
    if details["status"] == "failed":
        raise RuntimeError("Optimisation échouée")

5.2 curl

# Remplacez YOUR_PAT par votre Personal Access Token
export PAT="mcp_pat_XXXXXXXXXXXXXXXXXXXX"

# Récupérer le profil
curl -X POST https://api.cvforge.co/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $PAT" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_profile","arguments":{}}}'

# Vérifier le solde de crédits
curl -X POST https://api.cvforge.co/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $PAT" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_credits","arguments":{}}}'

5.3 Claude Desktop / Claude.ai

Fügen Sie den folgenden Block in Ihre Claude-Desktop-Konfigurationsdatei ein (~/Library/Application Support/Claude/claude_desktop_config.json unter macOS).

{
  "mcpServers": {
    "cvforge": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.cvforge.co/mcp",
        "--header",
        "Authorization: Bearer mcp_pat_XXXXXXXXXXXXXXXXXXXX"
      ]
    }
  }
}

Nach dem Neustart hat Claude direkt in der Konversation Zugriff auf die CVforge-Tools. Sagen Sie zum Beispiel: "Liste meine Lebensläufe auf CVforge auf" oder "Lade die Datei MeinLebenslauf.pdf auf CVforge hoch".

5.4 n8n — HTTP-Request-Node

Erstellen Sie in n8n einen HTTP Request-Node mit den folgenden Parametern:

MethodPOST
URLhttps://api.cvforge.co/mcp
AuthenticationHeader Auth · Name: Authorization · Value: Bearer mcp_pat_XXX
Content-Typeapplication/json
Body (JSON){ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "list_cvs", "arguments": {} } }

Das JSON-Ergebnis ist im nächsten Node über {{ $json.result.content[0].text }} verfügbar. Parsen Sie es mit einem Set- oder Function-Node, um die Felder zu extrahieren.

5.5 Cursor / Windsurf

In .cursor/mcp.json (oder dem Äquivalent für Windsurf):

{
  "mcpServers": {
    "cvforge": {
      "url": "https://api.cvforge.co/mcp",
      "headers": {
        "Authorization": "Bearer mcp_pat_XXXXXXXXXXXXXXXXXXXX"
      }
    }
  }
}

6. Fehlercodes

error_codeJSON-RPC-CodeBeschreibung
MCP_TOKEN_INVALID-32001Token fehlt, ist fehlerhaft oder wurde widerrufen
MCP_TOKEN_EXPIRED-32001Token abgelaufen — generieren Sie einen neuen in den Einstellungen
MCP_SUBSCRIPTION_REQUIRED-32003Expert-Tarif erforderlich — siehe /pricing
MCP_SCOPE_INSUFFICIENT-32004Token besitzt nicht den erforderlichen Scope
MCP_TOOL_NOT_FOUND-32601Unbekanntes Tool
MCP_INVALID_PARAMS-32602Ungültige oder fehlende Parameter
MCP_INTERNAL_ERROR-32603Interner Fehler — versuchen Sie es erneut oder kontaktieren Sie den Support
PARSE_ERROR-32700Ungültiges JSON in der Anfrage
INVALID_REQUEST-32600Ungültige JSON-RPC-Struktur

7. Limits & Best Practices

Rate Limiting

LimitWert
Anfragen pro Minute (pro IP)60 req/min
submit_offer (pro Benutzer)5 req/min
Maximale Größe einer hochgeladenen Datei10 MB
Akzeptierte Lebenslauf-FormatePDF, DOCX
Gleichzeitig aktive PAT-Tokens10 pro Konto

Bei Überschreitung gibt die API einen HTTP 429 mit dem Header Retry-After zurück. Implementieren Sie in Ihren Automatisierungen einen exponentiellen Backoff.

Best Practices

Auffindbarkeit

CVforge veröffentlicht ein MCP-Manifest, das von LLMs und Suchmaschinen gelesen werden kann:

Bereit, CVforge zu integrieren?

Erstellen Sie Ihren ersten Token in 30 Sekunden über die Einstellungen.