@milcho0604/velog-mcp 0.6.0 → 0.7.0
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/CHANGELOG.md +138 -0
- package/README.ko.md +8 -6
- package/README.md +8 -6
- package/dist/client.d.ts +4 -3
- package/dist/client.js +4 -3
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/render/index.d.ts +3 -0
- package/dist/render/index.js +5 -0
- package/dist/render/index.js.map +1 -1
- package/dist/render/sequence.d.ts +93 -0
- package/dist/render/sequence.js +946 -0
- package/dist/render/sequence.js.map +1 -0
- package/dist/tools/drafts.d.ts +1 -1
- package/dist/tools/drafts.js +1 -1
- package/dist/tools/images.js +111 -1
- package/dist/tools/images.js.map +1 -1
- package/dist/tools/publish.js +2 -2
- package/dist/tools/publish.js.map +1 -1
- package/docs/PRD.md +6 -1
- package/docs/architecture.md +1 -1
- package/docs/decisions/0001-why-build-our-own.md +6 -1
- package/docs/decisions/0004-capability-model.md +5 -0
- package/docs/security.md +12 -6
- package/docs/tools.md +102 -16
- package/npm-shrinkwrap.json +2 -2
- package/package.json +8 -4
package/docs/tools.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# 도구 카탈로그
|
|
2
2
|
|
|
3
|
-
기본
|
|
3
|
+
기본 22개 + 프로필 수정 5개(설정 시).
|
|
4
4
|
|
|
5
5
|
```
|
|
6
|
-
기본 (설정 없음) 읽기 + 초안 + 비공개 발행 + 그림 도구
|
|
6
|
+
기본 (설정 없음) 읽기 + 초안 + 비공개 발행 + 그림 도구 22개
|
|
7
7
|
VELOG_ALLOW_PUBLIC=1 공개 발행 (파라미터만 추가)
|
|
8
8
|
VELOG_ALLOW_PROFILE=1 프로필·소개글·블로그제목·SNS·사진 도구 5개 추가
|
|
9
9
|
```
|
|
@@ -33,7 +33,8 @@ VELOG_ALLOW_PROFILE=1 프로필·소개글·블로그제목·SNS·사진 도
|
|
|
33
33
|
| `velog_publish_draft` | **필요** | **쓰기 — 초안을 발행** (`destructive`) |
|
|
34
34
|
| `velog_unpublish_post` | **필요** | **쓰기 — 초안으로 되돌림** (`destructive`) |
|
|
35
35
|
| `velog_update_post` | **필요** | **쓰기 — 발행글 수정** |
|
|
36
|
-
| `velog_render_diagram` | 올릴 때만 |
|
|
36
|
+
| `velog_render_diagram` | 올릴 때만 | 구성도·흐름도 생성 (+ 업로드) |
|
|
37
|
+
| `velog_render_sequence` | 올릴 때만 | 시퀀스 다이어그램 생성 (+ 업로드) |
|
|
37
38
|
| `velog_render_cover` | 올릴 때만 | 표지 생성 (+ 업로드) |
|
|
38
39
|
| `velog_upload_image` | **필요** | **쓰기 — 공개 CDN 업로드** |
|
|
39
40
|
|
|
@@ -139,16 +140,19 @@ views: 16323
|
|
|
139
140
|
|
|
140
141
|
---
|
|
141
142
|
|
|
142
|
-
## 쓰기 —
|
|
143
|
+
## 쓰기 — 초안과 비공개가 기본
|
|
143
144
|
|
|
144
|
-
>
|
|
145
|
-
>
|
|
145
|
+
> **공개 발행은 사용자만 켤 수 있다.** 기본 설정에서 이 서버가 낼 수 있는 것은
|
|
146
|
+
> 초안과 **비공개 발행**까지다. 공개로 내보내려면 `VELOG_ALLOW_PUBLIC=1` 이 필요하고,
|
|
147
|
+
> 모델은 그 스위치를 만질 수 없다. → [ADR 0004](decisions/0004-capability-model.md)
|
|
146
148
|
|
|
147
149
|
### `velog_create_draft`
|
|
148
150
|
|
|
149
|
-
>
|
|
150
|
-
>
|
|
151
|
-
>
|
|
151
|
+
> **초안에는 우리 상한이 없다.** 벨로그의 발행 제한은 `is_private:false` 인 글만
|
|
152
|
+
> 세는데 초안은 `is_private:true` 라 계수를 올리지 않는다. 상한은 공개 발행 쪽에 있다.
|
|
153
|
+
> ⚠️ 다만 벨로그의 검사는 공개 여부를 보기 전에 돌아서, 이미 공개 글이 쌓여 있으면
|
|
154
|
+
> 초안 요청도 벨로그 쪽 조치를 촉발할 수 있다. 이 경로에는 우리 카운터가 없어
|
|
155
|
+
> 해제 시각을 계산해 주지 못한다 — 그 안내는 공개 발행 경로에만 있다.
|
|
152
156
|
|
|
153
157
|
| 파라미터 | 필수 | 설명 |
|
|
154
158
|
| --- | --- | --- |
|
|
@@ -176,9 +180,9 @@ views: 16323
|
|
|
176
180
|
그래서 `velog_get_post` 로 현재 값을 읽어 바꾸지 않을 필드도 그대로 다시
|
|
177
181
|
넘기는 편이 안전하다. `destructiveHint: true` 로 표시돼 있다.
|
|
178
182
|
|
|
179
|
-
> ⚠️ **이미 발행된 글의 `id`
|
|
180
|
-
>
|
|
181
|
-
>
|
|
183
|
+
> ⚠️ **이미 발행된 글의 `id` 는 거부한다.** `editPost` 가 상태를 덮어써서 그 글이
|
|
184
|
+
> 임시저장으로 내려가기 때문에, 저장 전에 `is_temp` 를 확인하고 중단한다.
|
|
185
|
+
> 발행된 글은 `velog_update_post` 로 고칠 것.
|
|
182
186
|
|
|
183
187
|
### `velog_list_drafts`
|
|
184
188
|
내 임시저장 목록. 위 두 도구에 넣을 `id` 를 여기서 얻는다.
|
|
@@ -231,9 +235,10 @@ velog_publish_draft(id, is_private?)
|
|
|
231
235
|
비공개로 내려가는* 버그를 냈다. '만들 때'는 안전한 쪽이 기본이고, '고칠 때'는
|
|
232
236
|
**건드리지 않는 것**이 기본이다.
|
|
233
237
|
|
|
234
|
-
> 기본 설정(공개 발행 꺼짐)
|
|
235
|
-
>
|
|
236
|
-
>
|
|
238
|
+
> 기본 설정(공개 발행 꺼짐)에서는 **공개 범위를 바꿀 수단이 없다.** 공개 글은
|
|
239
|
+
> 공개로, 비공개 글은 비공개로 그대로 남는다. 게이트가 막는 것은 '안 보이던 글을
|
|
240
|
+
> 내보내는 것'이지 '이미 공개된 글을 내리는 것'이 아니다 — 후자는 발행이 아니라
|
|
241
|
+
> 되돌리기 어려운 파괴적 변경이다. 범위를 바꾸려면 `VELOG_ALLOW_PUBLIC=1` 을 켤 것.
|
|
237
242
|
|
|
238
243
|
---
|
|
239
244
|
|
|
@@ -276,7 +281,7 @@ RSS·메일로 나가지도 않는다. 이유는 **혼동**이다: 프로필의
|
|
|
276
281
|
|
|
277
282
|
---
|
|
278
283
|
|
|
279
|
-
## 그림 도구
|
|
284
|
+
## 그림 도구 4종
|
|
280
285
|
|
|
281
286
|
### `velog_render_diagram`
|
|
282
287
|
|
|
@@ -347,6 +352,87 @@ terminal network mail search retry bolt
|
|
|
347
352
|
그림마다 톤이 달라지는 걸 막는 것과, 값이 결국 SVG 속성이 되므로 입력을 좁히는 것.
|
|
348
353
|
평면(`planes`) 색만 `#rrggbb` 로 직접 지정할 수 있다.
|
|
349
354
|
|
|
355
|
+
### `velog_render_sequence`
|
|
356
|
+
|
|
357
|
+
시퀀스 다이어그램. **좌표를 받지 않는다** — 참가자와 순서 있는 메시지만 준다.
|
|
358
|
+
|
|
359
|
+
```
|
|
360
|
+
넘기는 것 participants(이름, 부제, 아이콘, 배지) / messages(from, to, kind, label) / fragments
|
|
361
|
+
정해지는 것 열 간격, 행 높이, 라벨 줄바꿈, 활성 막대, 묶음 상자, 캔버스 크기
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
왜 `velog_render_diagram` 과 나눴나. 구성도는 좌표가 자유롭지만 시퀀스는 열이 참가자,
|
|
365
|
+
행이 시간이라 좌표에 의미가 있다. 같은 도구에 얹으면 메시지 하나를 끼워 넣을 때마다
|
|
366
|
+
그 아래 y 를 전부 다시 계산해야 한다. 기존 도구로 실제로 그려보고 확인한 것이다.
|
|
367
|
+
|
|
368
|
+
- **메시지 배열 순서가 곧 시간 순서다.** 중간에 끼워 넣으면 아래가 알아서 밀린다.
|
|
369
|
+
- **글자를 줄이지 않고 자리를 넓힌다.** 라벨이 두 열 사이에 안 들어가면 그 구간의
|
|
370
|
+
열 간격을 늘리고, 길면 접고, 접힌 만큼 그 행을 높인다. 한글처럼 띄어쓰기가 없는
|
|
371
|
+
긴 토큰은 글자 단위로 접는다.
|
|
372
|
+
- **활성 막대는 자동이다.** `call` 이 열고 `return` 이 닫는다. 안 닫힌 것은 그
|
|
373
|
+
참가자가 마지막으로 관여한 지점까지 끈다. 겹치면 안쪽으로 계단이 진다.
|
|
374
|
+
- **생명선에는 화살촉이 없다.** 이 도구를 따로 만든 이유 중 하나다 —
|
|
375
|
+
`velog_render_diagram` 은 모든 선에 화살촉을 무조건 붙인다.
|
|
376
|
+
|
|
377
|
+
#### 메시지 종류 4종
|
|
378
|
+
|
|
379
|
+
| `kind` | 생김새 | 쓰임 |
|
|
380
|
+
| --- | --- | --- |
|
|
381
|
+
| `call` (기본) | 실선 + 채운 화살촉 | 동기 호출. 활성 막대를 연다 |
|
|
382
|
+
| `async` | 실선 + 열린 화살촉 | 비동기 발행 |
|
|
383
|
+
| `return` | 점선 + 열린 화살촉 | 응답. 활성 막대를 닫는다 |
|
|
384
|
+
| `note` | 노란 상자 | 선이 아니라 설명. 순서 안에 끼워 넣는다 |
|
|
385
|
+
|
|
386
|
+
`from` 과 `to` 가 같으면 자기호출이 되어 오른쪽으로 고리를 그린다.
|
|
387
|
+
`note` 는 `to` 를 생략하면 그 열 오른쪽에 붙고, 주면 두 열 사이에 걸친다.
|
|
388
|
+
|
|
389
|
+
#### 묶음 상자 (`fragments`)
|
|
390
|
+
|
|
391
|
+
`alt` `opt` `loop` `par` 같은 상자를 **메시지 번호 범위**(0부터, 양끝 포함)로 지정한다.
|
|
392
|
+
상자는 전체 열이 아니라 **그 메시지들이 실제로 닿는 범위**만 감싼다.
|
|
393
|
+
|
|
394
|
+
서로 어긋나게 겹치면 **그리기 전에 막는다.** 상자 둘이 서로를 반씩 물면 어느 쪽을
|
|
395
|
+
안쪽에 그려도 한쪽이 제 메시지를 못 감싸기 때문이다. 완전히 포개거나 완전히 떨어져야 한다.
|
|
396
|
+
|
|
397
|
+
#### 자가감사 5종
|
|
398
|
+
|
|
399
|
+
| 항목 | 무엇을 잡나 | 어떤 계산이 틀렸다는 뜻인가 |
|
|
400
|
+
| --- | --- | --- |
|
|
401
|
+
| `over` | 글자가 카드, 노트, 칩, 묶음 상자 밖으로 나감 | 자동 폭 계산 |
|
|
402
|
+
| `collide` | 카드끼리, 활성막대끼리, 노트가 남의 생명선을 덮음, 배지가 이름을 덮음 | 열 간격과 카드 폭 |
|
|
403
|
+
| `label` | 라벨끼리 겹침, 라벨이 제 구간이나 제 행을 벗어남 | 열 간격과 행 높이 |
|
|
404
|
+
| `cross` | 화살표가 카드나 노트를 관통 | 활성막대 오프셋 |
|
|
405
|
+
| `frame` | 묶음 상자가 제 메시지를 다 못 감쌈 | 상자 범위 |
|
|
406
|
+
|
|
407
|
+
★ 오른쪽 칸이 핵심이다. 이 감사는 **좌표를 준 사람이 실수했는지**가 아니라
|
|
408
|
+
**렌더러의 배치 계산이 틀렸는지**를 본다. 그래서 통과가 곧 좋은 그림이라는 뜻은 아니다 —
|
|
409
|
+
기하만 본다. 실제로 칩이 활성 막대에 가려진 결함은 감사를 통과했고 눈으로 잡았다.
|
|
410
|
+
|
|
411
|
+
검출력은 변이시험으로 증명한다(`render.test.ts` S4). 배치 계산을 한 갈래씩 망가뜨려
|
|
412
|
+
각각 **다른 항목**이 걸리는 것을 확인하고, 표본 네 개의 대조군이 통과하는 것까지 같이 본다.
|
|
413
|
+
지금 여덟 갈래다.
|
|
414
|
+
|
|
415
|
+
처음 이 시험을 돌렸을 때 두 갈래가 통과했다 — **재는 항목이 없어서** 안 걸린 것이었고,
|
|
416
|
+
그때 `label` 의 '제 구간과 제 행' 검사를 뒤늦게 넣었다. 뒤이어 험한 입력을 돌려보다
|
|
417
|
+
세 갈래가 더 나왔다. 이모지는 같은 `font-size` 라도 글리프가 높아서 줄높이를 상수로
|
|
418
|
+
두면 **같은 라벨의 두 줄이 물린다.** 배지만 있고 아이콘이 없는 카드는 제목이 배지와
|
|
419
|
+
같은 높이로 올라와 **배지가 이름을 덮는다.** 조건이 상자보다 길면 글자가 상자 밖으로 나간다.
|
|
420
|
+
셋 다 고치고 변이로 남겼다.
|
|
421
|
+
|
|
422
|
+
#### 입력 상한
|
|
423
|
+
|
|
424
|
+
| 항목 | 상한 |
|
|
425
|
+
| --- | --- |
|
|
426
|
+
| 참가자 12, 메시지 200, 묶음 상자 12 | 개수 |
|
|
427
|
+
| 캔버스 | 6,000px, 면적 900만px — **페이지 안에서** 걸린다 |
|
|
428
|
+
| 제목 200, 부제 300, 참가자 이름과 부제 80, 배지 40, id 64 | 글자 |
|
|
429
|
+
| 메시지 라벨 200, 상자 종류 16, 상자 라벨 120 | 글자 |
|
|
430
|
+
|
|
431
|
+
메시지 라벨에 상한이 필요한 이유가 이 도구에서는 특히 분명하다 — 글자를 줄이는 대신
|
|
432
|
+
자리를 넓히므로 **라벨 길이가 그대로 캔버스 크기가 된다.**
|
|
433
|
+
|
|
434
|
+
아이콘과 톤은 `velog_render_diagram` 과 같다.
|
|
435
|
+
|
|
350
436
|
### `velog_render_cover`
|
|
351
437
|
|
|
352
438
|
글 목록·SNS 미리보기용 1200×630 카드. 제목이 길면 줄바꿈하고, 3줄에도 안 들어가면
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milcho0604/velog-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@milcho0604/velog-mcp",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.7.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milcho0604/velog-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
3
|
+
"version": "0.7.0",
|
|
4
|
+
"mcpName": "io.github.milcho0604/velog",
|
|
5
|
+
"description": "벨로그(velog.io) MCP 서버 — 조회·검색·통계는 인증 없이 동작하고, 쓰기는 초안과 비공개 발행이 기본이다. 공개 발행은 VELOG_ALLOW_PUBLIC=1 로 사용자만 켤 수 있다. 문서 없는 벨로그 GraphQL 동작을 실측해 정리했다. 런타임 의존성 2개, Node 22.18+",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "./dist/index.js",
|
|
7
8
|
"bin": {
|
|
@@ -11,10 +12,13 @@
|
|
|
11
12
|
"dist",
|
|
12
13
|
"docs",
|
|
13
14
|
"README.md",
|
|
15
|
+
"CHANGELOG.md",
|
|
14
16
|
"LICENSE",
|
|
15
17
|
"npm-shrinkwrap.json"
|
|
16
18
|
],
|
|
17
|
-
"engines": {
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=22.18.0"
|
|
21
|
+
},
|
|
18
22
|
"scripts": {
|
|
19
23
|
"prebuild": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
20
24
|
"build": "tsc -p tsconfig.build.json",
|
|
@@ -27,7 +31,7 @@
|
|
|
27
31
|
"lint": "eslint .",
|
|
28
32
|
"lint:fix": "eslint . --fix",
|
|
29
33
|
"verify": "npm run typecheck && npm run lint && npm test && npm run build && npm run verify:dist",
|
|
30
|
-
"prepublishOnly": "npm run
|
|
34
|
+
"prepublishOnly": "npm run verify"
|
|
31
35
|
},
|
|
32
36
|
"dependencies": {
|
|
33
37
|
"@modelcontextprotocol/sdk": "^1.30.0",
|