reply_to_ticket
Every input property this tool accepts, with its bounds.
Post a customer-facing reply or an internal note on a ticket.
Role required: editor. This is the same check the HTTP route
POST /v1/tickets/{ticket_id}/events applies, run by the same guard object.
Source: tool definition services/runtime/src/runtime/mcp/tools.py:492-514,
handler services/runtime/src/runtime/mcp/tools.py:334-359, role check
services/runtime/src/runtime/mcp/tools.py:339-342, HTTP route
services/runtime/src/runtime/api/tickets.py:1422-1425.
Input
| Property | Type | Required | Notes |
|---|---|---|---|
ticket_id | string | yes | Must be a UUID |
body | string | yes | The message text |
workspace_id | string | no | The workspace to act in. Optional if you belong to exactly one workspace, required otherwise |
kind | string | no | reply or internal_note. Defaults to reply |
apply_status | string | no | Move the ticket to this status in the same call. One of closed, deleted, merged, on_hold, open, pending, solved, spam |
Source: services/runtime/src/runtime/mcp/tools.py:499-510, with the
apply_status values built from
services/runtime/src/runtime/api/tickets.py:47-49.
Reply or note
Two values, and only two.
kind | What it does |
|---|---|
reply | A customer-facing reply. This is the default |
internal_note | An internal note, not sent to the customer |
Source: services/runtime/src/runtime/mcp/tools.py:503-507. The default is
declared in the schema and applied again by the handler
(services/runtime/src/runtime/mcp/tools.py:346), so omitting it produces
reply either way.
The default is a customer-facing reply
If you want an internal note you have to ask for one. A call that omits kind
posts a customer-facing reply.
ticket_id and body are checked before anything else runs, and an empty
string counts as absent. A call missing either is refused with ticket_id and body are required.
Source: services/runtime/src/runtime/mcp/tools.py:335-336.
Output
The event as the HTTP route returns it, delivered as JSON text.
Failures
An unusable value comes back as a tool error carrying the reason: a
ticket_id that is not a UUID, a kind or apply_status outside the accepted
set, or a status transition the ticket's current state does not allow.
Source: services/runtime/src/runtime/mcp/tools.py:350-359.
Anything unanticipated returns exactly one message, this tool call could not be completed, with the real exception and its traceback written to the server logs
instead. That is deliberate, and it is why a caller never sees a database error.
Source: services/runtime/src/runtime/mcp/tools.py:566-574.