Skip to main content
Glama
gasconc

freshdesk-mcp-server

by gasconc

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FRESHDESK_DOMAINYesYour Freshdesk domain, e.g., acme.freshdesk.com. A full URL or bare 'acme' both work.
FRESHDESK_API_KEYYesYour Freshdesk API key from Profile Settings.
FRESHDESK_MAX_PAGESNoCap on pages walked per listing. Truncation is reported.5
FRESHDESK_TIMEOUT_MSNoPer-request timeout in milliseconds.30000
FRESHDESK_MAX_RETRIESNoNumber of retries on 429 and 5xx errors.3
FRESHDESK_CLOSED_STATUSESNoComma-separated status codes that mean 'nobody is waiting on us'. Default is 4,5.4,5
FRESHDESK_REQUESTS_PER_MINUTENoClient-side throttle rate limit in requests per minute. Lower if other integrations share the account.50

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{
  "listChanged": true
}
resources
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
freshdesk_find_unanswered_ticketsA

The queue of tickets where the support team owes the customer a reply.

This is the entry point for "what do I have to answer". It does NOT trust ticket status: a ticket can sit in a custom status like "In Progress" and still owe an answer. Instead it compares, per ticket, when we last replied against when the customer last wrote. Tickets waiting on the customer are excluded, as are terminal ones.

Ordered by how recently the customer wrote, so entry #1 is the freshest thing left unanswered. Read the full thread with freshdesk_get_ticket and freshdesk_get_conversations before drafting anything.

freshdesk_list_ticketsA

List tickets by recent activity, optionally filtered by status.

Statuses are given by NAME or code and validated against this account, so you cannot silently filter on a status that does not exist. Leave "statuses" empty to get every non-terminal status.

This answers "what is going on"; for "what do I owe an answer on", use freshdesk_find_unanswered_tickets instead — reply state is not derivable from status.

freshdesk_get_ticketA

Full detail for a single ticket: fields, requester, company and reply timestamps.

The description is the customer's ORIGINAL request, converted from Freshdesk's email HTML to markdown. It is not the latest message — use freshdesk_get_conversations for the thread.

freshdesk_search_ticketsA

Freshdesk's filter/search endpoint, for questions a plain listing cannot express.

Query syntax: "status:3 AND priority:4", quote strings ("tag:'billing'"), dates as YYYY-MM-DD with :> and :< (>= and <=). Supported fields: agent_id, group_id, priority, status, tag, type, due_by, fr_due_by, created_at, updated_at, closed_at, plus custom fields by their cf_ name.

Hard limits from the API, not from this server: the query is capped at 512 characters, results come 30 per page, and only 10 pages are reachable — 300 results maximum. Archived tickets are excluded.

freshdesk_get_ticket_fieldsA

The real field inventory of this Freshdesk account: every status with its code and label, priorities, sources, ticket types, and every custom field with its choices.

Worth reading before filtering or writing. Accounts define their own statuses, so the Freshdesk defaults (2=Open, 3=Pending) are often nearly unused, and a filter built on them returns nothing while looking correct.

freshdesk_get_conversationsA

Every message on a ticket, oldest first, each one labelled with who wrote it and who can see it:

CUSTOMER — the requester wrote it AGENT (public) — we wrote it and the customer received it AGENT (private) — an internal note; the customer never saw this

Two things to know before drafting from this. The ticket DESCRIPTION is the customer's first message and is not part of this list — get it from freshdesk_get_ticket. And many tickets open with an automated private note from the helpdesk itself: that is internal routing chatter, not something the customer said.

freshdesk_get_contactA

The person behind a ticket: name, email, job title, company and any custom contact fields. Use the requester_id from a ticket.

freshdesk_get_companyA

The account a contact belongs to, with its notes and custom fields. Useful for tone and for knowing how much a ticket matters.

freshdesk_list_requester_ticketsA

Every recent ticket from the same person — the answer to "have they asked this before?".

Read this before drafting anything that explains a known issue: if the same requester already got an answer three weeks ago, repeating it differently is worse than pointing back at it.

freshdesk_get_related_ticketsA

The tickets Freshdesk links to this one: children of a parent ticket, or the tickets tracked by a tracker.

This is how a recurring incident shows up as one thing instead of nine: if a ticket is tracked, the answer probably belongs on the tracker.

freshdesk_list_canned_responsesA

The wording the team already approved, by folder.

Reach for this before inventing a phrasing: a canned response carries the tone, the legal caveats and the escalation wording someone already decided on. Pass a folder_id to list its responses, or omit it to see the folders.

freshdesk_get_canned_responseA

The full body of a canned response, as markdown. Freshdesk placeholders such as {{ticket.requester.name}} are left untouched — substitute them yourself before sending.

freshdesk_search_knowledgeA

Search published solution articles by keyword, so a reply can point at the documented answer instead of paraphrasing it.

Freshdesk has no article search endpoint in the v2 API, so this walks the category/folder tree and matches titles and bodies locally. That costs several calls against the rate limit, so it caches nothing and is worth calling with a narrow term.

freshdesk_get_articleB

The full body of a solution article, as markdown.

freshdesk_update_ticketA

Move a ticket: status, priority, assignee, group, type, tags, custom fields.

The customer is not emailed by this, but changing status IS visible to them on the portal, and Freshdesk automations may react to it.

Statuses and priorities are accepted by name or code and validated against this account first, so a wrong value fails here — listing the valid ones — instead of coming back as an opaque 400.

freshdesk_add_private_noteA

Add a private note to a ticket. THE CUSTOMER NEVER SEES THIS and no email is sent.

This is where a draft reply belongs. Freshdesk has no draft concept in its API, but a private note is exactly that: the text sits on the ticket for a human to read, edit and send themselves. Prefer this over freshdesk_reply_to_customer whenever a person should approve the wording first.

Accepts markdown or plain text and converts it to the HTML Freshdesk expects, so line breaks survive.

freshdesk_add_public_noteA

Add a note the requester CAN see on the support portal. Freshdesk does not email a public note, so it is quieter than a reply — but it is still customer-visible and cannot be unsent.

If you want the customer to actually receive the message, use freshdesk_reply_to_customer. If a human should approve it first, use freshdesk_add_private_note.

freshdesk_reply_to_customerA

Send a public reply on a ticket. THIS EMAILS THE REQUESTER and cannot be unsent.

Two-step by design: called without confirm, it returns exactly what would be sent — recipients, subject line, rendered HTML — and sends nothing. Call it again with confirm: true to actually send. A retry or a mistaken tool call therefore costs a preview, not an email to somebody's customer.

If a human is supposed to approve the wording, do not use this at all: put the draft in freshdesk_add_private_note and let them send it.

freshdesk_log_timeA

Record a time entry against a ticket. Internal bookkeeping: the customer never sees it.

Prompts

Interactive templates invoked by user choice

NameDescription
draft_replyWalks the whole flow: find what is actually waiting, read the thread, ground the answer in the knowledge base and the team's approved wording, and leave the draft where a human can approve it.
triage_ticketRead a ticket and propose where it should go — status, priority, group, assignee — with the reason for each move.

Resources

Contextual data attached and managed by the client

NameDescription
field-inventoryEvery ticket status (with code and label), priority, source, ticket type and custom field for this account. Read this before filtering or writing: accounts define their own statuses, so the Freshdesk defaults are often unused.
accountAccount name and plan. The plan determines the API rate limits every tool here shares with your other integrations.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/gasconc/freshdesk-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server