linkedin-mcp-server
Allows submitting job applications to external job boards like Greenhouse, providing a resume and answers to application questions.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@linkedin-mcp-serversearch for software engineer jobs in Berlin and list the top 10"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LinkedIn MCP Server
Serveur MCP (Model Context Protocol) pour piloter LinkedIn depuis un agent IA (Claude Code, Claude Desktop, Manus, etc.). Repose sur Patchright (fork anti-détection de Playwright) et un profil Chrome persistant pour conserver une session authentifiée tout en bypassant les protections Arkose/CAPTCHA.
⚠️ Breaking change & durcissement (sécurité)
Les écritures sont désactivées par défaut. Toutes les actions qui modifient LinkedIn (post, message, connexion, candidature, follow, react, etc. — 43 fonctions) refusent de s'exécuter tant que la variable d'environnement
LINKEDIN_MCP_ENABLE_WRITES=1n'est pas posée. C'est un garde-fou structurel contre l'injection de prompt indirecte : ni le contenu scrapé ni l'agent ne peuvent le contourner.
# Pour autoriser les écritures (à poser côté config MCP, env du process) :
LINKEDIN_MCP_ENABLE_WRITES=1Autres durcissements appliqués :
Domaine | Avant | Après |
Prompt injection | descriptions / messages / notifs renvoyés en |
|
Soumission de candidature | champs inconnus remplis avec | plus aucune devinette : champs non reconnus laissés vides + refus de soumettre s'il en reste (à renseigner via |
Captcha / checkpoint |
| navigation via |
Nettoyage Chrome |
| kill ciblé uniquement sur le profil automatisé ( |
Traçabilité erreurs |
|
|
Double encodage JSON | dispatcher | dispatch retourne directement la chaîne JSON |
Limite résultats |
| paramètre |
💡
psutilest recommandé pour le kill ciblé. S'il est absent, un repli PowerShell (Windows) /pkill -f <profil>(Unix) est utilisé.
Related MCP server: LinkedIn MCP Pro Max
🌟 Fonctionnalités
10 outils consolidés :
# | Outil | Couverture |
1 |
| Profil : lecture, headline, about, photo, bannière, analytics |
2 |
| Expériences et formations (ajout/suppression, dates, "poste actuel") |
3 |
| Compétences : add / delete / endorse |
4 |
| Recommandations : demander / rédiger |
5 |
| Connexions, follow, block, recherche simple + avancée |
6 |
| DMs, pièces jointes, InMails, non-lus, notifications |
7 |
| Posts, médias, sondages, articles, carrousels, événements, programmation |
8 |
| React / commenter / repost / save |
9 |
| Publier sur page entreprise ou groupe, join/leave, analytics page |
10 |
| Recherche, détails, save, Easy Apply, candidature externe (Greenhouse/Lever) |
⚙️ Installation
pip install -r requirements.txt
patchright install chromiumDépendances pinnées (requirements.txt) :
mcp>=1.0.0,<2.0.0
patchright>=1.40.0,<2.0.0
python-dotenv>=1.0.0,<2.0.0🔑 Authentification (bypass anti-bot)
LinkedIn bloque Playwright standard via Arkose. La procédure ci-dessous ouvre un Chrome réel piloté en mode isolé pour passer outre :
python cleanup_and_login.pyCe script :
Tue les Chrome résiduels et purge les profils corrompus
Ouvre une fenêtre Chrome propre
Tu te connectes à LinkedIn (coche "Se souvenir de moi")
Attends 5 s sur le feed → le script détecte la session et la sauvegarde dans
~/.linkedin-mcp/profile
Cette étape est à refaire uniquement si la session expire (rare) ou si LinkedIn force une reconnexion.
🛠️ Enregistrement du serveur MCP
Claude Code (recommandé)
claude mcp add linkedin --scope user -- \
"C:/Users/<user>/AppData/Local/Programs/Python/Python312/python.exe" \
"C:/Users/<user>/Downloads/LinkedIn MCP Server/linkedin_mcp_server.py"Vérification :
claude mcp list | grep linkedin
# → linkedin: ... - ✓ Connected⚠️ Cold-start requis : après
claude mcp add, ferme et relance Claude Code (un--resumene re-découvre pas les nouveaux MCP tools).
Claude Desktop / Manus
claude_desktop_config.json :
{
"mcpServers": {
"linkedin": {
"command": "C:/Users/<user>/AppData/Local/Programs/Python/Python312/python.exe",
"args": ["C:/Users/<user>/Downloads/LinkedIn MCP Server/linkedin_mcp_server.py"]
}
}
}🔐 Données personnelles — scraping automatique
Aucun .env à remplir pour les PII. Les champs nom / email / téléphone / localisation sont scrapés directement depuis ton compte LinkedIn connecté :
Champ | Source |
|
|
| Top card du profil |
|
|
Le résultat est mis en cache par process : un seul scrape au premier appel d'un outil qui en a besoin, gratuit ensuite.
Fallback optionnel : si LinkedIn change la page settings (rare) et que le scrape email/phone échoue, tu peux poser ces variables dans ~/.linkedin-mcp/.env — elles seront utilisées en dernier recours, champ par champ :
LINKEDIN_EMAIL=...
LINKEDIN_PHONE=...Salaire — calculé par l'IA
Le salaire n'est jamais stocké côté serveur. L'agent IA doit le calculer en fonction des compétences, du niveau et du poste, puis le passer via le paramètre salary_expectation du tool manage_jobs (action easy_apply).
📚 Référence des outils
1. manage_profile_info
Profil : informations de base, visuels, stats.
Actions :
get,get_analytics,edit_headline,edit_about,update_picture,update_bannerArgs :
action(req),profile_url,headline,about,image_path
2. manage_profile_sections
Expériences et formations.
Actions :
add_experience,delete_experience,add_education,delete_educationArgs :
action(req),title/company(req pour expérience),school/degree(req pour formation),field_of_study,start_month,start_year,end_month,end_year,current(bool),location,employment_type,description
3. manage_skills
Actions :
add,delete,endorseArgs :
action(req),skill_name(req),profile_url(req pourendorse)
4. manage_recommendations
Actions :
request,writeArgs :
action(req),recipient_url_or_name(req),relationship,position,text
5. manage_network
Actions :
connect,accept,remove,withdraw,follow,unfollow,block,unblock,search,search_advancedArgs :
action(req),profile_url_or_name,note,password(pourunblock),keywords,location,network(first/second/third),company,industry,school,limit(défaut 10)
6. manage_messaging
Actions :
send,send_attachment,send_inmail,get_unread,read_thread,get_notificationsArgs :
action(req),recipient_url_or_name,message,subject(poursend_inmail),file_path(poursend_attachment),max_messages(défaut 50)
7. manage_publications
Actions :
post_simple,post_media,post_mentions,post_poll,schedule_post,post_article,post_carousel,trending_hashtags,create_eventArgs :
action(req),content,title,visibility(public/connections),media_paths,mentions,poll_question,poll_options,poll_duration_days,schedule_year/month/day/hour/minute,pdf_path,cover_image_path,event_name,event_type(ONLINE/IN_PERSON),start_date,end_date,start_time,end_time,timezone,external_link,location
8. engage_social
Actions :
react,comment,repost,save_postArgs :
action(req),post_url(req),reaction(LIKE/CELEBRATE/...),comment_text,repost_thoughts
9. manage_groups_and_pages
Actions :
post_page,post_group,join_group,leave_group,get_company_analyticsArgs :
action(req),target_url_or_handle(req),content
10. manage_jobs
Actions :
search,details,save_job,easy_apply,external_applyArgs :
action(req)keywords,location,easy_apply,limit(nombre max de résultats, défaut 25) (poursearch)job_id_or_urlanswers_json(JSON de réponses pré-définies poureasy_apply)submit(bool, défautFalse— quandFalsele serveur s'arrête sur la review et sauvegarde une capture dans~/.linkedin-mcp/screenshots/easy_apply_review.png)resume_path,answers_dict(pourexternal_apply)salary_expectation(str, optionnel) — montant que l'IA doit calculer en fonction du poste / niveau / compétences
🎯 Visibilité des publications
Valeur | Description |
| Visible par tout le monde (défaut LinkedIn) |
| Visible uniquement par tes connexions |
📁 Structure du projet
.
├── README.md
├── CLAUDE.md ← contexte pour sessions Claude Code
├── linkedin_mcp_server.py ← serveur MCP monolithique
├── cleanup_and_login.py ← procédure d'auth (1 fois)
├── requirements.txt
├── tests/ ← suites d'intégration (LinkedIn live requis)
├── tools/ ← scripts utilitaires (debug, inspection, dumps)
└── scratch/ ← captures et artefacts de debug🧪 Tests d'intégration
Tests unitaires hors-ligne (recommandés, aucune session requise) — vérifient les correctifs de durcissement de façon déterministe (deps lourdes stubbées) :
python tests/test_hardening.py # runner autonome → "18 passed, 0 failed"
# ou
pytest tests/test_hardening.py -qCouverture : fix d'URL (_normalize_job_url), garde-fou d'écriture
(_writes_enabled / _assert_write_allowed), sanitisation anti-injection
(_sanitize_external / _wrap_untrusted), suppression du fallback "3",
câblage du code anciennement mort.
Tests d'intégration live (session LinkedIn active requise) :
python tests/test_linkedin_new_features.py
python tests/full_test_suite.py🔒 Sécurité
Aucun identifiant en clair : les cookies sont stockés par Chrome dans
~/.linkedin-mcp/profile, isolés du Chrome principal.Pas de PII dupliquée : nom/email/téléphone/localisation viennent de LinkedIn lui-même, pas d'un fichier de config à maintenir.
Logging stderr-safe :
printest redirigé surstderrpour ne pas polluer le canal stdio JSON-RPC du MCP.Pas d'injection JS : tous les
page.evaluate()passent les valeurs via args, pas via f-string.Écritures désactivées par défaut : 43 fonctions de modification protégées par
LINKEDIN_MCP_ENABLE_WRITES=1(garde-fou structurel anti prompt-injection).Sanitisation du contenu externe :
_sanitize_external()/_wrap_untrusted()neutralisent les tentatives d'injection venant des descriptions, messages et notifications scrapés.Détection captcha/checkpoint :
_goto()(retry +detect_checkpoint) stoppe proprement si LinkedIn sert une vérification, plutôt que de renvoyer des données douteuses.Kill Chrome ciblé : seul le profil automatisé est terminé — les autres fenêtres Chrome de l'utilisateur ne sont jamais tuées.
Usage responsable : respecte les limites LinkedIn (anti-spam, anti-scraping). Évite les boucles rapides massives.
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 Servers
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with LinkedIn by scraping profiles, companies, job postings, and getting personalized job recommendations using authenticated browser automation.173,204Apache 2.0
- AlicenseAqualityDmaintenanceHigh-performance autonomous MCP server that turns LinkedIn into an API for AI workflows, enabling profile management, job search, content posting, and document generation.141MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for LinkedIn automation that enables AI agents to perform LinkedIn actions (search, inbox, feed, jobs, etc.) safely with human-like evasion and two-phase commit preview.92MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude AI to interact with LinkedIn through browser automation, including profile reading, people and job search, company research, post publishing, and profile editing.MIT
Related MCP Connectors
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
MCP server for LeadDelta — manage LinkedIn connections and CRM data via AI assistants.
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/Steph-ux/linkedin-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server