linkedin-safe-mcp
linkedin-safe-mcp
Сервер MCP, который даёт AI-агентам (Claude Code, Codex, Claude Desktop, Cursor, …) суперспособности LinkedIn — без риска для вашего аккаунта LinkedIn:
Публикация в LinkedIn — текст, ссылки и изображения через официальный API LinkedIn (OAuth, соответствует ToS), плюс комментарии и лайки.
Поиск вакансий — фильтры по ключевым словам/локации/удалёнке/опыту/дате через публичные гостевые эндпоинты LinkedIn. Без логина и cookies: ваш аккаунт не задействуется.
Ведение поиска работы — локальный трекер заявок на SQLite (заинтересован → откликнулся → собеседование → оффер) с заметками и снимками каждой вакансии, чтобы агент мог управлять вашим пайплайном и писать персонализированные сопроводительные письма даже после удаления вакансии.
Почему такая архитектура?
У LinkedIn нет официального API для поиска вакансий, а неофициальные пути (внутренний API Voyager с вашей сессионной cookie li_at, headless-браузеры на вашей залогиненной сессии) нарушают Пользовательское соглашение LinkedIn §8.2 и регулярно приводят к ограничению аккаунтов. Этот сервер намеренно выбирает компромисс:
Проблема | Как решается | Риск для аккаунта |
Публикация, комментарии, лайки | Официальный REST API, ваше собственное OAuth-приложение, | Нет — санкционировано |
Поиск вакансий и детали | Гостевые эндпоинты (страницы вакансий для неавторизованных), лимит по IP | Нет — никакие учётные данные не задействованы |
Трекинг заявок | Локальная SQLite на вашей машине | Нет — никогда не касается LinkedIn |
Easy Apply, личные сообщения, чтение ленты | Намеренно не включено — невозможно без доступа, нарушающего ToS | — |
Требования
Python 3.11+ и uv
Только для публикации: бесплатное self-serve приложение разработчика LinkedIn (настройка за 5 минут ниже). Поиск вакансий и трекер работают без какой-либо настройки.
Установка и подключение к агенту
Склонируйте/скопируйте этот каталог, затем зарегистрируйте его в вашем MCP-клиенте. <REPO> ниже — абсолютный путь к этому проекту.
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Или в .mcp.json проекта:
{
"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) — та же JSON-структура, что и .mcp.json выше.
Переменные LINKEDIN_CLIENT_* нужны только для публикации; опустите их, если вам нужны только поиск вакансий и трекер.
Включение публикации (одноразовая настройка приложения LinkedIn)
Перейдите на https://www.linkedin.com/developers/apps → Create app (требуется привязать любую страницу LinkedIn; можно создать тривиальную).
На вкладке Products приложения добавьте Share on LinkedIn и Sign In with LinkedIn using OpenID Connect.
На вкладке Auth добавьте redirect URL
http://localhost:8765/callback.Скопируйте Client ID и Client Secret в переменные окружения, показанные выше.
Авторизуйтесь один раз — любым способом:
В терминале:
uv run --directory <REPO> linkedin-safe-mcp authИли просто попросите агента что-нибудь опубликовать; он вызовет инструмент
loginи передаст вам URL авторизации.
Токены хранятся в ~/.linkedin-mcp/tokens.json (режим 0600) и действуют ~60 дней; LinkedIn не выдаёт refresh-токены self-serve приложениям, поэтому при истечении срока нужно повторно выполнить вход (auth_status сообщает агенту точное время).
Инструменты
Инструмент | Нужна авторизация | Что делает |
| – | Сообщает состояние конфигурации/авторизации с точными следующими шагами |
| – | Браузерный OAuth-поток / удаление сохранённых токенов |
| ✓ | Имя, email, person URN подключённого аккаунта |
| ✓ | Опубликовать пост: текст (+хэштеги), опциональная ссылка или локальное изображение; |
| ✓ | Удалить один из ваших постов (URN или URL поста) |
| ✓ | Оставить комментарий к посту (URN или URL поста) |
| ✓ | Поставить лайк посту (URN или URL поста) |
| – | Фильтры: локация, удалёнка/гибрид/офис, время публикации, уровни опыта, типы занятости, только Easy Apply, сортировка; до 50 результатов |
| – | Полное описание вакансии: описание, уровень, тип, зарплата если указана, количество откликов, внешний URL для отклика |
| – | Сохранить снимок вакансии в локальный трекер |
| – | Одна вакансия с историей / обзор пайплайна со счётчиками статусов |
| – | заинтересован → откликнулся → собеседование → оффер / rejected / withdrawn / archived, с заметками |
| – | Добавить заметку / удалить вакансию |
Что агенты могут делать с этим: "найди удалённые роли staff-инженера, опубликованные на этой неделе, сохрани перспективные, составь персонализированные сопроводительные письма из сохранённых описаний, отметь те, на которые я откликнулся, и опубликуй сводку о своей open-source работе."
Конфигурация
Переменная окружения | По умолчанию | Назначение |
| – | Учётные данные приложения LinkedIn (только для публикации) |
|
| Где хранятся токены и БД трекера |
|
| Порт OAuth-колбэка (должен совпадать с redirect URL приложения) |
|
| Заголовок |
|
|
|
| Chrome UA | UA для гостевых запросов к вакансиям |
Поведение и ограничения
Публикация: LinkedIn ограничивает публикацию участников 150 запросами/день и отклоняет точные дубликаты недавних постов (422). Зарезервированные символы в тексте поста автоматически экранируются для версионированного API, чтобы скобки не вызывали ошибок; хэштеги сохраняются.
Поиск вакансий: гостевые эндпоинты ограничены по IP (HTTP 429). Сервер кэширует результаты (10 минут для поисков / 6 часов для деталей вакансий), повторяет запросы с экспоненциальной задержкой и распределяет многостраничные запросы; при устойчивом 429 возвращает агенту понятную ошибку «подождите минуту». Держите
limitумеренным.Позиция по скрейпингу: гостевой поиск вакансий читает те же публичные страницы, что видит неавторизованный посетитель, с умеренной скоростью и кэшированием для минимизации нагрузки. Тем не менее, LinkedIn может в любой момент изменить или закрыть эти эндпоинты — парсеры закреплены фикстурными тестами, так что поломка обнаруживается громко, а ошибки инструментов остаются понятными для агента.
Разработка
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Структура: src/linkedin_mcp/ — server.py (поверхность инструментов) · api/ (официальный REST: посты, социальные действия, загрузки, двойной rest/ugc-бэкенд) · auth/ (OAuth + хранилище токенов) · jobs/ (гостевой клиент, HTML-парсеры, маппинги фильтров) · tracker/ (SQLite-хранилище) · cli.py (serve | auth | status | logout).
Дорожная карта
Публикация на PyPI (
uvx linkedin-safe-mcpодной строкой)Типы реакций кроме лайка; посты с несколькими изображениями; посты-опросы
Опциональные сторонние провайдеры данных о вакансиях за той же схемой инструментов
Транспорт
streamable-httpдля удалённого/хостингового использования(Рассматривается, только opt-in, по умолчанию выключено) cookie-основанный провайдер Voyager для персонализированных функций — с громкими предупреждениями, так как это нарушает ToS LinkedIn
Лицензия
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