@ecubelabs/atlassian-mcp 1.9.0 → 1.10.0
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/dist/confluence-tools/add-labels-to-page.js +4 -8
- package/dist/confluence-tools/create-folder.js +4 -8
- package/dist/confluence-tools/create-page.js +4 -8
- package/dist/confluence-tools/delete-folder.js +4 -8
- package/dist/confluence-tools/find-label-by-name.js +4 -8
- package/dist/confluence-tools/find-pages-by-label-name.js +4 -8
- package/dist/confluence-tools/find-space-by-name.js +4 -8
- package/dist/confluence-tools/get-folder-by-id.js +4 -8
- package/dist/confluence-tools/get-folder-children.js +7 -11
- package/dist/confluence-tools/get-labels.js +4 -8
- package/dist/confluence-tools/get-page-by-id.js +5 -8
- package/dist/confluence-tools/get-page-children-tree.js +5 -8
- package/dist/confluence-tools/get-page-children.js +7 -11
- package/dist/confluence-tools/get-page-descendants.js +4 -8
- package/dist/confluence-tools/get-pages-for-label.js +4 -8
- package/dist/confluence-tools/get-pages.js +5 -8
- package/dist/confluence-tools/get-recently-created-pages.js +4 -8
- package/dist/confluence-tools/get-recently-updated-pages.js +4 -8
- package/dist/confluence-tools/get-space-by-id.js +4 -8
- package/dist/confluence-tools/get-space-root-content.js +4 -8
- package/dist/confluence-tools/get-spaces.js +4 -8
- package/dist/confluence-tools/get-template-by-id.js +4 -8
- package/dist/confluence-tools/get-templates.js +4 -8
- package/dist/confluence-tools/move-page.js +4 -8
- package/dist/confluence-tools/update-page.js +4 -8
- package/dist/index.js +2 -0
- package/dist/jira-tools-register.js +110 -272
- package/dist/libs/confluence-client.js +1 -1
- package/dist/libs/response-formatter.js +49 -0
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerAddLabelsToPage = (server, confluenceService) => {
|
|
3
4
|
server.tool('add-labels-to-page', 'Add one or more labels to a Confluence page', {
|
|
4
5
|
pageId: z.string().describe('ID of the page to add labels to'),
|
|
@@ -14,14 +15,9 @@ export const registerAddLabelsToPage = (server, confluenceService) => {
|
|
|
14
15
|
}, async ({ pageId, labels }) => {
|
|
15
16
|
try {
|
|
16
17
|
const result = await confluenceService.addLabelsToPage(pageId, labels);
|
|
17
|
-
return {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
type: 'text',
|
|
21
|
-
text: JSON.stringify(result),
|
|
22
|
-
},
|
|
23
|
-
],
|
|
24
|
-
};
|
|
18
|
+
return formatToolResponse(result, {
|
|
19
|
+
toolName: 'add-labels-to-page',
|
|
20
|
+
});
|
|
25
21
|
}
|
|
26
22
|
catch (error) {
|
|
27
23
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerCreateFolder = (server, confluenceService) => {
|
|
3
4
|
server.tool('create-folder', 'Create a new folder in a Confluence space. Folders can contain pages and other folders.', {
|
|
4
5
|
spaceId: z.string().describe('ID of the space where the folder will be created'),
|
|
@@ -14,14 +15,9 @@ export const registerCreateFolder = (server, confluenceService) => {
|
|
|
14
15
|
title,
|
|
15
16
|
parentId,
|
|
16
17
|
});
|
|
17
|
-
return {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
type: 'text',
|
|
21
|
-
text: JSON.stringify(result),
|
|
22
|
-
},
|
|
23
|
-
],
|
|
24
|
-
};
|
|
18
|
+
return formatToolResponse(result, {
|
|
19
|
+
toolName: 'create-folder',
|
|
20
|
+
});
|
|
25
21
|
}
|
|
26
22
|
catch (error) {
|
|
27
23
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerCreatePage = (server, confluenceService) => {
|
|
3
4
|
server.tool('create-page', '⚠️ Create a new Confluence page. 🚫 CRITICAL: NEVER use wiki markup ({info}, {code}), placeholder text ([Info Panel]), or plain text for Jira/dates/users. ✅ MANDATORY: MUST use confluence-storage-format-help tool BEFORE calling this. ONLY use storage format XML: <ac:structured-macro> for macros, <time> for dates, <ac:link> for users.', {
|
|
4
5
|
spaceId: z.string().describe('ID of the space where the page will be created'),
|
|
@@ -28,14 +29,9 @@ export const registerCreatePage = (server, confluenceService) => {
|
|
|
28
29
|
status,
|
|
29
30
|
parentId,
|
|
30
31
|
});
|
|
31
|
-
return {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
type: 'text',
|
|
35
|
-
text: JSON.stringify(result),
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
};
|
|
32
|
+
return formatToolResponse(result, {
|
|
33
|
+
toolName: 'create-page',
|
|
34
|
+
});
|
|
39
35
|
}
|
|
40
36
|
catch (error) {
|
|
41
37
|
return {
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerDeleteFolder = (server, confluenceService) => {
|
|
3
4
|
server.tool('delete-folder', 'Delete a Confluence folder. The folder will be moved to trash where it can be restored later.', {
|
|
4
5
|
folderId: z.string().describe('ID of the folder to delete'),
|
|
5
6
|
}, async ({ folderId }) => {
|
|
6
7
|
try {
|
|
7
8
|
await confluenceService.deleteFolder(folderId);
|
|
8
|
-
return {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
type: 'text',
|
|
12
|
-
text: JSON.stringify({ success: true, message: `Folder ${folderId} has been deleted (moved to trash)` }),
|
|
13
|
-
},
|
|
14
|
-
],
|
|
15
|
-
};
|
|
9
|
+
return formatToolResponse({ success: true, message: `Folder ${folderId} has been deleted (moved to trash)` }, {
|
|
10
|
+
toolName: 'delete-folder',
|
|
11
|
+
});
|
|
16
12
|
}
|
|
17
13
|
catch (error) {
|
|
18
14
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerFindLabelByName = (server, confluenceService) => {
|
|
3
4
|
server.tool('find-label-by-name', 'Find a specific label by its name', {
|
|
4
5
|
labelName: z.string().describe('Name of the label to find'),
|
|
@@ -6,14 +7,9 @@ export const registerFindLabelByName = (server, confluenceService) => {
|
|
|
6
7
|
try {
|
|
7
8
|
const label = await confluenceService.findLabelByName(labelName);
|
|
8
9
|
if (label) {
|
|
9
|
-
return {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
type: 'text',
|
|
13
|
-
text: JSON.stringify(label),
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
};
|
|
10
|
+
return formatToolResponse(label, {
|
|
11
|
+
toolName: 'find-label-by-name',
|
|
12
|
+
});
|
|
17
13
|
}
|
|
18
14
|
else {
|
|
19
15
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerFindPagesByLabelName = (server, confluenceService) => {
|
|
3
4
|
server.tool('find-pages-by-label-name', 'Find pages by label name (convenience tool that combines label search and page retrieval)', {
|
|
4
5
|
labelName: z
|
|
@@ -36,14 +37,9 @@ export const registerFindPagesByLabelName = (server, confluenceService) => {
|
|
|
36
37
|
cursor,
|
|
37
38
|
limit,
|
|
38
39
|
});
|
|
39
|
-
return {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
type: 'text',
|
|
43
|
-
text: JSON.stringify(result),
|
|
44
|
-
},
|
|
45
|
-
],
|
|
46
|
-
};
|
|
40
|
+
return formatToolResponse(result, {
|
|
41
|
+
toolName: 'find-pages-by-label-name',
|
|
42
|
+
});
|
|
47
43
|
}
|
|
48
44
|
catch (error) {
|
|
49
45
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerFindSpaceByName = (server, confluenceService) => {
|
|
3
4
|
server.tool('find-space-by-name', 'Find a space by its name', {
|
|
4
5
|
spaceName: z.string().describe('Name of the space to find'),
|
|
@@ -6,14 +7,9 @@ export const registerFindSpaceByName = (server, confluenceService) => {
|
|
|
6
7
|
try {
|
|
7
8
|
const space = await confluenceService.findSpaceByName(spaceName);
|
|
8
9
|
if (space) {
|
|
9
|
-
return {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
type: 'text',
|
|
13
|
-
text: JSON.stringify(space),
|
|
14
|
-
},
|
|
15
|
-
],
|
|
16
|
-
};
|
|
10
|
+
return formatToolResponse(space, {
|
|
11
|
+
toolName: 'find-space-by-name',
|
|
12
|
+
});
|
|
17
13
|
}
|
|
18
14
|
else {
|
|
19
15
|
return {
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetFolderById = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-folder-by-id', 'Get details of a specific Confluence folder by its ID.', {
|
|
4
5
|
folderId: z.string().describe('ID of the folder to retrieve'),
|
|
5
6
|
}, async ({ folderId }) => {
|
|
6
7
|
try {
|
|
7
8
|
const result = await confluenceService.getFolderById(folderId);
|
|
8
|
-
return {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
type: 'text',
|
|
12
|
-
text: JSON.stringify(result),
|
|
13
|
-
},
|
|
14
|
-
],
|
|
15
|
-
};
|
|
9
|
+
return formatToolResponse(result, {
|
|
10
|
+
toolName: 'get-folder-by-id',
|
|
11
|
+
});
|
|
16
12
|
}
|
|
17
13
|
catch (error) {
|
|
18
14
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetFolderChildren = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-folder-children', 'Get direct children (pages, folders, etc.) of a Confluence folder. Use type filter to retrieve only specific content types.', {
|
|
4
5
|
folderId: z.string().describe('ID of the folder'),
|
|
@@ -38,17 +39,12 @@ export const registerGetFolderChildren = (server, confluenceService) => {
|
|
|
38
39
|
if (type) {
|
|
39
40
|
filteredResults = result.results.filter((child) => child.type === type);
|
|
40
41
|
}
|
|
41
|
-
return {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
results: filteredResults,
|
|
48
|
-
}),
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
};
|
|
42
|
+
return formatToolResponse({
|
|
43
|
+
...result,
|
|
44
|
+
results: filteredResults,
|
|
45
|
+
}, {
|
|
46
|
+
toolName: 'get-folder-children',
|
|
47
|
+
});
|
|
52
48
|
}
|
|
53
49
|
catch (error) {
|
|
54
50
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetLabels = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-labels', 'Get list of labels from Confluence', {
|
|
4
5
|
ids: z.array(z.string()).optional().describe('Filter labels by IDs'),
|
|
@@ -23,14 +24,9 @@ export const registerGetLabels = (server, confluenceService) => {
|
|
|
23
24
|
limit,
|
|
24
25
|
sort,
|
|
25
26
|
});
|
|
26
|
-
return {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
type: 'text',
|
|
30
|
-
text: JSON.stringify(result),
|
|
31
|
-
},
|
|
32
|
-
],
|
|
33
|
-
};
|
|
27
|
+
return formatToolResponse(result, {
|
|
28
|
+
toolName: 'get-labels',
|
|
29
|
+
});
|
|
34
30
|
}
|
|
35
31
|
catch (error) {
|
|
36
32
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetPageById = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-page-by-id', 'Get a specific page by its ID', {
|
|
4
5
|
pageId: z.string().describe('ID of the page to retrieve'),
|
|
@@ -15,14 +16,10 @@ export const registerGetPageById = (server, confluenceService) => {
|
|
|
15
16
|
getDraft,
|
|
16
17
|
version,
|
|
17
18
|
});
|
|
18
|
-
return {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
text: JSON.stringify(page),
|
|
23
|
-
},
|
|
24
|
-
],
|
|
25
|
-
};
|
|
19
|
+
return formatToolResponse(page, {
|
|
20
|
+
toolName: 'get-page-by-id',
|
|
21
|
+
summary: `Page: ${page.title ?? ''} (id: ${page.id ?? pageId})`,
|
|
22
|
+
});
|
|
26
23
|
}
|
|
27
24
|
catch (error) {
|
|
28
25
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetPageChildrenTree = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-page-children-tree', 'Get the complete hierarchical tree of child pages for a specific page (recursive)', {
|
|
4
5
|
pageId: z.string().describe('ID of the root page'),
|
|
@@ -34,14 +35,10 @@ export const registerGetPageChildrenTree = (server, confluenceService) => {
|
|
|
34
35
|
limit,
|
|
35
36
|
sort,
|
|
36
37
|
}, maxDepth);
|
|
37
|
-
return {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
text: JSON.stringify(result, null, 2),
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
};
|
|
38
|
+
return formatToolResponse(JSON.stringify(result, null, 2), {
|
|
39
|
+
toolName: 'get-page-children-tree',
|
|
40
|
+
summary: `Page tree: ${Array.isArray(result) ? result.length : 0} items`,
|
|
41
|
+
});
|
|
45
42
|
}
|
|
46
43
|
catch (error) {
|
|
47
44
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetPageChildren = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-page-children', 'Get direct children (pages, folders, etc.) of a specific page. Use type filter to retrieve only specific content types.', {
|
|
4
5
|
pageId: z.string().describe('ID of the parent page'),
|
|
@@ -38,17 +39,12 @@ export const registerGetPageChildren = (server, confluenceService) => {
|
|
|
38
39
|
if (type) {
|
|
39
40
|
filteredResults = result.results.filter((child) => child.type === type);
|
|
40
41
|
}
|
|
41
|
-
return {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
results: filteredResults,
|
|
48
|
-
}),
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
};
|
|
42
|
+
return formatToolResponse({
|
|
43
|
+
...result,
|
|
44
|
+
results: filteredResults,
|
|
45
|
+
}, {
|
|
46
|
+
toolName: 'get-page-children',
|
|
47
|
+
});
|
|
52
48
|
}
|
|
53
49
|
catch (error) {
|
|
54
50
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetPageDescendants = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-page-descendants', 'Get all descendants (children, grandchildren, etc.) of a specific page. Useful for getting the entire hierarchy under a page.', {
|
|
4
5
|
pageId: z.string().describe('ID of the page'),
|
|
@@ -26,14 +27,9 @@ export const registerGetPageDescendants = (server, confluenceService) => {
|
|
|
26
27
|
start,
|
|
27
28
|
limit,
|
|
28
29
|
});
|
|
29
|
-
return {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
type: 'text',
|
|
33
|
-
text: JSON.stringify(result),
|
|
34
|
-
},
|
|
35
|
-
],
|
|
36
|
-
};
|
|
30
|
+
return formatToolResponse(result, {
|
|
31
|
+
toolName: 'get-page-descendants',
|
|
32
|
+
});
|
|
37
33
|
}
|
|
38
34
|
catch (error) {
|
|
39
35
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetPagesForLabel = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-pages-for-label', 'Get pages associated with a specific label', {
|
|
4
5
|
labelId: z.string().describe('ID of the label to search for'),
|
|
@@ -34,14 +35,9 @@ export const registerGetPagesForLabel = (server, confluenceService) => {
|
|
|
34
35
|
cursor,
|
|
35
36
|
limit,
|
|
36
37
|
});
|
|
37
|
-
return {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
type: 'text',
|
|
41
|
-
text: JSON.stringify(result),
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
};
|
|
38
|
+
return formatToolResponse(result, {
|
|
39
|
+
toolName: 'get-pages-for-label',
|
|
40
|
+
});
|
|
45
41
|
}
|
|
46
42
|
catch (error) {
|
|
47
43
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetPages = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-pages', 'Get list of pages from Confluence', {
|
|
4
5
|
id: z.array(z.string()).optional().describe('List of page IDs to retrieve'),
|
|
@@ -44,14 +45,10 @@ export const registerGetPages = (server, confluenceService) => {
|
|
|
44
45
|
limit,
|
|
45
46
|
sort,
|
|
46
47
|
});
|
|
47
|
-
return {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
text: JSON.stringify(result),
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
};
|
|
48
|
+
return formatToolResponse(result, {
|
|
49
|
+
toolName: 'get-pages',
|
|
50
|
+
summary: `Found ${result.results?.length ?? 0} pages`,
|
|
51
|
+
});
|
|
55
52
|
}
|
|
56
53
|
catch (error) {
|
|
57
54
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetRecentlyCreatedPages = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-recently-created-pages', 'Get recently created pages from Confluence (sorted by creation date)', {
|
|
4
5
|
spaceId: z.array(z.string()).optional().describe('Filter by space IDs'),
|
|
@@ -19,14 +20,9 @@ export const registerGetRecentlyCreatedPages = (server, confluenceService) => {
|
|
|
19
20
|
limit,
|
|
20
21
|
bodyFormat,
|
|
21
22
|
});
|
|
22
|
-
return {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
type: 'text',
|
|
26
|
-
text: JSON.stringify(result),
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
};
|
|
23
|
+
return formatToolResponse(result, {
|
|
24
|
+
toolName: 'get-recently-created-pages',
|
|
25
|
+
});
|
|
30
26
|
}
|
|
31
27
|
catch (error) {
|
|
32
28
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetRecentlyUpdatedPages = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-recently-updated-pages', 'Get recently updated pages from Confluence (sorted by modification date)', {
|
|
4
5
|
spaceId: z.array(z.string()).optional().describe('Filter by space IDs'),
|
|
@@ -19,14 +20,9 @@ export const registerGetRecentlyUpdatedPages = (server, confluenceService) => {
|
|
|
19
20
|
limit,
|
|
20
21
|
bodyFormat,
|
|
21
22
|
});
|
|
22
|
-
return {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
type: 'text',
|
|
26
|
-
text: JSON.stringify(result),
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
};
|
|
23
|
+
return formatToolResponse(result, {
|
|
24
|
+
toolName: 'get-recently-updated-pages',
|
|
25
|
+
});
|
|
30
26
|
}
|
|
31
27
|
catch (error) {
|
|
32
28
|
return {
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetSpaceById = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-space-by-id', 'Get a specific space by its ID', {
|
|
4
5
|
spaceId: z.string().describe('ID of the space to retrieve'),
|
|
5
6
|
}, async ({ spaceId }) => {
|
|
6
7
|
try {
|
|
7
8
|
const space = await confluenceService.getSpaceById(spaceId);
|
|
8
|
-
return {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
type: 'text',
|
|
12
|
-
text: JSON.stringify(space),
|
|
13
|
-
},
|
|
14
|
-
],
|
|
15
|
-
};
|
|
9
|
+
return formatToolResponse(space, {
|
|
10
|
+
toolName: 'get-space-by-id',
|
|
11
|
+
});
|
|
16
12
|
}
|
|
17
13
|
catch (error) {
|
|
18
14
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetSpaceRootContent = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-space-root-content', "Get root-level content (pages, folders, etc.) of a Confluence space. This retrieves the direct children of the space's homepage.", {
|
|
4
5
|
spaceId: z.string().describe('ID of the space'),
|
|
@@ -34,14 +35,9 @@ export const registerGetSpaceRootContent = (server, confluenceService) => {
|
|
|
34
35
|
limit,
|
|
35
36
|
sort,
|
|
36
37
|
});
|
|
37
|
-
return {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
type: 'text',
|
|
41
|
-
text: JSON.stringify(result),
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
};
|
|
38
|
+
return formatToolResponse(result, {
|
|
39
|
+
toolName: 'get-space-root-content',
|
|
40
|
+
});
|
|
45
41
|
}
|
|
46
42
|
catch (error) {
|
|
47
43
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetSpaces = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-spaces', 'Get list of spaces from Confluence', {
|
|
4
5
|
id: z.array(z.string()).optional().describe('Filter spaces by IDs'),
|
|
@@ -44,14 +45,9 @@ export const registerGetSpaces = (server, confluenceService) => {
|
|
|
44
45
|
cursor,
|
|
45
46
|
limit,
|
|
46
47
|
});
|
|
47
|
-
return {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
type: 'text',
|
|
51
|
-
text: JSON.stringify(result),
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
};
|
|
48
|
+
return formatToolResponse(result, {
|
|
49
|
+
toolName: 'get-spaces',
|
|
50
|
+
});
|
|
55
51
|
}
|
|
56
52
|
catch (error) {
|
|
57
53
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetTemplateById = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-template-by-id', 'Get a specific content template by its ID. Returns detailed template information including name, description, space, labels, and optionally the template body content.', {
|
|
4
5
|
contentTemplateId: z.string().describe('The ID of the content template to retrieve'),
|
|
@@ -11,14 +12,9 @@ export const registerGetTemplateById = (server, confluenceService) => {
|
|
|
11
12
|
const result = await confluenceService.getTemplateById(contentTemplateId, {
|
|
12
13
|
expand,
|
|
13
14
|
});
|
|
14
|
-
return {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
type: 'text',
|
|
18
|
-
text: JSON.stringify(result),
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
};
|
|
15
|
+
return formatToolResponse(result, {
|
|
16
|
+
toolName: 'get-template-by-id',
|
|
17
|
+
});
|
|
22
18
|
}
|
|
23
19
|
catch (error) {
|
|
24
20
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerGetTemplates = (server, confluenceService) => {
|
|
3
4
|
server.tool('get-templates', 'Get list of content templates from Confluence. Returns global templates if no spaceKey is provided, or space-specific templates when spaceKey is specified.', {
|
|
4
5
|
spaceKey: z
|
|
@@ -28,14 +29,9 @@ export const registerGetTemplates = (server, confluenceService) => {
|
|
|
28
29
|
limit,
|
|
29
30
|
expand,
|
|
30
31
|
});
|
|
31
|
-
return {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
type: 'text',
|
|
35
|
-
text: JSON.stringify(result),
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
};
|
|
32
|
+
return formatToolResponse(result, {
|
|
33
|
+
toolName: 'get-templates',
|
|
34
|
+
});
|
|
39
35
|
}
|
|
40
36
|
catch (error) {
|
|
41
37
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerMovePage = (server, confluenceService) => {
|
|
3
4
|
server.tool('move-page', 'Move a Confluence page to a new location. Use position "append" to move the page as a child of the target (page or folder). Use "before" or "after" to move the page as a sibling of the target.', {
|
|
4
5
|
pageId: z.string().describe('ID of the page to move'),
|
|
@@ -15,14 +16,9 @@ export const registerMovePage = (server, confluenceService) => {
|
|
|
15
16
|
targetId,
|
|
16
17
|
position,
|
|
17
18
|
});
|
|
18
|
-
return {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
type: 'text',
|
|
22
|
-
text: JSON.stringify(result),
|
|
23
|
-
},
|
|
24
|
-
],
|
|
25
|
-
};
|
|
19
|
+
return formatToolResponse(result, {
|
|
20
|
+
toolName: 'move-page',
|
|
21
|
+
});
|
|
26
22
|
}
|
|
27
23
|
catch (error) {
|
|
28
24
|
return {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { formatToolResponse } from '../libs/response-formatter.js';
|
|
2
3
|
export const registerUpdatePage = (server, confluenceService) => {
|
|
3
4
|
server.tool('update-page', '⚠️ Update an existing Confluence page. 🚫 CRITICAL: NEVER use wiki markup ({info}, {code}), placeholder text ([Info Panel]), or plain text for Jira/dates/users. ✅ MANDATORY: MUST use confluence-storage-format-help tool BEFORE calling this. ONLY use storage format XML: <ac:structured-macro> for macros, <time> for dates, <ac:link> for users.', {
|
|
4
5
|
pageId: z.string().describe('ID of the page to update'),
|
|
@@ -31,14 +32,9 @@ export const registerUpdatePage = (server, confluenceService) => {
|
|
|
31
32
|
},
|
|
32
33
|
status,
|
|
33
34
|
});
|
|
34
|
-
return {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
type: 'text',
|
|
38
|
-
text: JSON.stringify(result),
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
};
|
|
35
|
+
return formatToolResponse(result, {
|
|
36
|
+
toolName: 'update-page',
|
|
37
|
+
});
|
|
42
38
|
}
|
|
43
39
|
catch (error) {
|
|
44
40
|
return {
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
4
4
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
5
|
import { registerJiraTools } from './jira-tools-register.js';
|
|
6
6
|
import { registerConfluenceTools } from './confluence-tools-register.js';
|
|
7
|
+
import { cleanupOldTempFiles } from './libs/response-formatter.js';
|
|
7
8
|
// Create server instance
|
|
8
9
|
const server = new McpServer({
|
|
9
10
|
name: 'atlassian',
|
|
@@ -13,6 +14,7 @@ registerJiraTools(server);
|
|
|
13
14
|
registerConfluenceTools(server);
|
|
14
15
|
// Start the server
|
|
15
16
|
async function main() {
|
|
17
|
+
cleanupOldTempFiles();
|
|
16
18
|
const transport = new StdioServerTransport();
|
|
17
19
|
await server.connect(transport);
|
|
18
20
|
/**
|