UNPKG

@tiflux/mcp

Version:

TiFlux MCP Server - Model Context Protocol integration for Claude Code and other AI clients

446 lines (352 loc) 14.9 kB
# TiFlux MCP Server Model Context Protocol (MCP) server for TiFlux integration with Claude Code and other AI clients. ## Features - **Ticket Management**: Get, create, update, close and list tickets with comprehensive filtering - **Internal Communications**: Create and list internal communications for tickets with file attachments - **Client Search**: Search for clients by name with automatic resolution - **File Upload Support**: Attach up to 10 files (25MB each) to internal communications - **API Integration**: Direct integration with TiFlux API v2 - **Environment Configuration**: Secure configuration with environment variables - **Comprehensive Testing**: 78 automated tests with 100% mock isolation ## Installation ```bash npm install -g @tiflux/mcp ``` ## Usage ### With Claude Code Add to your MCP configuration: ```json { "tiflux": { "command": "npx", "args": ["@tiflux/mcp@latest"] } } ``` ### With Other MCP Clients ```bash npx @tiflux/mcp@latest ``` ## Configuration Create a `.env` file with your TiFlux API credentials: ```bash # TiFlux API Configuration TIFLUX_API_KEY=your_api_key_here # Default values for ticket creation TIFLUX_DEFAULT_CLIENT_ID=1 TIFLUX_DEFAULT_DESK_ID=1 TIFLUX_DEFAULT_PRIORITY_ID=1 TIFLUX_DEFAULT_CATALOG_ITEM_ID=1 ``` ## Available Tools ### get_ticket Retrieve a specific ticket by ID with comprehensive information including status, priority, desk, stage, catalog, responsible, client, audit data, SLA and URLs. **Parameters:** - `ticket_number` (string, required): Number of the ticket to retrieve - `show_entities` (boolean, optional): Include ALL custom fields linked to the ticket - `include_filled_entity` (boolean, optional): Include only custom fields with filled values **Returns:** Comprehensive ticket information including: - Status (ID, name, open/closed flags) - Priority (ID, name) - Desk (ID, internal name, display name, active status) - Stage (ID, name, first/last stage flags, max time) - Service Catalog (item ID, item name, area, catalog) - Responsible (ID, name, email, type, technical group) - Client (ID, name, social reason, active status) - Audit (created by ID, origin, created/updated dates) - SLA (status, expirations, deadlines) - Additional info (followers, worked hours, reopens, internal/external URLs) **New in v1.4.0:** Expanded fields for complete ticket metadata in a single call. ### create_ticket Create a new ticket in TiFlux. **Parameters:** - `title` (string, required): Ticket title - `description` (string, required): Ticket description - `client_id` (number, optional): Client ID - `client_name` (string, optional): Client name for automatic search (alternative to client_id) - `desk_id` (number, optional): Desk ID - `desk_name` (string, optional): Desk name for automatic search (alternative to desk_id) - `priority_id` (number, optional): Priority ID - `services_catalogs_item_id` (number, optional): Service catalog item ID - `catalog_item_name` (string, optional): Catalog item name for automatic search (alternative to services_catalogs_item_id, requires desk_id or desk_name) - `status_id` (number, optional): Status ID - `requestor_name` (string, optional): Requestor name - `requestor_email` (string, optional): Requestor email - `requestor_telephone` (string, optional): Requestor phone - `responsible_id` (number, optional): Responsible user ID - `responsible_name` (string, optional): Responsible user name for automatic search (alternative to responsible_id) - `followers` (string, optional): Comma-separated follower emails ### update_ticket Update an existing ticket in TiFlux. **Parameters:** - `ticket_id` (string, required): ID of the ticket to update - `title` (string, optional): New ticket title - `description` (string, optional): New ticket description - `client_id` (number, optional): New client ID - `desk_id` (number, optional): New desk ID - `desk_name` (string, optional): Desk name for automatic search (alternative to desk_id) - `stage_id` (number, optional): Stage/phase ID - `stage_name` (string, optional): Stage name for automatic search (alternative to stage_id, requires desk_id or desk_name) - `responsible_id` (number, optional): Responsible user ID (use null to unassign) - `responsible_name` (string, optional): Responsible user name for automatic search (alternative to responsible_id) - `followers` (string, optional): Comma-separated follower emails - `services_catalogs_item_id` (number, optional): Catalog item ID for updating desk with specific item - `catalog_item_name` (string, optional): Catalog item name for automatic search (alternative to services_catalogs_item_id, requires desk_id or desk_name) **Note:** At least one optional field must be provided along with the ticket_id. ### update_ticket_entities Update custom fields (entities) of a ticket in TiFlux. Supports up to 50 fields per request. **Parameters:** - `ticket_number` (string, required): Ticket number to update - `entities` (array, required): List of custom fields to update **Entity Object Structure:** - `entity_field_id` (number, required): Custom field ID (obtained via get_ticket) - `value` (string, required): Field value. Accepted types: - `text`: string - `text_area`: string - `currency`: float as string (e.g., "150.55") - `phone`: numbers only (e.g., "47999999999") - `email`: string - `link`: URL starting with http/https/ftp - `date`: format YYYY-MM-DD - `single_select`: option ID as string - `checkbox`: boolean as string "true"/"false" - Use `null` to clear non-required fields - `country_code` (string, optional): Country code (for phone fields outside Brazil) **Example:** ```json { "ticket_number": "123", "entities": [ { "entity_field_id": 72, "value": "New value" }, { "entity_field_id": 73, "value": "2025-01-15" } ] } ``` ### cancel_ticket Cancel a specific ticket in TiFlux. **Parameters:** - `ticket_number` (string, required): Ticket number to be cancelled (e.g., "37", "123") **Example:** ```json { "ticket_number": "84429" } ``` ### list_tickets List tickets with filtering options. **Parameters:** - `desk_ids` (string, optional): Comma-separated desk IDs (e.g., "1,2,3") - `desk_name` (string, optional): Desk name for automatic ID resolution - `client_ids` (string, optional): Comma-separated client IDs (e.g., "1,2,3") - `stage_ids` (string, optional): Comma-separated stage IDs (e.g., "1,2,3") - `stage_name` (string, optional): Stage name (must be used with desk_name) - `responsible_ids` (string, optional): Comma-separated responsible user IDs - `offset` (number, optional): Page number (default: 1) - `limit` (number, optional): Items per page (default: 20, max: 200) - `is_closed` (boolean, optional): Include closed tickets (default: false) **Note:** At least one filter (desk_ids/desk_name, client_ids, stage_ids/stage_name, or responsible_ids) is required. ### close_ticket Close a specific ticket in TiFlux. **Parameters:** - `ticket_number` (string, required): Ticket number to be closed (e.g., "37", "123") **Example:** ```json { "ticket_number": "84429" } ``` **Success Response:** ```markdown **Ticket #84429 fechado com sucesso!** **Mensagem:** Ticket 84429 closed successfully *Ticket fechado via API TiFlux* ``` ### create_ticket_answer Create a new answer (client communication) in a specific ticket. **Parameters:** - `ticket_number` (string, required): Ticket number where answer will be created - `text` (string, required): Answer content that will be sent to the client - `with_signature` (boolean, optional): Include user signature in the answer (default: false) - `files` (array, optional): Array of local file paths to attach (max 10 files, 40MB each) - `files_base64` (array, optional): Array of base64 encoded files `[{content: "base64...", filename: "file.pdf"}]` (alternative to files, max 10 files, 40MB each) **New in v1.3.0:** Support for base64 file upload via `files_base64` parameter. **Example:** ```json { "ticket_number": "123", "text": "Hello, your issue has been resolved.", "with_signature": true, "files": ["/path/to/attachment.pdf"] } ``` ### search_client Search for clients by name. **Parameters:** - `client_name` (string, required): Client name to search (partial match supported) ### search_user Search for users by name to use as responsible in tickets. **Parameters:** - `name` (string, required): User name to search (partial match supported, searches in name and email) - `type` (string, optional): User type filter (client, attendant, admin) - `active` (boolean, optional): Filter active (true) or inactive (false) users - `limit` (number, optional): Results per page (default: 20, max: 200) - `offset` (number, optional): Page number (default: 1) **Implementation Note:** The TiFlux API does not support name-based filtering in the `/users` endpoint. This tool fetches up to 200 users from the API and performs client-side filtering by name and email. This approach ensures compatibility with the API while providing the expected search functionality. **Requirements:** The API user must have the `users_manage` permission to access the `/users` endpoint. **Example:** ```json { "name": "John", "type": "attendant", "active": true } ``` ### search_stage Search for stages of a specific desk to use in ticket updates. **Parameters:** - `desk_id` (number, optional): Desk ID to search stages - `desk_name` (string, optional): Desk name for automatic search (alternative to desk_id) - `limit` (number, optional): Results per page (default: 20, max: 200) - `offset` (number, optional): Page number (default: 1) **Note:** At least one parameter (desk_id or desk_name) must be provided. **Example:** ```json { "desk_name": "Suporte", "limit": 20 } ``` ### search_catalog_item Search for service catalog items by name within a specific desk. **Parameters:** - `desk_id` (number, optional): Desk ID to search catalog items - `desk_name` (string, optional): Desk name for automatic search (alternative to desk_id) - `catalog_item_name` (string, required): Catalog item name to search (partial match supported) - `area_id` (number, optional): Service area ID to filter results - `catalog_id` (number, optional): Service catalog ID to filter results - `limit` (number, optional): Results per page (default: 20, max: 200) - `offset` (number, optional): Page number (default: 1) **Note:** At least one parameter (desk_id or desk_name) must be provided along with catalog_item_name. **Example:** ```json { "desk_name": "Support", "catalog_item_name": "Installation", "limit": 10 } ``` ## Internal Communications ### create_internal_communication Create a new internal communication in a ticket. **Parameters:** - `ticket_number` (string, required): Ticket number where communication will be created - `text` (string, required): Communication content - `files` (array, optional): Array of local file paths to attach (max 10 files, 25MB each) - `files_base64` (array, optional): Array of base64 encoded files `[{content: "base64...", filename: "file.pdf"}]` (alternative to files, max 10 files, 25MB each) **New in v1.3.0:** Support for base64 file upload via `files_base64` parameter. **Example:** ```json { "ticket_number": "123", "text": "Internal communication content", "files": ["/path/to/file1.pdf", "/path/to/file2.png"] } ``` ### list_internal_communications List internal communications for a ticket. **Parameters:** - `ticket_number` (string, required): Ticket number to list communications - `offset` (number, optional): Page number (default: 1) - `limit` (number, optional): Communications per page (default: 20, max: 200) ### get_ticket_files Get all files attached to a specific ticket. **Parameters:** - `ticket_number` (string, required): Ticket number to retrieve files from **Returns:** List of files with details including: - File ID, name, content type - File size (formatted as KB/MB/GB) - URL for download - Created date and creator information **Example:** ```json { "ticket_number": "123" } ``` ### get_internal_communication Get a specific internal communication with full content. **Parameters:** - `ticket_number` (string, required): Ticket number containing the communication - `communication_id` (string, required): ID of the internal communication to retrieve ## API Endpoints Used The MCP server integrates with the following TiFlux API v2 endpoints: - `GET /tickets/{id}` - Retrieve ticket details - `POST /tickets` - Create new tickets - `PUT /tickets/{id}` - Update existing tickets - `PUT /tickets/{id}/entities` - Update ticket custom fields - `PUT /tickets/{ticket_number}/cancel` - Cancel specific ticket - `PUT /tickets/{ticket_number}/close` - Close specific ticket - `POST /tickets/{ticket_number}/answers` - Create ticket answer (client communication) - `GET /tickets` - List tickets with filters - `GET /clients` - Search clients - `GET /users` - List users (name filtering done client-side) - `GET /desks` - Search desks - `GET /desks/{id}/stages` - Get desk stages - `GET /desks/{id}/services-catalogs-items` - Get service catalog items - `POST /tickets/{ticket_number}/internal_communications` - Create internal communication - `GET /tickets/{ticket_number}/internal_communications` - List internal communications - `GET /tickets/{ticket_number}/internal_communications/{id}` - Get specific internal communication - `GET /tickets/{ticket_number}/files` - Get ticket attached files ## Development ```bash # Clone the repository git clone https://github.com/tiflux/tiflux-mcp.git cd tiflux-mcp # Install dependencies npm install # Copy environment configuration cp .env.example .env # Edit .env with your credentials # Run the server npm start # Run tests npm test # All tests npm run test:unit # Unit tests only npm run test:coverage # Tests with coverage report ``` ## Testing The project includes comprehensive automated testing: - **78 total tests** with 100% pass rate - **Complete API mocking** - no external HTTP calls during testing - **Unit tests** for individual components (API, handlers, schemas) - **Integration tests** for MCP server functionality - **Mock data fixtures** for consistent test scenarios - **Performance tests** for concurrent operations Run tests with: ```bash npm test # All tests npm run test:unit # Unit tests only npm run test:integration # Integration tests only npm run test:coverage # Coverage report npm run test:watch # Watch mode npm run test:verbose # Detailed output ``` ## Requirements - Node.js >= 16.0.0 - Valid TiFlux API credentials ## License MIT ## Contributing Issues and pull requests are welcome on [GitHub](https://github.com/tiflux/tiflux-mcp). ## Support For support, please contact the TiFlux development team or create an issue on GitHub.