Skip to main content
Glama

velog-mcp

npm Node License Runtime deps

An MCP server for Velog, the Korean developer blogging platform. Read your blog, draft posts, publish them, and back everything up — from Claude or any MCP client.

한국어 문서 →


Why another one?

Two Velog MCP servers already exist. This one differs in three ways.

1. Publishing is a permission, not a default. Out of the box the server can create drafts and publish privately. Public publishing requires you to set an environment variable. The model cannot flip that switch — only you can, in your MCP config.

2. Every quirk is measured, not assumed. Velog's GraphQL API is undocumented. This repo records what it actually does, verified against velog-io/velog source and live calls. Six server-side quirks are written up in docs/api-reference.md — including one that silently returns an empty list, and one that can turn your published posts private.

3. Two runtime dependencies. @modelcontextprotocol/sdk and zod. HTTP, test runner, and TypeScript execution all come from Node itself.


Related MCP server: velog-mcp

Install

Requires Node.js 22.18 or newer. What runs is the compiled dist/index.js, but development and verification execute .ts directly, and 22.18 is the first release where that works without a flag. CI covers 22.18, 24 and 26.

/plugin marketplace add milcho0604/velog-mcp
/plugin install velog@milcho

Installation asks for four values. Leave them all blank and it still installs, running read-only.

Prompt

If left blank

Velog refresh token

Read-only (browse, search, stats still work)

Allow public publishing

Drafts and private publishing only

Allow profile edits

Profile tools stay off

Chrome path

Found automatically in standard locations

The token goes into the macOS Keychain, not into a settings file in plaintext. Only values declared sensitive: true reach the Keychain, and a test enforces that declaration (P7).

Change values later with /plugin manage.

As a plain MCP server

Published on npm, so nothing to clone — your MCP client runs it via npx. See Configure for the config block and the client-support note.

claude mcp add velog -e VELOG_REFRESH_TOKEN=your_refresh_token \
  -- npx -y @milcho0604/velog-mcp@0.8.10

The token stays in your client's config file here. The plugin route above puts it in the Keychain instead.

From source

git clone https://github.com/milcho0604/velog-mcp.git
cd velog-mcp
npm install && npm run build

Configure

Add this to your MCP client config (claude_desktop_config.json, .mcp.json, …):

{
  "mcpServers": {
    "velog": {
      "command": "npx",
      "args": ["-y", "@milcho0604/velog-mcp@0.8.10"],
      "env": {
        "VELOG_REFRESH_TOKEN": "your_refresh_token"
      }
    }
  }
}

With the Claude Code CLI:

claude mcp add velog -e VELOG_REFRESH_TOKEN=your_refresh_token \
  -- npx -y @milcho0604/velog-mcp@0.8.10

To run a local checkout instead, swap the command for node /absolute/path/to/velog-mcp/dist/index.js.

Which clients can run this? This is a stdio server: the client starts it as a local process. That works in Claude Code, Claude Desktop, Cursor, and other clients that run MCP servers locally. It does not work in the claude.ai or ChatGPT web apps — both accept only remote MCP servers reachable over HTTP, since the connection originates from their servers rather than your machine. Using it there would mean hosting it publicly and handing your Velog token to that deployment, which defeats the point of keeping the token on your own machine.

Getting your token

Velog has no public write API, so the server authenticates with your browser session cookie.

  1. Log in at velog.io

  2. Open DevTools (F12) → ApplicationCookieshttps://velog.io

  3. Copy the value of refresh_token

VELOG_REFRESH_TOKEN alone is enough. Velog's server reissues the short-lived access_token on its own (authPlugin.mts), and this server picks the refreshed cookie out of the response. One paste lasts 30 days.

VELOG_ACCESS_TOKEN also works but expires in about an hour by itself.

Tokens are read from the environment only. They are never written to disk, and the server never reads your browser's cookie database or your OS keychain. Whatever you put in your MCP config file does live there in plain text, though — that file is yours to protect.

Without a token the server still starts, read-only. Public posts, search, trending, and blog stats all work unauthenticated.


Permissions

Environment

What you get

(nothing set)

Read everything · create drafts · publish privately · draw and upload images — 22 tools

VELOG_ALLOW_PUBLIC=1

…plus public publishing (adds an is_private parameter)

VELOG_ALLOW_PROFILE=1

…plus profile editing (adds 5 tools)

The two switches are independent — enable either, both, or neither.

"env": {
  "VELOG_REFRESH_TOKEN": "...",
  "VELOG_ALLOW_PUBLIC": "1",
  "VELOG_ALLOW_PROFILE": "1"
}

Accepted as "on": 1, true, yes, on. Anything else is off — a typo won't quietly enable it.

When public publishing is off, the is_private parameter does not exist on any tool, so the model has no way to ask for it. When it's on, is_private appears and still defaults to true.

Why private-by-default

Not caution for its own sake. Velog's rate limiter counts only is_private: false posts:

// apps/server/src/services/PostApiService/index.mts
count({ where: { fk_user_id, is_private: false, released_at: { gt: fiveMinutesAgo } } })
if (count >= 10) {
  updateMany({ where: { fk_user_id, released_at: { gt: fiveMinutesAgo } },
               data: { is_private: true } })   // flips *everything* recent to private
}

Private posts don't increment that count. But isPostLimitReached() runs unconditionally, before privacy is examined — so if ten public posts already exist in the last five minutes, even a private draft request can trigger the sweep. "Doesn't increment" is not "can't trigger." That's why write retries stay disabled and the local limiter stays in place.

Public posts do increment it, and once a post is public it has already gone out through RSS, search indexes, and subscriber email, none of which a delete reaches. That asymmetry is what deserves an explicit opt-in.

Full reasoning: docs/security.md


Tools

22 tools. Only 10 of them change anything on Velog.

Reading — no auth required

Tool

Purpose

velog_get_post

Read one post, body included

velog_list_posts

A user's posts, optionally filtered by tag

velog_search_posts

Keyword search; pass username to search inside one blog

velog_trending_posts

Trending by day / week / month / year

velog_recent_posts

Newest posts across Velog

velog_get_user

Profile, follower counts, bio

velog_list_series

A user's series, with post counts and IDs

velog_user_tags

Tags a user writes about, with counts

Reading — auth required

Tool

Purpose

velog_whoami

Which account the token belongs to (also a token health check)

velog_list_drafts

Your saved drafts, with IDs

Derived — things Velog doesn't provide

Tool

Purpose

velog_blog_stats

Aggregate views/likes/comments, top posts, per-year and per-tag breakdown

velog_export_posts

Save posts as Markdown files with YAML front matter

Writing

Tool

Effect

velog_create_draft

Save a draft. Never publishes, under any configuration

velog_update_draft

Replace a draft entirely — omitted fields are reset

velog_publish_post

Publish a new post

velog_publish_draft

Publish an existing draft, reusing its stored body

velog_unpublish_post

Send a published post back to drafts

velog_update_post

Edit a published post — omitted fields are kept

velog_update_draft resets what you omit; velog_update_post preserves it. The asymmetry is deliberate — see docs/tools.md.

Automatic thumbnail

Omit thumbnail and the first image in the body becomes the thumbnail, so list and share cards aren't text-only. What was chosen is always reported back, along with the other candidates when there is more than one.

thumbnail

Behaviour

omitted

first image in the body

a URL

used as given

null

opt out — leave it empty on purpose

Images inside code fences and inline code are excluded, so a markdown example never becomes your thumbnail. velog_update_post never replaces an existing thumbnail — editing a title should not change the card. There, null means "don't fill it in", not "delete it".

Series — by name, in one call

Pass series_name and the server resolves it before saving, then sends the id in the same request — writing and filing happen in one call. Names are matched ignoring case and surrounding whitespace; series_id wins if you know it.

⚠️ If the name isn't found, nothing is written — saving without the series would look like it worked. The available series are listed in the error.

Omit both and the result carries your series list. That lookup never fails the write (cancellation included — reporting failure after a successful save makes retries duplicate the post).

⚠️ The velog API cannot create a series — there is no series mutation, and WritePostInput only accepts series_id. Create one on velog once, then this server can attach posts to it.

Tools that take a usernamevelog_list_drafts, velog_blog_stats, velog_export_posts, velog_search_posts — fall back to your own account when you omit it.

Diagrams and images

Tool

Effect

velog_render_diagram

Draw an architecture/flow diagram and upload it

velog_render_sequence

Draw a sequence diagram from participants and ordered messages

velog_render_cover

Draw a 1200×630 cover card for a post

velog_upload_image

Upload a local image file, get the Markdown back

You describe what exists and what flows where; the renderer owns everything else — palette, spacing, text measurement, corner rounding, canvas size. That is deliberate: a diagram redrawn from scratch each time looks different each time.

Every measurement is real. Node widths and line breaks come from the browser's getBBox(), never from a character count — with mixed Korean and English text, counting characters is wrong every time. The canvas is sized after drawing, from the content's bounding box, so a diagram cannot be clipped.

Then it audits itself and reports five classes of defect:

text spilling outside its card · letter-spacing squeezed to fit
a line crossing (or hiding behind) a node
two lines overlapping · two nodes overlapping · a label sitting on a card

If the audit finds anything, nothing is uploaded — and there is no flag to turn that off. Velog has no delete-image API and every upload counts against your quota, so a flawed diagram is worth redrawing rather than shipping. An override that the model can set itself is not a safeguard (same reasoning as the publishing switch in ADR 0004). If you really want a flawed diagram online, render with upload: false, look at the PNG, then pass its path to velog_upload_image.

Icons are 28 built-in glyphs (server, database, cloud, clock, alert, …) drawn from primitive shapes. Nothing is fetched — the renderer runs with DNS disabled.

Requires Chrome (or any Chromium-based browser: Edge, Brave, Chromium). It is found automatically on macOS/Linux/Windows; set VELOG_CHROME_PATH if yours lives elsewhere. Only velog_render_diagram, velog_render_sequence and velog_render_cover need it — velog_upload_image just reads a local file, so it and the other 18 tools work without a browser.

Cost, measured: one diagram is ~1 GB peak across 9–11 Chrome processes for 3–4 seconds, then back to zero. That's Chrome's floor, not our content. Coordinates, text lengths and array sizes are all bounded, and the canvas cap (6000px / 9M px) is enforced inside the page — a browser commits to a surface the moment it receives width and height, so checking after the fact is too late. Renders are serialized — MCP clients call tools in parallel, and without that a five-diagram request would mean 45 Chrome processes and 6 GB. Serialized, four concurrent requests still peak at one render's worth. Ten renders in a row show no accumulation.

Profile editing — VELOG_ALLOW_PROFILE=1

Five more tools appear: velog_update_profile (display name, bio), velog_update_about, velog_update_blog_title, velog_update_social_links, velog_update_profile_image. Without the flag they aren't registered at all.

The gate isn't about danger — these are reversible, affect only your own account, and aren't distributed anywhere. It's about confusion: a profile's short_bio and a post's short_description sound alike. "Fix my description" is ambiguous, and with the switch off a wrong guess can't reach your profile.

velog_update_profile keeps what you omit. Velog's UpdateProfileInput requires both display_name and short_bio, so sending one alone would blank the other — the tool reads your current values and fills them in.


Usage

Once it's configured, just talk to your MCP client.

"Draft a Velog post about the bug I fixed today"
   → writes Markdown, saves it as a draft, hands back the edit URL

"What did I write about HTTP/2 last year?"
   → searches inside your own posts

"Show my top 10 posts by views, and which tags get read most"
   → walks your whole blog and aggregates

"Back up all my posts to ~/blog-backup"
   → writes .md files with front matter

"Publish that draft"
   → private by default; public only with VELOG_ALLOW_PUBLIC=1

"Draw how the request flows from the LB through the workers to Redis"
   → renders a diagram, audits it, uploads it, hands back the Markdown line

"Make a cover image for this post"
   → 1200×630 card; pass the URL to velog_update_post's thumbnail

Your MCP client asks for approval before each tool call, and irreversible tools carry destructiveHint, so nothing gets published without you seeing it first.

Exported file format

---
title: "Post title"
date: 2022-12-31T18:32:39.790Z
slug: "url-slug"
url: "https://velog.io/@username/url-slug"
tags: ["tag1", "tag2"]
likes: 260
views: 16323
---

Post body in Markdown…

Development

npm test              # node:test, runs .ts directly — no jest, no ts-node
npm run typecheck     # includes tests — they used to be excluded, which hid real errors
npm run lint          # typescript-eslint, type-aware
npm run build         # tsconfig.build.json (tests excluded from dist)
npm run schema:dump   # dump Velog's current GraphQL schema

432 tests (as of 0.8.10). src/__tests__/safety.test.ts pins the security invariants (A1–A12), render.test.ts pins the diagram ones (R1–R23, D1) and the sequence ones (S1–S12), and plugin.test.ts pins the packaging ones (P1–P28) — if any fails, find out why instead of working around it.

Every guard here was checked by breaking it on purpose: 54 mutations against the source, plus 12 against the publish gate itself (scripts/gate-mutation.sh), each of which must make exactly one check fail. A test that still passes with the guard removed is not a test. Several in this repo did pass at first, and that is how they got fixed.

Documentation

Document

Contents

docs/PRD.md

Goals, non-goals, success criteria

docs/architecture.md

Layering, and the TypeScript subset Node's type stripping allows

docs/api-reference.md

Measured Velog GraphQL schema and server quirks

docs/security.md

Token handling, capability model, what's deliberately unimplemented

docs/tools.md

Full tool catalog with gotchas

docs/decisions/

Architecture decision records

CHANGELOG.md

What was broken and what got fixed, per release

Notes

This talks to Velog's internal GraphQL API, which is undocumented and can change without warning. When something breaks, run npm run schema:dump and diff it against docs/api-reference.md — that's the fastest way to find what moved.

Velog's terms of service contain no clause restricting automated access. Using your own token to manage your own posts stays within scope, and your posts remain yours (Article 5).

License

MIT

Available Tools

22 tools
velog_blog_stats블로그 통계A
Read-only

한 사용자의 글 전체를 긁어 조회수·좋아요·댓글을 집계한다. 연도별·태그별 분포와 상위 글 순위를 함께 낸다. 벨로그에 없는 화면이라 직접 계산한다. 글이 많으면 여러 번 요청하므로 몇 초 걸릴 수 있다.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo상위 몇 편까지 보여줄지
usernameNo@ 없이. 생략하면 인증된 내 계정을 쓴다
max_pagesNo최대 페이지 수 (1페이지=50편). 과도한 요청 방지용 상한

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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벨로그 초안 작성A

벨로그에 임시저장 글(초안)을 만든다. 발행되지 않으며 작성자 본인만 볼 수 있다. 이 도구는 어떤 설정에서도 발행하지 않는다 — 발행하려면 velog_publish_draft 를 따로 부를 것. body 는 마크다운으로 쓴다.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes본문 (마크다운)
tagsNo태그 목록
titleYes글 제목
url_slugNo생략하면 제목에서 생성
series_idNo소속시킬 시리즈 id. 벨로그가 임시저장 생성 단계에서 이걸 버리므로 이 도구가 저장 직후 한 번 더 붙이고, 붙었는지 확인해 결과에 적는다. 생략하면 결과에 내 시리즈 목록을 함께 돌려준다
thumbnailNo썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다
series_nameNo시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds crucial behavioral context beyond the annotations: the draft is never published, only the author can see it, and body must be Markdown. These facts are not present in the annotations and are essential for the agent to set expectations correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences with zero redundancy. The most important fact (creates a draft, does not publish) is front-loaded, and the pointer to the publishing sibling is direct. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for the core purpose and usage, but it does not hint at the more complex optional parameters like series_id, series_name, or thumbnail behavior. However, the schema descriptions cover these thoroughly, so the agent can access that detail when needed. For a create-draft tool, the global behavior is well covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are documented in the schema. The description only reiterates that body is Markdown, which adds no new information. The tool's tricky series_id behavior and thumbnail auto-setting are covered in the schema, so the description does not need to compensate for gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (만든다 - create), the resource (벨로그 초안 - Velog draft), and the key distinction that it does not publish. It explicitly differentiates from the publishing siblings by stating it never publishes under any settings, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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 create a draft) and when not to (when publishing is needed), directing the agent to velog_publish_draft as the alternative. This direct routing eliminates ambiguity about the tool's role in the workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

velog_export_posts글 마크다운 백업A
Destructive

한 사용자의 벨로그 글을 프론트매터가 붙은 마크다운 파일로 로컬에 저장한다. 벨로그에 공식 내보내기가 없어서 만든 기능이다. ★ 같은 이름의 기존 파일이 있으면 덮어쓴다 — 전용 디렉터리를 쓰는 것을 권한다. 글 본문을 한 편씩 받아오므로 글이 많으면 시간이 걸린다.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo내보낼 최대 글 수
out_dirYes저장할 디렉터리 (절대경로 권장). 없으면 만든다
usernameNo@ 없이. 생략하면 인증된 내 계정을 쓴다

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint true, but the description adds concrete details beyond that: overwriting existing files, per-post sequential fetching causing slowness, and the presence of front matter. This goes beyond the mere annotation flags and provides operational expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description packs purpose, rationale, overwrite warning, usage recommendation, and performance note into two tight sentences. There is zero fluff, and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity and no output schema, the description covers the key behavioral aspects: purpose, overwriting, speed, and directory guidance. It doesn't describe return values or error handling, but those are less critical for an export tool with schema-covered parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description doesn't need to re-explain parameters. It only alludes to the local directory concept, but doesn't add meaning beyond the schema's own descriptions for out_dir, limit, and username. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it saves a user's VELOG posts as markdown files with front matter to local storage, and explains it was created because VELOG lacks an official export. This specific verb-resource pairing (saving posts to local markdown) distinguishes it from all sibling tools like get_post or list_posts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context (no official export) and gives practical usage warnings: it overwrites files and recommends a dedicated directory. It doesn't explicitly name alternative tools to use instead, but the unique export purpose makes the when-to-use reasonably clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

velog_get_post벨로그 글 읽기A
Read-only

벨로그 글 하나를 본문까지 읽어온다. username + url_slug 조합이나 글 id 로 지정한다. 예: https://velog.io/@velopert/react-context-tutorial → username="velopert", url_slug="react-context-tutorial"

ParametersJSON Schema
NameRequiredDescriptionDefault
idNo글 UUID. 이걸 주면 username/url_slug 는 불필요
url_slugNoURL 마지막 조각
usernameNo@ 없이. 예: "velopert"

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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벨로그 사용자 정보B
Read-only

벨로그 사용자의 프로필과 팔로워 수를 조회한다.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYes@ 없이

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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내 초안 목록A
Read-only

내 임시저장 글 목록. 초안을 이어 쓰거나 수정하기 전에 id 를 여기서 확인한다.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
usernameNo생략하면 토큰의 계정을 쓴다. 남의 초안은 어차피 안 보인다

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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벨로그 글 목록A
Read-only

특정 사용자의 글 목록을 최신순으로 가져온다. tag 로 좁힐 수 있다. cursor 에 직전 응답의 마지막 글 id 를 주면 다음 페이지를 읽는다.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNo이 태그가 달린 글만
limitNo
cursorNo이전 페이지 마지막 글의 id
usernameYes@ 없이

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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시리즈 목록A
Read-only

사용자의 연재 시리즈 목록. 각 시리즈에 글이 몇 편인지 함께 준다. 초안을 특정 시리즈에 넣으려면 여기서 얻은 id 를 velog_create_draft 의 series_id 에 준다.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYes@ 없이

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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초안 발행A
Destructive

기존 임시저장 글을 발행한다. 본문은 저장된 내용을 그대로 쓴다 — 다시 넘길 필요가 없다. 현재 설정에서는 비공개로만 발행된다 (공개 발행은 VELOG_ALLOW_PUBLIC=1 이 필요하다).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes초안 id (velog_list_drafts 로 확인)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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벨로그 글 발행A
Destructive

새 글을 바로 발행한다. 초안을 거치지 않는다. 현재 설정에서는 비공개로만 발행된다 (공개 발행은 VELOG_ALLOW_PUBLIC=1 이 필요하다). 되돌리려면 velog_unpublish_post 로 초안으로 내릴 수 있다.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes본문 (마크다운)
tagsNo
titleYes
url_slugNo생략하면 제목에서 생성
series_idNo
thumbnailNo썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다
series_nameNo시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds important behavioral context: it publishes as private-only unless VELOG_ALLOW_PUBLIC=1 is set, and that it can be reverted to draft via velog_unpublish_post. This goes beyond the annotations and 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loads the primary action, and every clause adds value. There is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the core behavior, the private default, and the revert path. It does not mention prerequisites or response format, but those are not essential for calling the tool correctly given the annotations and schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 57% schema description coverage, the schema covers some parameters (thumbnail, series_name, url_slug). The description does not add any parameter details, so it relies on the schema. It meets the baseline for moderate coverage but does not go beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool publishes a new post immediately without going through a draft ('새 글을 바로 발행한다. 초안을 거치지 않는다.'), which distinguishes it from sibling tools like velog_create_draft and velog_publish_draft. The resource and action are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly mentions that a draft is skipped and provides a revert path via velog_unpublish_post, giving clear context on when to use it and how to undo. It doesn't explicitly list when to prefer alternatives like velog_create_draft, but the implication is strong enough for an agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

velog_recent_posts벨로그 최신 글A
Read-only

벨로그 전체 최신 글. 지금 무슨 글이 올라오는지 훑을 때.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
cursorNo이전 페이지 마지막 글의 id

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 에 돌려받은 주소를 넣으면 표지가 된다.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
toneNo
titleYes
footerNo우상단 서명 (예: '@milcho0604')
kickerNo상단 작은 라벨 (예: '디버깅 기록')
uploadNo
post_idNo
subtitleNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 로도 받지 않는다. 고쳐서 다시 그릴 것. 아이콘: 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

ParametersJSON Schema
NameRequiredDescriptionDefault
altNo이미지 대체 텍스트
edgesNo
nodesYes
titleYes그림 제목 (좌상단)
groupsNo
legendNo
planesNo흐름 종류. 생략하면 요청/외부 호출/데이터/관측 4종
uploadNo
post_idNo붙일 글 id. 주면 벨로그가 내 글인지 확인한 뒤 받는다
subtitleNo한 줄 설명·근거

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors: automatic layout via browser measurement, self-audit for overflow/overlap/line intersection, audit failure prevents upload and reports issues, the audit cannot be disabled, and failed outputs are rejected even by velog_upload_image. This goes well beyond the annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) and adds critical operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, followed by behavioral details and reference lists. Each sentence contributes meaningful information, and the icon/tone lists are compact. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no output schema, the description covers the complete workflow (draw → audit → upload → return markdown), the audit enforcement, and the relationship with velog_upload_image. The schema covers individual parameters, so the description does not need to repeat them. It leaves little doubt about what the tool does and its key failure mode.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, so the description should compensate for undocumented parameters. It adds contextual meaning (coordinates drive layout, node width auto-measured) and lists icon/tone options. However, it does not explain groups, legend, planes, or upload/post_id behavior beyond what the schema already provides. The schema's own field descriptions are quite detailed, so the description adds moderate value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool draws composition/flow diagrams, renders to PNG, uploads to Velog, and returns markdown for the body. This clearly distinguishes it from sibling tools like velog_render_cover 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for diagram generation but does not explicitly mention when to use it over alternatives. The note that audited outputs are not accepted by velog_upload_image is an indirect exclusion, but there is no clear when-not or alternative selection guidance.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
altNo이미지 대체 텍스트
titleYes그림 제목 (좌상단)
legendNo
uploadNo
numbersNo메시지 앞에 1. 2. 3. 을 붙인다
post_idNo붙일 글 id. 주면 벨로그가 내 글인지 확인한 뒤 받는다
messagesYes배열 순서가 시간 순서다. call 마다 짝이 되는 return 을 넣어야 활성 막대가 닫힌다
subtitleNo한 줄 설명·근거
fragmentsNoalt·opt·loop 묶음 상자. 서로 완전히 포개거나 완전히 떨어져야 한다
activationsNocall/return 짝에서 활성 막대를 뽑아 그린다
participantsYes왼쪽부터 순서대로 세로 열이 된다

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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벨로그 글 검색A
Read-only

키워드로 벨로그 전체를 검색한다. username 을 주면 그 사람 글 안에서만 찾는다 — "내가 예전에 쓴 그 글" 을 찾을 때 이 조합을 쓴다.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo페이지네이션
keywordYes검색어
usernameNo이 사용자의 글로 한정

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_unpublish_post발행 취소 (초안으로 되돌리기)A
DestructiveIdempotent

발행된 글을 임시저장으로 되돌린다. 글은 사라지지 않고 초안 목록으로 간다. ★ 이미 나간 RSS·구독 메일은 회수되지 않는다 — 검색엔진 캐시도 한동안 남는다.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes발행된 글의 id

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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벨로그 초안 수정A
DestructiveIdempotent

기존 초안을 통째로 교체한다. 부분 수정이 아니다. 생략한 필드는 유지되지 않고 초기화된다 — tags 를 안 주면 기존 태그가 전부 지워지고, url_slug 를 안 주면 제목에서 새로 만들어 주소가 바뀌며, series_id 를 안 주면 기존 시리즈 연결이 끊긴다. 그래서 수정 전에 velog_get_post 로 현재 값을 읽어 바꾸지 않을 필드도 그대로 다시 넘기는 것을 권한다. 발행된 글의 id 는 거부한다(비공개로 내려가는 사고 방지).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes초안의 id (velog_list_drafts 로 확인)
bodyYes본문 전체 (마크다운). 부분 수정이 아니라 교체다
tagsNo
titleYes
url_slugNo
series_idNo
thumbnailNo썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다
series_nameNo시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide destructiveHint and idempotentHint, but the description adds crucial specifics: omitted fields reset, tags cleared, url_slug regenerated, and series connection broken. This fully discloses the destructive nature beyond the annotations and is consistent with idempotentHint (full replacement).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph that leads with the key fact (full replacement), then lists specific reset behaviors, then gives a recommendation and a warning. Every sentence carries essential information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, 3 required, and no output schema, the description covers the critical pitfalls: full replacement semantics, reset behavior, the need to read current values, and rejection of published post ids. It is sufficiently complete for safe and correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, so the description must compensate. It adds meaning for tags, url_slug, and series_id by explaining the consequences of omission, which is not in the schema. However, it doesn't extend semantics to all parameters (e.g., series_name), though the schema already covers those. The critical omitted-field behavior is well addressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool '기존 초안을 통째로 교체한다' (replaces the entire existing draft), naming the action and resource. It differentiates from partial updates and explicitly rejects published post ids, clearly distinguishing 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: recommends reading current values with velog_get_post before modifying and passing all fields, and states published post ids are rejected, which implies using a different tool. This provides clear context and exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

velog_update_post발행글 수정A
DestructiveIdempotent

이미 발행된 글을 수정한다. 발행 상태(is_temp:false)는 유지된다. 생략한 필드는 기존 값을 그대로 유지한다 — 초안 도구와 달리 전체 교체가 아니다. 초안 id 는 거부한다(초안 수정은 velog_update_draft). 현재 설정에서는 공개 범위를 바꿀 수단이 없다 — 공개 글은 공개로, 비공개 글은 비공개로 그대로 남는다. 범위를 바꾸려면 VELOG_ALLOW_PUBLIC=1 이 필요하다.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
bodyNo생략하면 기존 본문 유지
tagsNo생략하면 기존 태그 유지
titleNo
url_slugNo생략하면 기존 주소 유지
series_idNo
thumbnailNo썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다
series_nameNo시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate destructive and not-read-only, but the description adds substantial behavioral context: omitted fields retain existing values (partial update), draft IDs are rejected, and visibility cannot be changed unless an environment variable is set. This goes far beyond the annotations and prepares the agent for real-world behavior 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, each delivering crucial information: main action, update semantics, draft exclusion, and visibility restriction. No filler; the most important distinction (partial update) is front-loaded. Efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and 8 parameters, the description covers key operational aspects: published-only, partial update, draft rejection, and visibility constraints. It does not describe the return value or error handling, which would be useful but are not critical for a moderate-complexity update tool. Overall, it provides sufficient context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 63% and the description compensates by explaining the general partial-update rule that applies to all optional parameters. It also details thumbnail auto-set vs null behavior and series_name lookup semantics. However, title and series_id lack explicit descriptions, though they fall under the generic omitted-field retention rule. The description adds meaningful context beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states '이미 발행된 글을 수정한다' (modifies an already published post) with a specific verb and resource. It further distinguishes itself from the draft tool by stating draft IDs are rejected and points to velog_update_draft, leaving no ambiguity about its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly notes draft IDs are rejected and directs to velog_update_draft for drafts, providing a clear when-not-to-use and alternative. It also explains the partial-update semantics vs the draft tool's full replacement, and clarifies visibility constraints with VELOG_ALLOW_PUBLIC requirement, giving precise usage conditions.

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 가 없다. 올리기 전에 무슨 파일인지 확인하라.

ParametersJSON Schema
NameRequiredDescriptionDefault
altNo
pathYes로컬 파일 경로
typeNoprofile 은 프로필 사진용 분류일 뿐 — 사진 교체는 velog_update_profile_imagepost
post_idNo붙일 글 id (서버가 소유권을 확인한다)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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사용자 태그 목록A
Read-only

사용자가 쓴 태그와 각 태그의 글 수. "이 사람이 뭘 주로 쓰나"를 가장 싸게 파악하는 방법이다.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo
usernameYes@ 없이

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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내 계정 확인A
Read-only

현재 토큰으로 인증된 계정을 확인한다. 토큰이 살아있는지 점검하는 용도로도 쓴다. 다른 도구에서 username 을 생략하면 여기서 얻는 계정을 쓴다.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.6.0
    • Changedvelog_create_draft5 fields changed
      • changedInput schema / properties / series_id / description
        Previous value: -"소속시킬 시리즈 id. ★ 벨로그는 임시저장 단계에서 이걸 무시한다 — 초안 생성 후 velog_update_draft 로 다시 지정해야 실제로 붙는다"New value: +"소속시킬 시리즈 id. 벨로그가 임시저장 생성 단계에서 이걸 버리므로 이 도구가 저장 직후 한 번 더 붙이고, 붙었는지 확인해 결과에 적는다. 생략하면 결과에 내 시리즈 목록을 함께 돌려준다"
      • addedInput schema / properties / series_name
        Added value: +{
        +  "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / thumbnail / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / thumbnail / description
        Previous value: -"썸네일 이미지 URL (http/https 만)"New value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다"
      • removedInput schema / properties / thumbnail / type
        Removed value: -"string"
    • Changedvelog_publish_post4 fields changed
      • addedInput schema / properties / series_name
        Added value: +{
        +  "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / thumbnail / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / thumbnail / description
        Added value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다"
      • removedInput schema / properties / thumbnail / type
        Removed value: -"string"
    • Addedvelog_render_sequence
    • Changedvelog_update_draft4 fields changed
      • addedInput schema / properties / series_name
        Added value: +{
        +  "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / thumbnail / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / thumbnail / description
        Added value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다"
      • removedInput schema / properties / thumbnail / type
        Removed value: -"string"
    • Changedvelog_update_post4 fields changed
      • addedInput schema / properties / series_name
        Added value: +{
        +  "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / thumbnail / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / thumbnail / description
        Added value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다"
      • removedInput schema / properties / thumbnail / type
        Removed value: -"string"
  2. 21 tool updatesv0.3.0
    • First observedvelog_blog_stats
    • First observedvelog_create_draft
    • First observedvelog_export_posts
    • First observedvelog_get_post
    • First observedvelog_get_user
    • First observedvelog_list_drafts
    • First observedvelog_list_posts
    • First observedvelog_list_series
    • First observedvelog_publish_draft
    • First observedvelog_publish_post
    • First observedvelog_recent_posts
    • First observedvelog_render_cover
    • First observedvelog_render_diagram
    • First observedvelog_search_posts
    • First observedvelog_trending_posts
    • First observedvelog_unpublish_post
    • First observedvelog_update_draft
    • First observedvelog_update_post
    • First observedvelog_upload_image
    • First observedvelog_user_tags
    • First observedvelog_whoami

TDQS

A3.8/5.0

Scored across 22 tools

Disambiguation4/5

도구들이 대체로 명확히 구분된다. 다만 velog_publish_post와 velog_publish_draft가 둘 다 발행 동작이라 목적이 겹쳐 보일 수 있고, velog_recent_posts와 velog_trending_posts도 '최신 글 보기'라는 점에서 혼동 여지가 있다.

Naming Consistency4/5

모든 도구가 velog_ 접두사를 쓰고 동사_명사 패턴이 대체로 일관된다. 다만 get/list가 혼용되고(search_posts, list_posts), render_* 계열과 upload_image, blog_stats 등이 약간 다른 패턴을 보인다.

Tool Count4/5

22개는 약간 많지만 velog라는 플랫폼의 CRUD, 검색, 렌더링, 통계, 내보내기 등 다양한 기능을 담당하므로 각 도구가 나름의 자리를 가진다. 다만 렌더링 계열(diagram, sequence, cover, upload_image)이 4개나 있어 약간 무겁게 느껴진다.

Completeness5/5

글 조회·목록·검색·작성·발행·수정·비공개 전환·초안 관리까지 라이프사이클이 빠짐없이 갖춰져 있고, 사용자 정보, 태그, 통계, 내보내기, 이미지/다이어그램 업로드까지 플랫폼 사용에 필요한 기능이 골고루 포함되어 있다. 공개 발행 설정이 환경변수로 제한되는 것은 설계상 안전장치로 보인다.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers