글쓰기 API
Claude 같은 AI 도구나 스크립트가 내 블로그에 글을 쓰게 하는 방법입니다. 토큰은 설정에서 발급합니다.
Claude에 연결하기 (MCP)
주소만 추가하면 브라우저 로그인 창이 뜨고, 허용을 누르면 연결됩니다. 토큰을 복사할 필요가 없습니다.
claude mcp add --transport http latuis-blog https://blog.latuis.com/api/v1/mcp
Claude 데스크톱·웹은 설정 > 커넥터 > 커스텀 커넥터 추가에 같은 주소를 넣으면 됩니다. 추가 화면이 인증 방식과 OAuth 클라이언트를 묻는데, 이 서버는 둘 다 자동으로 감지되므로 기본값 그대로 두면 됩니다 — 인증 "항상 필요", OAuth 클라이언트 "클라이언트 ID 없음(자동으로 등록)". 추가 요청 헤더도 넣을 필요 없습니다.
Claude Code(터미널)는 위 명령으로 추가한 뒤 /mcp에서 인증을 시작하면(대화로 "연결해줘"라고 해도 됩니다)
브라우저 승인 창이 열립니다. 승인 후 브라우저에 localhost 연결 오류가 떠도 실패가 아닙니다 —
원격 서버·컨테이너처럼 브라우저와 터미널이 다른 기기인 경우로, 주소창의
http://localhost:…/callback?code=… 전체 주소를 복사해 터미널에 붙여넣으면 연결이 끝납니다.
연결은 설정 > AI 글쓰기 토큰 목록에 나타나고, 삭제하면 즉시 끊깁니다.
토큰을 직접 발급해 --header "Authorization: Bearer lbk_…" 로 붙이는 방식도 그대로 됩니다.
연결 후 Claude에서: "오늘 공부한 내용 정리해서 블로그에 올려줘".
Claude가 write_post 도구로 글을 쓰며, 기본은 임시글입니다 — 확인하고 발행하거나, 발행까지 시키면 바로 공개됩니다.
도구는 get_my_blog · list_posts · get_post · write_post 네 가지입니다.
이미지는 MCP 도구가 아니라 아래 이미지 항목의 업로드 API를 같은 토큰으로 쓰면 됩니다 —
Claude Code라면 직접 curl로 올리고 받은 주소를 본문에 넣습니다.
ChatGPT·다른 AI 도구에 연결하기
MCP는 특정 회사 전용이 아니라 공개 표준이라, MCP를 지원하는 도구라면 같은 주소로 연결됩니다.
https://blog.latuis.com/api/v1/mcp
ChatGPT는 유료 플랜의 설정 > 커넥터에서 개발자 모드를 켠 뒤 커넥터로 위 주소를 추가하면
Claude와 똑같이 브라우저 로그인 창이 뜨고, 허용하면 연결됩니다(메뉴 이름은 버전에 따라 조금 다를 수 있습니다).
Cursor 등 MCP를 지원하는 다른 도구도 방식은 같습니다 — 주소를 넣고, OAuth 로그인이 안 되는 도구라면
설정에서 토큰을 발급해 Authorization: Bearer lbk_… 헤더로 붙이면 됩니다.
어느 도구로 연결하든 쓰는 도구 네 가지와 "기본은 임시글" 원칙은 동일합니다.
인증
모든 요청에 Authorization: Bearer lbk_… 헤더를 넣습니다. 토큰은 발급 시 한 번만 보이며, 유출되면 설정에서 삭제하세요.
토큰 확인
curl -H "Authorization: Bearer $TOKEN" https://blog.latuis.com/api/v1/me
글 쓰기
마크다운을 권장합니다. publish 를 생략하면 새 글은 임시글로 저장됩니다 — AI 가 쓴 글은 사람이 확인하고 발행하는 흐름을 권장합니다.
이미 발행된 글을 post_id 로 수정할 때는 publish 를 생략해도 발행 상태가 유지됩니다(임시글로 내려가지 않습니다).
curl -X POST https://blog.latuis.com/api/v1/posts \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "오늘 배운 것",
"content_markdown": "## 요약\n\n본문입니다. **강조**와 `코드`, 목록을 쓸 수 있습니다.",
"tags": ["til", "spring"],
"publish": false
}'
응답에는 post_id·url·cover(실제로 커버가 될 이미지)와 warnings 배열이 옵니다.
warnings 는 저장을 막지 않는 안내입니다 — 커버 없음/작음, 요약 없음, 태그 없음처럼 사람이 발행 화면에서 보는 것과 같은 내용이니
AI 클라이언트는 이걸 사용자에게 전하거나 고쳐서 다시 저장하세요.
# 응답 예
{"success": true, "data": {"post_id": 12, "status": "DRAFT", "url": "…", "cover": "/uploads/blog/….jpg",
"warnings": ["excerpt(요약)가 없어 본문 앞 160자가 자동으로 쓰입니다. …"]}}
응답의 post_id 로 같은 글을 수정할 수 있습니다 ("post_id": 123 을 본문에 포함).
발행 전까지는 제목을 바꾸면 주소(슬러그)도 따라 바뀌고, 발행하면 주소가 고정됩니다.
필드
| 필드 | 설명 |
|---|---|
title | 150자. 발행 시 필수 — 임시글은 제목 없이도 저장됩니다 |
content_markdown | 마크다운 본문 (권장) |
content_html | HTML 본문 — 허용 태그 외에는 서버에서 제거됩니다 |
tags | 최대 5개. 영문 소문자·숫자·한글·하이픈만 남습니다 |
excerpt | 요약 300자 (검색·공유 카드용). 비우면 본문에서 자동 |
publish | true 발행 / 생략 시 새 글은 임시글, 발행된 글 수정이면 발행 유지 |
post_id | 있으면 해당 글 수정 |
cover_image | 커버 이미지 경로 (/api/v1/images 로 올린 /uploads/blog/…). 생략하면 본문 첫 이미지가 커버. 가로 1200px 이상이면 검색·공유 카드에 크게 보입니다 |
이미지
외부 이미지 주소는 본문에서 제거됩니다. 먼저 업로드하고 받은 경로를 그대로 마크다운에 쓰세요. 상대 경로 그대로 쓰는 것이 기본이고, 앞에 https://blog.latuis.com을 붙인 절대 주소도 같은 이미지로 인식합니다.
curl -X POST https://blog.latuis.com/api/v1/images \
-H "Authorization: Bearer $TOKEN" \
-F "[email protected]"
# → {"data": {"url": "/uploads/blog/….jpg", "width": 1600, "height": 900}}
# 가로 1200px 미만이면 "hint" 가 함께 옵니다 — 본문용이면 무시해도 되고, 커버로 쓸 거면 더 큰 원본을 올리세요
# 본문: 
파일 하나는 10MB까지, 한 계정이 하루에 올릴 수 있는 양은 200장 · 100MB입니다(브라우저에서 올린 것과 합산). 넘으면
{"success": false, "message": "…다 썼습니다"}가 돌아오고, 자정이 지나면 다시 올릴 수 있습니다.
올린 이미지는 긴 변 1600px로 줄이고 JPEG로 다시 저장합니다(EXIF 제거).
내 글 목록
curl -H "Authorization: Bearer $TOKEN" https://blog.latuis.com/api/v1/posts
글 하나 읽기
curl -H "Authorization: Bearer $TOKEN" https://blog.latuis.com/api/v1/posts/{post_id}
기존 글을 고치기 전에 현재 본문을 읽는 용도입니다. POST /api/v1/posts 에 post_id 를 주면 본문 전체가 바뀌니 먼저 읽고 고치세요.
content_markdown 은 이 API로 쓴 글에만 있습니다. 웹 에디터로 고친 글은 null 이고 content_html 이 원본입니다.
notes 배열에 원문 없음·저장 안 된 수정본 있음 같은 안내가 옵니다.