mcp-freshservice
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FRESHSERVICE_APIKEY | Yes | Freshservice API key (Profile Settings) | |
| FRESHSERVICE_DOMAIN | Yes | Your Freshservice domain, e.g. yourcompany.freshservice.com | |
| FRESHSERVICE_TOOLSETS | No | Comma-separated toolsets to enable, or 'all' (default: the core set) | |
| FRESHSERVICE_READ_ONLY | No | Set to 1 to remove every tool that can write |
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
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_agent_fieldsB | List agent fields, including custom fields. |
| get_all_agentsC | List agents. |
| filter_agentsA | Search agents (30 per page, newest first; results cannot be sorted). Fields: first_name, last_name, name, job_title, email, work_phone_number, mobile_phone_number, department_id, reporting_manager_id, time_zone, language, location_id, created_at, updated_at, external_id and custom fields. The ~ operator does "starts with" on first_name, last_name, name, email, mobile_phone_number and work_phone_number. Changes can take a few minutes to be indexed. |
| get_agentB | Get an agent by ID, including roles and group memberships. |
| create_agentB | Create an agent. Assign at least one role so the agent can sign in. |
| update_agentB | Update an agent. Only the supplied fields change. |
| deactivate_agentA | Deactivate an agent (they become a requester; reversible with reactivate_agent). |
| reactivate_agentB | Reactivate a deactivated agent. |
| list_rolesA | List agent roles (needed for create_agent's roles). |
| get_all_agent_groupsC | List agent groups. |
| get_agent_groupA | Get an agent group by ID, including its members. |
| create_groupC | Create an agent group. |
| update_groupA | Update an agent group. Only the supplied fields change. |
| delete_groupC | Delete an agent group. |
| get_all_requester_groupsC | List requester groups. |
| get_requester_groupB | Get a requester group by ID. |
| create_requester_groupC | Create a requester group. |
| update_requester_groupC | Update a requester group. |
| delete_requester_groupC | Delete a requester group. |
| list_requester_group_membersC | List the requesters in a requester group. |
| add_requester_to_groupB | Add a requester to a manual requester group. |
| remove_requester_from_groupB | Remove a requester from a manual requester group. |
| list_all_requester_fieldsA | List requester fields, including custom fields and their API names. |
| get_all_requestersB | List requesters, optionally looked up by email or phone. |
| filter_requestersA | Search requesters (30 per page, newest first; results cannot be sorted). Fields: first_name, last_name, name, job_title, primary_email, work_phone_number, mobile_phone_number, department_id, reporting_manager_id, time_zone, language, location_id, created_at, updated_at, external_id and custom fields. The ~ operator does "starts with" on first_name, last_name, name, primary_email, mobile_phone_number and work_phone_number. Changes can take a few minutes to be indexed. |
| get_requesterC | Get a requester by ID. |
| create_requesterB | Create a requester. One of primary_email, work_phone_number or mobile_phone_number is required. |
| update_requesterB | Update a requester. Only the supplied fields change. |
| deactivate_requesterA | Deactivate a requester (reversible with reactivate_requester). |
| reactivate_requesterA | Reactivate a deactivated requester. |
| convert_requester_to_agentC | Convert a requester into an occasional agent. |
| list_service_catalog_categoriesC | List service catalog categories. |
| list_service_itemsB | List one page of service catalog items. |
| search_service_itemsC | Search service catalog items by keyword. |
| get_service_itemA | Get a service item, including its form fields (custom_fields names to use when placing a request). |
| create_service_requestC | Place a service request for a catalog item. |
| get_all_solution_categoryC | List knowledge-base categories. |
| get_solution_categoryB | Get a knowledge-base category by ID. |
| create_solution_categoryC | Create a knowledge-base category. |
| update_solution_categoryC | Update a knowledge-base category. |
| delete_solution_categoryA | Move a category (and its folders and articles) to trash. |
| get_list_of_solution_folderC | List the folders in a category. |
| list_solution_subfoldersC | List the sub-folders of a folder. |
| get_solution_folderC | Get a knowledge-base folder by ID. |
| create_solution_folderC | Create a knowledge-base folder. |
| update_solution_folderC | Update a knowledge-base folder. |
| delete_solution_folderA | Move a folder (and its articles) to trash. |
| get_list_of_solution_articleA | List the articles in a folder: metadata plus a short plain-text Use get_solution_article with an article id to read the whole article. |
| search_solution_articlesA | Full-text search across published knowledge-base articles. Each result has id, title, folder_id/category_id, status and a short plain-text |
| get_solution_articleA | Read a knowledge-base article by ID: the full HTML in description and plain text in description_text. Use the id from search_solution_articles or get_list_of_solution_article. |
| create_solution_articleB | Create a knowledge-base article (a draft unless status is 2). |
| update_solution_articleC | Update a knowledge-base article. |
| publish_solution_articleB | Publish a draft article (sets status to 2). |
| delete_solution_articleA | Move an article to trash. |
| get_ticket_fieldsB | List ticket form fields, including custom fields, their API names and allowed choices. |
| list_ticket_sourcesA | List ticket sources (channels), built-in and custom, with the numeric IDs create_ticket expects. Returns {"sources": [{"id": 1, "value": "Email"}, ...]}. Freshservice has no endpoint that lists sources (/ticket_fields/sources only creates one), so they are read from the ticket form's "source" field. |
| get_ticketsA | List tickets (newest first). Without a filter or updated_since, only the last 30 days are returned. For arbitrary conditions (status, priority, agent, group, dates, custom fields) use filter_tickets. |
| filter_ticketsA | Search tickets with the Freshservice query language (30 results per page). Filterable fields: requester_id, email, agent_id, group_id, priority, status, impact, urgency, tag, due_by and fr_due_by (YYYY-MM-DD), created_at and updated_at (YYYY-MM-DD or UTC datetime), workspace_id (0 = all workspaces) and custom fields by API name (see get_ticket_fields). Field names are case-sensitive snake_case. Examples: "status:2 AND priority:4", "agent_id:null AND created_at:>'2025-01-01'", "(group_id:12 OR group_id:15) AND status:3", "tag:'vip'". :> and :< are documented as inclusive (>= and <=). Values must be valid ones (status 2-5, priority 1-4, ...) or the API answers 400. The response includes "total" with the overall match count. |
| get_ticket_by_idA | Get a ticket by ID. Returns {"ticket": {...}} with all standard fields, custom_fields, planned dates, SLA flags (is_escalated, fr_escalated), attachments and, when available, the resolution notes. |
| create_ticketA | Create an incident or service-request ticket. Some ticket forms make fields such as group_id, responder_id, category or custom fields mandatory; check get_ticket_fields when the API reports missing_field. |
| update_ticketB | Update a ticket. Only the supplied fields change. |
| delete_ticketA | Move a ticket to trash. It can be brought back with restore_ticket. |
| restore_ticketA | Restore a deleted (trashed) ticket. |
| create_child_ticketC | Create a child ticket under an existing parent ticket. |
| list_all_ticket_conversationA | List the replies and notes on a ticket, oldest first. Each has body/body_text, private, incoming, source, user_id, to/cc/bcc emails and attachments. |
| send_ticket_replyB | Send a public reply to the requester on a ticket. |
| create_ticket_noteB | Add a note to a ticket (private by default). |
| update_ticket_conversationA | Edit a note or reply. Only notes and replies created through the API/agents can be edited. |
| delete_ticket_conversationB | Delete a note or reply from a ticket. |
| list_ticket_activitiesA | List the audit trail of a ticket (field changes, assignments, status changes). |
| get_requested_itemsA | List the service catalog items requested on a service-request ticket. |
| list_ticket_time_entriesB | List time entries (time tracked by agents) on a ticket. |
| view_ticket_time_entryB | Get one time entry on a ticket. |
| create_ticket_time_entryC | Log time against a ticket. |
| update_ticket_time_entryC | Update a time entry on a ticket. Time entry fields: time_spent ('hh:mm'), note, agent_id, billable, executed_at (ISO-8601), timer_running, task_id, custom_fields. |
| delete_ticket_time_entryC | Delete a time entry on a ticket. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 76 tools
Most tools are separated by resource and action (agent vs requester vs ticket vs solution), and descriptions clarify list/search/get variants. A few boundaries are fuzzy—e.g. create_group is an agent group while requester groups are explicitly prefixed, and solution folder/article listing uses several get/list patterns—but tools are not broadly indistinguishable.
Names are all snake_case and generally verb_noun, but the verb vocabulary is inconsistent: get_all_agents vs list_roles vs filter_agents, get_list_of_solution_folder vs list_solution_subfolders, and singular get_all_solution_category. The pattern is readable but not predictable enough for a top score.
76 tools is far beyond the 3–15 well-scoped range and exceeds the 50+ extreme-mismatch threshold. Even for a broad ITSM product, this surface should be split or namespaced into smaller MCP servers.
Core service-desk resources have strong lifecycle coverage: tickets (create/update/delete/restore, conversations, time entries), agents/requesters (create/update/deactivate/reactivate), groups (CRUD), and knowledge base (CRUD/search/publish). Gaps remain around admin CRUD for service catalog items and broader ITSM modules such as changes, problems, and assets, but the apparent service-desk scope is largely covered.