@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
80 lines (79 loc) • 4.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const atlassian_pullrequests_base_controller_js_1 = require("./atlassian.pullrequests.base.controller.js");
/**
* List Bitbucket pull requests with optional filtering options
* @param options - Options for listing pull requests including workspace slug and repo slug
* @returns Promise with formatted pull requests list content and pagination information
*/
async function list(options) {
const methodLogger = atlassian_pullrequests_base_controller_js_1.Logger.forContext('controllers/atlassian.pullrequests.list.controller.ts', 'list');
try {
// Create defaults object with proper typing
const defaults = {
limit: atlassian_pullrequests_base_controller_js_1.DEFAULT_PAGE_SIZE,
};
// Apply defaults
const mergedOptions = (0, atlassian_pullrequests_base_controller_js_1.applyDefaults)(options, defaults);
// Handle optional workspaceSlug - get default if not provided
if (!mergedOptions.workspaceSlug) {
methodLogger.debug('No workspace provided, fetching default workspace');
const defaultWorkspace = await (0, atlassian_pullrequests_base_controller_js_1.getDefaultWorkspace)();
if (!defaultWorkspace) {
throw new Error('Could not determine a default workspace. Please provide a workspaceSlug.');
}
mergedOptions.workspaceSlug = defaultWorkspace;
methodLogger.debug(`Using default workspace: ${mergedOptions.workspaceSlug}`);
}
const { workspaceSlug, repoSlug } = mergedOptions;
if (!workspaceSlug || !repoSlug) {
throw new Error('Workspace slug and repository slug are required');
}
methodLogger.debug(`Listing pull requests for ${workspaceSlug}/${repoSlug}...`, mergedOptions);
// Format the query for Bitbucket API if provided - specifically target title/description
const formattedQuery = mergedOptions.query
? `(title ~ "${mergedOptions.query}" OR description ~ "${mergedOptions.query}")` // Construct specific query for PRs
: undefined;
// Map controller options to service parameters
const serviceParams = {
workspace: workspaceSlug,
repo_slug: repoSlug,
pagelen: mergedOptions.limit,
page: mergedOptions.cursor
? parseInt(mergedOptions.cursor, 10)
: undefined,
state: mergedOptions.state,
sort: '-updated_on', // Sort by most recently updated first
...(formattedQuery && { q: formattedQuery }),
};
methodLogger.debug('Using service parameters:', serviceParams);
const pullRequestsData = await atlassian_pullrequests_base_controller_js_1.atlassianPullRequestsService.list(serviceParams);
methodLogger.debug(`Retrieved ${pullRequestsData.values?.length || 0} pull requests`);
// Extract pagination information using the utility
const pagination = (0, atlassian_pullrequests_base_controller_js_1.extractPaginationInfo)(pullRequestsData, atlassian_pullrequests_base_controller_js_1.PaginationType.PAGE);
// Format the pull requests data for display using the formatter
const formattedPullRequests = (0, atlassian_pullrequests_base_controller_js_1.formatPullRequestsList)(pullRequestsData);
// Create the final content by combining the formatted pull requests with pagination information
let finalContent = formattedPullRequests;
// Add pagination information if available
if (pagination &&
(pagination.hasMore || pagination.count !== undefined)) {
const paginationString = (0, atlassian_pullrequests_base_controller_js_1.formatPagination)(pagination);
finalContent += '\n\n' + paginationString;
}
return {
content: finalContent,
};
}
catch (error) {
// Use the standardized error handler
throw (0, atlassian_pullrequests_base_controller_js_1.handleControllerError)(error, {
entityType: 'Pull Requests',
operation: 'listing',
source: 'controllers/atlassian.pullrequests.list.controller.ts@list',
additionalInfo: { options },
});
}
}
// Export the controller functions
exports.default = { list };