Skip to main content
Glama
AmmYoo7

linkedin-safe-mcp

by AmmYoo7

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, w_member_social

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-mcp

Oder 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)

  1. Gehe zu https://www.linkedin.com/developers/appsApp erstellen (erfordert eine beliebige LinkedIn-Seite; du kannst eine triviale anlegen).

  2. Füge auf dem Produkte-Tab Auf LinkedIn teilen und Mit LinkedIn anmelden über OpenID Connect hinzu.

  3. Füge auf dem Auth-Tab die Redirect-URL http://localhost:8765/callback hinzu.

  4. Kopiere Client-ID und Client-Secret in die oben gezeigten Umgebungsvariablen.

  5. Authentifiziere dich einmal — auf beiden Wegen:

    • Im Terminal: uv run --directory <REPO> linkedin-safe-mcp auth

    • Oder 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

auth_status

Meldet Konfigurations-/Auth-Status mit genauen nächsten Schritten

login / logout

Browser-OAuth-Ablauf / gespeicherte Tokens löschen

get_my_profile

Name, E-Mail, Personen-URN des verbundenen Kontos

create_post

Beitrag veröffentlichen: Text (+Hashtags), optional Link oder lokales Bild; PUBLIC oder CONNECTIONS

delete_post

Einen eigenen Beitrag löschen (URN oder Beitrags-URL)

comment_on_post

Beitrag kommentieren (URN oder Beitrags-URL)

like_post

Beitrag liken (URN oder Beitrags-URL)

search_jobs

Filter: Ort, Remote/Hybrid/Präsenz, Zeitpunkt der Veröffentlichung, Erfahrungslevel, Jobtyp, nur Easy Apply, Sortierung; bis zu 50 Ergebnisse

get_job

Vollständige Stelle: Beschreibung, Seniorität, Art, Gehalt falls angegeben, Bewerberzahl, externe Bewerbungs-URL

save_job

Stelle als Schnappschuss im lokalen Tracker speichern

get_saved_job / list_saved_jobs

Einzelne Stelle mit Verlauf / Pipeline-Übersicht mit Statuszählungen

update_job_status

interessiert → beworben → im Gespräch → Angebot / abgelehnt → zurückgezogen → eingestellt, mit Notizen

add_job_note / remove_saved_job

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_CLIENT_ID / LINKEDIN_CLIENT_SECRET

LinkedIn-App-Zugangsdaten (nur zum Posten)

LINKEDIN_MCP_DIR

~/.linkedin-mcp

Speicherort für Tokens + Tracker-DB

LINKEDIN_REDIRECT_PORT

8765

OAuth-Callback-Port (muss mit der App-Redirect-URL übereinstimmen)

LINKEDIN_API_VERSION

202606

LinkedIn-Version-Header für /rest/*-Aufrufe

LINKEDIN_POSTS_BACKEND

auto

rest, ugc oder auto (versucht REST, fällt auf UGC zurück und merkt sich, was deine App darf)

LINKEDIN_MCP_USER_AGENT

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 limit moderat.

  • 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 tests

Aufbau: 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

-
license - not tested
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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.

View all MCP Connectors

Latest Blog Posts

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