@aashari/mcp-server-atlassian-confluence
Version:
Node.js/TypeScript MCP server for Atlassian Confluence. Provides tools enabling AI systems (LLMs) to list/get spaces & pages (content formatted as Markdown) and search via CQL. Connects AI seamlessly to Confluence knowledge bases using the standard MCP in
149 lines (148 loc) • 6.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatSpacesList = formatSpacesList;
exports.formatSpaceDetails = formatSpaceDetails;
const formatter_util_js_1 = require("../utils/formatter.util.js");
/**
* Format a list of spaces for display
* @param spacesData - Raw spaces data from the API
* @returns Formatted string with spaces information in markdown format
*/
function formatSpacesList(spacesData) {
if (!spacesData.results || spacesData.results.length === 0) {
return 'No Confluence spaces found matching your criteria.';
}
const lines = [(0, formatter_util_js_1.formatHeading)('Confluence Spaces', 1), ''];
// Use the numbered list formatter for consistent formatting
const formattedList = (0, formatter_util_js_1.formatNumberedList)(spacesData.results, (space, index) => {
const itemLines = [];
itemLines.push((0, formatter_util_js_1.formatHeading)(space.name, 2));
// Basic properties
const properties = {
ID: space.id,
Key: space.key,
Type: space.type,
Status: space.status,
Created: space.createdAt
? (0, formatter_util_js_1.formatDate)(new Date(space.createdAt))
: 'Not available',
'Homepage ID': space.homepageId || 'Not set',
Description: space.description?.view?.value || 'Not available',
URL: (0, formatter_util_js_1.formatUrl)(`${spacesData._links.base}/spaces/${space.key}`, space.key),
};
if (space.currentActiveAlias) {
properties['Alias'] = space.currentActiveAlias;
}
// Format as a bullet list with proper formatting for each value type
itemLines.push((0, formatter_util_js_1.formatBulletList)(properties, (key) => key));
// Add separator between spaces except for the last one
if (index < spacesData.results.length - 1) {
itemLines.push('');
itemLines.push((0, formatter_util_js_1.formatSeparator)());
}
return itemLines.join('\n');
});
lines.push(formattedList);
// Add timestamp for when this information was retrieved
lines.push('');
lines.push(`*Space information retrieved at ${(0, formatter_util_js_1.formatDate)(new Date())}*`);
return lines.join('\n');
}
/**
* Format detailed space information for display
* @param spaceData - Raw space details from the API
* @param homepageContent - Optional homepage content to include
* @returns Formatted string with space details in markdown format
*/
function formatSpaceDetails(spaceData, homepageContent) {
// Create URL
const baseUrl = spaceData._links.base || '';
const spaceUrl = spaceData._links.webui || '';
const fullUrl = spaceUrl.startsWith('http')
? spaceUrl
: `${baseUrl}${spaceUrl}`;
const lines = [
(0, formatter_util_js_1.formatHeading)(`Confluence Space: ${spaceData.name}`, 1),
'',
`> A ${spaceData.status} ${spaceData.type} space with key \`${spaceData.key}\` created on ${(0, formatter_util_js_1.formatDate)(spaceData.createdAt)}.`,
'',
(0, formatter_util_js_1.formatHeading)('Basic Information', 2),
];
// Format basic information as a bullet list
const basicProperties = {
ID: spaceData.id,
Key: spaceData.key,
Type: spaceData.type,
Status: spaceData.status,
'Created At': spaceData.createdAt,
'Author ID': spaceData.authorId,
'Homepage ID': spaceData.homepageId,
'Current Alias': spaceData.currentActiveAlias,
};
lines.push((0, formatter_util_js_1.formatBulletList)(basicProperties, (key) => key));
// Description section
if (spaceData.description?.view?.value ||
spaceData.description?.plain?.value) {
lines.push('');
lines.push((0, formatter_util_js_1.formatHeading)('Description', 2));
const viewValue = spaceData.description?.view?.value;
const plainValue = spaceData.description?.plain?.value;
if (viewValue && viewValue.trim()) {
lines.push(viewValue.trim());
}
else if (plainValue && plainValue.trim()) {
lines.push(plainValue.trim());
}
else {
lines.push('*No description provided*');
}
}
// Homepage content section (placed after description)
if (spaceData.homepageId) {
lines.push('');
lines.push((0, formatter_util_js_1.formatHeading)('Homepage Content', 2));
if (homepageContent) {
lines.push(homepageContent);
}
else {
lines.push('*No homepage content available*');
}
}
// Labels section
if (spaceData.labels?.results) {
lines.push('');
lines.push((0, formatter_util_js_1.formatHeading)('Labels', 2));
if (spaceData.labels.results.length === 0) {
lines.push('*No labels assigned to this space*');
}
else {
const labelLines = [];
spaceData.labels.results.forEach((label) => {
const prefix = label.prefix ? `${label.prefix}:` : '';
labelLines.push(`- **${prefix}${label.name}** (ID: ${label.id})`);
});
lines.push(labelLines.join('\n'));
if (spaceData.labels.meta?.hasMore) {
lines.push('');
lines.push('*More labels are available but not shown*');
}
}
}
// Links section
lines.push('');
lines.push((0, formatter_util_js_1.formatHeading)('Links', 2));
const links = [];
links.push(`- **Web UI**: ${fullUrl}`);
links.push(`- ${(0, formatter_util_js_1.formatUrl)(fullUrl, 'Open in Confluence')}`);
if (spaceData.homepageId) {
const homepageUrl = `${baseUrl}/wiki/spaces/${spaceData.key}/overview`;
links.push(`- ${(0, formatter_util_js_1.formatUrl)(homepageUrl, 'View Homepage')}`);
}
lines.push(links.join('\n'));
// Footer
lines.push('');
lines.push((0, formatter_util_js_1.formatSeparator)());
lines.push(`*Space information retrieved at ${(0, formatter_util_js_1.formatDate)(new Date())}*`);
lines.push(`*To view this space in Confluence, visit: ${fullUrl}*`);
return lines.join('\n');
}