Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions mcp/src/tools/labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<T extends { name: string }>(
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
*/
Expand Down Expand Up @@ -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}`)
Expand Down Expand Up @@ -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}`)
Expand Down Expand Up @@ -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}`)
Expand Down Expand Up @@ -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(
Expand Down
Loading