linkedin-safe-mcp
linkedin-safe-mcp
Ein MCP-Server, der KI-Agenten (Claude Code, Codex, Claude Desktop, Cursor, …) LinkedIn-Superkräfte verleiht — ohne dein LinkedIn-Konto zu gefährden:
Auf LinkedIn posten — Text, Links und Bilder über die offizielle API von LinkedIn (OAuth, ToS-konform), plus Kommentare und Likes.
Jobs suchen — Filter nach Schlüsselwort/Ort/Remote/Erfahrung/Datum über die öffentlichen Gast-Endpunkte von LinkedIn. Kein Login, keine Cookies: dein Konto bleibt außen vor.
Jobsuche verwalten — ein lokaler SQLite-Bewerbungstracker (interessiert → beworben → im Gespräch → Angebot) mit Notizen und Job-Schnappschüssen, damit ein Agent deine Pipeline pflegen und maßgeschneiderte Anschreiben schreiben kann — sogar nachdem eine Stelle offline gegangen ist.
Warum dieses Design?
LinkedIn bietet keine offizielle Job-Such-API, und die inoffiziellen Wege
(interne Voyager-API mit deinem li_at-Session-Cookie, Headless-Browser auf
deiner angemeldeten Session) verstoßen gegen die LinkedIn-Nutzungsbedingungen
§ 8.2 und führen regelmäßig zu gesperrten Konten. Dieser Server umgeht das
bewusst:
Bereich | Wie es gelöst wird | Kontorisiko |
Posten, Kommentare, Likes | Offizielle REST-API, eigene OAuth-App, | Keins — sanktioniert |
Jobsuche & -details | Gast-Endpunkte (die ausgeloggten Jobseiten), IP-begrenzt | Keins — keine Anmeldedaten |
Pipeline-Tracking | Lokales SQLite auf deinem Rechner | Keins — berührt LinkedIn nie |
Easy Apply, DMs, Feed lesen | Bewusst nicht enthalten — unmöglich ohne ToS-verletzenden Zugriff | — |
Voraussetzungen
Python 3.11+ und uv
Nur zum Posten: eine kostenlose LinkedIn-Developer-App (Einrichtung in 5 Minuten, siehe unten). Jobsuche und Tracker funktionieren ohne jede Einrichtung.
Installation & Verbindung mit deinem Agenten
Kopiere dieses Verzeichnis und registriere es bei deinem MCP-Client. <REPO> unten
steht für den absoluten Pfad zu diesem Projekt.
Claude Code
claude mcp add linkedin \
--env LINKEDIN_CLIENT_ID=your_client_id \
--env LINKEDIN_CLIENT_SECRET=your_client_secret \
-- uv run --directory <REPO> linkedin-safe-mcpOder in einer .mcp.json des Projekts:
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["run", "--directory", "<REPO>", "linkedin-safe-mcp"],
"env": {
"LINKEDIN_CLIENT_ID": "your_client_id",
"LINKEDIN_CLIENT_SECRET": "your_client_secret"
}
}
}
}Codex (~/.codex/config.toml)
[mcp_servers.linkedin]
command = "uv"
args = ["run", "--directory", "<REPO>", "linkedin-safe-mcp"]
env = { LINKEDIN_CLIENT_ID = "your_client_id", LINKEDIN_CLIENT_SECRET = "your_client_secret" }Claude Desktop (claude_desktop_config.json) — gleiche JSON-Struktur wie .mcp.json
oben.
Die LINKEDIN_CLIENT_*-Variablen werden nur zum Posten benötigt; lass sie weg, wenn du
nur Jobsuche + Tracking willst.
Posten aktivieren (einmalige LinkedIn-App-Einrichtung)
Gehe zu https://www.linkedin.com/developers/apps → App erstellen (erfordert eine beliebige LinkedIn-Seite; du kannst eine triviale anlegen).
Füge auf dem Produkte-Tab Auf LinkedIn teilen und Mit LinkedIn anmelden über OpenID Connect hinzu.
Füge auf dem Auth-Tab die Redirect-URL
http://localhost:8765/callbackhinzu.Kopiere Client-ID und Client-Secret in die oben gezeigten Umgebungsvariablen.
Authentifiziere dich einmal — auf beiden Wegen:
Im Terminal:
uv run --directory <REPO> linkedin-safe-mcp authOder sag einfach deinem Agenten, er soll etwas posten; er ruft das
login-Tool auf und reicht dir die Autorisierungs-URL weiter.
Tokens werden in ~/.linkedin-mcp/tokens.json gespeichert (Modus 0600) und halten ~60 Tage;
LinkedIn stellt für Self-Service-Apps keine Refresh-Tokens aus, also musst du dich nach
Ablauf erneut anmelden (auth_status sagt dir genau, wann es so weit ist).
Tools
Tool | Benötigt Auth | Funktion |
| – | Meldet Konfigurations-/Auth-Status mit genauen nächsten Schritten |
| – | Browser-OAuth-Ablauf / gespeicherte Tokens löschen |
| ✓ | Name, E-Mail, Personen-URN des verbundenen Kontos |
| ✓ | Beitrag veröffentlichen: Text (+Hashtags), optional Link oder lokales Bild; |
| ✓ | Einen eigenen Beitrag löschen (URN oder Beitrags-URL) |
| ✓ | Beitrag kommentieren (URN oder Beitrags-URL) |
| ✓ | Beitrag liken (URN oder Beitrags-URL) |
| – | Filter: Ort, Remote/Hybrid/Präsenz, Zeitpunkt der Veröffentlichung, Erfahrungslevel, Jobtyp, nur Easy Apply, Sortierung; bis zu 50 Ergebnisse |
| – | Vollständige Stelle: Beschreibung, Seniorität, Art, Gehalt falls angegeben, Bewerberzahl, externe Bewerbungs-URL |
| – | Stelle als Schnappschuss im lokalen Tracker speichern |
| – | Einzelne Stelle mit Verlauf / Pipeline-Übersicht mit Statuszählungen |
| – | interessiert → beworben → im Gespräch → Angebot / abgelehnt → zurückgezogen → eingestellt, mit Notizen |
| – | Notiz anhängen / Stelle verwerfen |
Was Agenten damit machen können: „Finde remote Staff-Engineer-Stellen, die diese Woche veröffentlicht wurden, speichere die vielversprechenden, entwirf passende Anschreiben aus den gespeicherten Beschreibungen, markiere die, bei denen ich mich beworben habe, und poste eine Zusammenfassung meiner Open-Source-Arbeit."
Konfiguration
Umgebungsvariable | Standard | Zweck |
| – | LinkedIn-App-Zugangsdaten (nur zum Posten) |
|
| Speicherort für Tokens + Tracker-DB |
|
| OAuth-Callback-Port (muss mit der App-Redirect-URL übereinstimmen) |
|
|
|
|
|
|
| ein Chrome-UA | User-Agent für Gast-Job-Anfragen |
Verhalten & Grenzen
Posten: LinkedIn begrenzt das Posten auf 150 Anfragen/Tag und lehnt exakte Duplikate aktueller Beiträge ab (HTTP 422). Reservierte Zeichen im Beitragstext werden für die versionierte API automatisch escaped, damit Klammern keine Fehler verursachen; Hashtags bleiben erhalten.
Jobsuche: Gast-Endpunkte sind pro IP begrenzt (HTTP 429). Der Server cached Ergebnisse (10 Min. für Suchen / 6 h für Jobdetails), wiederholt mit Backoff und taktet mehrseitige Abrufe; bei anhaltendem 429 gibt es eine klare „warte eine Minute"-Meldung an den Agenten. Halte
limitmoderat.Scraping-Verhalten: Die Gast-Jobsuche liest dieselben öffentlichen Seiten, die auch ein ausgeloggter Besucher sieht, mit menschlichem Tempo und Caching, um die Last gering zu halten. Trotzdem kann LinkedIn diese Endpunkte jederzeit ändern oder sperren — die Parser sind durch Fixture-Tests abgesichert, sodass Brüche laut erkannt werden und die Tool-Fehler für den Agenten handlungsleitend sind.
Entwicklung
uv sync # install deps (Python ≥3.11)
uv run pytest # 48 tests: parsers vs live fixtures, payloads, OAuth, tracker,
# plus an end-to-end stdio smoke test that spawns the real server
uv run ruff check src tests && uv run ruff format --check src testsAufbau: src/linkedin_mcp/ — server.py (Tool-Oberfläche) · api/ (offizielle REST:
Beiträge, Social Actions, Uploads, duales Rest/UGC-Backend) · auth/ (OAuth + Token-
Speicher) · jobs/ (Gast-Client, HTML-Parser, Filter-Zuordnungen) · tracker/
(SQLite-Speicher) · cli.py (serve | auth | status | logout).
Roadmap
Veröffentlichung auf PyPI (
uvx linkedin-safe-mcp-Einzeiler)Reaktionsarten über Like hinaus; Beiträge mit mehreren Bildern; Umfrage-Beiträge
Optionale Drittanbieter-Jobdaten hinter demselben Tool-Schema
streamable-http-Transport für Remote-/gehostete Nutzung(Erwogen, nur opt-in, standardmäßig aus) ein Cookie-basierter Voyager-Provider für personalisierte Funktionen — mit deutlichen Warnhinweisen, da er gegen die LinkedIn-Nutzungsbedingungen verstößt
Lizenz
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
MCP server for LeadDelta — manage LinkedIn connections and CRM data via AI assistants.
GetJobzi MCP server for job search, application tracking, and career forecasting.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AmmYoo7/linkedin-safe-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server