Skip to main content
Glama
stepanic

linkedin-poster

by stepanic

linkedin-poster

Claude Code, 셸 또는 cron 작업에서 자신의 LinkedIn 피드에 게시하세요. 종속성이 없는 단일 Cloudflare Worker, 세 가지 표면: 에이전트가 직접 게시할 수 있는 MCP 서버, 스크립트용 HTTP API, 그리고 기계가 작성한 산문의 특징을 지닌 텍스트 게시를 거부하는 음성 린터.

좋은 게시물은 자동화할 가치가 있고 나쁜 em-dash는 배포할 가치가 없기 때문에 만들어졌습니다. 이 README에도 em-dash가 없습니다. 그것이 요점입니다.

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에 로그인한 상태에서 인증 엔드포인트를 다시 호출하면 동의 화면을 건너뛰고 그냥 리디렉션됩니다. 따라서 토큰이 만료되기 전에만 하면 7주마다 한 번의 클릭으로 갱신됩니다. 기간을 놓치면 동의 화면이 다시 나타나며, 한 번이 아닌 두 번의 클릭이 필요합니다.

그래서 이 서비스에는 cron 트리거가 포함되어 있습니다. 남은 일수를 계산하여 14일, 7일, 3일, 1일 전에 알림을 보내며, 그 동안 자동 갱신이 여전히 작동합니다.

설정

1. LinkedIn 쪽 (수동, 약 10분)

  1. LinkedIn 페이지가 필요합니다. 개발자 포털에서 앱을 페이지에 연결하고 페이지 관리자가 확인하도록 해야 합니다.

  2. linkedin.com/developers에서 앱을 만드세요. Client IDClient Secret을 기록하세요.

  3. Products 탭에서 둘 다 요청하세요 (Open Permissions이며 즉시 승인됩니다):

    • OpenID Connect를 사용한 LinkedIn 로그인openid, profile

    • LinkedIn에 공유w_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"

세 가지 도구:

도구

기능

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는 게시물 URN과 공개 URL과 함께 201을 반환하고, 린터가 차단하면 422, 토큰이 없거나 만료되었으면 503을 반환합니다.

린터

오류는 게시를 차단하고, 경고는 차단하지 않습니다.

규칙

심각도

이유

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은 2026년 8월 17일에 종료되었습니다. wrangler.jsonc의 값을 유지 관리 항목으로 취급하세요.

  • /v2/ugcPosts는 더 이상 사용되지 않습니다. 이것은 이를 대체한 /rest/posts를 사용합니다.

  • 요청된 범위를 변경하면 모든 기존 토큰이 무효화됩니다. 다시 인증해야 합니다.

  • 회원당 하루 150회 요청. 앱당이 아니라 회원당입니다.

구조

파일

내용

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