@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.
- package/README.md +4 -0
- package/TOOL_LIST.md +123 -92
- package/dist/config/types.d.ts +65 -214
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +3 -3
- package/dist/config/types.js.map +1 -1
- package/dist/confluence/tools.d.ts +52 -165
- package/dist/confluence/tools.d.ts.map +1 -1
- package/dist/confluence/tools.js +70 -62
- package/dist/confluence/tools.js.map +1 -1
- package/dist/index.js +16 -10
- package/dist/index.js.map +1 -1
- package/dist/jira/activity-tools.d.ts +19 -95
- package/dist/jira/activity-tools.d.ts.map +1 -1
- package/dist/jira/activity-tools.js +18 -17
- package/dist/jira/activity-tools.js.map +1 -1
- package/dist/jira/defaults.d.ts.map +1 -1
- package/dist/jira/defaults.js +1 -0
- package/dist/jira/defaults.js.map +1 -1
- package/dist/jira/formatters.d.ts.map +1 -1
- package/dist/jira/formatters.js +1 -0
- package/dist/jira/formatters.js.map +1 -1
- package/dist/jira/tools.d.ts +64 -216
- package/dist/jira/tools.d.ts.map +1 -1
- package/dist/jira/tools.js +77 -47
- package/dist/jira/tools.js.map +1 -1
- package/dist/permissions/filter.js +6 -6
- package/dist/permissions/filter.js.map +1 -1
- package/dist/permissions/tool-registry.d.ts +24 -24
- package/dist/permissions/tool-registry.d.ts.map +1 -1
- package/dist/permissions/tool-registry.js +26 -26
- package/dist/permissions/tool-registry.js.map +1 -1
- package/dist/permissions/write-home-validator.js +7 -7
- package/dist/tempo/tools.d.ts +24 -103
- package/dist/tempo/tools.d.ts.map +1 -1
- package/dist/tempo/tools.js +26 -21
- package/dist/tempo/tools.js.map +1 -1
- package/dist/transport/http.d.ts +4 -4
- package/dist/transport/http.d.ts.map +1 -1
- package/dist/transport/index.d.ts +2 -2
- package/dist/transport/index.js +2 -2
- package/dist/utils/buffer-tools.d.ts +24 -178
- package/dist/utils/buffer-tools.d.ts.map +1 -1
- package/dist/utils/buffer-tools.js +18 -15
- package/dist/utils/buffer-tools.js.map +1 -1
- package/dist/utils/date-tools.d.ts +8 -7
- package/dist/utils/date-tools.d.ts.map +1 -1
- package/dist/utils/date-tools.js +14 -0
- package/dist/utils/date-tools.js.map +1 -1
- package/dist/utils/http-client.js +1 -1
- package/dist/utils/http-client.js.map +1 -1
- package/dist/utils/jicon-help.d.ts +12 -9
- package/dist/utils/jicon-help.d.ts.map +1 -1
- package/dist/utils/jicon-help.js +64 -58
- package/dist/utils/jicon-help.js.map +1 -1
- package/dist/utils/mcp-schema.d.ts +19 -0
- package/dist/utils/mcp-schema.d.ts.map +1 -0
- package/dist/utils/mcp-schema.js +19 -0
- package/dist/utils/mcp-schema.js.map +1 -0
- package/dist/utils/plantuml/tools.d.ts +9 -20
- package/dist/utils/plantuml/tools.d.ts.map +1 -1
- package/dist/utils/plantuml/tools.js +4 -4
- package/dist/utils/plantuml/tools.js.map +1 -1
- package/dist/utils/plantuml/types.d.ts +21 -21
- package/dist/utils/plantuml/types.d.ts.map +1 -1
- package/dist/utils/response-formatter.js +1 -1
- package/dist/utils/response-formatter.js.map +1 -1
- package/dist/utils/sandbox/index.d.ts +9 -0
- package/dist/utils/sandbox/index.d.ts.map +1 -1
- package/dist/utils/sandbox/index.js +21 -0
- package/dist/utils/sandbox/index.js.map +1 -1
- package/dist/utils/sandbox/schema.d.ts +3 -29
- package/dist/utils/sandbox/schema.d.ts.map +1 -1
- package/dist/utils/sandbox/schema.js +1 -1
- package/dist/utils/sandbox/schema.js.map +1 -1
- package/dist/utils/schemas/jira.d.ts +2 -2
- package/dist/utils/schemas/jira.d.ts.map +1 -1
- package/dist/utils/schemas/jira.js +3 -2
- package/dist/utils/schemas/jira.js.map +1 -1
- package/dist/utils/schemas/tempo.d.ts +4 -4
- package/dist/utils/schemas/tempo.js +4 -4
- package/dist/utils/url-tools.d.ts +5 -13
- package/dist/utils/url-tools.d.ts.map +1 -1
- package/dist/utils/url-tools.js +11 -11
- package/dist/utils/url-tools.js.map +1 -1
- package/dist/utils/whoami-tools.d.ts +8 -11
- package/dist/utils/whoami-tools.d.ts.map +1 -1
- package/dist/utils/whoami-tools.js +3 -3
- package/dist/utils/whoami-tools.js.map +1 -1
- package/dist/utils/workload-tools.d.ts +13 -31
- package/dist/utils/workload-tools.d.ts.map +1 -1
- package/dist/utils/xhtml/plantuml.js +2 -2
- package/dist/utils/xhtml/plantuml.js.map +1 -1
- package/dist/utils/xhtml/types.d.ts +45 -35
- package/dist/utils/xhtml/types.d.ts.map +1 -1
- package/dist/utils/xhtml/types.js +1 -1
- package/dist/utils/xhtml/types.js.map +1 -1
- package/dist/utils/zod-helpers.d.ts +18 -0
- package/dist/utils/zod-helpers.d.ts.map +1 -0
- package/dist/utils/zod-helpers.js +26 -0
- package/dist/utils/zod-helpers.js.map +1 -0
- package/package.json +9 -9
package/dist/confluence/tools.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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") →
|
|
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 →
|
|
360
|
+
NEXT: buffer_edit → confluence_create_draft → confluence_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
|
|
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
|
|
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") →
|
|
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") →
|
|
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:
|
|
544
|
-
// - Existing pages: confluence_get_page → buffer_edit →
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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:
|
|
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(
|
|
758
|
-
comment: z.string().describe("Comment
|
|
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(
|
|
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:
|
|
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(
|
|
798
|
-
filePath: z.string().describe("
|
|
799
|
-
comment: z.string().optional().describe("
|
|
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(
|
|
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
|
-
|
|
848
|
+
confluence_create_draft: {
|
|
841
849
|
description: `Create draft for user review. Requires bufferId with valid XHTML.
|
|
842
850
|
|
|
843
|
-
NEW page:
|
|
844
|
-
EDIT page: confluence_load → buffer_edit →
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
1104
|
-
: `Review draft created for page ${originalPageId}. Use
|
|
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: `
|
|
1107
|
-
toDiscard: `
|
|
1108
|
-
toList: "
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
}
|