# Tistory MCP (Unofficial) (pypi · tistory-mcp)

Unofficial MCP server for Tistory blogs: publish, edit, drafts, images. Private by default.

- Trust score: 65/100 (medium)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-04

## Components

- pypi · `tistory-mcp`: 65/100 (this document), [markdown](https://verifymcp.io/servers/jangsejong-tistory-mcp/tistory-mcp.md), [page](https://verifymcp.io/servers/jangsejong-tistory-mcp/tistory-mcp)

## Channel facts

- Registry: `pypi`
- Package: `tistory-mcp`
- Version: `0.2.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-04.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 2 of 39 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to jangsejong/tistory-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 7 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 67/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2010 tokens (~182/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 12 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Tistory MCP (Unofficial) server?

Tistory MCP (Unofficial) runs locally as a PyPI package, launched with uvx tistory-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add jangsejong-tistory-mcp -- uvx tistory-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "jangsejong-tistory-mcp": {
      "command": "uvx",
      "args": [
        "tistory-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "jangsejong-tistory-mcp": {
      "command": "uvx",
      "args": [
        "tistory-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add jangsejong-tistory-mcp -- uvx tistory-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "jangsejong-tistory-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "tistory-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add jangsejong-tistory-mcp --command uvx --arg tistory-mcp
```

### Hermes

```yaml
mcp_servers:
  jangsejong-tistory-mcp:
    command: "uvx"
    args: ["tistory-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "jangsejong-tistory-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "tistory-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add jangsejong-tistory-mcp -t stdio -c uvx -a tistory-mcp
```

### Other

```json
{
  "mcpServers": {
    "jangsejong-tistory-mcp": {
      "command": "uvx",
      "args": [
        "tistory-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 65, −15)

- [security regression] Malware scan: pass → unverified

### 2026-11-01 (score 80, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-31 (score 65, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-29 (score 80, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-28 (score 65)

First indexed and scored.

## MCP tools (11)

### `tistory_session_init` (~208 tokens)

Log in to Tistory (로그인)

Open a browser for the Kakao login (카카오 로그인 + 카카오톡 승인) and save the cookies.

Blocks until the user finishes or timeout_sec passes — tell the user to look for the browser
window and approve the KakaoTalk push before calling. The KakaoTalk 2-factor approval cannot
be automated. Once saved, other tools work without a browser until the session expires
(it can be as short as an hour or so); call again when a tool reports an expired session.

Input parameters:

- `blog_url` (string, required): Blog host or URL (블로그 주소). e.g. myblog.tistory.com
- `cdp_url`: CDP address of a browser that is already running with --remote-debugging-port, e.g. http://127.0.0.1:9222. Use when no browser window can be shown (WSL, SSH, containers)
- `timeout_sec` (integer): How long to wait for the login (seconds)

### `tistory_session_status` (~70 tokens)

Session status (세션 상태)

Report whether a saved session exists, when it was saved and when it expires.

Also makes one admin API call to tell whether it is live right now (valid/expired).

Input parameters:

- `blog_url` (string, required): Blog host or URL (블로그 주소). e.g. myblog.tistory.com

### `tistory_get_categories` (~67 tokens)

List categories (카테고리)

Return the category tree flattened to id / name / parent id.

Use the integer id here as `category` when publishing or updating (names are not accepted).

Input parameters:

- `blog_url` (string, required): Blog host or URL (블로그 주소). e.g. myblog.tistory.com

### `tistory_list_posts` (~144 tokens)

List posts (글 목록)

List posts from the admin side (includes private and protected posts), one page at a time.

Bodies are not included — use tistory_get_post for the body.

Input parameters:

- `blog_url` (string, required): Blog host or URL (블로그 주소). e.g. myblog.tistory.com
- `category` (integer): Category id filter; -3 = all categories
- `keyword` (string): Server-side search keyword; empty string = all posts
- `page` (integer): Page number, 1-based
- `search_type` (string): Where to search the keyword: post title, body, or tag
- `visibility` (string): Visibility filter

### `tistory_get_post` (~127 tokens)

Get a post (글 조회)

Return one post's metadata (from the admin list) and its body HTML (from the post page).

Works for private posts with the saved session. The body is the skin-rendered HTML, not the
original markdown (Tistory keeps no markdown). To edit, write the new body yourself and send
it with tistory_update_post rather than echoing content_html back.

Input parameters:

- `blog_url` (string, required): Blog host or URL (블로그 주소). e.g. myblog.tistory.com
- `post_id` (string, required): Post number (글 번호), digits only

### `tistory_fetch_public_posts` (~82 tokens)

Fetch public posts via RSS (공개 글 RSS)

Fetch the latest public posts of any Tistory blog from its RSS feed. No login needed.

Input parameters:

- `blog_url` (string, required): Blog host or URL (블로그 주소). e.g. myblog.tistory.com
- `include_content` (boolean): Include each item's RSS description (body HTML)
- `limit` (integer): Max items to return

### `tistory_publish_post` (~314 tokens)

Publish a new post (새 글 발행)

Create a NEW post. Every call creates a new post — this is not a draft and not an update.

Do not retry after an error or timeout without checking tistory_list_posts first, or the post
may be duplicated. Defaults to private so the user can review it before switching to public
with tistory_update_post. Rate-limited (default 60 s apart, 20 per day).

Input parameters:

- `attachments`: attachment_ref of every image used in content (from tistory_upload_image)
- `blog_url` (string, required): Target blog host or URL — required to prevent mis-publishing
- `category` (integer): Category id from tistory_get_categories; 0 = none
- `content` (string, required): Post body. Markdown by default (converted to HTML by the tool). For images, paste the `substitution` from tistory_upload_image verbatim
- `content_format` (string): 'markdown' (default) or 'html'
- `password`: Password for visibility='protected'
- `post_type` (string): 'post' (default) or a static 'page'
- `slogan` (string): URL slug; empty = generated from the title by the server
- `tags`: Tags (태그), one per item, without '#' and without commas
- `title` (string, required): Post title (제목)
- `visibility` (string): Default 'private' (비공개). Use 'public' only when the user explicitly asks; 'protected' needs password

### `tistory_update_post` (~271 tokens)

Update a post (글 수정)

Update an existing post. The body must be sent in full (the server does not merge).

Title, category, visibility and slug keep their current values when omitted; tags are kept by
reading them from the post page (pass [] to clear). Rate-limited together with publish.

Input parameters:

- `attachments`: attachment_ref of images used in the new content
- `blog_url` (string, required): Blog host or URL of the post to update
- `category`: New category id; omit to keep the current one
- `content` (string, required): The complete new body — the server overwrites the whole post. Do not echo content_html from tistory_get_post; write the new body yourself
- `content_format` (string): Default 'html'. Set 'markdown' when sending markdown, or it is posted as raw text
- `password`: Password for visibility='protected'
- `post_id` (string, required): Post number (글 번호)
- `slogan`: New URL slug; omit to keep
- `tags`: New tags; omit to keep the current tags (read from the post page), pass [] to clear
- `title`: New title; omit to keep the current one
- `visibility`: New visibility; omit to keep the current one. 'public' makes it live

### `tistory_delete_post` (~84 tokens)

Delete a post (글 삭제)

Permanently delete a post. Cannot be undone.

Ask the user to confirm in chat, then call with confirm=true.

Input parameters:

- `blog_url` (string, required): Blog host or URL of the post to delete
- `confirm` (boolean): Must be true to actually delete. Ask the user in chat first
- `post_id` (string, required): Post number (글 번호)

### `tistory_upload_image` (~184 tokens)

Upload an image (이미지 업로드)

Upload an image and return `substitution` (paste into the body) and `attachment_ref`.

Put `substitution` verbatim where the image goes, and pass `attachment_ref` in `attachments`
when publishing/updating — otherwise the image is garbage-collected after about 15 days.
Do not put the returned URL into the body directly.

Input parameters:

- `blog_url` (string, required): Blog host or URL (블로그 주소). e.g. myblog.tistory.com
- `file_path` (string, required): Local image path (png/jpg/jpeg/gif/webp, up to 20MB)
- `height`: Pixel height; read from the file header if omitted
- `style` (string): Alignment: alignCenter (default), alignLeft, alignRight, widthOrigin
- `width`: Pixel width; read from the file header if omitted

### `tistory_save_draft` (~174 tokens)

Save autosave draft (자동저장 초안)

Write a draft into the editor's single autosave slot. No post is created.

The next time the user opens the editor it offers to restore this draft. There is only one
slot, so saving again overwrites the previous draft. For several reviewable drafts, publish
with visibility='private' instead.

Input parameters:

- `attachments`: attachment_ref of images used in content
- `blog_url` (string, required): Blog host or URL (블로그 주소). e.g. myblog.tistory.com
- `category` (integer): Category id; 0 = none
- `content` (string, required): Draft body (markdown by default)
- `content_format` (string): 'markdown' (default) or 'html'
- `tags`: Tags, one per item
- `title` (string, required): Draft title

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/jangsejong-tistory-mcp/tistory-mcp#diagnostics

## Score history

- 2026-11-04: 65
- 2026-11-03: 80
- 2026-11-02: 80
- 2026-11-01: 80
- 2026-10-31: 65
- 2026-10-30: 80
- 2026-10-29: 80
- 2026-10-28: 65

## Common questions

### What is the Tistory MCP (Unofficial) server?

Tistory MCP (Unofficial) is listed in the public MCP registry as io.github.jangsejong/tistory-mcp. Unofficial MCP server for Tistory blogs: publish, edit, drafts, images. Private by default. This page covers its PyPI package (tistory-mcp).

### Is the Tistory MCP (Unofficial) server safe to use?

Tistory MCP (Unofficial) scores 65 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Tistory MCP (Unofficial) server expose?

Tistory MCP (Unofficial) exposes 11 tools: tistory_session_init, tistory_session_status, tistory_get_categories, tistory_list_posts, tistory_get_post, and 6 more. Their descriptions and schemas cost roughly 1,725 tokens of context every time the server is loaded.

### Is the Tistory MCP (Unofficial) server still maintained?

Tistory MCP (Unofficial) is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Tistory MCP (Unofficial) server under?

Tistory MCP (Unofficial) declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/tistory-mcp/
- Socket report: https://socket.dev/pypi/package/tistory-mcp
- Repository: https://github.com/jangsejong/tistory-mcp
- Changelog RSS feed: https://verifymcp.io/servers/jangsejong-tistory-mcp/tistory-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/jangsejong-tistory-mcp/tistory-mcp.json
- HTML version of this page: https://verifymcp.io/servers/jangsejong-tistory-mcp/tistory-mcp
