tistory-mcp
An unofficial MCP server for Tistory blogs that lets an AI read, write, edit, upload images to, and manage posts with human-reviewed publishing and private-by-default safety.
Log in via browser/Kakao and check saved session status.
List categories and posts, including private/protected posts, and fetch a post’s metadata and rendered HTML body.
Fetch public posts from any Tistory blog via RSS without login.
Publish new posts, update full post bodies, change title/category/visibility/tags/slug, and permanently delete posts with explicit confirmation.
Upload images and return substitution/attachment references for safe embedding.
Save a draft into the editor’s single autosave slot.
Convert markdown to Tistory editor-formatted HTML and enforce publishing rate limits.
Provides tools for managing posts on a user's Tistory blog via browser-cookie-authenticated internal APIs: publishing new posts (private by default), editing and deleting posts, listing posts including private/ protected ones, reading post content as rendered HTML, fetching categories, uploading images, saving drafts, and reading public posts from any Tistory blog via RSS. Also converts Markdown into Tistory editor-formatted HTML.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tistory-mcp내 티스토리 블로그에 파이썬 초보자 팁에 대한 새 글을 비공개로 써줘"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
비공식 · 카카오/티스토리와 무관. 티스토리 Open API 는 2024년 2월에 종료되었습니다. 이 프로젝트는 브라우저에서 카카오 로그인을 한 번 마친 뒤 내 PC 에 저장한 쿠키로, 티스토리 관리자 화면이 쓰는 내부 JSON API 를 호출합니다. 카카오·티스토리와 아무 관계가 없고, 티스토리 내부가 바뀌면 언제든 멈출 수 있습니다. 엔드포인트 지식은 MIT 라이선스로 공개된 kim-se-hee/tistory-mcp 의 실측 문서를 따릅니다 — 그 프로젝트는 npm 에
tistory-mcp로 배포되는 별개의 TypeScript 프로젝트입니다.npx tistory-mcp와uvx tistory-mcp는 서로 다른 프로젝트이며, 이 저장소는 Python/PyPI 쪽입니다.
왜 tistory-mcp 인가
글쓰기는 AI, 공개는 사람. 발행 기본값이 비공개입니다. AI 가 쓴 글을 티스토리에서 직접 읽어 본 뒤 공개로 바꾸는 흐름이 기본이고, 공개 발행은 사용자가 명시적으로 요청해야 합니다.
내 PC 를 벗어나지 않습니다. 로그인 쿠키는 로컬 0600 파일(또는 OS keyring)에만 저장되고, 티스토리 외 어디에도 전송되지 않습니다. 텔레메트리 없음.
클라이언트를 가리지 않습니다. 표준 stdio MCP 서버라 Claude Code, Claude Desktop, Cursor, VS Code, Codex CLI, Gemini CLI 등 어디서나 같은 11개 도구를 씁니다.
Related MCP server: WP Pinch
기능
마크다운 → 티스토리 에디터 서식(
data-ke-*속성)이 붙은 HTML 변환. 제목·표·인용·목록·이미지가 에디터로 쓴 글처럼 보입니다(코드 블록은 일반<pre><code>로 나갑니다).새 글 발행(비공개 기본) · 본문 수정 · 삭제 · 카테고리 조회 · 비공개 글을 포함한 목록과 본문 조회.
이미지 업로드 — 본문에 넣을 치환자와 첨부 참조를 함께 돌려줘 이미지가 나중에 깨지지 않게 합니다.
에디터 자동저장 슬롯에 초안 저장("이어서 작성"으로 복원).
로그인 없이 아무 티스토리 블로그의 공개 글 RSS 조회.
터미널 CLI(
login/status/logout) — MCP 클라이언트의 도구 타임아웃을 피해 터미널에서 로그인.
안전 기본값
항목 | 기본 동작 | 바꾸려면 |
발행 공개 범위 | 비공개(private) | 도구 호출에 |
삭제 |
| — |
발행·수정 속도 | 60초 간격, 하루 20회(프로세스 안 스레드 락) |
|
발행 재시도 | 자동 재시도 없음 — | — |
대상 호스트 |
|
|
브라우저 CDP 주소 | loopback( |
|
본문 HTML | nh3 로 정화 — | — |
이미지 치환자 |
| — |
빠른 시작 (3단계)
1. 설치
uv 가 있으면 uvx 가 패키지를 받아 실행합니다.
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"로그인 창을 띄울 브라우저가 필요합니다. Chrome 또는 Edge 가 설치돼 있으면 이 단계는 건너뛰어도 됩니다 (로그인은 번들 Chromium → Chrome → Edge 순으로 시도).
uvx tistory-mcp install-browser # Playwright Chromium 다운로드, 최초 1회 약 300MBpipx install tistory-mcp # 또는 가상환경에서 pip install tistory-mcp
tistory-mcp --version이 경우 클라이언트 설정의 command 는 uvx 대신 tistory-mcp 로, args 는 빈 배열로 둡니다.
git clone https://github.com/jangsejong/tistory-mcp.git
cd tistory-mcp
bash scripts/setup.sh # venv + 의존성 + Chromium + ruff/pytest (--no-browser 로 Chromium 생략)
claude mcp add tistory -- "$PWD/.venv/bin/tistory-mcp"개발 보조 스크립트:
python scripts/mcp_probe.py .venv/bin/tistory-mcp # initialize + tools/list 핸드셰이크
python scripts/mcp_call.py .venv/bin/tistory-mcp -- tistory_fetch_public_posts '{"blog_url":"example.tistory.com","limit":3}'
python scripts/mcp_call.py .venv/bin/tistory-mcp -- tistory_publish_post @args.json # 긴 본문은 @파일2. 클라이언트에 등록
Claude Code 예시(다른 클라이언트는 아래):
claude mcp add tistory --scope user -- uvx tistory-mcp3. 블로그 연결
새 세션을 열고 AI 에게 말합니다.
내 티스토리 블로그 myblog.tistory.com 연결해줘
브라우저 창이 뜨면 카카오 로그인 → 카카오톡 푸시 승인을 직접 마칩니다. 쿠키가 저장되면 끝입니다. 이후에는 세션이 만료될 때까지 브라우저 없이 동작합니다. 세션 수명은 일정하지 않습니다 — 실측(2026-10-27)에서 어떤 세션은 로그인 뒤 한 시간 남짓 만에 만료됐고, 다른 세션은 90분 동안 호출이 없어도 다섯 시간 가까이 유지됐다가 여섯 시간 쉬는 사이에 만료됐습니다. 만료되면 도구가 알려 주므로 다시 로그인하면 됩니다.
바로 써 볼 만한 요청:
./post.md를 '개발' 카테고리에 비공개로 올려줘. 태그는 python, mcp.
클라이언트별 설정
대부분의 클라이언트는 아래 한 줄이면 됩니다. 환경변수는 각 클라이언트의 env 항목으로 넘깁니다.
{"mcpServers":{"tistory":{"command":"uvx","args":["tistory-mcp"]}}}claude mcp add tistory --scope user -- uvx tistory-mcp
claude mcp list # 확인
claude mcp remove tistory--scope user 는 모든 프로젝트에서, 생략(local)하면 현재 프로젝트에서만 보입니다. 프로젝트에 .mcp.json 을 두는 project 범위도 있습니다(이 저장소의 .mcp.json.example 참고).
플러그인으로 설치할 수도 있습니다(같은 uvx tistory-mcp 를 등록):
/plugin marketplace add jangsejong/tistory-mcp
/plugin install tistory@tistory-mcp
``` 로그인 도구가 도중에 끊기면 서버 항목에 `"timeout"`(밀리초)을 주거나 `MCP_TOOL_TIMEOUT` 환경변수를 늘리고, 그래도 안 되면 터미널에서 `tistory-mcp login` 을 쓰세요.
</details>
<details>
<summary>Claude Desktop</summary>
설정 파일(Claude 메뉴 → Settings → Developer → Edit Config):
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
```json
{
"mcpServers": {
"tistory": {
"command": "uvx",
"args": ["tistory-mcp"]
}
}
}저장 후 Claude Desktop 을 완전히 종료했다가 다시 엽니다. macOS 의 GUI 앱은 셸의 PATH(~/.local/bin 등)를 못 볼 수 있으니 서버가 뜨지 않으면 command 에 which uvx 결과(절대경로)를 넣으세요.
전역 ~/.cursor/mcp.json 또는 프로젝트 .cursor/mcp.json:
{
"mcpServers": {
"tistory": {
"command": "uvx",
"args": ["tistory-mcp"]
}
}
}위의 "Install in Cursor" 버튼을 눌러도 같은 설정이 들어갑니다.
워크스페이스 .vscode/mcp.json (VS Code 는 mcpServers 가 아니라 servers 키를 씁니다):
{
"servers": {
"tistory": {
"type": "stdio",
"command": "uvx",
"args": ["tistory-mcp"]
}
}
}사용자 프로필에 두려면 명령 팔레트에서 MCP: Open User Configuration 으로 mcp.json 을 열어 같은 내용을 넣거나, 터미널에서 code --add-mcp '{"name":"tistory","type":"stdio","command":"uvx","args":["tistory-mcp"]}' 를 실행합니다. 위의 "Install in VS Code" 버튼도 같은 일을 합니다.
codex mcp add tistory -- uvx tistory-mcp또는 ~/.codex/config.toml:
[mcp_servers.tistory]
command = "uvx"
args = ["tistory-mcp"]Codex 의 도구 호출 제한(tool_timeout_sec)은 기본 60초라 브라우저 로그인이 그 안에 끝나기 어렵습니다. 같은 테이블에 tool_timeout_sec = 600 을 두거나, 터미널에서 tistory-mcp login myblog.tistory.com 으로 먼저 로그인해 두세요.
gemini mcp add -s user tistory uvx tistory-mcp또는 ~/.gemini/settings.json (프로젝트는 .gemini/settings.json):
{
"mcpServers": {
"tistory": {
"command": "uvx",
"args": ["tistory-mcp"]
}
}
}그 밖의 클라이언트는 위의 공통 JSON(mcpServers 형식)을 해당 클라이언트의 MCP 설정 파일에 넣으면 됩니다.
첫 로그인
tistory_session_init 도구(또는 AI 에게 "블로그 연결해줘")가 브라우저 창을 띄웁니다. 카카오 로그인과 카카오톡 푸시 승인은 사용자가 직접 합니다 — 이 2단계 인증은 자동화할 수 없고, 그래서 완전 무인 운영은 설계상 불가능합니다. 로그인이 끝나면 쿠키만 저장되고 창은 닫힙니다.
창이 안 뜨거나 클라이언트가 기다려 주지 않을 때의 대안 세 가지:
1) 터미널에서 로그인(권장) — MCP 클라이언트의 도구 타임아웃과 무관하게 최대 5분(--timeout)을 기다립니다.
tistory-mcp login myblog.tistory.com # uvx 사용 시: uvx tistory-mcp login myblog.tistory.com
tistory-mcp status myblog.tistory.com # 저장된 세션과 유효 여부
tistory-mcp logout myblog.tistory.com # 세션 삭제2) 이미 떠 있는 브라우저에 붙기 (WSL · SSH · 컨테이너 등 화면이 없는 환경) — 화면이 있는 쪽(예: Windows 데스크톱)에서 원격 디버깅 포트를 열고 브라우저를 띄운 뒤, 서버에는 그 주소만 알려 줍니다.
:: Windows 데스크톱 — Edge 또는 Chrome
msedge --remote-debugging-port=9222 --user-data-dir=%TEMP%\tistory-login
chrome --remote-debugging-port=9222 --user-data-dir=%TEMP%\tistory-login# WSL 등 서버 쪽
tistory-mcp login myblog.tistory.com --cdp-url http://127.0.0.1:9222
# 도구로 할 때는 cdp_url="http://127.0.0.1:9222", 또는 환경변수 TISTORY_MCP_CDP_URL붙은 브라우저의 쿠키를 읽어 오므로, 평소 쓰는 프로필 대신 전용 --user-data-dir 를 쓰는 것을 권합니다. CDP 주소는 기본적으로 loopback 만 허용됩니다.
3) 원격 서버 — 로컬 PC 에서 2) 처럼 브라우저를 띄운 뒤, 로컬 PC 에서 서버로 접속하면서 서버 쪽 포트를 내 브라우저로 역방향 포워딩합니다. 서버에서는 여전히 127.0.0.1:9222 로 보이므로 원격 허용 설정이 필요 없습니다.
ssh -R 9222:127.0.0.1:9222 user@server # 로컬 PC 에서 실행 — 서버의 127.0.0.1:9222 → 내 브라우저도구
도구 | 종류 | 설명 | 로그인 |
| 쓰기 | 브라우저를 열어 카카오 로그인 → 쿠키 저장. | 이 도구가 로그인 |
| 읽기 | 저장된 세션 유무·저장 시각·만료 예정, 그리고 지금 유효한지(관리자 API 1회 호출) | 불필요 |
| 읽기 | 카테고리 트리(정수 id). 발행·수정의 | 필요 |
| 읽기 | 관리자 글 목록(비공개·보호 글 포함). 키워드·검색 범위·공개 범위·카테고리·페이지 | 필요 |
| 읽기 | 글 메타 + 스킨으로 렌더된 본문 HTML. 비공개 글도 읽음 | 필요 |
| 읽기 | 아무 블로그의 공개 글 RSS(최대 50건, 본문 포함 옵션) | 불필요 |
| 쓰기 | 새 글 발행. 마크다운 → 에디터 서식 HTML. 기본 비공개. 속도 제한. 오류 뒤 자동 재시도 금지(항상 새 글이 생김) | 필요 |
| 쓰기 | 본문 전체 교체. 제목·카테고리·공개 범위·슬러그·태그는 생략하면 유지. | 필요 |
| 파괴적 | 영구 삭제. | 필요 |
| 쓰기 | 이미지(png/jpg/gif/webp, 20MB) 업로드 → | 필요 |
| 쓰기 | 에디터 자동저장 슬롯(1개) 에 초안 기록 — 다음에 글쓰기를 열면 "이어서 작성"으로 복원. "임시저장 N개" 목록이 아니며 다시 저장하면 덮어씀 | 필요 |
도구 설명은 영문과 한국어를 병기해 어느 언어로 대화해도 같은 안내를 받습니다.
이런 식으로 써보세요
myblog.tistory.com 카테고리 보여줘./post.md 를 '개발' 카테고리에 비공개로 올려줘. 태그는 python, mcp./diagram.png 올려서 두 번째 문단 뒤에 넣고, 비공개로 발행해줘검토했어. 방금 올린 글 공개로 바꿔줘제목에 '회고' 들어간 글 찾아서 오타만 고쳐줘. 공개 상태는 그대로example.tistory.com 최근 글 5개 요약해줘 (남의 블로그 공개 글 — 로그인 불필요)이 내용은 초안으로만 저장해 둬. 발행은 하지 말고내 블로그 세션 아직 살아 있어?발행 워크플로
AI 가 쓰고 사람이 검토한 뒤 공개하는 기본 흐름입니다.
tistory_get_categories— 카테고리 id 를 얻습니다(이름은 받지 않음).tistory_upload_image— 이미지마다 호출해substitution은 본문에,attachment_ref는attachments목록에 넣습니다.tistory_publish_post— 마크다운 본문으로 비공개 발행. 응답의 글 번호를 기억합니다.티스토리 관리자 화면에서 글을 읽어 봅니다. 고칠 게 있으면 AI 에게 말해
tistory_update_post로 본문을 다시 보냅니다(마크다운이면content_format="markdown").마음에 들면
tistory_update_post에visibility="public"— 이때 비로소 공개됩니다.
발행이 오류나 타임아웃으로 끝났다면 바로 다시 호출하지 말고 tistory_list_posts 로 글이 생겼는지 먼저 확인하세요. 서버는 호출마다 새 글을 만듭니다.
환경변수
변수 | 기본값 | 설명 |
|
| 세션·속도 제한 상태 파일 위치. |
|
|
|
|
| 발행·수정 사이 최소 간격(초). |
|
| 하루 발행·수정 상한. |
| (없음) |
|
| (없음) |
|
| (없음) |
|
|
| stderr 로그 레벨 |
클라이언트 설정의 env 로 넘긴 값은 클라이언트를 다시 시작해야 반영됩니다.
세션 파일 위치 (file 저장소, 권한 0600):
OS | 경로 |
Linux / macOS |
|
Windows |
|
keyring | 서비스 |
같은 디렉터리의 ratelimit.json 이 속도 제한 상태입니다.
검증 현황
도구 | 실제 블로그 검증 | 비고 |
| 완료 | |
| 완료 | |
| 완료 | |
| 완료 | |
| 완료 | |
| 완료 | |
| 완료 | |
| 완료 | 비공개 발행 → 공개 페이지에서 에디터 서식 속성 유지 확인 |
| 완료 | |
| 완료 | 업로드 → 치환자 검증 통과 → 이미지 포함 발행 → 렌더 확인 |
| 완료 | 자동저장 슬롯 되읽기로 확인 |
11개 도구 모두 실제 블로그에서 확인했습니다(2026-10-27, 비공개 테스트 글로 검증 뒤 삭제). 티스토리 쪽 변경으로 동작이 달라지면 이슈로 알려 주세요(쿠키·세션 파일은 첨부하지 마세요).
문제 해결 / FAQ
더 자세한 내용은 docs/TROUBLESHOOTING.md.
"세션이 만료되었습니다" — 로그인 세션 쿠키(
TSSESSION)는 만료일이 없는 세션 쿠키라 서버 쪽에서 끊깁니다. 실측에서는 한 시간 남짓 만에 만료된 세션도, 다섯 시간 가까이 유지되다 여섯 시간 쉬는 사이에 만료된 세션도 있어 수명을 예측할 수 없습니다. 하룻밤 지나면 다시 로그인한다고 보면 됩니다.tistory_session_init을 다시 실행하거나 터미널에서tistory-mcp login myblog.tistory.com.Executable doesn't exist/ 브라우저를 찾지 못함 —tistory-mcp install-browser로 Chromium 을 받거나 Chrome/Edge 를 설치하세요. 로그인은 번들 Chromium → Chrome → Edge 순으로 시도합니다.로그인 창이 안 보임 (WSL · SSH · 컨테이너) — 화면이 있는 쪽에서
--remote-debugging-port=9222로 브라우저를 띄우고cdp_url로 붙으세요. 첫 로그인 참고.로그인 중 클라이언트가 타임아웃 — 터미널에서
tistory-mcp login myblog.tistory.com으로 먼저 로그인해 두면 도구는 저장된 쿠키만 씁니다. Codex CLI 는tool_timeout_sec, Claude Code 는 서버 항목의timeout으로 제한을 늘릴 수도 있습니다.커스텀 도메인 블로그 —
blog_url은 원래 주소myblog.tistory.com을 권장합니다. 커스텀 도메인을 그대로 써야 하면TISTORY_MCP_ALLOW_ANY_HOST=1."간격 제한" / "일일 상한" 오류 — 기본 60초·20회/일 입니다.
TISTORY_MCP_MIN_INTERVAL_SEC,TISTORY_MCP_DAILY_CAP으로 조정(0 = 해제). 상한은 발행·수정 합산이며TISTORY_MCP_HOME/ratelimit.json에 기록됩니다.이미지가 15일쯤 뒤에 깨짐 — 발행·수정 때
attachments에attachment_ref를 넣지 않은 경우입니다. 해당 글을tistory_update_post로 다시 보내면서attachments를 채우세요(이미지는 다시 업로드).태그 표기가 바뀜 — 이미 쓰던 태그와 대소문자·띄어쓰기만 다른 태그는 기존 표기로 합쳐지는 것으로 보입니다. 티스토리 쪽 동작입니다.
두 대의 PC 에서 같은 블로그에 로그인 — 동시 로그인 시 한쪽 세션이 끊기는지 확인되지 않았습니다. 한 PC 에서 쓰는 것을 권합니다.
update_post에 마크다운을 보냈더니 기호가 그대로 보임 —update_post의content_format기본값은html입니다. 마크다운이면content_format="markdown"을 명시하세요(publish_post는 기본markdown).get_post본문이 마크다운이 아님 — 티스토리는 마크다운을 저장하지 않습니다. 돌아오는 것은 스킨으로 렌더된 HTML 이며, 수정할 때는 그 HTML 을 되돌려 보내지 말고 새 본문을 써서 보내세요.
한계와 면책
비공식입니다. 티스토리가 내부 API 를 바꾸면 예고 없이 동작이 멈출 수 있습니다.
이 도구의 사용은 티스토리·카카오 약관과 충돌할 수 있습니다. 계정 제한 등 모든 위험은 사용자 본인이 집니다.
완전 무인 운영은 불가능합니다(카카오톡 푸시 승인). 세션은 짧으면 한 시간 남짓 만에 만료되므로(실측), 도구가 만료를 알리면 다시 로그인해야 합니다.
속도 제한은 프로세스 안에서만 직렬화됩니다. 두 클라이언트가 동시에 발행하면 간격 검사가 겹칠 수 있습니다.
텔레메트리·외부 서버 없음. 쿠키는 티스토리로 보내는 요청 외에는 이 PC 를 떠나지 않습니다.
허용하지 않는 사용
대량·반복 발행, 같은 글을 여러 블로그에 뿌리기, 스팸.
검색엔진 조작을 노린 글 양산.
본인 소유가 아닌 블로그·계정에 글 쓰기.
티스토리·카카오 약관이 금지하는 행위 전반.
이 프로젝트는 내 블로그를 위한 글쓰기 보조이며, 공개 전에 사람이 읽는 것을 전제로 만들었습니다.
보안
저장된 쿠키는 블로그 관리자 권한 그 자체입니다. 세션 파일을 복사·공유하지 마세요.
이슈·PR 에 쿠키, 세션 JSON, HAR, 스크린샷 속 토큰을 절대 첨부하지 마세요.
텔레메트리 없음. 네트워크 요청은 로그인한 티스토리 호스트와 RSS 조회 대상 블로그로만 나갑니다.
취약점 신고 절차는 SECURITY.md.
기여
버그 신고와 PR 을 환영합니다 — CONTRIBUTING.md. 내부 구조는 docs/ARCHITECTURE.md. 테스트는 네트워크 없이 돕니다(pytest, 모의 HTTP).
라이선스
감사
kim-se-hee/tistory-mcp (MIT) — 티스토리 내부 엔드포인트를 실측해 정리한
docs/api.md. 이 저장소의 엔드포인트 지식은 그 문서를 따릅니다. npm 에 배포되는 별개의 TypeScript 프로젝트입니다.aiarchitecturedev/aiarchitect-blog-mcp — 도구 annotation 과 fail-closed 패턴을 참고했습니다.
Changelog
v0.2.0 (2026-10-27)
문서: 세션 수명 서술 정정 — "며칠~몇 주"가 아니라 실측 한 시간 남짓 만에 만료될 수 있음(
TSSESSION은 만료일 없는 세션 쿠키)문서: 마크다운 변환 설명 정정 — 에디터 서식 속성은 제목·표·인용·목록에만 붙고 코드 블록은 일반
<pre><code>문서: 세션 수명 서술 보강 — 한 시간 남짓 만에 만료된 세션도, 90분 무호출을 포함해 다섯 시간 가까이 유지되다 여섯 시간 무호출 사이에 만료된 세션도 있었음(실측 2026-10-27~28, 수명 예측 불가)
저장소:
.gitignore에/_private/(로컬 전용 내부 자료 폴더) 추가
첫 공개 릴리스.
도구 11개 — 세션(
init/status), 카테고리, 글 목록·조회, 공개 RSS, 발행·수정·삭제, 이미지 업로드, 자동저장 초안. 도구 설명·title 영문+한국어 병기.안전 기본값 — 비공개 발행, 삭제
confirm+destructiveHint, 발행·수정 속도 제한(60초·하루 20회, 스레드 락),*.tistory.com한정, CDP loopback 한정, nh3 본문 정화.이미지 치환자 엄격 검증 — 비공개 0.1.x 에서 발견된 sanitize 우회를 수정.
발행 실패 뒤 재시도 시 중복 글 경고.
로그인 — 번들 Chromium → Chrome → Edge 순 폴백,
cdp_url로 외부 브라우저 접속, keyring 오류 안내.배포 — PyPI
tistory-mcp(uvx tistory-mcp), CLI 서브커맨드install-browser/login/status/logout/--version.tistory_list_posts— 공개 범위 필터를 서버 어휘(visible/hidden/protect)로 매핑(다른 값은 서버가 400).search_type에tag추가, 서버가 거부하는all제거.실계정 검증 — 11개 도구 전부 실제 블로그에서 확인(비공개 테스트 글로 검증 뒤 삭제).
Python ≥3.11.
비공개 개발 단계(v0.1.0
v0.1.4, 2026-0910)의 이력은 이 항목으로 요약.
Available Tools
11 toolstistory_delete_postDelete a post (글 삭제)ADestructiveIdempotent
Permanently delete a post. Cannot be undone.
Ask the user to confirm in chat, then call with confirm=true.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to actually delete. Ask the user in chat first | |
| post_id | Yes | Post number (글 번호) | |
| blog_url | Yes | Blog host or URL of the post to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds genuinely useful context beyond them: the permanence ('Cannot be undone') and a mandatory human-confirmation gate, which is the key behavioral constraint for this tool. It stops short of covering permission or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the irreversibility warning and the confirmation instruction front-loaded. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists and annotations are rich, so return values and safety are covered elsewhere. The description supplies the two things an agent most needs for a destructive tool – permanence and the confirmation requirement – though it says nothing about failure modes or required permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so post_id, blog_url, and confirm are all documented in the schema already. The description reinforces the confirm=true requirement but adds no syntax or format detail beyond what the schema states, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Permanently delete a post') and immediately adds the irreversible consequence. It is clearly distinguishable from siblings like tistory_update_post and tistory_publish_post without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit precondition workflow: ask the user to confirm in chat first, then call with confirm=true. It does not name alternative tools (e.g., why not update_post) but for a destructive terminal operation the when-to-use guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_fetch_public_postsFetch public posts via RSS (공개 글 RSS)ARead-onlyIdempotent
Fetch the latest public posts of any Tistory blog from its RSS feed. No login needed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return | |
| blog_url | Yes | Blog host or URL (블로그 주소). e.g. myblog.tistory.com | |
| include_content | No | Include each item's RSS description (body HTML) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds two genuinely new facts beyond annotations: the data source is an RSS feed (implying recency-ordered, feed-limited results) and that no authentication is required. It does not warn that RSS typically exposes only recent items, which is the main residual gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the resource and source front-loaded and the auth constraint appended. Nothing needs trimming and nothing is buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter documentation, the description only needed to establish source, scope and auth — which it does. The one omission is that RSS feeds return a bounded recent window of posts, which affects how an agent interprets an empty or short result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (blog_url, limit, include_content) are already documented with examples and defaults. The description adds nothing about parameter behavior — e.g. that limit caps against a feed-imposed maximum or that include_content returns raw body HTML — so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch the latest public posts ... from its RSS feed') and names the scope ('any Tistory blog'), which implicitly separates it from session-based siblings like tistory_list_posts. It stops short of explicitly naming the alternative tool, but the RSS/public framing is distinctive enough to select on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'No login needed' implies the condition that selects this tool (unauthenticated / public-only access), but the description never names tistory_list_posts or tistory_get_post as the alternative, nor does it state when NOT to use this tool. Usage is inferable rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_get_categoriesList categories (카테고리)ARead-onlyIdempotent
Return the category tree flattened to id / name / parent id.
Use the integer id here as category when publishing or updating (names are not accepted).
| Name | Required | Description | Default |
|---|---|---|---|
| blog_url | Yes | Blog host or URL (블로그 주소). e.g. myblog.tistory.com |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the description does not need to argue safety. What it adds is the response shape (a flattened tree, not nested) and a hard constraint on the returned ids that affects downstream calls – genuine context beyond the annotations. It stops short of noting any auth or session requirement despite a tistory_session_init sibling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the output shape front-loaded and the cross-tool id contract second. Nothing could be removed without losing information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't detail return values, and annotations cover the safety profile; the two sentences supply exactly the missing piece – the contract between this tool's output ids and the publish/update tools. The only gap is that it doesn't mention a session/auth precondition, which the presence of tistory_session_init siblings makes relevant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single blog_url parameter is already documented with a format example, so the schema carries the parameter burden. The description adds semantics about the returned id, but nothing about the parameter itself, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific operation (return the category tree) and its exact output shape (id / name / parent id), which unambiguously distinguishes it from every sibling, none of which deal with categories. A verb-plus-resource plus return-shape statement leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear downstream usage: use the returned integer id as `category` in the publish/update siblings, and names the invalid alternative (names are not accepted). It does not explicitly say when to call this first (e.g., before tistory_publish_post or tistory_update_post), but the implied workflow is clear enough for an agent to act on.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_get_postGet a post (글 조회)ARead-onlyIdempotent
Return one post's metadata (from the admin list) and its body HTML (from the post page).
Works for private posts with the saved session. The body is the skin-rendered HTML, not the original markdown (Tistory keeps no markdown). To edit, write the new body yourself and send it with tistory_update_post rather than echoing content_html back.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | Post number (글 번호), digits only | |
| blog_url | Yes | Blog host or URL (블로그 주소). e.g. myblog.tistory.com |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses that the body is skin-rendered HTML rather than original markdown and that private posts require the saved session. The warning not to echo content_html back for edits is important behavioral guidance that annotations cannot provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core return behavior and followed by essential caveats. Every sentence carries useful information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, but the description still covers the important shape of the body and the private-session condition. For a two-parameter read tool, it supplies enough context to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so blog_url and post_id are already fully documented in the schema. The description adds no parameter-specific syntax or constraints beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: return one post's metadata and body HTML, with the admin-list and post-page sources. It distinguishes private-post retrieval via the saved session and points to tistory_update_post for editing, so an agent can separate it from write siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for private posts and an explicit when-not: to edit, write the new body yourself and send it with tistory_update_post rather than echoing content_html back. It does not name tistory_list_posts or tistory_fetch_public_posts as retrieval alternatives, so routing is helpful but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_list_postsList posts (글 목록)ARead-onlyIdempotent
List posts from the admin side (includes private and protected posts), one page at a time.
Bodies are not included — use tistory_get_post for the body.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, 1-based | |
| keyword | No | Server-side search keyword; empty string = all posts | |
| blog_url | Yes | Blog host or URL (블로그 주소). e.g. myblog.tistory.com | |
| category | No | Category id filter; -3 = all categories | |
| visibility | No | Visibility filter | all |
| search_type | No | Where to search the keyword: post title, body, or tag | title |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds value beyond that by disclosing the result scope (private/protected posts included) and the significant omission (no bodies), both of which affect how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the most decision-relevant information (admin-side scope, bodies excluded) front-loaded. Nothing repeats the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the input schema is fully documented, so the description only needs to add scope and caveats, which it does. The one remaining gap is guidance on iterating pages or knowing when the last page is reached, which would help an agent use the paging parameter correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with every one of the six parameters documented including defaults and the -3 'all categories' sentinel, so the schema carries the semantics. The description adds only the implicit notion of paging via 'one page at a time' and no detail on keyword/visibility/category behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List posts from the admin side') and scopes it precisely by noting that private and protected posts are included, which implicitly separates it from the public-listing sibling. It also names tistory_get_post as the tool for bodies, so the agent can tell what this tool does not return.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'use tistory_get_post for the body' line is a genuine routing instruction, and 'one page at a time' hints at pagination. However, it never explicitly contrasts with tistory_fetch_public_posts (the obvious alternative when private posts are not needed) or states when the admin-side listing is required versus a public fetch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_publish_postPublish a new post (새 글 발행)A
Create a NEW post. Every call creates a new post — this is not a draft and not an update.
Do not retry after an error or timeout without checking tistory_list_posts first, or the post may be duplicated. Defaults to private so the user can review it before switching to public with tistory_update_post. Rate-limited (default 60 s apart, 20 per day).
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags (태그), one per item, without '#' and without commas | |
| title | Yes | Post title (제목) | |
| slogan | No | URL slug; empty = generated from the title by the server | |
| content | Yes | Post body. Markdown by default (converted to HTML by the tool). For images, paste the `substitution` from tistory_upload_image verbatim | |
| blog_url | Yes | Target blog host or URL — required to prevent mis-publishing | |
| category | No | Category id from tistory_get_categories; 0 = none | |
| password | No | Password for visibility='protected' | |
| post_type | No | 'post' (default) or a static 'page' | post |
| visibility | No | Default 'private' (비공개). Use 'public' only when the user explicitly asks; 'protected' needs password | private |
| attachments | No | attachment_ref of every image used in content (from tistory_upload_image) | |
| content_format | No | 'markdown' (default) or 'html' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag non-idempotent, non-read-only, open-world behavior; the description goes further by spelling out the concrete consequence (duplicate posts on retry) and adding rate limits (60 s apart, 20/day) plus the default-private safety posture, none of which appear in the annotations or schema. It stops short of describing the response or what happens to attachments, keeping it at 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the highest-stakes fact (every call creates a new post), then the duplication hazard, then the safe default, then rate limits. No filler and no repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, non-idempotent mutation with an output schema already covering return values, the description supplies exactly the missing operational context: duplication risk, retry procedure, visibility default, and throttling. Nothing an agent needs in order to invoke it safely is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 11 parameters is already documented, including enum meanings and defaults. The description restates the private default and markdown default but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a NEW post') and immediately disambiguates it from two siblings: 'this is not a draft and not an update,' ruling out tistory_save_draft and tistory_update_post. An agent can classify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to: check tistory_list_posts before retrying after an error/timeout, and use tistory_update_post to flip visibility to public after review. It also names the alternative path and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_save_draftSave autosave draft (자동저장 초안)A
Write a draft into the editor's single autosave slot. No post is created.
The next time the user opens the editor it offers to restore this draft. There is only one slot, so saving again overwrites the previous draft. For several reviewable drafts, publish with visibility='private' instead.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags, one per item | |
| title | Yes | Draft title | |
| content | Yes | Draft body (markdown by default) | |
| blog_url | Yes | Blog host or URL (블로그 주소). e.g. myblog.tistory.com | |
| category | No | Category id; 0 = none | |
| attachments | No | attachment_ref of images used in content | |
| content_format | No | 'markdown' (default) or 'html' | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the overwrite semantics of the single autosave slot and the editor's restore prompt, which explains why idempotentHint=false matters in practice. It does not cover auth requirements or how the draft interacts with the draft owner's session, keeping it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and non-creation guarantee, then the restore behavior, then the alternative. Every sentence carries distinct information with zero repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile, an output schema handling return values, and full schema coverage for parameters, the description only needs the semantics an agent could not infer: the single-slot overwrite, the non-creation guarantee, and the restore flow. All are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters (title, content, blog_url, tags, category, attachments, content_format) are already documented in the schema. The description adds no parameter-level detail beyond the visibility reference for the alternative tool, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Write a draft into the editor's single autosave slot', followed immediately by the negative scope 'No post is created.' This cleanly separates it from siblings like tistory_publish_post without requiring the schemas to be opened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the condition that selects it: 'For several reviewable drafts, publish with visibility=\'private\' instead.' The agent knows both when to call this tool and when to route elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_session_initLog in to Tistory (로그인)A
Open a browser for the Kakao login (카카오 로그인 + 카카오톡 승인) and save the cookies.
Blocks until the user finishes or timeout_sec passes — tell the user to look for the browser window and approve the KakaoTalk push before calling. The KakaoTalk 2-factor approval cannot be automated. Once saved, other tools work without a browser until the session expires (it can be as short as an hour or so); call again when a tool reports an expired session.
| Name | Required | Description | Default |
|---|---|---|---|
| cdp_url | No | CDP address of a browser that is already running with --remote-debugging-port, e.g. http://127.0.0.1:9222. Use when no browser window can be shown (WSL, SSH, containers) | |
| blog_url | Yes | Blog host or URL (블로그 주소). e.g. myblog.tistory.com | |
| timeout_sec | No | How long to wait for the login (seconds) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that the call blocks until user action or timeout, that KakaoTalk 2FA requires human intervention, and that the resulting session may expire in as little as an hour. This is exactly the operational context an agent needs before invoking a long-running, human-in-the-loop login.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences: what it does, how the agent must behave while it runs, and what to do afterward. No redundant restatement of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description still covers prerequisites, blocking semantics, and session lifecycle. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the cdp_url fallback for WSL/SSH/containers, so the schema already carries parameter meaning. The description only indirectly reinforces timeout_sec via the blocking behavior and never mentions cdp_url itself, so it adds little beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Open a browser for the Kakao login ... and save the cookies'), making the outcome (persisted session/cookies) explicit rather than just 'log in'. It is clearly distinguished from the read-only siblings such as tistory_session_status, which only reports state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: call before other tools, tell the user to watch for the browser window and approve the push first, and call again when a tool reports an expired session. It also names an exclusion implicitly by stating the 2FA approval cannot be automated, so retrying will not help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_session_statusSession status (세션 상태)ARead-onlyIdempotent
Report whether a saved session exists, when it was saved and when it expires.
Also makes one admin API call to tell whether it is live right now (valid/expired).
| Name | Required | Description | Default |
|---|---|---|---|
| blog_url | Yes | Blog host or URL (블로그 주소). e.g. myblog.tistory.com |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds genuinely useful context beyond that: it performs one live admin API call rather than reading local state only, which is a side effect an agent should know about; it does not mention failure modes or rate limits, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the local state report before the live check. Slightly fragmentary ('Also makes one admin API call...') and the first sentence packs three facts, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
One required parameter at full schema coverage plus an output schema means return shape need not be explained. The description covers both the cached metadata and the live validity check, which is what an agent needs to decide whether to proceed; a note on what a missing session means would complete it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single blog_url parameter, so the baseline of 3 applies. The description adds nothing about the parameter (e.g. that the session lookup is keyed to blog_url), leaving the schema to do all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') against a specific resource (saved session: existence, save time, expiry) and adds a second, distinct check ('live right now (valid/expired)'). It is cleanly separable from the sibling set, none of which query session state, though it never names tistory_session_init as the counterpart it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the precondition check before publish/update operations, but the description never states when to call it, when not to, or that session_init is the alternative when no session exists. No explicit routing to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_update_postUpdate a post (글 수정)A
Update an existing post. The body must be sent in full (the server does not merge).
Title, category, visibility and slug keep their current values when omitted; tags are kept by reading them from the post page (pass [] to clear). Rate-limited together with publish.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | New tags; omit to keep the current tags (read from the post page), pass [] to clear | |
| title | No | New title; omit to keep the current one | |
| slogan | No | New URL slug; omit to keep | |
| content | Yes | The complete new body — the server overwrites the whole post. Do not echo content_html from tistory_get_post; write the new body yourself | |
| post_id | Yes | Post number (글 번호) | |
| blog_url | Yes | Blog host or URL of the post to update | |
| category | No | New category id; omit to keep the current one | |
| password | No | Password for visibility='protected' | |
| visibility | No | New visibility; omit to keep the current one. 'public' makes it live | |
| attachments | No | attachment_ref of images used in the new content | |
| content_format | No | Default 'html'. Set 'markdown' when sending markdown, or it is posted as raw text | html |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-read-only, non-destructive, non-idempotent, open-world write. The description adds the crucial behaviors the annotations do not: the server does not merge so the full body is overwritten, tags are preserved by re-reading the post page, and the call shares a rate limit with publish. It stops short of noting session/auth requirements or what happens to attachments and password fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The overwrite constraint is front-loaded in the first sentence, followed by field-preservation rules and the rate-limit note. Three sentences with almost no waste, though the trailing 'Rate-limited together with publish' fragment could be folded in more smoothly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, full schema coverage, an output schema, and annotations covering the safety profile, the description covers the main non-obvious risk (full-body overwrite) and the omit-to-keep contract. Only auth/session prerequisites and attachment handling are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented; baseline is 3. The description usefully clarifies the 'slogan' param is the URL slug and restates the omit-to-keep contract for title/category/visibility, but adds no syntax, id-format, or password/visibility interaction detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A clear verb+resource ('Update an existing post') that is distinguishable from publish/save_draft by the word 'existing'. It does not explicitly name the sibling tools it supersedes for editing, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains omission semantics well (fields keep current values, [] clears tags), which is really per-field guidance, but it never says when to choose this over tistory_publish_post or tistory_save_draft, nor what prerequisites (session/auth) must be in place. Usage is inferable rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tistory_upload_imageUpload an image (이미지 업로드)A
Upload an image and return substitution (paste into the body) and attachment_ref.
Put substitution verbatim where the image goes, and pass attachment_ref in attachments
when publishing/updating — otherwise the image is garbage-collected after about 15 days.
Do not put the returned URL into the body directly.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | Alignment: alignCenter (default), alignLeft, alignRight, widthOrigin | alignCenter |
| width | No | Pixel width; read from the file header if omitted | |
| height | No | Pixel height; read from the file header if omitted | |
| blog_url | Yes | Blog host or URL (블로그 주소). e.g. myblog.tistory.com | |
| file_path | Yes | Local image path (png/jpg/jpeg/gif/webp, up to 20MB) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic profile (not read-only, open-world, non-idempotent, non-destructive). The description adds genuinely non-inferable behavior: uploads are ephemeral and reference-counted via 'attachment_ref', becoming invalid in ~15 days if unreferenced, and the returned URL is not directly usable in post bodies. That is exactly the kind of lifecycle detail structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what is returned, then the placement rule, then the retention caveat and the prohibition. Nothing is padded. Minor friction from the code-fenced identifiers and the stray line breaks in the source, but the information density is high.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still highlights the two return fields that carry workflow semantics, which is the right call for a tool whose outputs must be threaded into a later call. Combined with the fully documented 5-parameter schema and the retention warning, an agent has everything needed to call it and use the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents blog_url, file_path, style, width, and height including defaults and size limits. The description adds nothing about input parameters — the identifiers it discusses ('substitution', 'attachment_ref') are return values, not inputs. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Upload an image') and immediately states the two artifacts it returns ('substitution' and 'attachment_ref'). That distinguishes it unambiguously from every sibling, none of which deal with binary media, and it tells the agent the tool is a prerequisite step for publish/update rather than a terminal action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit, actionable when-and-how guidance: put 'substitution' verbatim in the body, pass 'attachment_ref' in attachments 'when publishing/updating', and a clear negative instruction — 'Do not put the returned URL into the body directly.' It also supplies the consequence of skipping the step (garbage-collection after ~15 days), which makes the correct usage path obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
tistory_delete_post - First observed
tistory_fetch_public_posts - First observed
tistory_get_categories - First observed
tistory_get_post - First observed
tistory_list_posts - First observed
tistory_publish_post - First observed
tistory_save_draft - First observed
tistory_session_init - First observed
tistory_session_status - First observed
tistory_update_post - First observed
tistory_upload_image
TDQS
Scored across 11 tools
Most tools target clearly distinct actions, and descriptions go out of their way to separate look-alikes (list_posts vs get_post vs fetch_public_posts, publish_post vs save_draft). The only mild overlaps are draft-save vs publish-as-private and admin list vs RSS fetch, but the descriptions disambiguate those well.
All tools share a tistory_ prefix and snake_case, with a mostly verb_noun pattern (get_categories, list_posts, publish_post, update_post, delete_post, upload_image). Minor deviations are session_init/session_status, which are noun-based rather than verb-based.
Eleven tools is well within the sweet spot and each maps to a meaningful operation in the Tistory workflow. Nothing feels redundant or padded, and no core action appears to be missing a slot.
Full post lifecycle (list/get/publish/update/delete), session management, image upload, and draft handling are all covered, plus an unauthenticated RSS reader. Minor gaps exist around comment management and category creation, though these are limited by Tistory's API surface.
Maintenance
Related MCP Connectors
Create, edit, organize, publish, and configure JustBlogged blogs from MCP clients.
Blog MCP server for AI agents. One signup call returns a blog, an API key and a live URL; then your agent publishes markdown posts and gets public URLs back. Your agent does the writing; you get a dashboard for stats.
Manage WordPress blogs and WooCommerce shops from Claude, ChatGPT, Cursor and other MCP apps.
Hosted MCP for BlogBat: read, write, generate, and publish blog articles and content.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables programmatic management of Substack content, including creating drafts, publishing posts, and uploading images. It supports specialized features like live blogging and posting to Substack Notes through MCP-compatible AI tools.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage and interact with WordPress sites through MCP, providing tools for content creation, moderation, WooCommerce operations, and governance.47GPL 2.0
- AlicenseBqualityAmaintenanceEnables AI assistants to publish and manage blog posts on Misar.Blog, including drafts, series, AI content generation, and analytics.26120 npm1MIT
- AlicenseDqualityBmaintenanceEnables AI assistants to manage Ghost CMS content through MCP, with read tools for posts, pages, tags, and members, plus draft-safe write tools that cannot publish or delete.365,253 npmMIT