@brxce/mcp-server 1.1.16 → 1.1.18

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,293 @@
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
+ ### inbox가 myInbox: 0 / sharedInbox: N으로 잘못 나옴 (1.1.17 이하)
99
+
100
+ **증상**: 개인 워크스페이스에서 `workspace_inbox` 호출 시 `myInboxCount: 0`, `sharedInboxCount: N`. 분명 본인이 assignee인데도.
101
+
102
+ **원인**: 1.1.17 이하는 team workspace 시절 `isEmpty(assignee)` 기준으로 my/shared를 분리했음. 앱이 워크노드 생성 시 기본 assignee를 본인으로 찍으니 내가 만든 노드도 전부 `assignee: [me]` → `isEmpty: false` → sharedInbox로 분류. #1021로 워크스페이스가 1:1 personal이 된 이후에는 shared 개념 자체가 성립하지 않는데도 응답 shape이 그대로 남아있었음.
103
+
104
+ **해결**: 1.1.18+에서 응답이 단일 `inbox` 배열 + `inboxCount`로 통합됨. 프런트엔드 `isBacklogNode` semantics과 일치. 1.1.18+ 사용 + skill docs에 맞춰 `data.inbox`/`summary.inboxCount` 필드로 파싱.
105
+
106
+ ### "인박스 = ROOT 노드만" 이라고 착각
107
+
108
+ **증상**: 에이전트가 인박스에서 프로젝트 하위 backlog 작업을 보고 "왜 여기 있지?"라고 생각하거나, `parentNodeId: null` 필터를 추가하려 함.
109
+
110
+ **원인**: "인박스"를 "분류 안 된 최상위 고아 노드"로 오해. 실제 정의는 **`status === backlog` 전부** (archived/deleted 제외). 프로젝트 하위의 미완료 backlog 작업도 인박스에 속한다.
111
+
112
+ **해결**: 인박스는 "아직 손대지 않은 일"의 의미이지 "최상위 노드"가 아님. 정상 동작이다.
113
+
114
+ ---
115
+
116
+ ## 파라미터 직렬화 (Harness 측)
117
+
118
+ ### 첫 호출에서 array가 string으로 도착
119
+
120
+ **증상**:
121
+ ```
122
+ Invalid arguments for tool ...:
123
+ expected: array
124
+ received: string
125
+ path: [nodeIds]
126
+ ```
127
+
128
+ **원인**: Claude Code 클라이언트가 처음 보는 툴의 schema가 로드되지 않은 상태에서 array 파라미터를 JSON 문자열로 직렬화. MCP 서버 side 버그가 아님.
129
+
130
+ **해결**:
131
+ 1. 같은 호출을 한 번 더 (schema가 로드된 상태)
132
+ 2. 또는 미리 ToolSearch로 schema 강제 로드: `select:mcp__brxce__brxce_archive_worknodes`
133
+
134
+ 이건 OpenClaw에서는 보통 발생하지 않는다.
135
+
136
+ ### number 파라미터에 string이 들어감
137
+
138
+ **증상**: `limit`, `pageSize` 등에 `"3"`을 전달하면 `expected: number, received: string`.
139
+
140
+ **원인**: 일부 툴이 strict number 파싱.
141
+
142
+ **해결**: `worknodes_by_member`는 1.1.15+에서 string→number coerce 지원. 다른 툴은 항상 number 리터럴로 호출.
143
+
144
+ ---
145
+
146
+ ## 명명 / Alias 혼란
147
+
148
+ ### memberId vs userId
149
+
150
+ **증상**: `worknodes_by_member` 호출 시 `memberId is required` 에러.
151
+
152
+ **원인**: 1.1.14 미만에서 `memberId`만 받음.
153
+
154
+ **해결**: 1.1.15+에서 `userId` alias 추가. 둘 다 사용 가능.
155
+
156
+ ### nodeIds vs worknodeIds
157
+
158
+ **증상**: `read_worknodes({ nodeIds: [...] })`가 동작하지 않음.
159
+
160
+ **원인**: 원래 `worknodeIds`만 정식 필드.
161
+
162
+ **해결**: 1.1.13+에서 `nodeIds` alias 추가. 두 필드 동시 제공 시 `worknodeIds` 우선.
163
+
164
+ ### tagIds/tagSlugs는 array OR string
165
+
166
+ **증상**: `find_worknodes_by_tags({ tagSlugs: ["brxce"] })`가 400.
167
+
168
+ **원인**: 1.1.14 이하에서 string만 받음 (comma-separated).
169
+
170
+ **해결**: 1.1.15+에서 array도 받음. 두 형태 모두 지원.
171
+
172
+ ---
173
+
174
+ ## 이미 제거된 기능 사용
175
+
176
+ ### invitation 계열 410 Gone
177
+
178
+ **증상**: `brxce_list_invitations`, `brxce_create_invitation` 등이 410 반환.
179
+
180
+ **원인**: #1021로 워크스페이스 = 개인 모델로 전환되면서 invitation 기능 자체 제거됨. 1.1.11+에서 MCP 툴도 제거됨.
181
+
182
+ **해결**: 사용 중단. 외부 협업이 필요하면 다른 메커니즘 사용.
183
+
184
+ ### workspace_member 계열 410 Gone
185
+
186
+ **증상**: `brxce_add_workspace_member` 등이 410.
187
+
188
+ **원인**: 동일 (#1021).
189
+
190
+ **해결**: 1.1.15+에서 MCP 툴 자체 제거. `list_workspace_members`(읽기)만 남음.
191
+
192
+ ### Bot 계열 전체 제거
193
+
194
+ **증상**: `brxce_create_bot`, `brxce_list_bots` 등 미존재.
195
+
196
+ **원인**: #1029로 bot 기능 전체 제거.
197
+
198
+ **해결**: 사용 중단.
199
+
200
+ ---
201
+
202
+ ## Backend Raw SQL 함정
203
+
204
+ ### Prisma raw query 컬럼/테이블명 불일치
205
+
206
+ **증상**: `brxce_global_overview` 500 with Prisma error.
207
+
208
+ **원인**: 1.1.16 이전에는 4 layered 버그 누적:
209
+ 1. `Prisma.sql/Prisma.empty` 미사용 → `syntax error at or near $5`
210
+ 2. 테이블명 `work_nodes` (실제는 `worknode`)
211
+ 3. 컬럼명 `status` (실제는 `node_status`)
212
+ 4. UUID array binding without `::uuid[]` cast
213
+
214
+ **해결**: 1.1.16+에서 모두 수정됨. 그 미만에서는 사용 불가.
215
+
216
+ ---
217
+
218
+ ## 응답 크기 / Token 폭발
219
+
220
+ ### workspace_delta 800KB 응답
221
+
222
+ **증상**: `workspace_delta({ workspaceId, sinceVersion: 0 })`이 token limit 초과로 실패.
223
+
224
+ **원인**: 큰 워크스페이스의 첫 sync는 수백 개 변경 + 각 변경마다 전체 노드 payload.
225
+
226
+ **해결**: 1.1.15+에서 `maxChanges` 파라미터 (기본 50, 최대 200) + `truncated`/`nextSinceVersion` 응답.
227
+
228
+ ```ts
229
+ brxce_workspace_delta({
230
+ workspaceId,
231
+ sinceVersion: 0,
232
+ maxChanges: 50, // 명시 권장
233
+ })
234
+ // → truncated: true, nextSinceVersion: <next>
235
+ // → 다음 호출에 sinceVersion=nextSinceVersion
236
+ ```
237
+
238
+ ### read_worknodes 무필터로 큰 워크스페이스
239
+
240
+ **증상**: `read_worknodes({ workspaceId })`가 50건 + 모두 풀 페이로드.
241
+
242
+ **원인**: 페이지네이션 없이는 limit 50 + offset 0이 기본.
243
+
244
+ **해결**: 항상 `limit`/`offset` 명시, `query`/`nodeTypes`/`statuses` 등으로 필터, 또는 `compact` 모드 옵션.
245
+
246
+ ---
247
+
248
+ ## 미묘한 동작 차이
249
+
250
+ ### Note 타입의 status는 제한적
251
+
252
+ **증상**: `update_worknodes`로 note의 status를 `in_progress`로 바꾸려 하면 에러.
253
+
254
+ **원인**: note 타입은 `backlog | static | archived`만 허용. `static`은 note 전용.
255
+
256
+ **해결**: 종류가 task처럼 진행되어야 하면 처음부터 `nodeType: "task"`로 만들 것.
257
+
258
+ ### Note의 complete는 status를 static으로 만듦
259
+
260
+ **증상**: `complete_worknode`을 note에 호출하면 `status: completed`가 아니라 `status: static`이 됨.
261
+
262
+ **원인**: 의도된 동작. note의 "완료"는 "참고용으로 박제"의 의미.
263
+
264
+ **해결**: 정상. 혼란 없도록 인지만.
265
+
266
+ ### update_criteria isCompleted=true는 evidence 필요
267
+
268
+ **증상**: `update_criteria({ criteriaId, isCompleted: true })`가 400.
269
+
270
+ **원인**: AC enforcement #1079. boolean criteria를 만족시키려면 `evidenceUrl` 또는 `currentValue`(설명) 필요.
271
+
272
+ **해결**:
273
+ ```ts
274
+ brxce_update_criteria({
275
+ criteriaId,
276
+ isCompleted: true,
277
+ currentValue: "https://github.com/foo/bar/pull/123", // or 텍스트
278
+ })
279
+ ```
280
+
281
+ ---
282
+
283
+ ## 빠른 진단 체크리스트
284
+
285
+ 새 에러를 만났을 때:
286
+
287
+ 1. **MCP 서버 버전?** `npm list -g @brxce/mcp-server` → < 1.1.16이면 업데이트
288
+ 2. **preview 명시했나?** create/update/meeting CRUD는 명시 필수
289
+ 3. **UUID인가 displayId인가?** 적절한 필드(`worknodeIds` vs `query`)
290
+ 4. **task/subtask인데 AC 있나?** 없으면 400
291
+ 5. **Schema 로드됐나?** array 파라미터 첫 호출 실패는 재시도 또는 ToolSearch
292
+ 6. **삭제된 기능?** invitation/member/bot은 모두 폐기
293
+ 7. **캐시 stale?** 새 데이터로 한 번 더 read
@@ -0,0 +1,245 @@
1
+ # BRXCE MCP Tool Selection
2
+
3
+ 89개 툴 전체 분류 + "이럴 때 무엇을 쓰는가" 결정 트리. SKILL.md 본문은 카테고리 표만 보여주고 여기는 결정 트리 + 모든 툴의 한 줄 설명.
4
+
5
+ ---
6
+
7
+ ## 결정 트리: 무엇을 쓸 것인가
8
+
9
+ ### "워크노드를 찾고 싶다"
10
+
11
+ ```
12
+ nodeId/displayId/UUID를 이미 안다?
13
+ ├── UUID + 상세 한 건
14
+ │ └── brxce_worknode_detail({ nodeId: <uuid> })
15
+
16
+ ├── UUID + 단순 11 필드
17
+ │ └── brxce_read_worknodes({ nodeIds: [<uuid>] }) # alias of worknodeIds
18
+
19
+ ├── displayId (#5723)
20
+ │ └── brxce_worknode_detail({ nodeId: "#5723", workspaceId })
21
+
22
+ └── ID 모름 — 검색해야 함
23
+
24
+ ├── title/description 키워드
25
+ │ └── brxce_read_worknodes({ workspaceId, query: "..." })
26
+
27
+ ├── 필터 조합 (status + tags + priority + due date)
28
+ │ └── brxce_filter_worknodes({ workspaceId, status: [...], tags: [...], ... })
29
+
30
+ ├── 특정 멤버에게 할당된 것 전부
31
+ │ └── brxce_worknodes_by_member({ workspaceId, userId })
32
+
33
+ ├── 특정 태그 붙은 것
34
+ │ └── brxce_find_worknodes_by_tags({ workspaceId, tagSlugs: ["..."] })
35
+
36
+ ├── backlog 상태 전체 (인박스)
37
+ │ └── brxce_workspace_inbox({ workspaceId, limit: 200 })
38
+
39
+ └── 내가 작업 중인 것 (활성 / 완료 / 긴급)
40
+ └── brxce_my_work({ workspaceId, mode: "active" })
41
+ ```
42
+
43
+ ### "워크노드를 만들거나 바꾸고 싶다"
44
+
45
+ ```
46
+ 혼자 vs 여러 개?
47
+ ├── 1개 단순 생성/수정 → create_worknodes / update_worknodes (single-element array)
48
+
49
+ ├── 여러 개 같은 액션 (complete / archive / delete / move / status / priority)
50
+ │ └── brxce_batch_actions({ action, nodeIds, params })
51
+
52
+ ├── 여러 개에 같은 사람 할당 → brxce_batch_assign({ nodeIds, assigneeId })
53
+
54
+ └── 여러 개에 같은 태그 → brxce_batch_assign_tags({ worknodeIds, tagIds })
55
+ ```
56
+
57
+ ### "회의 작업"
58
+
59
+ ```
60
+ ├── 회의 만들기 → brxce_create_meeting (preview:true → false)
61
+ ├── 아젠다 → brxce_add_agenda_item / list_agenda_items / update / delete
62
+ ├── 아젠다별 노트 (1.1.16+) → brxce_add_agenda_note / list / update / delete
63
+ ├── 회의 노트 (전체) → brxce_add_meeting_note / list / update / delete
64
+ ├── 결정 사항 → brxce_add_meeting_decision / list / update / delete
65
+ └── 회의 자체 수정 → brxce_update_meeting({ meetingId, changes: {...}, preview: false })
66
+ ```
67
+
68
+ ### "삭제"
69
+
70
+ ```
71
+ ├── 일반 삭제 (soft, 복구 가능) → brxce_delete_worknode (single) / batch_actions(delete)
72
+ ├── 영구 삭제 (cascade, 복구 불가) → brxce_permanent_delete_worknode({ confirm: true })
73
+ │ ⚠️ owner만 가능, children/criteria/comments/tags 함께 삭제
74
+ └── 아카이브 (status만 변경) → brxce_archive_worknodes / unarchive_worknodes
75
+ ```
76
+
77
+ ### "에러 / 디버깅"
78
+
79
+ ```
80
+ ├── 캐시 stale 의심 → 노드 다시 read하면 최신 (1.1.16+ 자동 invalidation)
81
+ ├── 401 → MCP 토큰 갱신 + 서버 재시작
82
+ ├── 410 Gone → invitation/workspace_member 툴은 폐기됨, 사용 중단
83
+ ├── 500 + Prisma → backend 버그, GitHub 이슈
84
+ └── "Found 0 WorkNodes" → UUID를 query로 보냈을 가능성, worknodeIds로 변경
85
+ ```
86
+
87
+ ---
88
+
89
+ ## 89 툴 전체 분류
90
+
91
+ ### Workspace (8)
92
+
93
+ | 툴 | 한 줄 설명 |
94
+ |----|----------|
95
+ | `brxce_list_workspaces` | 접근 가능한 전체 워크스페이스 |
96
+ | `brxce_workspace_overview` | 단일 워크스페이스 트리 (depth-first) + stats |
97
+ | `brxce_workspace_statistics` | 통계 (status/priority/type/멤버/dueDate/goal progress) |
98
+ | `brxce_workspace_inbox` | backlog 상태 전체 (통합 `inbox`, 1.1.18+) |
99
+ | `brxce_workspace_delta` | sinceVersion 이후 변경 (incremental sync) — `maxChanges` 필수 |
100
+ | `brxce_workspace_ascii_export` | 사람이 읽기 좋은 ASCII 트리 |
101
+ | `brxce_global_overview` | 워크스페이스 통합 요약 (1.1.16+에서 4 layered fix) |
102
+ | `brxce_list_workspace_members` | 멤버 + role + 가입일 |
103
+
104
+ ### WorkNode Read (10)
105
+
106
+ | 툴 | 한 줄 설명 |
107
+ |----|----------|
108
+ | `brxce_read_worknodes` | query / worknodeIds / nodeIds(alias) / 필터 / 페이지 |
109
+ | `brxce_worknode_detail` | 단일 노드 + AC + children summary |
110
+ | `brxce_worknode_subtree` | 노드 + 모든 descendant tree |
111
+ | `brxce_worknode_history` | CREATE/UPDATE 이벤트 히스토리 |
112
+ | `brxce_worknode_tag_relations` | 노드의 모든 태그 + 누가 언제 |
113
+ | `brxce_get_worknode_tags` | UUID-only로도 동작 (1.1.16+) |
114
+ | `brxce_filter_worknodes` | status + tags(name) + assignee + dueDate + priority + page |
115
+ | `brxce_find_worknodes_by_tags` | tagIds / tagSlugs (string OR array) + matchAll |
116
+ | `brxce_worknodes_by_member` | userId/memberId(alias) + status |
117
+ | `brxce_my_work` | mode: active/completed/urgent/inbox/all |
118
+
119
+ ### WorkNode Write (10)
120
+
121
+ | 툴 | 한 줄 설명 |
122
+ |----|----------|
123
+ | `brxce_create_worknodes` | 배열, preview 기본 true, task/subtask는 AC 필수 |
124
+ | `brxce_update_worknodes` | updates[{nodeId, changes, cascade?}], preview 기본 true |
125
+ | `brxce_move_worknode` | newParentId 지정 |
126
+ | `brxce_complete_worknode` | status → completed (note는 static) |
127
+ | `brxce_archive_worknodes` | nodeIds[] |
128
+ | `brxce_unarchive_worknodes` | nodeIds[] |
129
+ | `brxce_delete_worknode` | soft, idempotent (1.1.13+) |
130
+ | `brxce_permanent_delete_worknode` | hard + cascade, owner only |
131
+ | `brxce_batch_actions` | action: complete/archive/unarchive/delete/move/update-status/update-priority |
132
+ | `brxce_plan_organize` | 인박스/노이즈 자동 분류 제안 |
133
+
134
+ ### Bulk (3)
135
+
136
+ | 툴 | 한 줄 설명 |
137
+ |----|----------|
138
+ | `brxce_batch_assign` | nodeIds[] + assigneeId (1.1.15+에서 PATCH로 수정) |
139
+ | `brxce_batch_assign_tags` | worknodeIds[] + tagIds[] |
140
+ | `brxce_create_tags_batch` | tags[] + workspaceId (slug 자동 생성 가능) |
141
+
142
+ ### Tags (10)
143
+
144
+ | 툴 | 한 줄 설명 |
145
+ |----|----------|
146
+ | `brxce_list_tags` | 카테고리별 그룹 |
147
+ | `brxce_list_tag_categories` | 카테고리 메타 (color, allow_multiple) |
148
+ | `brxce_search_tags` | 키워드 검색 |
149
+ | `brxce_get_tag_stats` | 사용/미사용 + 카테고리 utilization |
150
+ | `brxce_tag_changes` | sinceDate 이후 태그 변경 (uuid cast 1.1.15+) |
151
+ | `brxce_create_tag` | name 필수, slug 자동 생성, categoryId 필수 |
152
+ | `brxce_update_tag` | tagId + 변경 필드 |
153
+ | `brxce_delete_tag` | tagId |
154
+ | `brxce_create_tag_category` | name + slug |
155
+ | `brxce_update_tag_category` / `brxce_delete_tag_category` | 카테고리 관리 |
156
+
157
+ ### Tag–WorkNode (3)
158
+
159
+ | 툴 | 설명 |
160
+ |----|------|
161
+ | `brxce_add_tags_to_worknode` | worknodeId + tagIds[] |
162
+ | `brxce_remove_tag_from_worknode` | worknodeId + tagId |
163
+ | `brxce_get_worknode_tags` | UUID-only (1.1.16+) |
164
+
165
+ ### Meeting (15)
166
+
167
+ | 툴 | 설명 |
168
+ |----|------|
169
+ | `brxce_create_meeting` | preview 기본 true, auto-review 포함 |
170
+ | `brxce_list_meetings` | workspaceId 필터 |
171
+ | `brxce_get_meeting` | 단일 회의 + review/agenda/notes/decisions |
172
+ | `brxce_update_meeting` | changes 객체, preview 기본 true |
173
+ | `brxce_delete_meeting` | soft delete |
174
+ | `brxce_add_agenda_item` / `list_agenda_items` / `update_agenda_item` / `delete_agenda_item` | 아젠다 CRUD |
175
+ | `brxce_add_agenda_note` / `list_agenda_notes` / `update_agenda_note` / `delete_agenda_note` | 아젠다별 노트 (1.1.16+) |
176
+ | `brxce_add_meeting_note` / `list_meeting_notes` / `update_meeting_note` / `delete_meeting_note` | 회의 전체 노트 |
177
+ | `brxce_add_meeting_decision` / `list_meeting_decisions` / `update_meeting_decision` / `delete_meeting_decision` | 결정 사항 |
178
+
179
+ ### Comments (4)
180
+
181
+ | 툴 | 설명 |
182
+ |----|------|
183
+ | `brxce_create_comment` | nodeId + content |
184
+ | `brxce_list_comments` | nodeId |
185
+ | `brxce_update_comment` | commentId + content |
186
+ | `brxce_delete_comment` | commentId |
187
+
188
+ ### Acceptance Criteria (4)
189
+
190
+ | 툴 | 설명 |
191
+ |----|------|
192
+ | `brxce_create_criteria` | nodeId + title + (type/priority/measurementType) |
193
+ | `brxce_list_criteria` | nodeId |
194
+ | `brxce_update_criteria` | criteriaId + 필드 (isCompleted=true는 evidence 필요) |
195
+ | `brxce_delete_criteria` | criteriaId |
196
+
197
+ ### Notifications (5)
198
+
199
+ | 툴 | 설명 |
200
+ |----|------|
201
+ | `brxce_list_notifications` | total + unreadCount + meta |
202
+ | `brxce_get_unread_counts` | 빠른 카운트만 |
203
+ | `brxce_mark_notification_read` | 단일 |
204
+ | `brxce_mark_all_notifications_read` | workspaceId 필터 (1.1.16+) |
205
+ | `brxce_delete_notification` | 1.1.16+ |
206
+
207
+ ### Recurring (4)
208
+
209
+ | 툴 | 설명 |
210
+ |----|------|
211
+ | `brxce_create_recurring_template` | rrule (RFC 5545) + nodeType |
212
+ | `brxce_list_recurring_templates` | workspaceId |
213
+ | `brxce_update_recurring_template` | templateId + 변경 |
214
+ | `brxce_delete_recurring_template` | templateId |
215
+
216
+ ### Attachments (3)
217
+
218
+ | 툴 | 설명 |
219
+ |----|------|
220
+ | `brxce_list_attachments` | nodeId — 1.1.15+에서 UUID 정상 |
221
+ | `brxce_upload_attachment` | nodeId + filename + contentType + base64Data |
222
+ | `brxce_download_attachment` | nodeId + attachmentId — signed URL |
223
+
224
+ ### Analysis / Reporting (4)
225
+
226
+ | 툴 | 설명 |
227
+ |----|------|
228
+ | `brxce_daily_report` | 오늘 완료 + 미달성 AC + 산출물 누락 |
229
+ | `brxce_goal_progress` | goalId 없으면 전체 goal 일괄 (1.1.15+) |
230
+ | `brxce_workspace_delta` | 변경 델타 |
231
+ | `brxce_plan_organize` | AI 제안 인박스 정리 |
232
+
233
+ ### Users (1)
234
+
235
+ | 툴 | 설명 |
236
+ |----|------|
237
+ | `brxce_search_users` | query (email/username/name) |
238
+
239
+ ---
240
+
241
+ ## 폐기된 툴 (사용 금지)
242
+
243
+ `brxce_create_invitation`, `brxce_list_invitations`, `brxce_accept_invitation`, `brxce_decline_invitation` (모두 #1094로 제거됨), `brxce_add_workspace_member`, `brxce_update_member_role`, `brxce_remove_workspace_member` (#1021로 백엔드 410, #1108로 MCP 제거됨), `brxce_create_bot`, `brxce_list_bots`, `brxce_delete_bot`, `brxce_update_bot`, `brxce_regenerate_bot_key`, `brxce_upload_bot_avatar`, `brxce_delete_bot_avatar` (#1029로 전체 bot 기능 제거).
244
+
245
+ 이 툴들은 1.1.11+ 이후 더 이상 등록되지 않는다.