Skip to main content
Glama
kornbed

Jira MCP Server for Cursor

get_comments

Retrieve comments for a Jira ticket to track discussions and updates directly within your editor.

Instructions

Get comments for a specific Jira ticket

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
ticketIdYesThe Jira ticket ID (e.g., PROJECT-123)

Implementation Reference

  • The handler function for the 'get_comments' tool. It validates Jira configuration, fetches comments using the Jira API, formats them with author, date, and extracted text body using the extractTextFromADF helper, and handles errors including 404 for non-existent tickets.
    async ({ ticketId }: { ticketId: string }) => {
      const configError = validateJiraConfig();
      if (configError) {
        return {
          content: [{ type: "text", text: `Configuration error: ${configError}` }],
        };
      }
    
      try {
        const commentsResult = await jira.issueComments.getComments({ issueIdOrKey: ticketId });
        
        if (!commentsResult.comments || commentsResult.comments.length === 0) {
          return {
            content: [{ type: "text", text: "No comments found for this ticket." }],
          };
        }
    
        const formattedComments = commentsResult.comments.map(comment => {
          const author = comment.author?.displayName || 'Unknown Author';
          // Comments also use ADF, so we need to parse them
          const body = extractTextFromADF(comment.body) || 'No comment body'; 
          const createdDate = comment.created ? new Date(comment.created).toLocaleString() : 'Unknown date';
          return `[${createdDate}] ${author}:\n${body.trim()}\n---`; // Added trim() and separator
        }).join('\n\n'); // Separate comments with double newline
    
        return {
          content: [{ type: "text", text: formattedComments }],
        };
      } catch (error) {
        // Handle cases where the ticket might not exist or other API errors
        if ((error as any).response?.status === 404) {
            return {
                content: [{ type: "text", text: `Ticket ${ticketId} not found.` }],
            };
        }
        return {
          content: [{ type: "text", text: `Failed to fetch comments: ${(error as Error).message}` }],
        };
      }
    }
  • Input schema for the 'get_comments' tool, defining the required 'ticketId' parameter as a string with description.
    {
      ticketId: z.string().describe("The Jira ticket ID (e.g., PROJECT-123)"),
    },
  • src/server.ts:223-269 (registration)
    Registration of the 'get_comments' tool using server.tool(), including name, description, input schema, and handler function.
    server.tool(
      "get_comments",
      "Get comments for a specific Jira ticket",
      {
        ticketId: z.string().describe("The Jira ticket ID (e.g., PROJECT-123)"),
      },
      async ({ ticketId }: { ticketId: string }) => {
        const configError = validateJiraConfig();
        if (configError) {
          return {
            content: [{ type: "text", text: `Configuration error: ${configError}` }],
          };
        }
    
        try {
          const commentsResult = await jira.issueComments.getComments({ issueIdOrKey: ticketId });
          
          if (!commentsResult.comments || commentsResult.comments.length === 0) {
            return {
              content: [{ type: "text", text: "No comments found for this ticket." }],
            };
          }
    
          const formattedComments = commentsResult.comments.map(comment => {
            const author = comment.author?.displayName || 'Unknown Author';
            // Comments also use ADF, so we need to parse them
            const body = extractTextFromADF(comment.body) || 'No comment body'; 
            const createdDate = comment.created ? new Date(comment.created).toLocaleString() : 'Unknown date';
            return `[${createdDate}] ${author}:\n${body.trim()}\n---`; // Added trim() and separator
          }).join('\n\n'); // Separate comments with double newline
    
          return {
            content: [{ type: "text", text: formattedComments }],
          };
        } catch (error) {
          // Handle cases where the ticket might not exist or other API errors
          if ((error as any).response?.status === 404) {
              return {
                  content: [{ type: "text", text: `Ticket ${ticketId} not found.` }],
              };
          }
          return {
            content: [{ type: "text", text: `Failed to fetch comments: ${(error as Error).message}` }],
          };
        }
      }
    );
  • Helper function to recursively extract plain text from Jira's ADF (Atlassian Document Format) structures, used to parse comment bodies in the handler.
    function extractTextFromADF(node: any): string {
      if (!node) {
        return '';
      }
    
      // Handle text nodes directly
      if (node.type === 'text' && node.text) {
        return node.text;
      }
    
      let text = '';
      // Handle block nodes like paragraph, heading, etc.
      if (node.content && Array.isArray(node.content)) {
        text = node.content.map(extractTextFromADF).join('');
        // Add a newline after paragraphs for better formatting
        if (node.type === 'paragraph') {
          text += '\n';
        }
      }
    
      return text;
    }

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/kornbed/jira-mcp-server'

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