launchnotes_search_feedback
Search and filter customer feedback in LaunchNotes projects by content, sentiment, importance, and status to analyze user input.
Instructions
Search and filter customer feedback in a LaunchNotes project.
Args:
project_id (string): The ID of the project (required)
query (string, optional): Search term to find in feedback content
reaction ('happy' | 'meh' | 'sad', optional): Filter by customer sentiment
importance ('low' | 'medium' | 'high', optional): Filter by importance level
organized_state (string, optional): Filter by state ('organized', 'unorganized', 'announcement', 'idea', 'roadmap')
starred (boolean, optional): Filter by starred status
archived (boolean, optional): Filter by archived status
limit (number, optional): Number to return (max 100, default: 20)
response_format ('json' | 'markdown'): Output format (default: 'markdown')
Returns: List of feedback items with content, sentiment, importance, customer info, and timestamps
Use Cases:
"What are customers saying about Digests?"
"Show me all unhappy feedback"
"Find high importance feedback that's unorganized"
"Search feedback containing 'API integration'"
"Show me starred feedback"
Error Handling:
Returns "Project not found" if project ID doesn't exist
Returns "Authentication failed" if API token is invalid
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | The ID of the LaunchNotes project | |
| query | No | Search term to find in feedback content | |
| reaction | No | Filter by customer reaction/sentiment | |
| importance | No | Filter by importance level | |
| organized_state | No | Filter by organized state: 'organized', 'unorganized', 'announcement', 'idea', 'roadmap' | |
| starred | No | Filter by starred status | |
| archived | No | Filter by archived status | |
| limit | No | Number of feedback items to return (max 100) | |
| response_format | No | Output format: 'json' for structured data, 'markdown' for human-readable | markdown |
Implementation Reference
- src/feedback/tools.ts:63-117 (handler)The asynchronous handler function that implements the core logic of the 'launchnotes_search_feedback' tool. It performs the GraphQL search query via searchFeedback, processes the results, and returns formatted JSON or Markdown output based on parameters. Handles errors gracefully.
async (params: SearchFeedbackInput) => { try { const result = await searchFeedback(client, { projectId: params.project_id, query: params.query, reaction: params.reaction, importance: params.importance, organizedState: params.organized_state, starred: params.starred, archived: params.archived, first: params.limit, }); const feedbacks = result.project.feedbacks.nodes; if (params.response_format === RESPONSE_FORMAT.JSON) { return { content: [ { type: "text", text: JSON.stringify( { total: feedbacks.length, feedbacks, hasMore: result.project.feedbacks.pageInfo.hasNextPage, }, null, 2 ), }, ], }; } // Markdown format return { content: [ { type: "text", text: formatFeedbackListMarkdown(feedbacks), }, ], }; } catch (error) { return { isError: true, content: [ { type: "text", text: `Error searching feedback: ${error instanceof Error ? error.message : "Unknown error"}`, }, ], }; } } - src/feedback/schemas.ts:35-68 (schema)Zod schema defining the input parameters and validation for the 'launchnotes_search_feedback' tool, including project_id, filters like query, reaction, importance, and output format.
export const SearchFeedbackSchema = z .object({ project_id: z .string() .min(1, "Project ID is required") .describe("The ID of the LaunchNotes project"), query: z .string() .optional() .describe("Search term to find in feedback content"), reaction: reactionSchema, importance: importanceSchema, organized_state: z .string() .optional() .describe("Filter by organized state: 'organized', 'unorganized', 'announcement', 'idea', 'roadmap'"), starred: z .boolean() .optional() .describe("Filter by starred status"), archived: z .boolean() .optional() .describe("Filter by archived status"), limit: z .number() .min(1) .max(100) .default(20) .optional() .describe("Number of feedback items to return (max 100)"), response_format: responseFormatSchema, }) .strict(); - src/feedback/tools.ts:26-62 (registration)The server.registerTool call that registers the 'launchnotes_search_feedback' tool, including its name, title, detailed description, input schema reference, and annotations.
"launchnotes_search_feedback", { title: "Search LaunchNotes Feedback", description: `Search and filter customer feedback in a LaunchNotes project. Args: - project_id (string): The ID of the project (required) - query (string, optional): Search term to find in feedback content - reaction ('happy' | 'meh' | 'sad', optional): Filter by customer sentiment - importance ('low' | 'medium' | 'high', optional): Filter by importance level - organized_state (string, optional): Filter by state ('organized', 'unorganized', 'announcement', 'idea', 'roadmap') - starred (boolean, optional): Filter by starred status - archived (boolean, optional): Filter by archived status - limit (number, optional): Number to return (max 100, default: 20) - response_format ('json' | 'markdown'): Output format (default: 'markdown') Returns: List of feedback items with content, sentiment, importance, customer info, and timestamps Use Cases: - "What are customers saying about Digests?" - "Show me all unhappy feedback" - "Find high importance feedback that's unorganized" - "Search feedback containing 'API integration'" - "Show me starred feedback" Error Handling: - Returns "Project not found" if project ID doesn't exist - Returns "Authentication failed" if API token is invalid`, inputSchema: SearchFeedbackSchema, annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true, }, },