저는 X, Bluesky, Mastodon, LinkedIn 및 Reddit을 위한 스케줄러인 Statuz를 구축했습니다. 지난 몇 달 동안 제가 직접 작성한 대부분의 게시물은 작문기(composer)에 입력되지 않았습니다. 저는 Claude Code에게 "오늘 출시된 내용에 대한 짧은 스레드를 내일 오전 9시에 X와 Bluesky에 예약해 주고, 먼저 보여줘"와 같은 요청을 하면, MCP를 통해 나머지 작업을 처리합니다.
이것이 어떻게 작동하는지 설명드리겠습니다: 에이전트가 호출하는 도구들, 일반 단어 시간 지정 방식, 저장 전 확인 절차, 그리고 아무것도 두 번 게시되지 않도록 하는 이유입니다.
모든 명령은 도구이다
Statuz는 CLI(Command Line Interface)로 시작되었습니다. MCP 서버는 별도의 API가 아닙니다. 대신, CLI 명령어당 하나의 도구를 등록하며, 이 도구 이름은 마침표를 언더스코어(_)로 바꾼 명령어 ID입니다. statuz posts create는 posts_create, statuz posts list는 posts_list와 같습니다.
에이전트가 가장 많이 사용하는 도구들:
accounts_list: 연결된 계정과 기본값으로 설정된 계정을 확인합니다.
posts_create: 게시물이나 스레드를 작성한 다음, 이를 발행하거나 예약하거나 초안 상태로 유지합니다.
posts_list 및 posts_get: 대기열(queue)을 읽어옵니다.
posts_edit, posts_delete, posts_publish: 나중에 내용을 변경하는 데 사용됩니다.
media_add: 대체 텍스트와 함께 이미지를 업로드하기 전에 첨부합니다.
각 도구는 MCP의 힌트를 가지고 있어 클라이언트가 읽기(read) 작업인지 쓰기(write) 작업인지를 알 수 있습니다: posts_list는 읽기 전용이며, posts_delete는 파괴적(destructive)입니다. 일부 명령어는 에이전트에게 아예 노출되지 않습니다. 데몬을 시작하거나 중지하는 것, 그리고 비밀 설정을 하는 것은 사용자 본인만 할 수 있습니다.
또한 서버는 미리 하나의 지침을 전송합니다: at 시간이 없는 posts_create는 즉시 게시되므로, 먼저 질문하거나 draft: true 또는 시간을 전달해야 합니다. 이 기능 덕분에 저는 여러 번의 실수로 인한 게시를 막을 수 있었습니다.
일반 단어로 표현하는 시간
at 필드는 ISO 시간 형식이나 일반 단어(
저장되기 전에 검사됩니다
게시물은 큐에 무언가가 쓰여지기 전에 연결될 모든 계정의 제한 사항과 비교하여 검사됩니다. 리포지토리에서 가져온 실제 수치는 다음과 같습니다:
- Bluesky: 300 graphemes, 최대 4개의 이미지, 이미지당 최대 2 MB
- X: 280자 또는 Premium 계정의 경우 25,000자까지 가능하며, X 자체 가중치(링크는 23자, 이모지는 2자로 계산)가 적용됩니다.
- Mastodon: 인스턴스가 정하는 바에 따르며, 기본값은 500입니다.
- Reddit: 제목이 필수이며, 최대 300자까지 가능합니다.
만약 게시물이 특정 목적지(destination)의 제한을 초과하면, invalid_input 오류와 함께 문제별 메시지가 발생하여 호출이 실패합니다. 예시로, Bluesky (you.bsky.social): 342 characters, the limit is 300과 같은 메시지를 받습니다. 에이전트는 이 메시지를 읽고 텍스트를 단축한 후 다시 시도하며, 이는 아무도 지켜보지 않는 다음 날 아침 9시가 아니라 대화(conversation) 속에서 이루어집니다.
게시물은 두 번 나가지 않습니다
에이전트는 재시도합니다. 네트워크는 시간 초과됩니다. 이 두 가지 상황을 처리하는 것이 있습니다:
posts_create 함수는 선택적 idempotencyKey를 받습니다. 동일한 키로 다시 생성하더라도 두 번째 게시물을 만드는 대신 첫 번째 게시물이 반환됩니다. 이는 해당 키의 해시(hash) 이름으로 지정된 잠금장치(lock) 하에서 실행되므로, 같은 키를 가진 두 개의 동시 호출이 모두 성공할 수 없습니다.
- 게시물 발행은 게시물별로 잠금장치를 유지합니다. 따라서 CLI와 데몬(daemon)이 동시에 동일한 게시물을 발행하는 일이 없습니다. 각 목적지의 결과는 도착하는 즉시 저장되므로, 시스템 충돌이 발생해도 이미 나간 내용이 사라지지 않으며, 한 번 발행된 목적지는 다시 게시되지 않고, 부분적으로 발행된 스레드는 멈춘 지점부터 계속됩니다.
하나의 큐(One queue)
Mac 앱은 동일한 CLI를 패키징합니다. 따라서 메뉴 바 앱, 터미널의 statuz CLI, 그리고 에이전트가 통신하는 MCP 서버 모두 동일한 큐를 읽고 쓰게 됩니다. 에이전트가 예약하는 내용은 앱의 달력에 표시되며, 제가 거기서 변경하는 내용이 다음에 에이전트가 posts_list를 호출할 때 보는 내용이 됩니다.
사용해 보기
로컬 환경에서는 무료입니다:
npm i -g statuz-cli
statuz init
statuz accounts connect --platform bluesky
...
statuz mcp는 이 컴퓨터의 Statuz를 stdio를 통해 서비스합니다. X와 LinkedIn은 로컬에서 실행할 때 자체 개발자 앱 키가 필요하며, Bluesky와 Mastodon은 아무것도 필요하지 않습니다.
Claude Code에는 MIT 라이선스가 적용된 statuz-agents 저장소의 플러그인이 있습니다 (플러그인, 스킬 및 MCP 설정; Statuz 자체는 비공개 소스입니다):
/plugin marketplace add intenseloop/statuz-agents
/plugin install statuz@statuz
Claude나 ChatGPT의 경우, https://api.statuz.cloud/mcp를 사용하여 사용자 지정 커넥터를 추가하고 로그인합니다. 이것이 Statuz Cloud이며, 노트북을 덮어두는 동안에도 게시물을 계속 작성해 줍니다. 선불 크레딧(5달러부터, 6개월 사용 가능)을 통해 발행된 포스트당 비용을 지불하는 방식입니다: Bluesky, Mastodon, LinkedIn 및 Reddit에서는 $0.01, X에서는 $0.03, 링크가 포함된 X에서는 $0.30입니다. 초안 작성(Drafts), 예약, 편집, 에이전트 호출, 실패한 포스트는 무료이며 구독료는 없습니다.
그런 다음