Skip to main content
Glama
jira-issues.ts3.13 kB
import { JiraClient } from '../clients/jira-client.js'; import { readJiraIssueSchema, ReadJiraIssueInput } from '../utils/validation.js'; let jiraClient: JiraClient | null = null; const getJiraClient = (): JiraClient => { if (!jiraClient) { jiraClient = new JiraClient(); } return jiraClient; }; export const readJiraIssue = async (input: ReadJiraIssueInput) => { const validatedInput = readJiraIssueSchema.parse(input); try { const issue = await getJiraClient().getIssue(validatedInput.issueKey, validatedInput.fields); return { success: true, data: { key: issue.key, summary: issue.fields?.summary || null, description: issue.fields?.description || null, status: issue.fields?.status ? { name: issue.fields.status.name, category: issue.fields.status.statusCategory?.name || 'Unknown', } : null, priority: issue.fields?.priority?.name || null, assignee: issue.fields?.assignee ? { name: issue.fields.assignee.displayName, email: issue.fields.assignee.emailAddress, } : null, reporter: issue.fields?.reporter ? { name: issue.fields.reporter.displayName, email: issue.fields.reporter.emailAddress, } : null, created: issue.fields?.created || null, updated: issue.fields?.updated || null, issueType: issue.fields?.issuetype?.name || null, project: issue.fields?.project ? { key: issue.fields.project.key, name: issue.fields.project.name, } : null, labels: issue.fields?.labels || [], components: issue.fields?.components?.map(c => c.name) || [], fixVersions: issue.fields?.fixVersions?.map(v => v.name) || [], customFields: issue.fields ? Object.entries(issue.fields) .filter(([key]) => key.startsWith('customfield_')) .reduce((acc, [key, value]) => ({ ...acc, [key]: value, }), {}) : {}, }, }; } catch (error: any) { return { success: false, error: error.response?.data?.errorMessages?.[0] || error.message, }; } }; export const searchJiraIssues = async (input: { jql: string; fields?: string[]; maxResults?: number; }) => { try { const result = await getJiraClient().searchIssues( input.jql, input.fields, input.maxResults || 50 ); return { success: true, data: { total: result.total, issues: result.issues.map(issue => ({ key: issue.key, summary: issue.fields?.summary || 'No Summary', status: issue.fields?.status?.name || 'Unknown', assignee: issue.fields?.assignee?.displayName || 'Unassigned', project: issue.fields?.project?.key || 'Unknown', issueType: issue.fields?.issuetype?.name || 'Unknown', updated: issue.fields?.updated || null, })), }, }; } catch (error: any) { return { success: false, error: error.response?.data?.errorMessages?.[0] || error.message, }; } };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/leorosignoli/jira-zephyr-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server