@aashari/mcp-server-atlassian-bitbucket
Version:
Node.js/TypeScript MCP server for Atlassian Bitbucket. Enables AI systems (LLMs) to interact with workspaces, repositories, and pull requests via tools (list, get, comment, search). Connects AI directly to version control workflows through the standard MC
131 lines (130 loc) • 6.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatRepositoriesList = formatRepositoriesList;
exports.formatRepositoryDetails = formatRepositoryDetails;
const formatter_util_js_1 = require("../utils/formatter.util.js");
/**
* Format a list of repositories for display
* @param repositoriesData - Raw repositories data from the API
* @returns Formatted string with repositories information in markdown format
*/
function formatRepositoriesList(repositoriesData) {
const repositories = repositoriesData.values || [];
if (repositories.length === 0) {
return 'No repositories found matching your criteria.';
}
const lines = [(0, formatter_util_js_1.formatHeading)('Bitbucket Repositories', 1), ''];
// Format each repository with its details
const formattedList = (0, formatter_util_js_1.formatNumberedList)(repositories, (repo, index) => {
const itemLines = [];
itemLines.push((0, formatter_util_js_1.formatHeading)(repo.name, 2));
// Basic information
const properties = {
Name: repo.name,
'Full Name': repo.full_name,
Owner: repo.owner?.display_name || repo.owner?.username || 'Unknown',
Description: repo.description || 'No description provided',
'Project Key': repo.project?.key || 'N/A',
Private: repo.is_private ? 'Yes' : 'No',
Created: repo.created_on
? (0, formatter_util_js_1.formatDate)(new Date(repo.created_on))
: 'N/A',
Updated: repo.updated_on
? (0, formatter_util_js_1.formatDate)(new Date(repo.updated_on))
: 'N/A',
URL: repo.links?.html?.href
? (0, formatter_util_js_1.formatUrl)(repo.links.html.href, repo.full_name)
: 'N/A',
};
// Format as a bullet list
itemLines.push((0, formatter_util_js_1.formatBulletList)(properties, (key) => key));
// Add separator between repositories except for the last one
if (index < repositories.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(`*Repository information retrieved at ${(0, formatter_util_js_1.formatDate)(new Date())}*`);
return lines.join('\n');
}
/**
* Format detailed repository information for display
* @param repositoryData - Raw repository data from the API
* @param pullRequestsData - Optional pull requests data for this repository
* @returns Formatted string with repository details in markdown format
*/
function formatRepositoryDetails(repositoryData, pullRequestsData) {
// Create URL
const repoUrl = repositoryData.links?.html?.href || '';
const lines = [
(0, formatter_util_js_1.formatHeading)(`Repository: ${repositoryData.name}`, 1),
'',
`> A ${repositoryData.is_private ? 'private' : 'public'} repository in the \`${repositoryData.full_name}\` workspace.`,
'',
(0, formatter_util_js_1.formatHeading)('Basic Information', 2),
];
// Format basic information as a bullet list
const basicProperties = {
Name: repositoryData.name,
'Full Name': repositoryData.full_name,
UUID: repositoryData.uuid,
Description: repositoryData.description || 'No description provided',
Language: repositoryData.language || 'Not specified',
Private: repositoryData.is_private ? 'Yes' : 'No',
Size: repositoryData.size
? `${(repositoryData.size / 1024).toFixed(2)} KB`
: 'Unknown',
'Created On': repositoryData.created_on
? (0, formatter_util_js_1.formatDate)(new Date(repositoryData.created_on))
: 'N/A',
'Updated On': repositoryData.updated_on
? (0, formatter_util_js_1.formatDate)(new Date(repositoryData.updated_on))
: 'N/A',
};
lines.push((0, formatter_util_js_1.formatBulletList)(basicProperties, (key) => key));
// Owner information
if (repositoryData.owner) {
lines.push('');
lines.push((0, formatter_util_js_1.formatHeading)('Owner', 2));
const ownerProperties = {
Name: repositoryData.owner.display_name ||
repositoryData.owner.username ||
'Unknown',
Type: repositoryData.owner.type || 'Not specified',
};
lines.push((0, formatter_util_js_1.formatBulletList)(ownerProperties, (key) => key));
}
// Links section
lines.push('');
lines.push((0, formatter_util_js_1.formatHeading)('Links', 2));
if (repoUrl) {
lines.push(`- ${(0, formatter_util_js_1.formatUrl)(repoUrl, 'Open in Bitbucket')}`);
}
// Add recent pull requests section if available
if (pullRequestsData &&
pullRequestsData.values &&
pullRequestsData.values.length > 0) {
lines.push('');
lines.push((0, formatter_util_js_1.formatHeading)('Recent Pull Requests', 2));
const prList = pullRequestsData.values.slice(0, 25); // Ensure max 25
const formattedPrList = (0, formatter_util_js_1.formatNumberedList)(prList, (pr) => {
return `**#${pr.id}**: [${pr.title}](${pr.links.html?.href || '#'}) - ${pr.state} by ${pr.author.display_name || 'Unknown'} (${(0, formatter_util_js_1.formatDate)(new Date(pr.updated_on))})`;
});
lines.push(formattedPrList);
lines.push('');
lines.push(`*Showing ${prList.length} recent pull requests.*`);
if (repoUrl) {
lines.push(`*View all pull requests in Bitbucket: [${repositoryData.full_name}/pull-requests](${repoUrl}/pull-requests)*`);
}
}
// Add timestamp for when this information was retrieved
lines.push('');
lines.push((0, formatter_util_js_1.formatSeparator)());
lines.push(`*Repository information retrieved at ${(0, formatter_util_js_1.formatDate)(new Date())}*`);
lines.push(`*To view this repository in Bitbucket, visit: ${repoUrl}*`);
return lines.join('\n');
}