<!-- Generated by `just docs` from catalog/toolkits/freshdesk.yaml, catalog/expansions/freshdesk.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# Freshdesk

Customer support desk. Create and work tickets, reply and add private notes, and manage contacts, companies, and agents.

| Property | Value |
| --- | --- |
| Slug | `freshdesk` |
| Definition version | `0.2.0` |
| Base URL | `https://{{account.domain}}.freshdesk.com/api/v2` |
| Auth schemes | `api_key` |
| Action tools | 39 |
| By class | 18 read, 13 write, 8 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |

## Measured routing accuracy

79 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 39 cases written by hand and 37 cases from the paraphrase pass, plus 3 context cases whose intent names no app and is decided by the session. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 29/79 | 36.7% |
| top-8 | 65/79 | 82.3% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `api_key`

| Property | Value |
| --- | --- |
| Placement | `header` |
| Name | `Authorization` |
| Rendered as | `Basic {key}` |

Submit the key with `ConnectionsService` rather than putting it in a request; it is sealed at rest and never returned.

## Tools

39 action tools. The catalog-wide slug is `freshdesk.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `freshdesk.create_ticket`

Open a new support ticket in Freshdesk. Use when the user wants to file, log, or create a ticket, case, or support request. Requires a subject, description, and requester email, plus a priority and status; assign a group or agent, or attach tags, optionally.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tickets`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `cc_emails` | array of string | no | Emails to CC on the ticket. |
| `description` | string | **yes** | Ticket body, HTML allowed. |
| `email` | string | **yes** | Requester's email. Freshdesk creates the contact if none exists. |
| `group_id` | integer | no | Group id to assign the ticket to, from list_groups. |
| `priority` | integer, one of 1, 2, 3, 4 | **yes** | 1 Low, 2 Medium, 3 High, 4 Urgent. |
| `requester_id` | integer | no | Requester's contact id, from search_contacts, instead of email. |
| `responder_id` | integer | no | Agent id to assign the ticket to, from list_agents. |
| `source` | integer, one of 1, 2, 3, 7, 9, 10 | no | 1 Email, 2 Portal, 3 Phone, 7 Chat, 9 Feedback Widget, 10 Outbound Email. |
| `status` | integer, one of 2, 3, 4, 5 | **yes** | 2 Open, 3 Pending, 4 Resolved, 5 Closed. |
| `subject` | string | **yes** | Ticket subject line. |
| `tags` | array of string | no | Tags to apply. |
| `type` | string | no | Ticket type, e.g. "Question", "Incident", "Problem", "Feature Request". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | string |  |
| `id` | integer |  |
| `priority` | integer |  |
| `requester_id` | integer |  |
| `status` | integer |  |
| `subject` | string |  |

Also retrieved by: "open a support case for this customer", "log a new helpdesk request", "file a ticket for this problem", "a customer needs help, start a case", "raise a case in the helpdesk".

### `freshdesk.get_ticket`

Get one Freshdesk ticket's full detail by id: subject, description, status, priority, requester, and dates. Use when the user names a specific ticket number. For many tickets at once use list_tickets or search_tickets.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tickets/{{params.ticket_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `include` | string | no | Comma-separated extra data to embed, e.g. "conversations,requester,company,stats". Omit for the base fields. |
| `ticket_id` | integer | **yes** | Ticket id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `company_id` | integer |  |
| `created_at` | string |  |
| `description_text` | string |  |
| `due_by` | string |  |
| `group_id` | integer |  |
| `id` | integer |  |
| `priority` | integer |  |
| `requester_id` | integer |  |
| `responder_id` | integer |  |
| `source` | integer |  |
| `status` | integer |  |
| `subject` | string |  |
| `tags` | array of string |  |
| `type` | string |  |
| `updated_at` | string |  |

Also retrieved by: "pull up case number 4021", "what does this support case say", "show me the details on this case", "look up a specific helpdesk ticket".

### `freshdesk.update_ticket`

Edit an existing Freshdesk ticket's subject, description, priority, status, assignee, group, or tags. Use when the user wants to change, update, reassign, or reprioritize a ticket. For adding a reply or a note instead, use create_reply or create_note.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /tickets/{{params.ticket_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | New ticket body, HTML allowed. |
| `group_id` | integer | no | Group id to reassign the ticket to. |
| `priority` | integer, one of 1, 2, 3, 4 | no | 1 Low, 2 Medium, 3 High, 4 Urgent. |
| `responder_id` | integer | no | Agent id to reassign the ticket to. |
| `status` | integer, one of 2, 3, 4, 5 | no | 2 Open, 3 Pending, 4 Resolved, 5 Closed. |
| `subject` | string | no | New subject line. |
| `tags` | array of string | no | Replaces the ticket's full tag set. |
| `ticket_id` | integer | **yes** | Ticket id to edit. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | integer |  |
| `priority` | integer |  |
| `status` | integer |  |
| `updated_at` | string |  |

Also retrieved by: "change the priority on this case", "reassign this support case to someone else", "bump this to urgent", "move this case to a different queue", "edit the subject of this case".

### `freshdesk.delete_ticket`

Permanently delete a Freshdesk ticket. Use when the user wants to delete, remove, or trash a ticket or support request. Moves the ticket to the trash, purged automatically after 30 days.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /tickets/{{params.ticket_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `ticket_id` | integer | **yes** | Ticket id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "trash this support case", "remove this helpdesk request for good", "get rid of this case entirely", "wipe this ticket from the helpdesk".

### `freshdesk.list_tickets`

List Freshdesk tickets, optionally filtered by requester, company, or a preset like new-and-my-open or spam. Use for a broad view across tickets rather than one ticket. For a text or field query use search_tickets instead.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tickets`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | integer | no | Restrict to one company's tickets. |
| `email` | string | no | Restrict to tickets from this requester email. |
| `filter` | string, one of new_and_my_open, watching, spam, deleted | no | Preset ticket view. Omit for all tickets. |
| `page` | integer | no | Page number, default 1. |
| `per_page` | integer | no | Page size, default 30, max 100. |
| `requester_id` | integer | no | Restrict to one requester's tickets. |
| `updated_since` | string (date-time) | no | Only tickets updated at or after this ISO 8601 time. |

Also retrieved by: "show me every open case for this customer", "what's sitting in the spam view", "find all cases from this requester", "what's still outstanding for this account".

### `freshdesk.search_tickets`

Search Freshdesk tickets with a field query, e.g. '"priority:3 AND status:2"' for high-priority open tickets. Use for any ticket lookup by field value rather than free text across subjects. For a known ticket number use get_ticket instead.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /search/tickets`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `page` | integer | no | Page number, default 1. |
| `query` | string | **yes** | Quoted Freshdesk query string, e.g. '"priority:4 AND status:2"' or '"requester_id:23"'. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `results` | array of object |  |
| `results[].id` | integer |  |
| `results[].priority` | integer |  |
| `results[].status` | integer |  |
| `results[].subject` | string |  |
| `total` | integer |  |

Also retrieved by: "find every urgent case that's still open", "look up cases by priority and status", "run a query across the helpdesk", "filter support cases by field".

### `freshdesk.merge_tickets`

Merge one or more secondary Freshdesk tickets into a primary ticket. Use when the user wants to merge, combine, or consolidate duplicate tickets. Secondary tickets are closed and their content rolled into the primary. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `PUT /tickets/merge`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `convert_recipients_to_cc` | boolean | no | Add the secondary tickets' requesters as CC on the primary. Default false. |
| `primary_id` | integer | **yes** | Ticket id to keep as the primary. |
| `ticket_ids` | array of integer | **yes** | Secondary ticket ids to merge into the primary. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `merged` | boolean |  |

Also retrieved by: "combine these duplicate cases into one", "fold this case into the other one", "consolidate these two support requests".

### `freshdesk.list_ticket_fields`

List the ticket fields configured on this Freshdesk account, standard and custom, with their valid choices. Use before create_ticket or update_ticket to find the exact status, priority, type, or custom field values the account allows.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /ticket_fields`.

Takes no arguments.

Also retrieved by: "what statuses can a case have", "show me the priority options for a case", "what custom fields does this helpdesk use", "list the valid values for ticket type".

### `freshdesk.list_conversations`

List the replies and notes on a Freshdesk ticket, oldest first. Use when the user wants to read the conversation, discussion, or history on a ticket. For posting a new reply or note use create_reply or create_note.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tickets/{{params.ticket_id}}/conversations`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `page` | integer | no | Page number, default 1. |
| `ticket_id` | integer | **yes** | Ticket id. |

Also retrieved by: "what's the back and forth on this case", "read the thread on this support ticket", "show the history of replies on this case".

### `freshdesk.create_reply`

Send a customer-facing reply on a Freshdesk ticket. Use when the user wants to reply, respond, or answer the requester on a ticket. For an internal note the requester never sees, use create_note instead.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tickets/{{params.ticket_id}}/reply`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `bcc_emails` | array of string | no | Emails to BCC on the reply. |
| `body` | string | **yes** | Reply body, HTML allowed. |
| `cc_emails` | array of string | no | Emails to CC on the reply. |
| `from_email` | string | no | Send-as email, if the ticket's group has more than one. |
| `ticket_id` | integer | **yes** | Ticket id to reply on. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `body_text` | string |  |
| `created_at` | string |  |
| `id` | integer |  |

Also retrieved by: "answer the customer on this case", "respond to the requester", "send a message back on this ticket", "write the customer an update".

### `freshdesk.create_note`

Add an internal note to a Freshdesk ticket, visible to agents only by default. Use when the user wants to note, comment, or leave an internal update on a ticket for the team. Set private false to make it visible to the requester too.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tickets/{{params.ticket_id}}/notes`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `body` | string | **yes** | Note body, HTML allowed. |
| `notify_emails` | array of string | no | Agent emails to notify about this note. |
| `private` | boolean | no | Visible to agents only. Default true. |
| `ticket_id` | integer | **yes** | Ticket id to note on. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `body_text` | string |  |
| `created_at` | string |  |
| `id` | integer |  |
| `private` | boolean |  |

Also retrieved by: "leave an internal note for the team", "flag this for another agent privately", "jot down a note only agents can see", "tell the team what's going on here".

### `freshdesk.update_conversation`

Edit the body text of a reply or note already posted on a Freshdesk ticket. Use when the user wants to fix, correct, or update something already posted in the conversation.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /conversations/{{params.conversation_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `body` | string | **yes** | Replacement body text, HTML allowed. |
| `conversation_id` | integer | **yes** | Conversation (reply or note) id, from list_conversations. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `body_text` | string |  |
| `id` | integer |  |
| `updated_at` | string |  |

Also retrieved by: "fix a typo in my last reply", "correct what I wrote on that case", "edit my earlier note on this ticket".

### `freshdesk.delete_conversation`

Permanently delete one reply or note from a Freshdesk ticket. Use when the user wants to delete or remove a single conversation entry, not the whole ticket. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /conversations/{{params.conversation_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `conversation_id` | integer | **yes** | Conversation (reply or note) id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove that reply I posted by mistake", "delete a note on this case", "take down something I sent by accident".

### `freshdesk.create_contact`

Create a new Freshdesk contact (customer). Use when the user wants to add, register, or create a customer or requester. Requires a name plus at least one of email, phone, or twitter_id.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /contacts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | integer | no | Company id to associate, from search_companies. |
| `email` | string | no | Contact's primary email. |
| `job_title` | string | no | Contact's job title. |
| `mobile` | string | no | Contact's mobile number. |
| `name` | string | **yes** | Contact's full name. |
| `phone` | string | no | Contact's work phone. |
| `tags` | array of string | no | Tags to apply. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `company_id` | integer |  |
| `created_at` | string |  |
| `email` | string |  |
| `id` | integer |  |
| `name` | string |  |

Also retrieved by: "add a new customer record", "register this person as a requester", "create a profile for this customer".

### `freshdesk.get_contact`

Get one Freshdesk contact's full detail by id: name, email, phone, company, and tags. Use when the user names a specific customer. For finding a contact by name or email use search_contacts.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /contacts/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | integer | **yes** | Contact id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `active` | boolean |  |
| `company_id` | integer |  |
| `created_at` | string |  |
| `email` | string |  |
| `id` | integer |  |
| `job_title` | string |  |
| `mobile` | string |  |
| `name` | string |  |
| `phone` | string |  |
| `tags` | array of string |  |

Also retrieved by: "pull up this customer's profile", "what do we have on file for this person", "show me this requester's details".

### `freshdesk.update_contact`

Edit an existing Freshdesk contact's name, email, phone, company, or tags. Use when the user wants to change, update, or edit a customer's details.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /contacts/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | integer | no | New company id to associate. |
| `contact_id` | integer | **yes** | Contact id to edit. |
| `email` | string | no | New primary email. |
| `name` | string | no | New full name. |
| `phone` | string | no | New work phone. |
| `tags` | array of string | no | Replaces the contact's full tag set. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `email` | string |  |
| `id` | integer |  |
| `name` | string |  |
| `updated_at` | string |  |

Also retrieved by: "change this customer's email on file", "edit this person's phone number", "update the company for this requester".

### `freshdesk.delete_contact`

Permanently delete a Freshdesk contact. Use when the user wants to delete, remove, or trash a customer record. Soft-deletes first; calling it on an already soft-deleted contact deletes it for good.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /contacts/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | integer | **yes** | Contact id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this customer's record", "trash this requester profile", "get rid of this person's record for good".

### `freshdesk.list_contacts`

List Freshdesk contacts, optionally filtered by email, phone, or company. Use for a broad view across customers rather than one contact. For a name lookup use search_contacts.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /contacts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | integer | no | Restrict to one company's contacts. |
| `email` | string | no | Restrict to this exact email. |
| `page` | integer | no | Page number, default 1. |
| `per_page` | integer | no | Page size, default 30, max 100. |
| `phone` | string | no | Restrict to this exact phone number. |

Also retrieved by: "show every customer at this company", "find requesters with this phone number", "list the people tied to this account".

### `freshdesk.search_contacts`

Look up Freshdesk contacts by partial name, email, or phone as the user types. Use before create_ticket or assigning a company when the user names a customer rather than giving a contact id directly.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /contacts/autocomplete`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `term` | string | **yes** | Name, email, or phone substring to match. |

Also retrieved by: "find a customer named priya", "look up someone by email as I type", "who matches this name in the helpdesk".

### `freshdesk.create_company`

Create a new Freshdesk company (account) that contacts belong to. Use when the user wants to add, register, or create a customer's company or organization.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /companies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | Company description or notes. |
| `domains` | array of string | no | Email domains associated with this company, e.g. ["acme.com"]. |
| `name` | string | **yes** | Company name. |
| `note` | string | no | Internal note about the company. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | string |  |
| `domains` | array of string |  |
| `id` | integer |  |
| `name` | string |  |

Also retrieved by: "add a new customer account", "register this organization", "set up a company record for this client".

### `freshdesk.get_company`

Get one Freshdesk company's detail by id: name, domains, description, and notes. Use when the user names a specific customer's company. For finding a company by name use search_companies.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /companies/{{params.company_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | integer | **yes** | Company id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | string |  |
| `description` | string |  |
| `domains` | array of string |  |
| `id` | integer |  |
| `name` | string |  |
| `note` | string |  |
| `updated_at` | string |  |

Also retrieved by: "tell me about this customer's organization", "what domains belong to this account", "pull up the company profile".

### `freshdesk.update_company`

Edit an existing Freshdesk company's name, domains, description, or notes. Use when the user wants to change, update, or edit a customer's company details, not the contacts inside it.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /companies/{{params.company_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | integer | **yes** | Company id to edit. |
| `description` | string | no | New company description. |
| `domains` | array of string | no | Replaces the company's full domain list. |
| `name` | string | no | New company name. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | integer |  |
| `name` | string |  |
| `updated_at` | string |  |

Also retrieved by: "rename this customer's organization", "add a new domain to this account", "edit the notes on this company".

### `freshdesk.delete_company`

Permanently delete a Freshdesk company. Use when the user wants to delete, remove, or trash a customer's company or organization. Its contacts are not deleted; they are left with no company. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /companies/{{params.company_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | integer | **yes** | Company id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this customer organization", "trash this account record", "get rid of this company for good".

### `freshdesk.list_companies`

List every Freshdesk company on the account. Use when the user wants to see what companies or organizations exist. For a name lookup use search_companies.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /companies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `page` | integer | no | Page number, default 1. |
| `per_page` | integer | no | Page size, default 30, max 100. |

Also retrieved by: "what organizations do we support", "show every customer account we have", "list the companies in the helpdesk".

### `freshdesk.search_companies`

Look up Freshdesk companies by partial name as the user types. Use before create_contact or update_contact when the user names a customer's company rather than giving a company id directly.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /companies/autocomplete`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `name` | string | **yes** | Company name substring to match. |

Also retrieved by: "find a customer company by name in the helpdesk", "look up a company by partial name", "which account matches this text".

### `freshdesk.get_agent`

Get one Freshdesk agent's detail by id: name, email, role, group membership, and availability. Use when the user names a specific support agent or teammate.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /agents/{{params.agent_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agent_id` | integer | **yes** | Agent id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `available` | boolean |  |
| `contact` | object |  |
| `contact.email` | string |  |
| `contact.job_title` | string |  |
| `contact.name` | string |  |
| `group_ids` | array of integer |  |
| `id` | integer |  |
| `role_ids` | array of integer |  |
| `ticket_scope` | integer |  |

Also retrieved by: "tell me about this support rep", "what groups is this teammate in", "pull up this agent's profile".

### `freshdesk.list_agents`

List the support agents on this Freshdesk account, optionally filtered by email or availability. Use when the user wants to see who is on the support team or find an agent's id.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /agents`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `email` | string | no | Restrict to this exact agent email. |
| `page` | integer | no | Page number, default 1. |
| `per_page` | integer | no | Page size, default 30, max 100. |
| `state` | string, one of fulltime, occasional | no | Restrict to fulltime or occasional agents. |

Also retrieved by: "show me the support team", "who's available to take tickets right now", "list every rep on the helpdesk".

### `freshdesk.update_agent`

Edit an existing Freshdesk agent's ticket scope, group membership, role, or availability. Use when the user wants to change an agent's permissions, groups, or mark them available or unavailable.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /agents/{{params.agent_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agent_id` | integer | **yes** | Agent id to edit. |
| `available` | boolean | no | Whether the agent shows as available for new tickets. |
| `group_ids` | array of integer | no | Replaces the agent's full group membership. |
| `occasional` | boolean | no | True for an occasional (part-time seat) agent. |
| `role_ids` | array of integer | no | Replaces the agent's full role set. |
| `ticket_scope` | integer, one of 1, 2, 3 | no | 1 Global access, 2 Group access, 3 Restricted access. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `available` | boolean |  |
| `id` | integer |  |
| `updated_at` | string |  |

Also retrieved by: "change this rep's permissions", "add this teammate to another group", "mark this agent as unavailable".

### `freshdesk.delete_agent`

Permanently remove an agent from this Freshdesk account, freeing their seat. Use when the user wants to delete, remove, or offboard a support agent. The underlying contact record is not deleted. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /agents/{{params.agent_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agent_id` | integer | **yes** | Agent id to remove. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this rep from the helpdesk", "offboard this support teammate", "free up this agent's seat".

### `freshdesk.get_current_agent`

Get the profile of the connected Freshdesk agent itself: name, email, groups, and role. Use to answer "who am I" or to get the caller's own agent id for update_ticket or create_reply.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /agents/me`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `contact` | object |  |
| `contact.email` | string |  |
| `contact.name` | string |  |
| `group_ids` | array of integer |  |
| `id` | integer |  |
| `role_ids` | array of integer |  |

Also retrieved by: "who am I logged in as", "what's my own agent id", "show my support rep profile".

### `freshdesk.create_group`

Create a new Freshdesk group that tickets and agents can be assigned to. Use when the user wants to set up or add a support team or queue. Assign agents to it with update_group afterward.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /groups`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agent_ids` | array of integer | no | Agent ids to add to the group. |
| `auto_ticket_assign` | boolean | no | Automatically round-robin new tickets to the group's agents. |
| `description` | string | no | Group description. |
| `name` | string | **yes** | Group name, e.g. "Billing", "Tier 2". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | string |  |
| `id` | integer |  |
| `name` | string |  |

Also retrieved by: "set up a new support queue", "start a billing team", "add a group for tier two support".

### `freshdesk.get_group`

Get one Freshdesk group's detail by id: name, description, and its agents. Use when the user names a specific support team or queue. For the whole list use list_groups.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /groups/{{params.group_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `group_id` | integer | **yes** | Group id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `agent_ids` | array of integer |  |
| `auto_ticket_assign` | boolean |  |
| `created_at` | string |  |
| `description` | string |  |
| `id` | integer |  |
| `name` | string |  |

Also retrieved by: "who's on this support team", "tell me about this queue", "pull up this group's details".

### `freshdesk.update_group`

Edit an existing Freshdesk group's name, description, or agent membership. Use when the user wants to rename a team, or add or remove agents from a group or queue.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /groups/{{params.group_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `agent_ids` | array of integer | no | Replaces the group's full agent membership. |
| `description` | string | no | New group description. |
| `group_id` | integer | **yes** | Group id to edit. |
| `name` | string | no | New group name. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | integer |  |
| `name` | string |  |
| `updated_at` | string |  |

Also retrieved by: "add someone to this support team", "rename this queue", "change who's in this group".

### `freshdesk.delete_group`

Permanently delete a Freshdesk group. Use when the user wants to delete, remove, or disband a support team or queue. Tickets assigned to it are not deleted; they are left unassigned. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /groups/{{params.group_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `group_id` | integer | **yes** | Group id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "disband this support team", "remove this queue entirely", "get rid of this group for good".

### `freshdesk.list_groups`

List every Freshdesk group on the account. Use when the user wants to see what support teams or queues exist, or find a group's id for assigning tickets or agents.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /groups`.

Takes no arguments.

Also retrieved by: "what support teams do we have", "show every queue in the helpdesk", "find the group id for billing".

### `freshdesk.list_canned_response_folders`

List the canned response folders on this Freshdesk account. Use to find a folder_id for list_canned_responses, or to see how saved replies are organized.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /canned_response_folders`.

Takes no arguments.

Also retrieved by: "what saved reply folders exist", "show me how templates are organized", "list the canned response categories".

### `freshdesk.list_canned_responses`

List the canned responses (saved replies, templates) in one Freshdesk folder. Use when the user asks what canned responses or saved replies exist. Requires a folder_id from list_canned_response_folders.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /canned_response_folders/{{params.folder_id}}/responses`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `folder_id` | integer | **yes** | Canned response folder id, from list_canned_response_folders. |

Also retrieved by: "show the saved replies in this folder", "what templates are in this category", "list the canned answers agents can use".

### `freshdesk.create_canned_response`

Create a new canned response (saved reply, template) in Freshdesk. Use when the user wants to save, template, or add a reusable reply for agents to reuse on tickets.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /canned_responses`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `content_html` | string | **yes** | Reply body, HTML allowed. |
| `folder_id` | integer | **yes** | Folder id to file it under, from list_canned_response_folders. |
| `group_ids` | array of integer | no | Group ids that may use it, when visibility is 3. |
| `title` | string | **yes** | Canned response title, shown in the picker. |
| `visibility` | integer, one of 1, 2, 3 | no | 1 All agents, 2 Personal (author only), 3 Select groups. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | string |  |
| `id` | integer |  |
| `title` | string |  |

Also retrieved by: "save this as a template reply", "add a reusable answer for the team", "template this response for agents".

### `freshdesk.delete_canned_response`

Permanently delete a Freshdesk canned response. Use when the user wants to delete or remove a saved reply or template. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /canned_responses/{{params.canned_response_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `canned_response_id` | integer | **yes** | Canned response id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |

Also retrieved by: "remove this saved reply", "delete a canned answer template", "get rid of this template for good".
