diff --git a/mcp/src/tools/labels.ts b/mcp/src/tools/labels.ts index 51aac496..92275f30 100644 --- a/mcp/src/tools/labels.ts +++ b/mcp/src/tools/labels.ts @@ -10,6 +10,20 @@ import { } from '../api-client.js' import { errorResponse, escapeMarkdown, safeTableCell, textResponse } from '../utils.js' +/** + * Find a label by name using tiered matching: exact match first, then substring fallback. + */ +function findLabelByName( + labels: T[], + labelName: string, +): T | undefined { + if (!labelName.trim()) return undefined + const nameLower = labelName.toLowerCase() + const exactMatch = labels.find((l) => l.name.toLowerCase() === nameLower) + if (exactMatch) return exactMatch + return labels.find((l) => l.name.toLowerCase().includes(nameLower)) +} + /** * Format a list of labels for display */ @@ -94,9 +108,7 @@ export function registerLabelTools(server: McpServer) { return errorResponse(listResult.error) } - const label = listResult.data?.find((l) => - l.name.toLowerCase().includes(labelName.toLowerCase()), - ) + const label = listResult.data ? findLabelByName(listResult.data, labelName) : undefined if (!label) { return errorResponse(`Label not found: ${labelName}`) @@ -145,9 +157,7 @@ export function registerLabelTools(server: McpServer) { return errorResponse(listResult.error) } - const label = listResult.data?.find((l) => - l.name.toLowerCase().includes(labelName.toLowerCase()), - ) + const label = listResult.data ? findLabelByName(listResult.data, labelName) : undefined if (!label) { return errorResponse(`Label not found: ${labelName}`) @@ -188,9 +198,7 @@ export function registerLabelTools(server: McpServer) { return errorResponse(labelsResult.error) } - const label = labelsResult.data?.find((l) => - l.name.toLowerCase().includes(labelName.toLowerCase()), - ) + const label = labelsResult.data ? findLabelByName(labelsResult.data, labelName) : undefined if (!label) { return errorResponse(`Label not found: ${labelName}`) @@ -257,9 +265,7 @@ export function registerLabelTools(server: McpServer) { } // Find the label on the ticket - const label = ticket.labels.find((l) => - l.name.toLowerCase().includes(labelName.toLowerCase()), - ) + const label = findLabelByName(ticket.labels, labelName) if (!label) { return errorResponse(