@crypto512/jicon-mcp 2.2.1 → 2.3.19

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.
Files changed (228) hide show
  1. package/PROMPT.md +10 -28
  2. package/README.md +39 -6
  3. package/TOOL_LIST.md +542 -407
  4. package/dist/config/constants.d.ts +28 -0
  5. package/dist/config/constants.d.ts.map +1 -1
  6. package/dist/config/constants.js +34 -0
  7. package/dist/config/constants.js.map +1 -1
  8. package/dist/config/loader.d.ts.map +1 -1
  9. package/dist/config/loader.js +12 -2
  10. package/dist/config/loader.js.map +1 -1
  11. package/dist/config/types.d.ts +49 -6
  12. package/dist/config/types.d.ts.map +1 -1
  13. package/dist/config/types.js +18 -0
  14. package/dist/config/types.js.map +1 -1
  15. package/dist/confluence/client.d.ts.map +1 -1
  16. package/dist/confluence/client.js +7 -2
  17. package/dist/confluence/client.js.map +1 -1
  18. package/dist/confluence/formatters.d.ts +20 -0
  19. package/dist/confluence/formatters.d.ts.map +1 -1
  20. package/dist/confluence/formatters.js +74 -8
  21. package/dist/confluence/formatters.js.map +1 -1
  22. package/dist/confluence/tools.d.ts +16 -20
  23. package/dist/confluence/tools.d.ts.map +1 -1
  24. package/dist/confluence/tools.js +71 -68
  25. package/dist/confluence/tools.js.map +1 -1
  26. package/dist/credentials/extractor.d.ts +15 -5
  27. package/dist/credentials/extractor.d.ts.map +1 -1
  28. package/dist/credentials/extractor.js +99 -12
  29. package/dist/credentials/extractor.js.map +1 -1
  30. package/dist/credentials/index.d.ts +4 -3
  31. package/dist/credentials/index.d.ts.map +1 -1
  32. package/dist/credentials/index.js +3 -2
  33. package/dist/credentials/index.js.map +1 -1
  34. package/dist/credentials/types.d.ts +22 -0
  35. package/dist/credentials/types.d.ts.map +1 -1
  36. package/dist/credentials/types.js.map +1 -1
  37. package/dist/index.js +211 -176
  38. package/dist/index.js.map +1 -1
  39. package/dist/jira/activity-tools.d.ts +8 -15
  40. package/dist/jira/activity-tools.d.ts.map +1 -1
  41. package/dist/jira/activity-tools.js +131 -90
  42. package/dist/jira/activity-tools.js.map +1 -1
  43. package/dist/jira/client.d.ts +24 -0
  44. package/dist/jira/client.d.ts.map +1 -1
  45. package/dist/jira/client.js +65 -6
  46. package/dist/jira/client.js.map +1 -1
  47. package/dist/jira/formatters.d.ts +61 -0
  48. package/dist/jira/formatters.d.ts.map +1 -1
  49. package/dist/jira/formatters.js +83 -11
  50. package/dist/jira/formatters.js.map +1 -1
  51. package/dist/jira/tools.d.ts +78 -26
  52. package/dist/jira/tools.d.ts.map +1 -1
  53. package/dist/jira/tools.js +293 -130
  54. package/dist/jira/tools.js.map +1 -1
  55. package/dist/permissions/filter.d.ts.map +1 -1
  56. package/dist/permissions/filter.js +8 -4
  57. package/dist/permissions/filter.js.map +1 -1
  58. package/dist/permissions/tool-registry.d.ts +15 -13
  59. package/dist/permissions/tool-registry.d.ts.map +1 -1
  60. package/dist/permissions/tool-registry.js +19 -10
  61. package/dist/permissions/tool-registry.js.map +1 -1
  62. package/dist/session/context.d.ts +81 -0
  63. package/dist/session/context.d.ts.map +1 -0
  64. package/dist/session/context.js +107 -0
  65. package/dist/session/context.js.map +1 -0
  66. package/dist/session/index.d.ts +12 -0
  67. package/dist/session/index.d.ts.map +1 -0
  68. package/dist/session/index.js +22 -0
  69. package/dist/session/index.js.map +1 -0
  70. package/dist/session/manager.d.ts +186 -0
  71. package/dist/session/manager.d.ts.map +1 -0
  72. package/dist/session/manager.js +383 -0
  73. package/dist/session/manager.js.map +1 -0
  74. package/dist/tempo/client.d.ts +14 -0
  75. package/dist/tempo/client.d.ts.map +1 -1
  76. package/dist/tempo/client.js +57 -0
  77. package/dist/tempo/client.js.map +1 -1
  78. package/dist/tempo/formatters.d.ts +13 -0
  79. package/dist/tempo/formatters.d.ts.map +1 -1
  80. package/dist/tempo/formatters.js +106 -20
  81. package/dist/tempo/formatters.js.map +1 -1
  82. package/dist/tempo/tools.d.ts +14 -13
  83. package/dist/tempo/tools.d.ts.map +1 -1
  84. package/dist/tempo/tools.js +203 -33
  85. package/dist/tempo/tools.js.map +1 -1
  86. package/dist/tempo/types.d.ts +20 -6
  87. package/dist/tempo/types.d.ts.map +1 -1
  88. package/dist/transport/http.d.ts +21 -5
  89. package/dist/transport/http.d.ts.map +1 -1
  90. package/dist/transport/http.js +193 -22
  91. package/dist/transport/http.js.map +1 -1
  92. package/dist/transport/index.d.ts +7 -2
  93. package/dist/transport/index.d.ts.map +1 -1
  94. package/dist/transport/index.js +10 -4
  95. package/dist/transport/index.js.map +1 -1
  96. package/dist/utils/buffer-tools.d.ts +48 -724
  97. package/dist/utils/buffer-tools.d.ts.map +1 -1
  98. package/dist/utils/buffer-tools.js +337 -170
  99. package/dist/utils/buffer-tools.js.map +1 -1
  100. package/dist/utils/content-buffer.d.ts +10 -31
  101. package/dist/utils/content-buffer.d.ts.map +1 -1
  102. package/dist/utils/content-buffer.js +12 -86
  103. package/dist/utils/content-buffer.js.map +1 -1
  104. package/dist/utils/http-client.d.ts.map +1 -1
  105. package/dist/utils/http-client.js +99 -2
  106. package/dist/utils/http-client.js.map +1 -1
  107. package/dist/utils/jicon-help.d.ts +3 -3
  108. package/dist/utils/jicon-help.d.ts.map +1 -1
  109. package/dist/utils/jicon-help.js +164 -312
  110. package/dist/utils/jicon-help.js.map +1 -1
  111. package/dist/utils/logger.d.ts +43 -0
  112. package/dist/utils/logger.d.ts.map +1 -0
  113. package/dist/utils/logger.js +102 -0
  114. package/dist/utils/logger.js.map +1 -0
  115. package/dist/utils/plantuml/tools.d.ts.map +1 -1
  116. package/dist/utils/plantuml/tools.js +10 -9
  117. package/dist/utils/plantuml/tools.js.map +1 -1
  118. package/dist/utils/response-formatter.d.ts +20 -2
  119. package/dist/utils/response-formatter.d.ts.map +1 -1
  120. package/dist/utils/response-formatter.js +147 -17
  121. package/dist/utils/response-formatter.js.map +1 -1
  122. package/dist/utils/sandbox/formatters.d.ts +25 -0
  123. package/dist/utils/sandbox/formatters.d.ts.map +1 -0
  124. package/dist/utils/sandbox/formatters.js +690 -0
  125. package/dist/utils/sandbox/formatters.js.map +1 -0
  126. package/dist/utils/sandbox/helpers.d.ts +16 -0
  127. package/dist/utils/sandbox/helpers.d.ts.map +1 -0
  128. package/dist/utils/sandbox/helpers.js +252 -0
  129. package/dist/utils/sandbox/helpers.js.map +1 -0
  130. package/dist/utils/sandbox/index.d.ts +19 -0
  131. package/dist/utils/sandbox/index.d.ts.map +1 -0
  132. package/dist/utils/sandbox/index.js +269 -0
  133. package/dist/utils/sandbox/index.js.map +1 -0
  134. package/dist/utils/sandbox/schema.d.ts +55 -0
  135. package/dist/utils/sandbox/schema.d.ts.map +1 -0
  136. package/dist/utils/sandbox/schema.js +39 -0
  137. package/dist/utils/sandbox/schema.js.map +1 -0
  138. package/dist/utils/sandbox/types.d.ts +179 -0
  139. package/dist/utils/sandbox/types.d.ts.map +1 -0
  140. package/dist/utils/sandbox/types.js +8 -0
  141. package/dist/utils/sandbox/types.js.map +1 -0
  142. package/dist/utils/schemas/confluence.d.ts +41 -0
  143. package/dist/utils/schemas/confluence.d.ts.map +1 -0
  144. package/dist/utils/schemas/confluence.js +105 -0
  145. package/dist/utils/schemas/confluence.js.map +1 -0
  146. package/dist/utils/schemas/index.d.ts +77 -0
  147. package/dist/utils/schemas/index.d.ts.map +1 -0
  148. package/dist/utils/schemas/index.js +107 -0
  149. package/dist/utils/schemas/index.js.map +1 -0
  150. package/dist/utils/schemas/jira.d.ts +49 -0
  151. package/dist/utils/schemas/jira.d.ts.map +1 -0
  152. package/dist/utils/schemas/jira.js +153 -0
  153. package/dist/utils/schemas/jira.js.map +1 -0
  154. package/dist/utils/schemas/tempo.d.ts +29 -0
  155. package/dist/utils/schemas/tempo.d.ts.map +1 -0
  156. package/dist/utils/schemas/tempo.js +72 -0
  157. package/dist/utils/schemas/tempo.js.map +1 -0
  158. package/dist/utils/whoami-tools.d.ts +17 -0
  159. package/dist/utils/whoami-tools.d.ts.map +1 -0
  160. package/dist/utils/whoami-tools.js +90 -0
  161. package/dist/utils/whoami-tools.js.map +1 -0
  162. package/dist/utils/xhtml/error-locator.js +5 -5
  163. package/dist/utils/xhtml/error-locator.js.map +1 -1
  164. package/package.json +10 -9
  165. package/dist/credentials/client-factory.d.ts +0 -64
  166. package/dist/credentials/client-factory.d.ts.map +0 -1
  167. package/dist/credentials/client-factory.js +0 -110
  168. package/dist/credentials/client-factory.js.map +0 -1
  169. package/dist/credentials/context.d.ts +0 -25
  170. package/dist/credentials/context.d.ts.map +0 -1
  171. package/dist/credentials/context.js +0 -35
  172. package/dist/credentials/context.js.map +0 -1
  173. package/dist/utils/buffer-pipeline/index.d.ts +0 -30
  174. package/dist/utils/buffer-pipeline/index.d.ts.map +0 -1
  175. package/dist/utils/buffer-pipeline/index.js +0 -317
  176. package/dist/utils/buffer-pipeline/index.js.map +0 -1
  177. package/dist/utils/buffer-pipeline/output/csv.d.ts +0 -20
  178. package/dist/utils/buffer-pipeline/output/csv.d.ts.map +0 -1
  179. package/dist/utils/buffer-pipeline/output/csv.js +0 -117
  180. package/dist/utils/buffer-pipeline/output/csv.js.map +0 -1
  181. package/dist/utils/buffer-pipeline/output/json.d.ts +0 -16
  182. package/dist/utils/buffer-pipeline/output/json.d.ts.map +0 -1
  183. package/dist/utils/buffer-pipeline/output/json.js +0 -48
  184. package/dist/utils/buffer-pipeline/output/json.js.map +0 -1
  185. package/dist/utils/buffer-pipeline/output/markdown.d.ts +0 -15
  186. package/dist/utils/buffer-pipeline/output/markdown.d.ts.map +0 -1
  187. package/dist/utils/buffer-pipeline/output/markdown.js +0 -105
  188. package/dist/utils/buffer-pipeline/output/markdown.js.map +0 -1
  189. package/dist/utils/buffer-pipeline/output/xhtml-list.d.ts +0 -16
  190. package/dist/utils/buffer-pipeline/output/xhtml-list.d.ts.map +0 -1
  191. package/dist/utils/buffer-pipeline/output/xhtml-list.js +0 -81
  192. package/dist/utils/buffer-pipeline/output/xhtml-list.js.map +0 -1
  193. package/dist/utils/buffer-pipeline/output/xhtml-table.d.ts +0 -15
  194. package/dist/utils/buffer-pipeline/output/xhtml-table.d.ts.map +0 -1
  195. package/dist/utils/buffer-pipeline/output/xhtml-table.js +0 -176
  196. package/dist/utils/buffer-pipeline/output/xhtml-table.js.map +0 -1
  197. package/dist/utils/buffer-pipeline/schema.d.ts +0 -1878
  198. package/dist/utils/buffer-pipeline/schema.d.ts.map +0 -1
  199. package/dist/utils/buffer-pipeline/schema.js +0 -168
  200. package/dist/utils/buffer-pipeline/schema.js.map +0 -1
  201. package/dist/utils/buffer-pipeline/stages/filter.d.ts +0 -32
  202. package/dist/utils/buffer-pipeline/stages/filter.d.ts.map +0 -1
  203. package/dist/utils/buffer-pipeline/stages/filter.js +0 -208
  204. package/dist/utils/buffer-pipeline/stages/filter.js.map +0 -1
  205. package/dist/utils/buffer-pipeline/stages/format.d.ts +0 -45
  206. package/dist/utils/buffer-pipeline/stages/format.d.ts.map +0 -1
  207. package/dist/utils/buffer-pipeline/stages/format.js +0 -160
  208. package/dist/utils/buffer-pipeline/stages/format.js.map +0 -1
  209. package/dist/utils/buffer-pipeline/stages/group-by.d.ts +0 -25
  210. package/dist/utils/buffer-pipeline/stages/group-by.d.ts.map +0 -1
  211. package/dist/utils/buffer-pipeline/stages/group-by.js +0 -190
  212. package/dist/utils/buffer-pipeline/stages/group-by.js.map +0 -1
  213. package/dist/utils/buffer-pipeline/stages/select.d.ts +0 -54
  214. package/dist/utils/buffer-pipeline/stages/select.d.ts.map +0 -1
  215. package/dist/utils/buffer-pipeline/stages/select.js +0 -228
  216. package/dist/utils/buffer-pipeline/stages/select.js.map +0 -1
  217. package/dist/utils/buffer-pipeline/stages/sort.d.ts +0 -20
  218. package/dist/utils/buffer-pipeline/stages/sort.d.ts.map +0 -1
  219. package/dist/utils/buffer-pipeline/stages/sort.js +0 -96
  220. package/dist/utils/buffer-pipeline/stages/sort.js.map +0 -1
  221. package/dist/utils/buffer-pipeline/types.d.ts +0 -277
  222. package/dist/utils/buffer-pipeline/types.d.ts.map +0 -1
  223. package/dist/utils/buffer-pipeline/types.js +0 -8
  224. package/dist/utils/buffer-pipeline/types.js.map +0 -1
  225. package/dist/utils/plantuml/docker-manager.d.ts +0 -37
  226. package/dist/utils/plantuml/docker-manager.d.ts.map +0 -1
  227. package/dist/utils/plantuml/docker-manager.js +0 -284
  228. package/dist/utils/plantuml/docker-manager.js.map +0 -1
package/TOOL_LIST.md CHANGED
@@ -5,19 +5,20 @@ This document provides a comprehensive reference of all available tools in the J
5
5
 
6
6
  ## Summary
7
7
 
8
- **Total Tools**: 79
9
- - **Jira Tools**: 26 (21 read + 5 write)
10
- - **Confluence Tools**: 21 (13 read + 8 write)
11
- - **Tempo Tools**: 13 (10 read + 3 write)
12
- - **Buffer Tools**: 11
13
- - **Workload Tools**: 2
14
- - **URL Tools**: 2
15
- - **Jicon Help Tools**: 1
16
- - **Date Tools**: 1
17
- - **PlantUML Tools**: 3
8
+ **Tool Categories**:
9
+ - **Jira Tools** - Issue search, CRUD, transitions, comments, boards, sprints, epic analysis
10
+ - **Confluence Tools** - Page search, CRUD, draft workflow, review workflow, comments, attachments
11
+ - **Tempo Tools** - Worklog management, accounts, teams, time analysis
12
+ - **Buffer Tools** - Content buffering, XHTML editing, transformation, schema discovery
13
+ - **Workload Tools** - Time conversion and calculation utilities
14
+ - **URL Tools** - Full URL construction and parsing
15
+ - **Date Tools** - Date expression resolution
16
+ - **Help Tools** - Unified help system with topics
17
+ - **Whoami Tools** - User identity across services
18
+ - **PlantUML Tools** - Diagram validation and rendering
18
19
 
19
20
  **Note**: All data-heavy tools (search, list, get) **always** return buffered responses with metadata for origin tracking:
20
- - **JSON arrays**: Use `buffer_get_items` for complete items, `buffer_pipeline` for reports
21
+ - **JSON arrays**: Use `buffer_get_items` for complete items, `buffer_transform` for reports
21
22
  - **XHTML**: Use `buffer_get_element` for element-based access
22
23
  - **Search**: Use `buffer_grep` to search within any buffer
23
24
 
@@ -49,7 +50,7 @@ JSON responses include `suggestedNextTools` based on context:
49
50
  "bufferId": "buf_xxx",
50
51
  "structure": { "type": "array", "itemCount": 500 },
51
52
  "suggestedNextTools": [
52
- { "tool": "buffer_pipeline", "description": "Transform to table/report (98% token reduction)", "condition": "for Confluence reports" },
53
+ { "tool": "buffer_transform", "description": "Transform to table/report (98% token reduction)", "condition": "for Confluence reports" },
53
54
  { "tool": "buffer_get_items", "description": "Get complete items for AI analysis", "condition": "for detailed analysis" },
54
55
  { "tool": "buffer_grep", "description": "Search within results" }
55
56
  ]
@@ -111,7 +112,7 @@ When XHTML validation fails, the response includes element ID and suggested acti
111
112
  #### Jira Search → Confluence Report
112
113
  ```
113
114
  1. jira_search_issues(jql) → bufferId, suggestedNextTools
114
- 2. buffer_pipeline(bufferId, pipeline) → tableBufferId (98% token reduction)
115
+ 2. buffer_transform(inputs, code) → tableBufferId (98% token reduction)
115
116
  3. confluence_edit(pageId) → pageBufferId, structure
116
117
  4. buffer_edit(pageBufferId, after=ID, fromBufferId=tableBufferId)
117
118
  5. confluence_draft_create(pageId, pageBufferId, autoRetry=true) → draft URL
@@ -121,7 +122,7 @@ When XHTML validation fails, the response includes element ID and suggested acti
121
122
  ```
122
123
  1. tempo_get_user_info() → workerKey
123
124
  2. tempo_get_worklogs(dateFrom, dateTo, workerKey) → bufferId, suggestedNextTools
124
- 3. buffer_pipeline(bufferId, groupBy=project, sum=hours) → summaryBufferId
125
+ 3. buffer_transform(bufferId, groupBy=project, sum=hours) → summaryBufferId
125
126
  4. Use in report or display directly
126
127
  ```
127
128
 
@@ -137,7 +138,7 @@ When XHTML validation fails, the response includes element ID and suggested acti
137
138
 
138
139
  ---
139
140
 
140
- ## Jira Tools (25)
141
+ ## Jira Tools (29)
141
142
 
142
143
  ### Localization / Non-English Jira
143
144
 
@@ -166,8 +167,8 @@ The server automatically handles localized changelog field names for activity tr
166
167
 
167
168
  ---
168
169
 
169
- ### 1. jira_search_issues
170
- **Description**: Search for Jira issues using JQL. Auto-fetches all results (up to 5000).
170
+ ### jira_search_issues
171
+ **Description**: Search for Jira issues using JQL. Auto-fetches all matching results.
171
172
  **Use Cases**: Find bugs, filter by status, search by assignee, complex queries
172
173
 
173
174
  | Parameter | Type | Required | Description |
@@ -180,7 +181,6 @@ The server automatically handles localized changelog field names for activity tr
180
181
  |-------|-------------|
181
182
  | `returnedItems` | Items available in buffer - **USE THIS** for actual count |
182
183
  | `jiraTotalMatching` | Total matching in Jira (may exceed returnedItems) |
183
- | `apiLimit` | Maximum items per search (5000 cap) |
184
184
  | `note` | Explanation when results are truncated |
185
185
 
186
186
  **Example Response** (when JQL matches 9998 issues):
@@ -189,16 +189,15 @@ The server automatically handles localized changelog field names for activity tr
189
189
  "bufferId": "buf_xxx",
190
190
  "returnedItems": 5000,
191
191
  "jiraTotalMatching": 9998,
192
- "apiLimit": 5000,
193
192
  "note": "9998 issues match query, 5000 returned (API limit)"
194
193
  }
195
194
  ```
196
195
 
197
- **Returns**: `bufferId` with issues. Use `buffer_pipeline` for tables, `buffer_get_items` for AI analysis.
196
+ **Returns**: `bufferId` with issues. Use `buffer_transform` for tables, `buffer_get_items` for AI analysis.
198
197
 
199
198
  ---
200
199
 
201
- ### 2. jira_get_issue
200
+ ### jira_get_issue
202
201
  **Description**: Get detailed information about a specific issue
203
202
  **Use Cases**: View issue details, check status, read description and comments
204
203
 
@@ -212,7 +211,20 @@ The server automatically handles localized changelog field names for activity tr
212
211
 
213
212
  ---
214
213
 
215
- ### 3. jira_create_issue
214
+ ### jira_get_issues
215
+ **Description**: Get multiple Jira issues at once in a single buffer
216
+ **Use Cases**: Batch fetch issues by key instead of calling jira_get_issue N times; compare issues side by side; bulk analysis
217
+
218
+ | Parameter | Type | Required | Description |
219
+ |-----------|------|----------|-------------|
220
+ | issueKeys | string \| string[] | ✓ | Single key or array of keys (e.g., "PROJ-123" or ["PROJ-123","PROJ-456"]) |
221
+ | fields | string[] | ✗ | Specific fields to return |
222
+
223
+ **Returns**: `bufferId` with flat issues array (same `jira_issue` schema as `jira_search_issues`). Use `buffer_transform` for tables, `buffer_get_items` for analysis.
224
+
225
+ ---
226
+
227
+ ### jira_create_issue
216
228
  **Description**: Create a new Jira issue
217
229
  **Use Cases**: Report bugs, create tasks, add stories to backlog
218
230
 
@@ -230,7 +242,7 @@ The server automatically handles localized changelog field names for activity tr
230
242
 
231
243
  ---
232
244
 
233
- ### 4. jira_update_issue
245
+ ### jira_update_issue
234
246
  **Description**: Update fields on an existing issue
235
247
  **Use Cases**: Change priority, update description, modify assignee
236
248
 
@@ -245,7 +257,7 @@ The server automatically handles localized changelog field names for activity tr
245
257
 
246
258
  ---
247
259
 
248
- ### 5. jira_transition_issue
260
+ ### jira_transition_issue
249
261
  **Description**: Move issue to different status
250
262
  **Use Cases**: Start work, mark as done, move to review
251
263
 
@@ -258,7 +270,7 @@ The server automatically handles localized changelog field names for activity tr
258
270
 
259
271
  ---
260
272
 
261
- ### 6. jira_add_comment
273
+ ### jira_add_comment
262
274
  **Description**: Add a comment to an issue
263
275
  **Use Cases**: Provide updates, ask questions, document decisions
264
276
 
@@ -270,7 +282,7 @@ The server automatically handles localized changelog field names for activity tr
270
282
 
271
283
  ---
272
284
 
273
- ### 7. jira_get_issue_comments
285
+ ### jira_get_issue_comments
274
286
  **Description**: Retrieve all comments from a Jira issue
275
287
  **Use Cases**: Read discussion history, check updates
276
288
 
@@ -283,7 +295,7 @@ The server automatically handles localized changelog field names for activity tr
283
295
 
284
296
  ---
285
297
 
286
- ### 8. jira_list_projects
298
+ ### jira_list_projects
287
299
  **Description**: List all accessible Jira projects
288
300
  **Use Cases**: Discover available projects, get project keys
289
301
 
@@ -296,7 +308,7 @@ The server automatically handles localized changelog field names for activity tr
296
308
 
297
309
  ---
298
310
 
299
- ### 9. jira_get_project
311
+ ### jira_get_project
300
312
  **Description**: Get detailed project information
301
313
  **Use Cases**: View project details, components, versions
302
314
 
@@ -309,7 +321,7 @@ The server automatically handles localized changelog field names for activity tr
309
321
 
310
322
  ---
311
323
 
312
- ### 10. jira_get_issue_types
324
+ ### jira_get_issue_types
313
325
  **Description**: Get all available issue types in this Jira instance
314
326
  **Use Cases**: Discover type names before filtering by type in JQL, find localized or custom type names
315
327
 
@@ -321,29 +333,44 @@ The server automatically handles localized changelog field names for activity tr
321
333
 
322
334
  ---
323
335
 
324
- ### 11. jira_get_fields
325
- **Description**: Get all available Jira fields (system and custom)
336
+ ### jira_get_fields
337
+ **Description**: Get Jira fields (system and custom). Requires a search term or "all".
326
338
  **Use Cases**: Discover field names in user's language, find custom field IDs for JQL, identify Epic Link field
327
339
 
328
340
  | Parameter | Type | Required | Description |
329
341
  |-----------|------|----------|-------------|
330
- | filter | enum | | Filter: "all" (default), "custom", "system", or "navigable" |
331
- | search | string | | Search in field name or ID (case-insensitive) |
342
+ | search | string | **Yes** | `"all"` to return every field, or a search term to filter by name, id, clauseNames, or schemaType (case-insensitive) |
343
+ | filter | enum | No | Filter by category: "all" (default), "custom", "system", or "navigable" |
332
344
 
333
345
  **Returns**: List of fields with id, name, custom, clauseNames, schemaType
334
346
 
335
347
  **Example workflow for Epic Link in any language**:
336
- 1. Call `jira_get_fields(search="epic")` to find the Epic Link field
348
+ 1. Call `jira_get_fields(search="epic")` matches name, id, clauseNames, AND schemaType
337
349
  2. Look for field with `schemaType = "com.pyxis.greenhopper.jira:gh-epic-link"`
338
- 3. Use either:
339
- - Localized name: `"Lien d'épopée" = PROJ-123` (French)
340
- - Language-independent: `cf[10014] = PROJ-123`
350
+ 3. Use `cf[ID]` from clauseNames in JQL: `cf[10014] IS EMPTY`
341
351
 
342
- **Tip**: The `clauseNames` array shows all valid JQL names for a field. The `cf[ID]` syntax always works regardless of language.
352
+ **Tip**: The `clauseNames` array shows all valid JQL names for a field. The `cf[ID]` syntax always works regardless of language. The search also matches `schemaType`, so `search="epic"` finds the Epic Link field even on French instances where it's named "Lien d'épopée".
343
353
 
344
354
  ---
345
355
 
346
- ### 12. jira_get_transitions
356
+ ### jira_search_users
357
+ **Description**: Search for Jira users by name, username, or email
358
+ **Use Cases**: Find a person's username before building JQL queries with assignee/reporter
359
+
360
+ | Parameter | Type | Required | Description |
361
+ |-----------|------|----------|-------------|
362
+ | query | string | ✓ | Search text (display name, username, or email) |
363
+ | maxResults | number | ✗ | Maximum results (default: 20) |
364
+
365
+ **Returns**: Inline list of matching users with `key`, `name`, `displayName`, `emailAddress`.
366
+
367
+ **Example workflow**:
368
+ 1. `jira_search_users(query="Fabien")` → finds users matching "Fabien"
369
+ 2. Use username in JQL: `assignee = "fthuillier"`
370
+
371
+ ---
372
+
373
+ ### jira_get_transitions
347
374
  **Description**: Get available workflow transitions for an issue
348
375
  **Use Cases**: Check what status changes are possible
349
376
 
@@ -353,7 +380,7 @@ The server automatically handles localized changelog field names for activity tr
353
380
 
354
381
  ---
355
382
 
356
- ### 13. jira_link_issues
383
+ ### jira_link_issues
357
384
  **Description**: Create a link between two issues
358
385
  **Use Cases**: Mark blockers, relate issues, create dependencies
359
386
 
@@ -366,7 +393,28 @@ The server automatically handles localized changelog field names for activity tr
366
393
 
367
394
  ---
368
395
 
369
- ### 14. jira_get_board
396
+ ### jira_list_boards
397
+ **Description**: List all Jira Agile boards (Scrum and Kanban). Entry point for board discovery.
398
+ **Use Cases**: Discover available boards, filter by project or type, find board IDs
399
+
400
+ | Parameter | Type | Required | Description |
401
+ |-----------|------|----------|-------------|
402
+ | projectKeyOrId | string | ✗ | Filter by project key or ID |
403
+ | type | string | ✗ | Filter by board type ("scrum" or "kanban") |
404
+ | name | string | ✗ | Filter by board name (contains) |
405
+
406
+ **Returns**: `bufferId` with boards array. Each board has `id`, `name`, `type`, `projectKey`.
407
+
408
+ **Examples**:
409
+ ```
410
+ jira_list_boards() # All boards
411
+ jira_list_boards(projectKeyOrId="PROJ") # Boards for project
412
+ jira_list_boards(type="scrum") # Only Scrum boards
413
+ ```
414
+
415
+ ---
416
+
417
+ ### jira_get_board
370
418
  **Description**: Get Agile board information
371
419
  **Use Cases**: View board details, get board configuration
372
420
 
@@ -378,7 +426,7 @@ The server automatically handles localized changelog field names for activity tr
378
426
 
379
427
  ---
380
428
 
381
- ### 15. jira_get_sprints
429
+ ### jira_get_sprints
382
430
  **Description**: List all sprints for a board
383
431
  **Use Cases**: View active sprints, check sprint schedules
384
432
 
@@ -391,7 +439,7 @@ The server automatically handles localized changelog field names for activity tr
391
439
 
392
440
  ---
393
441
 
394
- ### 16. jira_get_sprint_issues
442
+ ### jira_get_sprint_issues
395
443
  **Description**: Get all issues in a specific sprint
396
444
  **Use Cases**: View sprint backlog, check sprint progress
397
445
 
@@ -403,7 +451,7 @@ The server automatically handles localized changelog field names for activity tr
403
451
 
404
452
  ---
405
453
 
406
- ### 17. jira_get_issue_watchers
454
+ ### jira_get_issue_watchers
407
455
  **Description**: Get list of watchers on an issue
408
456
  **Use Cases**: See who's following an issue
409
457
 
@@ -413,7 +461,7 @@ The server automatically handles localized changelog field names for activity tr
413
461
 
414
462
  ---
415
463
 
416
- ### 18. jira_get_issue_worklogs
464
+ ### jira_get_issue_worklogs
417
465
  **Description**: Retrieve all worklogs from a Jira issue
418
466
  **Use Cases**: Analyze time logged against an issue, see worklog history
419
467
 
@@ -425,7 +473,7 @@ The server automatically handles localized changelog field names for activity tr
425
473
 
426
474
  ---
427
475
 
428
- ### 19. jira_get_total_worklogs
476
+ ### jira_get_total_worklogs
429
477
  **Description**: Get total worklogs for an issue and all its children recursively
430
478
  **Use Cases**: Get total time spent on an Epic including all stories and sub-tasks
431
479
 
@@ -437,7 +485,7 @@ The server automatically handles localized changelog field names for activity tr
437
485
 
438
486
  ---
439
487
 
440
- ### 20. jira_list_epic_children
488
+ ### jira_list_epic_children
441
489
  **Description**: List all children of an Epic/Initiative without needing JQL
442
490
  **Use Cases**: Get Epic children, list Initiative epics, find issue hierarchy
443
491
 
@@ -460,7 +508,7 @@ Automatically detects Epic Link and Parent Link fields for language-independent
460
508
 
461
509
  ---
462
510
 
463
- ### 21. jira_get_activity_digest
511
+ ### jira_get_activity_digest
464
512
  **Description**: Get recent activity across issues for LLM analysis. Returns DIRECTLY (not buffered).
465
513
  **Use Cases**: Project activity summary, team updates, blocker detection, weekly reports
466
514
 
@@ -471,7 +519,7 @@ Fetches comments, status changes, priority changes, and assignee changes - forma
471
519
  | projectKey | string | ✗ | Filter by project key |
472
520
  | jql | string | ✗ | Full JQL query for flexible scoping |
473
521
  | issueKeys | string[] | ✗ | Specific issue keys to include |
474
- | since | string | ✗ | Time range: "1d", "7d", "30d", or ISO date (default: "7d") |
522
+ | since | string | ✗ | Time range: "7d", "30d", "365d", or ISO date (default: "30d"). Provide explicitly for accurate results. |
475
523
  | includeComments | boolean | ✗ | Include comments (default: true) |
476
524
  | includeStatusChanges | boolean | ✗ | Include status changes (default: true) |
477
525
  | includePriorityChanges | boolean | ✗ | Include priority changes (default: true) |
@@ -501,27 +549,27 @@ Fetches comments, status changes, priority changes, and assignee changes - forma
501
549
 
502
550
  ---
503
551
 
504
- ### 22. jira_get_recent_comments
505
- **Description**: Get comments across multiple issues for discussion analysis. Returns DIRECTLY (not buffered).
506
- **Use Cases**: Discussion summaries, finding comments about specific topics, tracking team communication
552
+ ### jira_get_recent_comments
553
+ **Description**: Get comments across multiple issues for analysis. Returns buffered data.
554
+ **Use Cases**: Comment statistics (top commenters), discussion analysis, finding comments about specific topics
507
555
 
508
556
  | Parameter | Type | Required | Description |
509
557
  |-----------|------|----------|-------------|
510
558
  | projectKey | string | ✗ | Filter by project key |
511
559
  | jql | string | ✗ | Full JQL query for flexible scoping |
512
560
  | issueKeys | string[] | ✗ | Specific issue keys to include |
513
- | since | string | ✗ | Time range: "1d", "7d", "30d", or ISO date (default: "7d") |
561
+ | since | string | ✗ | Time range: "7d", "30d", "365d", or ISO date (default: "30d"). Provide explicitly for accurate results. |
514
562
  | authorKey | string | ✗ | Filter by comment author username |
515
- | maxComments | number | ✗ | Maximum comments to return (default: 30) |
516
- | includeContext | boolean | ✗ | Include issue summary/status (default: true) |
563
+ | maxComments | number | ✗ | Maximum comments to return (default: all) |
517
564
 
518
565
  **At least one scoping parameter required**: `projectKey`, `jql`, or `issueKeys`
519
566
 
520
- **Returns**: Markdown-formatted comments grouped by issue with summary statistics.
567
+ **Returns**: bufferId with `jira_comment` schema (issueKey, issueSummary, author, authorEmail, body, created, updated).
568
+ **Next**: `buffer_transform` for stats/tables, `buffer_grep` to search comments.
521
569
 
522
570
  ---
523
571
 
524
- ### 23. jira_get_changelog
572
+ ### jira_get_changelog
525
573
  **Description**: Get field changes across issues for tracking what happened. Returns DIRECTLY (not buffered).
526
574
  **Use Cases**: Status change tracking, priority escalation analysis, assignment history
527
575
 
@@ -530,7 +578,7 @@ Fetches comments, status changes, priority changes, and assignee changes - forma
530
578
  | projectKey | string | ✗ | Filter by project key |
531
579
  | jql | string | ✗ | Full JQL query for flexible scoping |
532
580
  | issueKeys | string[] | ✗ | Specific issue keys to include |
533
- | since | string | ✗ | Time range: "1d", "7d", "30d", or ISO date (default: "7d") |
581
+ | since | string | ✗ | Time range: "7d", "30d", "365d", or ISO date (default: "30d"). Provide explicitly for accurate results. |
534
582
  | fields | string[] | ✗ | Fields to track (default: ["status", "priority", "assignee", "resolution"]) |
535
583
  | maxChanges | number | ✗ | Maximum changes to return (default: 50) |
536
584
 
@@ -551,7 +599,7 @@ Fetches comments, status changes, priority changes, and assignee changes - forma
551
599
 
552
600
  ---
553
601
 
554
- ### 24. jira_analyze_epic
602
+ ### jira_analyze_epic
555
603
  **Description**: Comprehensive Epic/Feature analysis for LLM insights. Returns DIRECTLY (not buffered).
556
604
  **Use Cases**: Epic progress analysis, velocity tracking, time metrics, feature status
557
605
 
@@ -596,7 +644,7 @@ Currently **3 issues** are in progress.
596
644
 
597
645
  ---
598
646
 
599
- ### 25. jira_epic_summary
647
+ ### jira_epic_summary
600
648
  **Description**: Lightweight Epic/Initiative summary with hierarchy and status breakdown. Returns DIRECTLY (not buffered).
601
649
  **Use Cases**: Quick Epic overview, status breakdown, cross-project dependencies
602
650
 
@@ -643,7 +691,7 @@ Provides quick overview without the heavy metrics of `jira_analyze_epic` - no ti
643
691
 
644
692
  ---
645
693
 
646
- ### 26. jira_analyze_sprint
694
+ ### jira_analyze_sprint
647
695
  **Description**: Comprehensive Sprint analysis for LLM insights. Returns DIRECTLY (not buffered).
648
696
  **Use Cases**: Sprint progress, risk assessment, team workload, daily standups
649
697
 
@@ -730,11 +778,12 @@ Time tracking shows **71% of estimate used** for **65% completion**.
730
778
 
731
779
  ---
732
780
 
733
- ## Confluence Tools (21)
781
+ ## Confluence Tools (20)
734
782
 
735
- ### 1. confluence_search_content
783
+ ### confluence_search_content
736
784
  **Description**: Search Confluence content using CQL. Auto-fetches all results.
737
785
  **Use Cases**: Find pages, search by keyword, filter by space
786
+ **CQL Syntax**: See `help(topic="cql")` for valid fields and examples.
738
787
 
739
788
  | Parameter | Type | Required | Description |
740
789
  |-----------|------|----------|-------------|
@@ -745,7 +794,7 @@ Time tracking shows **71% of estimate used** for **65% completion**.
745
794
 
746
795
  ---
747
796
 
748
- ### 2. confluence_get_page
797
+ ### confluence_get_page
749
798
  **Description**: Get a Confluence page by ID (PREFERRED when you have page ID)
750
799
  **Use Cases**: Read page content, prepare for editing
751
800
 
@@ -760,7 +809,7 @@ Time tracking shows **71% of estimate used** for **65% completion**.
760
809
 
761
810
  ---
762
811
 
763
- ### 3. confluence_get_page_by_title
812
+ ### confluence_get_page_by_title
764
813
  **Description**: Get a page by title and space (use ONLY when you don't have page ID)
765
814
  **Use Cases**: Find page by name, access documentation
766
815
 
@@ -776,7 +825,7 @@ Time tracking shows **71% of estimate used** for **65% completion**.
776
825
 
777
826
  ---
778
827
 
779
- ### 4. confluence_edit (RECOMMENDED)
828
+ ### confluence_edit (RECOMMENDED)
780
829
  **Description**: Smart page/draft loader - auto-resolves URLs, pageIds, draftIds, or SPACE/Title
781
830
  **Use Cases**: Edit any Confluence content with a single tool, handle URL input from users
782
831
 
@@ -826,7 +875,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
826
875
 
827
876
  ---
828
877
 
829
- ### 5. confluence_delete_page
878
+ ### confluence_delete_page
830
879
  **Description**: Delete a Confluence page
831
880
  **Use Cases**: Remove outdated content
832
881
 
@@ -836,7 +885,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
836
885
 
837
886
  ---
838
887
 
839
- ### 6. confluence_list_spaces
888
+ ### confluence_list_spaces
840
889
  **Description**: List all accessible Confluence spaces
841
890
  **Use Cases**: Discover available spaces, get space keys
842
891
 
@@ -848,7 +897,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
848
897
 
849
898
  ---
850
899
 
851
- ### 7. confluence_get_space
900
+ ### confluence_get_space
852
901
  **Description**: Get detailed information about a space
853
902
  **Use Cases**: View space details, get homepage
854
903
 
@@ -861,7 +910,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
861
910
 
862
911
  ---
863
912
 
864
- ### 8. confluence_get_page_children
913
+ ### confluence_get_page_children
865
914
  **Description**: Get all child pages of a page
866
915
  **Use Cases**: Navigate page hierarchy, list subpages
867
916
 
@@ -874,7 +923,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
874
923
 
875
924
  ---
876
925
 
877
- ### 9. confluence_add_comment
926
+ ### confluence_add_comment
878
927
  **Description**: Add a comment to a Confluence page
879
928
  **Use Cases**: Provide feedback, ask questions
880
929
 
@@ -885,7 +934,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
885
934
 
886
935
  ---
887
936
 
888
- ### 10. confluence_get_comments
937
+ ### confluence_get_comments
889
938
  **Description**: Get all comments on a Confluence page
890
939
  **Use Cases**: Read feedback, review discussions
891
940
 
@@ -897,7 +946,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
897
946
 
898
947
  ---
899
948
 
900
- ### 11. confluence_upload_attachment
949
+ ### confluence_upload_attachment
901
950
  **Description**: Upload an attachment to a Confluence page
902
951
  **Use Cases**: Attach documents, upload images
903
952
 
@@ -909,7 +958,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
909
958
 
910
959
  ---
911
960
 
912
- ### 12. confluence_list_attachments
961
+ ### confluence_list_attachments
913
962
  **Description**: List all attachments on a Confluence page
914
963
  **Use Cases**: View uploaded files, check attachments
915
964
 
@@ -921,23 +970,10 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
921
970
 
922
971
  ---
923
972
 
924
- ### 13. confluence_get_current_user_space
925
- **Description**: Get the current user's personal Confluence space
926
- **Use Cases**: Verify personal space before write operations, check space key for write-home restriction
927
-
928
- | Parameter | Type | Required | Description |
929
- |-----------|------|----------|-------------|
930
- | (none) | | | |
931
-
932
- **Response includes**: `spaceKey`, `spaceName`, `spaceType`, `homePageId`, `homePageTitle`
933
-
934
- **Tip**: Use this to find your personal space key when write-home restriction is enabled.
935
-
936
- ---
937
-
938
- ### 14. confluence_draft_list
939
- **Description**: List user's draft pages
973
+ ### confluence_draft_list
974
+ **Description**: List user's UNPUBLISHED draft pages (work-in-progress content)
940
975
  **Use Cases**: View pending drafts, find drafts to continue editing
976
+ **NOTE**: To find published pages you edited, use `confluence_search_content(cql="contributor=currentUser()")`
941
977
 
942
978
  | Parameter | Type | Required | Description |
943
979
  |-----------|------|----------|-------------|
@@ -947,7 +983,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
947
983
 
948
984
  ---
949
985
 
950
- ### 15. confluence_draft_open
986
+ ### confluence_draft_open
951
987
  **Description**: Load existing draft into buffer for editing
952
988
  **Use Cases**: Continue editing a draft, prepare draft for publishing
953
989
 
@@ -961,7 +997,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
961
997
 
962
998
  ---
963
999
 
964
- ### 16. confluence_draft_create
1000
+ ### confluence_draft_create
965
1001
  **Description**: Create a draft for user review - either a new page or as an edit to an existing page
966
1002
  **Use Cases**: Start new page as draft, edit existing page through draft workflow
967
1003
 
@@ -1023,7 +1059,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
1023
1059
 
1024
1060
  ---
1025
1061
 
1026
- ### 17. confluence_draft_save
1062
+ ### confluence_draft_save
1027
1063
  **Description**: Save buffer content to draft (delete + recreate pattern)
1028
1064
  **Use Cases**: Checkpoint work, persist edits before publishing
1029
1065
 
@@ -1041,7 +1077,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
1041
1077
 
1042
1078
  ---
1043
1079
 
1044
- ### 18. confluence_draft_delete
1080
+ ### confluence_draft_delete
1045
1081
  **Description**: Permanently delete a draft
1046
1082
  **Use Cases**: Clean up abandoned drafts, remove unwanted content
1047
1083
 
@@ -1053,7 +1089,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
1053
1089
 
1054
1090
  ---
1055
1091
 
1056
- ### 19. confluence_review_list
1092
+ ### confluence_review_list
1057
1093
  **Description**: List all "[jicon-mcp REVIEW]" drafts for cleanup or management
1058
1094
  **Use Cases**: Find abandoned review drafts, manage multiple review workflows, clean up after publishing
1059
1095
 
@@ -1067,7 +1103,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
1067
1103
 
1068
1104
  ---
1069
1105
 
1070
- ### 20. confluence_review_publish
1106
+ ### confluence_review_publish
1071
1107
  **Description**: Publish a review draft to apply changes to the original page
1072
1108
  **Use Cases**: Apply reviewed changes to the original page, complete the review workflow
1073
1109
 
@@ -1087,7 +1123,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
1087
1123
 
1088
1124
  ---
1089
1125
 
1090
- ### 21. confluence_review_discard
1126
+ ### confluence_review_discard
1091
1127
  **Description**: Discard a review draft without applying changes to the original page
1092
1128
  **Use Cases**: Cancel a review, abandon changes, clean up unwanted review drafts
1093
1129
 
@@ -1108,7 +1144,7 @@ buffer_edit(bufferId=pageBuffer, after=5, fromBufferId=newContentBuffer)
1108
1144
 
1109
1145
  ### JQL (Jira Query Language) Examples
1110
1146
 
1111
- > **Note**: Type, status, and priority names below are in English. Use `jira_get_issue_types()` and `jira_get_fields()` to discover actual names for your Jira instance. Functions like `currentUser()`, `openSprints()`, `startOfDay()` work in all languages.
1147
+ > **Note**: Type, status, and priority names below are in English. Use `jira_get_issue_types()` and `jira_get_fields(search="epic")` to discover actual names for your Jira instance. Functions like `currentUser()`, `openSprints()`, `startOfDay()` work in all languages.
1112
1148
 
1113
1149
  ```jql
1114
1150
  # Find open bugs assigned to you
@@ -1212,7 +1248,7 @@ AND lastModified >= now("-30d")
1212
1248
 
1213
1249
  ## Tempo Tools (13)
1214
1250
 
1215
- ### 1. tempo_get_worklogs
1251
+ ### tempo_get_worklogs
1216
1252
  **Description**: Get Tempo worklogs with filters
1217
1253
  **Use Cases**: View time entries, generate reports, review team work
1218
1254
 
@@ -1230,7 +1266,7 @@ AND lastModified >= now("-30d")
1230
1266
 
1231
1267
  ---
1232
1268
 
1233
- ### 2. tempo_get_worklog
1269
+ ### tempo_get_worklog
1234
1270
  **Description**: Get detailed information about a specific worklog entry
1235
1271
  **Use Cases**: View worklog details, check time logged
1236
1272
 
@@ -1242,7 +1278,7 @@ AND lastModified >= now("-30d")
1242
1278
 
1243
1279
  ---
1244
1280
 
1245
- ### 3. tempo_log_work
1281
+ ### tempo_log_work
1246
1282
  **Description**: Log time to a Jira issue
1247
1283
  **Use Cases**: Record work time, track daily activities
1248
1284
 
@@ -1257,7 +1293,7 @@ AND lastModified >= now("-30d")
1257
1293
 
1258
1294
  ---
1259
1295
 
1260
- ### 4. tempo_update_worklog
1296
+ ### tempo_update_worklog
1261
1297
  **Description**: Update an existing worklog entry
1262
1298
  **Use Cases**: Correct time logged, update descriptions
1263
1299
 
@@ -1273,7 +1309,7 @@ AND lastModified >= now("-30d")
1273
1309
 
1274
1310
  ---
1275
1311
 
1276
- ### 5. tempo_delete_worklog
1312
+ ### tempo_delete_worklog
1277
1313
  **Description**: Delete a worklog entry
1278
1314
  **Use Cases**: Remove incorrect entries
1279
1315
 
@@ -1283,7 +1319,7 @@ AND lastModified >= now("-30d")
1283
1319
 
1284
1320
  ---
1285
1321
 
1286
- ### 6. tempo_get_accounts
1322
+ ### tempo_get_accounts
1287
1323
  **Description**: Get all Tempo accounts
1288
1324
  **Use Cases**: List accounts for time tracking, find account keys
1289
1325
 
@@ -1295,7 +1331,7 @@ AND lastModified >= now("-30d")
1295
1331
 
1296
1332
  ---
1297
1333
 
1298
- ### 7. tempo_get_account
1334
+ ### tempo_get_account
1299
1335
  **Description**: Get detailed information about a Tempo account
1300
1336
  **Use Cases**: View account details, check status
1301
1337
 
@@ -1307,7 +1343,7 @@ AND lastModified >= now("-30d")
1307
1343
 
1308
1344
  ---
1309
1345
 
1310
- ### 8. tempo_get_teams
1346
+ ### tempo_get_teams
1311
1347
  **Description**: Get all Tempo teams
1312
1348
  **Use Cases**: List teams, find team IDs
1313
1349
 
@@ -1319,7 +1355,7 @@ AND lastModified >= now("-30d")
1319
1355
 
1320
1356
  ---
1321
1357
 
1322
- ### 9. tempo_get_team
1358
+ ### tempo_get_team
1323
1359
  **Description**: Get detailed information about a Tempo team
1324
1360
  **Use Cases**: View team details, check membership
1325
1361
 
@@ -1331,7 +1367,7 @@ AND lastModified >= now("-30d")
1331
1367
 
1332
1368
  ---
1333
1369
 
1334
- ### 10. tempo_get_team_worklogs
1370
+ ### tempo_get_team_worklogs
1335
1371
  **Description**: Get all worklogs for a team within a date range
1336
1372
  **Use Cases**: Team capacity reports, sprint reviews
1337
1373
 
@@ -1345,7 +1381,7 @@ AND lastModified >= now("-30d")
1345
1381
 
1346
1382
  ---
1347
1383
 
1348
- ### 11. tempo_get_user_info
1384
+ ### tempo_get_user_info
1349
1385
  **Description**: Get current user info (workerKey, username, accountId, displayName)
1350
1386
  **Use Cases**: Get workerKey for filtering worklogs, verify authentication
1351
1387
 
@@ -1357,7 +1393,7 @@ AND lastModified >= now("-30d")
1357
1393
 
1358
1394
  ---
1359
1395
 
1360
- ### 12. tempo_get_epic_worklogs
1396
+ ### tempo_get_epic_worklogs
1361
1397
  **Description**: Get all worklogs for an Epic and its child issues in one API call
1362
1398
  **Use Cases**: Epic time tracking, aggregate time reports, sprint cost analysis
1363
1399
 
@@ -1371,7 +1407,7 @@ AND lastModified >= now("-30d")
1371
1407
 
1372
1408
  ---
1373
1409
 
1374
- ### 13. tempo_get_top_worklogs
1410
+ ### tempo_get_top_worklogs
1375
1411
  **Description**: Get top issues or users by workload for a period. Returns DIRECTLY (not buffered).
1376
1412
  **Use Cases**: Top tickets by workload, most active contributors, time distribution analysis
1377
1413
 
@@ -1402,22 +1438,22 @@ Aggregates Tempo worklogs and returns ranked results in markdown format.
1402
1438
 
1403
1439
  ---
1404
1440
 
1405
- ## Buffer Tools (11)
1441
+ ## Buffer Tools (12)
1406
1442
 
1407
1443
  Buffer tools are used for local content management. All buffer operations are in-memory - write enforcement is on Jira/Confluence/Tempo tools.
1408
1444
 
1409
1445
  **XHTML Editing**: `buffer_edit` uses element IDs for precise positioning in XHTML content. Each element gets a unique ID when loaded - use `buffer_get_structure` to see them. `buffer_validate_xhtml` validates Confluence storage format. XHTML validation is also automatically applied before any Confluence write operation.
1410
1446
 
1411
- **Data Pipelines**: `buffer_pipeline` transforms JSON buffers (from Jira/Tempo searches) with server-side filtering, grouping, sorting, and output generation - minimizing token usage.
1447
+ **Data Transformation**: `buffer_transform` transforms JSON buffers (from Jira/Tempo searches) with JavaScript code for filtering, grouping, sorting, and output generation - minimizing token usage.
1412
1448
 
1413
- ### 1. buffer_create
1449
+ ### buffer_create
1414
1450
  **Description**: Create a new buffer with initial content. Returns bufferId and structure.
1415
1451
 
1416
1452
  **TIP**: Call `help(topic="storage")` for XHTML syntax. Call `help(topic="plantuml")` for diagram syntax.
1417
1453
 
1418
1454
  **Content types**:
1419
1455
  - **xhtml**: Confluence storage format. Returns element IDs for `buffer_edit`.
1420
- - **json**: JSON data (array or object). Use `buffer_get_items` to access, `buffer_pipeline` to transform.
1456
+ - **json**: JSON data (array or object). Use `buffer_get_items` to access, `buffer_transform` to transform.
1421
1457
 
1422
1458
  **Use Cases**: Draft new Confluence pages, prepare content before persisting, create JSON arrays for aggregation
1423
1459
 
@@ -1464,7 +1500,7 @@ buffer_create({ content: [{"key":"PROJ-1"}], contentType: "json" }) // Native
1464
1500
 
1465
1501
  ---
1466
1502
 
1467
- ### 2. buffer_get_items
1503
+ ### buffer_get_items
1468
1504
  **Description**: Retrieve items from a JSON buffer (arrays by index, objects by key).
1469
1505
  **Use Cases**: Iterate through search results, access object properties, process items in batches
1470
1506
 
@@ -1534,7 +1570,7 @@ buffer_get_items({ bufferId: "buf_xxx" })
1534
1570
 
1535
1571
  ---
1536
1572
 
1537
- ### 3. buffer_get_element
1573
+ ### buffer_get_element
1538
1574
  **Description**: Get the raw XHTML content of a specific element by ID. Use to inspect problematic elements when fixing XHTML parsing errors.
1539
1575
  **Use Cases**: Debug XHTML validation errors, inspect element content before editing, targeted error recovery
1540
1576
 
@@ -1567,7 +1603,7 @@ buffer_get_element({
1567
1603
 
1568
1604
  ---
1569
1605
 
1570
- ### 4. buffer_set_items
1606
+ ### buffer_set_items
1571
1607
  **Description**: Update or append items in a JSON buffer (arrays by ID/append, objects by key).
1572
1608
  **Use Cases**: Modify JSON data after processing, update specific fields, append new items to arrays, merge new data into objects
1573
1609
 
@@ -1631,19 +1667,19 @@ buffer_set_items({
1631
1667
 
1632
1668
  ---
1633
1669
 
1634
- ### 5. buffer_list
1635
- **Description**: List all active buffers with their metadata
1636
- **Use Cases**: View active buffers, check expiration times
1670
+ ### buffer_list
1671
+ **Description**: List all active buffers with their metadata. Buffers are cleaned up when session ends. Max buffers per session configurable via JICON_MAX_BUFFERS (default: 10); oldest unmodified evicted first when full.
1672
+ **Use Cases**: View active buffers, recover lost buffer IDs
1637
1673
 
1638
1674
  | Parameter | Type | Required | Description |
1639
1675
  |-----------|------|----------|-------------|
1640
1676
  | (none) | | | |
1641
1677
 
1642
- **Response includes**: `count`, list of buffers with `bufferId`, `totalSize`, `createdAt`, `expiresAt`, `metadata`
1678
+ **Response includes**: `count`, list of buffers with `bufferId`, `totalSize`, `createdAt`, `metadata`
1643
1679
 
1644
1680
  ---
1645
1681
 
1646
- ### 6. buffer_clear
1682
+ ### buffer_clear
1647
1683
  **Description**: Clear a specific buffer or all buffers
1648
1684
  **Use Cases**: Free up memory, clean up after processing
1649
1685
 
@@ -1655,7 +1691,7 @@ buffer_set_items({
1655
1691
 
1656
1692
  ---
1657
1693
 
1658
- ### 7. buffer_grep
1694
+ ### buffer_grep
1659
1695
  **Description**: Search buffered content for patterns. Supports regex, context lines (-A/-B/-C), and case-insensitive (-i). Large results are buffered.
1660
1696
  **Use Cases**: Find specific content in large responses, locate text for editing
1661
1697
 
@@ -1677,253 +1713,228 @@ buffer_set_items({
1677
1713
 
1678
1714
  ---
1679
1715
 
1680
- ### 8. buffer_pipeline
1681
- **Description**: Transform JSON buffer data with a declarative pipeline: select fields, filter, group/aggregate, sort, format, and output to various formats.
1682
- **Use Cases**: Server-side data transformation to minimize token usage, generate XHTML tables for Confluence, export to CSV/Markdown, aggregate statistics
1716
+ ### buffer_transform
1717
+ **Description**: Execute JavaScript code in a secure QuickJS sandbox to transform buffer data.
1718
+ **Use Cases**: Server-side data transformation with full JavaScript expressiveness, generate XHTML tables for Confluence, custom filtering/grouping/aggregation
1683
1719
 
1684
- **Token Efficiency**: A pipeline that filters, sorts, and outputs a table executes in **1 tool call** instead of iterating through items. For pure data transforms, this achieves **98% token reduction**.
1685
-
1686
- **Schema Quick Reference:**
1687
- ```json
1688
- {
1689
- "sourceBufferId": "buf_xxx",
1690
- "pipeline": {
1691
- "select": { "fields": [...] },
1692
- "filter": [...],
1693
- "groupBy": { "field": "...", "aggregations": [...] },
1694
- "sort": [...],
1695
- "limit": 10,
1696
- "format": [...],
1697
- "output": { "type": "xhtml_table", "table": {...} }
1698
- }
1699
- }
1700
- ```
1701
-
1702
- **Common Mistakes:**
1703
-
1704
- | Wrong | Correct | Why |
1705
- |-------|---------|-----|
1706
- | `sortBy: [...]` | `sort: [...]` | Key name is "sort" not "sortBy" |
1707
- | `transform: "map"` | `transform: "date"` | Valid: uppercase, lowercase, date, number, boolean, string |
1708
- | No `output` | `output: {...}` | Required field - pipeline must have output |
1709
- | `pipeline: "{...}"` | `pipeline: {...}` | Must be object, not JSON string |
1710
- | After select: `sort: [{field: "issueType"}]` | `sort: [{field: "Type"}]` | After `select` renames "issueType" to "Type", use NEW name |
1720
+ **Token Efficiency**: A transformation generates complete output in **1 tool call** instead of iterating through items. For pure data transforms, this achieves **98% token reduction**.
1711
1721
 
1712
1722
  | Parameter | Type | Required | Description |
1713
1723
  |-----------|------|----------|-------------|
1714
- | bufferId | string | ✓ | Source buffer ID containing JSON array |
1715
- | pipeline | object | ✓ | Pipeline definition (see below) |
1724
+ | inputs | object | ✓ | Map of variable name to buffer ID. Example: `{ issues: "buf_abc123" }` |
1725
+ | code | string | ✓ | JavaScript code to execute (ES2020, synchronous). Access inputs as globals, return value becomes output buffer. |
1726
+ | limits | object | ✗ | Optional `{ timeout: 5000, memory: 50000000 }` (default: 5s, 50MB) |
1716
1727
 
1717
- **Type Requirement**: Buffer must have `contentType: "json"`. Returns error if buffer is XHTML or plain text.
1728
+ **Type Requirement**: All input buffers must have `contentType: "json"`. Returns error if buffer is XHTML or plain text.
1718
1729
 
1719
- **Pipeline Definition:**
1730
+ **Built-in Helper Functions (available as globals):**
1720
1731
 
1721
- ```typescript
1722
- {
1723
- // Stage 1: Select specific fields (optional)
1724
- select?: {
1725
- fields: [
1726
- { from: "key" }, // Keep field as-is
1727
- { from: "priority.name", as: "Priority" }, // Rename field
1728
- { from: "created", transform: "date" } // Transform value
1729
- ]
1730
- },
1732
+ | Category | Function | Description |
1733
+ |----------|----------|-------------|
1734
+ | **Aggregation** | `groupBy(array, keyOrFn)` | Group array by field or function → `{ key: items[] }` |
1735
+ | | `sum(array, field?)` | Sum numeric values |
1736
+ | | `avg(array, field?)` | Average numeric values |
1737
+ | | `min(array, field?)` | Minimum value |
1738
+ | | `max(array, field?)` | Maximum value |
1739
+ | | `count(array)` | Count items |
1740
+ | | `unique(array, field?)` | Unique values |
1741
+ | **Object** | `get(obj, 'path.to.field')` | Deep get with dot notation |
1742
+ | | `pick(obj, ['a', 'b'])` | Pick specific keys |
1743
+ | | `omit(obj, ['a'])` | Omit specific keys |
1744
+ | **Date** | `parseDate(string)` | Parse date → timestamp (ms) |
1745
+ | | `formatDate(ts, fmt?)` | Format timestamp (fmt: 'date', 'time', 'datetime', 'iso') |
1746
+ | | `daysBetween(d1, d2)` | Days between two dates |
1747
+ | **Output** | `toTable(array, config)` | Generate Confluence XHTML table |
1748
+ | | `toList(array, config)` | Generate Confluence XHTML list |
1749
+ | | `toMarkdownTable(array, config)` | Generate Markdown table |
1750
+ | | `toMarkdownList(array, config)` | Generate Markdown list |
1731
1751
 
1732
- // Stage 2: Filter items (optional, AND logic between conditions)
1733
- filter?: [
1734
- { field: "status.name", operator: "ne", value: "Done" },
1735
- { field: "priority.name", operator: "in", value: ["High", "Critical"] }
1736
- ],
1752
+ **Context Variables (for link generation):**
1753
+ - `JIRA_URL` - Jira base URL (from server config)
1754
+ - `CONFLUENCE_URL` - Confluence base URL (from server config)
1737
1755
 
1738
- // Stage 3: Group and aggregate (optional)
1739
- groupBy?: {
1740
- field: "assignee.displayName",
1741
- aggregations: [
1742
- { function: "count", as: "totalIssues" },
1743
- { function: "sum", field: "timeSpent", as: "totalTime" },
1744
- { function: "list", field: "key", as: "issueKeys" }
1745
- ]
1746
- },
1756
+ **toTable() Configuration:**
1747
1757
 
1748
- // Stage 4: Sort results (optional)
1749
- sort?: [
1750
- { field: "priority.name", direction: "asc" },
1751
- { field: "key", direction: "desc" }
1758
+ ```javascript
1759
+ toTable(array, {
1760
+ title: 'Table Title', // Optional h2 above table
1761
+ showRowNumbers: true, // Add # column
1762
+ tableClass: 'confluenceTable', // CSS class
1763
+ columns: [
1764
+ { field: 'key', header: 'Issue', link: { type: 'jira' } },
1765
+ { field: 'summary', header: 'Summary', width: '40%' },
1766
+ { field: 'priority.name', header: 'Priority', align: 'center' }
1752
1767
  ],
1753
-
1754
- // Stage 5: Limit results (optional)
1755
- limit?: 50,
1756
-
1757
- // Stage 6: Conditional formatting (optional)
1758
- format?: [
1768
+ format: [ // Conditional styling
1759
1769
  {
1760
- condition: { field: "priority.name", operator: "eq", value: "High" },
1761
- style: { color: "#dc3545", bold: true }
1762
- },
1763
- {
1764
- condition: { field: "status.name", operator: "eq", value: "Done" },
1765
- style: { color: "#28a745", icon: "✓" }
1770
+ condition: { field: 'priority.name', operator: 'eq', value: 'Blocker' },
1771
+ style: { color: '#d04437', bold: true, icon: '🔴' },
1772
+ fields: ['priority.name'] // Apply to specific fields (or omit for row)
1766
1773
  }
1767
- ],
1774
+ ]
1775
+ })
1776
+ ```
1768
1777
 
1769
- // Stage 7: Output configuration (REQUIRED)
1770
- output: {
1771
- type: "xhtml_table", // or "xhtml_list", "json", "csv", "markdown"
1772
- table: {
1773
- title: "Open Issues",
1774
- columns: [
1775
- { field: "key", header: "Issue", link: { type: "jira" } },
1776
- { field: "summary", header: "Summary" },
1777
- { field: "priority.name", header: "Priority" }
1778
- ]
1778
+ **toList() Configuration:**
1779
+
1780
+ ```javascript
1781
+ toList(array, {
1782
+ title: 'List Title',
1783
+ style: 'bullet', // 'bullet', 'numbered', 'none'
1784
+ template: '{{key}}: {{summary}} ({{assignee.displayName}})'
1785
+ })
1786
+ ```
1787
+
1788
+ **toMarkdownTable() Configuration:**
1789
+
1790
+ ```javascript
1791
+ toMarkdownTable(array, {
1792
+ title: 'Table Title', // Optional ## heading
1793
+ showRowNumbers: true, // Add # column
1794
+ columns: [
1795
+ { field: 'key', header: 'Issue', link: { type: 'jira' } },
1796
+ { field: 'summary', header: 'Summary' },
1797
+ { field: 'priority.name', header: 'Priority', align: 'center' }
1798
+ ],
1799
+ format: [ // Conditional styling (bold/italic in Markdown)
1800
+ {
1801
+ condition: { field: 'priority.name', operator: 'eq', value: 'Blocker' },
1802
+ style: { bold: true, icon: '🔴' },
1803
+ fields: ['priority.name']
1779
1804
  }
1780
- }
1781
- }
1805
+ ]
1806
+ })
1807
+ // Returns: { __markdown: true, content: "| # | Issue | Summary |..." }
1782
1808
  ```
1783
1809
 
1784
- **Filter Operators:**
1785
-
1786
- | Operator | Description | Example |
1787
- |----------|-------------|---------|
1788
- | `eq` | Equals | `{ field: "status.name", operator: "eq", value: "Open" }` |
1789
- | `ne` | Not equals | `{ field: "status.name", operator: "ne", value: "Done" }` |
1790
- | `gt`, `lt`, `gte`, `lte` | Numeric comparison | `{ field: "priority.id", operator: "gt", value: 2 }` |
1791
- | `contains` | Substring match (case-insensitive) | `{ field: "summary", operator: "contains", value: "bug" }` |
1792
- | `startsWith`, `endsWith` | String prefix/suffix | `{ field: "key", operator: "startsWith", value: "PROJ-" }` |
1793
- | `in`, `notIn` | Value in array | `{ field: "priority.name", operator: "in", value: ["High", "Critical"] }` |
1794
- | `exists`, `notExists` | Field presence | `{ field: "assignee", operator: "exists" }` |
1795
- | `empty`, `notEmpty` | Empty string/array/null | `{ field: "labels", operator: "notEmpty" }` |
1796
- | `regex` | Regular expression | `{ field: "summary", operator: "regex", value: "^\\[BUG\\]" }` |
1797
-
1798
- **Aggregation Functions:**
1799
-
1800
- | Function | Description | Requires `field` |
1801
- |----------|-------------|------------------|
1802
- | `count` | Count items in group | No |
1803
- | `sum` | Sum numeric values | Yes |
1804
- | `avg` | Average numeric values | Yes |
1805
- | `min`, `max` | Min/max numeric values | Yes |
1806
- | `first`, `last` | First/last value | Yes |
1807
- | `list` | Collect all values | Yes |
1808
- | `unique` | Unique values | Yes |
1809
-
1810
- **Output Types:**
1811
-
1812
- | Type | Description | Config |
1813
- |------|-------------|--------|
1814
- | `xhtml_table` | Confluence-compatible table | `table: { title?, columns: [...], showRowNumbers? }` |
1815
- | `xhtml_list` | Confluence-compatible list | `list: { title?, template: "{{key}}: {{summary}}", style?: "bullet"|"numbered"|"none" }` |
1816
- | `json` | Clean JSON array | `includeMetadata?: boolean` |
1817
- | `csv` | CSV with headers | `table: { columns: [...] }` |
1818
- | `markdown` | Markdown table | `table: { columns: [...] }` |
1819
-
1820
- **Column Configuration:**
1810
+ **toMarkdownList() Configuration:**
1821
1811
 
1822
- ```typescript
1823
- {
1824
- field: "key", // Field path (dot notation)
1825
- header: "Issue", // Column header text
1826
- link?: { type: "jira" }, // Auto-link (jira, confluence, url)
1827
- width?: "100px", // Column width
1828
- align?: "left" | "center" | "right"
1829
- }
1812
+ ```javascript
1813
+ toMarkdownList(array, {
1814
+ title: 'List Title',
1815
+ style: 'bullet', // 'bullet', 'numbered', 'task'
1816
+ template: '{{key}}: {{summary}} ({{assignee.displayName}})'
1817
+ })
1818
+ // Returns: { __markdown: true, content: "- PROJ-1: Fix bug..." }
1830
1819
  ```
1831
1820
 
1832
- **Response includes**: `bufferId` (new output buffer), `inputItems`, `outputItems`, `pipelineStages`, `outputType`, `preview`, `bufferSizeBytes`, `structure` (for XHTML), `hint`
1821
+ **Link Types:**
1822
+ - `jira` - Auto-links to Jira issue using `key` field
1823
+ - `confluence` - Links to Confluence page by ID
1824
+ - `custom` - Custom URL template with `{{field}}` placeholders
1825
+
1826
+ **Format Condition Operators:** `eq`, `ne`, `gt`, `lt`, `gte`, `lte`, `contains`, `startsWith`, `endsWith`, `in`, `notIn`, `exists`, `notExists`, `regex`, `empty`, `notEmpty`
1827
+
1828
+ **Response includes**: `bufferId` (new output buffer), `contentType` (json, xhtml, or markdown), `itemCount` (for arrays), `hint`
1833
1829
 
1834
1830
  **Example - Filter and output table:**
1835
- ```typescript
1831
+ ```javascript
1836
1832
  // Search returns bufferId with 500 issues
1837
1833
  jira_search_issues({ jql: "project = PROJ" })
1838
1834
  // -> { bufferId: "buf_issues", structure: { itemCount: 500 } }
1839
1835
 
1840
1836
  // Transform in ONE call (instead of iterating 500 items)
1841
- buffer_pipeline({
1842
- bufferId: "buf_issues",
1843
- pipeline: {
1844
- filter: [
1845
- { field: "issuetype.name", operator: "eq", value: "Bug" },
1846
- { field: "status.name", operator: "ne", value: "Done" }
1847
- ],
1848
- sort: [{ field: "priority.name", direction: "asc" }],
1849
- limit: 20,
1850
- format: [
1851
- { condition: { field: "priority.name", operator: "eq", value: "High" },
1852
- style: { color: "#dc3545", bold: true } }
1853
- ],
1854
- output: {
1855
- type: "xhtml_table",
1856
- table: {
1857
- title: "Top 20 Open Bugs",
1858
- columns: [
1859
- { field: "key", header: "Issue", link: { type: "jira" } },
1860
- { field: "summary", header: "Summary" },
1861
- { field: "priority.name", header: "Priority" },
1862
- { field: "assignee.displayName", header: "Assignee" }
1863
- ]
1864
- }
1865
- }
1866
- }
1837
+ buffer_transform({
1838
+ inputs: { issues: "buf_issues" },
1839
+ code: `
1840
+ const bugs = issues.filter(i =>
1841
+ i.issuetype?.name === 'Bug' &&
1842
+ i.status?.name !== 'Done'
1843
+ );
1844
+ bugs.sort((a, b) => (a.priority?.id || 0) - (b.priority?.id || 0));
1845
+ const top20 = bugs.slice(0, 20);
1846
+
1847
+ return toTable(top20, {
1848
+ title: 'Top 20 Open Bugs',
1849
+ columns: [
1850
+ { field: 'key', header: 'Issue', link: { type: 'jira' } },
1851
+ { field: 'summary', header: 'Summary' },
1852
+ { field: 'priority.name', header: 'Priority' },
1853
+ { field: 'assignee.displayName', header: 'Assignee' }
1854
+ ],
1855
+ format: [
1856
+ { condition: { field: 'priority.name', operator: 'eq', value: 'High' },
1857
+ style: { color: '#dc3545', bold: true } }
1858
+ ]
1859
+ });
1860
+ `
1867
1861
  })
1868
- // -> { bufferId: "buf_result", outputItems: 15, preview: "<table>...", structure: [...] }
1862
+ // -> { bufferId: "buf_result", contentType: "xhtml" }
1869
1863
  ```
1870
1864
 
1871
- **Example - Group by assignee with aggregations:**
1872
- ```typescript
1873
- buffer_pipeline({
1874
- bufferId: "buf_issues",
1875
- pipeline: {
1876
- filter: [{ field: "status.name", operator: "ne", value: "Done" }],
1877
- groupBy: {
1878
- field: "assignee.displayName",
1879
- aggregations: [
1880
- { function: "count", as: "issueCount" },
1881
- { function: "list", field: "key", as: "issues" }
1865
+ **Example - Group by assignee with statistics:**
1866
+ ```javascript
1867
+ buffer_transform({
1868
+ inputs: { issues: "buf_issues" },
1869
+ code: `
1870
+ const open = issues.filter(i => i.status?.name !== 'Done');
1871
+ const byAssignee = groupBy(open, 'assignee.displayName');
1872
+
1873
+ const stats = Object.entries(byAssignee).map(([name, items]) => ({
1874
+ assignee: name || 'Unassigned',
1875
+ count: items.length,
1876
+ issues: items.map(i => i.key).join(', ')
1877
+ }));
1878
+
1879
+ stats.sort((a, b) => b.count - a.count);
1880
+
1881
+ return toTable(stats, {
1882
+ title: 'Issues by Assignee',
1883
+ columns: [
1884
+ { field: 'assignee', header: 'Assignee' },
1885
+ { field: 'count', header: 'Count', align: 'right' },
1886
+ { field: 'issues', header: 'Issue Keys' }
1882
1887
  ]
1883
- },
1884
- sort: [{ field: "issueCount", direction: "desc" }],
1885
- output: {
1886
- type: "xhtml_table",
1887
- table: {
1888
- title: "Issues by Assignee",
1889
- columns: [
1890
- { field: "displayName", header: "Assignee" },
1891
- { field: "issueCount", header: "Count" },
1892
- { field: "issues", header: "Issues" }
1893
- ]
1894
- }
1895
- }
1896
- }
1888
+ });
1889
+ `
1897
1890
  })
1898
1891
  ```
1899
1892
 
1900
- **Example - Export to CSV:**
1901
- ```typescript
1902
- buffer_pipeline({
1903
- bufferId: "buf_issues",
1904
- pipeline: {
1905
- select: {
1906
- fields: [
1907
- { from: "key" },
1908
- { from: "summary" },
1909
- { from: "status.name", as: "Status" },
1910
- { from: "created", transform: "date" }
1893
+ **Example - Return JSON for further processing:**
1894
+ ```javascript
1895
+ buffer_transform({
1896
+ inputs: { issues: "buf_issues" },
1897
+ code: `
1898
+ const summary = issues.map(i => ({
1899
+ key: i.key,
1900
+ summary: i.summary,
1901
+ status: i.status?.name,
1902
+ priority: i.priority?.name
1903
+ }));
1904
+ return summary; // Returns JSON buffer, not XHTML
1905
+ `
1906
+ })
1907
+ // -> { bufferId: "buf_result", contentType: "json", itemCount: 500 }
1908
+ ```
1909
+
1910
+ **Example - Markdown table output:**
1911
+ ```javascript
1912
+ buffer_transform({
1913
+ inputs: { issues: "buf_issues" },
1914
+ code: `
1915
+ const open = issues.filter(i => i.status?.name !== 'Done');
1916
+ return toMarkdownTable(open.slice(0, 20), {
1917
+ title: 'Open Issues',
1918
+ columns: [
1919
+ { field: 'key', header: 'Issue', link: { type: 'jira' } },
1920
+ { field: 'summary', header: 'Summary' },
1921
+ { field: 'status.name', header: 'Status' },
1922
+ { field: 'priority.name', header: 'Priority', align: 'center' }
1923
+ ],
1924
+ format: [
1925
+ { condition: { field: 'priority.name', operator: 'eq', value: 'High' },
1926
+ style: { bold: true, icon: '🔴' } }
1911
1927
  ]
1912
- },
1913
- output: {
1914
- type: "csv",
1915
- table: {
1916
- columns: [
1917
- { field: "key", header: "Issue" },
1918
- { field: "summary", header: "Summary" },
1919
- { field: "Status", header: "Status" },
1920
- { field: "created", header: "Created" }
1921
- ]
1922
- }
1923
- }
1924
- }
1928
+ });
1929
+ `
1925
1930
  })
1926
- // -> { bufferId: "buf_csv", output: "Issue,Summary,Status,Created\nPROJ-1,..." }
1931
+ // -> { bufferId: "buf_result", contentType: "markdown" }
1932
+ // Output:
1933
+ // ## Open Issues
1934
+ //
1935
+ // | Issue | Summary | Status | Priority |
1936
+ // | --- | --- | --- | :--: |
1937
+ // | [PROJ-1](https://jira.example.com/browse/PROJ-1) | Fix login bug | Open | 🔴 **High** |
1927
1938
  ```
1928
1939
 
1929
1940
  **Common Jira Fields:**
@@ -1932,12 +1943,12 @@ buffer_pipeline({
1932
1943
  - `assignee.displayName`, `reporter.displayName`
1933
1944
  - `created`, `updated`, `resolutiondate`
1934
1945
  - `labels` (array), `components[].name`
1935
- - `timeoriginalestimate`, `timeestimate`, `timespent`
1946
+ - `timeoriginalestimate`, `timeestimate`, `timespent` (often null — use `buffer_get_schema` to check `optional` flag)
1936
1947
 
1937
1948
  **Workflow - Jira to Confluence table:**
1938
1949
  ```
1939
1950
  1. jira_search_issues(jql) → bufferId with JSON
1940
- 2. buffer_pipeline(bufferId, pipeline) → bufferId with XHTML table
1951
+ 2. buffer_transform(inputs, code) → bufferId with XHTML table
1941
1952
  3. confluence_edit(pageId) → page bufferId
1942
1953
  4. buffer_edit(pageBufferId, after=ID, fromBufferId=tableBufferId)
1943
1954
  5. confluence_draft_create(pageId, pageBufferId) → draft for review
@@ -1945,7 +1956,7 @@ buffer_pipeline({
1945
1956
 
1946
1957
  ---
1947
1958
 
1948
- ### 9. buffer_edit
1959
+ ### buffer_edit
1949
1960
  **Description**: Edit buffer content. For XHTML: use element IDs (single or batch). For plain/json: use string replacement or append.
1950
1961
  **Use Cases**: Insert/replace/remove elements in Confluence pages, modify Jira/Tempo content, compose content from multiple buffers
1951
1962
 
@@ -2077,7 +2088,7 @@ confluence_draft_create({ pageId: "123", bufferId: "buf_A" })
2077
2088
 
2078
2089
  ---
2079
2090
 
2080
- ### 10. buffer_get_structure
2091
+ ### buffer_get_structure
2081
2092
  **Description**: Get current element structure for an XHTML buffer
2082
2093
  **Use Cases**: View element IDs for editing, understand document structure
2083
2094
 
@@ -2111,7 +2122,7 @@ buffer_get_structure({ bufferId: "buf_xxx" })
2111
2122
 
2112
2123
  ---
2113
2124
 
2114
- ### 11. buffer_validate_xhtml
2125
+ ### buffer_validate_xhtml
2115
2126
  **Description**: Validate buffered content as Confluence storage format (XHTML)
2116
2127
  **Use Cases**: Check content validity before writing, debug validation errors
2117
2128
 
@@ -2139,11 +2150,95 @@ buffer_get_structure({ bufferId: "buf_xxx" })
2139
2150
 
2140
2151
  ---
2141
2152
 
2153
+ ### buffer_get_schema
2154
+ **Description**: Get the schema for a JSON buffer. Returns field names, types, and sample values from the actual data.
2155
+ **Use Cases**: Understand buffer structure before writing `buffer_transform` code, discover available fields for data processing
2156
+
2157
+ | Parameter | Type | Required | Description |
2158
+ |-----------|------|----------|-------------|
2159
+ | bufferId | string | ✓ | Buffer ID to get schema for |
2160
+
2161
+ **Type Requirement**: Buffer must have `contentType: "json"`. Returns error if buffer is XHTML.
2162
+
2163
+ **Schema Types**: Buffers from API tools have a named schema type (e.g., `jira_issue`, `tempo_worklog`, `confluence_page`). The schema defines all available fields with consistent structure.
2164
+
2165
+ **Available Schema Types**:
2166
+ | Schema Type | Tools That Return It |
2167
+ |-------------|---------------------|
2168
+ | `jira_issue` | `jira_search_issues`, `jira_get_issue`, `jira_get_issues`, `jira_list_epic_children`, `jira_get_sprint_issues` |
2169
+ | `jira_comment` | `jira_get_issue_comments` |
2170
+ | `jira_project` | `jira_list_projects`, `jira_get_project` |
2171
+ | `jira_board` | `jira_get_board` |
2172
+ | `jira_sprint` | `jira_get_sprints` |
2173
+ | `jira_worklog` | `jira_get_issue_worklogs` |
2174
+ | `jira_worklog_total` | `jira_get_total_worklogs` |
2175
+ | `tempo_worklog` | `tempo_get_worklogs`, `tempo_get_worklog`, `tempo_get_team_worklogs`, `tempo_get_epic_worklogs` |
2176
+ | `tempo_account` | `tempo_get_accounts`, `tempo_get_account` |
2177
+ | `tempo_team` | `tempo_get_teams`, `tempo_get_team` |
2178
+ | `confluence_page` | `confluence_search_content`, `confluence_get_page_children` |
2179
+ | `confluence_space` | `confluence_list_spaces`, `confluence_get_space` |
2180
+ | `confluence_comment` | `confluence_get_comments` |
2181
+ | `confluence_attachment` | `confluence_list_attachments` |
2182
+ | `confluence_draft` | `confluence_draft_list` |
2183
+
2184
+ **Response includes**: `bufferId`, `schemaType`, `description`, `itemCount` (for arrays), `legend` (property definitions), `fields` (with type, required, optional, searchable, writable, jqlName, description, sample)
2185
+
2186
+ **Field Properties**:
2187
+ | Property | Meaning |
2188
+ |----------|---------|
2189
+ | `required` | Always present with a non-null value |
2190
+ | `optional` | May be null when not set — use `== null` to check |
2191
+ | `searchable` | Can be used in JQL/CQL queries |
2192
+ | `writable` | Can be set via update API |
2193
+ | `jqlName` | JQL clause name when different from field name (e.g., `type` → `issuetype`) |
2194
+
2195
+ **Example - Get schema before writing transform code:**
2196
+ ```typescript
2197
+ // 1. Search returns bufferId with schemaType in response
2198
+ jira_search_issues({ jql: "project=PROJ" })
2199
+ // Returns: { bufferId: "buf_xxx", schemaType: "jira_issue", fields: ["key", "summary", "status", ...] }
2200
+
2201
+ // 2. Get detailed schema with samples
2202
+ buffer_get_schema({ bufferId: "buf_xxx" })
2203
+ // Returns: {
2204
+ // bufferId: "buf_xxx",
2205
+ // schemaType: "jira_issue",
2206
+ // description: "Jira issue with core fields flattened for easy access",
2207
+ // itemCount: 45,
2208
+ // legend: { required: "Always present...", optional: "May be null...", ... },
2209
+ // fields: {
2210
+ // key: { type: "string", required: true, searchable: true, description: "Issue key (e.g., PROJ-123)", sample: "PROJ-123" },
2211
+ // summary: { type: "string", required: true, searchable: true, writable: true, description: "Issue title/summary", sample: "Fix login bug" },
2212
+ // status: { type: "string", required: true, searchable: true, description: "Current status name", sample: "In Progress" },
2213
+ // type: { type: "string", required: true, searchable: true, writable: true, jqlName: "issuetype", description: "Issue type name", sample: "Bug" },
2214
+ // assignee: { type: "string", required: false, optional: true, searchable: true, writable: true, description: "Assignee display name", sample: "John Doe" },
2215
+ // ...
2216
+ // }
2217
+ // }
2218
+
2219
+ // 3. Now write accurate transform code using flat field names
2220
+ buffer_transform({
2221
+ inputs: [{ bufferId: "buf_xxx" }],
2222
+ code: `return toMarkdownTable(issues, {
2223
+ columns: [
2224
+ { field: 'key', header: 'Key' },
2225
+ { field: 'summary', header: 'Summary' },
2226
+ { field: 'status', header: 'Status' },
2227
+ { field: 'assignee', header: 'Assignee' }
2228
+ ]
2229
+ });`
2230
+ })
2231
+ ```
2232
+
2233
+ **Key Benefit**: All tools returning the same schemaType produce identical field structure. Once you learn `jira_issue` fields, the same structure works for `jira_search_issues`, `jira_get_issue`, `jira_list_epic_children`, and `jira_get_sprint_issues`.
2234
+
2235
+ ---
2236
+
2142
2237
  ## Workload Tools (2)
2143
2238
 
2144
2239
  Utility tools for time calculations. Always available with any Jira, Confluence, or Tempo action.
2145
2240
 
2146
- ### 1. workload_convert
2241
+ ### workload_convert
2147
2242
  **Description**: Convert workload time between units (seconds, hours, days)
2148
2243
  **Use Cases**: Convert time values for display, calculate work estimates
2149
2244
 
@@ -2157,7 +2252,7 @@ Utility tools for time calculations. Always available with any Jira, Confluence,
2157
2252
 
2158
2253
  ---
2159
2254
 
2160
- ### 2. workload_sum
2255
+ ### workload_sum
2161
2256
  **Description**: Sum multiple workload values and return total in all units
2162
2257
  **Use Cases**: Calculate total time from multiple entries, aggregate worklogs
2163
2258
 
@@ -2174,7 +2269,7 @@ Utility tools for time calculations. Always available with any Jira, Confluence,
2174
2269
 
2175
2270
  Utility tools for URL construction and parsing. Always available with any Jira, Confluence, or Tempo action.
2176
2271
 
2177
- ### 1. fullurl
2272
+ ### fullurl
2178
2273
  **Description**: Convert Jira issue keys, Confluence page IDs, or relative paths into full URLs
2179
2274
  **Use Cases**: Generate clickable links for display, resolve relative Confluence paths
2180
2275
 
@@ -2203,7 +2298,7 @@ fullurl("/display/DOCS/Home") // → https://confluence.example.com/display/DOCS
2203
2298
 
2204
2299
  ---
2205
2300
 
2206
- ### 2. parseurl
2301
+ ### parseurl
2207
2302
  **Description**: Parse a Jira or Confluence URL to extract identifiers (pageId, issueKey, draftId, etc.)
2208
2303
  **Use Cases**: Extract IDs from URLs users share, prepare input for other tools
2209
2304
 
@@ -2238,7 +2333,7 @@ fullurl("/display/DOCS/Home") // → https://confluence.example.com/display/DOCS
2238
2333
 
2239
2334
  Unified help system for all Jicon workflows and syntax guides. Always available with any Jira, Confluence, or Tempo action.
2240
2335
 
2241
- ### 1. help
2336
+ ### help
2242
2337
  **Description**: Get Jicon MCP Server help - workflows and syntax guides
2243
2338
  **Use Cases**: Learn workflows, understand tool sequences, get syntax references
2244
2339
 
@@ -2284,7 +2379,7 @@ help(topic="analysis") // LLM analysis tools guide
2284
2379
 
2285
2380
  Date resolution utility for pre-computing date ranges. Always available with any Jira, Confluence, or Tempo action.
2286
2381
 
2287
- ### 1. date_resolve
2382
+ ### date_resolve
2288
2383
  **Description**: Resolve date expressions to concrete dates with business day counts
2289
2384
  **Use Cases**: Pre-compute date ranges for reports, time tracking, activity analysis
2290
2385
 
@@ -2332,6 +2427,50 @@ date_resolve(expression="this_month") // Current month to date
2332
2427
 
2333
2428
  ---
2334
2429
 
2430
+ ## Whoami Tools (1)
2431
+
2432
+ Unified user identity across all configured services.
2433
+
2434
+ ### whoami
2435
+ **Description**: Get the currently authenticated user from all configured services
2436
+ **Use Cases**: Verify credentials, get user keys for queries, check access across services
2437
+
2438
+ | Parameter | Type | Required | Description |
2439
+ |-----------|------|----------|-------------|
2440
+ | (none) | | | |
2441
+
2442
+ **Returns**: User info from each configured service:
2443
+ ```json
2444
+ {
2445
+ "jira": {
2446
+ "key": "JIRAUSER12345",
2447
+ "name": "john.doe",
2448
+ "displayName": "John Doe",
2449
+ "emailAddress": "john.doe@example.com"
2450
+ },
2451
+ "confluence": {
2452
+ "userKey": "JIRAUSER12345",
2453
+ "username": "john.doe",
2454
+ "displayName": "John Doe",
2455
+ "personalSpace": {
2456
+ "spaceKey": "~johndoe",
2457
+ "spaceName": "John Doe",
2458
+ "spaceType": "personal",
2459
+ "homePageId": "123456",
2460
+ "homePageTitle": "John Doe's Home"
2461
+ }
2462
+ }
2463
+ }
2464
+ ```
2465
+
2466
+ **Notes**:
2467
+ - Returns info from each configured service (Jira, Confluence)
2468
+ - Includes Confluence personal space info (for write-home restriction)
2469
+ - Errors are collected in `errors` array if any service fails
2470
+ - Available in all permission modes (readonly, full, custom)
2471
+
2472
+ ---
2473
+
2335
2474
  ## PlantUML Tools (3)
2336
2475
 
2337
2476
  PlantUML validation and rendering via external server. Configure with `JICON_PLANTUML_SERVER_URL` environment variable.
@@ -2348,7 +2487,7 @@ PlantUML validation and rendering via external server. Configure with `JICON_PLA
2348
2487
  ```
2349
2488
  Include expansion is enabled by default. Whitelisted URLs: `plantuml-stdlib/*`, `plantuml/*`, `awslabs/aws-icons-for-plantuml/*`. See `help(topic="plantuml")` for examples.
2350
2489
 
2351
- ### 1. plantuml_validate
2490
+ ### plantuml_validate
2352
2491
  **Description**: Validate PlantUML diagram syntax using a real PlantUML server
2353
2492
  **Use Cases**: Check diagram syntax before inserting into Confluence, debug diagram errors
2354
2493
 
@@ -2363,7 +2502,7 @@ Include expansion is enabled by default. Whitelisted URLs: `plantuml-stdlib/*`,
2363
2502
 
2364
2503
  ---
2365
2504
 
2366
- ### 2. plantuml_render
2505
+ ### plantuml_render
2367
2506
  **Description**: Render PlantUML diagram to a specified format
2368
2507
  **Use Cases**: Generate ASCII art for terminal display, create images for documentation
2369
2508
 
@@ -2390,7 +2529,7 @@ plantuml_render({
2390
2529
 
2391
2530
  ---
2392
2531
 
2393
- ### 3. plantuml_status
2532
+ ### plantuml_status
2394
2533
  **Description**: Check PlantUML server status
2395
2534
  **Use Cases**: Verify PlantUML server is available, troubleshoot connection issues
2396
2535
 
@@ -2426,7 +2565,7 @@ All data-heavy tools (search, list, get) **always** return buffered responses wi
2426
2565
  "title": "JQL: project = PROJ"
2427
2566
  },
2428
2567
  "accessors": {
2429
- "pipeline": { "tool": "buffer_pipeline", "description": "Transform to table/CSV/list" },
2568
+ "transform": { "tool": "buffer_transform", "description": "Transform with JavaScript code" },
2430
2569
  "get_items": { "tool": "buffer_get_items", "description": "Get complete items for analysis" },
2431
2570
  "search": { "tool": "buffer_grep", "description": "Search within buffer" }
2432
2571
  }
@@ -2439,7 +2578,7 @@ All data-heavy tools (search, list, get) **always** return buffered responses wi
2439
2578
  - `contentType`: Buffer type (`json`, `xhtml`, `plain`)
2440
2579
 
2441
2580
  **Working with JSON Buffers (Jira/Tempo):**
2442
- - `buffer_pipeline(bufferId, pipeline)` - Transform to table/CSV/list (98% token reduction)
2581
+ - `buffer_transform(inputs, code)` - Transform with JavaScript code (98% token reduction)
2443
2582
  - `buffer_get_items(bufferId, start, count)` - Get complete items for AI analysis
2444
2583
  - `buffer_grep(bufferId, pattern)` - Search within buffered data
2445
2584
 
@@ -2449,7 +2588,7 @@ All data-heavy tools (search, list, get) **always** return buffered responses wi
2449
2588
  - `buffer_grep(bufferId, pattern)` - Search within buffered data
2450
2589
 
2451
2590
  **Always-Buffered Tools:**
2452
- - **Jira**: `jira_search_issues`, `jira_get_issue`, `jira_list_projects`, `jira_get_project`, `jira_get_board`, `jira_get_sprints`, `jira_get_sprint_issues`, `jira_get_issue_comments`, `jira_get_issue_worklogs`, `jira_get_total_worklogs`
2591
+ - **Jira**: `jira_search_issues`, `jira_get_issue`, `jira_get_issues`, `jira_list_projects`, `jira_get_project`, `jira_get_board`, `jira_get_sprints`, `jira_get_sprint_issues`, `jira_get_issue_comments`, `jira_get_issue_worklogs`, `jira_get_total_worklogs`
2453
2592
  - **Confluence**: `confluence_search_content`, `confluence_list_spaces`, `confluence_get_space`, `confluence_get_page_children`, `confluence_get_comments`, `confluence_list_attachments`, `confluence_draft_list`
2454
2593
  - **Tempo**: `tempo_get_worklogs`, `tempo_get_worklog`, `tempo_get_accounts`, `tempo_get_account`, `tempo_get_teams`, `tempo_get_team`, `tempo_get_team_worklogs`, `tempo_get_epic_worklogs`
2455
2594
 
@@ -2506,25 +2645,25 @@ Tools enforce type-safe buffer access - each tool only accepts buffers of the ty
2506
2645
 
2507
2646
  | Buffer Type | Tools That REQUIRE This Type |
2508
2647
  |-------------|------------------------------|
2509
- | **json** | `buffer_pipeline`, `buffer_get_items` |
2648
+ | **json** | `buffer_transform`, `buffer_get_items` |
2510
2649
  | **xhtml** | `buffer_get_structure`, `buffer_get_element`, `buffer_validate_xhtml`, `confluence_draft_create` (with bufferId), `confluence_draft_save` |
2511
2650
  | **any** | `buffer_grep`, `buffer_list`, `buffer_clear`, `buffer_edit` (string mode) |
2512
2651
 
2513
2652
  **Error Messages**: When you use a tool with the wrong buffer type, you get a helpful error:
2514
2653
  ```
2515
- buffer_pipeline requires json buffer, but got: xhtml.
2654
+ buffer_transform requires json buffer, but got: xhtml.
2516
2655
  For XHTML content, use buffer_edit or buffer_get_structure instead.
2517
2656
  ```
2518
2657
 
2519
- **Key Principle**: If you have a JSON buffer (from Jira/Tempo search), use JSON-aware tools (`buffer_pipeline`, `buffer_get_items`). If you have an XHTML buffer (from Confluence), use XHTML-aware tools (`buffer_get_structure`, `buffer_edit` with element IDs).
2658
+ **Key Principle**: If you have a JSON buffer (from Jira/Tempo search), use JSON-aware tools (`buffer_transform`, `buffer_get_items`). If you have an XHTML buffer (from Confluence), use XHTML-aware tools (`buffer_get_structure`, `buffer_edit` with element IDs).
2520
2659
 
2521
2660
  ### Large Dataset Patterns
2522
2661
 
2523
2662
  **Simple table (no AI analysis):**
2524
- Use `buffer_pipeline` - generates complete table in ONE tool call:
2663
+ Use `buffer_transform` - generates complete table in ONE tool call:
2525
2664
  ```typescript
2526
2665
  jira_search_issues({ jql: "project=PROJ" }) // → bufferId (500+ items)
2527
- buffer_pipeline({ bufferId, pipeline: { output: { type: "xhtml_table", ... } } }) // → complete table!
2666
+ buffer_transform({ inputs: { issues: bufferId }, code: "return toTable(issues, { columns: [...] })" }) // → complete table!
2528
2667
  ```
2529
2668
 
2530
2669
  **Table with AI-enhanced columns (complexity, impact):**
@@ -2661,14 +2800,14 @@ buffer_validate_xhtml({
2661
2800
  **Automatic Validation:**
2662
2801
  XHTML content is automatically validated before Confluence writes (`confluence_draft_create`, `confluence_draft_save`).
2663
2802
 
2664
- ### JSON Pipeline Workflows
2803
+ ### JSON Transform Workflows
2665
2804
 
2666
- Use `buffer_pipeline` for efficient server-side data transformation. This eliminates the need to iterate through items in the LLM context.
2805
+ Use `buffer_transform` for efficient server-side data transformation. This eliminates the need to iterate through items in the LLM context.
2667
2806
 
2668
2807
  **Workflow - Search to Table (98% token reduction):**
2669
2808
  ```
2670
2809
  1. jira_search_issues(jql) → bufferId with JSON array
2671
- 2. buffer_pipeline(bufferId, pipeline) → bufferId with XHTML/CSV/Markdown
2810
+ 2. buffer_transform(inputs, code) → bufferId with XHTML table
2672
2811
  3. Use result directly or insert into Confluence page
2673
2812
  ```
2674
2813
 
@@ -2679,29 +2818,27 @@ jira_search_issues({ jql: "project = PROJ AND type = Bug" })
2679
2818
  // → { bufferId: "buf_issues", structure: { itemCount: 150 } }
2680
2819
 
2681
2820
  // 2. Transform to table with one call (NOT iterating 150 items!)
2682
- buffer_pipeline({
2683
- bufferId: "buf_issues",
2684
- pipeline: {
2685
- filter: [{ field: "status.name", operator: "ne", value: "Done" }],
2686
- sort: [{ field: "priority.name", direction: "asc" }],
2687
- format: [
2688
- { condition: { field: "priority.name", operator: "eq", value: "High" },
2689
- style: { color: "#dc3545", bold: true } }
2690
- ],
2691
- output: {
2692
- type: "xhtml_table",
2693
- table: {
2694
- title: "Open Bugs",
2695
- columns: [
2696
- { field: "key", header: "Issue", link: { type: "jira" } },
2697
- { field: "summary", header: "Summary" },
2698
- { field: "priority.name", header: "Priority" }
2699
- ]
2700
- }
2701
- }
2702
- }
2821
+ buffer_transform({
2822
+ inputs: { issues: "buf_issues" },
2823
+ code: `
2824
+ const open = issues.filter(i => i.status?.name !== 'Done');
2825
+ open.sort((a, b) => (a.priority?.id || 0) - (b.priority?.id || 0));
2826
+
2827
+ return toTable(open, {
2828
+ title: 'Open Bugs',
2829
+ columns: [
2830
+ { field: 'key', header: 'Issue', link: { type: 'jira' } },
2831
+ { field: 'summary', header: 'Summary' },
2832
+ { field: 'priority.name', header: 'Priority' }
2833
+ ],
2834
+ format: [
2835
+ { condition: { field: 'priority.name', operator: 'eq', value: 'High' },
2836
+ style: { color: '#dc3545', bold: true } }
2837
+ ]
2838
+ });
2839
+ `
2703
2840
  })
2704
- // → { bufferId: "buf_table", outputItems: 45, preview: "<table>..." }
2841
+ // → { bufferId: "buf_table", contentType: "xhtml" }
2705
2842
 
2706
2843
  // 3. Insert into Confluence page
2707
2844
  confluence_edit("DOCS/Bug Report")
@@ -2715,41 +2852,39 @@ confluence_draft_create({ pageId: "123", bufferId: "buf_page" })
2715
2852
  **Workflow - Statistics Dashboard:**
2716
2853
  ```typescript
2717
2854
  // Group issues by assignee with counts
2718
- buffer_pipeline({
2719
- bufferId: "buf_issues",
2720
- pipeline: {
2721
- filter: [{ field: "status.name", operator: "ne", value: "Done" }],
2722
- groupBy: {
2723
- field: "assignee.displayName",
2724
- aggregations: [
2725
- { function: "count", as: "total" },
2726
- { function: "list", field: "key", as: "issues" }
2855
+ buffer_transform({
2856
+ inputs: { issues: "buf_issues" },
2857
+ code: `
2858
+ const open = issues.filter(i => i.status?.name !== 'Done');
2859
+ const byAssignee = groupBy(open, 'assignee.displayName');
2860
+
2861
+ const stats = Object.entries(byAssignee).map(([name, items]) => ({
2862
+ assignee: name || 'Unassigned',
2863
+ total: items.length,
2864
+ issues: items.map(i => i.key).join(', ')
2865
+ }));
2866
+ stats.sort((a, b) => b.total - a.total);
2867
+
2868
+ return toTable(stats, {
2869
+ title: 'Work Distribution',
2870
+ columns: [
2871
+ { field: 'assignee', header: 'Assignee' },
2872
+ { field: 'total', header: 'Open Issues', align: 'right' },
2873
+ { field: 'issues', header: 'Issue Keys' }
2727
2874
  ]
2728
- },
2729
- sort: [{ field: "total", direction: "desc" }],
2730
- output: {
2731
- type: "xhtml_table",
2732
- table: {
2733
- title: "Work Distribution",
2734
- columns: [
2735
- { field: "displayName", header: "Assignee" },
2736
- { field: "total", header: "Open Issues" },
2737
- { field: "issues", header: "Issue Keys" }
2738
- ]
2739
- }
2740
- }
2741
- }
2875
+ });
2876
+ `
2742
2877
  })
2743
2878
  ```
2744
2879
 
2745
- **When to Use `buffer_pipeline`:**
2880
+ **When to Use `buffer_transform`:**
2746
2881
  - Generating tables/lists for Confluence from Jira/Tempo data
2747
2882
  - Creating CSV/Markdown exports
2748
2883
  - Aggregating statistics (count by status, sum time by project, etc.)
2749
2884
  - Filtering and sorting large result sets server-side
2750
2885
  - Any data transformation that doesn't require LLM reasoning
2751
2886
 
2752
- **When NOT to Use `buffer_pipeline`:**
2887
+ **When NOT to Use `buffer_transform`:**
2753
2888
  - When you need to read and understand each item's content
2754
2889
  - When decisions require LLM judgment (e.g., categorizing by sentiment)
2755
2890
  - When output format depends on item content analysis