Skip to main content
Glama

velog_mcp

An MCP server that allows Claude to directly write and publish posts on Velog.

It supports Velog, which lacks a public API, through GraphQL reverse engineering. Designed with a human-in-the-loop flow of draft → user review → publish, it maintains full user control while automating content creation.

Installation

npx velog_mcp_setup

While logged into Velog, copy the access_token and refresh_token values from your browser's DevTools → Application → Cookies → https://velog.io.

The tokens will be saved to ~/.velog-mcp.json with 0600 permissions. Please add it to your .gitignore.

Related MCP server: velog-mcp

Claude CLI (Claude Code) Setup

Add to Project

claude mcp add velog npx -y velog_mcp

Or add it directly to your project's .claude/settings.json:

{
  "mcpServers": {
    "velog": {
      "command": "npx",
      "args": ["-y", "velog_mcp"]
    }
  }
}

Add Globally

claude mcp add --scope global velog npx -y velog_mcp

Global settings are available in all projects.

Verification

claude mcp list

If the velog server appears in the list, you are ready. You can use it directly in Claude Code conversations.

나: "React 훅에 대한 글 써줘"
Claude: (velog_draft_post 호출 → 검토 후 발행)

Claude Desktop Setup

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "velog": {
      "command": "npx",
      "args": ["-y", "velog_mcp"]
    }
  }
}

Usage

Writing and Publishing Posts

나: "React 19 concurrent features에 대한 글 써줘"

Claude: velog_draft_post 호출
→ { draft_id: "abc123", title: "React 19 Concurrent Features 정리", body_preview: "..." }

나: "좋아, 발행해"

Claude: velog_publish_post(draft_id: "abc123") 호출
→ { url: "https://velog.io/@username/react-19-...", post_id: "..." }

Private Publishing

나: "이 글 비공개로 발행해줘"
Claude: velog_publish_post(draft_id: "abc123", is_private: true)

Tool List

Tool

Description

velog_draft_post

Create a post draft (stored in session memory)

velog_publish_post

Publish a draft to Velog

velog_list_posts

View a list of your posts

velog_get_post

View the full content of a specific post

velog_update_post

Update an existing post

velog_delete_post

Delete a post

Authentication

  • access_token: ~1-2 hour TTL. The Velog server automatically refreshes it via Set-Cookie in GraphQL responses.

  • refresh_token: ~30 day TTL. If it expires, you must re-run npx velog_mcp_setup.

  • No separate refresh endpoint — handled automatically by Velog middleware.

Error Handling

Situation

Message

Token expired (401)

"The token has expired or is invalid. Please re-run npx velog_mcp_setup."

No config file

"Configuration file not found. Please run npx velog_mcp_setup."

Network error

"Cannot connect to Velog API. Please check your network."

Invalid draft_id

"draft_id does not exist. Please call velog_draft_post first."

GraphQL error

Returns the Velog server error message as is

Precautions

  • Drafts are stored in the session memory of the MCP server process. They are lost when Claude Desktop is restarted.

  • To save without publishing, use velog_publish_post(is_private: true) to save as private.

  • Images: Use the markdown external URL reference method (![alt](url)).

License

MIT

Available Tools

6 tools
velog_delete_postC

Velog 포스트를 삭제합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes삭제할 포스트 ID

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries full burden. '삭제합니다' implies a destructive mutation, but it doesn't disclose whether this is permanent, requires specific permissions, affects related data, or has rate limits. For a destructive operation with zero annotation coverage, this is inadequate behavioral disclosure.

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

Conciseness5/5

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

The description is a single, efficient sentence that directly states the tool's purpose with zero waste. It's appropriately sized for a simple deletion tool and front-loads the essential information.

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

Completeness2/5

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

For a destructive mutation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what happens after deletion (e.g., success confirmation, error handling), whether the action is reversible, or any side effects. Given the complexity and lack of structured data, more context is needed.

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

Parameters3/5

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

Schema description coverage is 100%, with the single parameter 'post_id' clearly documented as '삭제할 포스트 ID' (post ID to delete). The description doesn't add any additional parameter context beyond what the schema provides, which is acceptable given the high coverage. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose4/5

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

The description clearly states the action ('삭제합니다' - deletes) and resource ('Velog 포스트' - Velog post), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like velog_update_post or velog_publish_post, which also operate on Velog posts but with different actions.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. There's no mention of prerequisites (e.g., needing to own the post), when deletion is appropriate versus updating, or what happens after deletion. With siblings like velog_update_post and velog_publish_post available, this gap is significant.

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

velog_draft_postB

Velog 포스트 초안을 세션 메모리에 저장합니다. 발행 전 사용자가 검토할 수 있도록 draft_id를 반환합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes포스트 제목
bodyYes마크다운 본문
tagsNo태그 목록
is_privateNo비공개 여부 (기본값: false)
short_descriptionNo포스트 요약

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions that the draft is saved to session memory and returns a draft_id for review, which is useful. However, it lacks critical details: it doesn't specify if this is a read-only or mutation operation (implied mutation but not explicit), doesn't mention authentication requirements, rate limits, or what happens to the draft after saving (e.g., expiration, storage duration). For a tool with no annotations, this leaves significant gaps in understanding its behavior.

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

Conciseness5/5

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

The description is concise and front-loaded: it states the core action in the first sentence and the key outcome in the second. Every sentence earns its place by explaining what the tool does and why, with no redundant or vague language. It's appropriately sized for the tool's complexity, making it easy to understand quickly.

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

Completeness3/5

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

Given the tool's moderate complexity (5 parameters, no output schema, no annotations), the description provides a basic but incomplete picture. It covers the purpose and high-level usage context but lacks behavioral details like mutation effects, authentication, or error handling. Without annotations or an output schema, the description should do more to explain the return value (draft_id usage) and operational constraints. It's minimally viable but has clear gaps for a tool that modifies data.

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

Parameters3/5

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

The schema description coverage is 100%, with all parameters well-documented in the input schema (e.g., title, body, tags, is_private, short_description). The description doesn't add any parameter-specific information beyond what's in the schema, such as format details or usage examples. Given the high schema coverage, the baseline score of 3 is appropriate, as the description doesn't compensate but also doesn't need to since the schema handles parameter semantics adequately.

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

Purpose4/5

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

The description clearly states the tool's purpose: 'Velog 포스트 초안을 세션 메모리에 저장합니다' (saves a Velog post draft to session memory). It specifies the action (save to session memory) and resource (Velog post draft), distinguishing it from siblings like velog_publish_post (which publishes) or velog_update_post (which modifies existing posts). However, it doesn't explicitly differentiate from velog_update_post in terms of draft vs. published post editing, which could be clearer.

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

Usage Guidelines3/5

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

The description implies usage context: '발행 전 사용자가 검토할 수 있도록' (so users can review before publishing), suggesting this tool is for creating drafts prior to publication. However, it doesn't explicitly state when to use this vs. alternatives like velog_publish_post (direct publishing) or velog_update_post (editing existing posts), nor does it mention prerequisites or exclusions. The guidance is present but not comprehensive.

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

velog_get_postC

특정 Velog 포스트의 전체 내용을 가져옵니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
url_slugYes포스트 URL slug

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. It states it retrieves '전체 내용' (entire content) which implies a read operation, but doesn't specify whether authentication is required, rate limits, error conditions, or what format/content is returned. For a read tool with zero annotation coverage, this leaves significant behavioral gaps.

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

Conciseness5/5

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

The description is a single, efficient sentence that directly states the tool's purpose without any unnecessary words. It's appropriately sized for a simple retrieval tool and front-loads the essential information. Every word earns its place.

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

Completeness2/5

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

Given no annotations, no output schema, and a simple single-parameter tool, the description is incomplete. While it states what the tool does, it doesn't provide enough context about authentication requirements, return format, error handling, or how it differs from sibling tools. For a tool that retrieves content, the agent needs more information about what 'entire content' includes and any access constraints.

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

Parameters3/5

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

The input schema has 100% description coverage with a clear parameter description ('포스트 URL slug'). The description adds no additional parameter information beyond what the schema already provides. According to scoring rules, when schema_description_coverage is high (>80%), the baseline is 3 even with no param info in the description.

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

Purpose4/5

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

The description clearly states the action ('가져옵니다' - fetches/retrieves) and resource ('특정 Velog 포스트의 전체 내용' - entire content of a specific Velog post). It distinguishes from siblings like velog_list_posts (list vs get specific) and velog_update_post (update vs retrieve). However, it doesn't explicitly differentiate from velog_draft_post or velog_publish_post in terms of content access.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when you'd use velog_get_post instead of velog_list_posts (specific post vs listing), nor does it indicate any prerequisites like authentication requirements or when this tool should not be used. The agent must infer usage from the name alone.

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

velog_list_postsC

내 Velog 포스트 목록을 가져옵니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo가져올 포스트 수 (기본값: 20)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries full burden but only states the basic action without behavioral details. It doesn't disclose aspects like authentication needs, rate limits, pagination behavior, or whether it returns all posts or a subset, which are critical for a list operation.

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

Conciseness5/5

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

The description is a single, efficient sentence in Korean that directly states the purpose without unnecessary words. It's appropriately sized and front-loaded, making it easy to parse quickly.

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

Completeness2/5

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

Given no annotations and no output schema, the description is incomplete. It lacks details on return values (e.g., post format, metadata), behavioral traits, and differentiation from siblings, which are essential for effective tool use in this context.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema fully documents the 'limit' parameter with its type and default. The description adds no additional parameter semantics beyond what the schema provides, meeting the baseline for high coverage.

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

Purpose4/5

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

The description clearly states the action ('가져옵니다' - fetches/gets) and resource ('내 Velog 포스트 목록' - my Velog post list), making the purpose understandable. However, it doesn't differentiate from sibling tools like 'velog_get_post' which might fetch a single post, leaving some ambiguity about scope.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives is provided. The description implies it's for listing posts, but it doesn't specify scenarios (e.g., browsing vs. detailed retrieval) or mention sibling tools like 'velog_get_post' for individual posts, leaving usage context unclear.

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

velog_publish_postA

초안(draft_id)을 Velog에 발행합니다. velog_draft_post 호출 후 사용하세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
draft_idYesvelog_draft_post에서 반환된 draft_id
is_privateNo비공개 발행 여부 (초안 설정 덮어씀)

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. While it mentions that is_private parameter '덮어씀' (overwrites) draft settings, it doesn't describe what publishing entails (e.g., makes content publicly visible, triggers notifications), potential side effects, authentication requirements, or error conditions. For a mutation tool with zero annotation coverage, this is insufficient.

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

Conciseness5/5

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

The description is extremely concise with just two sentences in Korean. The first sentence states the core purpose, and the second provides crucial usage guidance. Every word earns its place with zero wasted text, making it front-loaded and efficient.

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

Completeness3/5

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

Given this is a mutation tool with no annotations and no output schema, the description should do more to explain behavioral aspects. While it covers basic purpose and workflow prerequisites adequately, it lacks information about what publishing actually does, potential consequences, or what the tool returns. The completeness is minimal but not entirely inadequate.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description adds minimal value beyond the schema - it only reinforces that draft_id comes from velog_draft_post (already in schema) and mentions that is_private overwrites draft settings (slightly helpful context). Baseline 3 is appropriate when schema does the heavy lifting.

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

Purpose4/5

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

The description clearly states the action ('발행합니다' - publishes) and the resource ('초안' - draft), specifying it's for Velog. It distinguishes from siblings like velog_draft_post by indicating this tool publishes rather than creates drafts. However, it doesn't explicitly differentiate from velog_update_post which might also involve publishing changes.

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

Usage Guidelines4/5

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

The description provides clear context about when to use this tool ('velog_draft_post 호출 후 사용하세요' - use after calling velog_draft_post), establishing a prerequisite workflow. It doesn't explicitly state when NOT to use it or name alternatives, but the sibling relationship is implied through the naming convention.

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

velog_update_postC

기존 Velog 포스트를 수정합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes수정할 포스트 ID
titleNo새 제목
bodyNo새 마크다운 본문
tagsNo새 태그 목록
is_privateNo비공개 여부
short_descriptionNo새 요약

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden for behavioral disclosure. While '수정합니다' implies a mutation operation, it doesn't specify whether this requires authentication, what happens to unchanged fields, whether changes are reversible, or what the response looks like. For a mutation tool with zero annotation coverage, this is insufficient.

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

Conciseness5/5

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

The description is a single, efficient sentence that states the core functionality without any wasted words. It's appropriately sized for a straightforward update operation and gets directly to the point.

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

Completeness2/5

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

For a mutation tool with 6 parameters and no annotations or output schema, the description is inadequate. It doesn't explain what happens when fields are omitted, whether partial updates are supported, what authentication is required, or what the tool returns. The agent lacks crucial context for proper invocation.

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

Parameters3/5

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

The schema description coverage is 100%, with all 6 parameters clearly documented in the input schema. The description adds no additional parameter information beyond what's already in the structured schema, so it meets the baseline expectation but doesn't provide extra value.

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

Purpose4/5

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

The description clearly states the action ('수정합니다' - modifies/updates) and resource ('기존 Velog 포스트' - existing Velog post), making the purpose immediately understandable. However, it doesn't differentiate from siblings like velog_draft_post or velog_publish_post, which also involve post modifications.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives. The description doesn't mention prerequisites (like needing an existing post ID), nor does it clarify differences from velog_publish_post or velog_draft_post, leaving the agent to guess about appropriate usage contexts.

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. Dates show when Glama detected each change.

  1. 6 tool updatesv0.1.0
    • First observedvelog_delete_post
    • First observedvelog_draft_post
    • First observedvelog_get_post
    • First observedvelog_list_posts
    • First observedvelog_publish_post
    • First observedvelog_update_post

TDQS

A3.6/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose with no ambiguity: delete, draft, get, list, publish, and update are all specific actions targeting Velog posts. The descriptions reinforce this by specifying when to use each tool (e.g., velog_publish_post after velog_draft_post).

Naming Consistency5/5

All tools follow a consistent verb_noun pattern with 'velog_' prefix and snake_case: velog_delete_post, velog_draft_post, velog_get_post, velog_list_posts, velog_publish_post, velog_update_post. There are no deviations in naming style.

Tool Count5/5

With 6 tools, this server is well-scoped for managing Velog posts. Each tool earns its place by covering essential CRUD and lifecycle operations (drafting and publishing), avoiding both bloat and thin coverage.

Completeness5/5

The tool set provides complete CRUD and lifecycle coverage for Velog posts: create (via draft and publish), read (get and list), update, and delete. There are no obvious gaps, and the workflow from drafting to publishing is explicitly supported.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/seongwon030/velog_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server