@crypto512/jicon-mcp 2.3.27 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +4 -0
  2. package/TOOL_LIST.md +123 -92
  3. package/dist/config/types.d.ts +65 -214
  4. package/dist/config/types.d.ts.map +1 -1
  5. package/dist/config/types.js +3 -3
  6. package/dist/config/types.js.map +1 -1
  7. package/dist/confluence/tools.d.ts +52 -165
  8. package/dist/confluence/tools.d.ts.map +1 -1
  9. package/dist/confluence/tools.js +70 -62
  10. package/dist/confluence/tools.js.map +1 -1
  11. package/dist/index.js +16 -10
  12. package/dist/index.js.map +1 -1
  13. package/dist/jira/activity-tools.d.ts +19 -95
  14. package/dist/jira/activity-tools.d.ts.map +1 -1
  15. package/dist/jira/activity-tools.js +18 -17
  16. package/dist/jira/activity-tools.js.map +1 -1
  17. package/dist/jira/defaults.d.ts.map +1 -1
  18. package/dist/jira/defaults.js +1 -0
  19. package/dist/jira/defaults.js.map +1 -1
  20. package/dist/jira/formatters.d.ts.map +1 -1
  21. package/dist/jira/formatters.js +1 -0
  22. package/dist/jira/formatters.js.map +1 -1
  23. package/dist/jira/tools.d.ts +64 -216
  24. package/dist/jira/tools.d.ts.map +1 -1
  25. package/dist/jira/tools.js +77 -47
  26. package/dist/jira/tools.js.map +1 -1
  27. package/dist/permissions/filter.js +6 -6
  28. package/dist/permissions/filter.js.map +1 -1
  29. package/dist/permissions/tool-registry.d.ts +24 -24
  30. package/dist/permissions/tool-registry.d.ts.map +1 -1
  31. package/dist/permissions/tool-registry.js +26 -26
  32. package/dist/permissions/tool-registry.js.map +1 -1
  33. package/dist/permissions/write-home-validator.js +7 -7
  34. package/dist/tempo/tools.d.ts +24 -103
  35. package/dist/tempo/tools.d.ts.map +1 -1
  36. package/dist/tempo/tools.js +26 -21
  37. package/dist/tempo/tools.js.map +1 -1
  38. package/dist/transport/http.d.ts +4 -4
  39. package/dist/transport/http.d.ts.map +1 -1
  40. package/dist/transport/index.d.ts +2 -2
  41. package/dist/transport/index.js +2 -2
  42. package/dist/utils/buffer-tools.d.ts +24 -178
  43. package/dist/utils/buffer-tools.d.ts.map +1 -1
  44. package/dist/utils/buffer-tools.js +18 -15
  45. package/dist/utils/buffer-tools.js.map +1 -1
  46. package/dist/utils/date-tools.d.ts +8 -7
  47. package/dist/utils/date-tools.d.ts.map +1 -1
  48. package/dist/utils/date-tools.js +14 -0
  49. package/dist/utils/date-tools.js.map +1 -1
  50. package/dist/utils/http-client.js +1 -1
  51. package/dist/utils/http-client.js.map +1 -1
  52. package/dist/utils/jicon-help.d.ts +12 -9
  53. package/dist/utils/jicon-help.d.ts.map +1 -1
  54. package/dist/utils/jicon-help.js +64 -58
  55. package/dist/utils/jicon-help.js.map +1 -1
  56. package/dist/utils/mcp-schema.d.ts +19 -0
  57. package/dist/utils/mcp-schema.d.ts.map +1 -0
  58. package/dist/utils/mcp-schema.js +19 -0
  59. package/dist/utils/mcp-schema.js.map +1 -0
  60. package/dist/utils/plantuml/tools.d.ts +9 -20
  61. package/dist/utils/plantuml/tools.d.ts.map +1 -1
  62. package/dist/utils/plantuml/tools.js +4 -4
  63. package/dist/utils/plantuml/tools.js.map +1 -1
  64. package/dist/utils/plantuml/types.d.ts +21 -21
  65. package/dist/utils/plantuml/types.d.ts.map +1 -1
  66. package/dist/utils/response-formatter.js +1 -1
  67. package/dist/utils/response-formatter.js.map +1 -1
  68. package/dist/utils/sandbox/index.d.ts +9 -0
  69. package/dist/utils/sandbox/index.d.ts.map +1 -1
  70. package/dist/utils/sandbox/index.js +21 -0
  71. package/dist/utils/sandbox/index.js.map +1 -1
  72. package/dist/utils/sandbox/schema.d.ts +3 -29
  73. package/dist/utils/sandbox/schema.d.ts.map +1 -1
  74. package/dist/utils/sandbox/schema.js +1 -1
  75. package/dist/utils/sandbox/schema.js.map +1 -1
  76. package/dist/utils/schemas/jira.d.ts +2 -2
  77. package/dist/utils/schemas/jira.d.ts.map +1 -1
  78. package/dist/utils/schemas/jira.js +3 -2
  79. package/dist/utils/schemas/jira.js.map +1 -1
  80. package/dist/utils/schemas/tempo.d.ts +4 -4
  81. package/dist/utils/schemas/tempo.js +4 -4
  82. package/dist/utils/url-tools.d.ts +5 -13
  83. package/dist/utils/url-tools.d.ts.map +1 -1
  84. package/dist/utils/url-tools.js +11 -11
  85. package/dist/utils/url-tools.js.map +1 -1
  86. package/dist/utils/whoami-tools.d.ts +8 -11
  87. package/dist/utils/whoami-tools.d.ts.map +1 -1
  88. package/dist/utils/whoami-tools.js +3 -3
  89. package/dist/utils/whoami-tools.js.map +1 -1
  90. package/dist/utils/workload-tools.d.ts +13 -31
  91. package/dist/utils/workload-tools.d.ts.map +1 -1
  92. package/dist/utils/xhtml/plantuml.js +2 -2
  93. package/dist/utils/xhtml/plantuml.js.map +1 -1
  94. package/dist/utils/xhtml/types.d.ts +45 -35
  95. package/dist/utils/xhtml/types.d.ts.map +1 -1
  96. package/dist/utils/xhtml/types.js +1 -1
  97. package/dist/utils/xhtml/types.js.map +1 -1
  98. package/dist/utils/zod-helpers.d.ts +18 -0
  99. package/dist/utils/zod-helpers.d.ts.map +1 -0
  100. package/dist/utils/zod-helpers.js +26 -0
  101. package/dist/utils/zod-helpers.js.map +1 -0
  102. package/package.json +9 -9
@@ -13,11 +13,7 @@ import { detectRawPlantUml, detectDiagramType } from "../utils/xhtml/plantuml.js
13
13
  import { convertPlantUmlIncludesInXhtml, IncludeConversionError } from "../utils/plantuml/index.js";
14
14
  import { parseUrl } from "../utils/url-tools.js";
15
15
  import { DEFAULT_PAGE_EXPAND } from "./defaults.js";
16
- /**
17
- * Schema that accepts either a comma-separated string or an array of strings.
18
- * Examples: "space,metadata" or ["space", "metadata"]
19
- */
20
- const stringOrArray = z.preprocess((val) => typeof val === "string" ? val.split(",").map(s => s.trim()).filter(Boolean) : val, z.array(z.string()));
16
+ import { stringOrArray } from "../utils/zod-helpers.js";
21
17
  /**
22
18
  * Generate a summary of content structure for draft responses.
23
19
  * Helps AI assistants verify that diagrams and other elements are included.
@@ -137,7 +133,7 @@ async function validateContentForWrite(content, bufferId) {
137
133
  errorMessages.push(` Use buffer_grep(bufferId="${bufferId}", pattern="...") to find the error location.`);
138
134
  }
139
135
  }
140
- errorMessages.push('TIP: Call help(topic="storage") for XHTML syntax (HTML vs XHTML differences).');
136
+ errorMessages.push('TIP: Call jicon_help(topic="storage") for XHTML syntax (HTML vs XHTML differences).');
141
137
  errorMessages.push("");
142
138
  errorMessages.push("ACTION REQUIRED: Fix content errors before calling this tool again.");
143
139
  errorMessages.push("DO NOT claim success - the draft was NOT created.");
@@ -178,7 +174,7 @@ export function createConfluenceTools() {
178
174
 
179
175
  Entry point for finding Confluence pages by content, title, or metadata.
180
176
 
181
- REQUIRES: Valid CQL query (see help(topic="cql") for syntax)
177
+ REQUIRES: Valid CQL query (see jicon_help(topic="cql") for syntax)
182
178
  RETURNS: bufferId (JSON array), itemCount with page IDs and titles
183
179
  NEXT: confluence_get_page (to load), buffer_transform (for reports), buffer_grep (to search results)
184
180
 
@@ -229,7 +225,7 @@ WARNING: Use text~ not content~. Use space KEY not name.`,
229
225
  hint += " text~\"Mike Tasc\" - finds pages mentioning this person\n";
230
226
  hint += " text~\"meeting\" AND space=MESH - finds meetings in MESH space\n";
231
227
  hint += " title~\"sprint review\" - finds pages with sprint review in title\n";
232
- hint += '\nTIP: Call help(topic="cql") for full CQL syntax guide.';
228
+ hint += '\nTIP: Call jicon_help(topic="cql") for full CQL syntax guide.';
233
229
  return formatError({
234
230
  ...error,
235
231
  message: error.message + hint
@@ -258,9 +254,9 @@ WARNING: Use text~ not content~. Use space KEY not name.`,
258
254
  PREFERRED method when you have a page ID from search results. Faster and more reliable than get_page_by_title.
259
255
 
260
256
  Returns pageId, version, bufferId, and structure (element IDs) for structured editing.
261
- Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add content, then confluence_draft_create(pageId=..., bufferId=...) for user review.`,
257
+ Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add content, then confluence_create_draft(pageId=..., bufferId=...) for user review.`,
262
258
  inputSchema: z.object({
263
- pageId: z.coerce.string().describe("Page ID (accepts string or number)"),
259
+ pageId: z.coerce.string().describe('Page ID (number or string, e.g. "123456")'),
264
260
  expand: stringOrArray.optional().describe("Additional data to expand (string or array)"),
265
261
  }),
266
262
  handler: async (args) => {
@@ -291,7 +287,7 @@ Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add conten
291
287
  ...(navHint && { hint: navHint }),
292
288
  message: navHint
293
289
  ? `Index page with child listing macro. ${navHint}`
294
- : "Page loaded. Use buffer_edit to modify, then confluence_draft_create(pageId=..., bufferId=...) for user review.",
290
+ : "Page loaded. Use buffer_edit to modify, then confluence_create_draft(pageId=..., bufferId=...) for user review.",
295
291
  });
296
292
  }
297
293
  catch (error) {
@@ -305,7 +301,7 @@ Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add conten
305
301
  Use ONLY when you don't have a page ID. IMPORTANT: Use the space KEY (e.g. 'MESH', 'TC'), NOT the space name.
306
302
 
307
303
  Returns pageId, version, bufferId, and structure (element IDs) for structured editing.
308
- Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add content, then confluence_draft_create(pageId=..., bufferId=...) for user review.`,
304
+ Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add content, then confluence_create_draft(pageId=..., bufferId=...) for user review.`,
309
305
  inputSchema: z.object({
310
306
  spaceKey: z.string().describe("Space key (short code like 'MESH', 'TC'), NOT the full space name"),
311
307
  title: z.string().describe("Page title"),
@@ -346,7 +342,7 @@ Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add conten
346
342
  ...(navHint && { hint: navHint }),
347
343
  message: navHint
348
344
  ? `Index page with child listing macro. ${navHint}`
349
- : "Page loaded. Use buffer_edit to modify, then confluence_draft_create(pageId=..., bufferId=...) for user review.",
345
+ : "Page loaded. Use buffer_edit to modify, then confluence_create_draft(pageId=..., bufferId=...) for user review.",
350
346
  });
351
347
  }
352
348
  catch (error) {
@@ -357,11 +353,11 @@ Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add conten
357
353
  confluence_load: {
358
354
  description: `Load an EXISTING page or draft into a buffer for editing.
359
355
 
360
- For NEW pages: buffer_create(contentType="xhtml") → confluence_draft_create(spaceKey, title, bufferId)
356
+ For NEW pages: buffer_create(contentType="xhtml") → confluence_create_draft(spaceKey, title, bufferId)
361
357
 
362
358
  ACCEPTS: URL | pageId | "draft:ID" | "SPACE/Title"
363
359
  RETURNS: bufferId, structure, pageId, version
364
- NEXT: buffer_edit → confluence_draft_createconfluence_review_publish`,
360
+ NEXT: buffer_edit → confluence_create_draftconfluence_publish_review`,
365
361
  inputSchema: z.object({
366
362
  input: z.string().describe('URL, pageId, "draft:ID", or "SPACE/Title"'),
367
363
  }),
@@ -396,7 +392,7 @@ NEXT: buffer_edit → confluence_draft_create → confluence_review_publish`,
396
392
  bufferId,
397
393
  structure,
398
394
  contentSize: content.length,
399
- message: "Content loaded. Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add content, then confluence_draft_create(pageId=..., bufferId=...) for user review.",
395
+ message: "Content loaded. Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to add content, then confluence_create_draft(pageId=..., bufferId=...) for user review.",
400
396
  };
401
397
  };
402
398
  // Helper to load draft content
@@ -421,7 +417,7 @@ NEXT: buffer_edit → confluence_draft_create → confluence_review_publish`,
421
417
  bufferId,
422
418
  structure,
423
419
  contentSize: content.length,
424
- message: "Draft loaded. Use buffer_edit to modify, then confluence_draft_save to update.",
420
+ message: "Draft loaded. Use buffer_edit to modify, then confluence_save_draft to update.",
425
421
  };
426
422
  };
427
423
  try {
@@ -458,7 +454,7 @@ NEXT: buffer_edit → confluence_draft_create → confluence_review_publish`,
458
454
  message: `Page not found: "${parsed.title}" in space ${parsed.spaceKey}`,
459
455
  statusCode: 404,
460
456
  details: {
461
- hint: `To CREATE a new page: buffer_create(content, contentType="xhtml") → confluence_draft_create(spaceKey="${parsed.spaceKey}", title="${parsed.title}", bufferId=...)`,
457
+ hint: `To CREATE a new page: buffer_create(content, contentType="xhtml") → confluence_create_draft(spaceKey="${parsed.spaceKey}", title="${parsed.title}", bufferId=...)`,
462
458
  },
463
459
  });
464
460
  }
@@ -509,7 +505,7 @@ NEXT: buffer_edit → confluence_draft_create → confluence_review_publish`,
509
505
  message: `Page not found: "${title}" in space ${spaceKey}`,
510
506
  statusCode: 404,
511
507
  details: {
512
- hint: `To CREATE a new page: buffer_create(content, contentType="xhtml") → confluence_draft_create(spaceKey="${spaceKey}", title="${title}", bufferId=...)`,
508
+ hint: `To CREATE a new page: buffer_create(content, contentType="xhtml") → confluence_create_draft(spaceKey="${spaceKey}", title="${title}", bufferId=...)`,
513
509
  },
514
510
  });
515
511
  }
@@ -540,8 +536,8 @@ NEXT: buffer_edit → confluence_draft_create → confluence_review_publish`,
540
536
  },
541
537
  },
542
538
  // All page writes go through draft workflow: LLM creates/edits drafts, user publishes via Confluence UI
543
- // - New pages: confluence_draft_create → user publishes
544
- // - Existing pages: confluence_get_page → buffer_edit → confluence_draft_create → user publishes
539
+ // - New pages: confluence_create_draft → user publishes
540
+ // - Existing pages: confluence_get_page → buffer_edit → confluence_create_draft → user publishes
545
541
  confluence_delete_page: {
546
542
  description: `Delete a Confluence page permanently.
547
543
 
@@ -553,7 +549,7 @@ NEXT: None
553
549
 
554
550
  Example: confluence_delete_page(pageId="123456")`,
555
551
  inputSchema: z.object({
556
- pageId: z.coerce.string().describe("Page ID (accepts string or number)"),
552
+ pageId: z.coerce.string().describe('Page ID (number or string, e.g. "123456")'),
557
553
  }),
558
554
  handler: async (args) => {
559
555
  try {
@@ -578,7 +574,7 @@ Example: confluence_delete_page(pageId="123456")`,
578
574
 
579
575
  Discover available spaces and their keys for use in CQL queries.
580
576
 
581
- TIP: For YOUR personal space, use whoami() instead — it returns your spaceKey directly.
577
+ TIP: For YOUR personal space, use user_whoami() instead — it returns your spaceKey directly.
582
578
 
583
579
  REQUIRES: None (optional type filter)
584
580
  RETURNS: bufferId with spaces array (key, name, type)
@@ -618,7 +614,7 @@ NEXT: confluence_search_content (to query space), confluence_get_page (homepage)
618
614
 
619
615
  Example: confluence_get_space(spaceKey="DOCS")`,
620
616
  inputSchema: z.object({
621
- spaceKey: z.string().describe("Space key"),
617
+ spaceKey: z.string().describe('Space key — the short code (e.g. "DOCS"), not the full space name'),
622
618
  expand: stringOrArray.optional().describe("Additional data to expand (string or array)"),
623
619
  }),
624
620
  handler: async (args) => {
@@ -646,7 +642,7 @@ Example: confluence_get_space(spaceKey="DOCS")`,
646
642
  Use when you need: "my space", user's space key for creating pages/drafts.
647
643
  This is the DEFAULT space when the user does not specify a target space.
648
644
 
649
- RETURNS: spaceKey, homePageId — use with confluence_draft_create(spaceKey=...).`,
645
+ RETURNS: spaceKey, homePageId — use with confluence_create_draft(spaceKey=...).`,
650
646
  inputSchema: z.object({}),
651
647
  handler: async () => {
652
648
  try {
@@ -752,10 +748,16 @@ NEXT: buffer_transform (RECOMMENDED for 10+ pages — aggregate server-side to a
752
748
  },
753
749
  },
754
750
  confluence_add_comment: {
755
- description: "Add a comment to a Confluence page",
751
+ description: `Add a comment to a Confluence page.
752
+
753
+ REQUIRES: pageId, comment (XHTML storage format)
754
+ RETURNS: Created comment (direct json)
755
+ NEXT: confluence_get_comments (to view all comments)
756
+
757
+ Example: confluence_add_comment(pageId="123456", comment="<p>Reviewed — looks good.</p>")`,
756
758
  inputSchema: z.object({
757
- pageId: z.coerce.string().describe("Page ID (accepts string or number)"),
758
- comment: z.string().describe("Comment text (HTML format)"),
759
+ pageId: z.coerce.string().describe('Page ID (number or string, e.g. "123456"). From a search/load result.'),
760
+ comment: z.string().describe("Comment body in Confluence XHTML storage format (e.g. <p>text</p>)"),
759
761
  }),
760
762
  handler: async (args) => {
761
763
  try {
@@ -772,7 +774,7 @@ NEXT: buffer_transform (RECOMMENDED for 10+ pages — aggregate server-side to a
772
774
 
773
775
  Returns bufferId. Use buffer_get_items to read, buffer_grep to search.`,
774
776
  inputSchema: z.object({
775
- pageId: z.coerce.string().describe("Page ID (accepts string or number)"),
777
+ pageId: z.coerce.string().describe('Page ID (number or string, e.g. "123456")'),
776
778
  }),
777
779
  handler: async (args) => {
778
780
  try {
@@ -792,11 +794,17 @@ Returns bufferId. Use buffer_get_items to read, buffer_grep to search.`,
792
794
  },
793
795
  },
794
796
  confluence_upload_attachment: {
795
- description: "Upload an attachment to a Confluence page",
797
+ description: `Upload a local file as an attachment to a Confluence page.
798
+
799
+ REQUIRES: pageId, filePath (path readable by the server)
800
+ RETURNS: Uploaded attachment metadata (direct json)
801
+ NEXT: confluence_list_attachments (to verify)
802
+
803
+ Example: confluence_upload_attachment(pageId="123456", filePath="/tmp/report.pdf")`,
796
804
  inputSchema: z.object({
797
- pageId: z.coerce.string().describe("Page ID (accepts string or number)"),
798
- filePath: z.string().describe("Local file path"),
799
- comment: z.string().optional().describe("Attachment comment"),
805
+ pageId: z.coerce.string().describe('Page ID (number or string, e.g. "123456"). From a search/load result.'),
806
+ filePath: z.string().describe("Absolute local file path to upload (must be readable by the server)"),
807
+ comment: z.string().optional().describe("Optional version comment for the attachment"),
800
808
  }),
801
809
  handler: async (args) => {
802
810
  try {
@@ -813,7 +821,7 @@ Returns bufferId. Use buffer_get_items to read, buffer_grep to search.`,
813
821
 
814
822
  Returns bufferId. Use buffer_get_items to read, buffer_grep to search.`,
815
823
  inputSchema: z.object({
816
- pageId: z.coerce.string().describe("Page ID (accepts string or number)"),
824
+ pageId: z.coerce.string().describe('Page ID (number or string, e.g. "123456")'),
817
825
  }),
818
826
  handler: async (args) => {
819
827
  try {
@@ -837,17 +845,17 @@ Returns bufferId. Use buffer_get_items to read, buffer_grep to search.`,
837
845
  // ========================================
838
846
  // Note: Confluence drafts cannot be updated via API, only created, read, or deleted.
839
847
  // The workflow is: create draft → edit locally in buffer → save (delete+recreate) → publish
840
- confluence_draft_create: {
848
+ confluence_create_draft: {
841
849
  description: `Create draft for user review. Requires bufferId with valid XHTML.
842
850
 
843
- NEW page: confluence_draft_create(spaceKey, title, bufferId)
844
- EDIT page: confluence_load → buffer_edit → confluence_draft_create(pageId, bufferId)
851
+ NEW page: confluence_create_draft(spaceKey, title, bufferId)
852
+ EDIT page: confluence_load → buffer_edit → confluence_create_draft(pageId, bufferId)
845
853
 
846
- TIP: Need your personal spaceKey? Use whoami() first.
854
+ TIP: Need your personal spaceKey? Use user_whoami() first.
847
855
 
848
856
  Draft title auto-prefixed with "[jicon-mcp REVIEW]" when editing existing pages.
849
857
  RETURNS: draftId, bufferId, structure, url. On XHTML error: errorElementId for buffer_edit fix.
850
- WARNING: pageId must be a PAGE ID, not a draft ID. Use confluence_draft_open for existing drafts.`,
858
+ WARNING: pageId must be a PAGE ID, not a draft ID. Use confluence_open_draft for existing drafts.`,
851
859
  inputSchema: z.object({
852
860
  pageId: z.coerce.string().optional().describe("Existing PAGE ID to edit (NOT a draft ID). Get from confluence_get_page or confluence_load. When provided, bufferId must come from that page."),
853
861
  spaceKey: z.string().optional().describe("Space key (required for new pages, auto-populated when pageId is provided)"),
@@ -936,11 +944,11 @@ WARNING: pageId must be a PAGE ID, not a draft ID. Use confluence_draft_open for
936
944
  error instanceof Error ? error.message : String(error);
937
945
  return formatError({
938
946
  error: true,
939
- message: `Page '${args.pageId}' not found. If this is a draft ID (from confluence_draft_create), use confluence_draft_open to continue editing instead.`,
947
+ message: `Page '${args.pageId}' not found. If this is a draft ID (from confluence_create_draft), use confluence_open_draft to continue editing instead.`,
940
948
  statusCode: 404,
941
949
  details: {
942
950
  originalError: errorMessage,
943
- hint: "For existing drafts: confluence_draft_open(draftId) → buffer_edit → confluence_draft_save. For new drafts from existing pages: confluence_load(pageId) → buffer_edit → confluence_draft_create(pageId, bufferId)",
951
+ hint: "For existing drafts: confluence_open_draft(draftId) → buffer_edit → confluence_save_draft. For new drafts from existing pages: confluence_load(pageId) → buffer_edit → confluence_create_draft(pageId, bufferId)",
944
952
  pageIdProvided: args.pageId,
945
953
  },
946
954
  });
@@ -1100,12 +1108,12 @@ WARNING: pageId must be a PAGE ID, not a draft ID. Use confluence_draft_open for
1100
1108
  note: "This is a REVIEW draft linked to the original page.",
1101
1109
  };
1102
1110
  response.message = existingReviewDraft
1103
- ? `Review draft updated for page ${originalPageId}. Use confluence_review_publish(${result.id}) to apply changes.`
1104
- : `Review draft created for page ${originalPageId}. Use confluence_review_publish(${result.id}) to apply changes.`;
1111
+ ? `Review draft updated for page ${originalPageId}. Use confluence_publish_review(${result.id}) to apply changes.`
1112
+ : `Review draft created for page ${originalPageId}. Use confluence_publish_review(${result.id}) to apply changes.`;
1105
1113
  response.nextSteps = {
1106
- toPublish: `confluence_review_publish(reviewDraftId="${result.id}")`,
1107
- toDiscard: `confluence_review_discard(reviewDraftId="${result.id}")`,
1108
- toList: "confluence_review_list()",
1114
+ toPublish: `confluence_publish_review(reviewDraftId="${result.id}")`,
1115
+ toDiscard: `confluence_discard_review(reviewDraftId="${result.id}")`,
1116
+ toList: "confluence_list_reviews()",
1109
1117
  };
1110
1118
  }
1111
1119
  else {
@@ -1133,10 +1141,10 @@ WARNING: pageId must be a PAGE ID, not a draft ID. Use confluence_draft_open for
1133
1141
  }
1134
1142
  },
1135
1143
  },
1136
- confluence_draft_open: {
1144
+ confluence_open_draft: {
1137
1145
  description: `Open an existing draft page for editing. Loads content into buffer with structure (element IDs).
1138
1146
 
1139
- Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to modify, then confluence_draft_save. User publishes via Confluence UI.`,
1147
+ Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to modify, then confluence_save_draft. User publishes via Confluence UI.`,
1140
1148
  inputSchema: z.object({
1141
1149
  draftId: z.coerce.string().describe("Draft page ID"),
1142
1150
  }),
@@ -1177,12 +1185,12 @@ Use buffer_edit(bufferId, after=ID, content/plantuml/fromBufferId) to modify, th
1177
1185
  }
1178
1186
  },
1179
1187
  },
1180
- confluence_draft_list: {
1188
+ confluence_list_drafts: {
1181
1189
  description: `List your UNPUBLISHED draft pages (work-in-progress, not yet published).
1182
1190
 
1183
1191
  NOTE: To find PUBLISHED pages you edited, use:
1184
1192
  confluence_search_content(cql="contributor=currentUser() ORDER BY lastmodified DESC")
1185
- TIP: To find your personal space key, use whoami().
1193
+ TIP: To find your personal space key, use user_whoami().
1186
1194
 
1187
1195
  Returns bufferId. Use buffer_get_items to read, buffer_grep to search.`,
1188
1196
  inputSchema: z.object({
@@ -1209,7 +1217,7 @@ Returns bufferId. Use buffer_get_items to read, buffer_grep to search.`,
1209
1217
  }
1210
1218
  },
1211
1219
  },
1212
- confluence_draft_save: {
1220
+ confluence_save_draft: {
1213
1221
  description: `Save buffer content to server as a new draft for user review.
1214
1222
 
1215
1223
  IMPORTANT: Raw @startuml outside macros is NOT supported. Use buffer_edit for auto-wrapping, or embed properly formatted ac:structured-macro elements.
@@ -1359,7 +1367,7 @@ Returns new draftId, bufferId, structure (element IDs), and URL. Always use the
1359
1367
  }
1360
1368
  },
1361
1369
  },
1362
- confluence_draft_delete: {
1370
+ confluence_delete_draft: {
1363
1371
  description: `Delete a draft page permanently.
1364
1372
 
1365
1373
  Drafts are NOT sent to trash - they are permanently deleted.`,
@@ -1391,12 +1399,12 @@ Drafts are NOT sent to trash - they are permanently deleted.`,
1391
1399
  // These tools manage the "[jicon-mcp REVIEW]" workflow for editing existing pages.
1392
1400
  // Review drafts are linked to original pages via labels and can be published
1393
1401
  // to apply changes to the original page.
1394
- confluence_review_publish: {
1402
+ confluence_publish_review: {
1395
1403
  description: `Publish a review draft to apply changes to the original page.
1396
1404
 
1397
1405
  Apply changes from "[jicon-mcp REVIEW]" draft to the original page.
1398
1406
 
1399
- REQUIRES: reviewDraftId (from confluence_draft_create with pageId)
1407
+ REQUIRES: reviewDraftId (from confluence_create_draft with pageId)
1400
1408
  RETURNS: Updated page info with new version number
1401
1409
  NEXT: confluence_get_page (to verify), confluence_load (for more changes)
1402
1410
 
@@ -1405,7 +1413,7 @@ This tool:
1405
1413
  2. Copies the draft content to the original page (creates new version)
1406
1414
  3. Deletes the review draft
1407
1415
 
1408
- Example: confluence_review_publish(reviewDraftId="123456")`,
1416
+ Example: confluence_publish_review(reviewDraftId="123456")`,
1409
1417
  inputSchema: z.object({
1410
1418
  reviewDraftId: z.coerce.string().describe("ID of the [jicon-mcp REVIEW] draft to publish"),
1411
1419
  autoRetry: z
@@ -1430,7 +1438,7 @@ Example: confluence_review_publish(reviewDraftId="123456")`,
1430
1438
  statusCode: 400,
1431
1439
  details: {
1432
1440
  actualTitle: reviewDraft.title,
1433
- hint: "Use confluence_draft_create with pageId to create a review draft",
1441
+ hint: "Use confluence_create_draft with pageId to create a review draft",
1434
1442
  },
1435
1443
  });
1436
1444
  }
@@ -1444,7 +1452,7 @@ Example: confluence_review_publish(reviewDraftId="123456")`,
1444
1452
  statusCode: 400,
1445
1453
  details: {
1446
1454
  labels: labels.map((l) => l.name),
1447
- hint: "This draft may have been created manually. Use confluence_draft_create with pageId to create proper review drafts.",
1455
+ hint: "This draft may have been created manually. Use confluence_create_draft with pageId to create proper review drafts.",
1448
1456
  },
1449
1457
  });
1450
1458
  }
@@ -1461,7 +1469,7 @@ Example: confluence_review_publish(reviewDraftId="123456")`,
1461
1469
  statusCode: 404,
1462
1470
  details: {
1463
1471
  originalPageId,
1464
- hint: "If the original page was deleted, use confluence_review_discard to remove this review draft.",
1472
+ hint: "If the original page was deleted, use confluence_discard_review to remove this review draft.",
1465
1473
  },
1466
1474
  });
1467
1475
  }
@@ -1508,7 +1516,7 @@ Example: confluence_review_publish(reviewDraftId="123456")`,
1508
1516
  }
1509
1517
  },
1510
1518
  },
1511
- confluence_review_discard: {
1519
+ confluence_discard_review: {
1512
1520
  description: `Discard a review draft without applying changes to the original page.
1513
1521
 
1514
1522
  This tool:
@@ -1531,7 +1539,7 @@ This tool:
1531
1539
  statusCode: 400,
1532
1540
  details: {
1533
1541
  actualTitle: reviewDraft.title,
1534
- hint: "Use confluence_draft_delete for non-review drafts",
1542
+ hint: "Use confluence_delete_draft for non-review drafts",
1535
1543
  },
1536
1544
  });
1537
1545
  }
@@ -1552,7 +1560,7 @@ This tool:
1552
1560
  }
1553
1561
  },
1554
1562
  },
1555
- confluence_review_list: {
1563
+ confluence_list_reviews: {
1556
1564
  description: `List all "[jicon-mcp REVIEW]" drafts for cleanup or management.
1557
1565
 
1558
1566
  Returns review drafts with their linked original page IDs.
@@ -1589,7 +1597,7 @@ Use this to find abandoned review drafts or manage multiple review workflows.`,
1589
1597
  reviewDrafts: reviews,
1590
1598
  total: reviews.length,
1591
1599
  message: reviews.length > 0
1592
- ? `Found ${reviews.length} review draft(s). Use confluence_review_publish or confluence_review_discard to manage.`
1600
+ ? `Found ${reviews.length} review draft(s). Use confluence_publish_review or confluence_discard_review to manage.`
1593
1601
  : "No review drafts found.",
1594
1602
  });
1595
1603
  }