freshservice-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@freshservice-mcpfind open tickets for john@example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
freshservice-mcp
An MCP (Model Context Protocol) server for Freshservice, letting AI assistants like Claude work with your service desk.
Streamable HTTP transport — connect any remote-capable MCP client
Docker-first — clone, configure,
docker compose up, doneConfigured entirely via environment variables — nothing tenant-specific in the code
Optional bearer-token auth and an optional read-only mode
Built with Python, FastAPI and FastMCP. The server grows use case by use case — tools are added iteratively rather than mirroring the whole Freshservice API.
Quickstart
Requirements: Docker with the compose plugin.
git clone <this-repo>
cd freshservice-mcp
cp .env.example .env # then fill in your values
docker compose up -d --buildThe MCP endpoint is now available at http://localhost:8000/mcp.
Related MCP server: jitbit-helpdesk-mcp
Configuration
All settings live in .env (see .env.example):
Variable | Required | Default | Description |
| yes | – | Your tenant, e.g. |
| yes | – | API key of the Freshservice user the server acts as (Profile Settings → API Key). All tool calls run with this user's permissions |
| no |
|
|
| no |
| Source code stamped on created tickets (1=Email, 2=Portal, 3=Phone, 9=Walk-up; see |
| no | empty | If set, clients must send |
| no |
| Host port the server is published on |
Connecting a client
Claude Code:
claude mcp add --transport http freshservice http://localhost:8000/mcp \
--header "Authorization: Bearer <your MCP_AUTH_TOKEN>"(omit --header if MCP_AUTH_TOKEN is empty)
Any other MCP client with Streamable HTTP support works the same way: point
it at http://<host>:<port>/mcp and, if configured, send the bearer token.
Tools
Tool | Description |
| Find tickets by the requester's email address. By default only open tickets (status Open or Pending); |
| Full details of a single ticket by ID, including the description text |
| Create a ticket on behalf of a requester (by email) — subject + plain-text body, no classification fields, source configurable. Hidden in read-only mode |
| Send a reply to the requester on an existing ticket — visible to the requester, notifies them. Hidden in read-only mode |
| Add a private note to a ticket — agents only, requester is not notified, ticket stays unchanged. Hidden in read-only mode |
Mandatory ticket fields
create_ticket deliberately creates tickets raw — no category, group or
custom classification fields, just like an incoming e-mail. Your service desk
triages them as usual.
If your instance marks classification fields as "required for agents when submitting the form", the API will reject such raw creates (HTTP 400 "Validation failed"), because API calls authenticate as an agent. E-mailed tickets are not affected — that requirement only applies to agents.
The fix is a Freshservice admin setting, not configuration in this server:
Go to Admin → (your workspace) → Service Desk Settings → Field Manager → Ticket Fields
Edit each affected field (e.g. Category or custom dropdowns)
Under the agent behavior, uncheck "Required when submitting the form" and keep "Required when closing the ticket" checked
Data quality stays enforced (nobody can close a ticket without those fields), while tickets can come in unclassified through any channel — including this MCP server.
A dedicated ticket source (e.g. a custom "AI" source, Admin → Field Manager →
Ticket Fields → Source) plus FRESHSERVICE_CREATE_TICKET_SOURCE makes
MCP-created tickets easy to recognize and automate on.
Security notes
Set
MCP_AUTH_TOKENwhenever the server is reachable beyond localhost (e.g.openssl rand -hex 32). Without it, anyone who can reach the port can use your Freshservice API key's permissions.Use a least-privilege API key. The server can never do more than the Freshservice user behind
FRESHSERVICE_API_KEYis allowed to.FRESHSERVICE_READ_ONLY=trueis a hard switch: write tools (create_ticket,reply_to_ticket,add_internal_note) are not registered on the MCP server, so a client cannot even attempt a mutation.For public exposure, put the server behind a TLS-terminating reverse proxy.
Development without Docker
python -m venv .venv && source .venv/bin/activate
pip install -e .
cp .env.example .env # fill in your values
uvicorn app.main:app --reloadProject structure
app/
├── main.py # FastAPI app, mounts the MCP server at /mcp, /health probe
├── config.py # settings from environment variables (pydantic-settings)
├── freshservice.py # async Freshservice API v2 client (auth, 429 retry, errors)
└── tools/
├── __init__.py # central tool registration, enforces read-only mode
├── tickets.py # ticket tools (find, get, create)
└── conversations.py # replies and internal notes on ticketsEach new use case becomes a module under app/tools/ with a
register(mcp, get_client, settings) function.
License
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/mchluba/freshservice-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server