Connect Desk365 to ChatGPT: Manage Tickets, Contacts & Knowledge
Connect Desk365 to ChatGPT using Truto's MCP server. Learn how to configure secure access to tickets, contacts, and knowledge base articles for AI agents.
If your team uses Claude, check out our guide on connecting Desk365 to Claude. If you are building headless workflows, read our tutorial on connecting Desk365 to AI Agents.
In this guide, we will focus on connecting Desk365 to ChatGPT. By exposing Desk365's underlying APIs as an MCP (Model Context Protocol) server, you can give ChatGPT direct, secure access to your helpdesk. Instead of manually copying and pasting context between your CRM and conversational AI, ChatGPT can retrieve tickets, analyze conversation histories, generate replies, and publish knowledge base articles on demand.
Here is how to architect the integration using Truto's SuperAI MCP server, including the quirks of the Desk365 API, security controls, and real-world workflows.
Engineering Reality: The Desk365 API
When exposing an API to a Large Language Model, the LLM is only as effective as the underlying API architecture. The Desk365 API has several distinct patterns that engineers must account for when building tool-calling workflows:
- Unconventional Resource IDs: Unlike many REST APIs that default to UUIDs, Desk365 relies on highly specific, human-readable identifiers for different resources. To get a ticket, you pass the
ticket_number. To get a contact, you pass theirprimary_email. To retrieve a company or knowledge base category, you pass the string name directly in the path. Your LLM must be instructed to extract these exact fields from previous responses rather than looking for a genericid. - Multipart Attachment Quirks: Creating records with attachments in Desk365 uses a highly specific payload structure. You must send the file inside a
multipart/form-databody, while simultaneously stringifying the JSON object representing the ticket (or reply/note) and passing it as a query parameter (e.g.,ticket_object). Truto handles the schema mapping, but the tool definitions explicitly instruct the LLM on how to map these arguments. - Restricted Endpoints: Certain APIs, such as the
contractsendpoints, are documented as special access only. To use these tools in your MCP server, you must first contact Desk365 support to enable them for your tenant.
Creating the Desk365 MCP Server
Truto automatically translates your authenticated Desk365 integration into a JSON-RPC 2.0 MCP server. You can provision this server via the Truto UI or programmatically via the API.
Method 1: Via the Truto UI
- Navigate to the Integrated Accounts section in your Truto dashboard.
- Select your connected Desk365 account.
- Click the MCP Servers tab and click Create MCP Server.
- Configure your allowed methods (e.g., limit to read-only) and set an optional expiration date.
- Save and copy the generated MCP URL.
Method 2: Via the API
You can dynamically generate MCP servers for your internal teams or end-users by making an authenticated POST request to the Truto API.
curl -X POST https://api.truto.one/integrated-account/{integrated_account_id}/mcp \
-H "Authorization: Bearer YOUR_TRUTO_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "ChatGPT Desk365 Assistant",
"config": {
"methods": ["read", "write"]
}
}'The response will return a secure, hashed URL (https://api.truto.one/mcp/<token>) that acts as the entry point for ChatGPT.
Connecting to ChatGPT
Once you have your MCP URL, you need to register it with your ChatGPT environment. You can do this through the ChatGPT UI or via a standard MCP configuration file if you are running a local OpenAI-compatible agent wrapper.
Method 1: The ChatGPT UI Flow
- Open ChatGPT and navigate to Settings -> Apps -> Advanced settings.
- Ensure Developer mode is toggled on (this unlocks MCP support for Pro, Plus, Enterprise, and Education tiers).
- Under MCP servers / Custom connectors, click to add a new server.
- Name: "Desk365 (Truto)"
- Server URL: Paste the URL generated in the previous step.
- Save the configuration. ChatGPT will immediately perform a handshake and pull the available Desk365 tools.
Method 2: Manual Config File Approach
If you are using a local agent or an enterprise deployment wrapper that interfaces with OpenAI models via MCP, you can register the server in your standard MCP configuration JSON file:
{
"mcpServers": {
"desk365-truto": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-http",
"--url",
"https://api.truto.one/mcp/<your_token>"
]
}
}
}Security and Access Control
Exposing your helpdesk to an LLM requires strict governance. Truto MCP servers support multiple layers of access control:
- Method Filtering: Pass
"methods": ["read"]during server creation to prevent ChatGPT from modifying tickets or deleting KB articles. - Tag Filtering: Restrict the LLM's context by specifying tags. For example,
"tags": ["knowledge_base"]ensures the server only exposes documentation endpoints and hides sensitive customer contact APIs. - Time-to-Live (TTL): Use the
expires_atfield to generate ephemeral MCP servers. This is ideal for granting a contractor temporary access to generate reports for a specific week. - Secondary Authentication: Enable
require_api_token_auth: trueto enforce that the caller must pass a valid Truto API token in theAuthorizationheader. This prevents unauthorized access even if the MCP URL is leaked.
Desk365 MCP Tool Inventory
Truto automatically generates precise schemas for Desk365's endpoints. Here is the two-tier breakdown of the available tools.
Hero Tools
These are the core tools most commonly used for agentic helpdesk operations.
list_all_desk_365_tickets
Retrieves a paginated list of tickets. It accepts documented query parameters like ticket_count (30, 50, or 100) and various include filters.
"Pull the 30 most recent unresolved tickets and summarize the main issues."
get_single_desk_365_ticket_by_id
Fetches full details for a specific ticket. The resource ID must be the exact ticket_number.
"Get the full details and current status for ticket #4052."
list_all_desk_365_ticket_conversations
Retrieves the complete reply and note history for a specific ticket. Requires the ticket_number as a query parameter.
"Read the entire conversation history for ticket #4052 to understand what the customer tried so far."
create_a_desk_365_ticket_reply
Posts a response back to the customer on a given ticket. Requires ticket_number in the query.
"Draft a polite reply to ticket #4052 explaining that the engineering team has deployed a hotfix, and ask them to verify."
get_single_desk_365_contact_by_id
Retrieves contact information. The identifier here is the contact's primary_email, not a numeric ID.
"Look up the contact details for jane.doe@example.com to see her associated company."
list_all_desk_365_kb_articles
Fetches titles and metadata for live knowledge base articles.
"List all live KB articles to check if we already have documentation on SSO configuration."
desk_365_tickets_create_with_attachment
Creates a ticket with a file. Exposes the complex multipart structure where the file goes in the body and the ticket_object is stringified in the query.
"Create a new internal IT ticket for a broken monitor and attach this photo of the screen."
Full Inventory
Here is the complete inventory of additional Desk365 tools available. For full schema details, visit the Desk365 integration page.
list_all_desk_365_ping: Check Desk365 API server status.create_a_desk_365_ticket: Create a ticket.update_a_desk_365_ticket_by_id: Update a ticket.desk_365_ticket_replies_create_with_attachment: Add a reply with attachment.create_a_desk_365_ticket_note: Add an internal note to a ticket.desk_365_ticket_notes_create_with_attachment: Add a note with attachment.list_all_desk_365_contacts: List contacts.create_a_desk_365_contact: Create a contact.desk_365_contacts_create_with_attachment: Create a contact with attachment.update_a_desk_365_contact_by_id: Update a contact.list_all_desk_365_companies: List companies.get_single_desk_365_company_by_id: Get company details.create_a_desk_365_company: Create a company.desk_365_companies_create_with_attachment: Create a company with attachment.update_a_desk_365_company_by_id: Update a company.list_all_desk_365_time_entries: List time entries.get_single_desk_365_time_entry_by_id: Get time entry details.create_a_desk_365_time_entry: Add a time entry.list_all_desk_365_surveys: List all surveys.get_single_desk_365_survey_by_id: Get survey details.list_all_desk_365_survey_ratings: List all survey ratings.list_all_desk_365_contracts: List contracts.get_single_desk_365_contract_by_id: Get contract details.create_a_desk_365_contract: Create a contract.update_a_desk_365_contract_by_id: Update a contract.get_single_desk_365_kb_category_by_id: Get KB category details.create_a_desk_365_kb_category: Create a KB category.update_a_desk_365_kb_category_by_id: Update a KB category.delete_a_desk_365_kb_category_by_id: Delete a KB category.get_single_desk_365_kb_folder_by_id: Get KB folder details.create_a_desk_365_kb_folder: Create a KB folder.update_a_desk_365_kb_folder_by_id: Update a KB folder.delete_a_desk_365_kb_folder_by_id: Delete a KB folder.get_single_desk_365_kb_article_by_id: Get KB article details.create_a_desk_365_kb_article: Create a KB article.update_a_desk_365_kb_article_by_id: Update a KB article.delete_a_desk_365_kb_article_by_id: Delete a KB article.
Workflows in Action
When given the proper toolsets, ChatGPT can orchestrate complex, multi-step helpdesk operations. Here are two concrete examples of how an AI engineer might utilize this setup.
1. VIP Customer Ticket Triage
"A VIP customer just escalated ticket #8992. Review the ticket details, read the conversation history to see what support has already suggested, and draft a final reply apologizing for the delay with an updated status."
Agent Execution Steps:
- Calls
get_single_desk_365_ticket_by_idwithticket_number: "8992"to check priority, status, and the customer's email. - Calls
get_single_desk_365_contact_by_idpassing the customer's email to verify their VIP tier in the CRM metadata. - Calls
list_all_desk_365_ticket_conversationswithticket_number: "8992"to read the back-and-forth thread. - Calls
create_a_desk_365_ticket_replywithticket_number: "8992"to submit the customized, empathetic response.
Outcome: The LLM successfully analyzes a stale ticket without hallucinating past context and interacts directly with the customer - saving a human agent 15 minutes of reading.
2. Automated Knowledge Base Updates
"We just resolved a major outage affecting our VPN. Check if we have an existing KB article for 'VPN Connectivity Issues'. If not, create a new article in the 'Network Troubleshooting' category explaining the resolution."
Agent Execution Steps:
- Calls
list_all_desk_365_kb_articlesto scan live titles for "VPN Connectivity". - If missing, it calls
get_single_desk_365_kb_category_by_idwith `category_name: "Network Troubleshooting"" to fetch the necessary category ID. - Calls
create_a_desk_365_kb_articleutilizing the retrieved category ID to publish the post-mortem documentation.
Outcome: Your internal documentation stays automatically synchronized with incident response efforts.
Handling Rate Limits
A critical factor in AI API execution is handling rate limits. Because LLMs can fire off multiple tool calls rapidly, you will inevitably encounter 429 Too Many Requests errors.
Truto explicitly does not retry, throttle, or apply automatic backoff on your behalf when encountering upstream rate limits. If the Desk365 API returns an HTTP 429, Truto passes that exact error down to the MCP caller.
However, Truto normalizes the upstream rate limit information into standardized headers per the IETF specification. Every response includes:
ratelimit-limitratelimit-remainingratelimit-reset
The caller (your application or the MCP client framework) is strictly responsible for inspecting these headers, pausing execution, and applying exponential backoff before the LLM re-attempts the tool call. For more details, consult the Truto Rate Limits documentation.
FAQ
- Does Truto handle Desk365 API rate limits automatically?
- No, Truto passes HTTP 429 errors directly to the caller. Truto normalizes the upstream rate limit data into standard IETF headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset), but the caller is responsible for implementing retry and backoff logic.
- Can I limit ChatGPT to only read Desk365 data?
- Yes. When creating the Truto MCP server, you can use method filtering by passing '"methods": ["read"]'. This hides all create, update, and delete tools from the language model.
- How do I handle attachments when creating a ticket via MCP?
- The Desk365 API requires a multipart body for the file, while the JSON ticket object must be stringified in the query parameters. Truto's auto-generated 'desk_365_tickets_create_with_attachment' tool explicitly defines this schema so the LLM handles it correctly.
- How do I authenticate the MCP server with ChatGPT?
- Truto generates a securely hashed MCP URL that acts as the entry point. You simply paste this URL into ChatGPT's Custom Connectors section under Developer mode. You can also enforce an additional layer of API token authentication if needed.