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

80 lines (79 loc) 4.42 kB
"use strict"; 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 };