@brxce/mcp-server 1.1.15 → 1.1.17

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.
@@ -0,0 +1,274 @@
1
+ # BRXCE MCP Error Recovery
2
+
3
+ HTTP 코드 / 에러 메시지별 진단 + 복구 절차.
4
+
5
+ ---
6
+
7
+ ## HTTP Status Codes
8
+
9
+ ### 401 Unauthorized
10
+
11
+ **에러 형태**:
12
+ ```
13
+ API request failed: 401 Unauthorized
14
+ Response: {"success":false,"error":{"code":"UNAUTHORIZED","message":"User not authenticated"}}
15
+ ```
16
+
17
+ **원인**:
18
+ - MCP 서버에 로드된 `BRXCE_API_TOKEN` 만료
19
+ - 토큰 자체가 잘못됨
20
+ - 1.1.13 이하에서 동시 refresh race condition (자체 fix됨)
21
+
22
+ **복구**:
23
+ 1. 새 토큰 발급 (BRXCE 웹앱 settings)
24
+ 2. `~/.brxce/config` 또는 환경변수 `BRXCE_API_TOKEN` 갱신
25
+ 3. **MCP 서버 재시작 필수** — 토큰은 startup 시 로드됨
26
+ - Claude Code: 세션 종료 → 재시작
27
+ - OpenClaw: `openclaw gateway restart`
28
+
29
+ ---
30
+
31
+ ### 403 Forbidden
32
+
33
+ **에러 형태**:
34
+ ```
35
+ {"code":"FORBIDDEN","message":"No access to workspace ..."}
36
+ ```
37
+
38
+ **원인**:
39
+ - 다른 사용자의 워크스페이스 ID를 사용
40
+ - workspaceId가 본인 owner가 아님 (#1021 이후 워크스페이스 = 1:1 personal)
41
+ - permanent_delete를 owner가 아닌 사용자가 시도
42
+
43
+ **복구**:
44
+ 1. `brxce_list_workspaces` → 본인 owner 워크스페이스 확인
45
+ 2. workspaceId 정정
46
+ 3. 회의/노트의 경우: 대상 회의의 워크스페이스 owner인지 확인
47
+
48
+ ---
49
+
50
+ ### 404 Not Found
51
+
52
+ **두 가지 원인 분리 필요**:
53
+
54
+ #### A. 리소스 자체가 없음
55
+ ```
56
+ {"code":"NOT_FOUND","message":"WorkNode <uuid> not found or already deleted"}
57
+ ```
58
+
59
+ **원인**:
60
+ - UUID 오타
61
+ - 이미 hard delete됨
62
+ - soft delete된 항목을 다시 delete (1.1.13+에서 idempotent — 이젠 정상 404 반환)
63
+
64
+ **복구**: ID 재확인 또는 무시 (idempotent라면 의도된 동작).
65
+
66
+ #### B. 라우트 자체가 미구현 (백엔드 버그)
67
+ ```
68
+ {"message":"Route POST:/api/v1/mcp/... not found","statusCode":404}
69
+ ```
70
+
71
+ **원인**: MCP 툴은 호출하지만 백엔드에 그 라우트가 없음. 1.1.16 이전 공통 패턴.
72
+
73
+ **복구**:
74
+ 1. MCP 서버 버전 확인 (`npm list -g @brxce/mcp-server`)
75
+ 2. < 1.1.16 → 업데이트: `npm install -g @brxce/mcp-server@latest`
76
+ 3. backend 미배포 가능성 → main 배포 상태 확인
77
+
78
+ 영향 받았던 라우트 (모두 1.1.16+에서 fix):
79
+ - `POST /mcp/worknodes/filter`
80
+ - `POST/GET/PUT/DELETE /mcp/meetings/:id/agenda/:itemId/notes`
81
+ - `DELETE /mcp/notifications/:id`
82
+ - `PUT /mcp/notifications/read-all`
83
+ - `DELETE /mcp/worknodes/:id/permanent`
84
+
85
+ ---
86
+
87
+ ### 400 Bad Request
88
+
89
+ **원인 패턴**:
90
+
91
+ #### A. Validation 실패
92
+ ```
93
+ {"code":"VALIDATION_ERROR","message":"body/workspaceId must match format \"uuid\""}
94
+ ```
95
+
96
+ **복구**: 파라미터 형태 확인. 특히:
97
+ - workspaceId는 UUID 문자열 (`null` 금지)
98
+ - dueDate/scheduledAt은 ISO 8601 with timezone
99
+
100
+ #### B. AC enforcement
101
+ ```
102
+ {"code":"BAD_REQUEST","message":"task requires at least 1 acceptance criteria..."}
103
+ ```
104
+
105
+ **복구**: `acceptance_criteria: [{ title: "..." }]` 추가, 또는 `nodeType: "note"`로 변경.
106
+
107
+ #### C. Confirmation 누락
108
+ ```
109
+ {"code":"VALIDATION_ERROR","message":"confirmation must be exactly \"PERMANENTLY DELETE\""}
110
+ ```
111
+
112
+ **복구**: `permanent_delete_worknode`는 `confirm: true` 필수.
113
+
114
+ #### D. Evidence 누락
115
+ ```
116
+ {"message":"Evidence is required to complete boolean acceptance criteria \"...\""}
117
+ ```
118
+
119
+ **복구**: `update_criteria`로 isCompleted=true 시 `currentValue` 또는 `evidenceUrl` 함께 전달.
120
+
121
+ ---
122
+
123
+ ### 410 Gone (사용 중단된 기능)
124
+
125
+ **에러 형태**:
126
+ ```
127
+ {"code":"GONE","message":"Workspace invitations have been removed..."}
128
+ {"code":"GONE","message":"Workspace member management has been removed..."}
129
+ ```
130
+
131
+ **원인**: #1021 (워크스페이스 = personal model 전환)으로 폐기. invitation, workspace_member, bot 계열 전체 폐기.
132
+
133
+ **복구**: 사용 중단. 1.1.11+ 이후 MCP 툴 자체도 제거됨. 만약 1.1.10 이하에서 보인다면 업데이트.
134
+
135
+ ---
136
+
137
+ ### 500 Internal Server Error
138
+
139
+ **에러 형태별 분기**:
140
+
141
+ #### A. Prisma raw query 에러
142
+ ```
143
+ Raw query failed. Code: `42P01`. Message: `relation "..." does not exist`
144
+ Raw query failed. Code: `42703`. Message: `column "..." does not exist`
145
+ Raw query failed. Code: `42883`. Message: `operator does not exist: uuid = text`
146
+ ```
147
+
148
+ **원인**: 백엔드 raw SQL 버그. global_overview, tag_changes 등에서 발생.
149
+
150
+ **복구**: 1.1.16+에서 모두 fix됨. 그 미만 버전이면 업데이트.
151
+
152
+ #### B. Prisma other
153
+ ```
154
+ Invalid `prisma.$queryRaw()` invocation
155
+ ```
156
+
157
+ **원인**: 다양. 새 버그 가능성.
158
+
159
+ **복구**: 재시도 → 영구적이면 GitHub issue 등록 (스택트레이스 + nodeId 포함).
160
+
161
+ #### C. 일반 INTERNAL_ERROR
162
+ ```
163
+ {"code":"INTERNAL_ERROR","message":"<some message>"}
164
+ ```
165
+
166
+ **복구**: 메시지 분석. service 레이어 throw일 가능성. 재시도 후 영구면 보고.
167
+
168
+ ---
169
+
170
+ ## MCP 클라이언트 에러 (서버 도달 전)
171
+
172
+ ### "Network error when calling ...: Server error"
173
+
174
+ **원인**: 1.1.13 미만 api-client가 5xx를 "Server error"로 wrap하고 outer catch가 다시 "Network error"로 감쌌음. 실제로는 backend 5xx.
175
+
176
+ **복구**: 1.1.13+로 업데이트. 1.1.13+부터는 5xx도 "API request failed: 500" 형태로 그대로 노출.
177
+
178
+ ### "API request failed: 500" (구조화된 에러)
179
+
180
+ **원인**: 백엔드 5xx. 위 #500 섹션 참고.
181
+
182
+ **복구**: 1.1.13+에서 정상 패턴.
183
+
184
+ ### `Cannot read properties of undefined (reading 'length')` 또는 `(reading 'name')`
185
+
186
+ **원인**: 1.1.10 ~ 1.1.13 시기 search_users / worknode_detail 응답 파싱 버그.
187
+
188
+ **복구**: 1.1.14+로 업데이트.
189
+
190
+ ### MCP error -32602: Invalid arguments
191
+
192
+ **원인**: Zod schema validation 실패. 보통 내가 잘못 호출함.
193
+
194
+ **복구**: 에러 메시지의 `path` 확인 → 해당 필드 형식 점검.
195
+
196
+ ### `Found 0 WorkNodes`
197
+
198
+ **원인**: UUID를 `query` 필드로 보냈을 가능성 (footguns.md 참고).
199
+
200
+ **복구**: `worknodeIds` 또는 `nodeIds` 필드로 전환.
201
+
202
+ ---
203
+
204
+ ## Cache / Stale 데이터
205
+
206
+ ### 삭제했는데 inbox에 그대로
207
+
208
+ **원인**: 1.1.16 이전 cache invalidation 미발행.
209
+
210
+ **복구**:
211
+ - 1.1.16+로 업데이트 (가장 좋은 방법)
212
+ - 또는 새 노드 1개 만들고 다시 삭제해서 cache update를 강제 트리거
213
+ - 또는 노드를 직접 read해서 진짜 존재 확인 (`Found 0`이면 실제 삭제됨, inbox만 stale)
214
+
215
+ ### 새로 만든 태그가 list_tags에 안 보임
216
+
217
+ **원인**: 태그 생성 캐시 invalidation 누락 가능성 (확인 안 됨).
218
+
219
+ **복구**: 한 번 더 호출 또는 `search_tags`로 직접 검색.
220
+
221
+ ---
222
+
223
+ ## Token / Context 폭발
224
+
225
+ ### 응답이 token limit 초과
226
+ ```
227
+ Error: result (888,501 characters) exceeds maximum allowed tokens
228
+ ```
229
+
230
+ **원인 후보**:
231
+ - `workspace_delta(sinceVersion: 0)` — 첫 sync → `maxChanges` 설정
232
+ - `read_worknodes` 무필터 → `query`/`limit`/필터 추가
233
+ - `worknodes_by_member`로 1500+ 노드 반환 → status 필터 또는 `limit`
234
+
235
+ **복구**: 항상 페이지네이션 + 필터링 사용. 1회 호출로 모든 데이터를 가져오려 하지 말 것.
236
+
237
+ ---
238
+
239
+ ## 진단 명령
240
+
241
+ 빠르게 어디서 막힌 건지 파악하고 싶을 때:
242
+
243
+ ```bash
244
+ # MCP 서버 버전
245
+ npm list -g @brxce/mcp-server
246
+
247
+ # Backend 라이브 체크
248
+ curl -sS -o /dev/null -w "%{http_code}\n" \
249
+ https://brxce-backend-production-1013529945435.asia-northeast3.run.app/api/v1/mcp/status
250
+
251
+ # 401이면 토큰 환경변수 확인
252
+ echo $BRXCE_API_TOKEN | head -c 20
253
+ ```
254
+
255
+ ---
256
+
257
+ ## 에러 → 액션 빠른 표
258
+
259
+ | 에러 | 1순위 액션 |
260
+ |------|----------|
261
+ | 401 | 토큰 갱신 + MCP 서버 재시작 |
262
+ | 403 | 본인 워크스페이스 확인 |
263
+ | 404 (not found) | UUID 정정 / idempotent면 무시 |
264
+ | 404 (route not found) | MCP 서버 1.1.16+ 업데이트 |
265
+ | 400 (uuid format) | workspaceId 형태 점검 |
266
+ | 400 (AC required) | acceptance_criteria 추가 또는 note 사용 |
267
+ | 400 (confirmation) | `confirm: true` 추가 |
268
+ | 400 (evidence) | currentValue/evidenceUrl 추가 |
269
+ | 410 | 해당 기능 폐기됨, 사용 중단 |
270
+ | 500 (Prisma raw) | 1.1.16+ 업데이트 |
271
+ | Found 0 WorkNodes | nodeIds로 전환 |
272
+ | Cannot read properties of undefined | 1.1.14+ 업데이트 |
273
+ | Network error: Server error | 1.1.13+ 업데이트 |
274
+ | 토큰 폭발 | 페이지/필터 추가 |
@@ -0,0 +1,277 @@
1
+ # BRXCE MCP Footguns
2
+
3
+ 이번 안정화 세션에서 발견된 실제 함정 카탈로그. 각 항목은 **증상 → 원인 → 해결**.
4
+
5
+ ---
6
+
7
+ ## Frontmatter 안전성
8
+
9
+ ### preview 기본값 변경
10
+
11
+ **증상**: `brxce_create_worknodes`나 `brxce_update_worknodes`로 만들었는데 실제로 생성/수정되지 않음.
12
+
13
+ **원인**: 1.1.10 이후 preview 기본값이 `true`로 변경됨 (#1108). 이전에는 `undefined`였고 즉시 실행됐음.
14
+
15
+ **해결**:
16
+ ```ts
17
+ brxce_create_worknodes({ worknodes: [...], preview: false })
18
+ brxce_update_worknodes({ updates: [...], preview: false })
19
+ brxce_create_meeting({ ..., preview: false })
20
+ brxce_update_meeting({ ..., preview: false })
21
+ ```
22
+
23
+ 명시적이지 않으면 항상 dry-run으로 끝난다. 안전하지만 기억하지 않으면 실행 안 됨.
24
+
25
+ ---
26
+
27
+ ## 응답 파싱 / Schema
28
+
29
+ ### "Found 0 WorkNodes" — UUID를 query로 보냄
30
+
31
+ **증상**: 분명 존재하는 UUID인데 `read_worknodes`/`worknode_detail`/`list_attachments`가 0건 반환.
32
+
33
+ **원인**: 백엔드 `query` 필드는 title 텍스트 검색 + displayId 정규식만 매칭한다. UUID는 어디에도 매칭되지 않음.
34
+
35
+ **해결**:
36
+ ```ts
37
+ // ❌
38
+ brxce_read_worknodes({ query: "ca585177-df9b-408a-bd1f-55f8cba99a37" })
39
+
40
+ // ✅
41
+ brxce_read_worknodes({ nodeIds: ["ca585177-..."] })
42
+ brxce_read_worknodes({ worknodeIds: ["ca585177-..."] })
43
+ brxce_worknode_detail({ nodeId: "ca585177-..." }) // 1.1.16+에서 자동 분기
44
+ ```
45
+
46
+ 내부 영향 받는 툴: `worknode_detail`, `list_attachments`, `download_attachment`, `upload_attachment`. 1.1.12~1.1.16에서 단계적 fix됨.
47
+
48
+ ### task/subtask 생성 시 acceptance_criteria 누락
49
+
50
+ **증상**: `brxce_create_worknodes`로 task 생성 시 `400 BAD_REQUEST: task requires at least 1 acceptance criteria`.
51
+
52
+ **원인**: 백엔드가 #1079 이후 강제. task/subtask는 최소 1개 AC 필요.
53
+
54
+ **해결**:
55
+ ```ts
56
+ brxce_create_worknodes({
57
+ worknodes: [{
58
+ title: "...",
59
+ nodeType: "task",
60
+ acceptance_criteria: [{ title: "검수 기준 1" }],
61
+ }],
62
+ preview: false,
63
+ })
64
+ ```
65
+
66
+ 또는 단순 메모면 `nodeType: "note"` 사용 (AC 불필요).
67
+
68
+ ### update_worknodes는 PATCH, post가 아님
69
+
70
+ **증상**: `batch_assign`이 항상 "Success: 0/N"으로 silent fail.
71
+
72
+ **원인**: 1.1.15 이전 `batch-assign-tool.ts`가 `apiClient.post('/mcp/worknodes/update', ...)` 호출. 백엔드 라우트는 PATCH였음. 게다가 응답 shape도 `{ updated, failed, summary }`인데 옛 코드는 `successCount`를 읽음.
73
+
74
+ **해결**: 1.1.15+로 업그레이드. 에이전트는 모르고 사용해도 무방.
75
+
76
+ ---
77
+
78
+ ## Cache / Stale Data
79
+
80
+ ### permanent_delete 후 inbox/global_overview에 잔존
81
+
82
+ **증상**: 분명 영구 삭제했는데 `workspace_inbox`에 그대로 보임.
83
+
84
+ **원인**: `permanent_delete_worknode` 라우트가 워크스페이스 스냅샷 캐시 invalidation 이벤트를 발행하지 않음 (#45).
85
+
86
+ **해결**: 1.1.16+ (PR #1108)에서 자동. 그 미만 버전을 쓰는 동안에는:
87
+ 1. 영구 삭제 후 한 번 더 read해서 캐시 강제 갱신, 또는
88
+ 2. 새 노드를 만들어 삭제 cycle을 한 번 더 돌림
89
+
90
+ ### inbox 50건 cap
91
+
92
+ **증상**: `workspace_inbox` 결과가 항상 50건만 반환됨.
93
+
94
+ **원인**: 백엔드 기본 limit. 그 이상은 페이지네이션 필요.
95
+
96
+ **해결**: `limit` 파라미터로 조정 (max 200), 또는 카테고리별로 필터 후 호출.
97
+
98
+ ---
99
+
100
+ ## 파라미터 직렬화 (Harness 측)
101
+
102
+ ### 첫 호출에서 array가 string으로 도착
103
+
104
+ **증상**:
105
+ ```
106
+ Invalid arguments for tool ...:
107
+ expected: array
108
+ received: string
109
+ path: [nodeIds]
110
+ ```
111
+
112
+ **원인**: Claude Code 클라이언트가 처음 보는 툴의 schema가 로드되지 않은 상태에서 array 파라미터를 JSON 문자열로 직렬화. MCP 서버 side 버그가 아님.
113
+
114
+ **해결**:
115
+ 1. 같은 호출을 한 번 더 (schema가 로드된 상태)
116
+ 2. 또는 미리 ToolSearch로 schema 강제 로드: `select:mcp__brxce__brxce_archive_worknodes`
117
+
118
+ 이건 OpenClaw에서는 보통 발생하지 않는다.
119
+
120
+ ### number 파라미터에 string이 들어감
121
+
122
+ **증상**: `limit`, `pageSize` 등에 `"3"`을 전달하면 `expected: number, received: string`.
123
+
124
+ **원인**: 일부 툴이 strict number 파싱.
125
+
126
+ **해결**: `worknodes_by_member`는 1.1.15+에서 string→number coerce 지원. 다른 툴은 항상 number 리터럴로 호출.
127
+
128
+ ---
129
+
130
+ ## 명명 / Alias 혼란
131
+
132
+ ### memberId vs userId
133
+
134
+ **증상**: `worknodes_by_member` 호출 시 `memberId is required` 에러.
135
+
136
+ **원인**: 1.1.14 미만에서 `memberId`만 받음.
137
+
138
+ **해결**: 1.1.15+에서 `userId` alias 추가. 둘 다 사용 가능.
139
+
140
+ ### nodeIds vs worknodeIds
141
+
142
+ **증상**: `read_worknodes({ nodeIds: [...] })`가 동작하지 않음.
143
+
144
+ **원인**: 원래 `worknodeIds`만 정식 필드.
145
+
146
+ **해결**: 1.1.13+에서 `nodeIds` alias 추가. 두 필드 동시 제공 시 `worknodeIds` 우선.
147
+
148
+ ### tagIds/tagSlugs는 array OR string
149
+
150
+ **증상**: `find_worknodes_by_tags({ tagSlugs: ["brxce"] })`가 400.
151
+
152
+ **원인**: 1.1.14 이하에서 string만 받음 (comma-separated).
153
+
154
+ **해결**: 1.1.15+에서 array도 받음. 두 형태 모두 지원.
155
+
156
+ ---
157
+
158
+ ## 이미 제거된 기능 사용
159
+
160
+ ### invitation 계열 410 Gone
161
+
162
+ **증상**: `brxce_list_invitations`, `brxce_create_invitation` 등이 410 반환.
163
+
164
+ **원인**: #1021로 워크스페이스 = 개인 모델로 전환되면서 invitation 기능 자체 제거됨. 1.1.11+에서 MCP 툴도 제거됨.
165
+
166
+ **해결**: 사용 중단. 외부 협업이 필요하면 다른 메커니즘 사용.
167
+
168
+ ### workspace_member 계열 410 Gone
169
+
170
+ **증상**: `brxce_add_workspace_member` 등이 410.
171
+
172
+ **원인**: 동일 (#1021).
173
+
174
+ **해결**: 1.1.15+에서 MCP 툴 자체 제거. `list_workspace_members`(읽기)만 남음.
175
+
176
+ ### Bot 계열 전체 제거
177
+
178
+ **증상**: `brxce_create_bot`, `brxce_list_bots` 등 미존재.
179
+
180
+ **원인**: #1029로 bot 기능 전체 제거.
181
+
182
+ **해결**: 사용 중단.
183
+
184
+ ---
185
+
186
+ ## Backend Raw SQL 함정
187
+
188
+ ### Prisma raw query 컬럼/테이블명 불일치
189
+
190
+ **증상**: `brxce_global_overview` 500 with Prisma error.
191
+
192
+ **원인**: 1.1.16 이전에는 4 layered 버그 누적:
193
+ 1. `Prisma.sql/Prisma.empty` 미사용 → `syntax error at or near $5`
194
+ 2. 테이블명 `work_nodes` (실제는 `worknode`)
195
+ 3. 컬럼명 `status` (실제는 `node_status`)
196
+ 4. UUID array binding without `::uuid[]` cast
197
+
198
+ **해결**: 1.1.16+에서 모두 수정됨. 그 미만에서는 사용 불가.
199
+
200
+ ---
201
+
202
+ ## 응답 크기 / Token 폭발
203
+
204
+ ### workspace_delta 800KB 응답
205
+
206
+ **증상**: `workspace_delta({ workspaceId, sinceVersion: 0 })`이 token limit 초과로 실패.
207
+
208
+ **원인**: 큰 워크스페이스의 첫 sync는 수백 개 변경 + 각 변경마다 전체 노드 payload.
209
+
210
+ **해결**: 1.1.15+에서 `maxChanges` 파라미터 (기본 50, 최대 200) + `truncated`/`nextSinceVersion` 응답.
211
+
212
+ ```ts
213
+ brxce_workspace_delta({
214
+ workspaceId,
215
+ sinceVersion: 0,
216
+ maxChanges: 50, // 명시 권장
217
+ })
218
+ // → truncated: true, nextSinceVersion: <next>
219
+ // → 다음 호출에 sinceVersion=nextSinceVersion
220
+ ```
221
+
222
+ ### read_worknodes 무필터로 큰 워크스페이스
223
+
224
+ **증상**: `read_worknodes({ workspaceId })`가 50건 + 모두 풀 페이로드.
225
+
226
+ **원인**: 페이지네이션 없이는 limit 50 + offset 0이 기본.
227
+
228
+ **해결**: 항상 `limit`/`offset` 명시, `query`/`nodeTypes`/`statuses` 등으로 필터, 또는 `compact` 모드 옵션.
229
+
230
+ ---
231
+
232
+ ## 미묘한 동작 차이
233
+
234
+ ### Note 타입의 status는 제한적
235
+
236
+ **증상**: `update_worknodes`로 note의 status를 `in_progress`로 바꾸려 하면 에러.
237
+
238
+ **원인**: note 타입은 `backlog | static | archived`만 허용. `static`은 note 전용.
239
+
240
+ **해결**: 종류가 task처럼 진행되어야 하면 처음부터 `nodeType: "task"`로 만들 것.
241
+
242
+ ### Note의 complete는 status를 static으로 만듦
243
+
244
+ **증상**: `complete_worknode`을 note에 호출하면 `status: completed`가 아니라 `status: static`이 됨.
245
+
246
+ **원인**: 의도된 동작. note의 "완료"는 "참고용으로 박제"의 의미.
247
+
248
+ **해결**: 정상. 혼란 없도록 인지만.
249
+
250
+ ### update_criteria isCompleted=true는 evidence 필요
251
+
252
+ **증상**: `update_criteria({ criteriaId, isCompleted: true })`가 400.
253
+
254
+ **원인**: AC enforcement #1079. boolean criteria를 만족시키려면 `evidenceUrl` 또는 `currentValue`(설명) 필요.
255
+
256
+ **해결**:
257
+ ```ts
258
+ brxce_update_criteria({
259
+ criteriaId,
260
+ isCompleted: true,
261
+ currentValue: "https://github.com/foo/bar/pull/123", // or 텍스트
262
+ })
263
+ ```
264
+
265
+ ---
266
+
267
+ ## 빠른 진단 체크리스트
268
+
269
+ 새 에러를 만났을 때:
270
+
271
+ 1. **MCP 서버 버전?** `npm list -g @brxce/mcp-server` → < 1.1.16이면 업데이트
272
+ 2. **preview 명시했나?** create/update/meeting CRUD는 명시 필수
273
+ 3. **UUID인가 displayId인가?** 적절한 필드(`worknodeIds` vs `query`)
274
+ 4. **task/subtask인데 AC 있나?** 없으면 400
275
+ 5. **Schema 로드됐나?** array 파라미터 첫 호출 실패는 재시도 또는 ToolSearch
276
+ 6. **삭제된 기능?** invitation/member/bot은 모두 폐기
277
+ 7. **캐시 stale?** 새 데이터로 한 번 더 read