@helmdesk/mcp 0.5.0 → 0.6.0

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/README.md CHANGED
@@ -68,8 +68,14 @@ HELMDESK_API_KEY=sk_live_xxx npx @helmdesk/mcp
68
68
  | `write_log` | Ship log events to the project (sandbox events are quota-exempt) |
69
69
  | `query_logs` | Query raw application log events (filter by level, search, fingerprint) |
70
70
  | `list_log_issues` | List grouped error issues — "did anything break?" |
71
+ | `list_feedback_conversations` | List feedback conversations (filter by status, rating, source, customer, search, date range) |
72
+ | `get_feedback_conversation` | Get a feedback conversation with its full message thread |
73
+ | `reply_to_feedback` | Post a staff reply to a feedback conversation (emailed to the customer) |
74
+ | `close_feedback_conversation` | Close a handled conversation (or reopen it via `status: "open"`) |
75
+ | `list_feedback_requests` | List outgoing feedback requests with funnel status (sent/opened/responded) |
76
+ | `request_feedback` | Create a feedback request and email the customer a branded respond link |
71
77
 
72
- 15 tools in total — `tickets:write` is required for ticket mutations and `add_ticket_tag`/`remove_ticket_tag`, `emails:send` for `send_email`/`send_email_batch` (batch also needs the Pro plan or higher), `articles:write` for `create_article`, `logs:read` for `query_logs`/`list_log_issues`. A key with empty scopes has full access.
78
+ 31 tools in total — `tickets:write` is required for ticket mutations and `add_ticket_tag`/`remove_ticket_tag`, `emails:send` for `send_email`/`send_email_batch` (batch also needs the Pro plan or higher), `articles:write` for `create_article`, `logs:read` for `query_logs`/`list_log_issues`, `feedback:read` for the feedback list/get tools and `feedback:write` for `reply_to_feedback`/`close_feedback_conversation`/`request_feedback`. A key with empty scopes has full access.
73
79
 
74
80
  ## Available Resources
75
81
 
@@ -91,6 +97,8 @@ Once connected, you can ask your AI agent:
91
97
  - "Check my pending tickets and draft replies for any waiting more than 24 hours"
92
98
  - "List unassigned billing tickets, tag the urgent ones `needs-engineering`, and assign them to me"
93
99
  - "We keep getting the same SSO question — write a published KB article answering it, then reply to ticket #88 linking it"
100
+ - "Show me open feedback conversations rated 3 or below and draft replies"
101
+ - "Send a feedback request to jane@example.com asking how onboarding went"
94
102
 
95
103
  ## Testing
96
104
 
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAWnE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,CA0B9E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAYnE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,CA2B9E"}
package/dist/server.js CHANGED
@@ -4,6 +4,7 @@ import { registerTicketTools } from './tools/tickets.js';
4
4
  import { registerEmailTools } from './tools/emails.js';
5
5
  import { registerArticleTools } from './tools/articles.js';
6
6
  import { registerLogTools } from './tools/logs.js';
7
+ import { registerFeedbackTools } from './tools/feedback.js';
7
8
  import { registerTeamTools } from './tools/team.js';
8
9
  import { registerWebhookTools } from './tools/webhooks.js';
9
10
  import { registerTicketResources } from './resources/tickets.js';
@@ -23,6 +24,7 @@ export function createHelmdeskMcpServer(options) {
23
24
  registerEmailTools(server, getClient);
24
25
  registerArticleTools(server, getClient);
25
26
  registerLogTools(server, getClient);
27
+ registerFeedbackTools(server, getClient);
26
28
  registerTeamTools(server, getClient);
27
29
  registerWebhookTools(server, getClient);
28
30
  // Register all resources
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAOlE,MAAM,UAAU,uBAAuB,CAAC,OAA2B;IACjE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,MAAM,CAAA;IAE9B,qBAAqB;IACrB,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACtC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACrC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACnC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACpC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAEvC,yBAAyB;IACzB,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1C,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAE3C,OAAO,MAAM,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAOlE,MAAM,UAAU,uBAAuB,CAAC,OAA2B;IACjE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,MAAM,CAAA;IAE9B,qBAAqB;IACrB,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACtC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACrC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACvC,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACnC,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACxC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACpC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAEvC,yBAAyB;IACzB,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAC1C,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IAE3C,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { HelmdeskClient } from '@helmdesk/sdk';
3
+ export declare function registerFeedbackTools(server: McpServer, getClient: () => HelmdeskClient): void;
4
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/tools/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAOnD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,QAuKvF"}
@@ -0,0 +1,131 @@
1
+ import { z } from 'zod';
2
+ // The SDK does not expose a feedback resource yet, so these tools call the
3
+ // v1 feedback endpoints through the client's public `request()` method — the
4
+ // same primitive every SDK resource class is built on. Swap to
5
+ // `client.feedback.*` once the SDK grows a feedback resource.
6
+ export function registerFeedbackTools(server, getClient) {
7
+ server.tool('list_feedback_conversations', 'List feedback conversations (customer feedback threads) with optional filters, newest first (requires the feedback:read scope). Each conversation has a title, status (open/closed), optional 1-5 rating, source (request/api/widget/dashboard), and customer info. Use customerEmail to see everything one customer said, or search to match title/customer text.', {
8
+ status: z.enum(['open', 'closed']).optional().describe('Filter by conversation status'),
9
+ rating: z.number().int().min(1).max(5).optional().describe('Filter by exact customer rating (1-5)'),
10
+ source: z.enum(['request', 'api', 'widget', 'dashboard']).optional()
11
+ .describe('Filter by how the conversation started (e.g. "request" = replies to a feedback request email)'),
12
+ customerEmail: z.string().optional().describe('Filter by the customer\'s email address'),
13
+ search: z.string().optional().describe('Substring match on title or customer email/name'),
14
+ dateFrom: z.string().optional().describe('ISO date lower bound, e.g. "2026-07-01"'),
15
+ dateTo: z.string().optional().describe('ISO date upper bound (inclusive day)'),
16
+ page: z.number().optional().describe('Page number (default: 1)'),
17
+ limit: z.number().optional().describe('Results per page (default: 25, max: 100)'),
18
+ }, async (params) => {
19
+ const client = getClient();
20
+ const result = await client.request('GET', '/feedback/conversations', {
21
+ params: {
22
+ status: params.status,
23
+ rating: params.rating !== undefined ? String(params.rating) : undefined,
24
+ source: params.source,
25
+ customerEmail: params.customerEmail,
26
+ search: params.search,
27
+ dateFrom: params.dateFrom,
28
+ dateTo: params.dateTo,
29
+ page: params.page !== undefined ? String(params.page) : undefined,
30
+ limit: params.limit !== undefined ? String(params.limit) : undefined,
31
+ },
32
+ });
33
+ return {
34
+ content: [{
35
+ type: 'text',
36
+ text: JSON.stringify(result, null, 2),
37
+ }],
38
+ };
39
+ });
40
+ server.tool('get_feedback_conversation', 'Get a feedback conversation\'s full detail including the complete message thread (customer + staff messages, with any attachments), rating, and status (requires the feedback:read scope). Use this to read the whole exchange before replying with reply_to_feedback.', {
41
+ conversationId: z.string().describe('The feedback conversation ID (UUID)'),
42
+ }, async ({ conversationId }) => {
43
+ const client = getClient();
44
+ const result = await client.request('GET', `/feedback/conversations/${conversationId}`);
45
+ return {
46
+ content: [{
47
+ type: 'text',
48
+ text: JSON.stringify(result, null, 2),
49
+ }],
50
+ };
51
+ });
52
+ server.tool('reply_to_feedback', 'Post a staff reply to a feedback conversation (requires the feedback:write scope). The reply is recorded on the thread and the customer is emailed the message with a link back to the conversation — so only send text you intend the customer to read.', {
53
+ conversationId: z.string().describe('The feedback conversation ID to reply to'),
54
+ body: z.string().describe('Reply message body (plain text, max 10000 characters)'),
55
+ }, async ({ conversationId, body }) => {
56
+ const client = getClient();
57
+ const result = await client.request('POST', `/feedback/conversations/${conversationId}/messages`, { body: { body } });
58
+ return {
59
+ content: [{
60
+ type: 'text',
61
+ text: JSON.stringify(result, null, 2),
62
+ }],
63
+ };
64
+ });
65
+ server.tool('close_feedback_conversation', 'Close a feedback conversation once it has been handled (requires the feedback:write scope). Pass status "open" instead to reopen a previously closed conversation. Closing does not notify the customer.', {
66
+ conversationId: z.string().describe('The feedback conversation ID'),
67
+ status: z.enum(['open', 'closed']).optional()
68
+ .describe('Target status (default: "closed"; pass "open" to reopen)'),
69
+ }, async ({ conversationId, status }) => {
70
+ const client = getClient();
71
+ const result = await client.request('PATCH', `/feedback/conversations/${conversationId}`, { body: { status: status ?? 'closed' } });
72
+ return {
73
+ content: [{
74
+ type: 'text',
75
+ text: JSON.stringify(result, null, 2),
76
+ }],
77
+ };
78
+ });
79
+ server.tool('list_feedback_requests', 'List outgoing feedback requests ("tickles") with their funnel status, newest first (requires the feedback:read scope). Status tracks the funnel: "sent" (emailed), "opened" (customer opened the respond page), "responded" (customer answered — a feedback conversation now exists). Use this to see who has not responded yet before nudging again.', {
80
+ status: z.enum(['sent', 'opened', 'responded']).optional()
81
+ .describe('Filter by funnel status'),
82
+ customerEmail: z.string().optional().describe('Filter by the customer\'s email address'),
83
+ search: z.string().optional().describe('Substring match on title or customer email/name'),
84
+ dateFrom: z.string().optional().describe('ISO date lower bound, e.g. "2026-07-01"'),
85
+ dateTo: z.string().optional().describe('ISO date upper bound (inclusive day)'),
86
+ page: z.number().optional().describe('Page number (default: 1)'),
87
+ limit: z.number().optional().describe('Results per page (default: 25, max: 100)'),
88
+ }, async (params) => {
89
+ const client = getClient();
90
+ const result = await client.request('GET', '/feedback/requests', {
91
+ params: {
92
+ status: params.status,
93
+ customerEmail: params.customerEmail,
94
+ search: params.search,
95
+ dateFrom: params.dateFrom,
96
+ dateTo: params.dateTo,
97
+ page: params.page !== undefined ? String(params.page) : undefined,
98
+ limit: params.limit !== undefined ? String(params.limit) : undefined,
99
+ },
100
+ });
101
+ return {
102
+ content: [{
103
+ type: 'text',
104
+ text: JSON.stringify(result, null, 2),
105
+ }],
106
+ };
107
+ });
108
+ server.tool('request_feedback', 'Ask a customer for feedback (requires the feedback:write scope). This creates a feedback request AND immediately emails the customer a branded message with your prompt and a respond link — when they answer, a feedback conversation is created and the request\'s status becomes "responded". With a sandbox key the email is captured, not delivered.', {
109
+ title: z.string().describe('Short internal title for the request, e.g. "Post-onboarding check-in" (max 300 characters)'),
110
+ message: z.string().describe('The message/question the customer receives in the email (max 10000 characters)'),
111
+ customerEmail: z.string().email().describe('Customer email address to send the request to'),
112
+ customerName: z.string().optional().describe('Customer display name (used in the email greeting)'),
113
+ }, async (params) => {
114
+ const client = getClient();
115
+ const result = await client.request('POST', '/feedback/requests', {
116
+ body: {
117
+ title: params.title,
118
+ message: params.message,
119
+ customerEmail: params.customerEmail,
120
+ customerName: params.customerName,
121
+ },
122
+ });
123
+ return {
124
+ content: [{
125
+ type: 'text',
126
+ text: JSON.stringify(result, null, 2),
127
+ }],
128
+ };
129
+ });
130
+ }
131
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/tools/feedback.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helmdesk/mcp",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "MCP server for Helmdesk — let AI agents manage tickets, send emails, and search your knowledge base",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "dependencies": {
23
23
  "@modelcontextprotocol/sdk": "^1.12.1",
24
24
  "zod": "^3.25.23",
25
- "@helmdesk/sdk": "0.7.0"
25
+ "@helmdesk/sdk": "0.8.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/node": "^20",