velog-mcp
This MCP server offers complete Velog blog management — reading, writing, publishing, analytics, backup, and visual content creation.
Read & browse (no auth needed): get a post by ID or slug, list a user's posts (filter by tag), search posts by keyword (optionally scoped to a user), view trending/recent posts, user profiles, series, and tags.
Manage drafts: create (always private), update (full replacement), list, and publish drafts.
Publish & edit: publish new posts or drafts, unpublish posts, edit published posts (omitted fields preserved). Publishing is private by default; public publishing requires
VELOG_ALLOW_PUBLIC=1.Data & backup: aggregated stats (views, likes, top posts, yearly/tag breakdowns) and export all posts as Markdown with YAML front matter.
Visual content (requires Chrome): render diagrams (with self-audit to block flawed uploads) and 1200×630 cover images, upload local images (PNG/JPEG/GIF/WebP) — all returning Markdown embed codes.
Profile editing (requires
VELOG_ALLOW_PROFILE=1): update display name, bio, about, blog title, social links, and profile image.Auth & permissions: authenticate via refresh/access token; read-only features work without a token. Tokens are never written to disk.
Provides tools for managing Velog blog posts, including reading, drafting, publishing, unpublishing, and exporting posts, as well as searching and aggregating blog statistics.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@velog-mcpShow me my recent drafts"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
velog-mcp
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.
As a Claude Code plugin (recommended)
/plugin marketplace add milcho0604/velog-mcp
/plugin install velog@milchoInstallation 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.10The 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 buildConfigure
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.10To 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.
Log in at velog.io
Open DevTools (
F12) → Application → Cookies →https://velog.ioCopy 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 |
| …plus public publishing (adds an |
| …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 |
| Read one post, body included |
| A user's posts, optionally filtered by tag |
| Keyword search; pass |
| Trending by |
| Newest posts across Velog |
| Profile, follower counts, bio |
| A user's series, with post counts and IDs |
| Tags a user writes about, with counts |
Reading — auth required
Tool | Purpose |
| Which account the token belongs to (also a token health check) |
| Your saved drafts, with IDs |
Derived — things Velog doesn't provide
Tool | Purpose |
| Aggregate views/likes/comments, top posts, per-year and per-tag breakdown |
| Save posts as Markdown files with YAML front matter |
Writing
Tool | Effect |
| Save a draft. Never publishes, under any configuration |
| Replace a draft entirely — omitted fields are reset |
| Publish a new post |
| Publish an existing draft, reusing its stored body |
| Send a published post back to drafts |
| Edit a published post — omitted fields are kept |
velog_update_draftresets what you omit;velog_update_postpreserves 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.
| Behaviour |
omitted | first image in the body |
a URL | used as given |
| 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
WritePostInputonly acceptsseries_id. Create one on velog once, then this server can attach posts to it.
Tools that take a username — velog_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 |
| Draw an architecture/flow diagram and upload it |
| Draw a sequence diagram from participants and ordered messages |
| Draw a 1200×630 cover card for a post |
| 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 cardIf 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 thumbnailYour 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 schema432 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 |
Goals, non-goals, success criteria | |
Layering, and the TypeScript subset Node's type stripping allows | |
Measured Velog GraphQL schema and server quirks | |
Token handling, capability model, what's deliberately unimplemented | |
Full tool catalog with gotchas | |
Architecture decision records | |
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 toolsvelog_blog_stats블로그 통계ARead-only
한 사용자의 글 전체를 긁어 조회수·좋아요·댓글을 집계한다. 연도별·태그별 분포와 상위 글 순위를 함께 낸다. 벨로그에 없는 화면이라 직접 계산한다. 글이 많으면 여러 번 요청하므로 몇 초 걸릴 수 있다.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | 상위 몇 편까지 보여줄지 | |
| username | No | @ 없이. 생략하면 인증된 내 계정을 쓴다 | |
| max_pages | No | 최대 페이지 수 (1페이지=50편). 과도한 요청 방지용 상한 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=true, openWorldHint=true, destructiveHint=false) already cover safety, but the description adds valuable context: it states it scrapes all posts and may take several seconds due to multiple requests. This proactively sets expectations about performance and data-gathering behavior, which annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences: it states the core function, the deliverables, and the performance caveat. Every sentence adds value, with no redundancy or filler. It is well-structured and front-loaded with the primary purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the tool (aggregation over all posts), the description sufficiently covers what it computes and what it returns (distributions, rankings). It also notes latency behavior. With no output schema, the description gives enough detail for an agent to understand the expected result, though it could mention edge cases like empty user accounts, but that is minor given other structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for top, username, and max_pages. The description adds context about the tool's overall function but does not provide additional parameter-specific meaning beyond what the schema already documents. Baseline of 3 applies since the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it aggregates views, likes, and comments for a user's posts, and provides year/tag distributions and top post rankings. This specific verb+resource combination distinguishes it from sibling tools like velog_list_posts or velog_trending_posts, which list or rank posts differently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that this tool is needed because the stats screen does not exist on Velog, implying it should be used when such aggregated stats are required. It doesn't explicitly name alternative tools, but it gives clear context for when this tool is appropriate, such as when users need computed statistics rather than raw lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_create_draft벨로그 초안 작성A
벨로그에 임시저장 글(초안)을 만든다. 발행되지 않으며 작성자 본인만 볼 수 있다. 이 도구는 어떤 설정에서도 발행하지 않는다 — 발행하려면 velog_publish_draft 를 따로 부를 것. body 는 마크다운으로 쓴다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 본문 (마크다운) | |
| tags | No | 태그 목록 | |
| title | Yes | 글 제목 | |
| url_slug | No | 생략하면 제목에서 생성 | |
| series_id | No | 소속시킬 시리즈 id. 벨로그가 임시저장 생성 단계에서 이걸 버리므로 이 도구가 저장 직후 한 번 더 붙이고, 붙었는지 확인해 결과에 적는다. 생략하면 결과에 내 시리즈 목록을 함께 돌려준다 | |
| thumbnail | No | 썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다 | |
| series_name | No | 시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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글 마크다운 백업ADestructive
한 사용자의 벨로그 글을 프론트매터가 붙은 마크다운 파일로 로컬에 저장한다. 벨로그에 공식 내보내기가 없어서 만든 기능이다. ★ 같은 이름의 기존 파일이 있으면 덮어쓴다 — 전용 디렉터리를 쓰는 것을 권한다. 글 본문을 한 편씩 받아오므로 글이 많으면 시간이 걸린다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 내보낼 최대 글 수 | |
| out_dir | Yes | 저장할 디렉터리 (절대경로 권장). 없으면 만든다 | |
| username | No | @ 없이. 생략하면 인증된 내 계정을 쓴다 |
TDQS
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.
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.
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.
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.
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.
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벨로그 글 읽기ARead-only
벨로그 글 하나를 본문까지 읽어온다. username + url_slug 조합이나 글 id 로 지정한다. 예: https://velog.io/@velopert/react-context-tutorial → username="velopert", url_slug="react-context-tutorial"
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | 글 UUID. 이걸 주면 username/url_slug 는 불필요 | |
| url_slug | No | URL 마지막 조각 | |
| username | No | @ 없이. 예: "velopert" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value by disclosing that it fetches the full post body and explaining the two valid identifier combinations, which is useful behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core function, and includes a practical example with zero filler. Every sentence contributes to understanding what the tool does and how to use it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a simple parameter set, full schema descriptions, and safety annotations, the description is complete. It explains the identification methods and states the tool returns the post content, making it sufficient for an agent to invoke correctly without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with each parameter described in Korean. The description's example ('https://velog.io/@velopert/react-context-tutorial → username="velopert", url_slug="react-context-tutorial"') adds meaningful context by showing how parameters map to a real URL, and it reinforces the id-optional relationship already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads a single Velog post including its full body, using a specific verb ('읽어온다') and resource ('벨로그 글'). It distinguishes itself from sibling tools like list/search/trending by targeting one post, and provides a concrete URL example for identification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool—when you need the full content of a specific post—and how to specify it (by id or username+url_slug). It doesn't explicitly mention alternatives or when not to use it, but the purpose is clear enough for an agent to differentiate from list/search operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_get_user벨로그 사용자 정보BRead-only
벨로그 사용자의 프로필과 팔로워 수를 조회한다.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | @ 없이 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe read operation (readOnlyHint=true, destructiveHint=false), and the description adds the specific data returned (profile and follower count). It does not contradict the annotations, but also provides no additional behavioral context like response format or authentication requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that states exactly what the tool does with no filler or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and strong annotations, the description is sufficient. It specifies the key return values (profile and follower count), and the schema handles parameter documentation. No output schema exists, but the description names the main outputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the only parameter 'username' with a description '@ 없이', giving 100% schema coverage. The description itself adds no new parameter semantics beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb '조회한다' (retrieves) and names the resource as the user's profile and follower count. It clearly conveys the tool's primary function, though it does not explicitly contrast it with sibling tools like velog_user_tags or velog_whoami.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It only states what the tool does, with no mention of specific use cases, exclusions, or references to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_list_drafts내 초안 목록ARead-only
내 임시저장 글 목록. 초안을 이어 쓰거나 수정하기 전에 id 를 여기서 확인한다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| username | No | 생략하면 토큰의 계정을 쓴다. 남의 초안은 어차피 안 보인다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and non-destructive. The description adds that this tool returns draft IDs for later editing and implicitly that it shows only the user's own drafts (reinforced by the username schema description). No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences deliver purpose and usage, no redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and schema covering parameters, the description provides a solid, complete context for a simple listing tool. It could mention the return format but the purpose implies it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers username semantically; limit is constrained but lacks description. The tool description does not explain parameters directly, but the schema's structural constraints and the username description provide adequate meaning for this simple tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states '내 임시저장 글 목록' (my temporary saved posts list) and explains that IDs are checked here before editing, clearly distinguishing it from sibling tools like list_posts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear when-to-use: '초안을 이어 쓰거나 수정하기 전에 id를 여기서 확인한다' - before continuing or editing a draft. No explicit alternatives are named, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_list_posts벨로그 글 목록ARead-only
특정 사용자의 글 목록을 최신순으로 가져온다. tag 로 좁힐 수 있다. cursor 에 직전 응답의 마지막 글 id 를 주면 다음 페이지를 읽는다.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | 이 태그가 달린 글만 | |
| limit | No | ||
| cursor | No | 이전 페이지 마지막 글의 id | |
| username | Yes | @ 없이 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description adds meaningful behavioral details: posts are returned in latest order, can be filtered by tag, and pagination is driven by providing the last post id as cursor. This gives the agent a clear model of how the tool behaves without repeating annotation info.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences cover the core operation, filtering, and pagination, with no redundant or filler content. Information is front-loaded with the main action first, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, no output schema, and provides annotations for safety, the description covers the essential behavior: list, order, filter, and pagination. It does not mention error cases (e.g., user not found) or response format, but for a read-only list tool with good annotations, these omissions are acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 75% of parameters descriptively, and the description reinforces their roles: tag narrows the list, cursor enables pagination, and username targets the author. It adds the 'latest order' context which is not in the schema, and the limit parameter is adequately handled by schema constraints. The description adds enough extra meaning to compensate for the 75% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: fetching a specific user's post list in latest order. It differentiates from siblings like velog_get_post (single post) and velog_search_posts (global search) by focusing on a per-user listing with optional tag filtering and pagination.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: when you need a specific user's posts sorted latest-first, optionally narrowed by tag, and when you need pagination. It does not explicitly exclude alternative tools, but the purpose is well-scoped enough for an agent to select it over the generic search or trending tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_list_series시리즈 목록ARead-only
사용자의 연재 시리즈 목록. 각 시리즈에 글이 몇 편인지 함께 준다. 초안을 특정 시리즈에 넣으려면 여기서 얻은 id 를 velog_create_draft 의 series_id 에 준다.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | @ 없이 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, so the safety profile is covered. The description adds that the tool returns post counts per series, which is useful behavioral context beyond the annotations. It does not describe pagination or ordering, but these are not critical for a simple list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core purpose, and every sentence adds value: the first states what it does, the second explains how to use the returned id. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter list tool with good annotations and no output schema, the description sufficiently covers what the tool returns (series list with post counts) and how the returned id is used in another tool. It is complete for the agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes the only parameter (username) with '@ 없이', providing 100% coverage. The description does not add anything about the parameter beyond what the schema already states, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists a user's series and includes the number of posts in each series. This specific verb+resource combination distinguishes it from sibling tools like velog_list_posts, and there is no other series-listing tool among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool: to get the series id needed for assigning a draft to a series, referencing velog_create_draft's series_id parameter. It provides a clear workflow but does not mention exclusions or alternatives, though no direct alternative exists for listing series.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_publish_draft초안 발행ADestructive
기존 임시저장 글을 발행한다. 본문은 저장된 내용을 그대로 쓴다 — 다시 넘길 필요가 없다. 현재 설정에서는 비공개로만 발행된다 (공개 발행은 VELOG_ALLOW_PUBLIC=1 이 필요하다).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 초안 id (velog_list_drafts 로 확인) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the body is not passed again (saved content is used) and that publication is private-only unless VELOG_ALLOW_PUBLIC=1 is set. This adds valuable behavioral context beyond the annotations, which already signal destructive and non-idempotent behavior. It stops short of explaining side effects on the draft itself, but it is still informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the core action and followed by a key limitation. Every sentence earns its place with no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter publish action, the description covers the essential behavior and a major constraint. It could mention what happens to the draft after publishing or the return value, but given the tool's simplicity and existing annotations, the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes the id parameter and how to find it via velog_list_drafts. The tool description adds that no body needs to be passed, reinforcing that the only required input is the draft ID. This is a useful semantic addition beyond the schema's parameter description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: 'Publishes an existing temporary draft' with a distinct verb and resource. It also clarifies that the body uses saved content, which differentiates it from tools like velog_publish_post that would create a new post.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use this tool: with an existing draft ID, and it notes the private-only default and the condition for public publishing. However, it does not explicitly name alternative tools or state when not to use it, such as when publishing a new post from scratch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_publish_post벨로그 글 발행ADestructive
새 글을 바로 발행한다. 초안을 거치지 않는다. 현재 설정에서는 비공개로만 발행된다 (공개 발행은 VELOG_ALLOW_PUBLIC=1 이 필요하다). 되돌리려면 velog_unpublish_post 로 초안으로 내릴 수 있다.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | 본문 (마크다운) | |
| tags | No | ||
| title | Yes | ||
| url_slug | No | 생략하면 제목에서 생성 | |
| series_id | No | ||
| thumbnail | No | 썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다 | |
| series_name | No | 시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare 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.
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.
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.
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.
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.
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벨로그 최신 글ARead-only
벨로그 전체 최신 글. 지금 무슨 글이 올라오는지 훑을 때.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | 이전 페이지 마지막 글의 id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safe read-only nature is covered. The description adds the global scope ('전체') and a browsing-oriented behavior, but does not disclose details like pagination behavior, time window, or result shape. This is acceptable given the strong annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences. The first states the resource, the second gives the use case. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with good annotations and a clear schema for its two parameters, the description is complete enough. It does not describe return values, but no output schema exists and the purpose is straightforward. Pagination is implied by the cursor param and documented in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not discuss parameters, and schema coverage is 50%. However, both parameters are simple: 'limit' is self-explanatory with type/min/max/default in the schema, and 'cursor' already has a clear schema description ('이전 페이지 마지막 글의 id'). No additional meaning is needed beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns '벨로그 전체 최신 글' (all latest posts on Velog), and the phrase '지금 무슨 글이 올라오는지 훑을 때' provides a specific browsing purpose. It is distinguishable from siblings like velog_trending_posts and velog_search_posts, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage context: use when skimming what posts are currently being published globally ('지금 무슨 글이 올라오는지 훑을 때'). It does not explicitly state when not to use it or mention alternative tools, but the context is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_render_cover글 표지 만들기A
글 목록·SNS 미리보기에 쓸 표지 이미지(1200×630)를 만든다. 제목이 길면 줄바꿈하고, 그래도 안 들어가면 글자 크기를 줄인다 — 전부 실측 기준이다. 만든 뒤 velog_update_post 의 thumbnail 에 돌려받은 주소를 넣으면 표지가 된다.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| tone | No | ||
| title | Yes | ||
| footer | No | 우상단 서명 (예: '@milcho0604') | |
| kicker | No | 상단 작은 라벨 (예: '디버깅 기록') | |
| upload | No | ||
| post_id | No | ||
| subtitle | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which are all false and provide no behavioral hints), the description discloses adaptive text fitting: line wrapping and font-size reduction based on actual measurements. It also implies the output is a URL ('returned address'). This adds meaningful context about how the tool behaves. It does not mention the upload default behavior, but no contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose, followed by behavior and integration instructions. Every clause provides value, with no redundancy or filler. It is concise and well-structured for agent consumption.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core purpose, adaptive behavior, and integration with velog_update_post, which is essential for basic use. However, with eight parameters, no output schema, and sparse annotations, it omits details on several parameters (e.g., tone, subtitle, upload, post_id) and the exact return format. It is sufficient for a simple call but not fully complete for all scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (footer and kicker have descriptions). The description adds no semantic meaning for the remaining six parameters (title, subtitle, tone, tags, upload, post_id). It references title only in the context of wrapping behavior, not its semantics. Given the low schema coverage, the description fails to compensate, leaving agents without guidance for most parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: creates a cover image (1200×630) for post lists and SNS previews. It uses a specific verb (makes) and identifies the resource (cover image), effectively distinguishing it from sibling tools like velog_render_diagram and velog_upload_image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use: to generate cover images for post lists/SNS previews. It also explicitly instructs to pass the returned URL to velog_update_post's thumbnail, demonstrating a concrete workflow. It doesn't state exclusions but offers sufficient guidance for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_render_diagram다이어그램 그리기A
구성도·흐름도를 그려 PNG 로 만들고 벨로그에 올린다. 본문에 붙일 마크다운을 돌려준다. 좌표만 주면 나머지는 렌더러가 맞춘다 — 노드 폭·캔버스 크기·선 꺾임·라벨 위치는 브라우저 실측으로 정해지고, 글자 삐져나옴/선 관통/겹침은 자가감사가 잡는다. 감사에 걸리면 올리지 않고 무엇이 문제인지 알려준다. 이 판단은 끌 수 없고, 감사에 걸린 산출물은 velog_upload_image 로도 받지 않는다. 고쳐서 다시 그릴 것. 아이콘: alert arrow bell bolt branch browser cache chart check clock cloud code cross database file gear key layers lock mail mobile network package retry search server terminal user 톤: slate gray blue green amber yellow purple teal rose indigo
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | 이미지 대체 텍스트 | |
| edges | No | ||
| nodes | Yes | ||
| title | Yes | 그림 제목 (좌상단) | |
| groups | No | ||
| legend | No | ||
| planes | No | 흐름 종류. 생략하면 요청/외부 호출/데이터/관측 4종 | |
| upload | No | ||
| post_id | No | 붙일 글 id. 주면 벨로그가 내 글인지 확인한 뒤 받는다 | |
| subtitle | No | 한 줄 설명·근거 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | 이미지 대체 텍스트 | |
| title | Yes | 그림 제목 (좌상단) | |
| legend | No | ||
| upload | No | ||
| numbers | No | 메시지 앞에 1. 2. 3. 을 붙인다 | |
| post_id | No | 붙일 글 id. 주면 벨로그가 내 글인지 확인한 뒤 받는다 | |
| messages | Yes | 배열 순서가 시간 순서다. call 마다 짝이 되는 return 을 넣어야 활성 막대가 닫힌다 | |
| subtitle | No | 한 줄 설명·근거 | |
| fragments | No | alt·opt·loop 묶음 상자. 서로 완전히 포개거나 완전히 떨어져야 한다 | |
| activations | No | call/return 짝에서 활성 막대를 뽑아 그린다 | |
| participants | Yes | 왼쪽부터 순서대로 세로 열이 된다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several behavioral traits beyond the minimal annotations: it uploads to Velog (side effect), it runs an automatic geometric audit that can reject output and prevent upload, the audit cannot be disabled, and rejected images cannot be uploaded via velog_upload_image. It also explains layout behaviors like auto-widening, folding, and how vertical size is dominated by input structure. These are valuable and non-obvious details that guide agent behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured: it leads with the core purpose, then a bold note about coordinates, then a warning about audit behavior, then a list of kinds, icons, and tones. Every sentence adds information, and formatting (bullets, bold) improves scannability. It is appropriately sized for the tool's complexity and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 11 parameters, no output schema, and rich behavioral rules, the description covers the essential context: when to use it, how to structure input for good results, what the audit does, and what happens on failure. It does not describe the return value explicitly, but given that the tool uploads and likely returns a reference, this is a minor gap. Overall, it is complete enough for an agent to call it correctly and anticipate outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents parameters well (82% coverage). The description adds some semantic context: message array order equals time order (also in schema), call needs matching return (also in schema), note is for description boxes (in schema). However, it adds new meaning about auto line-breaking on separators and the rule that only long Korean tokens without separators need manual breaking. This is helpful but not critical for parameter understanding since schema covers most, so a 4 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool draws sequence diagrams from participants and ordered messages, renders them as PNG, and uploads to Velog. It explicitly distinguishes itself from velog_render_diagram by specifying that for non-temporal diagrams (구성도/흐름도), the sibling tool should be used. This leaves no ambiguity about what this tool does and how it differs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool vs velog_render_diagram ('구성도나 흐름도(시간 축이 없는 그림)는 velog_render_diagram 을 쓸 것'). It also gives concrete input-shaping rules to achieve good output: matching calls with returns, keeping notes to one line, and handling long labels with separators. This is actionable usage instruction, not just a generic statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_search_posts벨로그 글 검색ARead-only
키워드로 벨로그 전체를 검색한다. username 을 주면 그 사람 글 안에서만 찾는다 — "내가 예전에 쓴 그 글" 을 찾을 때 이 조합을 쓴다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | 페이지네이션 | |
| keyword | Yes | 검색어 | |
| username | No | 이 사용자의 글로 한정 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds the scoping behavior (entire Velog vs. user-specific), which is useful context, but it does not disclose return format, rate limits, or authentication needs. With annotations in place, this is adequate but not deeply transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the main purpose, and includes a memorable use-case example. Every word earns its place, with no repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 4 parameters, annotations, and no output schema, the description covers purpose, scoping, and a practical use case. It does not explain the return structure, but the schema documents offset for pagination. Overall, it is reasonably complete, though a bit more detail about result contents would push it higher.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, with keyword, username, and offset already documented. The description's phrase 'username 을 주면 그 사람 글 안에서만 찾는다' reinforces the username meaning but is largely redundant with the schema's '이 사용자의 글로 한정'. No additional detail is provided for limit or offset beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb '검색한다' (search) with the resource '벨로그 전체' (entire Velog), clearly distinguishing it from sibling tools like velog_list_posts, velog_trending_posts, and velog_recent_posts. The optional username scoping adds further precision, making the tool's purpose immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides a concrete use case: '내가 예전에 쓴 그 글' 을 찾을 때 이 조합을 쓴다 (use this combination when looking for a post I wrote). This gives clear context for when to pair keyword with username, though it does not explicitly name alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_trending_posts벨로그 트렌딩CRead-only
벨로그 인기 글. 기간을 골라 본다.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| timeframe | No | week |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. However, the description adds no additional behavioral details—such as pagination behavior, sorting logic, or return format—beyond the parameter hint, providing minimal value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with no filler content, and front-loads the main purpose. However, it lacks a structured explanation and is so terse that it sacrifices informative content, so it does not earn a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description should explain what the tool returns and how trending is determined. It only says 'popular posts' and mentions choosing a period, leaving ambiguity about the response structure, pagination, and distinctions from recent or list tools. The description is incomplete for a tool with three optional parameters and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only hints at the timeframe parameter ('기간을 골라 본다') but says nothing about limit or offset, which are important for pagination. This is insufficient compensation for the lack of schema-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description '벨로그 인기 글. 기간을 골라 본다' clearly identifies the resource (popular posts) and the action (view with a period filter). It is specific enough to convey core functionality, but it does not explicitly differentiate from siblings like velog_recent_posts or velog_list_posts, so it misses the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention any exclusions, prerequisites, or competing tools such as velog_search_posts or velog_recent_posts, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_unpublish_post발행 취소 (초안으로 되돌리기)ADestructiveIdempotent
발행된 글을 임시저장으로 되돌린다. 글은 사라지지 않고 초안 목록으로 간다. ★ 이미 나간 RSS·구독 메일은 회수되지 않는다 — 검색엔진 캐시도 한동안 남는다.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 발행된 글의 id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful context beyond annotations: it clarifies that the post is not deleted (countering destructiveHint), and discloses that RSS/subscription emails are not recalled and search engine caches persist. This addresses potential consequences of the operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, the first states the primary action clearly, the second adds necessary caveats. The use of a star highlights the important side-effect. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool with one parameter and no output schema, the description is comprehensive. It explains the outcome (draft list), the non-deletion, and external side effects. This fully covers the user's likely concerns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter 'id', which is described as the ID of the published post. The description adds no additional parameter semantics beyond what the schema already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: reverts a published post to draft. It distinguishes from siblings like publish_post and publish_draft by explicitly targeting the unpublish action. The title also reinforces the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description doesn't explicitly name alternatives, but the action is unambiguous: use this when you need to revert a published post to draft. The context of not deleting the post helps set expectations. No exclusions are stated, but the purpose is sufficient for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_update_draft벨로그 초안 수정ADestructiveIdempotent
기존 초안을 통째로 교체한다. 부분 수정이 아니다. 생략한 필드는 유지되지 않고 초기화된다 — tags 를 안 주면 기존 태그가 전부 지워지고, url_slug 를 안 주면 제목에서 새로 만들어 주소가 바뀌며, series_id 를 안 주면 기존 시리즈 연결이 끊긴다. 그래서 수정 전에 velog_get_post 로 현재 값을 읽어 바꾸지 않을 필드도 그대로 다시 넘기는 것을 권한다. 발행된 글의 id 는 거부한다(비공개로 내려가는 사고 방지).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | 초안의 id (velog_list_drafts 로 확인) | |
| body | Yes | 본문 전체 (마크다운). 부분 수정이 아니라 교체다 | |
| tags | No | ||
| title | Yes | ||
| url_slug | No | ||
| series_id | No | ||
| thumbnail | No | 썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다 | |
| series_name | No | 시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already 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.
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.
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.
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.
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.
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발행글 수정ADestructiveIdempotent
이미 발행된 글을 수정한다. 발행 상태(is_temp:false)는 유지된다. 생략한 필드는 기존 값을 그대로 유지한다 — 초안 도구와 달리 전체 교체가 아니다. 초안 id 는 거부한다(초안 수정은 velog_update_draft). 현재 설정에서는 공개 범위를 바꿀 수단이 없다 — 공개 글은 공개로, 비공개 글은 비공개로 그대로 남는다. 범위를 바꾸려면 VELOG_ALLOW_PUBLIC=1 이 필요하다.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| body | No | 생략하면 기존 본문 유지 | |
| tags | No | 생략하면 기존 태그 유지 | |
| title | No | ||
| url_slug | No | 생략하면 기존 주소 유지 | |
| series_id | No | ||
| thumbnail | No | 썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다 | |
| series_name | No | 시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
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.
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.
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.
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.
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.
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 가 없다. 올리기 전에 무슨 파일인지 확인하라.
| Name | Required | Description | Default |
|---|---|---|---|
| alt | No | ||
| path | Yes | 로컬 파일 경로 | |
| type | No | profile 은 프로필 사진용 분류일 뿐 — 사진 교체는 velog_update_profile_image | post |
| post_id | No | 붙일 글 id (서버가 소유권을 확인한다) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the minimal annotations: it specifies valid formats (PNG/JPEG/GIF/WebP) and that detection is by content, not extension. It also warns that uploaded URLs are public, there is no deletion API, and encourages pre-upload verification. This adds significant and non-obvious context, giving the agent both safety and operational awareness. The annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) are not contradicted; rather, the description enriches them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences: the first states purpose, the second provides format constraints, the third conveys a critical warning. It is front-loaded, and every sentence adds distinct value. The use of a warning symbol and bold for '파일 내용' draws attention without unnecessary verbiage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description provides a clear output expectation ('markdown for the body') and covers key behavioral constraints (file types, public URLs, no deletion). It also benefits from schema descriptions that explain the 'type' and 'post_id' parameters. Minor gaps remain, such as exact markdown format or error handling for invalid files, but overall the definition is well-rounded for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% (descriptions for path, type, post_id; alt lacks one). The description adds meaning to the path parameter by constraining accepted file types and specifying content-based validation, which is not present in the schema. It also clarifies the tool's output (markdown) relevant to the overall parameters. While not detailing each parameter syntax, it compensates for the alt gap partially and enhances the path semantics above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: 'Uploads a local image file to Velog and returns markdown for the body.' It names the resource (local image), the destination (Velog), and the output (markdown), distinguishing it from sibling tools like velog_render_cover or velog_update_profile_image (the latter explicitly referenced in the type parameter).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the primary use case (uploading images for post body markdown) through the phrase '본문용 마크다운' and warns about appropriate file types. An explicit alternative is provided in the type parameter description: 'profile 은 프로필 사진용 분류일 뿐 — 사진 교체는 velog_update_profile_image' (profile is just a classification; replacement goes to velog_update_profile_image). However, this alternative is not in the main description, only in the schema, so it lacks the explicitness of a fully self-contained usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_user_tags사용자 태그 목록ARead-only
사용자가 쓴 태그와 각 태그의 글 수. "이 사람이 뭘 주로 쓰나"를 가장 싸게 파악하는 방법이다.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| username | Yes | @ 없이 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, so the agent knows it's a safe read. The description adds minimal behavioral context beyond that (only that it's 'cheapest'). No mention of pagination, ordering, or rate limits, but given the annotations, the bar is lower and the description does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, using one sentence to state the output and another to provide a use case. It front-loads the purpose with no filler, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only tool, the description covers the core purpose and return content, but it omits details about ordering, limit semantics, and edge cases (e.g., empty result). Since there is no output schema, the description could be more explicit about the return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: 'username' has a description ('@ 없이'), but 'top' has none. The tool description does not explain what 'top' controls (e.g., number of tags to return). Since the description does not compensate for the undocumented parameter, it fails to add semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function: it returns a user's tags with post counts. It also provides a concrete use case ('이 사람이 뭘 주로 쓰나'를 가장 싸게 파악하는 방법), which distinguishes it from sibling tools like user info or post lists by focusing on aggregated tag statistics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context: use it to quickly understand a user's main writing topics. It implies this is a cheap, high-level alternative to reading individual posts, but it doesn't explicitly mention when not to use it or name alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
velog_whoami내 계정 확인ARead-only
현재 토큰으로 인증된 계정을 확인한다. 토큰이 살아있는지 점검하는 용도로도 쓴다. 다른 도구에서 username 을 생략하면 여기서 얻는 계정을 쓴다.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safe read-only nature is known. The description adds useful behavioral context: the tool's output is reused as a fallback username in other operations, and it can serve as a token liveness check. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, each carrying distinct value: the primary function and the integration use case. It is front-loaded with the core purpose and avoids redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-parameter, read-only tool with good annotations, the description is complete. It covers purpose, usage, and integration. The only minor gap is the lack of explicit return format, but the phrase '여기서 얻는 계정' (the account obtained here) implies the returned user object, which is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the baseline is 4. The description does not need to explain parameter details, but it implicitly explains the output's role (the authenticated account) which is the meaningful semantic content for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: '현재 토큰으로 인증된 계정을 확인한다' (checks the account authenticated with the current token). It specifies the resource (authenticated account) and adds a secondary purpose of checking token liveness. This differentiates it from sibling tools like velog_get_user, which fetches arbitrary users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context: it is used to verify the token and serves as the source for the default username when omitted in other tools. While it doesn't explicitly name alternatives or exclusions, the guidance about its integration with other tools is practical and distinguishes when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.6.0- Changed
velog_create_draft5 fields changed- changed
Input schema / properties / series_id / descriptionPrevious value: -"소속시킬 시리즈 id. ★ 벨로그는 임시저장 단계에서 이걸 무시한다 — 초안 생성 후 velog_update_draft 로 다시 지정해야 실제로 붙는다"New value: +"소속시킬 시리즈 id. 벨로그가 임시저장 생성 단계에서 이걸 버리므로 이 도구가 저장 직후 한 번 더 붙이고, 붙었는지 확인해 결과에 적는다. 생략하면 결과에 내 시리즈 목록을 함께 돌려준다" - added
Input schema / properties / series_nameAdded value: +{ + "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / thumbnail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / thumbnail / descriptionPrevious value: -"썸네일 이미지 URL (http/https 만)"New value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다" - removed
Input schema / properties / thumbnail / typeRemoved value: -"string"
- Changed
velog_publish_post4 fields changed- added
Input schema / properties / series_nameAdded value: +{ + "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / thumbnail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / thumbnail / descriptionAdded value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다" - removed
Input schema / properties / thumbnail / typeRemoved value: -"string"
- Added
velog_render_sequence - Changed
velog_update_draft4 fields changed- added
Input schema / properties / series_nameAdded value: +{ + "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾는다. 못 찾으면 저장하지 않고 목록을 알려준다", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / thumbnail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / thumbnail / descriptionAdded value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다" - removed
Input schema / properties / thumbnail / typeRemoved value: -"string"
- Changed
velog_update_post4 fields changed- added
Input schema / properties / series_nameAdded value: +{ + "description": "시리즈 **이름**(id 대신). 저장 전에 내 시리즈에서 찾아 같은 요청에 실어 보낸다 — 한 번의 호출로 시리즈까지 붙는다. 못 찾으면 저장하지 않고 목록을 알려준다", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / thumbnail / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / thumbnail / descriptionAdded value: +"썸네일 이미지 URL (http/https). 생략하면 본문 첫 이미지로 자동 설정한다. 자동 설정을 원하지 않으면 null 을 준다" - removed
Input schema / properties / thumbnail / typeRemoved value: -"string"
21 tool updates
v0.3.0- First observed
velog_blog_stats - First observed
velog_create_draft - First observed
velog_export_posts - First observed
velog_get_post - First observed
velog_get_user - First observed
velog_list_drafts - First observed
velog_list_posts - First observed
velog_list_series - First observed
velog_publish_draft - First observed
velog_publish_post - First observed
velog_recent_posts - First observed
velog_render_cover - First observed
velog_render_diagram - First observed
velog_search_posts - First observed
velog_trending_posts - First observed
velog_unpublish_post - First observed
velog_update_draft - First observed
velog_update_post - First observed
velog_upload_image - First observed
velog_user_tags - First observed
velog_whoami
TDQS
Scored across 22 tools
도구들이 대체로 명확히 구분된다. 다만 velog_publish_post와 velog_publish_draft가 둘 다 발행 동작이라 목적이 겹쳐 보일 수 있고, velog_recent_posts와 velog_trending_posts도 '최신 글 보기'라는 점에서 혼동 여지가 있다.
모든 도구가 velog_ 접두사를 쓰고 동사_명사 패턴이 대체로 일관된다. 다만 get/list가 혼용되고(search_posts, list_posts), render_* 계열과 upload_image, blog_stats 등이 약간 다른 패턴을 보인다.
22개는 약간 많지만 velog라는 플랫폼의 CRUD, 검색, 렌더링, 통계, 내보내기 등 다양한 기능을 담당하므로 각 도구가 나름의 자리를 가진다. 다만 렌더링 계열(diagram, sequence, cover, upload_image)이 4개나 있어 약간 무겁게 느껴진다.
글 조회·목록·검색·작성·발행·수정·비공개 전환·초안 관리까지 라이프사이클이 빠짐없이 갖춰져 있고, 사용자 정보, 태그, 통계, 내보내기, 이미지/다이어그램 업로드까지 플랫폼 사용에 필요한 기능이 골고루 포함되어 있다. 공개 발행 설정이 환경변수로 제한되는 것은 설계상 안전장치로 보인다.
Maintenance
Related MCP Connectors
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
A MCP server built for developers enabling Git based project management with project and personal…
Related MCP Servers
- FlicenseAqualityDmaintenanceA custom MCP server for interacting with Google Blogger blogs. It provides tools to list, create, edit, delete, and publish blog posts through Claude Code or Claude Desktop.9-
- AlicenseAqualityDmaintenanceMCP server for Velog blog platform enabling reading, searching, and writing articles via AI assistants.1217MIT
- FlicenseAqualityDmaintenanceAn MCP server that automatically generates technical blog posts using AI (Gemini and Claude), supporting various input types, styles, and collaborative workflow.10-
- AlicenseAqualityAmaintenanceMCP server for Hashnode GraphQL API to create drafts, publish posts, and manage your blog via Claude.118MIT