> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.neetodesk.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tools

> Every tool the NeetoDesk MCP server exposes, grouped by resource.

You do not need these names to use the server. Ask in plain language and the assistant picks the right tool. The list is here for when you want to know exactly what a connection can do. Most tools match a [REST API](/api/introduction) endpoint and link to its reference.

Every tool takes an optional `workspace` argument, the subdomain of a connected workspace. Left out, it runs against the workspace the connection was set up with. `ListWorkspaces` reports the values you can pass.

What a tool returns depends on the credential. Over [OAuth](/mcp/authentication#oauth-scoped-to-you), lists come back filtered to the permissions of the person who approved the connection, and a record they cannot open is refused rather than returned; an [API key](/mcp/authentication#api-key-scoped-to-the-workspace) reaches the whole workspace. A tool that creates, updates, or deletes is also refused when the connection was not granted the **Create and update** or **Delete** permission.

## Workspaces

| Tool | What it does |
| - | - |
| `ListWorkspaces` | Lists the workspaces this connection can reach. Other tools take a `workspace` argument to target one of them. |

`ListWorkspaces` has no REST endpoint, which is why it is not linked.

An OAuth grant covers every workspace ticked on the **Authorize access** screen, which can be
more than one. An API key covers the workspace it was generated in.

## Tickets

| Tool | What it does |
| - | - |
| [`ListTickets`](/api/tickets/list) | Lists the tickets the caller can access, newest first, with each ticket's subject, status, priority, channel, assigned agent and customer. Can be narrowed to one or more statuses. |
| [`GetTicket`](/api/tickets/get) | Returns one ticket in full, including its description and the agent, customer, group and tags it is associated with. |
| [`CreateTicket`](/api/tickets/create) | Creates a ticket for a customer, identified by their email address. The description becomes the ticket's first comment, and any `attachments` are attached to it. |
| [`UpdateTicket`](/api/tickets/update) | Updates a ticket's subject, status, priority, category, assigned agent, group or tags, and adds any `attachments` to the ticket's opening message. A ticket that has no opening message is refused, and the file goes on a comment instead. |
| `search` | Searches tickets by subject and by the text of their comments, returning up to 25 of the most recent matches, each with a snippet of the matching text. |
| `fetch` | Returns one ticket in full, with every comment on it and the ticket's URL. |

Tickets are addressed by ticket number or by UUID, so `42` and the UUID both work.

<Note>
  `search` and `fetch` are the two tools the
  [ChatGPT connector specification](https://developers.openai.com/api/docs/mcp) requires, so they
  overlap with `ListTickets` and `GetTicket` rather than adding anything new. They have no
  separate REST endpoint, which is why they are not linked above.
</Note>

## Comments and drafts

| Tool | What it does |
| - | - |
| [`ListTicketComments`](/api/comments/list) | Lists a ticket's comments in the order they were added, with each comment's type, author's email address and body. |
| [`GetTicketComment`](/api/comments/get) | Returns one comment on a ticket, with its type, author's email address and body. |
| [`CreateTicketComment`](/api/comments/create) | Adds a comment to a ticket, with any `attachments` attached to it. A reply is published where the customer reads it; a note stays internal. Neither is emailed to the customer. |
| [`CreateTicketDraft`](/api/comments/create-draft) | Saves an unsent draft on a ticket, replacing the draft it already holds of that type, and keeps any `attachments` on it until the draft is sent. Passing `attachments` replaces the files the draft held; omitting it leaves them alone, and an empty array clears them. A reply drafted for an agent gets that agent's saved signature appended. |

A ticket holds at most one draft per comment type. There is no tool for reading a draft back, or
for editing a comment once it is posted.

## Attachments

A tool call carries JSON, never a file, so a file reaches the workspace one of two ways. Either
route ends with a `signed_id` to pass in `attachments` on `CreateTicket`, `CreateTicketComment`,
`UpdateTicket` or `CreateTicketDraft`.

| Tool | What it does |
| - | - |
| [`UploadAttachment`](/api/attachments/create) | Stores a file that is already published on the web, by fetching it from its https address. One call, and the assistant needs no ability of its own to move the file. |
| [`CreateAttachmentUpload`](/api/attachments/create-upload) | Reserves storage for a file on the caller's machine and returns an `upload_url` with the `upload_headers` to send. The assistant then sends the bytes itself with an HTTP `PUT`, so this route needs a client that can make that request - a terminal-based assistant can, a chat-only one cannot. |

`checksum` for a reservation is the base64-encoded MD5 digest of the file, which is the form
`Content-MD5` takes, not the hex digest.

<Warning>
  `UploadAttachment` is the one tool where NeetoDesk makes an outbound request to an address the
  assistant chose. The address must be `https`, and one that resolves onto a private or
  link-local network is refused, so the tool cannot be steered at infrastructure that is only
  reachable from inside NeetoDesk. The file also has to be reachable without credentials, which
  means the tool cannot read anything behind your own login.
</Warning>

A `signed_id` is only accepted in the workspace that uploaded it. A reservation whose bytes never
arrived is refused at attach time rather than left as a broken attachment, and a file that is
never attached to anything is cleaned up automatically.

Attaching applies the workspace attachment limit, 10 MB by default, which is smaller than the
50 MB upload limit. A file between the two is stored but refused at attach time.

`UpdateTicket` adds files to the ticket's opening message, beside the ones already there, and a
ticket with no opening message cannot take them that way. A draft only holds the ids until it is
sent, so nothing is attached to the ticket at that point.

## Customers

| Tool | What it does |
| - | - |
| [`CreateCustomer`](/api/customers/create) | Creates a customer. At least one email address is required, and the first one given becomes the primary. |

There is no tool for reading or updating a customer. A ticket reports its customer's email
address, so read the ticket instead.

## Team members

| Tool | What it does |
| - | - |
| [`ListTeamMembers`](/api/team-members/list) | Lists active team members with their ID, email address, name, time zone and role. Can be narrowed to one exact email address. |
| [`GetTeamMember`](/api/team-members/get) | Returns one active team member's email address, name, time zone and role. |
| [`CreateTeamMember`](/api/team-members/add) | Invites one or more people to the workspace. Each address is emailed an invitation unless invitation emails are turned off. |
| [`UpdateTeamMember`](/api/team-members/update) | Updates a team member's email address, name, time zone or role. |
| [`DeleteTeamMember`](/api/team-members/remove) | Deactivates a team member, ending their access. Their user record is kept so the tickets and comments they handled stay attributed to them. |

Managing team members needs the member-management permission on the connected account.

## Forms

| Tool | What it does |
| - | - |
| [`ListForms`](/api/forms/list) | Lists the workspace's enabled web forms, the forms through which customers raise tickets. |

## Reports

| Tool | What it does |
| - | - |
| [`GetTicketReports`](/api/reports/get-ticket-volume) | Reports how many tickets entered each status over a date range. |
| [`GetTicketTimeSeriesReport`](/api/reports/get-ticket-time-series) | Reports how many tickets were opened and how many were closed on each day of a date range. |
| [`GetAgentReports`](/api/reports/get-agent-performance) | Reports each agent's average first-response time, average resolution time, and assigned and closed ticket counts over a date range, fastest first. |
| [`GetGroupReports`](/api/reports/get-team-performance) | The same metrics per group instead of per agent. |
| [`GetSurveyReports`](/api/reports/get-customer-satisfaction) | Reports how customers answered each satisfaction survey over a date range, as a count per answer choice. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.