freshdesk-mcp
Provides image OCR capabilities via Google Cloud Vision API, enabling text extraction from image attachments such as screenshots.
freshdesk-mcp
A self-hosted Model Context Protocol (MCP) server that exposes Freshdesk support data to MCP-compatible AI clients (Claude, Cursor, VS Code Copilot, etc.).
What it does
Connects your AI assistant directly to Freshdesk — search tickets, read conversations, extract text from attachments (including OCR for screenshots), and enrich results with status names, group names, and company IDs.
AI client → HTTPS POST /mcp → freshdesk-mcp → Freshdesk API
→ GCP Vision OCR (image attachments)Related MCP server: Gorgias MCP Server
Available Tools
Tool | Description |
| Fetch a single ticket by ID. Returns status name, group name, company ID. |
| Ticket + all conversations + attachments in one call. |
| Multiple ticket summaries in parallel. |
| Filter by query, status, priority, type, overdue, escalated, dates, company, requester, agent, group. Full ticket history. |
| All tickets with optional filters. |
| All replies and notes for a ticket (fully paginated). |
| All attachments across ticket and conversations. Filters scanning placeholders. |
| Extract text from docx, xlsx, json, txt, csv, png, jpg (Vision OCR). |
| Search within a JSON attachment. |
| Scan multiple tickets for image attachments. |
| OCR inline images in ticket description HTML and conversation replies. |
| Search contacts by name/email → requester_id. |
| Search companies by name → company_id. |
| Search agents by name/email → agent_id. ⚠️ Requires admin API key. |
| List all agent groups → group_id. ⚠️ Requires admin API key. |
Note:
find_agentandlist_groupsuse Freshdesk admin-only endpoints (/api/v2/agents,/api/v2/groups). They work if your API key belongs to an admin account. Regular agent API keys will receive a 403.
Prerequisites
A Freshdesk account with API access
Docker
A GCP project with the Vision API enabled (optional — needed for image OCR only)
A container runtime — Cloud Run, AWS App Runner, Azure Container Apps, or plain Docker
Configuration
Variable | Required | Description |
| yes | Freshdesk subdomain only — e.g. |
| yes | Freshdesk API key. Find it at Profile → Profile Settings → API Key. |
| yes (HTTP mode) | Bearer token your MCP client sends in |
| no | GCP project ID for Vision OCR. If unset, image OCR tools return an error. |
| no | Set to |
| no | HTTP port (default |
Deployment
Docker (any platform)
# Pull pre-built image
docker pull ghcr.io/omnom62/freshdesk-mcp:latest
# Or build from source
docker build -t freshdesk-mcp .
docker run -p 8080:8080 \
-e MCP_TRANSPORT=http \
-e FRESHDESK_DOMAIN=mycompany \
-e FRESHDESK_API_KEY=your-api-key \
-e MCP_TOKEN=your-random-secret \
-e GCP_VISION_PROJECT=my-gcp-project \
freshdesk-mcpGCP Cloud Run
Build and push to Artifact Registry, then deploy:
IMAGE="<region>-docker.pkg.dev/<project>/freshdesk-mcp/freshdesk-mcp"
docker build -t ${IMAGE}:latest .
DIGEST=$(docker push ${IMAGE}:latest | grep "digest:" | awk '{print $3}')
gcloud run deploy freshdesk-mcp \
--image ${IMAGE}@${DIGEST} \
--region <region> \
--platform managed \
--allow-unauthenticated \
--set-secrets FRESHDESK_DOMAIN=FRESHDESK_DOMAIN:latest,FRESHDESK_API_KEY=FRESHDESK_API_KEY:latest,MCP_TOKEN=MCP_TOKEN:latest \
--set-env-vars GCP_VISION_PROJECT=<project> \
--project <project>Store secrets in GCP Secret Manager and grant the Cloud Run runtime service account roles/secretmanager.secretAccessor on each secret.
AWS App Runner / Azure Container Apps
Deploy the Docker image to your preferred platform. Pass the configuration variables as environment variables or secrets via your platform's secret store.
Connecting your MCP client
Once deployed, add to your MCP client config:
{
"mcpServers": {
"freshdesk": {
"type": "http",
"url": "https://your-deployment-url/mcp",
"headers": {
"Authorization": "Bearer your-mcp-token"
}
}
}
}Secret rotation
When rotating the Freshdesk API key:
Get the new key from Freshdesk → Profile → Profile Settings → API Key
Verify it works:
curl -s -u "<new-key>:X" "https://<domain>.freshdesk.com/api/v2/tickets?per_page=1"Update your secret store (e.g. GCP Secret Manager:
echo -n "<new-key>" | gcloud secrets versions add FRESHDESK_API_KEY --data-file=- --project <project>)Redeploy to pick up the new version
Tip: Never include
:Xin the stored secret value — that suffix is only used in curl Basic auth syntax.
Local development
export FRESHDESK_DOMAIN=mycompany
export FRESHDESK_API_KEY=your-api-key
export MCP_TOKEN=dev-token
export GCP_VISION_PROJECT=my-gcp-project # optional
go run .Server starts on port 8080. MCP endpoint: POST /mcp.
License
MIT
Available Tools
15 toolsbatch_get_ticket_summariesA
Fetch full summaries for multiple tickets in a single call. Each summary includes ticket details, all conversations, and attachment list. Use this instead of calling get_ticket_summary repeatedly — it fetches all tickets in parallel server-side, which is significantly faster. Typical workflow: 1. search_tickets or list_tickets → get list of ticket IDs 2. batch_get_ticket_summaries with those IDs → get all summaries at once Returns array of summaries in the same format as get_ticket_summary.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It discloses that fetching occurs in parallel server-side and that the return array matches get_ticket_summary's format, which is valuable. However, it doesn't mention authentication needs, rate limits, or error handling for invalid IDs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, followed by a comparison to the alternative and a numbered workflow. Every sentence serves a purpose, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description doesn't need to detail return values beyond confirming the format. It covers the parameter source, performance rationale, and relationship to siblings well. A minor gap is the lack of transactional or error-handling details, but overall it is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It implies the parameter is a list of ticket IDs and explains where to get them (from search_tickets or list_tickets), adding meaningful context beyond the schema's type information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb (fetch) and resource (full summaries for multiple tickets), and explicitly distinguishes itself from the sibling get_ticket_summary. It also names related siblings (search_tickets, list_tickets) in the workflow, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use clause: 'Use this instead of calling get_ticket_summary repeatedly' and explains the performance benefit. It also provides a typical workflow with numbered steps, fully guiding the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_agentA
Search Freshdesk agents by name or email. Returns agent_id which can be passed to search_tickets agent_id to find tickets assigned to that agent.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that the operation returns an agent_id and can feed search_tickets, which is useful, but it does not cover read-only nature, permissions, pagination, or empty-result behavior for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste, front-loading the primary purpose and then the downstream integration. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter search tool with an output schema, the description is nearly complete: it names the entity, query modes, and the returned identifier's purpose. Minor gaps remain around result shape and matching behavior, but these are partially covered by the existing output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the single query parameter. It adds meaningful semantics by saying the query searches by name or email, but it does not clarify matching behavior, format, or whether multiple results may be returned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Search Freshdesk agents by name or email.' It clearly distinguishes the tool from sibling find_requester and find_company by specifying the agent entity. An agent can tell what this tool is for without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the lookup purpose and explicitly connects the returned agent_id to search_tickets for assigned-ticket searches. It gives clear usage context but does not state when not to use this tool or name alternatives for looking up non-agent contacts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_companyA
Search Freshdesk companies by name. Returns company_id which can be used in search_tickets to find all tickets from a specific organisation. Example: find_company query='Defence' then search_tickets company_id=.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral load. It discloses the key output (company_id) and its downstream use, which is genuinely useful, but says nothing about matching semantics (partial vs exact name), result limits, whether multiple companies can be returned, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences plus a worked example, with the purpose front-loaded before the chaining guidance. The example earns its place by showing the exact parameter handoff, though it is slightly redundant with the preceding sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Since an output schema exists, return values needn't be described in prose, and the description still adds the crucial link between company_id and search_tickets. For a one-parameter lookup tool this is nearly sufficient, with only matching behavior left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'query' parameter, so the description has to compensate. The example ('query=Defence') implies the query is a company name and that partial names work, but there is no explicit statement of matching rules or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search Freshdesk companies by name') and clearly distinguishes itself from siblings like find_agent and find_requester, which resolve other entity types. It also names the output artifact (company_id), so an agent knows exactly what this tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete workflow: run find_company, then feed the returned company_id into search_tickets to get tickets for that organisation. That is clear usage context, though it stops short of stating when this is preferable to other lookup paths or any exclusion conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_image_attachmentsA
Scan multiple tickets at once and return all image attachments (png, jpg, jpeg). Typical workflow: 1. search_tickets → get list of ticket IDs 2. find_image_attachments with those IDs → find screenshots 3. get_attachment_text on attachment_id → OCR the image
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden; it does disclose that the scan is multi-ticket and filters to png/jpg/jpeg, but says nothing about permissions, result caps, pagination, or how null/empty ticket_ids behaves. The workflow hints at the read-only downstream OCR use, but the disclosure stops short of what an unannotated tool ideally needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core capability is front-loaded in the first sentence, and the workflow is compact and scannable with no filler. The numbered steps add length but each line carries routing value, so it stays efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and only one input parameter, the description does not need to explain return values, and its workflow covers the integration path. The remaining gap is behavioral detail (limits, null handling, auth) that no annotation supplies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only implies that ticket_ids is a plural collection to scan, adding nothing about format, null semantics, size limits, or whether an empty list means 'all'. The parameter name is largely self-explanatory, but the description does not compensate for the documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (scan/return) and resource (image attachments on multiple tickets) and constrains the output to png/jpg/jpeg, so the agent knows exactly what it retrieves. It is clearly distinguishable from single-ticket list_attachments and from get_attachment_text by being the bulk multi-ticket image filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The numbered workflow places the tool precisely between search_tickets (to obtain IDs) and get_attachment_text (to OCR), which tells the agent when to reach for it. It lacks an explicit when-not clause (e.g., use list_attachments for a single ticket), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_requesterA
Search Freshdesk contacts by name or email. Returns requester_id which can then be passed to search_tickets to find all tickets submitted by that person.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full behavioral burden. It usefully discloses the key return value (requester_id) and its chaining purpose, but says nothing about match behavior, pagination, or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, purpose front-loaded, ending with the actionable handoff to search_tickets. Nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return shape, and it correctly points at requester_id as the usable field. For a single-parameter lookup tool this is nearly complete, with only matching behavior left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. Saying search works 'by name or email' adds meaning beyond the bare 'query' string, but it does not specify matching semantics (partial vs exact) or format expectations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) plus resource (Freshdesk contacts) and clarifies the mapping to 'requester' terminology, which lets an agent distinguish it from find_agent and find_company without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear intended use and a workflow: it names search_tickets as the downstream consumer of requester_id. It lacks any explicit 'when not to use' or caveats about ambiguous matches, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachment_textA
Extract text from a Freshdesk ticket attachment. Supported formats: - .docx: Word documents → plain text - .xlsx: Excel spreadsheets → tab-separated rows per sheet - .json: JSON files → pretty printed - .txt: plain text - .csv: CSV files → plain text - .png .jpg .jpeg: screenshots and images → OCR via Google Vision API Use list_attachments first to get the attachment_id. Ideal for reading investigation reports, domain lists, DNS screenshots and phishing page captures.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_id | Yes | ||
| attachment_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| text | Yes | |
| attachment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and mostly succeeds: it discloses per-format output behavior (tab-separated rows per sheet, pretty-printed JSON, plain text) and that images go through an external Google Vision OCR call. It omits failure modes for unsupported formats, size/time limits, and OCR cost implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by a scannable format-to-output mapping, then the prerequisite and use cases. Every line earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be restated, yet the description usefully explains the shape of extracted content per file type. Combined with the format list and prerequisite, an agent has enough to call it correctly, though unsupported-format and error behavior remain unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so both integer parameters are undocumented in the schema. The description compensates partially by explaining that attachment_id comes from list_attachments, but ticket_id is left to inference and no format or constraint hints are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (extract) and resource (text from a Freshdesk ticket attachment) and enumerates the exact formats handled. It does not, however, differentiate itself from the sibling query_attachment, which sounds like it may also retrieve attachment content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite workflow ('Use list_attachments first to get the attachment_id') and names intended use cases (investigation reports, domain lists, DNS screenshots). It stops short of stating when NOT to use it or how it relates to query_attachment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversationsA
Get all replies, notes and email threads for a Freshdesk ticket. Returns body_text (plain text, HTML stripped), incoming=true means customer sent it, incoming=false means agent sent it. Use this to understand the full investigation history, analyst notes, and customer communications.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ticket_id | Yes | |
| conversations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose return semantics (body_text is plain text with HTML stripped; incoming=true means customer, false means agent), which is genuinely useful. It says nothing about pagination, ordering, size limits, or permissions needed, so key operational behavior is still missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the tool returns, then field interpretation, then purpose. Every sentence adds information with no padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be documented, yet the description still clarifies the two most ambiguous fields. For a one-parameter read tool the coverage is nearly complete, with only pagination/volume behavior left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description is the only place ticket_id semantics could be documented, and it only implies it via 'for a Freshdesk ticket.' The single integer parameter is self-evident, but no format, source, or lookup guidance is added.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get all replies, notes and email threads for a Freshdesk ticket.' It is clearly distinct from get_ticket (metadata) and get_ticket_summary (condensed view), but it never explicitly names or contrasts a sibling, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to understand the full investigation history, analyst notes, and customer communications' gives a concrete when-to-use scenario. However, it names no alternatives and states no exclusions or preconditions, so it stops short of the 5-level routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_description_imagesA
Extract and OCR inline images embedded in a ticket's description HTML body. Some tickets contain screenshots pasted directly into the description rather than uploaded as file attachments — these are not visible via list_attachments. Use this tool when get_ticket_summary shows a non-empty description but list_attachments finds no images, or when the description mentions a screenshot/table/log. Returns OCR text from each inline image found.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| images | Yes | |
| ticket_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the key trait that inline images are not visible via list_attachments and that the return is OCR text per image, which is genuinely useful context. It stops short of stating read-only nature, permission requirements, or failure behavior when no inline images exist, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each doing distinct work: purpose, rationale, trigger condition, and return value. It is front-loaded with the purpose, though the embedded tab indentation and slightly verbose phrasing keep it just below maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema present, the definition covers purpose, sibling differentiation, trigger conditions, and return shape. Remaining gaps are minor: no statement of read-only guarantees, permissions, or behavior when no inline images are found.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single ticket_id parameter, so the description must carry the semantics. It implies ticket_id identifies the ticket whose description HTML body is parsed, but adds no format, validity, or ID-source guidance. Self-evident naming plus implied meaning supports a baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb pair (extract and OCR) against a specific resource (inline images embedded in a ticket's description HTML body), and explicitly distinguishes itself from list_attachments and by implication get_attachment_text. An agent can tell exactly what this tool produces (OCR text from inline images) versus its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger condition tied to sibling tools: use when get_ticket_summary shows a non-empty description but list_attachments finds no images, or when the description mentions a screenshot/table/log. This is an explicit when-to-use rule with the alternative (list_attachments) named, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticketA
Retrieve a single Freshdesk support ticket by its numeric ID. Returns full details including id, subject, status, type, priority, due_by, is_escalated, created_at, tags and custom_fields (cf_impact, cf_urgency, cf_category, cf_subcategory, cf_domain).
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| tags | Yes | |
| type | Yes | |
| due_by | Yes | |
| status | Yes | |
| subject | Yes | |
| group_id | No | |
| priority | Yes | |
| fr_due_by | Yes | |
| company_id | No | |
| created_at | Yes | |
| group_name | No | |
| status_name | No | |
| is_escalated | Yes | |
| responder_id | Yes | |
| custom_fields | Yes | |
| description_text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden; it discloses which fields are returned (including custom_fields like cf_impact) but says nothing about permissions, rate limits, or behavior when the ID does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core purpose followed by return contents. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-lookup tool with one required parameter and an existing output schema, the description covers purpose and returns adequately. The only gap is that the return field listing duplicates the output schema and it omits not-found behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single parameter has no schema description, but the description compensates by identifying ticket_id as the ticket's numeric ID, clarifying format and meaning. Minor redundancy with the integer type but genuinely useful given the empty schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Retrieve) and resource (a single Freshdesk support ticket) with a clear scope qualifier ('single', 'by its numeric ID'). The word 'single' implicitly contrasts with the list/search siblings such as list_tickets and search_tickets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies you use this when you already have a ticket ID versus listing or searching, but it never explicitly states when to prefer it over list_tickets, search_tickets, or get_ticket_summary. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticket_summaryA
Retrieve a complete summary of a Freshdesk ticket in one call: ticket details, all conversation replies and notes, and list of attachments. Use this as the first tool when investigating a specific ticket — it gives everything needed to understand the full context without multiple round trips. Returns: - ticket: id, subject, status, type, priority, due_by, is_escalated, custom_fields - conversations: all replies and notes with body_text and direction (incoming=customer, outgoing=agent) - attachments: list of files with id, name, content_type, size (use get_attachment_text to read them)
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ticket | Yes | |
| attachments | Yes | |
| conversations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It implies read-only retrieval via 'Retrieve' and details the returned structure, including semantic direction mapping (incoming=customer, outgoing=agent), which adds value beyond the output schema. However, it does not explicitly state read-only status, authentication requirements, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose first, then usage guidance, followed by a returns breakdown. The returns section is somewhat redundant given an output schema exists, but it adds semantic details like direction meaning, so it largely earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a composite retrieval tool with an output schema, the description covers purpose, usage, and return semantics well. The main gap is the lack of any parameter detail for ticket_id, though the single required integer is fairly self-evident. Overall, it provides enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage for ticket_id is 0%, and the description never mentions the parameter name, type, or format. It only implies that a specific ticket is needed, failing to compensate for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and resource ('complete summary of a Freshdesk ticket'), and enumerates the included data (ticket details, conversations, attachments). It distinguishes itself from siblings by positioning as the first tool for full context and naming get_attachment_text for reading attachments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this as the first tool when investigating a specific ticket' and explains the benefit of avoiding multiple round trips. It also names get_attachment_text as the alternative for reading attachments, though it does not explicitly state when not to use this tool (e.g., if only ticket details are needed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_attachmentsA
List all attachments on a Freshdesk ticket including files in conversation replies. Returns attachment id, name, content_type and size in bytes. Always call this before get_attachment_text, query_attachment or find_image_attachments to discover attachment IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ticket_id | Yes | |
| attachments | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the discovery/sequencing role and the returned fields, but does not state read-only nature explicitly, permissions required, or pagination behavior for tickets with many attachments.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what it does and immediately followed by the sequencing instruction; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return values needn't be spelled out, and the workflow guidance is complete. Minor gap: no mention of pagination or behavior on tickets without attachments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so ticket_id is undocumented in both schema and description. However, ticket_id is self-explanatory from the description's context (attachments on a ticket), so the gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (attachments on a Freshdesk ticket) and clarifies scope by including files in conversation replies, which differentiates it from siblings like get_conversations and find_image_attachments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call this before get_attachment_text, query_attachment, and find_image_attachments to discover attachment IDs, giving clear ordering and naming the alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_groupsA
List all Freshdesk agent groups. Returns group id and name. Use this to find the group_id for filtering tickets by team. Example workflow: list_groups → find "Threat Intelligence" id → search_tickets group_id= Known groups:
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose the response shape (id and name), which is useful, but says nothing about authentication requirements, rate limiting, or whether the list is paginated or truncated — for a "List all" tool the all-vs-page question is the key behavioral unknown. The trailing dangling fragment "Known groups: " suggests the intended content (a static group enumeration) was cut off, further weakening disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and efficient: purpose, return shape, rationale, and workflow example in three tight sentences. It loses a point for the trailing incomplete "Known groups: " fragment, which is dead weight as written.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be re-explained, and with no parameters and no nested objects the surface area is small. The rationale-plus-workflow framing is exactly what an agent needs to place this tool in a multi-step plan; the only omission is any note on result size or pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and additionalProperties is false, so there is nothing for the description to clarify; the baseline for a 0-param tool is 4. The description correctly implies no filtering arguments are accepted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List all Freshdesk agent groups") and immediately narrows the scope by declaring the return payload ("Returns group id and name"). No sibling tool does this, so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the purpose-context ("Use this to find the group_id for filtering tickets by team") and then names the sibling to combine it with via a concrete chained workflow: list_groups → find id → search_tickets group_id=<id>. This is about as clear a when-to-use signal as a one-line description can carry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ticketsA
Return all Freshdesk tickets with full fields for reporting and analysis. All filters are optional. Filters: - status: 2=open, 3=pending, 4=resolved, 5=closed - priority: 1=low, 2=medium, 3=high, 4=urgent - type: "False Positive", "False Negative", "Service Request", "Incident" - created_after / created_before: ISO8601 e.g. "2026-06-01T00:00:00Z" Use this for bulk analysis - e.g. all false positives this month, all high priority open tickets. For company or requester filtering use search_tickets instead.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| status | No | ||
| priority | No | ||
| created_after | No | ||
| updated_since | No | ||
| created_before | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full behavioral disclosure. It implies read-only via 'Return' but omits pagination behavior, rate limits, authentication needs, and whether results are limited or streamed—important traits for a bulk listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by a well-structured bullet list of filters and clear usage guidance. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 optional parameters and 0% schema coverage, the description covers most parameters with valuable enum and format details. However, it misses updated_since and does not address behavioral aspects like pagination or rate limits, leaving some gaps for a bulk tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It provides enum meanings and ISO8601 formats for status, priority, type, created_after, and created_before, but completely omits the updated_since parameter and does not explain filter combination logic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Return all Freshdesk tickets with full fields for reporting and analysis.' It distinguishes itself from siblings by naming search_tickets for company/requester filtering and implying bulk analysis versus single-ticket tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use it: 'Use this for bulk analysis - e.g. all false positives this month, all high priority open tickets.' It also names an alternative: 'For company or requester filtering use search_tickets instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_attachmentB
Search within a JSON attachment on a Freshdesk ticket. Useful for finding specific domains or threat feeds in large JSON files.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| ticket_id | Yes | ||
| attachment_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| query | Yes | |
| result | Yes | |
| attachment_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It implies the target must be a JSON attachment, but says nothing about how non-JSON attachments behave, whether the query is substring/regex/path-based, permission requirements, or match semantics — all material for a search tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and no filler. Efficient, though the second sentence is closer to a use-case hint than essential specification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained. Still, for a 3-required-parameter tool with zero schema description coverage and no annotations, the description leaves the query semantics and error/edge behavior underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It adds meaning for 'query' by giving example search targets (domains, threat feeds), while ticket_id and attachment_id are self-evident from their names. It still leaves the query matching mode (substring vs regex vs JSONPath) undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Search within') and resource ('a JSON attachment on a Freshdesk ticket'), which clearly separates it from siblings like get_attachment_text or list_attachments. It doesn't explicitly name an alternative sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence hints at usage ('finding specific domains or threat feeds in large JSON files'), giving implied context. However it never states when to prefer this over get_attachment_text or list_attachments, nor any prerequisites for obtaining the attachment_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ticketsA
Search and filter Freshdesk tickets. All fields are optional. Filters: - query: text matched against subject or type - status: 2=open, 3=pending, 4=resolved, 5=closed - priority: 1=low, 2=medium, 3=high, 4=urgent - type: "False Positive", "False Negative", "Service Request", "Incident" - overdue: true = tickets past due_by that are still open or pending - is_escalated: true = escalated tickets only - created_after / created_before: ISO8601 date e.g. "2026-06-01T00:00:00Z" - requester_id: from find_requester tool - company_id: from find_company tool Examples: Overdue tickets: {"overdue": true} Open false positives: {"type": "False Positive", "status": 2} High priority open: {"status": 2, "priority": 3} All tickets from Defence: first call find_company query="Defence", then use company_id
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| query | No | ||
| status | No | ||
| overdue | No | ||
| agent_id | No | ||
| group_id | No | ||
| priority | No | ||
| company_id | No | ||
| is_escalated | No | ||
| requester_id | No | ||
| created_after | No | ||
| updated_since | No | ||
| created_before | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full behavioral burden. It discloses filter semantics such as overdue and is_escalated behavior plus date formats, but omits pagination, result limits, default sorting, and permission/auth requirements. The existing output schema reduces the need to explain return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and optionality, then organized into a filter list and examples. It is longer than minimal but most lines add concrete value; the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter search tool with 0% schema coverage and no annotations, the description is helpful but incomplete. It leaves three filters undocumented and gives no pagination, result-limit, or default-behavior guidance. The output schema covers return values, but key search-behavior gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It documents 10 of 13 parameters with enum mappings for status/priority/type, date format details, and cross-tool sourcing for requester_id and company_id, but misses agent_id, group_id, and updated_since.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search and filter Freshdesk tickets', and notes all fields are optional. It does not explicitly distinguish itself from the sibling list_tickets tool, which prevents a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete filter examples and cross-tool guidance for requester_id and company_id, showing how and when to use the tool. However, it lacks explicit when-not guidance or a direct comparison to alternatives like list_tickets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
- First observed
batch_get_ticket_summaries - First observed
find_agent - First observed
find_company - First observed
find_image_attachments - First observed
find_requester - First observed
get_attachment_text - First observed
get_conversations - First observed
get_description_images - First observed
get_ticket - First observed
get_ticket_summary - First observed
list_attachments - First observed
list_groups - First observed
list_tickets - First observed
query_attachment - First observed
search_tickets
TDQS
Scored across 15 tools
Most tools have distinct purposes, but search_tickets and list_tickets overlap significantly in filtering tickets. The presence of both get_ticket and get_ticket_summary, as well as batch_get_ticket_summaries, could cause confusion about which to use when.
Naming mostly follows a verb_noun pattern (find_company, search_tickets, get_ticket, list_attachments), with minor deviations like 'query_attachment' instead of a consistent verb like 'search'. Overall consistent and predictable.
15 tools is a reasonable count for a Freshdesk integration covering search, retrieval, and attachment handling. Slightly heavy but each tool adds value.
Covers key read operations (search, get, list) and attachment extraction, but lacks create/update/delete for tickets, which may be needed for a full lifecycle. Missing tools for modifying tickets or adding notes.
Maintenance
Related MCP Connectors
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Security-first WordPress MCP server. 129 tools for Claude, ChatGPT, Gemini. Free on wp.org.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server created for Freshservice, allowing AI models to interact with Freshservice modules5936MIT
- AlicenseAqualityCmaintenanceAn MCP server that exposes the full Gorgias helpdesk API to AI assistants, enabling ticket management, analytics, and customer operations through natural language.100990 npm2MIT
- AlicenseCqualityDmaintenanceMCP server that exposes the complete Libredesk REST API (54 endpoints) as tools, enabling natural language management of conversations, contacts, agents, teams, and more for the open-source customer support desk.546 npm3MIT
- AlicenseCqualityDmaintenanceAn MCP server implementation that integrates with Freshdesk, enabling AI models to interact with Freshdesk modules and perform various support operations.59MIT