Skip to main content
Glama
stepanic

linkedin-poster

by stepanic

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 (вручную, около десяти минут)

  1. Вам нужна страница LinkedIn. Портал разработчика заставляет привязать приложение к ней и получить подтверждение администратора страницы.

  2. Создайте приложение на linkedin.com/developers. Запишите Client ID и Client Secret.

  3. Вкладка Products, запросите оба (это открытые разрешения, одобряются мгновенно):

    • Sign In with LinkedIn using OpenID Connectopenid, profile

    • Share on LinkedInw_member_social

  4. Вкладка 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 deploy

3. Подключите свой аккаунт

Откройте 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

Что делает

linkedin_post

Проверяет линтером, затем публикует. Отказывает при ошибках, если не force: true.

linkedin_check

Проверяет линтером без публикации. Используйте при черновике.

linkedin_status

От имени кого публикует и сколько дней осталось у токена.

Затем в сессии: «проверь этот черновик линтером, затем опубликуй».

Использование из оболочки

# 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

Почему

no-em-dash, no-en-dash

error

Самый явный признак сгенерированной прозы. Запятая или точка всегда работают.

max-length

error

LinkedIn отклоняет комментарии длиннее 3000 символов.

empty

error

Очевидно, но легко попасть при передаче из файла.

no-markdown-bold, no-markdown-link, no-markdown-heading, markdown-bullets

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

Содержимое

src/index.ts

Маршруты, поток OAuth, напоминание cron

src/linkedin.ts

Вызовы OAuth и Posts API, все конечные точки в одном месте

src/mcp.ts

MCP-сервер, рукописный JSON-RPC, без состояния

src/lint.ts

Голосовой линтер

src/tokens.ts

Запись токена 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 dev

wrangler dev --local даёт локальный KV, так что весь поток, кроме реальных вызовов LinkedIn, можно проверить без учётных данных.

Лицензия

MIT. Правила в src/lint.ts — мои; механизм можете забирать.

-
license - not tested
Not graded
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

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/stepanic/linkedin-poster'

If you have feedback or need assistance with the MCP directory API, please join our Discord server