@fruggr/zendesk-mcp-server 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1063,11 +1063,11 @@ const createHelpCenterTools = (ctx) => {
1063
1063
  namespace: "help_center",
1064
1064
  readOnly: true,
1065
1065
  title: "List Help Center Categories",
1066
- description: "List all Help Center categories. Optionally filter by locale.",
1066
+ description: "List all Help Center categories. Categories are the top level of the Guide hierarchy (category → section → article); each entry includes its id, name and locale. Results are cursor-paginated. Pair a returned category id with list_sections to drill down, then list_articles to reach articles. Pass a locale to read category names in that translation.",
1067
1067
  inputSchema: z.object({
1068
- locale: z.string().optional(),
1069
- page_size: z.number().int().min(1).max(100).default(100),
1070
- cursor: z.string().optional()
1068
+ locale: z.string().optional().describe("Locale for category names (e.g., \"en-us\", \"fr\"). Defaults to the Help Center default locale."),
1069
+ page_size: z.number().int().min(1).max(100).default(100).describe("Categories per page (1-100, default 100)."),
1070
+ cursor: z.string().optional().describe("Pagination cursor from a previous response; omit for the first page.")
1071
1071
  }),
1072
1072
  annotations: {
1073
1073
  readOnlyHint: true,
@@ -1089,12 +1089,12 @@ const createHelpCenterTools = (ctx) => {
1089
1089
  namespace: "help_center",
1090
1090
  readOnly: true,
1091
1091
  title: "List Help Center Sections",
1092
- description: "List sections, optionally filtered by category ID and locale.",
1092
+ description: "List Help Center sections. Sections are the middle level of the Guide hierarchy (category section → article) and group related articles; each entry includes its id, name, category_id and locale. Results are cursor-paginated. Pass category_id to list only one category's sections (ids come from list_categories), then use a section id with list_articles. Pass a locale to read section names in that translation.",
1093
1093
  inputSchema: z.object({
1094
- category_id: z.number().int().optional(),
1095
- locale: z.string().optional(),
1096
- page_size: z.number().int().min(1).max(100).default(100),
1097
- cursor: z.string().optional()
1094
+ category_id: z.number().int().optional().describe("Restrict to sections of this category (id from list_categories). Omit to list every section."),
1095
+ locale: z.string().optional().describe("Locale for section names (e.g., \"en-us\", \"fr\"). Defaults to the Help Center default locale."),
1096
+ page_size: z.number().int().min(1).max(100).default(100).describe("Sections per page (1-100, default 100)."),
1097
+ cursor: z.string().optional().describe("Pagination cursor from a previous response; omit for the first page.")
1098
1098
  }),
1099
1099
  annotations: {
1100
1100
  readOnlyHint: true,
@@ -1189,13 +1189,13 @@ const createHelpCenterTools = (ctx) => {
1189
1189
  namespace: "help_center",
1190
1190
  readOnly: false,
1191
1191
  title: "Create Article Translation",
1192
- description: "Create a translation for an existing article in a specific locale.",
1192
+ description: "Create a translation for an existing article in a specific locale. The article must already exist (create it with create_article); this adds a new localized version and returns the created translation (locale, title, draft state). The target locale must not already have a translation — use update_article_translation to modify an existing one, and list_article_translations to see which locales exist. Provide the full HTML body.",
1193
1193
  inputSchema: z.object({
1194
- article_id: z.number().int(),
1194
+ article_id: z.number().int().describe("ID of the existing article to translate."),
1195
1195
  locale: z.string().describe("Target locale (e.g., \"fr\", \"de\")"),
1196
- title: z.string().min(1),
1196
+ title: z.string().min(1).describe("Translated article title."),
1197
1197
  body: z.string().min(1).describe("Translated body (HTML)"),
1198
- draft: z.boolean().default(false)
1198
+ draft: z.boolean().default(false).describe("Create the translation as a draft (not visible to end users). Defaults to false (published).")
1199
1199
  }),
1200
1200
  annotations: {
1201
1201
  readOnlyHint: false,
@@ -1357,8 +1357,8 @@ const createHelpCenterTools = (ctx) => {
1357
1357
  namespace: "help_center",
1358
1358
  readOnly: false,
1359
1359
  title: "Create Content Tag",
1360
- description: "Create a new content tag for Guide articles.",
1361
- inputSchema: z.object({ name: z.string().min(1).describe("Content tag name") }),
1360
+ description: "Create a new content tag for Guide articles. Content tags are end-user visible labels that help readers discover related articles; this returns the created tag with its id. Check list_content_tags first to avoid duplicates, then attach the new id via the content_tag_ids parameter of create_article or update_article. For internal search-ranking labels that are not shown to end users, use article labels (list_labels) instead.",
1361
+ inputSchema: z.object({ name: z.string().min(1).describe("Content tag name as shown to end users (e.g., \"billing\", \"getting-started\").") }),
1362
1362
  annotations: {
1363
1363
  readOnlyHint: false,
1364
1364
  destructiveHint: false,
@@ -1419,8 +1419,8 @@ const createHelpCenterTools = (ctx) => {
1419
1419
  namespace: "help_center",
1420
1420
  readOnly: true,
1421
1421
  title: "List Article Attachments",
1422
- description: "List all attachments for an article.",
1423
- inputSchema: z.object({ article_id: z.number().int().describe("Article ID") }),
1422
+ description: "List all attachments for an article. Returns attachment metadata only (id, file name, content type, size, URL), not the file bytes; both inline and block attachments are included. This is for Help Center articles — for attachments on support tickets use get_ticket_attachments instead. Upload new files with create_article_attachment.",
1423
+ inputSchema: z.object({ article_id: z.number().int().describe("ID of the Help Center article whose attachments to list.") }),
1424
1424
  annotations: {
1425
1425
  readOnlyHint: true,
1426
1426
  destructiveHint: false,
@@ -1851,7 +1851,7 @@ const createTicketTools = (ctx) => {
1851
1851
  namespace: "tickets",
1852
1852
  readOnly: false,
1853
1853
  title: "Create Zendesk Ticket",
1854
- description: "Create a new Zendesk support ticket with subject, description, and optional priority/type/assignee/tags.",
1854
+ description: "Create a new Zendesk support ticket with subject, description, and optional priority/type/assignee/tags. The description becomes the first public comment of the ticket, and the new ticket id is returned. After creation, use update_ticket to change status or assignee, add_public_comment or add_private_note to reply, and manage_tags to adjust tags. Look up valid assignee_id / group_id and custom field ids via search_users or your Zendesk admin settings.",
1855
1855
  inputSchema: z.object({
1856
1856
  subject: z.string().min(1).describe("Ticket subject"),
1857
1857
  description: z.string().min(1).describe("Ticket description"),
@@ -1860,20 +1860,20 @@ const createTicketTools = (ctx) => {
1860
1860
  "high",
1861
1861
  "normal",
1862
1862
  "low"
1863
- ]).optional(),
1863
+ ]).optional().describe("Ticket priority. One of urgent, high, normal, low."),
1864
1864
  type: z.enum([
1865
1865
  "problem",
1866
1866
  "incident",
1867
1867
  "question",
1868
1868
  "task"
1869
- ]).optional(),
1870
- assignee_id: z.number().int().optional(),
1871
- group_id: z.number().int().optional(),
1872
- tags: z.array(z.string()).optional(),
1869
+ ]).optional().describe("Ticket type. One of problem, incident, question, task."),
1870
+ assignee_id: z.number().int().optional().describe("User id of the agent to assign the ticket to."),
1871
+ group_id: z.number().int().optional().describe("Id of the group to assign the ticket to."),
1872
+ tags: z.array(z.string()).optional().describe("Tags to set on the ticket."),
1873
1873
  custom_fields: z.array(z.object({
1874
1874
  id: z.number().int(),
1875
1875
  value: z.unknown()
1876
- })).optional()
1876
+ })).optional().describe("Custom field values as { id, value } pairs (field ids come from your Zendesk admin settings).")
1877
1877
  }),
1878
1878
  annotations: {
1879
1879
  readOnlyHint: false,
@@ -1899,7 +1899,7 @@ const createTicketTools = (ctx) => {
1899
1899
  namespace: "tickets",
1900
1900
  readOnly: false,
1901
1901
  title: "Update Zendesk Ticket",
1902
- description: "Update an existing ticket (status, priority, type, assignee, group, subject, tags, custom fields).",
1902
+ description: "Update an existing ticket (status, priority, type, assignee, group, subject, tags, custom fields). Only the fields you pass are changed, and the updated ticket is returned. Setting tags here replaces the whole tag set — use manage_tags to add or remove individual tags without overwriting the rest. This tool does not post replies: use add_public_comment or add_private_note for that. Find the ticket id via search_tickets or list_tickets.",
1903
1903
  inputSchema: z.object({
1904
1904
  ticket_id: z.number().int().describe("Ticket ID"),
1905
1905
  status: z.enum([
@@ -1909,27 +1909,27 @@ const createTicketTools = (ctx) => {
1909
1909
  "hold",
1910
1910
  "solved",
1911
1911
  "closed"
1912
- ]).optional(),
1912
+ ]).optional().describe("New ticket status. One of new, open, pending, hold, solved, closed."),
1913
1913
  priority: z.enum([
1914
1914
  "urgent",
1915
1915
  "high",
1916
1916
  "normal",
1917
1917
  "low"
1918
- ]).optional(),
1918
+ ]).optional().describe("Ticket priority. One of urgent, high, normal, low."),
1919
1919
  type: z.enum([
1920
1920
  "problem",
1921
1921
  "incident",
1922
1922
  "question",
1923
1923
  "task"
1924
- ]).optional(),
1925
- assignee_id: z.number().int().optional(),
1926
- group_id: z.number().int().optional(),
1927
- subject: z.string().optional(),
1928
- tags: z.array(z.string()).optional(),
1924
+ ]).optional().describe("Ticket type. One of problem, incident, question, task."),
1925
+ assignee_id: z.number().int().optional().describe("User id of the agent to assign the ticket to."),
1926
+ group_id: z.number().int().optional().describe("Id of the group to assign the ticket to."),
1927
+ subject: z.string().optional().describe("New ticket subject line."),
1928
+ tags: z.array(z.string()).optional().describe("Replaces the full tag set on the ticket. Use manage_tags for incremental add/remove."),
1929
1929
  custom_fields: z.array(z.object({
1930
1930
  id: z.number().int(),
1931
1931
  value: z.unknown()
1932
- })).optional()
1932
+ })).optional().describe("Custom field values as { id, value } pairs (field ids come from your Zendesk admin settings).")
1933
1933
  }),
1934
1934
  annotations: {
1935
1935
  readOnlyHint: false,
@@ -2190,10 +2190,10 @@ const createUserTools = (ctx) => {
2190
2190
  namespace: "users",
2191
2191
  readOnly: true,
2192
2192
  title: "List Zendesk Organizations",
2193
- description: "List all organizations with pagination.",
2193
+ description: "List all organizations with pagination. Returns the name and id of each organization plus basic fields; results are cursor-paginated. Use get_organization with an id for full details (tags, domains, notes), or search for query-based lookups by name. Organizations group end users and can be referenced when creating or filtering tickets.",
2194
2194
  inputSchema: z.object({
2195
- page_size: z.number().int().min(1).max(100).default(100),
2196
- cursor: z.string().optional()
2195
+ page_size: z.number().int().min(1).max(100).default(100).describe("Organizations per page (1-100, default 100)."),
2196
+ cursor: z.string().optional().describe("Pagination cursor from a previous response; omit for the first page.")
2197
2197
  }),
2198
2198
  annotations: {
2199
2199
  readOnlyHint: true,