@aashari/mcp-server-atlassian-jira
Version:
Node.js/TypeScript MCP server for Atlassian Jira. Equips AI systems (LLMs) with tools to list/get projects, search/get issues (using JQL/ID), and view dev info (commits, PRs). Connects AI capabilities directly into Jira project management and issue tracki
138 lines (137 loc) • 5.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const transport_util_js_1 = require("../utils/transport.util.js");
const logger_util_js_1 = require("../utils/logger.util.js");
const error_util_js_1 = require("../utils/error.util.js");
// Create a contextualized logger for this file
const serviceLogger = logger_util_js_1.Logger.forContext('services/vendor.atlassian.devinfo.service.ts');
// Log service initialization
serviceLogger.debug('Jira development info service initialized');
/**
* Base API path for Dev Status API
* @constant {string}
*/
const API_PATH = '/rest/dev-status/latest';
/**
* Get development information summary for an issue
* @param issueId The issue ID
* @returns Development information summary
*/
async function getSummary(issueId) {
const methodLogger = logger_util_js_1.Logger.forContext('services/vendor.atlassian.devinfo.service.ts', 'getSummary');
methodLogger.debug(`Getting development info summary for issue ${issueId}`);
const credentials = (0, transport_util_js_1.getAtlassianCredentials)();
if (!credentials) {
throw (0, error_util_js_1.createAuthMissingError)(`Get dev info summary for issue ${issueId}`);
}
try {
const path = `${API_PATH}/issue/summary?issueId=${issueId}`;
methodLogger.debug(`Calling Jira API: ${path}`);
return (0, transport_util_js_1.fetchAtlassian)(credentials, path);
}
catch (error) {
methodLogger.error(`Error fetching development info summary for issue ${issueId}:`, error);
throw error;
}
}
/**
* Get detailed commit information for an issue
* @param issueId The issue ID
* @returns Commit information details
*/
async function getCommits(issueId) {
const methodLogger = logger_util_js_1.Logger.forContext('services/vendor.atlassian.devinfo.service.ts', 'getCommits');
methodLogger.debug(`Getting commits for issue ${issueId}`);
const credentials = (0, transport_util_js_1.getAtlassianCredentials)();
if (!credentials) {
throw (0, error_util_js_1.createAuthMissingError)(`Get commits for issue ${issueId}`);
}
try {
// Bitbucket is the application type revealed in testing
const path = `${API_PATH}/issue/detail?issueId=${issueId}&applicationType=bitbucket&dataType=repository`;
methodLogger.debug(`Calling Jira API: ${path}`);
return (0, transport_util_js_1.fetchAtlassian)(credentials, path);
}
catch (error) {
methodLogger.error(`Error fetching commit information for issue ${issueId}:`, error);
throw error;
}
}
/**
* Get branch information for an issue
* @param issueId The issue ID
* @returns Branch information details
*/
async function getBranches(issueId) {
const methodLogger = logger_util_js_1.Logger.forContext('services/vendor.atlassian.devinfo.service.ts', 'getBranches');
methodLogger.debug(`Getting branches for issue ${issueId}`);
const credentials = (0, transport_util_js_1.getAtlassianCredentials)();
if (!credentials) {
throw (0, error_util_js_1.createAuthMissingError)(`Get branches for issue ${issueId}`);
}
try {
const path = `${API_PATH}/issue/detail?issueId=${issueId}&applicationType=bitbucket&dataType=branch`;
methodLogger.debug(`Calling Jira API: ${path}`);
return (0, transport_util_js_1.fetchAtlassian)(credentials, path);
}
catch (error) {
methodLogger.error(`Error fetching branch information for issue ${issueId}:`, error);
throw error;
}
}
/**
* Get pull request information for an issue
* @param issueId The issue ID
* @returns Pull request information details
*/
async function getPullRequests(issueId) {
const methodLogger = logger_util_js_1.Logger.forContext('services/vendor.atlassian.devinfo.service.ts', 'getPullRequests');
methodLogger.debug(`Getting pull requests for issue ${issueId}`);
const credentials = (0, transport_util_js_1.getAtlassianCredentials)();
if (!credentials) {
throw (0, error_util_js_1.createAuthMissingError)(`Get pull requests for issue ${issueId}`);
}
try {
const path = `${API_PATH}/issue/detail?issueId=${issueId}&applicationType=bitbucket&dataType=pullrequest`;
methodLogger.debug(`Calling Jira API: ${path}`);
return (0, transport_util_js_1.fetchAtlassian)(credentials, path);
}
catch (error) {
methodLogger.error(`Error fetching pull request information for issue ${issueId}:`, error);
throw error;
}
}
/**
* Get all development information for an issue (summary, commits, branches, pull requests)
* @param issueId The issue ID
* @returns Complete development information
*/
async function getAllDevInfo(issueId) {
const methodLogger = logger_util_js_1.Logger.forContext('services/vendor.atlassian.devinfo.service.ts', 'getAllDevInfo');
methodLogger.debug(`Getting all development info for issue ${issueId}`);
try {
const [summary, commits, branches, pullRequests] = await Promise.all([
getSummary(issueId),
getCommits(issueId),
getBranches(issueId),
getPullRequests(issueId),
]);
return {
summary,
commits,
branches,
pullRequests,
};
}
catch (error) {
methodLogger.error(`Error fetching all development information for issue ${issueId}:`, error);
throw error;
}
}
exports.default = {
getSummary,
getCommits,
getBranches,
getPullRequests,
getAllDevInfo,
};