linear_get_issue_with_comments
Fetch detailed Linear issue data including all comments and complete information using the provided issue URL or identifier for streamlined issue tracking and collaboration.
Instructions
Fetch a Linear issue with all its comments and complete information.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| issue | Yes | Linear issue URL or identifier (e.g., 'ENG-123' or 'https://linear.app/team/issue/ENG-123/issue-title') |
Implementation Reference
- linear-issues-mcp-server.js:255-262 (handler)Handler function that invokes fetchLinearIssue with comments enabled for the linear_get_issue_with_comments tool.* Tool handler for linear_get_issue_with_comments - Fetches a Linear issue with its comments * @param {Object} params - Parameters from the tool call * @param {string} params.issue - Linear issue URL or ID * @returns {Object} - Response object with issue details and comments or error */ async function getLinearIssueWithComments({ issue }) { return fetchLinearIssue(issue, true); }
- linear-issues-mcp-server.js:264-284 (registration)Registers the linear_get_issue_with_comments tool, including its description, input schema, handler reference, and annotations.// Register the linear_get_issue_with_comments tool server.tool( "linear_get_issue_with_comments", "Fetch a Linear issue with all its comments and complete information.", { issue: z .string() .describe( "Linear issue URL or identifier (e.g., 'ENG-123' or 'https://linear.app/team/issue/ENG-123/issue-title')" ), }, getLinearIssueWithComments, { annotations: { readOnlyHint: true, // This tool doesn't modify anything destructiveHint: false, // This tool doesn't make destructive changes idempotentHint: true, // Repeated calls have the same effect openWorldHint: true, // This tool interacts with the external Linear API }, } );
- linear-issues-mcp-server.js:115-220 (helper)Core helper function that performs the API request to Linear, handles URL parsing, fetches issue data and comments, formats the response.async function fetchLinearIssue(issue, includeComments = false) { // Get access token from environment variable const accessToken = process.env.LINEAR_API_TOKEN; if (!accessToken) { return { content: [ { type: "text", text: "Error: No Linear API token found in environment. Set the LINEAR_API_TOKEN environment variable.", }, ], isError: true, }; } try { let issueId = issue; // Check if it's a URL and extract the ID if it is if (issue.startsWith("http")) { const parsedId = parseIssueIDFromURL(issue); if (!parsedId) { return { content: [ { type: "text", text: `Error: Invalid Linear issue URL: ${issue}`, }, ], isError: true, }; } issueId = parsedId; } const data = await linearApiRequest( issueQuery, { id: issueId, includeComments }, accessToken ); if (!data.issue) { return { content: [ { type: "text", text: `Error: Linear issue not found: ${issue}`, }, ], isError: true, }; } const issueData = data.issue; // Format the base issue data const formattedIssue = { identifier: issueData.identifier, title: issueData.title, url: issueData.url, description: issueData.description || "", state: issueData.state?.name || "", priority: issueData.priorityLabel || "", assignee: issueData.assignee ? issueData.assignee.displayName || issueData.assignee.name : "Unassigned", createdAt: new Date(issueData.createdAt).toISOString(), updatedAt: new Date(issueData.updatedAt).toISOString(), }; // Add comments if requested if (includeComments && issueData.comments) { const formattedComments = (issueData.comments.nodes || []).map( (comment) => ({ body: comment.body, author: comment.user ? comment.user.displayName || comment.user.name : "Unknown", createdAt: new Date(comment.createdAt).toISOString(), }) ); formattedIssue.comments = formattedComments; } return { content: [ { type: "text", text: JSON.stringify(formattedIssue, null, 2), }, ], }; } catch (error) { return { content: [ { type: "text", text: `Error fetching Linear issue${ includeComments ? " with comments" : "" }: ${error.message}`, }, ], isError: true, }; } }
- linear-issues-mcp-server.js:90-107 (helper)GraphQL query used to fetch issue details conditionally including comments.const issueQuery = ` query IssueDetails($id: String!, $includeComments: Boolean!) { issue(id: $id) { ...IssueFragment comments @include(if: $includeComments) { nodes { body user { name displayName } createdAt } } } } ${issueFragment} `;
- linear-issues-mcp-server.js:23-34 (helper)Helper function to parse Linear issue ID from a URL.function parseIssueIDFromURL(urlStr) { try { const url = new URL(urlStr); if (!url.hostname.endsWith("linear.app")) { return null; } const match = url.pathname.match(/\/issue\/([a-zA-Z0-9_-]+)/); return match ? match[1] : null; } catch (e) { return null; } }