MCP server for Freshdesk support ticket management, providing tools to retrieve, search, and analyze tickets, conversations, attachments, and related entities
Strong foundation with 15 well-named tools following verb_noun convention (get_, search_, list_, find_). All tools have descriptions (avg ~150 chars, within baseline 194). Input schemas present with typed parameters. However, output schemas are not explicitly documented in the visible code, only inferred from struct definitions. Parameter descriptions are present but some lack constraint details (e.g., status codes documented in description text rather than enums). Error handling guidance is minimal. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being READ_ONLY. Composition is strong, tools chain well (search_tickets → get_ticket → get_conversations → get_attachment_text). Naming is clear and unambiguous.
Get comprehensive summaries for multiple tickets in parallel. Each summary includes ticket details, conversations, and attachments.
Search for Freshdesk support agents by name or email. Returns matching agents with id, name, email.
Search for Freshdesk companies by name. Returns matching companies with id, name, domains.
Find all image attachments (PNG, JPEG) across multiple tickets. Useful for batch OCR or visual analysis.
Search for Freshdesk contacts (requesters) by name or email. Returns matching contacts with id, name, email, phone.
Extract text content from a single attachment. Supports .docx, .xlsx, .json, .csv, .txt, and images (PNG/JPEG with OCR). Returns extracted text.
Output schemas not formally documented. Struct definitions exist in code (GetTicketOutput, SearchTicketsOutput, etc.) but are not exposed in tool registration or visible in the MCP protocol layer. LLMs cannot see what fields to expect without reading Go source.
Status and priority codes documented as inline text (e.g., '2=open, 3=pending, 4=resolved, 5=closed') rather than enum constraints. LLMs may hallucinate invalid codes. Should use JSON Schema enum or oneOf.
No tool annotations despite all 15 tools being READ_ONLY. Missing readOnlyHint in tool metadata. Agents cannot distinguish safe tools from destructive ones without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Get all replies, notes and email threads for a Freshdesk ticket. Returns body_text (plain text without HTML), incoming (true=from customer), private (true=internal note), created_at timestamp.
Extract and OCR all inline images from a ticket's description. Returns image URLs and extracted text.
Retrieve a single Freshdesk support ticket by its numeric ID. Returns full details including id, subject, status, type, priority, due_by, is_escalated, created_at, tags and custom_fields (cf_impact, cf_urgency, cf_category, cf_subcategory, cf_domain).
Get a comprehensive summary of a ticket including full ticket details, all conversations, and all attachments with extracted text. Useful for complete ticket analysis.
List all attachments for a ticket (from ticket description and all conversations). Returns attachment metadata: id, name, content_type, size.
List all Freshdesk support groups/teams. Returns group id and name.
List all Freshdesk tickets with optional filtering by status, priority, type, and date ranges. Returns paginated results.
Search for a query string within a single attachment's extracted text. Returns matching content or 'no matches found'.
Search and filter Freshdesk tickets. All fields are optional. Filters: query (text matched against subject or type), status (2=open, 3=pending, 4=resolved, 5=closed), priority (1=low, 2=medium, 3=high, 4=urgent), type ("False Positive", "False Negative", "Service Request", "Incident"), overdue (true = tickets past due_by that are still open or pending), is_escalated (true = escalated tickets only), created_after / created_before (ISO8601 date e.g. "2026-06-01T00:00:00Z"), requester_id (from find_requester tool), company_id (from find_company tool)
Error handling guidance absent. No recovery hints in descriptions (e.g., 'If ticket not found, try search_tickets'). Errors likely return raw HTTP status codes without actionable guidance for LLM retry logic.
Pagination not visible in tool definitions. search_tickets and list_tickets likely return paginated results but no limit/offset/page parameters or total count in output schema are documented.