Work with Enchant help desk tickets: list, read, reply, add notes and labels, manage customers.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
WRITE: add one contact (email, twitter or phone) to a customer. Enchant REST: POST /customers/{id}/contacts.
Customer id.
Contact type.
Email address, Twitter screen name or phone number.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
WRITE: add one contact (email, twitter or phone) to a customer. Enchant REST: POST /customers/{id}/contacts.
| Argument | Type | Description |
|---|---|---|
| id* | string | Customer id. |
| type* | string | Contact type. |
| value* | string | Email address, Twitter screen name or phone number. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"type",
"value"
],
"properties": {
"id": {
"type": "string",
"description": "Customer id."
},
"type": {
"enum": [
"email",
"twitter",
"phone"
],
"type": "string",
"description": "Contact type."
},
"value": {
"type": "string",
"minLength": 1,
"description": "Email address, Twitter screen name or phone number."
}
}
}WRITE: add an internal note to a ticket (not sent to the customer). Enchant REST: POST /tickets/{id}/messages (type note).
| Argument | Type | Description |
|---|---|---|
| id* | string | Ticket id. |
| body* | string | Note body. |
| html | boolean | True if body is HTML (default false: plain text). |
| user_id* | string | Id of the user (agent) the note is from; see enchant_list_users. |
| attachment_ids | array | Ids of attachments already uploaded. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"user_id",
"body"
],
"properties": {
"id": {
"type": "string",
"description": "Ticket id."
},
"body": {
"type": "string",
"minLength": 1,
"description": "Note body."
},
"html": {
"type": "boolean",
"description": "True if body is HTML (default false: plain text)."
},
"user_id": {
"type": "string",
"description": "Id of the user (agent) the note is from; see enchant_list_users."
},
"attachment_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ids of attachments already uploaded."
}
}
}WRITE: add one or more labels to a ticket without changing its other labels. Enchant REST: PUT /tickets/{id}/labels/{label_ids}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Ticket id. |
| label_ids* | array | Label ids to add. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"label_ids"
],
"properties": {
"id": {
"type": "string",
"description": "Ticket id."
},
"label_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Label ids to add."
}
}
}WRITE: create a customer with optional contacts (email, twitter, phone). Enchant REST: POST /customers.
| Argument | Type | Description |
|---|---|---|
| summary | string | Short free-text summary shown on the customer profile. |
| contacts | array | Contacts of the customer. |
| last_name | string | |
| first_name | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"summary": {
"type": "string",
"description": "Short free-text summary shown on the customer profile."
},
"contacts": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"value"
],
"properties": {
"type": {
"enum": [
"email",
"twitter",
"phone"
],
"type": "string",
"description": "Contact type."
},
"value": {
"type": "string",
"minLength": 1,
"description": "Email address, Twitter screen name or phone number."
}
}
},
"description": "Contacts of the customer."
},
"last_name": {
"type": "string"
},
"first_name": {
"type": "string"
}
}
}WRITE: create an email ticket. Give customer_id, or a customer (matched by contact email, created if new). Optionally add the customer's first message with body (needs the customer's email). Enchant REST: POST /tickets.
| Argument | Type | Description |
|---|---|---|
| body | string | First inbound message from the customer (plain text). |
| subject* | string | Ticket subject. |
| user_id | string | User id to assign the ticket to. |
| customer | object | Customer to find or create, instead of customer_id. |
| inbox_id | string | Inbox id (the default inbox if omitted). |
| customer_id | string | Existing customer id. Give this or customer. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"subject"
],
"properties": {
"body": {
"type": "string",
"description": "First inbound message from the customer (plain text)."
},
"subject": {
"type": "string",
"minLength": 1,
"description": "Ticket subject."
},
"user_id": {
"type": "string",
"description": "User id to assign the ticket to."
},
"customer": {
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Email address; used to find or create the customer."
},
"last_name": {
"type": "string"
},
"first_name": {
"type": "string"
}
},
"description": "Customer to find or create, instead of customer_id."
},
"inbox_id": {
"type": "string",
"description": "Inbox id (the default inbox if omitted)."
},
"customer_id": {
"type": "string",
"description": "Existing customer id. Give this or customer."
}
}
}WRITE, DELETES DATA: remove one contact from a customer. Enchant REST: DELETE /customers/{id}/contacts/{contact_id}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Customer id. |
| contact_id* | string | Contact id (from the customer's contacts). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"contact_id"
],
"properties": {
"id": {
"type": "string",
"description": "Customer id."
},
"contact_id": {
"type": "string",
"description": "Contact id (from the customer's contacts)."
}
}
}Get the metadata of an attachment (name, size, MIME type) by id; attachment ids appear in ticket messages. Enchant REST: GET /attachments/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Attachment id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Attachment id."
}
}
}Get one customer by id, with the contacts (emails, phones, Twitter names). Enchant REST: GET /customers/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Customer id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Customer id."
}
}
}Get one ticket by id. Embed related data with `embed`: messages (the conversation: replies and notes), customer, user, inbox, labels. Each embedded type costs 1 extra rate-limit credit. Enchant REST: GET /tickets/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Ticket id (the string id, not the friendly ticket number). |
| embed | array | Related resources to embed. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Ticket id (the string id, not the friendly ticket number)."
},
"embed": {
"type": "array",
"items": {
"enum": [
"messages",
"customer",
"user",
"inbox",
"labels"
],
"type": "string"
},
"description": "Related resources to embed."
}
}
}List customers, or find one by contact: set contact_type and contact_value (for example email + an address). Enchant REST: GET /customers.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Past 10,000 results, filter by since_created_at instead. |
| count | boolean | If true, also return the total number of matching results (costs 1 extra rate-limit credit). |
| per_page | integer | Results per page (0-100, default 10). Use 0 with count to get only the total. |
| contact_type | string | Contact type to match (use with contact_value). |
| contact_value | string | Email address or Twitter screen name to match (use with contact_type). |
| since_created_at | string | Only customers created since this UTC ISO 8601 time. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number (1-based). Past 10,000 results, filter by since_created_at instead."
},
"count": {
"type": "boolean",
"description": "If true, also return the total number of matching results (costs 1 extra rate-limit credit)."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Results per page (0-100, default 10). Use 0 with count to get only the total."
},
"contact_type": {
"enum": [
"email",
"twitter",
"phone"
],
"type": "string",
"description": "Contact type to match (use with contact_value)."
},
"contact_value": {
"type": "string",
"description": "Email address or Twitter screen name to match (use with contact_type)."
},
"since_created_at": {
"type": "string",
"description": "Only customers created since this UTC ISO 8601 time."
}
}
}List and filter tickets (newest first by default). Enchant REST: GET /tickets. Use user_ids ["null"] for unassigned tickets. Each result has a short summary; use enchant_get_ticket for messages.
| Argument | Type | Description |
|---|---|---|
| ids | array | Only these ticket ids. |
| page | integer | Page number (1-based). Past 10,000 results, filter by since_created_at instead. |
| sort | string | Sort order; a leading - means descending. |
| spam | boolean | Only spam (true) or only non-spam (false) tickets. |
| count | boolean | If true, also return the total number of matching results (costs 1 extra rate-limit credit). |
| trash | boolean | Only trashed (true) or only non-trashed (false) tickets. |
| types | array | Ticket types, e.g. email, chat, sms, phone, web, twitter, whatsapp. |
| states | array | Only tickets in these states. |
| per_page | integer |
List the help desk users (agents): id, name, email. Use the ids to assign tickets and to author replies and notes. Enchant REST: GET /users.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1-based). Past 10,000 results, filter by since_created_at instead. |
| per_page | integer | Results per page (0-100, default 10). Use 0 with count to get only the total. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number (1-based). Past 10,000 results, filter by since_created_at instead."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Results per page (0-100, default 10). Use 0 with count to get only the total."
}
}
}WRITE: remove one or more labels from a ticket; its other labels stay. Enchant REST: DELETE /tickets/{id}/labels/{label_ids}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Ticket id. |
| label_ids* | array | Label ids to remove. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"label_ids"
],
"properties": {
"id": {
"type": "string",
"description": "Ticket id."
},
"label_ids": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Label ids to remove."
}
}
}WRITE: send an outbound reply on a ticket. This SENDS A REAL EMAIL to the customer address in `to`. Use enchant_add_note for an internal note. Enchant REST: POST /tickets/{id}/messages (type reply, direction out).
| Argument | Type | Description |
|---|---|---|
| id* | string | Ticket id. |
| to* | string | Recipient address, normally the customer's email. |
| body* | string | Reply body. |
| html | boolean | True if body is HTML (default false: plain text). |
| user_id* | string | Id of the user (agent) the reply is sent as; see enchant_list_users. |
| attachment_ids | array | Ids of attachments already uploaded. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id",
"user_id",
"to",
"body"
],
"properties": {
"id": {
"type": "string",
"description": "Ticket id."
},
"to": {
"type": "string",
"minLength": 1,
"description": "Recipient address, normally the customer's email."
},
"body": {
"type": "string",
"minLength": 1,
"description": "Reply body."
},
"html": {
"type": "boolean",
"description": "True if body is HTML (default false: plain text)."
},
"user_id": {
"type": "string",
"description": "Id of the user (agent) the reply is sent as; see enchant_list_users."
},
"attachment_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ids of attachments already uploaded."
}
}
}WRITE: update a customer's name or summary. If `contacts` is given, it REPLACES the contact list; use enchant_add_customer_contact to add one. Enchant REST: PATCH /customers/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Customer id. |
| summary | string | Short free-text summary shown on the customer profile. |
| contacts | array | The full new contact list (replaces the existing one). |
| last_name | string | |
| first_name | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Customer id."
},
"summary": {
"type": "string",
"description": "Short free-text summary shown on the customer profile."
},
"contacts": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"value"
],
"properties": {
"type": {
"enum": [
"email",
"twitter",
"phone"
],
"type": "string",
"description": "Contact type."
},
"value": {
"type": "string",
"minLength": 1,
"description": "Email address, Twitter screen name or phone number."
}
}
},
"description": "The full new contact list (replaces the existing one)."
},
"last_name": {
"type": "string"
},
"first_name": {
"type": "string"
}
}
}WRITE: change a ticket: state (open, hold, closed), assignee, inbox, subject, spam or trash (not both true). label_ids REPLACES all labels (empty array clears them); use enchant_add_ticket_labels to keep existing ones. Enchant REST: PATCH /tickets/{id}.
| Argument | Type | Description |
|---|---|---|
| id* | string | Ticket id. |
| spam | boolean | Mark as spam. Cannot be true together with trash. |
| state | string | New state. |
| trash | boolean | Send to trash. Cannot be true together with spam. |
| subject | string | New subject. |
| user_id | string | null | Assign to this user id; null unassigns the ticket. |
| inbox_id | string | Move to this inbox id. |
| label_ids | array | The full new set of label ids (replaces existing labels). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Ticket id."
},
"spam": {
"type": "boolean",
"description": "Mark as spam. Cannot be true together with trash."
},
"state": {
"enum": [
"open",
"hold",
"closed"
],
"type": "string",
"description": "New state."
},
"trash": {
"type": "boolean",
"description": "Send to trash. Cannot be true together with spam."
},
"subject": {
"type": "string",
"description": "New subject."
},
"user_id": {
"type": [
"string",
"null"
],
"description": "Assign to this user id; null unassigns the ticket."
},
"inbox_id": {
"type": "string",
"description": "Move to this inbox id."
},
"label_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "The full new set of label ids (replaces existing labels)."
}
}
}| Results per page (0-100, default 10). Use 0 with count to get only the total. |
| user_ids | array | Only tickets assigned to these user ids ("null" = unassigned). |
| inbox_ids | array | Only tickets in these inbox ids. |
| label_ids | array | Only tickets with these label ids. |
| since_created_at | string | Only tickets created since this UTC ISO 8601 time, e.g. 2026-01-31T13:41:10Z. |
| since_updated_at | string | Only tickets updated since this UTC ISO 8601 time. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only these ticket ids."
},
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Page number (1-based). Past 10,000 results, filter by since_created_at instead."
},
"sort": {
"enum": [
"updated_at",
"-updated_at",
"created_at",
"-created_at",
"user_id",
"user_id,-updated_at"
],
"type": "string",
"description": "Sort order; a leading - means descending."
},
"spam": {
"type": "boolean",
"description": "Only spam (true) or only non-spam (false) tickets."
},
"count": {
"type": "boolean",
"description": "If true, also return the total number of matching results (costs 1 extra rate-limit credit)."
},
"trash": {
"type": "boolean",
"description": "Only trashed (true) or only non-trashed (false) tickets."
},
"types": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ticket types, e.g. email, chat, sms, phone, web, twitter, whatsapp."
},
"states": {
"type": "array",
"items": {
"enum": [
"open",
"hold",
"closed"
],
"type": "string"
},
"description": "Only tickets in these states."
},
"per_page": {
"type": "integer",
"maximum": 100,
"minimum": 0,
"description": "Results per page (0-100, default 10). Use 0 with count to get only the total."
},
"user_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only tickets assigned to these user ids (\"null\" = unassigned)."
},
"inbox_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only tickets in these inbox ids."
},
"label_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only tickets with these label ids."
},
"since_created_at": {
"type": "string",
"description": "Only tickets created since this UTC ISO 8601 time, e.g. 2026-01-31T13:41:10Z."
},
"since_updated_at": {
"type": "string",
"description": "Only tickets updated since this UTC ISO 8601 time."
}
}
}