Skip to content

Connect Desk365 to Claude: Sync Support Tickets, Companies & Articles

Learn how to connect Desk365 to Claude using Truto's MCP server. Sync tickets, contacts, and knowledge base articles directly into Claude's context window.

Uday Gajavalli Uday Gajavalli · · 7 min read
Connect Desk365 to Claude: Sync Support Tickets, Companies & Articles

Support operations run on tickets, but modern engineering teams want to triage issues, pull company history, and draft knowledge base articles directly from their AI chat interfaces. Building the API plumbing to do this reliably requires dealing with rigid pagination schemes and unusual attachment payloads.

This guide shows you how to connect Desk365 to Claude using Truto's dynamic MCP (Model Context Protocol) server generation. If your team uses ChatGPT instead, check out our guide on connecting Desk365 to ChatGPT, or if you are building autonomous workflows, see connecting Desk365 to AI Agents.

The Engineering Reality of the Desk365 API

When exposing Desk365 to Claude via MCP, we need to account for a few API-specific quirks that go beyond standard REST mechanics. Truto normalizes the transport layer, but the LLM still needs to format inputs correctly for the integration's native schema.

  1. Multipart Bodies + Query String JSON for Attachments: Desk365 handles attachments in a highly specific way. You cannot send a simple JSON payload to create a ticket with an attachment. The API expects the file in a multipart form body, and the actual ticket metadata must be sent as a stringified JSON object inside the query parameters (e.g., passing the stringified ticket_object or reply_object in the query). Truto passes these schemas directly to the LLM.
  2. Rigid Pagination Constraints: Most APIs accept an arbitrary limit parameter (like 1 to 100). Desk365 is unforgiving. For endpoints like list_all_desk_365_tickets or list_all_desk_365_time_entries, the count parameters (ticket_count, time_entries_count) strict-match against exactly 30, 50, or 100. If an LLM attempts to request 10 records, the API will fail. For strategies on managing this, see our guide on feeding paginated API results to AI agents.
  3. Gatekept Contract Endpoints: The Desk365 API documentation notes that Contract APIs are restricted access. Endpoints like list_all_desk_365_contracts will fail unless the specific Desk365 tenant has been granted access by contacting help@desk365.io.

A Critical Note on Rate Limits

Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Desk365 API returns an HTTP 429, Truto passes that error directly to the caller. Truto normalizes upstream rate limit info into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. Your MCP client or agent framework is entirely responsible for detecting these 429s and executing retry/backoff logic.

Step 1: Creating the Desk365 MCP Server

Truto generates MCP tools dynamically based on the documented endpoints of the integrated account. You can create an MCP server either visually or programmatically.

Option A: Via the Truto UI

  1. Navigate to your connected Desk365 instance in the Integrated Accounts view.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Define a name (e.g., "Desk365 Support Triage").
  5. Select allowed methods (e.g., read for a read-only instance, or write if the agent should create tickets) and apply any necessary tags.
  6. Click Save and copy the generated MCP server URL.

Option B: Via the API

For platform engineers building scalable integrations, you can generate MCP servers programmatically. This endpoint creates a secure token backed by distributed edge storage.

curl -X POST https://api.truto.one/integrated-account/YOUR_DESK365_ACCOUNT_ID/mcp \
  -H "Authorization: Bearer YOUR_TRUTO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Claude - Desk365 Integration",
    "config": {
      "methods": ["read", "write"],
      "tags": ["support", "knowledge_base"]
    },
    "expires_at": null
  }'

The response returns an MCP URL:

{
  "id": "mcp_abc123",
  "url": "https://api.truto.one/mcp/xyz789..."
}

Step 2: Connecting to Claude

Once you have your Truto MCP URL, you can plug it directly into Claude.

Using Claude Web or Desktop UI

This is the fastest method for end users.

  1. In Claude, navigate to Settings -> Connectors -> Add custom connector.
  2. Paste the Truto MCP Server URL.
  3. Click Add. Claude will immediately call the initialize and tools/list JSON-RPC methods, populating your chat context with Desk365 capabilities.

Using the Claude Desktop Config File

If you prefer manual configuration (for instance, to manage configurations in version control), update your claude_desktop_config.json file. Because Truto provides a remote HTTP endpoint, you use an SSE client wrapper (or point it directly if your setup supports remote URLs natively).

{
  "mcpServers": {
    "desk365_truto": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/client-sse",
        "https://api.truto.one/mcp/xyz789..."
      ]
    }
  }
}
sequenceDiagram
    participant C as Claude
    participant T as Truto MCP Router
    participant D as Desk365 API
    
    C->>T: POST /mcp/:token (tools/call: get_single_desk_365_ticket_by_id)
    T->>T: Validate Token & Flatten Query/Body Args
    T->>D: GET /api/v2/tickets/1042
    D-->>T: 200 OK { ticket data }
    T-->>C: JSON-RPC Result

Desk365 Tool Inventory

Truto automatically maps the Desk365 REST API into structured JSON-RPC tools for LLMs. Here is a breakdown of the available capabilities. For full schema details, visit the Desk365 integration page.

Hero Tools

These are the high-impact tools that drive the majority of Desk365 AI workflows.

list_all_desk_365_tickets

Retrieves a paginated list of support tickets. Supports documented filters and include_* query parameters. Remember that ticket_count must be exactly 30, 50, or 100.

"List all open Desk365 tickets assigned to the billing department. Retrieve 30 records and include customer details."

get_single_desk_365_ticket_by_id

Fetches all metadata for a specific ticket. The resource ID is the ticket_number.

"Pull the full details for Desk365 ticket #8092, including its current status and priority level."

update_a_desk_365_ticket_by_id

Modifies an existing ticket. Excellent for having Claude automatically close tickets, update priorities, or reassign them based on context.

"Update Desk365 ticket #8092 - set the priority to high and change the status to 'Waiting on Customer'."

list_all_desk_365_ticket_conversations

Retrieves the entire thread history of a ticket. Required for context-gathering before drafting replies.

"Read the entire conversation history for ticket #4112 so I can understand what the customer has already tried."

create_a_desk_365_ticket_reply

Posts a response back to the customer on a specific ticket. The ticket_number is required as a query parameter.

"Draft a polite reply to ticket #4112 explaining that the deployment issue has been patched, and send it."

list_all_desk_365_kb_articles

Queries the live knowledge base. Critical for agents trying to find existing documentation before escalating an issue.

"Search the Desk365 knowledge base articles to see if we have an existing guide on configuring SAML SSO."

Full Inventory of Additional Tools

Here is the complete inventory of additional Desk365 tools available.

  • list_all_desk_365_ping: Check Desk365 API server status.
  • create_a_desk_365_ticket: Create a ticket.
  • desk_365_tickets_create_with_attachment: Create a ticket with attachment. Send file in multipart body, stringified ticket_object in query params.
  • desk_365_ticket_replies_create_with_attachment: Add a reply with attachment. Send file in multipart body, stringified reply_object and ticket_number in query params.
  • 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. Send file in multipart body, stringified note_object and ticket_number in query params.
  • list_all_desk_365_contacts: List contacts using documented query parameters.
  • get_single_desk_365_contact_by_id: Get contact details. Pass the primary_email as the resource ID.
  • 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 by primary_email.
  • list_all_desk_365_companies: List companies using documented query parameters.
  • get_single_desk_365_company_by_id: Get company details by company name.
  • 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 by company name.
  • list_all_desk_365_time_entries: List time entries. time_entries_count accepts 30, 50, or 100.
  • get_single_desk_365_time_entry_by_id: Get time entry details by ID.
  • create_a_desk_365_time_entry: Add a time entry to a ticket.
  • list_all_desk_365_surveys: List all surveys.
  • get_single_desk_365_survey_by_id: Get survey details by survey_name.
  • list_all_desk_365_survey_ratings: List all survey ratings.
  • list_all_desk_365_contracts: List contracts. (Requires special access).
  • get_single_desk_365_contract_by_id: Get contract details by reference_number.
  • create_a_desk_365_contract: Create a contract.
  • update_a_desk_365_contract_by_id: Update a contract by reference_number.
  • get_single_desk_365_kb_category_by_id: Get KB category details by category_name.
  • 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 by article_name.
  • 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

Exposing these tools to Claude enables specific operational workflows. Here is how a user interacts with the configured agent.

Workflow 1: Support Escalation & Triage

When a tier 1 agent needs a summary before kicking a ticket to tier 2.

"Check Desk365 ticket #904. Read its conversation history, and add an internal note summarizing the debugging steps we've already taken, tagging the tier 2 team."

Execution Steps:

  1. get_single_desk_365_ticket_by_id -> Claude fetches the ticket details to verify state.
  2. list_all_desk_365_ticket_conversations -> Claude pulls the entire thread history to identify the debugging steps.
  3. create_a_desk_365_ticket_note -> Claude generates a concise summary and posts it as an internal note to the ticket, leaving the thread clean for the customer.

Workflow 2: Automated KB Generation

Closing the loop between support volume and documentation gaps.

"Find tickets from this week regarding 'database timeout' issues. If you identify a common resolution, draft a new Knowledge Base article titled 'Fixing DB Timeouts' and publish it to the platform."

Execution Steps:

  1. list_all_desk_365_tickets -> Claude queries recent tickets with the relevant search filter, requesting 30 items.
  2. list_all_desk_365_ticket_conversations -> Claude iterates through the relevant tickets to find the confirmed resolution from the support engineers.
  3. create_a_desk_365_kb_article -> Claude synthesizes the steps and pushes a formatted HTML or Markdown payload to create a new live KB article.

Security and Access Control

Exposing SaaS APIs to AI models requires strict boundary control. Following MCP server security best practices, Truto provides database-level governance over what the MCP server can execute.

  • Method Filtering (config.methods): Restrict an MCP server to read-only capabilities by passing ["read"] during creation. This ensures Claude can only call get or list operations, physically preventing it from creating or updating Desk365 tickets.
  • Tag Filtering (config.tags): Group tools by domain. You can create a server that only exposes ["knowledge_base"] tagged tools, hiding customer PII and ticket threads entirely.
  • Secondary Authentication (require_api_token_auth): Enable this flag to require clients to pass a valid Truto API token in their headers, rather than relying solely on the security of the unguessable URL token.
  • Automatic Expiration (expires_at): Truto utilizes stateful alarms to automatically purge the database record and distributed edge storage keys for short-lived MCP servers, preventing stale credentials from lingering in vendor chat history.

FAQ

How do I handle Desk365 ticket attachments via MCP?
Desk365 handles attachments uniquely. You must pass the file in a multipart body, while the actual ticket data is passed as a stringified JSON object in the query parameters (e.g., `ticket_object` or `reply_object`).
Why do my Desk365 list queries fail with pagination errors?
Desk365 enforces strict page sizes. Parameters like `ticket_count` or `time_entries_count` must be set to exactly 30, 50, or 100. Arbitrary limits will result in API rejection.
Does Truto automatically retry Desk365 API rate limits?
No. Truto passes HTTP 429 errors directly to your caller. It normalizes rate limit data into standard headers (`ratelimit-limit`, `ratelimit-remaining`, `ratelimit-reset`), but the caller is fully responsible for retry and backoff logic.

More from our Blog