Freshdesk MCP Server
# Freshdesk MCP Server
A Model Context Protocol (MCP) server that exposes Freshdesk helpdesk operations as callable tools. It provides full ticket lifecycle management, two-phase draft/send for replies and notes, contact lookup, and agent/group discovery — all through a standard MCP interface compatible with any MCP client.
## Features
- 14 tools covering tickets, replies, notes, contacts, groups, and agents
- Two-phase draft/send pattern for replies and notes — review before posting
- Custom fields support on ticket create and update
- Predefined filters and full query-syntax search for tickets
- Client-agnostic: works with any MCP-compatible host
## Prerequisites
- Node.js 18 or later
- A Freshdesk account with API access
## Getting Your API Key
1. Log in to your Freshdesk account
2. Click your avatar in the top-right corner and select **Profile Settings**
3. Your API key is displayed in the right sidebar under **Your API Key**
## Installation
```bash
git clone https://github.com/ArcaneSK/freshdesk-mcp-server.git
cd freshdesk-mcp-server
npm install
npm run build
```
### Environment Setup
Copy the example environment file and fill in your credentials:
```bash
cp .env.example .env
```
Edit `.env` with your values:
```
FRESHDESK_API_KEY=your_api_key_here
FRESHDESK_DOMAIN=your_subdomain
```
| Variable | Description | Example |
|----------|-------------|---------|
| `FRESHDESK_API_KEY` | Your Freshdesk API key (see [Getting Your API Key](#getting-your-api-key)) | `abcdef123456` |
| `FRESHDESK_DOMAIN` | Your Freshdesk subdomain — if your URL is `https://acme.freshdesk.com`, use `acme` | `acme` |
### Claude Desktop Configuration
Add the following to your Claude Desktop `claude_desktop_config.json`, replacing the path with your actual install location:
```json
{
"mcpServers": {
"freshdesk": {
"command": "node",
"args": ["/path/to/freshdesk-mcp-server/dist/index.js"],
"env": {
"FRESHDESK_API_KEY": "your_api_key",
"FRESHDESK_DOMAIN": "your_subdomain"
}
}
}
}
```
Set `FRESHDESK_DOMAIN` to your Freshdesk subdomain only — for example, if your helpdesk URL is `https://acme.freshdesk.com`, use `acme`.
## Tools Reference
| Tool | Description | Key Inputs |
|------|-------------|------------|
| `list_tickets` | List tickets using predefined filters | `filter`, `email`, `requester_id`, `page` |
| `search_tickets` | Search tickets using Freshdesk query syntax | `query` (max 512 chars) |
| `get_ticket` | Retrieve a single ticket with all fields | `ticket_id`, `include` (conversations, requester, stats) |
| `create_ticket` | Create a new ticket | `subject`, `description`, `email` or `requester_id` |
| `update_ticket` | Update ticket fields | `ticket_id`, `status`, `priority`, `responder_id`, `custom_fields` |
| `delete_ticket` | Move a ticket to trash | `ticket_id` |
| `draft_reply` | Stage a reply for review (does not send) | `ticket_id`, `body`, `cc_emails` |
| `send_reply` | Send a previously drafted reply | `draft_id` |
| `draft_note` | Stage a note for review (does not post) | `ticket_id`, `body`, `private` |
| `send_note` | Post a previously drafted note | `draft_id` |
| `list_contacts` | List contacts by email or search term | `email`, `search_term`, `page` |
| `get_contact` | Get full contact details by ID | `contact_id` |
| `list_groups` | List all agent groups | `page`, `per_page` |
| `list_agents` | List agents, optionally filtered by group | `group_id`, `page` |
## Two-Phase Draft/Send
Replies and notes use a two-step confirmation pattern to prevent accidental sends:
1. Call `draft_reply` or `draft_note` with the content. The tool returns a `draft_id` and a preview of the content — nothing is sent to Freshdesk.
2. Review the draft, then call `send_reply` or `send_note` with the `draft_id` to post it.
Drafts are held in memory with a 10-minute expiration window. Each draft can only be sent once. If a draft expires, create a new one.
## Development
```bash
# Clone and install
git clone https://github.com/ArcaneSK/freshdesk-mcp-server.git
cd freshdesk-mcp-server
npm install
# Build
npm run build
# Run tests
npm test
# Watch mode (TypeScript)
npm run dev
```
## License
MIT
TDQS
Scored across 14 tools
Each tool targets a distinct resource-action pair (tickets, contacts, agents, groups) with clear boundaries. Even search_tickets and list_tickets differ by query method vs. predefined filters, and draft/send pairs are explicitly linked via draft_id.
All tool names follow the verb_noun snake_case pattern (search_, list_, get_, create_, update_, delete_, draft_, send_) with consistent noun usage. No camelCase or mixed conventions.
14 tools is well within the typical 3-15 range and each tool covers a meaningful operation for the Freshdesk domain. The count feels proportionate to the server's scope without redundancy.
Ticket lifecycle (CRUD + search/list) and reply/note workflows are fully covered. Minor gaps exist for contacts (only list/get, no create/update/delete) and agents/groups (read-only), but the core helpdesk use case is well supported.