linkedin-poster
linkedin-poster
Публикуйте в свою собственную ленту LinkedIn из Claude Code, из оболочки или по расписанию cron. Один Cloudflare Worker, без зависимостей, три поверхности: MCP-сервер, чтобы агент мог публиковать напрямую, HTTP API для скриптов и голосовой линтер, который отказывается публиковать текст, несущий признаки машинной прозы.
Создано, потому что хороший пост стоит автоматизировать, а плохое тире не стоит публиковать. В этом README тоже нет тире, в этом и суть.
Claude Code ──MCP──┐
├──> Worker ──> LinkedIn Posts API ──> your feed
curl / CI ──HTTP───┘ │
└──> KV (one 60-day token) + daily cron reminderЧем это не является
Это публикует от имени одного участника: вас. Это не SaaS для планирования, не мультитенантный инструмент и не затрагивает чужие аккаунты. Всё, что ему нужно, — самообслуживание; никакая партнёрская программа LinkedIn не задействована.
Ограничение, которое определяет всё
Токены доступа LinkedIn действуют 60 дней, а программные токены обновления доступны только одобренным партнёрам Marketing Developer Platform. Самообслуживаемое приложение никогда их не получит. Обойти это невозможно, и любое руководство, обещающее настройку и забывание автоматизации LinkedIn, ошибочно.
Что есть: пока ваш текущий токен действителен и вы вошли в LinkedIn, повторное обращение к конечной точке авторизации пропускает экран согласия и просто перенаправляет. Так что продление — это один клик каждые семь недель, если сделать это до истечения токена. Пропустите окно — и снова появится экран согласия, что уже два клика вместо одного.
Именно поэтому этот сервис поставляется с триггером cron. Он отсчитывает дни и уведомляет вас за 14, 7, 3 и 1 день, пока тихое продление ещё работает.
Настройка
1. Сторона LinkedIn (вручную, около десяти минут)
Вам нужна страница LinkedIn. Портал разработчика заставляет привязать приложение к ней и получить подтверждение администратора страницы.
Создайте приложение на linkedin.com/developers. Запишите Client ID и Client Secret.
Вкладка Products, запросите оба (это открытые разрешения, одобряются мгновенно):
Sign In with LinkedIn using OpenID Connect →
openid,profileShare on LinkedIn →
w_member_social
Вкладка Auth → добавьте URL перенаправления. Он должен быть HTTPS, абсолютным и совпадать с
REDIRECT_URIпосимвольно:https://your-worker.example.com/auth/callback
2. Сторона Worker
git clone https://github.com/stepanic/linkedin-poster.git
cd linkedin-poster
npm install
# KV to hold the token
npx wrangler kv namespace create TOKENS
npx wrangler kv namespace create TOKENS --preview
# paste both ids into wrangler.jsonc
# edit wrangler.jsonc: name, routes, REDIRECT_URI, account_id
npx wrangler secret put LINKEDIN_CLIENT_ID
npx wrangler secret put LINKEDIN_CLIENT_SECRET
npx wrangler secret put API_TOKEN # openssl rand -hex 32, guards /post and /mcp
npx wrangler secret put SETUP_KEY # openssl rand -hex 32, guards /auth/start
npx wrangler secret put NOTIFY_WEBHOOK # optional, any URL taking a JSON POST
npm run deploy3. Подключите свой аккаунт
Откройте https://your-worker.example.com/auth/start?key=<SETUP_KEY> в браузере, один раз подтвердите, готово. Страница покажет дату истечения.
SETUP_KEY — не украшение. Без него любой, кто найдёт URL, сможет привязать свой аккаунт LinkedIn к вашему Worker и перезаписать сохранённый токен.
Использование из Claude Code
claude mcp add --transport http linkedin https://your-worker.example.com/mcp \
--header "Authorization: Bearer $API_TOKEN"Три инструмента:
Tool | Что делает |
| Проверяет линтером, затем публикует. Отказывает при ошибках, если не |
| Проверяет линтером без публикации. Используйте при черновике. |
| От имени кого публикует и сколько дней осталось у токена. |
Затем в сессии: «проверь этот черновик линтером, затем опубликуй».
Использование из оболочки
# dry run: lint only, publish nothing
curl -s -X POST https://your-worker.example.com/post \
-H "Authorization: Bearer $API_TOKEN" -H 'Content-Type: application/json' \
-d '{"text":"…","dry_run":true}'
# publish
curl -s -X POST https://your-worker.example.com/post \
-H "Authorization: Bearer $API_TOKEN" -H 'Content-Type: application/json' \
-d '{"text":"…","visibility":"PUBLIC"}'
# token state
curl -s https://your-worker.example.com/status -H "Authorization: Bearer $API_TOKEN"/post возвращает 201 с URN поста и его публичным URL, 422, когда линтер блокирует, 503, когда токен отсутствует или недействителен.
Линтер
Ошибки блокируют публикацию; предупреждения — нет.
Rule | Severity | Почему |
| error | Самый явный признак сгенерированной прозы. Запятая или точка всегда работают. |
| error | LinkedIn отклоняет комментарии длиннее 3000 символов. |
| error | Очевидно, но легко попасть при передаче из файла. |
| warning | LinkedIn не отображает ничего из этого. Звёздочки и решётки отображаются буквально. |
Дефисы никогда не помечаются. read-only tier, two-day sprint и per-client limits — корректны и должны оставаться. Ошибками являются только U+2014 и U+2013.
Редактирование src/lint.ts — это предполагаемый способ сделать проект своим. Правила кодируют писательские условности одного человека, а не универсальный стандарт.
Что вас удивит
Posts API не извлекает URL. Ссылка в вашем тексте остаётся голой ссылкой. Настоящая карточка предпросмотра требует миниатюру, загруженную через Images API, плюс блок
content.article. Здесь пока не реализовано.LinkedIn-Versionобязателен, и версии выводятся из эксплуатации.202508отключился 17 августа 2026 года. Относитесь к значению вwrangler.jsoncкак к пункту обслуживания./v2/ugcPostsустарел. Здесь используется/rest/posts, который заменил его.Изменение запрашиваемых областей делает недействительными все существующие токены. Вам придётся авторизоваться заново.
150 запросов на участника в день. На участника, а не на приложение.
Структура
File | Содержимое |
| Маршруты, поток OAuth, напоминание cron |
| Вызовы OAuth и Posts API, все конечные точки в одном месте |
| MCP-сервер, рукописный JSON-RPC, без состояния |
| Голосовой линтер |
| Запись токена KV, расчёт срока действия, сравнение секретов, безопасное по времени |
Локальная разработка
cp .dev.vars.example .dev.vars # fill in, never commit
npm run types # regenerate Env after editing wrangler.jsonc
npm run typecheck
npm run devwrangler dev --local даёт локальный KV, так что весь поток, кроме реальных вызовов LinkedIn, можно проверить без учётных данных.
Лицензия
MIT. Правила в src/lint.ts — мои; механизм можете забирать.
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
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.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
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/stepanic/linkedin-poster'
If you have feedback or need assistance with the MCP directory API, please join our Discord server