UNPKG

@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
"use strict"; 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'); }