@milcho0604/velog-mcp 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # velog-mcp
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/@milcho0604/velog-mcp)](https://www.npmjs.com/package/@milcho0604/velog-mcp)
3
4
  [![Node](https://img.shields.io/badge/node-%3E%3D24-brightgreen)](https://nodejs.org)
4
5
  [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
5
6
  [![Runtime deps](https://img.shields.io/badge/runtime%20deps-2-lightgrey)](package.json)
@@ -55,6 +56,18 @@ HTTP·테스트 러너·타입스크립트 실행은 전부 Node 24 내장을
55
56
 
56
57
  값을 나중에 바꾸려면 `/plugin manage`.
57
58
 
59
+ ### 그냥 MCP 서버로
60
+
61
+ npm 에 올려뒀으니 클론할 것 없이 MCP 클라이언트가 `npx` 로 띄운다. 설정 블록과
62
+ 클라이언트 지원 범위는 [설정](#설정) 을 볼 것.
63
+
64
+ ```bash
65
+ claude mcp add velog -e VELOG_REFRESH_TOKEN=여기에_토큰 \
66
+ -- npx -y @milcho0604/velog-mcp@0.4.2
67
+ ```
68
+
69
+ 이 방식은 토큰이 클라이언트 설정 파일에 남는다. 위의 플러그인 방식은 키체인에 넣는다.
70
+
58
71
  ### 직접 빌드해서
59
72
 
60
73
  ```bash
@@ -71,8 +84,8 @@ MCP 클라이언트 설정 파일(`claude_desktop_config.json`, `.mcp.json` 등)
71
84
  {
72
85
  "mcpServers": {
73
86
  "velog": {
74
- "command": "node",
75
- "args": ["/절대경로/velog-mcp/dist/index.js"],
87
+ "command": "npx",
88
+ "args": ["-y", "@milcho0604/velog-mcp@0.4.2"],
76
89
  "env": {
77
90
  "VELOG_REFRESH_TOKEN": "여기에 토큰"
78
91
  }
@@ -84,10 +97,20 @@ MCP 클라이언트 설정 파일(`claude_desktop_config.json`, `.mcp.json` 등)
84
97
  Claude Code CLI 라면:
85
98
 
86
99
  ```bash
87
- claude mcp add velog -- node /절대경로/velog-mcp/dist/index.js
88
- # 생성된 항목에 "env" 블록을 추가
100
+ claude mcp add velog -e VELOG_REFRESH_TOKEN=여기에_토큰 \
101
+ -- npx -y @milcho0604/velog-mcp@0.4.2
89
102
  ```
90
103
 
104
+ 로컬 체크아웃으로 돌리려면 command 를
105
+ `node /절대경로/velog-mcp/dist/index.js` 로 바꾼다.
106
+
107
+ > **어떤 클라이언트에서 되나?** 이건 stdio 서버다 — 클라이언트가 로컬 프로세스로 띄운다.
108
+ > Claude Code·Claude Desktop·Cursor 처럼 MCP 서버를 로컬에서 실행하는 클라이언트에서 된다.
109
+ > **claude.ai 와 ChatGPT 웹앱에서는 안 된다** — 둘 다 HTTP 로 접근 가능한 원격 MCP 서버만
110
+ > 받는다. 연결이 내 기계가 아니라 그쪽 서버에서 출발하기 때문이다. 웹에서 쓰려면 서버를
111
+ > 공개 호스팅하고 벨로그 토큰을 그 배포본에 넘겨야 하는데, 그러면 토큰을 내 기계에만
112
+ > 두려던 이유가 사라진다.
113
+
91
114
  ### 토큰 얻는 법
92
115
 
93
116
  벨로그는 공개 쓰기 API 가 없어서 브라우저 세션 쿠키로 인증한다.
package/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # velog-mcp
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/@milcho0604/velog-mcp)](https://www.npmjs.com/package/@milcho0604/velog-mcp)
3
4
  [![Node](https://img.shields.io/badge/node-%3E%3D24-brightgreen)](https://nodejs.org)
4
5
  [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
5
6
  [![Runtime deps](https://img.shields.io/badge/runtime%20deps-2-lightgrey)](package.json)
@@ -60,6 +61,19 @@ that declaration (P7).
60
61
 
61
62
  Change values later with `/plugin manage`.
62
63
 
64
+ ### As a plain MCP server
65
+
66
+ Published on npm, so nothing to clone — your MCP client runs it via `npx`. See
67
+ [Configure](#configure) for the config block and the client-support note.
68
+
69
+ ```bash
70
+ claude mcp add velog -e VELOG_REFRESH_TOKEN=your_refresh_token \
71
+ -- npx -y @milcho0604/velog-mcp@0.4.2
72
+ ```
73
+
74
+ The token stays in your client's config file here. The plugin route above puts it in
75
+ the Keychain instead.
76
+
63
77
  ### From source
64
78
 
65
79
  ```bash
@@ -76,8 +90,8 @@ Add this to your MCP client config (`claude_desktop_config.json`, `.mcp.json`,
76
90
  {
77
91
  "mcpServers": {
78
92
  "velog": {
79
- "command": "node",
80
- "args": ["/absolute/path/to/velog-mcp/dist/index.js"],
93
+ "command": "npx",
94
+ "args": ["-y", "@milcho0604/velog-mcp@0.4.2"],
81
95
  "env": {
82
96
  "VELOG_REFRESH_TOKEN": "your_refresh_token"
83
97
  }
@@ -89,10 +103,21 @@ Add this to your MCP client config (`claude_desktop_config.json`, `.mcp.json`,
89
103
  With the Claude Code CLI:
90
104
 
91
105
  ```bash
92
- claude mcp add velog -- node /absolute/path/to/velog-mcp/dist/index.js
93
- # then add the "env" block to the entry it created
106
+ claude mcp add velog -e VELOG_REFRESH_TOKEN=your_refresh_token \
107
+ -- npx -y @milcho0604/velog-mcp@0.4.2
94
108
  ```
95
109
 
110
+ To run a local checkout instead, swap the command for
111
+ `node /absolute/path/to/velog-mcp/dist/index.js`.
112
+
113
+ > **Which clients can run this?** This is a stdio server: the client starts it as a
114
+ > local process. That works in Claude Code, Claude Desktop, Cursor, and other clients
115
+ > that run MCP servers locally. It does **not** work in the claude.ai or ChatGPT web
116
+ > apps — both accept only remote MCP servers reachable over HTTP, since the connection
117
+ > originates from their servers rather than your machine. Using it there would mean
118
+ > hosting it publicly and handing your Velog token to that deployment, which defeats
119
+ > the point of keeping the token on your own machine.
120
+
96
121
  ### Getting your token
97
122
 
98
123
  Velog has no public write API, so the server authenticates with your browser session
package/dist/auth.js CHANGED
@@ -12,6 +12,13 @@
12
12
  * (2) Set-Cookie 를 받아 메모리에 반영하면 세션이 안 끊긴다.
13
13
  * 여전히 디스크에는 쓰지 않는다 — 프로세스 수명만큼만 산다.
14
14
  */
15
+ /**
16
+ * 마스킹용으로 기억해 둘 옛 토큰의 최대 개수.
17
+ *
18
+ * 갱신 전 토큰도 계속 가려야 해서 누적하는데, 상한이 없으면 프로세스 수명 내내
19
+ * 자란다. 40개면 갱신 20회 분량이라 지연 도착한 응답을 가리기에 충분하다.
20
+ */
21
+ const MAX_REMEMBERED_TOKENS = 40;
15
22
  export function readAuthFromEnv(env = process.env) {
16
23
  const accessToken = env['VELOG_ACCESS_TOKEN']?.trim() || undefined;
17
24
  const refreshToken = env['VELOG_REFRESH_TOKEN']?.trim() || undefined;
@@ -106,8 +113,29 @@ export class TokenStore {
106
113
  state.credentials.refreshToken,
107
114
  ]) {
108
115
  // 너무 짧은 값을 치환하면 본문이 훼손된다. 토큰은 항상 이보다 길다.
109
- if (secret && secret.length >= 8)
110
- this.#seen.add(secret);
116
+ if (!secret || secret.length < 8)
117
+ continue;
118
+ // ★★ 이미 있어도 **지웠다 다시 넣는다.** Set.add 는 기존 값의 순서를
119
+ // 바꾸지 않는데, 여기서는 삽입 순서가 곧 '오래된 순서'다.
120
+ // 벨로그는 access_token 만 자주 재발급하고 refresh_token 은 그대로
121
+ // 두는 일이 흔하다. 그러면 **지금 쓰는 refresh_token 이 가장 오래된
122
+ // 항목이 되어 축출된다** — 살아 있는 자격증명이 오류 문자열에 그대로
123
+ // 드러난다는 뜻이다. 코덱스 교차검증에서 잡았다(access 40회 갱신 후
124
+ // refresh 가 마스킹 목록에서 사라짐).
125
+ this.#seen.delete(secret);
126
+ this.#seen.add(secret);
127
+ }
128
+ // ★ 상한이 없으면 계속 자란다. 벨로그는 access_token 수명이 30분 밑으로
129
+ // 내려가면 재발급하므로 하루 약 48쌍이 쌓인다. 오래 켜두면 메모리도
130
+ // 메모리지만 mask() 가 본 토큰 수만큼 문자열을 훑는다
131
+ // (실측: 30일치 2,880개 누적 시 mask() 1회 0.18ms — 절대량은 작지만
132
+ // 상한 없이 자라는 것 자체가 잘못이다).
133
+ // 가장 오래된 것부터 버린다. 현재 쓰는 토큰은 방금 넣은 두 개라 안전하다.
134
+ while (this.#seen.size > MAX_REMEMBERED_TOKENS) {
135
+ const oldest = this.#seen.values().next();
136
+ if (oldest.done === true)
137
+ break;
138
+ this.#seen.delete(oldest.value);
111
139
  }
112
140
  }
113
141
  }
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -34,6 +34,13 @@ export interface VelogApiErrorDetail {
34
34
  * 전부 실패한다 — 실측으로 확인함.
35
35
  */
36
36
  readonly networkCodes?: readonly string[];
37
+ /**
38
+ * 서버가 `errors` 와 `data` 를 **함께** 준 경우.
39
+ *
40
+ * ★ 이 표식이 붙은 오류는 절대 재시도하지 않는다. 작업이 이미 반영됐을 수
41
+ * 있는데 다시 치면 두 번 반영된다 — mutate() 무재시도와 같은 이유다.
42
+ */
43
+ readonly partial?: boolean;
37
44
  }
38
45
  /** cause 체인을 훑어 code·name 을 모은다. 토큰이 섞일 수 있는 message 는 담지 않는다. */
39
46
  export declare function collectCauseCodes(error: unknown, depth?: number): string[];
@@ -48,8 +55,12 @@ export interface ClientOptions {
48
55
  readonly timeoutMs?: number;
49
56
  readonly fetchImpl?: typeof fetch;
50
57
  readonly maxRetries?: number;
58
+ /** 재시도를 포함한 총 예산. 기본값 근거는 RETRY_BUDGET_MS 주석. */
59
+ readonly retryBudgetMs?: number;
51
60
  /** 테스트에서 대기를 건너뛰기 위해 주입한다. */
52
61
  readonly sleepImpl?: (ms: number) => Promise<void>;
62
+ /** 테스트에서 예산 소진을 벽시계 없이 재현하기 위해 주입한다. */
63
+ readonly nowImpl?: () => number;
53
64
  /**
54
65
  * 인증 상태로 비-벨로그 엔드포인트에 요청하는 것을 허용한다.
55
66
  * 가짜 fetch 로 도구를 검사하는 테스트 전용이며, 운영 경로에서는 절대 켜지 않는다.
@@ -57,6 +68,46 @@ export interface ClientOptions {
57
68
  readonly allowInsecureEndpoint?: boolean;
58
69
  }
59
70
  export declare function isTransient(error: unknown): boolean;
71
+ /**
72
+ * 재시도까지 포함한 **총** 예산.
73
+ *
74
+ * ★ 왜 상한이 필요한가 — 시도당 20초 × 3회 + 백오프 1.5초 = 61.5초다. 그런데
75
+ * MCP SDK 의 클라이언트측 기본 요청 타임아웃은 60초다
76
+ * (shared/protocol.js: DEFAULT_REQUEST_TIMEOUT_MSEC = 60000).
77
+ * 실측 61.6초 — **클라이언트가 항상 먼저 포기한다.** 즉 마지막 시도의 20초는
78
+ * 결과를 아무도 보지 못하는 순수 낭비였다. 기다린 사람만 손해다.
79
+ *
80
+ * 35초로 잡은 이유: 발행 계열 도구는 한 호출에서 `mutate`(무재시도 20초) 다음에
81
+ * 사후 재조회를 한 번 더 한다. 20 + 35 = 55초로 60초 안에 들어온다.
82
+ * 빠르게 실패하는 오류(ECONNRESET 등)에는 영향이 없다 — 세 번 다 그대로 돈다.
83
+ *
84
+ * ⚠️ 감수하는 것 — 첫 시도가 19초를 태우고 실패한 뒤 두 번째가 16초 걸려 성공할
85
+ * 경우, 예산이 남은 시간으로 잘라 그 성공을 놓친다. 실측 왕복이 1.3초대라
86
+ * 현실에서 보기 어려운 조합이고, 그걸 살리려고 예산을 늘리면 61.5초짜리
87
+ * '아무도 못 보는 기다림'이 돌아온다. 둘 중 하나는 포기해야 한다.
88
+ */
89
+ export declare const RETRY_BUDGET_MS = 35000;
90
+ /**
91
+ * 도구 핸들러가 MCP 에게서 받는 것 중 **우리가 쓰는 부분만.**
92
+ *
93
+ * SDK 의 실제 타입(RequestHandlerExtra)은 이보다 넓다. 좁게 받으면 콜백이
94
+ * 그대로 들어맞고(넓은 쪽을 좁은 쪽 자리에 넣는 것이므로 안전하다) SDK 내부
95
+ * 타입에 이 파일이 묶이지 않는다. 인자 타입을 직접 적은 핸들러들
96
+ * (`async (args: PublishArgs, extra) =>`) 은 SDK 의 문맥 추론이 끊기므로 이걸 쓴다.
97
+ */
98
+ export interface ToolExtra {
99
+ readonly signal: AbortSignal;
100
+ }
101
+ /** 호출자가 요청 단위로 넘기는 것. */
102
+ export interface RequestOptions {
103
+ /**
104
+ * 도구 취소 신호. MCP 는 요청마다 AbortSignal 을 주는데
105
+ * (shared/protocol.js 가 `notifications/cancelled` 에 abort 한다) 이걸 fetch 까지
106
+ * 내려보내지 않으면, 클라이언트가 포기한 뒤에도 요청이 끝까지 가고 mutation 이
107
+ * 그대로 나간다.
108
+ */
109
+ readonly signal?: AbortSignal | undefined;
110
+ }
60
111
  export declare class VelogClient {
61
112
  #private;
62
113
  constructor(options: ClientOptions);
@@ -71,7 +122,7 @@ export declare class VelogClient {
71
122
  * 서버가 글을 만든 뒤 응답만 유실되면 재시도가 초안을 하나 더 만든다.
72
123
  * 그냥 중복이 아니라 실제 피해로 이어진다 — mutate() 주석 참고.
73
124
  */
74
- request<T>(query: string, variables?: Record<string, unknown>): Promise<T>;
125
+ request<T>(query: string, variables?: Record<string, unknown>, options?: RequestOptions): Promise<T>;
75
126
  /**
76
127
  * 쓰기 전용 — **재시도하지 않는다.**
77
128
  *
@@ -91,7 +142,7 @@ export declare class VelogClient {
91
142
  * 비공개로 내려간다.** 응답 유실로 인한 자동 재시도가 이 한계를 앞당길 수 있어
92
143
  * 쓰기는 한 번만 친다. 실패하면 사용자가 상태를 확인하고 다시 부르게 한다.
93
144
  */
94
- mutate<T>(query: string, variables?: Record<string, unknown>): Promise<T>;
145
+ mutate<T>(query: string, variables?: Record<string, unknown>, options?: RequestOptions): Promise<T>;
95
146
  /**
96
147
  * 이미지 업로드. **재시도하지 않는다.**
97
148
  *
@@ -109,5 +160,6 @@ export declare class VelogClient {
109
160
  readonly type: 'post' | 'profile';
110
161
  readonly contentType: string;
111
162
  readonly refId?: string;
163
+ readonly signal?: AbortSignal | undefined;
112
164
  }): Promise<string>;
113
165
  }
package/dist/client.js CHANGED
@@ -53,10 +53,20 @@ const TRANSIENT_CODES = new Set([
53
53
  'ENOTFOUND', 'UND_ERR_SOCKET', 'UND_ERR_CONNECT_TIMEOUT',
54
54
  'UND_ERR_HEADERS_TIMEOUT', 'UND_ERR_BODY_TIMEOUT',
55
55
  'TimeoutError', 'AbortError',
56
+ // ★ 아래 둘은 우리가 붙이는 표식이다. 벨로그가 **HTTP 200 으로** 502 HTML 이나
57
+ // 빈 본문을 주는 일이 실제로 있는데(아래 #requestOnce 주석), 그러면 JSON 파싱
58
+ // 오류가 되어 status 도 network code 도 없는 '영구 오류'로 분류됐다.
59
+ // 실측: 200+HTML 을 한 번 준 뒤 정상 JSON 을 줘도 재시도 없이 1회로 포기했다
60
+ // (같은 조건에서 HTTP 503 은 정상적으로 재시도됨 — 대조군 확인).
61
+ // 이건 상대 인프라의 일시 장애지 우리 질의의 문제가 아니다.
62
+ 'INVALID_JSON', 'EMPTY_RESPONSE',
56
63
  ]);
57
64
  export function isTransient(error) {
58
65
  if (!(error instanceof VelogApiError))
59
66
  return false;
67
+ // ★ 부분 성공은 무슨 일이 있어도 다시 치지 않는다. 이미 반영됐을 수 있다.
68
+ if (error.detail?.partial)
69
+ return false;
60
70
  const status = error.detail?.status;
61
71
  if (status !== undefined && status >= 500)
62
72
  return true;
@@ -71,6 +81,25 @@ export function isTransient(error) {
71
81
  return /connection pool|timed out|timeout|ETIMEDOUT|ECONNRESET|socket hang up/i.test(error.message);
72
82
  }
73
83
  const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
84
+ /**
85
+ * 재시도까지 포함한 **총** 예산.
86
+ *
87
+ * ★ 왜 상한이 필요한가 — 시도당 20초 × 3회 + 백오프 1.5초 = 61.5초다. 그런데
88
+ * MCP SDK 의 클라이언트측 기본 요청 타임아웃은 60초다
89
+ * (shared/protocol.js: DEFAULT_REQUEST_TIMEOUT_MSEC = 60000).
90
+ * 실측 61.6초 — **클라이언트가 항상 먼저 포기한다.** 즉 마지막 시도의 20초는
91
+ * 결과를 아무도 보지 못하는 순수 낭비였다. 기다린 사람만 손해다.
92
+ *
93
+ * 35초로 잡은 이유: 발행 계열 도구는 한 호출에서 `mutate`(무재시도 20초) 다음에
94
+ * 사후 재조회를 한 번 더 한다. 20 + 35 = 55초로 60초 안에 들어온다.
95
+ * 빠르게 실패하는 오류(ECONNRESET 등)에는 영향이 없다 — 세 번 다 그대로 돈다.
96
+ *
97
+ * ⚠️ 감수하는 것 — 첫 시도가 19초를 태우고 실패한 뒤 두 번째가 16초 걸려 성공할
98
+ * 경우, 예산이 남은 시간으로 잘라 그 성공을 놓친다. 실측 왕복이 1.3초대라
99
+ * 현실에서 보기 어려운 조합이고, 그걸 살리려고 예산을 늘리면 61.5초짜리
100
+ * '아무도 못 보는 기다림'이 돌아온다. 둘 중 하나는 포기해야 한다.
101
+ */
102
+ export const RETRY_BUDGET_MS = 35_000;
74
103
  /** 인증 만료 안내. HTTP 401 경로와 GraphQL errors 경로 둘 다에서 쓴다. */
75
104
  const AUTH_HINT = ' — access_token 이 만료됐을 수 있습니다(유효기간 1시간). 새 토큰으로 갱신하세요.';
76
105
  export class VelogClient {
@@ -80,7 +109,9 @@ export class VelogClient {
80
109
  #timeoutMs;
81
110
  #fetch;
82
111
  #maxRetries;
112
+ #retryBudgetMs;
83
113
  #sleep;
114
+ #now;
84
115
  #allowInsecureEndpoint;
85
116
  constructor(options) {
86
117
  this.#tokens = new TokenStore(options.auth);
@@ -89,7 +120,9 @@ export class VelogClient {
89
120
  this.#timeoutMs = options.timeoutMs ?? 20_000;
90
121
  this.#fetch = options.fetchImpl ?? fetch;
91
122
  this.#maxRetries = options.maxRetries ?? 2;
123
+ this.#retryBudgetMs = options.retryBudgetMs ?? RETRY_BUDGET_MS;
92
124
  this.#sleep = options.sleepImpl ?? defaultSleep;
125
+ this.#now = options.nowImpl ?? Date.now;
93
126
  this.#allowInsecureEndpoint = options.allowInsecureEndpoint ?? false;
94
127
  }
95
128
  get isAuthenticated() {
@@ -108,19 +141,39 @@ export class VelogClient {
108
141
  * 서버가 글을 만든 뒤 응답만 유실되면 재시도가 초안을 하나 더 만든다.
109
142
  * 그냥 중복이 아니라 실제 피해로 이어진다 — mutate() 주석 참고.
110
143
  */
111
- async request(query, variables = {}) {
144
+ async request(query, variables = {}, options = {}) {
145
+ // 예산은 '재시도까지 합쳐 여기까지'다. 시도마다 남은 만큼으로 잘라 준다.
146
+ const deadline = this.#now() + this.#retryBudgetMs;
147
+ // ★ `lastError` 를 좁히지 않으려고 플래그를 따로 둔다. `lastError ?? 기본값`
148
+ // 으로 쓰면 타입이 unknown 에서 벗어나 only-throw-error 에 걸린다.
112
149
  let lastError;
150
+ let failed = false;
113
151
  for (let attempt = 0; attempt <= this.#maxRetries; attempt++) {
152
+ options.signal?.throwIfAborted();
153
+ const left = deadline - this.#now();
154
+ if (left <= 0)
155
+ break;
114
156
  try {
115
- return await this.#requestOnce(query, variables);
157
+ return await this.#requestOnce(query, variables, {
158
+ signal: options.signal,
159
+ timeoutMs: Math.min(this.#timeoutMs, left),
160
+ });
116
161
  }
117
162
  catch (error) {
118
163
  lastError = error;
164
+ failed = true;
119
165
  if (!isTransient(error) || attempt === this.#maxRetries)
120
166
  throw error;
121
- await this.#sleep(500 * 2 ** attempt); // 500ms 1s
167
+ // 남은 예산보다 오래 자면 자고 일어나 아무것도 한다.
168
+ const backoff = 500 * 2 ** attempt; // 500ms → 1s
169
+ if (deadline - this.#now() <= backoff)
170
+ break;
171
+ await this.#sleep(backoff);
122
172
  }
123
173
  }
174
+ if (!failed) {
175
+ throw new VelogApiError(`벨로그가 ${this.#retryBudgetMs / 1000}초 안에 응답하지 않아 중단했습니다.`);
176
+ }
124
177
  throw lastError;
125
178
  }
126
179
  /**
@@ -142,8 +195,12 @@ export class VelogClient {
142
195
  * 비공개로 내려간다.** 응답 유실로 인한 자동 재시도가 이 한계를 앞당길 수 있어
143
196
  * 쓰기는 한 번만 친다. 실패하면 사용자가 상태를 확인하고 다시 부르게 한다.
144
197
  */
145
- async mutate(query, variables = {}) {
146
- return this.#requestOnce(query, variables);
198
+ async mutate(query, variables = {}, options = {}) {
199
+ options.signal?.throwIfAborted();
200
+ return this.#requestOnce(query, variables, {
201
+ signal: options.signal,
202
+ isMutation: true,
203
+ });
147
204
  }
148
205
  /**
149
206
  * 이미지 업로드. **재시도하지 않는다.**
@@ -159,6 +216,7 @@ export class VelogClient {
159
216
  * @returns 업로드된 이미지의 공개 URL (`https://velog.velcdn.com/...`)
160
217
  */
161
218
  async uploadImage(bytes, filename, options) {
219
+ options.signal?.throwIfAborted();
162
220
  const auth = this.#tokens.state;
163
221
  if (auth.kind !== 'authenticated')
164
222
  throw new AuthRequiredError('velog_upload_image');
@@ -185,7 +243,7 @@ export class VelogClient {
185
243
  headers,
186
244
  body: form,
187
245
  // 이미지는 GraphQL 질의보다 오래 걸린다. 최소 60초는 준다.
188
- signal: AbortSignal.timeout(Math.max(this.#timeoutMs, 60_000)),
246
+ signal: this.#abortSignal(Math.max(this.#timeoutMs, 60_000), options.signal),
189
247
  });
190
248
  }
191
249
  catch (cause) {
@@ -234,7 +292,16 @@ export class VelogClient {
234
292
  }
235
293
  return payload.path;
236
294
  }
237
- async #requestOnce(query, variables) {
295
+ /**
296
+ * 시간 상한과 취소 신호를 하나로 합친다.
297
+ *
298
+ * 둘 중 먼저 오는 쪽이 이긴다. 취소 신호가 없으면 예전과 똑같이 시간 상한만 건다.
299
+ */
300
+ #abortSignal(timeoutMs, signal) {
301
+ const timeout = AbortSignal.timeout(timeoutMs);
302
+ return signal ? AbortSignal.any([timeout, signal]) : timeout;
303
+ }
304
+ async #requestOnce(query, variables, options = {}) {
238
305
  const headers = {
239
306
  'Content-Type': 'application/json',
240
307
  Accept: 'application/json',
@@ -259,7 +326,7 @@ export class VelogClient {
259
326
  method: 'POST',
260
327
  headers,
261
328
  body: JSON.stringify({ query, variables }),
262
- signal: AbortSignal.timeout(this.#timeoutMs),
329
+ signal: this.#abortSignal(options.timeoutMs ?? this.#timeoutMs, options.signal),
263
330
  });
264
331
  }
265
332
  catch (cause) {
@@ -290,7 +357,9 @@ export class VelogClient {
290
357
  }
291
358
  catch (cause) {
292
359
  const reason = cause instanceof Error ? cause.message : String(cause);
293
- throw new VelogApiError(`벨로그 응답을 JSON 으로 읽지 못했습니다: ${this.#mask(reason)}`, { networkCodes: collectCauseCodes(cause) });
360
+ // INVALID_JSON 표식을 붙여 재시도 대상으로 만든다. 자리에 오는
361
+ // 대부분 우리 질의 문제가 아니라 상대가 200 으로 흘린 502 HTML 이다.
362
+ throw new VelogApiError(`벨로그 응답을 JSON 으로 읽지 못했습니다: ${this.#mask(reason)}`, { networkCodes: [...collectCauseCodes(cause), 'INVALID_JSON'] });
294
363
  }
295
364
  if (payload.errors?.length) {
296
365
  const messages = payload.errors
@@ -300,15 +369,55 @@ export class VelogClient {
300
369
  // 만료를 뭉뚱그리면 사용자가 원인을 못 찾는다. 별도로 짚어준다.
301
370
  const looksUnauthenticated = codes.includes('UNAUTHENTICATED') || /not logged|unauthor/i.test(messages);
302
371
  const hint = looksUnauthenticated ? AUTH_HINT : '';
372
+ // ★★ `data` 가 같이 왔으면 **부분 성공**이다 — 실패가 아니다.
373
+ // GraphQL 은 최상위 필드가 성공한 뒤 하위 resolver 만 깨져도 둘을 함께
374
+ // 돌려준다. 예전엔 errors 만 보고 무조건 던지면서 data 를 버렸다.
375
+ // 그러면 `writePost` 가 글을 만든 뒤 하위 필드가 깨졌을 때 사용자는
376
+ // '실패'로 보고 다시 부르고, 그 결과 **글이 두 번 만들어진다.**
377
+ // 무엇을 모르는지 그대로 알려줘야 사용자가 판단할 수 있다
378
+ // (uploadImage 의 '올라갔는지 알 수 없습니다' 와 같은 규율).
379
+ const created = firstId(payload.data);
380
+ // ★★ GraphQL 명세상 `data` 키의 **유무**가 실행 여부를 가른다.
381
+ // 키가 아예 없으면 질의가 실행 전에 거부된 것(파싱·검증 실패)이고,
382
+ // `data: null` 은 **실행이 시작된 뒤** non-null 필드 오류가 최상위까지
383
+ // 전파된 것이다. 쓰기에서 후자는 "서버가 이미 반영했는데 응답을 못
384
+ // 만든" 경우일 수 있다 — 벨로그 스키마상 writePost·editPost 는 `Post!`,
385
+ // `Post.id` 는 `ID!` 라 이 전파가 실제로 가능하다.
386
+ // 그걸 평범한 실패로 보고하면 사용자가 다시 불러 글이 두 번 생긴다.
387
+ // (코덱스 3차 교차검증 지적)
388
+ const executed = Object.hasOwn(payload, 'data');
389
+ // ★ '`data` 가 있다'만으로 부분 성공이라 하면 안 된다. GraphQL 은 resolver
390
+ // 가 깨지면 `{ data: { post: null }, errors: [...] }` 를 준다 — 이건
391
+ // 아무것도 반영되지 않은 **완전 실패**다. 그걸 partial 로 찍으면
392
+ // 재시도가 막히는데, 벨로그의 커넥션 풀 고갈이 정확히 이 모양으로 온다.
393
+ // (코덱스 교차검증에서 잡았다: 재시도 가능하던 읽기가 1회로 죽었다.)
394
+ // 그래서 **값이 하나라도 실제로 들어있을 때만** 부분 성공으로 본다.
395
+ const partial = hasAnyValue(payload.data);
396
+ const unknownOutcome = partial || (options.isMutation === true && executed);
397
+ const partialWarning = unknownOutcome
398
+ ? '\n⚠️ 요청이 **이미 반영됐을 수** 있습니다' +
399
+ (partial
400
+ ? ' (서버가 결과 데이터를 함께 돌려줬습니다).'
401
+ : ' (서버가 실행을 시작한 뒤 응답을 만들지 못했습니다).') +
402
+ ' 다시 시도하면 두 번 적용될 수 있으니 벨로그에서 확인한 뒤 결정하세요.' +
403
+ (created ? ` (id=${created})` : '')
404
+ : '';
303
405
  // ★ 원본 payload.errors 를 그대로 담으면 토큰이 Error 객체에 남는다.
304
406
  // 지금은 MCP SDK 가 message 만 내보내지만, 나중에 console.error(error)
305
407
  // 나 오류 수집기를 붙이는 순간 샌다. 코드만 보관한다.
306
- throw new VelogApiError(`벨로그 GraphQL 오류: ${this.#mask(messages)}${hint}`, {
408
+ throw new VelogApiError(`벨로그 GraphQL 오류: ${this.#mask(messages)}${hint}${partialWarning}`, {
307
409
  graphqlErrorCodes: codes.filter((c) => typeof c === 'string'),
410
+ // partial 은 '값이 실제로 왔다' 는 뜻이고, 이게 붙으면 재시도가 막힌다.
411
+ // 쓰기의 결과 불명은 어차피 mutate 가 재시도하지 않으므로 표식을
412
+ // 넓히지 않는다 — 읽기의 정당한 재시도까지 막을 이유가 없다.
413
+ ...(partial ? { partial: true } : {}),
308
414
  });
309
415
  }
310
416
  if (payload.data === undefined || payload.data === null) {
311
- throw new VelogApiError('벨로그가 응답을 반환했습니다.');
417
+ // 200 도 상대 인프라의 일시 장애다 (JSON 파싱 실패와 같은 성격).
418
+ throw new VelogApiError('벨로그가 빈 응답을 반환했습니다.', {
419
+ networkCodes: ['EMPTY_RESPONSE'],
420
+ });
312
421
  }
313
422
  return payload.data;
314
423
  }
@@ -319,4 +428,29 @@ export class VelogClient {
319
428
  function truncate(text, max) {
320
429
  return text.length <= max ? text : `${text.slice(0, max)}…`;
321
430
  }
431
+ /**
432
+ * 부분 성공 응답에서 '만들어졌거나 바뀐 것'의 id 를 한 개 찾는다.
433
+ *
434
+ * GraphQL 응답은 `{ writePost: { id } }` 처럼 최상위에 mutation 이름이 오고 그
435
+ * 아래 결과가 온다. 사용자가 벨로그에서 확인하려면 id 하나가 필요하다.
436
+ * 못 찾으면 그냥 없이 안내한다 — 없는 걸 지어내지 않는다.
437
+ */
438
+ /** 최상위 필드 중 실제로 값이 담긴 게 하나라도 있는가. */
439
+ function hasAnyValue(data) {
440
+ if (typeof data !== 'object' || data === null)
441
+ return false;
442
+ return Object.values(data).some((v) => v !== null && v !== undefined);
443
+ }
444
+ function firstId(data) {
445
+ if (typeof data !== 'object' || data === null)
446
+ return undefined;
447
+ for (const value of Object.values(data)) {
448
+ if (typeof value !== 'object' || value === null)
449
+ continue;
450
+ const id = value.id;
451
+ if (typeof id === 'string' && id !== '')
452
+ return id;
453
+ }
454
+ return undefined;
455
+ }
322
456
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
10
10
  import { type Capabilities } from './capabilities.ts';
11
11
  import { VelogClient } from './client.ts';
12
12
  export declare const SERVER_NAME = "velog-mcp";
13
- export declare const SERVER_VERSION = "0.4.0";
13
+ export declare const SERVER_VERSION = "0.4.2";
14
14
  export declare function createServer(client: VelogClient, capabilities?: Capabilities): McpServer;
15
15
  /**
16
16
  * 크롬이 있어야만 되는 도구들.
package/dist/index.js CHANGED
@@ -28,7 +28,7 @@ import { registerImageTools } from "./tools/images.js";
28
28
  export const SERVER_NAME = 'velog-mcp';
29
29
  // ⚠️ 이 값은 네 곳이 함께 움직인다 — package.json / plugin.json / .mcp.json 의
30
30
  // npx 핀 / 여기. 어긋나면 P8 테스트가 잡는다. 손으로 맞추지 말고 테스트를 믿을 것.
31
- export const SERVER_VERSION = '0.4.0';
31
+ export const SERVER_VERSION = '0.4.2';
32
32
  export function createServer(client, capabilities = { publicPublish: false, editProfile: false }) {
33
33
  const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION }, {
34
34
  instructions: [
package/dist/me.d.ts CHANGED
@@ -16,8 +16,8 @@ export interface CurrentUser {
16
16
  short_bio?: string | null;
17
17
  } | null;
18
18
  }
19
- export declare function fetchCurrentUser(client: VelogClient): Promise<CurrentUser>;
19
+ export declare function fetchCurrentUser(client: VelogClient, signal?: AbortSignal): Promise<CurrentUser>;
20
20
  /** username 을 생략한 도구들이 쓴다. */
21
- export declare function resolveMyUsername(client: VelogClient): Promise<string>;
21
+ export declare function resolveMyUsername(client: VelogClient, signal?: AbortSignal): Promise<string>;
22
22
  /** 프로필을 바꾼 뒤 캐시를 비운다. 테스트에서도 쓴다. */
23
23
  export declare function invalidateMe(client: VelogClient): void;