linkedin-mcp
LinkedIn MCP
MCP-сервер, который позволяет ИИ-ассистенту искать вакансии на LinkedIn и читать профили LinkedIn, управляя реальным окном Chrome через протокол DevTools.
Он только для чтения. Здесь нет инструментов для подключения, сообщений, одобрений, публикаций или откликов — не как настройка, а потому что код для этого не существует. Это осознанная граница: LinkedIn относится к автоматическому написанию гораздо строже, чем к автоматическому чтению, и смешение этих двух вещей приводит к ограничению аккаунтов.
Инструменты
Инструмент | Что возвращает |
| Список вакансий с названием, компанией, местоположением, типом рабочего места, зарплатой (если указана), давностью публикации и |
| Одна вакансия полностью — компания, местоположение, инсайты LinkedIn о вакансии и полное описание с развёрнутым блоком «See more». |
| Имя, заголовок, местоположение, текст «О себе», история опыта, образование и навыки. |
| Проверяет, выполнен ли вход в сохранённой сессии браузера. |
| Отключается от Chrome, оставляя окно и сессию нетронутыми. |
Related MCP server: LinkedIn Sales & Navigator MCP Server
Установка
Требуется Python 3.12+, uv и Google Chrome.
git clone https://github.com/TSS99/linkedin-mcp.git
cd linkedin-mcp
uv syncВойдите один раз. Это откроет окно Chrome и будет ждать, пока вы войдёте вручную — скрипт никогда не вводит учётные данные, потому что LinkedIn блокирует скриптовый ввод учётных данных:
uv run linkedin-mcp --loginСессия сохраняется в ~/.linkedin-mcp/chrome-profile. Проверить её можно в любой момент с помощью uv run linkedin-mcp --check, очистить — с помощью uv run linkedin-mcp --logout.
Каким профилем Chrome он управляет
По умолчанию сервер открывает одноразовый собственный профиль. Это окно будет выглядеть как новое — без закладок, расширений, и вход выполнен только в LinkedIn. В этом и смысл: сервер может видеть только LinkedIn.
Если вы предпочитаете, чтобы он управлял вашим обычным Chrome, чтобы использовать уже существующую сессию LinkedIn и не открывать чужое окно, задайте:
LINKEDIN_MCP_PROFILE_DIR=systemили укажите любой каталог профиля явно. В конфигурации MCP-клиента это помещается в блок env:
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["--directory", "/path/to/linkedin-mcp", "run", "linkedin-mcp"],
"env": { "LINKEDIN_MCP_PROFILE_DIR": "system" }
}
}
}Прежде чем это сделать, поймите две вещи:
Вам всё равно придётся один раз перезапустить Chrome. --remote-debugging-port действует только при запуске; его нельзя включить для уже работающего процесса. Поэтому к Chrome, который открыт прямо сейчас, невозможно подключиться, что бы ни говорила настройка профиля. Полностью закройте его (Cmd+Q, а не просто закройте окно) и позвольте серверу запустить его, или запустите сами командой, которую выводит --login.
Порт отладки не ограничен LinkedIn. Всё, что может получить доступ к 127.0.0.1:9224, может управлять каждой вкладкой в этом Chrome и читать каждую сессию в нём — вашу почту, ваш банк, всё — не только LinkedIn. В изолированном профиле больше ничего нет. В вашем обычном профиле есть всё. Запускайте так только на доверенной машине и закрывайте отладочный Chrome, когда закончите.
--logout отказывается удалять профиль, который он не создавал, поэтому указание на ваш настоящий Chrome не может стереть состояние вашего браузера.
Настройка
Добавьте в конфигурацию MCP-клиента (см. mcp-config.example.json):
{
"mcpServers": {
"linkedin": {
"command": "uv",
"args": ["--directory", "/path/to/linkedin-mcp", "run", "linkedin-mcp"]
}
}
}Для Claude Code: claude mcp add linkedin -- uv --directory /path/to/linkedin-mcp run linkedin-mcp
Как это работает и почему
CDP против реального профиля Chrome, а не запущенного браузера. Собственный Chromium от Playwright выдаёт себя десятками способов, которые проверяет LinkedIn. Подключение к реальному Chrome, в который вы вошли сами, сохраняет честность отпечатка и cookie. Сервер работает на отладочном порту 9224, поэтому он сосуществует с другими MCP-серверами, управляющими браузером, на портах 9222/9223.
Навигации замедлены. LinkedIn ограничивает частоту запросов, а не только объём, поэтому goto применяет минимальный интервал с джиттером. Долгий исследовательский прогон медленнее, чем мог бы быть, — намеренно.
Каждая строка в DOM LinkedIn встречается дважды — один раз видимая, один раз в visually-hidden span для программ чтения с экрана — поэтому сырой innerText читается как «Acme Corp\nAcme Corp». dedupe_lines схлопывает повторяющиеся строки; без этого каждое разобранное поле удваивается.
Селекторы — это упорядоченные списки запасных вариантов. Имена классов в LinkedIn обфусцированы и часто переименовываются. Где возможно, парсеры опираются на то, что пережило смену классов — атрибут data-occludable-job-id, стабильные якорные id div#experience — и в качестве запасного варианта разбирают порядок строк в тексте карточки, а не доверяют хуку на каждое поле.
Сломанный парсинг никогда не возвращает пустой результат. Каждый инструмент обёрнут так, что отсутствующий якорь возвращается как {"status": "error", "error_type": "stale_selector", ...} с указанием селектора и URL. LLM, получив [], с полной уверенностью сообщит «вакансий не найдено»; это позволяет отличить поломку инструмента от реального отсутствия результатов.
Тесты
uv run pytestТесты покрывают чистые парсеры — построение URL/фильтров, разбор карточек, разбор записей профиля, дедупликацию строк — на фикстурах в том виде, в каком DOM LinkedIn их реально выдаёт. Им не нужен браузер и сеть.
Когда что-то ломается
Это случится. LinkedIn постоянно меняет разметку, а скрапер — это предположение о чужом HTML. Ожидайте ошибок stale_selector; обычно исправление — это ещё одна запись в списке селекторов в tools/jobs.py или tools/profiles.py, плюс фикстура в tests/test_parsers.py.
Если вы получаете auth_required с URL checkpoint, LinkedIn требует человека: откройте окно Chrome, пройдите проверку и повторите попытку.
О условиях использования
Автоматический доступ противоречит Пользовательскому соглашению LinkedIn, независимо от того, насколько аккуратна реализация, и LinkedIn действительно ограничивает аккаунты за это. Это личный исследовательский инструмент; конструкция «только для чтения» и замедленные запросы снижают риск, но не устраняют его, и аккаунт, на который вы его направляете, несёт этот риск. Используйте своё суждение.
Лицензия
Apache-2.0
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
- FlicenseAqualityNot gradedmaintenanceEnables AI assistants to interact with LinkedIn and LinkedIn Sales Navigator for searching profiles, managing leads, and handling messaging via cookie-based authentication. It supports professional networking tasks such as sending connection requests and retrieving account details through the Model Context Protocol.221
- AlicenseAqualityDmaintenanceEnables searching and scraping of LinkedIn for structured data on people, companies, and job listings. It allows AI clients to retrieve detailed profiles, experience, and activity sections using browser automation.7175MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to search, filter, and extract job listings from LinkedIn using an automated headless browser with semantic AI filtering and deduplication.15MIT
Related MCP Connectors
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
Live LinkedIn data for AI agents: profiles, companies, jobs, posts, email finding. No account risk.
Run LinkedIn outreach from your AI chat: find leads, launch campaigns, send, and reply.
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/TSS99/linkedin-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server