@geeveeh/atlassian-tools 0.3.0 → 0.4.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/README.md +52 -3
- package/dist/cli/confluence.d.ts.map +1 -1
- package/dist/cli/confluence.js +242 -10
- package/dist/cli/confluence.js.map +1 -1
- package/dist/cli/jira.d.ts.map +1 -1
- package/dist/cli/jira.js +310 -2
- package/dist/cli/jira.js.map +1 -1
- package/dist/confluence/client.d.ts +7 -1
- package/dist/confluence/client.d.ts.map +1 -1
- package/dist/confluence/client.js +47 -20
- package/dist/confluence/client.js.map +1 -1
- package/dist/confluence/index.d.ts +1 -0
- package/dist/confluence/index.d.ts.map +1 -1
- package/dist/confluence/index.js +1 -0
- package/dist/confluence/index.js.map +1 -1
- package/dist/confluence/markdown.d.ts +15 -0
- package/dist/confluence/markdown.d.ts.map +1 -0
- package/dist/confluence/markdown.js +83 -0
- package/dist/confluence/markdown.js.map +1 -0
- package/dist/confluence/types.d.ts +55 -0
- package/dist/confluence/types.d.ts.map +1 -1
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js +22 -5
- package/dist/core/auth.js.map +1 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +56 -18
- package/dist/core/client.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/mime.d.ts +2 -0
- package/dist/core/mime.d.ts.map +1 -0
- package/dist/core/mime.js +21 -0
- package/dist/core/mime.js.map +1 -0
- package/dist/jira/client.d.ts +10 -1
- package/dist/jira/client.d.ts.map +1 -1
- package/dist/jira/client.js +59 -20
- package/dist/jira/client.js.map +1 -1
- package/dist/jira/types.d.ts +38 -0
- package/dist/jira/types.d.ts.map +1 -1
- package/dist/mcp/confluence.d.ts +3 -0
- package/dist/mcp/confluence.d.ts.map +1 -0
- package/dist/mcp/confluence.js +405 -0
- package/dist/mcp/confluence.js.map +1 -0
- package/dist/mcp/helpers.d.ts +3 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +15 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/index.js +8 -646
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/jira.d.ts +3 -0
- package/dist/mcp/jira.d.ts.map +1 -0
- package/dist/mcp/jira.js +479 -0
- package/dist/mcp/jira.js.map +1 -0
- package/package.json +1 -1
package/dist/jira/client.js
CHANGED
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
import { readFile } from "fs/promises";
|
|
2
|
-
import { basename
|
|
2
|
+
import { basename } from "path";
|
|
3
3
|
import { AtlassianClient } from "../core/client.js";
|
|
4
|
+
import { attachmentMimeType } from "../core/mime.js";
|
|
4
5
|
import { textToAdf, adfToText, buildJql } from "./helpers.js";
|
|
5
|
-
function attachmentMimeType(filePath) {
|
|
6
|
-
const map = {
|
|
7
|
-
".png": "image/png",
|
|
8
|
-
".jpg": "image/jpeg",
|
|
9
|
-
".jpeg": "image/jpeg",
|
|
10
|
-
".gif": "image/gif",
|
|
11
|
-
".webp": "image/webp",
|
|
12
|
-
".svg": "image/svg+xml",
|
|
13
|
-
".pdf": "application/pdf",
|
|
14
|
-
".zip": "application/zip",
|
|
15
|
-
".txt": "text/plain",
|
|
16
|
-
".csv": "text/csv",
|
|
17
|
-
".json": "application/json",
|
|
18
|
-
".xml": "application/xml",
|
|
19
|
-
".html": "text/html",
|
|
20
|
-
".md": "text/markdown",
|
|
21
|
-
};
|
|
22
|
-
return map[extname(filePath).toLowerCase()] ?? "application/octet-stream";
|
|
23
|
-
}
|
|
24
6
|
export class JiraClient {
|
|
25
7
|
http;
|
|
26
8
|
constructor(config) {
|
|
@@ -36,6 +18,63 @@ export class JiraClient {
|
|
|
36
18
|
const result = await this.http.request(`/rest/api/3/project/search?maxResults=${limit}`);
|
|
37
19
|
return result.values;
|
|
38
20
|
}
|
|
21
|
+
// ── Epics ────────────────────────────────────────────────────────
|
|
22
|
+
async listEpicIssues(epicKey, limit = 50) {
|
|
23
|
+
const result = await this.http.request(`/rest/agile/1.0/epic/${encodeURIComponent(epicKey)}/issue?maxResults=${limit}`);
|
|
24
|
+
return result.issues;
|
|
25
|
+
}
|
|
26
|
+
// ── Boards & sprints ─────────────────────────────────────────────
|
|
27
|
+
async listBoards(limit = 25) {
|
|
28
|
+
const result = await this.http.request(`/rest/agile/1.0/board?maxResults=${limit}`);
|
|
29
|
+
return result.values;
|
|
30
|
+
}
|
|
31
|
+
async listSprints(boardId, state) {
|
|
32
|
+
const params = new URLSearchParams({ maxResults: "50" });
|
|
33
|
+
if (state)
|
|
34
|
+
params.set("state", state);
|
|
35
|
+
const result = await this.http.request(`/rest/agile/1.0/board/${boardId}/sprint?${params.toString()}`);
|
|
36
|
+
return result.values;
|
|
37
|
+
}
|
|
38
|
+
async moveToSprint(sprintId, issueKeys) {
|
|
39
|
+
await this.http.request(`/rest/agile/1.0/sprint/${sprintId}/issue`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
body: JSON.stringify({ issues: issueKeys }),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async createSprint(input) {
|
|
45
|
+
const payload = {
|
|
46
|
+
name: input.name,
|
|
47
|
+
originBoardId: input.boardId,
|
|
48
|
+
};
|
|
49
|
+
if (input.goal)
|
|
50
|
+
payload.goal = input.goal;
|
|
51
|
+
if (input.startDate)
|
|
52
|
+
payload.startDate = input.startDate;
|
|
53
|
+
if (input.endDate)
|
|
54
|
+
payload.endDate = input.endDate;
|
|
55
|
+
return this.http.request("/rest/agile/1.0/sprint", {
|
|
56
|
+
method: "POST",
|
|
57
|
+
body: JSON.stringify(payload),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async updateSprint(sprintId, input) {
|
|
61
|
+
return this.http.request(`/rest/agile/1.0/sprint/${sprintId}`, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
body: JSON.stringify(input),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async closeSprint(sprintId) {
|
|
67
|
+
return this.updateSprint(sprintId, { state: "closed" });
|
|
68
|
+
}
|
|
69
|
+
// ── Subtasks ─────────────────────────────────────────────────────
|
|
70
|
+
async listSubtasks(issueKey, limit = 50) {
|
|
71
|
+
return this.searchIssues({ jql: `parent = "${issueKey}"`, limit });
|
|
72
|
+
}
|
|
73
|
+
// ── Users ────────────────────────────────────────────────────────
|
|
74
|
+
async searchUsers(query, limit = 10) {
|
|
75
|
+
const params = new URLSearchParams({ query, maxResults: String(limit) });
|
|
76
|
+
return this.http.request(`/rest/api/3/user/search?${params.toString()}`);
|
|
77
|
+
}
|
|
39
78
|
// ── Issues ───────────────────────────────────────────────────────
|
|
40
79
|
async getIssue(issueKey) {
|
|
41
80
|
return this.http.request(`/rest/api/3/issue/${encodeURIComponent(issueKey)}`);
|
package/dist/jira/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/jira/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/jira/client.ts"],"names":[],"mappings":"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"}
|
package/dist/jira/types.d.ts
CHANGED
|
@@ -142,4 +142,42 @@ export interface WorklogInput {
|
|
|
142
142
|
started?: string;
|
|
143
143
|
comment?: string;
|
|
144
144
|
}
|
|
145
|
+
export interface JiraUser {
|
|
146
|
+
accountId: string;
|
|
147
|
+
displayName: string;
|
|
148
|
+
emailAddress?: string;
|
|
149
|
+
active: boolean;
|
|
150
|
+
accountType: string;
|
|
151
|
+
}
|
|
152
|
+
export interface JiraBoard {
|
|
153
|
+
id: number;
|
|
154
|
+
name: string;
|
|
155
|
+
type: string;
|
|
156
|
+
location?: {
|
|
157
|
+
projectKey: string;
|
|
158
|
+
projectName: string;
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export interface JiraSprint {
|
|
162
|
+
id: number;
|
|
163
|
+
name: string;
|
|
164
|
+
state: string;
|
|
165
|
+
startDate?: string;
|
|
166
|
+
endDate?: string;
|
|
167
|
+
goal?: string;
|
|
168
|
+
}
|
|
169
|
+
export interface JiraSprintInput {
|
|
170
|
+
boardId: number;
|
|
171
|
+
name: string;
|
|
172
|
+
goal?: string;
|
|
173
|
+
startDate?: string;
|
|
174
|
+
endDate?: string;
|
|
175
|
+
}
|
|
176
|
+
export interface JiraSprintUpdateInput {
|
|
177
|
+
name?: string;
|
|
178
|
+
goal?: string;
|
|
179
|
+
startDate?: string;
|
|
180
|
+
endDate?: string;
|
|
181
|
+
state?: "active" | "closed";
|
|
182
|
+
}
|
|
145
183
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/jira/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confluence.d.ts","sourceRoot":"","sources":["../../src/mcp/confluence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAcpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6e/D"}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { loadConfigFromEnv } from "../core/index.js";
|
|
3
|
+
import { ConfluenceClient } from "../confluence/client.js";
|
|
4
|
+
import { resolveBody } from "../confluence/markdown.js";
|
|
5
|
+
import { formatError, baseUrl } from "./helpers.js";
|
|
6
|
+
let _client = null;
|
|
7
|
+
function getClient() {
|
|
8
|
+
if (!_client)
|
|
9
|
+
_client = new ConfluenceClient(loadConfigFromEnv());
|
|
10
|
+
return _client;
|
|
11
|
+
}
|
|
12
|
+
export function registerConfluenceTools(server) {
|
|
13
|
+
server.tool("confluence_auth", "Verify the Confluence connection and list accessible spaces", {}, async () => {
|
|
14
|
+
try {
|
|
15
|
+
const spaces = await getClient().verifyConnection();
|
|
16
|
+
const text = [
|
|
17
|
+
"Connected successfully.",
|
|
18
|
+
`Found ${spaces.length} space(s):`,
|
|
19
|
+
...spaces.map((s) => `• ${s.name} [${s.key}] (id: ${s.id})`),
|
|
20
|
+
].join("\n");
|
|
21
|
+
return { content: [{ type: "text", text }] };
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
server.tool("confluence_list_spaces", "List available Confluence spaces", { limit: z.number().optional().describe("Max number of spaces to return (default 25)") }, async ({ limit }) => {
|
|
28
|
+
try {
|
|
29
|
+
const spaces = await getClient().listSpaces(limit ?? 25);
|
|
30
|
+
const text = spaces
|
|
31
|
+
.map((s) => `${s.name} [${s.key}] (id: ${s.id}, ${s.status})`)
|
|
32
|
+
.join("\n");
|
|
33
|
+
return { content: [{ type: "text", text: text || "No spaces found." }] };
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server.tool("confluence_read_page", "Read a Confluence page by its ID, returning title, metadata, and body content", { pageId: z.string().describe("The Confluence page ID") }, async ({ pageId }) => {
|
|
40
|
+
try {
|
|
41
|
+
const page = await getClient().getPage(pageId);
|
|
42
|
+
const text = [
|
|
43
|
+
`Title: ${page.title}`,
|
|
44
|
+
`ID: ${page.id}`,
|
|
45
|
+
`Status: ${page.status}`,
|
|
46
|
+
`Version: ${page.version.number}`,
|
|
47
|
+
`Space ID: ${page.spaceId}`,
|
|
48
|
+
"",
|
|
49
|
+
"--- Body (storage format) ---",
|
|
50
|
+
page.body?.storage?.value ?? "(empty)",
|
|
51
|
+
].join("\n");
|
|
52
|
+
return { content: [{ type: "text", text }] };
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
server.tool("confluence_search_pages", "Search for pages in a Confluence space by title", {
|
|
59
|
+
spaceKey: z.string().describe("The space key (e.g. 'DEV', 'HR')"),
|
|
60
|
+
title: z.string().optional().describe("Filter by page title (partial match)"),
|
|
61
|
+
limit: z.number().optional().describe("Max results (default 25)"),
|
|
62
|
+
}, async ({ spaceKey, title, limit }) => {
|
|
63
|
+
try {
|
|
64
|
+
const pages = await getClient().searchPages({ spaceKey, title, limit });
|
|
65
|
+
if (pages.length === 0) {
|
|
66
|
+
return { content: [{ type: "text", text: "No pages found." }] };
|
|
67
|
+
}
|
|
68
|
+
const text = pages
|
|
69
|
+
.map((p) => `${p.title} (id: ${p.id}, v${p.version?.number ?? "?"})`)
|
|
70
|
+
.join("\n");
|
|
71
|
+
return { content: [{ type: "text", text }] };
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
server.tool("confluence_search_cql", "Search Confluence content using CQL (Confluence Query Language) — more powerful than confluence_search_pages, supports full-text search across all spaces, filtering by label, date, type, etc.", {
|
|
78
|
+
cql: z.string().describe("CQL query, e.g. 'type=page AND text ~ \"kubernetes\"' or 'type=page AND label = \"approved\" AND space.key = \"DEV\"'"),
|
|
79
|
+
limit: z.number().optional().describe("Max results (default 25)"),
|
|
80
|
+
}, async ({ cql, limit }) => {
|
|
81
|
+
try {
|
|
82
|
+
const results = await getClient().searchCQL(cql, limit ?? 25);
|
|
83
|
+
if (results.length === 0) {
|
|
84
|
+
return { content: [{ type: "text", text: "No results found." }] };
|
|
85
|
+
}
|
|
86
|
+
const base = baseUrl();
|
|
87
|
+
const text = results.map((r) => {
|
|
88
|
+
const space = r.space ? ` [${r.space.key}]` : "";
|
|
89
|
+
const ver = r.version ? ` v${r.version.number}` : "";
|
|
90
|
+
const url = r._links?.webui ? `\n ${base}/wiki${r._links.webui}` : "";
|
|
91
|
+
return `${r.title}${space}${ver} (id: ${r.id}, ${r.type})${url}`;
|
|
92
|
+
}).join("\n");
|
|
93
|
+
return { content: [{ type: "text", text }] };
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
server.tool("confluence_list_templates", "List available Confluence page templates. Omit spaceKey to list global templates; provide it to include space-specific templates.", {
|
|
100
|
+
spaceKey: z.string().optional().describe("Space key to list templates for (omit for global templates)"),
|
|
101
|
+
}, async ({ spaceKey }) => {
|
|
102
|
+
try {
|
|
103
|
+
const templates = await getClient().listTemplates(spaceKey);
|
|
104
|
+
if (templates.length === 0) {
|
|
105
|
+
return { content: [{ type: "text", text: "No templates found." }] };
|
|
106
|
+
}
|
|
107
|
+
const text = templates.map((t) => {
|
|
108
|
+
const desc = t.description ? ` — ${t.description}` : "";
|
|
109
|
+
return `${t.name}${desc}`;
|
|
110
|
+
}).join("\n");
|
|
111
|
+
return { content: [{ type: "text", text }] };
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
server.tool("confluence_list_child_pages", "List child pages of a Confluence page", {
|
|
118
|
+
pageId: z.string().describe("The parent page ID"),
|
|
119
|
+
limit: z.number().optional().describe("Max results (default 25)"),
|
|
120
|
+
}, async ({ pageId, limit }) => {
|
|
121
|
+
try {
|
|
122
|
+
const pages = await getClient().listChildPages(pageId, limit ?? 25);
|
|
123
|
+
if (pages.length === 0) {
|
|
124
|
+
return { content: [{ type: "text", text: "No child pages found." }] };
|
|
125
|
+
}
|
|
126
|
+
const text = pages
|
|
127
|
+
.map((p) => `${p.title} (id: ${p.id}, v${p.version?.number ?? "?"})`)
|
|
128
|
+
.join("\n");
|
|
129
|
+
return { content: [{ type: "text", text }] };
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
server.tool("confluence_create_page", "Create a new Confluence page. IMPORTANT: Ask the user for confirmation before calling this tool.", {
|
|
136
|
+
spaceKey: z.string().describe("The space key to create the page in"),
|
|
137
|
+
title: z.string().describe("Page title"),
|
|
138
|
+
body: z.string().optional().describe("Page content in Markdown or Confluence storage format (XHTML) — omit when using templateName"),
|
|
139
|
+
templateName: z.string().optional().describe("Name of a template to use as the page body (use confluence_list_templates to see options)"),
|
|
140
|
+
parentId: z.string().optional().describe("Parent page ID (omit for top-level)"),
|
|
141
|
+
draft: z.boolean().optional().describe("Create as draft instead of published"),
|
|
142
|
+
}, async ({ spaceKey, title, body, templateName, parentId, draft }) => {
|
|
143
|
+
try {
|
|
144
|
+
const client = getClient();
|
|
145
|
+
const space = await client.getSpaceByKey(spaceKey);
|
|
146
|
+
let resolvedBody;
|
|
147
|
+
if (templateName) {
|
|
148
|
+
const templates = await client.listTemplates(spaceKey);
|
|
149
|
+
const tpl = templates.find((t) => t.name.toLowerCase() === templateName.toLowerCase());
|
|
150
|
+
if (!tpl) {
|
|
151
|
+
const names = templates.map((t) => t.name).join(", ");
|
|
152
|
+
return {
|
|
153
|
+
content: [{ type: "text", text: `Template "${templateName}" not found. Available: ${names || "none"}` }],
|
|
154
|
+
isError: true,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
resolvedBody = tpl.body?.storage?.value ?? "";
|
|
158
|
+
}
|
|
159
|
+
else if (body) {
|
|
160
|
+
resolvedBody = await resolveBody(body);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
return {
|
|
164
|
+
content: [{ type: "text", text: "Provide either body content or a templateName." }],
|
|
165
|
+
isError: true,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
const page = await client.createPage({
|
|
169
|
+
spaceId: space.id,
|
|
170
|
+
title,
|
|
171
|
+
body: resolvedBody,
|
|
172
|
+
parentId,
|
|
173
|
+
status: draft ? "draft" : "current",
|
|
174
|
+
});
|
|
175
|
+
const base = baseUrl();
|
|
176
|
+
const text = [
|
|
177
|
+
`✓ Page created successfully.`,
|
|
178
|
+
` Title: ${page.title}`,
|
|
179
|
+
` ID: ${page.id}`,
|
|
180
|
+
` Space: ${space.name} [${space.key}]`,
|
|
181
|
+
` Status: ${page.status}`,
|
|
182
|
+
` URL: ${base}/wiki/pages/${page.id}`,
|
|
183
|
+
].join("\n");
|
|
184
|
+
return { content: [{ type: "text", text }] };
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
server.tool("confluence_update_page", "Update an existing Confluence page. IMPORTANT: Ask the user for confirmation before calling this tool.", {
|
|
191
|
+
pageId: z.string().describe("The page ID to update"),
|
|
192
|
+
title: z.string().optional().describe("New title (omit to keep current)"),
|
|
193
|
+
body: z.string().optional().describe("New content in Markdown or Confluence storage format"),
|
|
194
|
+
versionMessage: z.string().optional().describe("Version change message"),
|
|
195
|
+
}, async ({ pageId, title, body, versionMessage }) => {
|
|
196
|
+
try {
|
|
197
|
+
const resolvedBody = body ? await resolveBody(body) : undefined;
|
|
198
|
+
const page = await getClient().updatePage({ pageId, title, body: resolvedBody, versionMessage });
|
|
199
|
+
const base = baseUrl();
|
|
200
|
+
const text = [
|
|
201
|
+
`✓ Page updated successfully.`,
|
|
202
|
+
` Title: ${page.title}`,
|
|
203
|
+
` ID: ${page.id}`,
|
|
204
|
+
` Version: ${page.version.number}`,
|
|
205
|
+
` URL: ${base}/wiki/pages/${page.id}`,
|
|
206
|
+
].join("\n");
|
|
207
|
+
return { content: [{ type: "text", text }] };
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
server.tool("confluence_copy_page", "Copy a Confluence page to a new location with a new title. IMPORTANT: Ask the user for confirmation before calling this tool.", {
|
|
214
|
+
pageId: z.string().describe("The page ID to copy"),
|
|
215
|
+
title: z.string().describe("Title for the new copy"),
|
|
216
|
+
destinationPageId: z.string().describe("Parent page ID where the copy will be placed"),
|
|
217
|
+
copyAttachments: z.boolean().optional().describe("Also copy attachments (default false)"),
|
|
218
|
+
copyLabels: z.boolean().optional().describe("Also copy labels (default false)"),
|
|
219
|
+
}, async ({ pageId, title, destinationPageId, copyAttachments, copyLabels }) => {
|
|
220
|
+
try {
|
|
221
|
+
const page = await getClient().copyPage({ pageId, title, destinationPageId, copyAttachments, copyLabels });
|
|
222
|
+
const base = baseUrl();
|
|
223
|
+
const text = [
|
|
224
|
+
`✓ Page copied successfully.`,
|
|
225
|
+
` Title: ${page.title}`,
|
|
226
|
+
` ID: ${page.id}`,
|
|
227
|
+
` URL: ${base}/wiki/pages/${page.id}`,
|
|
228
|
+
].join("\n");
|
|
229
|
+
return { content: [{ type: "text", text }] };
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
server.tool("confluence_delete_page", "Delete a Confluence page. IMPORTANT: Ask the user for confirmation before calling this tool.", { pageId: z.string().describe("The page ID to delete") }, async ({ pageId }) => {
|
|
236
|
+
try {
|
|
237
|
+
const client = getClient();
|
|
238
|
+
const page = await client.getPage(pageId);
|
|
239
|
+
await client.deletePage(pageId);
|
|
240
|
+
return { content: [{ type: "text", text: `✓ Deleted page "${page.title}" (id: ${pageId})` }] };
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
server.tool("confluence_list_comments", "List comments on a Confluence page", {
|
|
247
|
+
pageId: z.string().describe("The Confluence page ID"),
|
|
248
|
+
limit: z.number().optional().describe("Max results (default 25)"),
|
|
249
|
+
}, async ({ pageId, limit }) => {
|
|
250
|
+
try {
|
|
251
|
+
const comments = await getClient().listComments(pageId, limit ?? 25);
|
|
252
|
+
if (comments.length === 0) {
|
|
253
|
+
return { content: [{ type: "text", text: "No comments." }] };
|
|
254
|
+
}
|
|
255
|
+
const text = comments.map((c) => {
|
|
256
|
+
const author = c.history?.createdBy?.displayName ?? "Unknown";
|
|
257
|
+
const date = c.history?.createdDate ? new Date(c.history.createdDate).toLocaleDateString() : "";
|
|
258
|
+
const body = c.body?.storage?.value ?? "";
|
|
259
|
+
return `[${author}${date ? ` · ${date}` : ""}]\n${body}`;
|
|
260
|
+
}).join("\n\n");
|
|
261
|
+
return { content: [{ type: "text", text }] };
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
server.tool("confluence_add_comment", "Add a comment to a Confluence page. IMPORTANT: Ask the user for confirmation before calling this tool.", {
|
|
268
|
+
pageId: z.string().describe("The Confluence page ID"),
|
|
269
|
+
text: z.string().describe("Comment text (plain text or Confluence storage format XHTML)"),
|
|
270
|
+
}, async ({ pageId, text }) => {
|
|
271
|
+
try {
|
|
272
|
+
const body = text.trimStart().startsWith("<") ? text : `<p>${text}</p>`;
|
|
273
|
+
await getClient().addComment(pageId, body);
|
|
274
|
+
return { content: [{ type: "text", text: "✓ Comment added." }] };
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
server.tool("confluence_list_labels", "List labels on a Confluence page", { pageId: z.string().describe("The Confluence page ID") }, async ({ pageId }) => {
|
|
281
|
+
try {
|
|
282
|
+
const labels = await getClient().listLabels(pageId);
|
|
283
|
+
if (labels.length === 0) {
|
|
284
|
+
return { content: [{ type: "text", text: "No labels." }] };
|
|
285
|
+
}
|
|
286
|
+
return { content: [{ type: "text", text: labels.map((l) => l.name).join(", ") }] };
|
|
287
|
+
}
|
|
288
|
+
catch (err) {
|
|
289
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
server.tool("confluence_add_labels", "Add labels to a Confluence page. IMPORTANT: Ask the user for confirmation before calling this tool.", {
|
|
293
|
+
pageId: z.string().describe("The Confluence page ID"),
|
|
294
|
+
labels: z.array(z.string()).describe("Label names to add"),
|
|
295
|
+
}, async ({ pageId, labels }) => {
|
|
296
|
+
try {
|
|
297
|
+
const result = await getClient().addLabels(pageId, labels);
|
|
298
|
+
const text = `✓ Added labels: ${result.map((l) => l.name).join(", ")}`;
|
|
299
|
+
return { content: [{ type: "text", text }] };
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
server.tool("confluence_remove_label", "Remove a label from a Confluence page. IMPORTANT: Ask the user for confirmation before calling this tool.", {
|
|
306
|
+
pageId: z.string().describe("The Confluence page ID"),
|
|
307
|
+
label: z.string().describe("Label name to remove"),
|
|
308
|
+
}, async ({ pageId, label }) => {
|
|
309
|
+
try {
|
|
310
|
+
await getClient().removeLabel(pageId, label);
|
|
311
|
+
return { content: [{ type: "text", text: `✓ Removed label "${label}"` }] };
|
|
312
|
+
}
|
|
313
|
+
catch (err) {
|
|
314
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
server.tool("confluence_list_attachments", "List all attachments on a Confluence page", { pageId: z.string().describe("The Confluence page ID") }, async ({ pageId }) => {
|
|
318
|
+
try {
|
|
319
|
+
const attachments = await getClient().listAttachments(pageId);
|
|
320
|
+
if (attachments.length === 0) {
|
|
321
|
+
return { content: [{ type: "text", text: "No attachments found." }] };
|
|
322
|
+
}
|
|
323
|
+
const base = baseUrl();
|
|
324
|
+
const text = attachments
|
|
325
|
+
.map((a) => {
|
|
326
|
+
const downloadUrl = a._links?.download ? `${base}/wiki${a._links.download}` : "";
|
|
327
|
+
return [
|
|
328
|
+
`${a.title} (id: ${a.id}, ${a.mediaType}${a.fileSize ? `, ${a.fileSize} bytes` : ""})`,
|
|
329
|
+
...(downloadUrl ? [` ${downloadUrl}`] : []),
|
|
330
|
+
].join("\n");
|
|
331
|
+
})
|
|
332
|
+
.join("\n");
|
|
333
|
+
return { content: [{ type: "text", text }] };
|
|
334
|
+
}
|
|
335
|
+
catch (err) {
|
|
336
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
server.tool("confluence_upload_attachment", "Upload a file as an attachment to a Confluence page. IMPORTANT: Ask the user for confirmation before calling this tool.", {
|
|
340
|
+
pageId: z.string().describe("The page ID to attach the file to"),
|
|
341
|
+
filePath: z.string().describe("Absolute path to the file to upload"),
|
|
342
|
+
comment: z.string().optional().describe("Optional comment for the attachment"),
|
|
343
|
+
}, async ({ pageId, filePath, comment }) => {
|
|
344
|
+
try {
|
|
345
|
+
const att = await getClient().uploadAttachment({ pageId, filePath, comment });
|
|
346
|
+
const base = baseUrl();
|
|
347
|
+
const downloadUrl = att._links?.download ? `${base}/wiki${att._links.download}` : "";
|
|
348
|
+
const text = [
|
|
349
|
+
`✓ Attachment uploaded successfully.`,
|
|
350
|
+
` File: ${att.title}`,
|
|
351
|
+
` ID: ${att.id}`,
|
|
352
|
+
` Type: ${att.mediaType}`,
|
|
353
|
+
...(downloadUrl ? [` Download: ${downloadUrl}`] : []),
|
|
354
|
+
].join("\n");
|
|
355
|
+
return { content: [{ type: "text", text }] };
|
|
356
|
+
}
|
|
357
|
+
catch (err) {
|
|
358
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
server.tool("confluence_list_versions", "List the version history of a Confluence page", {
|
|
362
|
+
pageId: z.string().describe("The Confluence page ID"),
|
|
363
|
+
limit: z.number().optional().describe("Max versions to return (default 25)"),
|
|
364
|
+
}, async ({ pageId, limit }) => {
|
|
365
|
+
try {
|
|
366
|
+
const [page, versions] = await Promise.all([
|
|
367
|
+
getClient().getPage(pageId),
|
|
368
|
+
getClient().listVersions(pageId, limit ?? 25),
|
|
369
|
+
]);
|
|
370
|
+
const header = `Version history for "${page.title}" (id: ${pageId})`;
|
|
371
|
+
const lines = versions.map((v) => {
|
|
372
|
+
const date = new Date(v.when).toLocaleString();
|
|
373
|
+
const author = v.by?.displayName ?? "Unknown";
|
|
374
|
+
const msg = v.message ? ` — ${v.message}` : "";
|
|
375
|
+
const minor = v.minorEdit ? " [minor]" : "";
|
|
376
|
+
return `v${v.number} ${date} ${author}${minor}${msg}`;
|
|
377
|
+
});
|
|
378
|
+
return { content: [{ type: "text", text: [header, ...lines].join("\n") }] };
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
server.tool("confluence_restore_version", "Restore a Confluence page to a previous version (creates a new version with the old content). IMPORTANT: Ask the user for confirmation before calling this tool.", {
|
|
385
|
+
pageId: z.string().describe("The Confluence page ID"),
|
|
386
|
+
versionNumber: z.number().describe("Version number to restore (from confluence_list_versions)"),
|
|
387
|
+
}, async ({ pageId, versionNumber }) => {
|
|
388
|
+
try {
|
|
389
|
+
const page = await getClient().restoreVersion(pageId, versionNumber);
|
|
390
|
+
const base = baseUrl();
|
|
391
|
+
const text = [
|
|
392
|
+
`✓ Restored to version ${versionNumber}.`,
|
|
393
|
+
` Title: ${page.title}`,
|
|
394
|
+
` ID: ${page.id}`,
|
|
395
|
+
` Version: ${page.version.number}`,
|
|
396
|
+
` URL: ${base}/wiki/pages/${page.id}`,
|
|
397
|
+
].join("\n");
|
|
398
|
+
return { content: [{ type: "text", text }] };
|
|
399
|
+
}
|
|
400
|
+
catch (err) {
|
|
401
|
+
return { content: [{ type: "text", text: formatError(err) }], isError: true };
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=confluence.js.map
|