velog-mcp
Velog MCP server lets you read, search, write, publish, back up, and create images for Velog posts from MCP clients like Claude Code.
Read Velog content: fetch individual posts, list a user's posts, search posts globally or within a blog, view trending/recent posts, get user profiles, series, and tags.
Read your own account: identify the authenticated user (
velog_whoami) and list your drafts.Write content: create and update drafts, publish new posts or existing drafts, unpublish posts back to drafts, and edit published posts while preserving omitted fields.
Back up and analyze: export posts as Markdown with YAML frontmatter, compute blog stats (views/likes/comments, top posts, yearly/tag breakdown), and diagnose Velog's current GraphQL schema against a baseline.
Generate images: render architecture/flow diagrams, sequence diagrams, and 1200×630 cover cards; upload local images and get Markdown for posts.
Manage profiles (optional): when
VELOG_ALLOW_PROFILE=1, update profile name, bio, about, blog title, social links, and profile image.Safety defaults: no token gives read-only access; publishing is private-only unless
VELOG_ALLOW_PUBLIC=1is set; destructive safeguards and self-audits block risky renders/uploads.
Provides tools for managing Velog blog posts, including reading, drafting, publishing, unpublishing, and exporting posts, as well as searching and aggregating blog statistics.
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., "@velog-mcpShow me my recent drafts"
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.
velog-mcp
벨로그를 Claude 같은 MCP 클라이언트에서 다루는 서버. 글을 읽고, 초안을 쓰고, 발행하고, 통째로 백업한다.
왜 또 만들었나
벨로그 MCP 서버가 이미 둘 있다. 이 구현은 세 가지가 다르다.
1. 발행은 기본값이 아니라 권한이다. 설치 직후에는 초안 작성과 비공개 발행까지 된다. 공개 발행은 환경변수를 넣어야 열린다. 그 스위치는 모델이 못 건드린다 — MCP 설정 파일을 여는 사람만 바꿀 수 있다.
2. 벨로그 동작을 추측하지 않고 실측했다. 벨로그 GraphQL 은 비공식이라 문서가 없다. 이 레포는 실제로 어떻게 동작하는지를 velog-io/velog 소스와 실호출로 확인해 기록한다. 서버 쪽 함정 6가지가 docs/api-reference.md 에 있다 — 오류 없이 빈 결과를 주는 경우, 발행글을 비공개로 만드는 경우 포함.
3. 런타임 의존성 2개. @modelcontextprotocol/sdk 와 zod 뿐이다.
HTTP 와 테스트 러너와 타입스크립트 실행은 전부 Node 내장을 쓴다.
Related MCP server: velog-mcp
설치
Node.js 22.18 이상이 필요하다. 실행되는 것은 컴파일된 dist/index.js 지만, 개발과 검증이 .ts 를 직접 실행하고 그게 플래그 없이 도는 첫 버전이 22.18 이다. CI 는 22.18 과 24 와 26 에서 돌린다.
Claude Code 플러그인으로 (권장)
/plugin marketplace add milcho0604/velog-mcp
/plugin install velog@milcho설치할 때 값 네 개를 묻는다. 하나도 안 넣어도 설치되고, 읽기 전용으로 동작한다.
물어보는 것 | 안 넣으면 |
Velog refresh token | 읽기 전용 (조회·검색·통계는 그대로) |
공개 발행 허용 | 초안과 비공개 발행까지만 |
프로필 수정 허용 | 프로필 도구가 꺼짐 |
크롬 경로 | 표준 위치에서 자동으로 찾는다 |
토큰이 macOS 키체인에 들어간다. 설정 파일에 평문으로 남지 않는다 —
sensitive: true 로 선언한 값만 키체인으로 가고, 그건 테스트가 강제한다(P7).
값을 나중에 바꾸려면 /plugin manage.
그냥 MCP 서버로
npm 에 올려뒀으니 클론할 것 없이 MCP 클라이언트가 npx 로 띄운다. 설정 블록과
클라이언트 지원 범위는 설정 을 볼 것.
claude mcp add velog -e VELOG_REFRESH_TOKEN=여기에_토큰 \
-- npx -y @milcho0604/velog-mcp@0.9.2이 방식은 토큰이 클라이언트 설정 파일에 남는다. 위의 플러그인 방식은 키체인에 넣는다.
직접 빌드해서
git clone https://github.com/milcho0604/velog-mcp.git
cd velog-mcp
npm install && npm run build설정
MCP 클라이언트 설정 파일(claude_desktop_config.json, .mcp.json 등)에 추가한다.
{
"mcpServers": {
"velog": {
"command": "npx",
"args": ["-y", "@milcho0604/velog-mcp@0.9.2"],
"env": {
"VELOG_REFRESH_TOKEN": "여기에 토큰"
}
}
}
}Claude Code CLI 라면:
claude mcp add velog -e VELOG_REFRESH_TOKEN=여기에_토큰 \
-- npx -y @milcho0604/velog-mcp@0.9.2로컬 체크아웃으로 돌리려면 command 를
node /절대경로/velog-mcp/dist/index.js 로 바꾼다.
어떤 클라이언트에서 되나? 이건 stdio 서버다 — 클라이언트가 로컬 프로세스로 띄운다. Claude Code·Claude Desktop·Cursor 처럼 MCP 서버를 로컬에서 실행하는 클라이언트에서 된다. claude.ai 와 ChatGPT 웹앱에서는 안 된다 — 둘 다 HTTP 로 접근 가능한 원격 MCP 서버만 받는다. 연결이 내 기계가 아니라 그쪽 서버에서 출발하기 때문이다. 웹에서 쓰려면 서버를 공개 호스팅하고 벨로그 토큰을 그 배포본에 넘겨야 하는데, 그러면 토큰을 내 기계에만 두려던 이유가 사라진다.
토큰 얻는 법
벨로그는 공개 쓰기 API 가 없어서 브라우저 세션 쿠키로 인증한다.
velog.io 에 로그인
개발자도구(
F12) → Application → Cookies →https://velog.iorefresh_token값을 복사
VELOG_REFRESH_TOKEN 하나만 넣으면 된다. 벨로그 서버가 수명 짧은
access_token 을 알아서 재발급하고(authPlugin.mts),
이 서버가 응답에 실려 오는 갱신 쿠키를 받아 쓴다. 한 번 넣으면 30일 간다.
VELOG_ACCESS_TOKEN 도 받지만 단독으로는 1시간이면 만료된다.
토큰은 환경변수로만 읽는다. 디스크에 쓰지 않고, 브라우저 쿠키 DB 나 OS 키체인을 건드리지 않는다. 다만 MCP 설정 파일에 적은 값은 그 파일에 평문으로 남는다 — 그 파일 관리는 사용자 몫이다.
토큰이 없어도 서버는 뜬다. 읽기 전용으로 동작하고, 공개 글 조회·검색·트렌딩· 블로그 통계는 인증 없이 된다.
권한
환경변수 | 되는 것 |
(설정 없음) | 전체 읽기 · 초안 작성 · 비공개 발행 · 그림 생성·업로드 · 스키마 점검 — 도구 23개 |
| …공개 발행 추가 ( |
| …프로필 수정 추가 (도구 5개) |
두 스위치는 독립이다 — 하나만 켜도 되고 둘 다 켜도 된다.
"env": {
"VELOG_REFRESH_TOKEN": "...",
"VELOG_ALLOW_PUBLIC": "1",
"VELOG_ALLOW_PROFILE": "1"
}'켬'으로 인정하는 값은 1, true, yes, on 뿐이다. 나머지는 전부 꺼짐 —
오타로 조용히 켜지지 않는다.
공개 발행이 꺼져 있으면 어떤 도구에도 is_private 파라미터가 존재하지 않는다.
모델이 공개를 요청할 방법 자체가 없다. 켜면 파라미터가 생기지만 기본값은 여전히
true(비공개)다.
왜 비공개가 기본인가
몸사리는 게 아니라 실측 근거가 있다. 벨로그의 발행 제한은 is_private: false 인
글만 센다:
// apps/server/src/services/PostApiService/index.mts
count({ where: { fk_user_id, is_private: false, released_at: { gt: 5분전 } } })
if (count >= 10) {
updateMany({ where: { fk_user_id, released_at: { gt: 5분전 } },
data: { is_private: true } }) // 최근 글을 '전부' 비공개로
}비공개 글은 이 계수를 올리지 않는다. 다만 isPostLimitReached() 는 공개 여부를
보기 전에 무조건 실행되므로, 이미 최근 5분에 공개 글이 10건 쌓여 있으면 비공개
초안 요청도 그 파괴 동작을 촉발할 수 있다 — '올리지 않는다'와 '유발하지 않는다'는
다르다. 그래서 쓰기 무재시도와 자체 상한을 함께 유지한다.
공개 글은 계수를 올리고, 한번 공개되면 RSS·검색 색인·구독 메일로 이미 나간 뒤라 지워도 회수가 안 된다. 명시적 opt-in 을 둘 만한 비대칭은 여기에 있다.
자세한 내용: docs/security.md
도구
23개. 벨로그 상태를 바꾸는 건 그중 10개뿐이다.
읽기 — 인증 불필요
도구 | 하는 일 |
| 글 하나를 본문까지 |
| 사용자의 글 목록, 태그로 좁힐 수 있음 |
| 키워드 검색. |
| 트렌딩 ( |
| 벨로그 전체 최신 글 |
| 프로필·팔로워 수·소개 |
| 시리즈 목록 (글 수와 id 포함) |
| 사용자가 쓰는 태그와 글 수 |
읽기 — 인증 필요
도구 | 하는 일 |
| 토큰이 어느 계정인지 (토큰 생존 확인용으로도) |
| 내 초안 목록과 id |
파생 — 벨로그에 없는 기능
도구 | 하는 일 |
| 조회수·좋아요·댓글 집계, 상위 글, 연도별·태그별 분포 |
| 글을 YAML 프론트매터 붙은 마크다운으로 저장 |
| 지금 벨로그 스키마가 이 서버의 기준선과 같은지 대조 |
쓰기
도구 | 효과 |
| 초안 저장. 어떤 설정에서도 발행하지 않는다 |
| 초안 전체 교체 — 생략한 필드는 초기화된다 |
| 새 글 발행 |
| 기존 초안을 발행 (저장된 본문을 그대로 씀) |
| 발행글을 초안으로 되돌림 |
| 발행글 수정 — 생략한 필드는 유지된다 |
velog_update_draft는 생략하면 초기화하고,velog_update_post는 유지한다. 의도한 비대칭이고 이유는 docs/tools.md 에 있다.
썸네일 자동 채움
thumbnail 을 생략하면 본문 첫 이미지를 썸네일로 쓴다. 목록·공유 카드가 글자만
나오는 걸 막기 위해서다. 무엇을 넣었는지는 결과에 항상 표시하고, 후보가 여럿이면
나머지도 함께 보여준다.
| 동작 |
생략 | 본문 첫 이미지로 자동 설정 |
URL | 그대로 사용 |
| 자동 채움 끄기 — 일부러 비워 두는 경우 |
코드블록·인라인코드 안의 이미지는 후보에서 제외한다(예제로 적어둔 마크다운이
썸네일이 되면 안 되므로). velog_update_post 는 기존 썸네일이 있으면 덮지 않는다 —
제목만 고쳤는데 목록 카드가 바뀌는 일이 없도록 한 것이고, 이때 null 은 "채우지 마라"이지
"지워라"가 아니다.
시리즈 — 이름으로 한 번에
series_name 에 이름을 주면 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다.
글쓰기와 시리즈 등록이 한 번의 호출로 끝난다. id 는 사람도 AI 도 모르기 때문에 이름을 받는다.
series_name: "PostgreSQL" ← 대소문자·앞뒤 공백은 무시하고 찾는다
series_id: "e53810ca-..." ← id 를 알면 이쪽이 우선⚠️ 못 찾으면 글을 저장하지 않는다. 조용히 시리즈 없이 저장하면 들어간 줄 알기 때문이다. 이때 있는 시리즈 목록을 함께 알려준다.
series_name·series_id 를 둘 다 생략하면 저장 뒤 결과에 내 시리즈 목록을 붙여준다.
이 조회가 실패해도 글은 이미 저장된 뒤이므로 저장을 실패시키지 않는다(취소도 삼킨다 —
여기서 실패로 보고하면 재시도 때 글이 두 번 생긴다).
⚠️ 벨로그 API 로는 시리즈를 만들 수 없다. 뮤테이션에 시리즈 관련이 하나도 없고
WritePostInput도series_id만 받는다. 새 시리즈는 벨로그 웹에서 한 번 만들면 그 뒤부터 이 도구로 붙일 수 있다.
username 을 받는 도구 중 velog_list_drafts·velog_blog_stats·velog_export_posts
는 생략하면 내 계정을 쓴다. velog_search_posts 는 생략하면 벨로그 전체를 검색한다.
그림 — 다이어그램·표지
도구 | 효과 |
| 구성도·흐름도를 그려 올린다 |
| 참가자와 순서 있는 메시지로 시퀀스 다이어그램을 그린다 |
| 글 표지 카드(1200×630)를 만든다 |
| 로컬 이미지를 올리고 마크다운을 돌려준다 |
넘기는 건 무엇이 있고 무엇이 어디로 흐르는지뿐이다. 색·여백·글자 실측·모서리 라운딩·캔버스 크기는 렌더러가 쥔다. 매번 처음부터 그리면 매번 다르게 생기기 때문이다.
수치는 전부 실측이다. 노드 폭과 줄바꿈은 브라우저 getBBox() 로 잰다 — 글자수로
추정하면 한글·영문이 섞인 라벨에서 반드시 틀린다. 캔버스는 다 그린 뒤에 내용
bbox 로 정하므로 그림이 잘릴 수가 없다.
그리고 스스로 감사해서 여섯 가지를 보고한다:
카드 밖으로 삐져나온 글자 · 억지로 맞추려 눌린 자간
노드를 관통하거나 노드 뒤에 숨은 선 · 그룹 이름표를 가린 선
선끼리 겹침 · 노드끼리 겹침 · 라벨이 카드나 그룹 이름표에 얹히거나 그룹 테두리에 걸침감사에 하나라도 걸리면 올리지 않는다. 그리고 그걸 끄는 스위치는 없다.
벨로그에는 이미지 삭제 API 가 없고 업로드 한도도 깎이니, 어설픈 그림은 올리는 것보다
고쳐 그리는 게 낫다. 모델이 스스로 켤 수 있는 우회는 방어가 아니다 —
공개 발행 스위치와 같은 이유다(ADR 0004).
감사에 떨어진 PNG 는 이 서버로 올릴 길이 없다. upload:false 로 그려도 그 산출물은
거부 목록에 오르고, 경로를 velog_upload_image 에 줘도 막힌다 — 그 두 단계 우회를
막으려고 만든 장치다. 고쳐서 다시 그리는 것이 유일한 경로다.
(감사를 통과한 PNG 는 upload:false 로 그린 뒤 경로를 넘겨 올릴 수 있다.)
아이콘은 내장 28종(server·database·cloud·clock·alert …)이고 전부 도형
조합이다. 밖에서 받아오는 게 하나도 없다 — 렌더러는 DNS 를 막은 채로 돈다.
크롬이 필요하다 (크로미움 계열이면 된다: Edge·Brave·Chromium). macOS·리눅스·
윈도우에서 알아서 찾고, 다른 데 있으면 VELOG_CHROME_PATH 로 지정한다.
이 중 브라우저를 쓰는 건 velog_render_diagram, velog_render_sequence, velog_render_cover 셋뿐이고,
velog_upload_image 를 포함한 나머지 19개는 크롬 없이 동작한다.
비용은 실측해서 밝혀 둔다. 그림 한 장에 크롬 911개·최대 약 1GB 를 34초 쓰고
0 으로 돌아온다. 이건 크롬의 바닥이지 우리 그림 탓이 아니다.
좌표·글자·개수에는 전부 상한이 있고, 캔버스 상한(6000px/900만px)은 페이지 안에서
걸린다 — 브라우저는 크기를 받는 순간 표면을 준비하므로 바깥에서 막으면 늦다.
렌더는 줄을 세운다 — MCP 클라이언트가 도구를 병렬로 부르기 때문에, 안 그러면
그림 다섯 장 요청에 크롬 45개·6GB 가 된다. 줄을 세우면 동시 4회도 한 장 분량으로
고정된다. 10회 연속에서 누적이 없는 것도 확인했다.
프로필 수정 — VELOG_ALLOW_PROFILE=1
도구 5개가 추가된다: velog_update_profile(이름·한줄소개), velog_update_about,
velog_update_blog_title, velog_update_social_links, velog_update_profile_image.
설정이 없으면 등록조차 되지 않는다.
게이트를 둔 건 위험해서가 아니다 — 전부 되돌릴 수 있고 본인 계정에만 영향이며
어디로도 배포되지 않는다. 이유는 혼동이다: 프로필의 short_bio 와 글의
short_description 은 이름이 비슷하다. "소개 좀 고쳐줘" 가 어느 쪽인지 모호할 때,
스위치가 꺼져 있으면 잘못 짚어도 프로필에 손이 닿지 않는다.
velog_update_profile 은 생략한 항목을 유지한다. 벨로그의 UpdateProfileInput
은 display_name 과 short_bio 를 둘 다 필수로 받아서 한쪽만 보내면 다른 쪽이
빈 문자열로 덮인다 — 그래서 현재 값을 읽어 채워 보낸다.
사용법
설정이 끝나면 MCP 클라이언트에 그냥 말하면 된다.
"오늘 고친 버그로 벨로그 초안 잡아줘"
→ 마크다운을 쓰고 초안으로 저장, 편집 URL 을 준다
"작년에 HTTP/2 로 뭐 썼더라"
→ 내 글 안에서 검색
"내 글 조회수 상위 10개랑 어떤 태그가 제일 많이 읽혔는지"
→ 블로그 전체를 훑어 집계
"내 글 전부 ~/blog-backup 에 백업해"
→ 프론트매터 붙은 .md 로 저장
"그 초안 발행해줘"
→ 기본은 비공개. 공개는 VELOG_ALLOW_PUBLIC=1 이 있어야 한다
"요청이 LB 에서 워커 거쳐 레디스까지 어떻게 흐르는지 그려줘"
→ 그림을 그리고 자가감사한 뒤 올리고, 본문에 붙일 마크다운을 준다
"이 글 표지 이미지 만들어줘"
→ 1200×630 카드. 주소를 velog_update_post 의 thumbnail 에 넣으면 표지가 된다되돌릴 수 없는 도구에는 destructiveHint 가 붙어 있다. 다만 annotation 은
«힌트» 이지 차단이 아니다 — 호출 전에 승인을 물을지는 MCP 클라이언트 설정에 달렸다.
서버가 막는 것은 따로다: 공개 발행은 VELOG_ALLOW_PUBLIC=1 없이는 경로 자체가 없고,
쓰기는 재시도하지 않으며, 공개 발행은 이 서버 인스턴스 안에서 5분에 5건으로
스스로 제한한다(비공개 발행·초안에는 이 제한이 걸리지 않는다).
백업 파일 형식
---
title: "글 제목"
date: 2022-12-31T18:32:39.790Z
slug: "url-slug"
url: "https://velog.io/@username/url-slug"
tags: ["태그1", "태그2"]
likes: 260
views: 16323
---
마크다운 본문…개발
npm test # node:test 로 .ts 직접 실행 — jest·ts-node 없음
npm run typecheck # 테스트 포함 — 종전엔 제외돼 실제 오류가 숨어 있었다
npm run lint # typescript-eslint (타입 기반)
npm run build # tsconfig.build.json (dist 에 테스트 미포함)
npm run schema:dump # 현재 벨로그 GraphQL 스키마 덤프
npm run schema:baseline # schema/baseline.json 을 실측으로 다시 만든다 (velog_diagnose 의 기준선)
npm run schema:baseline -- --check # 쓰지 않고 «지금 기준선이 맞는지» 만 본다테스트 663건(0.9.2 기준). safety.test.ts 가 보안 불변식(A1A13)을,
render.test.ts 가 구성도 불변식(R1R23, D1)과 시퀀스 불변식(S1S12)을,
plugin.test.ts 가 포장 불변식(P1P28)을 고정한다.
깨지면 우회하지 말고 왜 깨졌는지부터 볼 것.
여기 있는 방어는 전부 일부러 망가뜨려 확인했다. 소스 변이 54종 + 발행 관문
자체를 겨눈 변이 12종(scripts/gate-mutation.sh), 각각이 검사를 정확히 1건씩
실패시켜야 한다. 방어를 지웠는데도 통과하는 테스트는 테스트가 아니다.
이 저장소에도 그런 게 여럿 있었고, 그렇게 해서 고쳤다.
문서
문서 | 내용 |
기획서 — 목표·비목표·성공 기준 | |
구조, Node 타입 스트리핑이 허용하는 TS 부분집합 | |
벨로그 GraphQL 스키마 실측 + 서버 함정 | |
토큰 취급, 권한 모델, 의도적으로 뺀 기능 | |
도구 카탈로그와 주의사항 | |
설계 결정 기록 (ADR) | |
버전별로 무엇이 깨져 있었고 무엇이 고쳐졌나 |
참고
벨로그 내부 GraphQL API 를 쓴다. 비공식이라 예고 없이 바뀔 수 있다.
뭔가 깨지면 npm run schema:dump 를 돌려 docs/api-reference.md 와 diff 하는 게
가장 빠르다.
벨로그 이용약관에는 자동화 접근을 제한하는 조항이 없다. 본인 토큰으로 본인 글을 다루는 것은 권한 내 행위이고, 게시물 저작권은 회원에게 귀속된다(제5조).
라이선스
MIT
Available Tools
23 toolsvelog_blog_stats블로그 통계ARead-only
한 사용자의 글 전체를 긁어 조회수·좋아요·댓글을 집계한다. 연도별·태그별 분포와 상위 글 순위를 함께 낸다. 벨로그에 없는 화면이라 직접 계산한다. 글이 많으면 여러 번 요청하므로 몇 초 걸릴 수 있다.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | 상위 몇 편까지 보여줄지 | |
| username | No | @ 없이. 생략하면 인증된 내 계정을 쓴다 | |
| max_pages | No | 최대 페이지 수 (1페이지=50편). 과도한 요청 방지용 상한 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=true, openWorldHint=true, destructiveHint=false) already cover safety, but the description adds valuable context: it states it scrapes all posts and may take several seconds due to multiple requests. This proactively sets expectations about performance and data-gathering behavior, which annotations do not convey.
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 description is three concise sentences: it states the core function, the deliverables, and the performance caveat. Every sentence adds value, with no redundancy or filler. It is well-structured and front-loaded with the primary purpose.
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?
Given the complexity of the tool (aggregation over all posts), the description sufficiently covers what it computes and what it returns (distributions, rankings). It also notes latency behavior. With no output schema, the description gives enough detail for an agent to understand the expected result, though it could mention edge cases like empty user accounts, but that is minor given other structured fields.
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 clear descriptions for top, username, and max_pages. The description adds context about the tool's overall function but does not provide additional parameter-specific meaning beyond what the schema already documents. Baseline of 3 applies since the schema carries the parameter documentation burden.
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 clearly states it aggregates views, likes, and comments for a user's posts, and provides year/tag distributions and top post rankings. This specific verb+resource combination distinguishes it from sibling tools like velog_list_posts or velog_trending_posts, which list or rank posts differently.
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 description explains that this tool is needed because the stats screen does not exist on Velog, implying it should be used when such aggregated stats are required. It doesn't explicitly name alternative tools, but it gives clear context for when this tool is appropriate, such as when users need computed statistics rather than raw lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_create_draft벨로그 초안 작성ADestructive
벨로그에 임시저장 글(초안)을 만든다. 발행되지 않으며 작성자 본인만 볼 수 있다. 이 도구는 어떤 설정에서도 발행하지 않는다 — 발행하려면 velog_publish_draft 를 따로 부를 것. body 는 마크다운으로 쓴다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 본문 (마크다운). 문체: 사람이 쓴 글처럼 자연스럽게. 긴 줄표(—)와 가운뎃점(·)을 쓰지 말고 쉼표나 마침표로 끊을 것. "**하나.** ... **둘.**" 식 볼드 번호 나열 금지(산문이나 평범한 불릿으로). 문단은 2~3문장으로 짧게, 200자가 넘으면 쪼갠다. "이 글의 한계" 같은 부록 절을 만들지 말고 해당 문단 자리에 한 문장으로 녹일 것. | |
| tags | No | 태그 목록 | |
| title | Yes | 글 제목. 긴 줄표(—) 금지. 부제는 콜론이나 괄호, 짧은 하이픈으로. | |
| url_slug | No | 생략하면 제목에서 생성 | |
| series_id | No | 소속시킬 시리즈 id. 벨로그가 임시저장 생성 단계에서 이걸 버리므로 이 도구가 저장 직후 한 번 더 붙이고, 붙었는지 확인해 결과에 적는다. 생략하면 결과에 내 시리즈 목록을 함께 돌려준다 | |
| thumbnail | No | 썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다 | |
| series_name | No | 시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=false, destructiveHint=true, idempotentHint=false. The description adds meaningful context beyond annotations: the draft is never published under any setting, only the author can see it, and publishing requires a separate explicit call. This clarifies what the destructive hint implies for this create operation without contradicting it.
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 with zero waste. Core purpose is front-loaded, scoping constraint (no publication) comes second, and the alternative tool is named third. 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?
For a 7-parameter tool with 100% schema coverage and a rich schema, the description plus schema together cover purpose, safety profile, and param semantics well. The only gap is no return-value description, but there is no output schema, and this is a create operation whose main side effect is well disclosed.
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 schema is exceptionally rich — body has detailed style rules, title has formatting constraints, series_id/thumbnail/series_name all carry behavioral notes. The description only adds 'body is Markdown', which the schema already states, so it adds little beyond the schema. 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?
Description states a specific verb (creates a draft) and resource (Velog draft), and clarifies it is not published and only visible to the author. It explicitly distinguishes itself from sibling publish/update tools, so an agent can tell it apart immediately.
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 states when NOT to use it ('does not publish under any settings') and names the exact alternative tool (velog_publish_draft) to call for publishing. Also states body must be Markdown. This is clear routing guidance with an explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_diagnose벨로그 스키마 점검ARead-only
지금 벨로그 GraphQL 스키마가 이 서버가 만들어질 때의 기준선과 같은지 대조한다. 도구가 이유 없이 실패하거나 응답 모양이 이상할 때 원인을 가르는 1차 진단이다. 벨로그는 비공식 API 라 예고 없이 바뀐다. 읽기 전용이고 인증이 필요 없다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, non-destructive, and open-world behavior. The description adds that authentication is not required and that the underlying API is unofficial and volatile, which is useful beyond the annotations. It does not contradict the annotations.
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 primary action is front-loaded, and the supporting context is compact. The final sentence partly restates annotation-provided read-only/no-auth facts, but the description as a whole is efficient and not padded.
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 a zero-parameter diagnostic tool with strong annotations, the description provides enough information to select and invoke it correctly: what it compares, when to use it, that it requires no auth, and why it may fail due to the unofficial API. No critical guidance 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?
The tool has zero parameters, so there is no parameter burden to explain. The baseline for a no-parameter tool is 4, and the description correctly focuses on purpose rather than inputs.
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: comparing the current Velog GraphQL schema against the baseline schema from server creation. It clearly distinguishes this diagnostic tool from the sibling content/post tools by focusing on schema drift rather than data operations.
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 explicitly says this is the primary diagnosis tool when tools fail for no apparent reason or responses look malformed. It also explains that Velog is an unofficial API and can change without warning, giving an agent enough context to know when to run this check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_export_posts글 마크다운 백업ADestructive
한 사용자의 벨로그 글을 프론트매터가 붙은 마크다운 파일로 로컬에 저장한다. 벨로그에 공식 내보내기가 없어서 만든 기능이다. 파일 이름은 슬러그--글id.md 다 — 글마다 한 곳으로 정해지므로 같은 글을 다시 받으면 그 파일만 덮어쓴다. 글 본문을 한 편씩 받아오므로 글이 많으면 시간이 걸린다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 내보낼 최대 글 수 | |
| out_dir | Yes | 저장할 디렉터리 (절대경로 권장). 없으면 만든다 | |
| username | No | @ 없이. 생략하면 인증된 내 계정을 쓴다 | |
| skip_existing | No | out_dir 에 **이미 내보낸 글**은 건너뛴다. 파일 이름에 글 id 가 들어 있어 그 이름의 파일이 읽을 수 있는 일반 파일이고 비어 있지 않으면 «받았다» 로 본다 (내용은 읽지 않는다). 예산·취소로 멈췄을 때 같은 인자에 이것만 켜서 다시 부르면 남은 글부터 이어간다. 이름 규칙이 다른 옛 백업은 다시 받는다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, destructiveHint=true, and the description adds substantial context beyond them: the deterministic file naming explains why re-downloading overwrites only that post's file, it discloses one-by-one fetching and the time cost for many posts, and it explains the skip_existing resume heuristic. This is consistent with destructiveHint=true and enriches the safety profile meaningfully. It stops short of describing the return value or failure behavior, so not 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 front-loaded sentences where the purpose leads, followed by the rationale and behavior notes (overwrite, performance). Every sentence carries distinct information and there is no filler; only the 'official export missing' rationale is arguably non-essential, keeping it from a 5.
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 a 4-parameter tool with no output schema, the description covers the operation, naming, overwrite, and performance well, and the schema covers parameters. However, it never hints at what the tool returns on success or failure for a local-file-writing operation, which an agent needs to confirm completion — especially given destructiveHint=true and the absence of an output schema.
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 all four parameters (limit, out_dir, username, skip_existing). With full coverage, the baseline is 3. The description adds only marginal value beyond the schema — chiefly the file-naming convention that underlies skip_existing and overwrite semantics, but it does not clarify per-parameter syntax or formats beyond what the schema already states.
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 (export/save), a specific resource (one user's VeloLog posts), and a precise output format (markdown files with frontmatter saved locally). It also frames the file naming convention (slug--postid.md). None of the 21 sibling tools perform export, so it is clearly distinguishable by operation alone.
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 description explains the motivation ('no official export exists, so this was built') but never explicitly tells an agent when to use it vs. an alternative, nor names a substitute tool or exclusion condition. There is no sibling that overlaps with export, so usage is implied rather than stated; no explicit routing guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_get_post벨로그 글 읽기ARead-only
벨로그 글 하나를 본문까지 읽어온다. username + url_slug 조합이나 글 id 로 지정한다. 예: https://velog.io/@velopert/react-context-tutorial → username="velopert", url_slug="react-context-tutorial"
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | 글 UUID. 이걸 주면 username/url_slug 는 불필요 | |
| url_slug | No | URL 마지막 조각 | |
| username | No | @ 없이. 예: "velopert" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value by disclosing that it fetches the full post body and explaining the two valid identifier combinations, which is useful behavioral context beyond the annotations.
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 description is two sentences long, front-loaded with the core function, and includes a practical example with zero filler. Every sentence contributes to understanding what the tool does and how to use it.
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 a simple parameter set, full schema descriptions, and safety annotations, the description is complete. It explains the identification methods and states the tool returns the post content, making it sufficient for an agent to invoke correctly without an output schema.
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%, with each parameter described in Korean. The description's example ('https://velog.io/@velopert/react-context-tutorial → username="velopert", url_slug="react-context-tutorial"') adds meaningful context by showing how parameters map to a real URL, and it reinforces the id-optional relationship already present in 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?
The description clearly states the tool reads a single Velog post including its full body, using a specific verb ('읽어온다') and resource ('벨로그 글'). It distinguishes itself from sibling tools like list/search/trending by targeting one post, and provides a concrete URL example for identification.
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 description implies when to use this tool—when you need the full content of a specific post—and how to specify it (by id or username+url_slug). It doesn't explicitly mention alternatives or when not to use it, but the purpose is clear enough for an agent to differentiate from list/search operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_get_user벨로그 사용자 정보BRead-only
벨로그 사용자의 프로필과 팔로워 수를 조회한다.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | @ 없이 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe read operation (readOnlyHint=true, destructiveHint=false), and the description adds the specific data returned (profile and follower count). It does not contradict the annotations, but also provides no additional behavioral context like response format or authentication requirements.
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 description is a single, focused sentence that states exactly what the tool does with no filler or unnecessary detail.
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 a simple read-only tool with one parameter and strong annotations, the description is sufficient. It specifies the key return values (profile and follower count), and the schema handles parameter documentation. No output schema exists, but the description names the main outputs.
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?
The schema covers the only parameter 'username' with a description '@ 없이', giving 100% schema coverage. The description itself adds no new parameter semantics beyond what the schema already documents.
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 the specific verb '조회한다' (retrieves) and names the resource as the user's profile and follower count. It clearly conveys the tool's primary function, though it does not explicitly contrast it with sibling tools like velog_user_tags or velog_whoami.
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 description provides no guidance on when to use this tool versus alternatives. It only states what the tool does, with no mention of specific use cases, exclusions, or references to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_list_drafts내 초안 목록ARead-only
내 임시저장 글 목록. 초안을 이어 쓰거나 수정하기 전에 id 를 여기서 확인한다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| username | No | 생략하면 토큰의 계정을 쓴다. 남의 초안은 어차피 안 보인다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and non-destructive. The description adds that this tool returns draft IDs for later editing and implicitly that it shows only the user's own drafts (reinforced by the username schema description). No contradiction.
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 deliver purpose and usage, no redundant 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?
With annotations covering safety and schema covering parameters, the description provides a solid, complete context for a simple listing tool. It could mention the return format but the purpose implies 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 covers username semantically; limit is constrained but lacks description. The tool description does not explain parameters directly, but the schema's structural constraints and the username description provide adequate meaning for this simple tool.
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 explicitly states '내 임시저장 글 목록' (my temporary saved posts list) and explains that IDs are checked here before editing, clearly distinguishing it from sibling tools like list_posts.
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 provides a clear when-to-use: '초안을 이어 쓰거나 수정하기 전에 id를 여기서 확인한다' - before continuing or editing a draft. No explicit alternatives are named, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_list_posts벨로그 글 목록ARead-only
특정 사용자의 글 목록을 최신순으로 가져온다. tag 로 좁힐 수 있다. cursor 에 직전 응답의 마지막 글 id 를 주면 다음 페이지를 읽는다.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | 이 태그가 달린 글만 | |
| limit | No | ||
| cursor | No | 이전 페이지 마지막 글의 id | |
| username | Yes | @ 없이 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description adds meaningful behavioral details: posts are returned in latest order, can be filtered by tag, and pagination is driven by providing the last post id as cursor. This gives the agent a clear model of how the tool behaves without repeating annotation info.
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 concise sentences cover the core operation, filtering, and pagination, with no redundant or filler content. Information is front-loaded with the main action first, making it easy to parse.
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?
Given the tool has 4 parameters, no output schema, and provides annotations for safety, the description covers the essential behavior: list, order, filter, and pagination. It does not mention error cases (e.g., user not found) or response format, but for a read-only list tool with good annotations, these omissions are acceptable.
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?
The schema already covers 75% of parameters descriptively, and the description reinforces their roles: tag narrows the list, cursor enables pagination, and username targets the author. It adds the 'latest order' context which is not in the schema, and the limit parameter is adequately handled by schema constraints. The description adds enough extra meaning to compensate for the 75% coverage.
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 clearly states the tool's action: fetching a specific user's post list in latest order. It differentiates from siblings like velog_get_post (single post) and velog_search_posts (global search) by focusing on a per-user listing with optional tag filtering and pagination.
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 description provides clear context for when to use this tool: when you need a specific user's posts sorted latest-first, optionally narrowed by tag, and when you need pagination. It does not explicitly exclude alternative tools, but the purpose is well-scoped enough for an agent to select it over the generic search or trending tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_list_series시리즈 목록ARead-only
사용자의 연재 시리즈 목록. 각 시리즈에 글이 몇 편인지 함께 준다. 초안을 특정 시리즈에 넣으려면 여기서 얻은 id 를 velog_create_draft 의 series_id 에 준다.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | @ 없이 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, so the safety profile is covered. The description adds that the tool returns post counts per series, which is useful behavioral context beyond the annotations. It does not describe pagination or ordering, but these are not critical for a simple list tool.
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 description is two sentences long, front-loaded with the core purpose, and every sentence adds value: the first states what it does, the second explains how to use the returned id. No filler or redundancy.
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 a simple single-parameter list tool with good annotations and no output schema, the description sufficiently covers what the tool returns (series list with post counts) and how the returned id is used in another tool. It is complete for the agent to select and invoke it 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?
The input schema describes the only parameter (username) with '@ 없이', providing 100% coverage. The description does not add anything about the parameter beyond what the schema already states, so the baseline score of 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 clearly states it lists a user's series and includes the number of posts in each series. This specific verb+resource combination distinguishes it from sibling tools like velog_list_posts, and there is no other series-listing tool among the 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?
The description explicitly tells when to use this tool: to get the series id needed for assigning a draft to a series, referencing velog_create_draft's series_id parameter. It provides a clear workflow but does not mention exclusions or alternatives, though no direct alternative exists for listing series.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_publish_draft초안 발행ADestructive
기존 임시저장 글을 발행한다. 본문은 저장된 내용을 그대로 쓴다 — 다시 넘길 필요가 없다. 현재 설정에서는 비공개로만 발행된다 (공개 발행은 VELOG_ALLOW_PUBLIC=1 이 필요하다).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 초안 id (velog_list_drafts 로 확인) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the body is not passed again (saved content is used) and that publication is private-only unless VELOG_ALLOW_PUBLIC=1 is set. This adds valuable behavioral context beyond the annotations, which already signal destructive and non-idempotent behavior. It stops short of explaining side effects on the draft itself, but it is still informative.
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 description is two concise sentences, front-loaded with the core action and followed by a key limitation. Every sentence earns its place with no redundant information.
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 a single-parameter publish action, the description covers the essential behavior and a major constraint. It could mention what happens to the draft after publishing or the return value, but given the tool's simplicity and existing annotations, the description is sufficiently complete.
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?
The schema already describes the id parameter and how to find it via velog_list_drafts. The tool description adds that no body needs to be passed, reinforcing that the only required input is the draft ID. This is a useful semantic addition beyond the schema's parameter description.
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 clearly states the specific action: 'Publishes an existing temporary draft' with a distinct verb and resource. It also clarifies that the body uses saved content, which differentiates it from tools like velog_publish_post that would create a new post.
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 description gives clear context for when to use this tool: with an existing draft ID, and it notes the private-only default and the condition for public publishing. However, it does not explicitly name alternative tools or state when not to use it, such as when publishing a new post from scratch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_publish_post벨로그 글 발행ADestructive
새 글을 바로 발행한다. 초안을 거치지 않는다. 현재 설정에서는 비공개로만 발행된다 (공개 발행은 VELOG_ALLOW_PUBLIC=1 이 필요하다). 되돌리려면 velog_unpublish_post 로 초안으로 내릴 수 있다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 본문 (마크다운). 문체: 사람이 쓴 글처럼 자연스럽게. 긴 줄표(—)와 가운뎃점(·)을 쓰지 말고 쉼표나 마침표로 끊을 것. "**하나.** ... **둘.**" 식 볼드 번호 나열 금지(산문이나 평범한 불릿으로). 문단은 2~3문장으로 짧게, 200자가 넘으면 쪼갠다. "이 글의 한계" 같은 부록 절을 만들지 말고 해당 문단 자리에 한 문장으로 녹일 것. | |
| tags | No | ||
| title | Yes | 글 제목. 긴 줄표(—) 금지. 부제는 콜론이나 괄호, 짧은 하이픈으로. | |
| url_slug | No | 생략하면 제목에서 생성 | |
| series_id | No | ||
| thumbnail | No | 썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다 | |
| series_name | No | 시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint:false and destructiveHint:true, but the description adds critical behavioral nuance: the private-only publishing constraint and the required environment variable, plus the fact that the action can be reversed via unpublish. This goes beyond the annotations and informs the agent of important side effects and preconditions. No contradiction with annotations; destructiveHint:true is consistent with the act of making a post live, though the description clarifies it is reversible.
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 description is two sentences, front-loaded with the primary action ('새 글을 바로 발행한다'), followed by the crucial constraint and the undo alternative. Every sentence adds value, and it avoids fluff. It is optimally concise for the information density.
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 a publishing tool with 7 parameters (2 required) and no output schema, the description adequately covers the action's semantics, constraints, and reversal path. The only gap is that it doesn't mention the return value (e.g., the published post object) or error handling, but given the tool's simplicity and the schema's param details, this is a minor omission. The description is otherwise complete for correct invocation.
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?
The schema covers 71% of parameters with descriptions (body, title, thumbnail, series_name), and the tool description adds no parameter-specific semantics beyond what the schema provides. The description does mention the private-only behavior but not tied to any parameter. Since coverage is moderate (not below 50%), the baseline of 3 is appropriate; the description does not compensate for the uncovered parameters (tags, url_slug, series_id) but those are self-explanatory given their names and defaults.
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 clearly states the action: '새 글을 바로 발행한다' (publishes a new post immediately). It explicitly distinguishes from draft-based workflows ('초안을 거치지 않는다') and from the sibling velog_publish_draft (which publishes an existing draft). The resource (new post) and verb (publish) are specific, and the immediate/direct nature sets it apart from related tools.
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 description gives explicit usage context: it publishes directly without a draft, and it notes the current configuration restricts to private-only unless VELOG_ALLOW_PUBLIC=1 is set. It also names the alternative for undoing the action (velog_unpublish_post). This provides clear when-to-use and when-not-to-use guidance, including a specific sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_recent_posts벨로그 최신 글ARead-only
벨로그 전체 최신 글. 지금 무슨 글이 올라오는지 훑을 때.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | 이전 페이지 마지막 글의 id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safe read-only nature is covered. The description adds the global scope ('전체') and a browsing-oriented behavior, but does not disclose details like pagination behavior, time window, or result shape. This is acceptable given the strong annotation coverage.
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, front-loaded sentences. The first states the resource, the second gives the use case. No filler or redundancy.
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 a simple read-only list tool with good annotations and a clear schema for its two parameters, the description is complete enough. It does not describe return values, but no output schema exists and the purpose is straightforward. Pagination is implied by the cursor param and documented in the schema.
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?
The description does not discuss parameters, and schema coverage is 50%. However, both parameters are simple: 'limit' is self-explanatory with type/min/max/default in the schema, and 'cursor' already has a clear schema description ('이전 페이지 마지막 글의 id'). No additional meaning is needed beyond what the schema provides.
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?
Description clearly states it returns '벨로그 전체 최신 글' (all latest posts on Velog), and the phrase '지금 무슨 글이 올라오는지 훑을 때' provides a specific browsing purpose. It is distinguishable from siblings like velog_trending_posts and velog_search_posts, though it does not explicitly name alternatives.
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 description gives a clear usage context: use when skimming what posts are currently being published globally ('지금 무슨 글이 올라오는지 훑을 때'). It does not explicitly state when not to use it or mention alternative tools, but the context is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_render_cover글 표지 만들기A
글 목록·SNS 미리보기에 쓸 표지 이미지(1200×630)를 만든다. 제목이 길면 줄바꿈하고, 그래도 안 들어가면 글자 크기를 줄인다 — 전부 실측 기준이다. 만든 뒤 velog_update_post 의 thumbnail 에 돌려받은 주소를 넣으면 표지가 된다.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| tone | No | ||
| title | Yes | ||
| footer | No | 우상단 서명 (예: '@milcho0604') | |
| kicker | No | 상단 작은 라벨 (예: '디버깅 기록') | |
| upload | No | ||
| post_id | No | ||
| subtitle | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which are all false and provide no behavioral hints), the description discloses adaptive text fitting: line wrapping and font-size reduction based on actual measurements. It also implies the output is a URL ('returned address'). This adds meaningful context about how the tool behaves. It does not mention the upload default behavior, but no contradiction exists.
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 description is two sentences, front-loaded with the primary purpose, followed by behavior and integration instructions. Every clause provides value, with no redundancy or filler. It is concise and well-structured for agent consumption.
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?
The description covers the core purpose, adaptive behavior, and integration with velog_update_post, which is essential for basic use. However, with eight parameters, no output schema, and sparse annotations, it omits details on several parameters (e.g., tone, subtitle, upload, post_id) and the exact return format. It is sufficient for a simple call but not fully complete for all scenarios.
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 only 25% (footer and kicker have descriptions). The description adds no semantic meaning for the remaining six parameters (title, subtitle, tone, tags, upload, post_id). It references title only in the context of wrapping behavior, not its semantics. Given the low schema coverage, the description fails to compensate, leaving agents without guidance for most parameters.
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 clearly states the tool's function: creates a cover image (1200×630) for post lists and SNS previews. It uses a specific verb (makes) and identifies the resource (cover image), effectively distinguishing it from sibling tools like velog_render_diagram and velog_upload_image.
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?
Provides clear context for when to use: to generate cover images for post lists/SNS previews. It also explicitly instructs to pass the returned URL to velog_update_post's thumbnail, demonstrating a concrete workflow. It doesn't state exclusions but offers sufficient guidance for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_render_diagram다이어그램 그리기A
구성도·흐름도를 그려 PNG 로 만들고 벨로그에 올린다. 본문에 붙일 마크다운을 돌려준다. 좌표만 주면 나머지는 렌더러가 맞춘다 — 노드 폭·캔버스 크기·선 꺾임·라벨 위치는 브라우저 실측으로 정해지고, 글자 삐져나옴/선 관통/겹침은 자가감사가 잡는다. 감사에 걸리면 올리지 않고 무엇이 문제인지 알려준다. 이 판단은 끌 수 없고, 감사에 걸린 산출물은 velog_upload_image 로도 받지 않는다. 고쳐서 다시 그릴 것. 밋밋하게 나오면 입력이 밋밋한 것이다. 사람 손 그림처럼 보이게 하는 셋: 노드마다 icon 과 tag(포트·버전·역할), 관련 노드는 groups 로 묶기, 흐름 종류가 둘 이상이면 planes 로 색 가르기. 나란한 노드는 y 를 맞추면 선이 곧게 나간다. 아이콘: alert arrow bell bolt branch browser cache chart check clock cloud code cross database file gear key layers lock mail mobile network package retry search server terminal user 톤: slate gray blue green amber yellow purple teal rose indigo
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | 이미지 대체 텍스트 | |
| edges | No | ||
| nodes | Yes | ||
| title | Yes | 그림 제목 (좌상단) | |
| groups | No | ||
| legend | No | ||
| planes | No | 흐름 종류. 생략하면 요청/외부 호출/데이터/관측 4종 | |
| upload | No | ||
| post_id | No | 붙일 글 id. 주면 벨로그가 내 글인지 확인한 뒤 받는다 | |
| subtitle | No | 한 줄 설명·근거 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnlyHint=false/idempotentHint=false/destructiveHint=false, the description carries the full burden of behavioral disclosure and delivers richly. It reveals that the tool uploads to Velog (mutation), that a self-check can refuse to upload and explain the problem, that this gate cannot be disabled, and that rejected outputs are also barred from velog_upload_image. It also discloses auto-layout mechanics (browser-measured node width, canvas, line bends, label positions). This is exactly the kind of value annotations don't provide. No contradiction with annotations.
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 description is longer than average but every block earns its place: purpose first, then mechanics, then the rejection gate, then style tips, then the two value enumerations. The icon/tone lists are verbose but essential since they're the sole source of valid values. The '밋밋하게 나오면 입력이 밋밋한 것이다' (dull input yields dull output) line is a memorable editorial touch that conveys a real constraint.
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?
There is no output schema, so the description correctly states the return contract: 'returns markdown to attach to the post body.' For a complex tool with 10 parameters and nested structures, the description covers the key decision-critical behaviors: auto-layout, rejection gate, and upload semantics. The post_id and subtitle parameters are documented in the schema, so their omission from the description is acceptable.
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 only 50%, so the description must compensate, and it does. It enumerates the valid icon values (alert arrow bell bolt ... terminal user) and tone values (slate gray blue ... rose indigo), which appear nowhere in the schema. It explains the coordinate philosophy ('origin can be anywhere — canvas auto-fits'), how w is measured when omitted, and how to use groups/planes for visual grouping. It adds real semantic value beyond the schema 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?
The description opens with a specific verb-resource pair: 'Draws a configuration/flow diagram, creates a PNG, uploads to Velog, returns markdown.' This clearly distinguishes a diagram-generation tool from the write/read/post siblings. However, it does not explicitly differentiate from the render_* siblings (velog_render_sequence, velog_render_cover); the distinction is only implicit via '구성도·흐름도' (architecture/flow diagram). It does reference velog_upload_image explicitly, which helps.
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 description provides strong how-to-use guidance: give coordinates and let the renderer auto-layout, use icons/tags/groups/planes for a hand-drawn look, align y for straight lines, and expect rejection if the self-check fails. What's missing is explicit when-to-use vs alternative routing — it never says 'for sequence diagrams use velog_render_sequence' or 'for covers use velog_render_cover.' The velog_upload_image mention is only negative (rejected outputs aren't accepted there).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_render_sequence시퀀스 다이어그램 그리기A
참가자와 순서 있는 메시지로 시퀀스 다이어그램을 그려 PNG 로 만들고 벨로그에 올린다. 좌표를 받지 않는다 — 열 간격, 행 높이, 활성 막대, 묶음 상자를 전부 렌더러가 실측으로 정한다. 라벨이 안 들어가면 글자를 줄이는 게 아니라 그 구간을 넓히고, 길면 접고, 접힌 만큼 행을 높인다. 메시지는 배열 순서가 곧 시간 순서다. 중간에 하나를 끼워 넣어도 아래가 알아서 밀린다. 구성도나 흐름도(시간 축이 없는 그림)는 velog_render_diagram 을 쓸 것. 깔끔하게 나오는 건 레이아웃이 아니라 입력이 정한다. 세로 길이를 지배하는 셋:
call에는 짝이 되는return을 붙인다. 안 닫힌 활성 막대는 계단처럼 겹쳐 쌓인다.note는 한 줄로 쓴다. 접힌 줄 수만큼 그 행이 통째로 높아진다.구분 기호(& ? = / , ; |)가 있는 긴 라벨은 렌더러가 그 뒤에서 끊는다. 그런 기호가 없는 긴 한글 토큰만 직접 끊어주면 된다. ⚠️ 자가감사 통과는 「보기 좋다」가 아니다. 감사는 기하만 본다 — 삐져나옴, 겹침, 관통, 상자 범위. 쌓인 막대도 어색한 줄바꿈도 통과시킨다. 감사에 걸리면 올리지 않고 무엇이 문제인지 알려준다. 이 판단은 끌 수 없고, 감사에 걸린 산출물은 velog_upload_image 로도 받지 않는다. 종류: call async return note 아이콘: alert arrow bell bolt branch browser cache chart check clock cloud code cross database file gear key layers lock mail mobile network package retry search server terminal user 톤: slate gray blue green amber yellow purple teal rose indigo
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | 이미지 대체 텍스트 | |
| title | Yes | 그림 제목 (좌상단) | |
| legend | No | ||
| upload | No | ||
| numbers | No | 메시지 앞에 1. 2. 3. 을 붙인다 | |
| post_id | No | 붙일 글 id. 주면 벨로그가 내 글인지 확인한 뒤 받는다 | |
| messages | Yes | 배열 순서가 시간 순서다. call 마다 짝이 되는 return 을 넣어야 활성 막대가 닫힌다 | |
| subtitle | No | 한 줄 설명·근거 | |
| fragments | No | alt·opt·loop 묶음 상자. 서로 완전히 포개거나 완전히 떨어져야 한다 | |
| activations | No | call/return 짝에서 활성 막대를 뽑아 그린다 | |
| participants | Yes | 왼쪽부터 순서대로 세로 열이 된다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several behavioral traits beyond the minimal annotations: it uploads to Velog (side effect), it runs an automatic geometric audit that can reject output and prevent upload, the audit cannot be disabled, and rejected images cannot be uploaded via velog_upload_image. It also explains layout behaviors like auto-widening, folding, and how vertical size is dominated by input structure. These are valuable and non-obvious details that guide agent 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?
The description is long but well-structured: it leads with the core purpose, then a bold note about coordinates, then a warning about audit behavior, then a list of kinds, icons, and tones. Every sentence adds information, and formatting (bullets, bold) improves scannability. It is appropriately sized for the tool's complexity and avoids redundancy.
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 a tool with 11 parameters, no output schema, and rich behavioral rules, the description covers the essential context: when to use it, how to structure input for good results, what the audit does, and what happens on failure. It does not describe the return value explicitly, but given that the tool uploads and likely returns a reference, this is a minor gap. Overall, it is complete enough for an agent to call it correctly and anticipate outcomes.
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?
The schema already documents parameters well (82% coverage). The description adds some semantic context: message array order equals time order (also in schema), call needs matching return (also in schema), note is for description boxes (in schema). However, it adds new meaning about auto line-breaking on separators and the rule that only long Korean tokens without separators need manual breaking. This is helpful but not critical for parameter understanding since schema covers most, so a 4 is warranted.
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 clearly states the tool draws sequence diagrams from participants and ordered messages, renders them as PNG, and uploads to Velog. It explicitly distinguishes itself from velog_render_diagram by specifying that for non-temporal diagrams (구성도/흐름도), the sibling tool should be used. This leaves no ambiguity about what this tool does and how it differs.
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 description provides explicit guidance on when to use this tool vs velog_render_diagram ('구성도나 흐름도(시간 축이 없는 그림)는 velog_render_diagram 을 쓸 것'). It also gives concrete input-shaping rules to achieve good output: matching calls with returns, keeping notes to one line, and handling long labels with separators. This is actionable usage instruction, not just a generic statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_search_posts벨로그 글 검색ARead-only
키워드로 벨로그 전체를 검색한다. username 을 주면 그 사람 글 안에서만 찾는다 — "내가 예전에 쓴 그 글" 을 찾을 때 이 조합을 쓴다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | 페이지네이션 | |
| keyword | Yes | 검색어 | |
| username | No | 이 사용자의 글로 한정 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds the scoping behavior (entire Velog vs. user-specific), which is useful context, but it does not disclose return format, rate limits, or authentication needs. With annotations in place, this is adequate but not deeply transparent.
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 description is two sentences long, front-loaded with the main purpose, and includes a memorable use-case example. Every word earns its place, with no repetition or filler.
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 a search tool with 4 parameters, annotations, and no output schema, the description covers purpose, scoping, and a practical use case. It does not explain the return structure, but the schema documents offset for pagination. Overall, it is reasonably complete, though a bit more detail about result contents would push it higher.
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 75%, with keyword, username, and offset already documented. The description's phrase 'username 을 주면 그 사람 글 안에서만 찾는다' reinforces the username meaning but is largely redundant with the schema's '이 사용자의 글로 한정'. No additional detail is provided for limit or offset beyond what the schema already states.
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 the specific verb '검색한다' (search) with the resource '벨로그 전체' (entire Velog), clearly distinguishing it from sibling tools like velog_list_posts, velog_trending_posts, and velog_recent_posts. The optional username scoping adds further precision, making the tool's purpose immediately clear.
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 description explicitly provides a concrete use case: '내가 예전에 쓴 그 글' 을 찾을 때 이 조합을 쓴다 (use this combination when looking for a post I wrote). This gives clear context for when to pair keyword with username, though it does not explicitly name alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_trending_posts벨로그 트렌딩ARead-only
벨로그 전체에서 지금 많이 읽히는 글. 기간(day/week/month/year)을 골라 본다. 내 글이 아니라 벨로그 전체 순위다. 무엇이 반응을 얻는지, 어떤 주제가 도는지 볼 때 쓴다. 특정 사용자의 글은 velog_list_posts, 검색은 velog_search_posts 를 쓴다. year 기간은 벨로그가 limit>20 이면 빈 결과를 주므로 20 으로 낮추고, offset 도 1000 까지만 받는다. 조정하면 응답 notes 에 적어 준다. 인증 불필요.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 가져올 글 수 (1~50, 기본 20). year 기간은 20 을 넘기면 벨로그가 빈 결과를 주어 20 으로 낮춘다 | |
| offset | No | 건너뛸 글 수. 다음 페이지는 **실제로 적용된 limit** 만큼 더한다 — day·week·month 는 준 값 그대로, year 는 `min(limit, 20)` 이다. year 에서 20 을 넘겨 주면 20 으로 낮춰지므로 그때는 20씩 더해야 사이가 안 빈다. year 의 offset 상한은 1000 이고, 넘기면 1000 으로 낮춰져 같은 페이지가 나온다. 응답 첫 줄에 이번에 적용된 limit·offset 이 항상 적힌다 | |
| timeframe | No | 집계 기간. day=오늘, week=이번 주(기본), month=이번 달, year=올해 | week |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true and destructiveHint=false, and the description adds beyond them: no auth required, the year-period limit>20 empty-result quirk, the offset cap of 1000, and that adjusted values are reported in the response. This discloses important edge-case behavior not available from annotations alone.
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?
Front-loaded with the core concept, then scope clarification, use cases, sibling routing, and edge cases in a logical order. Every sentence earns its place and there is no filler or redundant restatement of the title.
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 a 3-parameter read-only tool with no output schema, the description plus annotations and rich schema fully cover selection, invocation, authentication, edge cases, and response adjustment notes. Nothing an agent needs to call it correctly 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%, and the schema already documents limit/offset/timeframe in detail, including the year edge cases. The description repeats those constraints rather than adding new parameter-level meaning, so the baseline of 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?
Description states a specific verb+resource: '벨로그 전체에서 지금 많이 읽히는 글' (Velog-wide currently popular posts), and explicitly clarifies it is a global ranking, not the user's own posts. It also contrasts with velog_list_posts and velog_search_posts, making the purpose unmistakable.
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 tells when to use the tool ('무엇이 반응을 얻는지, 어떤 주제가 도는지 볼 때') and names alternatives for related cases: specific user's posts → velog_list_posts, search → velog_search_posts. Also states it is not for one's own posts, giving clear exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_unpublish_post발행 취소 (초안으로 되돌리기)ADestructiveIdempotent
발행된 글을 임시저장으로 되돌린다. 글은 사라지지 않고 초안 목록으로 간다. ★ 이미 나간 RSS·구독 메일은 회수되지 않는다 — 검색엔진 캐시도 한동안 남는다.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 발행된 글의 id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful context beyond annotations: it clarifies that the post is not deleted (countering destructiveHint), and discloses that RSS/subscription emails are not recalled and search engine caches persist. This addresses potential consequences of the operation.
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 concise sentences, the first states the primary action clearly, the second adds necessary caveats. The use of a star highlights the important side-effect. No wasted words.
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 a simple mutation tool with one parameter and no output schema, the description is comprehensive. It explains the outcome (draft list), the non-deletion, and external side effects. This fully covers the user's likely concerns.
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% for the single parameter 'id', which is described as the ID of the published post. The description adds no additional parameter semantics beyond what the schema already provides, 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?
The description clearly states the verb and resource: reverts a published post to draft. It distinguishes from siblings like publish_post and publish_draft by explicitly targeting the unpublish action. The title also reinforces the purpose.
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 description doesn't explicitly name alternatives, but the action is unambiguous: use this when you need to revert a published post to draft. The context of not deleting the post helps set expectations. No exclusions are stated, but the purpose is sufficient for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_update_draft벨로그 초안 수정ADestructive
기존 초안을 통째로 교체한다. 부분 수정이 아니다. 생략한 필드는 유지되지 않고 초기화된다 — tags 를 안 주면 기존 태그가 전부 지워지고, url_slug 를 안 주면 제목에서 새로 만들어 주소가 바뀌며, series_id 를 안 주면 기존 시리즈 연결이 끊긴다. 그래서 수정 전에 velog_get_post 로 현재 값을 읽어 바꾸지 않을 필드도 그대로 다시 넘기는 것을 권한다. 발행된 글의 id 는 거부한다(비공개로 내려가는 사고 방지).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 초안의 id (velog_list_drafts 로 확인) | |
| body | Yes | 본문 전체 (마크다운). 부분 수정이 아니라 교체다. 문체: 사람이 쓴 글처럼 자연스럽게. 긴 줄표(—)와 가운뎃점(·)을 쓰지 말고 쉼표나 마침표로 끊을 것. "**하나.** ... **둘.**" 식 볼드 번호 나열 금지(산문이나 평범한 불릿으로). 문단은 2~3문장으로 짧게, 200자가 넘으면 쪼갠다. "이 글의 한계" 같은 부록 절을 만들지 말고 해당 문단 자리에 한 문장으로 녹일 것. | |
| tags | No | ||
| title | Yes | 글 제목. 긴 줄표(—) 금지. 부제는 콜론이나 괄호, 짧은 하이픈으로. | |
| url_slug | No | ||
| series_id | No | ||
| thumbnail | No | 썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다 | |
| series_name | No | 시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description details exactly what destruction occurs: omitted fields are reset, missing tags are deleted, missing url_slug is regenerated from the title changing the URL, and missing series_id breaks the series link. It also discloses the safety guard that published post IDs are rejected. This is rich behavioral context that the annotations alone would not 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?
The description front-loads the most critical fact (wholesale replacement), then lists concrete consequences, then gives a preventive workflow, then mentions a safety constraint. Every sentence carries load-bearing information; nothing is filler. Despite covering several behavioral nuances, it remains compact and scannable.
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 a destructive 8-parameter tool with no output schema, the description thoroughly covers behavioral risks and pre-conditions. It explains omitted-field semantics across multiple parameters and the published-post guard. The only notable gap is the absence of any mention of the return value or success/failure response, which is mildly important when no output schema exists.
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?
With only 63% schema coverage, the description compensates by explaining the behavioral consequences of omitting key optional parameters: tags, url_slug, and series_id. It adds meaning beyond the schema by stating that omission resets these fields. It does not discuss thumbnail or series_name, but the schema already covers those reasonably, so the total compensation is solid though not exhaustive.
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?
Description opens with a specific verb and resource: '기존 초안을 통째로 교체한다' (replace an existing draft wholesale), making the core action unambiguous. It further distinguishes itself from sibling update tools by rejecting published post IDs, which separates it from velog_update_post.
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 description gives clear when-not guidance: published post IDs are rejected, meaning this tool is only for drafts. It also recommends reading current values with velog_get_post before updating and passing unchanged fields, which is actionable usage context. However, it does not explicitly name velog_update_post as the alternative for published posts, so the routing is slightly less direct than ideal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_update_post발행글 수정ADestructive
이미 발행된 글을 수정한다. 발행 상태(is_temp:false)는 유지된다. 생략한 필드는 기존 값을 그대로 유지한다 — 초안 도구와 달리 전체 교체가 아니다. 초안 id 는 거부한다(초안 수정은 velog_update_draft). 현재 설정에서는 공개 범위를 바꿀 수단이 없다 — 공개 글은 공개로, 비공개 글은 비공개로 그대로 남는다. 범위를 바꾸려면 VELOG_ALLOW_PUBLIC=1 이 필요하다.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | 생략하면 기존 본문 유지. 문체: 사람이 쓴 글처럼 자연스럽게. 긴 줄표(—)와 가운뎃점(·)을 쓰지 말고 쉼표나 마침표로 끊을 것. "**하나.** ... **둘.**" 식 볼드 번호 나열 금지(산문이나 평범한 불릿으로). 문단은 2~3문장으로 짧게, 200자가 넘으면 쪼갠다. "이 글의 한계" 같은 부록 절을 만들지 말고 해당 문단 자리에 한 문장으로 녹일 것. | |
| tags | No | 생략하면 기존 태그 유지 | |
| title | No | 글 제목. 긴 줄표(—) 금지. 부제는 콜론이나 괄호, 짧은 하이픈으로. | |
| url_slug | No | 생략하면 기존 주소 유지 | |
| series_id | No | ||
| thumbnail | No | 썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다 | |
| series_name | No | 시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description adds valuable behavioral context: published status is preserved, omitted fields retain existing values, draft IDs are rejected, and visibility scope cannot be changed under the current configuration. No contradiction with annotations exists.
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 description is front-loaded with the main purpose and each sentence carries substantive information. It is slightly dense with multiple clauses and configuration details, but nothing feels wasted given the complexity of the behavior being described.
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 a mutation tool with 8 parameters and unusual partial-update semantics, the description plus schema provides enough context to call it correctly: required id, behavior for omitted fields, draft exclusion, visibility constraints, and the alternative tool for drafts. No output schema is present, but return values are not essential for correct invocation.
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?
The description adds important tool-level parameter semantics: omitted fields keep existing values rather than resetting, which is central to correctly using the optional parameters. The schema already covers most parameters well, though id and series_id still lack direct explanation in either the schema or description.
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 opens with a specific verb and resource: '이미 발행된 글을 수정한다' (edits an already-published post). It also distinguishes itself from sibling velog_update_draft by explicitly stating that draft IDs are rejected and draft editing belongs to a different tool.
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 description gives clear when-to-use guidance: use this for published posts, not drafts, and explicitly names velog_update_draft as the alternative. It also contrasts the partial-update behavior with the draft tool's full-replacement behavior, further guiding correct tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_upload_image이미지 올리기A
로컬 이미지 파일을 벨로그에 올리고 본문용 마크다운을 돌려준다. PNG·JPEG·GIF·WebP 만 받으며, 확장자가 아니라 파일 내용으로 판정한다. ⚠️ 올라간 주소는 공개다 — 주소를 아는 사람은 누구나 볼 수 있고, 벨로그에는 이미지 삭제 API 가 없다. 올리기 전에 무슨 파일인지 확인하라.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | ||
| path | Yes | 로컬 파일 경로 | |
| type | No | profile 은 프로필 사진용 분류일 뿐 — 사진 교체는 velog_update_profile_image | post |
| post_id | No | 붙일 글 id (서버가 소유권을 확인한다) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the minimal annotations: it specifies valid formats (PNG/JPEG/GIF/WebP) and that detection is by content, not extension. It also warns that uploaded URLs are public, there is no deletion API, and encourages pre-upload verification. This adds significant and non-obvious context, giving the agent both safety and operational awareness. The annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) are not contradicted; rather, the description enriches them.
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 description is three sentences: the first states purpose, the second provides format constraints, the third conveys a critical warning. It is front-loaded, and every sentence adds distinct value. The use of a warning symbol and bold for '파일 내용' draws attention without unnecessary verbiage.
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?
Given no output schema, the description provides a clear output expectation ('markdown for the body') and covers key behavioral constraints (file types, public URLs, no deletion). It also benefits from schema descriptions that explain the 'type' and 'post_id' parameters. Minor gaps remain, such as exact markdown format or error handling for invalid files, but overall the definition is well-rounded for an agent.
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 75% (descriptions for path, type, post_id; alt lacks one). The description adds meaning to the path parameter by constraining accepted file types and specifying content-based validation, which is not present in the schema. It also clarifies the tool's output (markdown) relevant to the overall parameters. While not detailing each parameter syntax, it compensates for the alt gap partially and enhances the path semantics above the 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 clearly states a specific action: 'Uploads a local image file to Velog and returns markdown for the body.' It names the resource (local image), the destination (Velog), and the output (markdown), distinguishing it from sibling tools like velog_render_cover or velog_update_profile_image (the latter explicitly referenced in the type parameter).
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 description implies the primary use case (uploading images for post body markdown) through the phrase '본문용 마크다운' and warns about appropriate file types. An explicit alternative is provided in the type parameter description: 'profile 은 프로필 사진용 분류일 뿐 — 사진 교체는 velog_update_profile_image' (profile is just a classification; replacement goes to velog_update_profile_image). However, this alternative is not in the main description, only in the schema, so it lacks the explicitness of a fully self-contained usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_user_tags사용자 태그 목록ARead-only
사용자가 쓴 태그와 각 태그의 글 수. "이 사람이 뭘 주로 쓰나"를 가장 싸게 파악하는 방법이다.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| username | Yes | @ 없이 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, so the agent knows it's a safe read. The description adds minimal behavioral context beyond that (only that it's 'cheapest'). No mention of pagination, ordering, or rate limits, but given the annotations, the bar is lower and the description does not contradict them.
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 description is extremely concise, using one sentence to state the output and another to provide a use case. It front-loads the purpose with no filler, making it easy to parse.
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 a simple two-parameter read-only tool, the description covers the core purpose and return content, but it omits details about ordering, limit semantics, and edge cases (e.g., empty result). Since there is no output schema, the description could be more explicit about the return structure.
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 50%: 'username' has a description ('@ 없이'), but 'top' has none. The tool description does not explain what 'top' controls (e.g., number of tags to return). Since the description does not compensate for the undocumented parameter, it fails to add semantic value 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?
The description clearly identifies the tool's function: it returns a user's tags with post counts. It also provides a concrete use case ('이 사람이 뭘 주로 쓰나'를 가장 싸게 파악하는 방법), which distinguishes it from sibling tools like user info or post lists by focusing on aggregated tag statistics.
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 description gives a clear context: use it to quickly understand a user's main writing topics. It implies this is a cheap, high-level alternative to reading individual posts, but it doesn't explicitly mention when not to use it or name alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_whoami내 계정 확인ARead-only
현재 토큰으로 인증된 계정을 확인한다. 토큰이 살아있는지 점검하는 용도로도 쓴다. 다른 도구에서 username 을 생략하면 여기서 얻는 계정을 쓴다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safe read-only nature is known. The description adds useful behavioral context: the tool's output is reused as a fallback username in other operations, and it can serve as a token liveness check. This goes beyond the annotations without contradicting them.
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 description is two sentences, each carrying distinct value: the primary function and the integration use case. It is front-loaded with the core purpose and avoids redundancy or filler.
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 a simple, zero-parameter, read-only tool with good annotations, the description is complete. It covers purpose, usage, and integration. The only minor gap is the lack of explicit return format, but the phrase '여기서 얻는 계정' (the account obtained here) implies the returned user object, which is sufficient.
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?
The tool has no parameters, so the baseline is 4. The description does not need to explain parameter details, but it implicitly explains the output's role (the authenticated account) which is the meaningful semantic content for a no-parameter tool.
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 clearly states the tool's function: '현재 토큰으로 인증된 계정을 확인한다' (checks the account authenticated with the current token). It specifies the resource (authenticated account) and adds a secondary purpose of checking token liveness. This differentiates it from sibling tools like velog_get_user, which fetches arbitrary users.
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 description gives clear usage context: it is used to verify the token and serves as the source for the default username when omitted in other tools. While it doesn't explicitly name alternatives or exclusions, the guidance about its integration with other tools is practical and distinguishes when to use it.
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.
8 tool updates
v0.9.2- Changed
velog_create_draft5 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"본문 (마크다운)"New value: +"본문 (마크다운). 문체: 사람이 쓴 글처럼 자연스럽게. 긴 줄표(—)와 가운뎃점(·)을 쓰지 말고 쉼표나 마침표로 끊을 것. \"**하나.** ... **둘.**\" 식 볼드 번호 나열 금지(산문이나 평범한 불릿으로). 문단은 2~3문장으로 짧게, 200자가 넘으면 쪼갠다. \"이 글의 한계\" 같은 부록 절을 만들지 말고 해당 문단 자리에 한 문장으로 녹일 것." - removed
Input schema / properties / thumbnail / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / thumbnail / typeAdded value: +[ + "string", + "null" +] - changed
Input schema / properties / title / descriptionPrevious value: -"글 제목"New value: +"글 제목. 긴 줄표(—) 금지. 부제는 콜론이나 괄호, 짧은 하이픈으로." - added
Input schema / properties / title / maxLengthAdded value: +255
- Added
velog_diagnose - Changed
velog_export_posts1 field changed- added
Input schema / properties / skip_existingAdded value: +{ + "default": false, + "description": "out_dir 에 **이미 내보낸 글**은 건너뛴다. 파일 이름에 글 id 가 들어 있어 그 이름의 파일이 읽을 수 있는 일반 파일이고 비어 있지 않으면 «받았다» 로 본다 (내용은 읽지 않는다). 예산·취소로 멈췄을 때 같은 인자에 이것만 켜서 다시 부르면 남은 글부터 이어간다. 이름 규칙이 다른 옛 백업은 다시 받는다", + "type": "boolean" +}
- Changed
velog_publish_post5 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"본문 (마크다운)"New value: +"본문 (마크다운). 문체: 사람이 쓴 글처럼 자연스럽게. 긴 줄표(—)와 가운뎃점(·)을 쓰지 말고 쉼표나 마침표로 끊을 것. \"**하나.** ... **둘.**\" 식 볼드 번호 나열 금지(산문이나 평범한 불릿으로). 문단은 2~3문장으로 짧게, 200자가 넘으면 쪼갠다. \"이 글의 한계\" 같은 부록 절을 만들지 말고 해당 문단 자리에 한 문장으로 녹일 것." - removed
Input schema / properties / thumbnail / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / thumbnail / typeAdded value: +[ + "string", + "null" +] - added
Input schema / properties / title / descriptionAdded value: +"글 제목. 긴 줄표(—) 금지. 부제는 콜론이나 괄호, 짧은 하이픈으로." - added
Input schema / properties / title / maxLengthAdded value: +255
- Changed
velog_render_diagram6 fields changed- added
Input schema / properties / edges / items / properties / label_at / additionalItemsAdded value: +false - added
Input schema / properties / edges / items / properties / label_at / maxItemsAdded value: +2 - added
Input schema / properties / edges / items / properties / label_at / minItemsAdded value: +2 - added
Input schema / properties / edges / items / properties / points / items / additionalItemsAdded value: +false - added
Input schema / properties / edges / items / properties / points / items / maxItemsAdded value: +2 - added
Input schema / properties / edges / items / properties / points / items / minItemsAdded value: +2
- Changed
velog_trending_posts3 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"가져올 글 수 (1~50, 기본 20). year 기간은 20 을 넘기면 벨로그가 빈 결과를 주어 20 으로 낮춘다" - added
Input schema / properties / offset / descriptionAdded value: +"건너뛸 글 수. 다음 페이지는 **실제로 적용된 limit** 만큼 더한다 — day·week·month 는 준 값 그대로, year 는 `min(limit, 20)` 이다. year 에서 20 을 넘겨 주면 20 으로 낮춰지므로 그때는 20씩 더해야 사이가 안 빈다. year 의 offset 상한은 1000 이고, 넘기면 1000 으로 낮춰져 같은 페이지가 나온다. 응답 첫 줄에 이번에 적용된 limit·offset 이 항상 적힌다" - added
Input schema / properties / timeframe / descriptionAdded value: +"집계 기간. day=오늘, week=이번 주(기본), month=이번 달, year=올해"
- Changed
velog_update_draft5 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"본문 전체 (마크다운). 부분 수정이 아니라 교체다"New value: +"본문 전체 (마크다운). 부분 수정이 아니라 교체다. 문체: 사람이 쓴 글처럼 자연스럽게. 긴 줄표(—)와 가운뎃점(·)을 쓰지 말고 쉼표나 마침표로 끊을 것. \"**하나.** ... **둘.**\" 식 볼드 번호 나열 금지(산문이나 평범한 불릿으로). 문단은 2~3문장으로 짧게, 200자가 넘으면 쪼갠다. \"이 글의 한계\" 같은 부록 절을 만들지 말고 해당 문단 자리에 한 문장으로 녹일 것." - removed
Input schema / properties / thumbnail / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / thumbnail / typeAdded value: +[ + "string", + "null" +] - added
Input schema / properties / title / descriptionAdded value: +"글 제목. 긴 줄표(—) 금지. 부제는 콜론이나 괄호, 짧은 하이픈으로." - added
Input schema / properties / title / maxLengthAdded value: +255
- Changed
velog_update_post5 fields changed- changed
Input schema / properties / body / descriptionPrevious value: -"생략하면 기존 본문 유지"New value: +"생략하면 기존 본문 유지. 문체: 사람이 쓴 글처럼 자연스럽게. 긴 줄표(—)와 가운뎃점(·)을 쓰지 말고 쉼표나 마침표로 끊을 것. \"**하나.** ... **둘.**\" 식 볼드 번호 나열 금지(산문이나 평범한 불릿으로). 문단은 2~3문장으로 짧게, 200자가 넘으면 쪼갠다. \"이 글의 한계\" 같은 부록 절을 만들지 말고 해당 문단 자리에 한 문장으로 녹일 것." - removed
Input schema / properties / thumbnail / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / thumbnail / typeAdded value: +[ + "string", + "null" +] - added
Input schema / properties / title / descriptionAdded value: +"글 제목. 긴 줄표(—) 금지. 부제는 콜론이나 괄호, 짧은 하이픈으로." - added
Input schema / properties / title / maxLengthAdded value: +255
5 tool updates
v0.6.0- Changed
velog_create_draft5 fields changed- changed
Input schema / properties / series_id / descriptionPrevious value: -"소속시킬 시리즈 id. ★ 벨로그는 임시저장 단계에서 이걸 무시한다 — 초안 생성 후 velog_update_draft 로 다시 지정해야 실제로 붙는다"New value: +"소속시킬 시리즈 id. 벨로그가 임시저장 생성 단계에서 이걸 버리므로 이 도구가 저장 직후 한 번 더 붙이고, 붙었는지 확인해 결과에 적는다. 생략하면 결과에 내 시리즈 목록을 함께 돌려준다" - added
Input schema / properties / series_nameAdded value: +{ + "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / thumbnail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / thumbnail / descriptionPrevious value: -"썸네일 이미지 URL (http/https 만)"New value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다" - removed
Input schema / properties / thumbnail / typeRemoved value: -"string"
- Changed
velog_publish_post4 fields changed- added
Input schema / properties / series_nameAdded value: +{ + "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / thumbnail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / thumbnail / descriptionAdded value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다" - removed
Input schema / properties / thumbnail / typeRemoved value: -"string"
- Added
velog_render_sequence - Changed
velog_update_draft4 fields changed- added
Input schema / properties / series_nameAdded value: +{ + "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / thumbnail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / thumbnail / descriptionAdded value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다" - removed
Input schema / properties / thumbnail / typeRemoved value: -"string"
- Changed
velog_update_post4 fields changed- added
Input schema / properties / series_nameAdded value: +{ + "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / thumbnail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / thumbnail / descriptionAdded value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다" - removed
Input schema / properties / thumbnail / typeRemoved value: -"string"
21 tool updates
v0.3.0- First observed
velog_blog_stats - First observed
velog_create_draft - First observed
velog_export_posts - First observed
velog_get_post - First observed
velog_get_user - First observed
velog_list_drafts - First observed
velog_list_posts - First observed
velog_list_series - First observed
velog_publish_draft - First observed
velog_publish_post - First observed
velog_recent_posts - First observed
velog_render_cover - First observed
velog_render_diagram - First observed
velog_search_posts - First observed
velog_trending_posts - First observed
velog_unpublish_post - First observed
velog_update_draft - First observed
velog_update_post - First observed
velog_upload_image - First observed
velog_user_tags - First observed
velog_whoami
TDQS
Scored across 23 tools
The toolset clearly separates read, write, publish, and rendering concerns, and descriptions explicitly distinguish draft vs published operations and global vs user-scoped listings. A few adjacent tools—notably velog_blog_stats vs velog_user_tags and the three render tools—could be misselected if descriptions aren't read carefully, but they are ultimately distinct.
Most tools follow a clean verb_noun pattern under the velog_ prefix (list_posts, create_draft, publish_post, render_diagram). The consistency is slightly weakened by noun-phrase exceptions like velog_recent_posts, velog_blog_stats, velog_user_tags, and the bare velog_diagnose, but the naming remains predictable and readable.
At 23 tools, the server is at the high end where tool count starts to feel heavy. Many tools are domain-specific and arguably earn their place, but the large set plus several adjacent utilities (rendering trio, stats/tags) makes it harder to navigate than a more scoped server.
The lifecycle is well covered for reading, creating, editing, publishing, and unpublishing posts and drafts, with useful extras like stats, export, and image rendering. However, there is no delete operation for posts or drafts, and no series or comment management, so some common tasks hit dead ends and require workarounds.
Maintenance
Related MCP Connectors
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
A MCP server built for developers enabling Git based project management with project and personal…
Related MCP Servers
- FlicenseAqualityDmaintenanceA custom MCP server for interacting with Google Blogger blogs. It provides tools to list, create, edit, delete, and publish blog posts through Claude Code or Claude Desktop.9-
- AlicenseAqualityDmaintenanceMCP server for Velog blog platform enabling reading, searching, and writing articles via AI assistants.125 npmMIT
- FlicenseAqualityDmaintenanceAn MCP server that automatically generates technical blog posts using AI (Gemini and Claude), supporting various input types, styles, and collaborative workflow.10-
- AlicenseAqualityBmaintenanceMCP server for Hashnode GraphQL API to create drafts, publish posts, and manage your blog via Claude.117 npmMIT