@helmdesk/mcp 0.1.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 +90 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/articles.d.ts +4 -0
- package/dist/resources/articles.d.ts.map +1 -0
- package/dist/resources/articles.js +17 -0
- package/dist/resources/articles.js.map +1 -0
- package/dist/resources/tickets.d.ts +4 -0
- package/dist/resources/tickets.d.ts.map +1 -0
- package/dist/resources/tickets.js +39 -0
- package/dist/resources/tickets.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +27 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/articles.d.ts +4 -0
- package/dist/tools/articles.d.ts.map +1 -0
- package/dist/tools/articles.js +24 -0
- package/dist/tools/articles.js.map +1 -0
- package/dist/tools/emails.d.ts +4 -0
- package/dist/tools/emails.d.ts.map +1 -0
- package/dist/tools/emails.js +50 -0
- package/dist/tools/emails.js.map +1 -0
- package/dist/tools/tickets.d.ts +4 -0
- package/dist/tools/tickets.d.ts.map +1 -0
- package/dist/tools/tickets.js +91 -0
- package/dist/tools/tickets.js.map +1 -0
- package/package.json +60 -0
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# @helmdesk/mcp
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for [Helmdesk](https://helmdesk.dev) — let AI agents manage support tickets, send emails, and search your knowledge base.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
### Claude Desktop
|
|
8
|
+
|
|
9
|
+
Add to your `claude_desktop_config.json`:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"mcpServers": {
|
|
14
|
+
"helmdesk": {
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "@helmdesk/mcp"],
|
|
17
|
+
"env": {
|
|
18
|
+
"HELMDESK_API_KEY": "sk_live_your_api_key_here"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### Claude Code
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
claude mcp add helmdesk -- npx -y @helmdesk/mcp
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Then set the environment variable:
|
|
32
|
+
```bash
|
|
33
|
+
export HELMDESK_API_KEY=sk_live_your_api_key_here
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Direct Usage
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
HELMDESK_API_KEY=sk_live_xxx npx @helmdesk/mcp
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Available Tools
|
|
43
|
+
|
|
44
|
+
| Tool | Description |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `list_tickets` | List tickets with filters (status, priority, search, pagination) |
|
|
47
|
+
| `get_ticket` | Get full ticket details with message thread |
|
|
48
|
+
| `create_ticket` | Create a new support ticket |
|
|
49
|
+
| `update_ticket` | Update ticket status, priority, or category |
|
|
50
|
+
| `reply_to_ticket` | Send a staff reply to a ticket |
|
|
51
|
+
| `send_email` | Send a transactional email using a template |
|
|
52
|
+
| `preview_email` | Preview a rendered email template |
|
|
53
|
+
| `get_template_schema` | Get the variable schema for an email template |
|
|
54
|
+
| `search_articles` | Search the knowledge base |
|
|
55
|
+
|
|
56
|
+
## Available Resources
|
|
57
|
+
|
|
58
|
+
| Resource | URI | Description |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| Open tickets | `helmdesk://tickets/open` | All tickets with status new or open |
|
|
61
|
+
| Pending tickets | `helmdesk://tickets/pending` | Tickets waiting for staff response |
|
|
62
|
+
| Knowledge base | `helmdesk://articles` | All published articles |
|
|
63
|
+
|
|
64
|
+
## Example Prompts
|
|
65
|
+
|
|
66
|
+
Once connected, you can ask your AI agent:
|
|
67
|
+
|
|
68
|
+
- "Show me all open tickets"
|
|
69
|
+
- "Read ticket #42 and draft a reply"
|
|
70
|
+
- "Search the knowledge base for articles about file uploads"
|
|
71
|
+
- "Create a ticket for user@example.com about a billing issue"
|
|
72
|
+
- "Resolve ticket abc-123 and send a follow-up email"
|
|
73
|
+
- "Check my pending tickets and draft replies for any waiting more than 24 hours"
|
|
74
|
+
|
|
75
|
+
## Configuration
|
|
76
|
+
|
|
77
|
+
| Environment Variable | Required | Description |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| `HELMDESK_API_KEY` | Yes | Your Helmdesk API key (starts with `sk_live_`) |
|
|
80
|
+
| `HELMDESK_BASE_URL` | No | Custom API base URL (default: `https://helmdesk.dev`) |
|
|
81
|
+
|
|
82
|
+
## Getting an API Key
|
|
83
|
+
|
|
84
|
+
1. Sign in at [helmdesk.dev](https://helmdesk.dev)
|
|
85
|
+
2. Go to your project → **API Keys**
|
|
86
|
+
3. Click **Create API Key** and copy the key
|
|
87
|
+
|
|
88
|
+
## License
|
|
89
|
+
|
|
90
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { createHelmdeskMcpServer } from './server.js';
|
|
4
|
+
// Re-export for programmatic use
|
|
5
|
+
export { createHelmdeskMcpServer } from './server.js';
|
|
6
|
+
async function main() {
|
|
7
|
+
const apiKey = process.env.HELMDESK_API_KEY;
|
|
8
|
+
if (!apiKey) {
|
|
9
|
+
console.error('Error: HELMDESK_API_KEY environment variable is required.');
|
|
10
|
+
console.error('');
|
|
11
|
+
console.error('Usage:');
|
|
12
|
+
console.error(' HELMDESK_API_KEY=sk_live_xxx npx @helmdesk/mcp');
|
|
13
|
+
console.error('');
|
|
14
|
+
console.error('Or in Claude Desktop config (claude_desktop_config.json):');
|
|
15
|
+
console.error(' {');
|
|
16
|
+
console.error(' "mcpServers": {');
|
|
17
|
+
console.error(' "helmdesk": {');
|
|
18
|
+
console.error(' "command": "npx",');
|
|
19
|
+
console.error(' "args": ["@helmdesk/mcp"],');
|
|
20
|
+
console.error(' "env": { "HELMDESK_API_KEY": "sk_live_xxx" }');
|
|
21
|
+
console.error(' }');
|
|
22
|
+
console.error(' }');
|
|
23
|
+
console.error(' }');
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const baseUrl = process.env.HELMDESK_BASE_URL;
|
|
27
|
+
const server = createHelmdeskMcpServer({ apiKey, baseUrl });
|
|
28
|
+
const transport = new StdioServerTransport();
|
|
29
|
+
await server.connect(transport);
|
|
30
|
+
}
|
|
31
|
+
main().catch((error) => {
|
|
32
|
+
console.error('Fatal error:', error);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAErD,iCAAiC;AACjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAGrD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAA;IAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAA;QAC1E,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACjB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACvB,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAA;QACjE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACjB,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAA;QAC1E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACpC,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QACpC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;QAC1C,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACnD,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACrE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACxB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACtB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;IAE7C,MAAM,MAAM,GAAG,uBAAuB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;IAC3D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { HelmdeskClient } from '@helmdesk/sdk';
|
|
3
|
+
export declare function registerArticleResources(server: McpServer, getClient: () => HelmdeskClient): void;
|
|
4
|
+
//# sourceMappingURL=articles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"articles.d.ts","sourceRoot":"","sources":["../../src/resources/articles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,QAoB1F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function registerArticleResources(server, getClient) {
|
|
2
|
+
server.resource('knowledge-base', 'helmdesk://articles', {
|
|
3
|
+
description: 'All published knowledge base articles',
|
|
4
|
+
mimeType: 'application/json',
|
|
5
|
+
}, async () => {
|
|
6
|
+
const client = getClient();
|
|
7
|
+
const result = await client.articles.search({ limit: 100 });
|
|
8
|
+
return {
|
|
9
|
+
contents: [{
|
|
10
|
+
uri: 'helmdesk://articles',
|
|
11
|
+
mimeType: 'application/json',
|
|
12
|
+
text: JSON.stringify(result, null, 2),
|
|
13
|
+
}],
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=articles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"articles.js","sourceRoot":"","sources":["../../src/resources/articles.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,SAA+B;IACzF,MAAM,CAAC,QAAQ,CACb,gBAAgB,EAChB,qBAAqB,EACrB;QACE,WAAW,EAAE,uCAAuC;QACpD,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QAC3D,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,qBAAqB;oBAC1B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.d.ts","sourceRoot":"","sources":["../../src/resources/tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,QAiDzF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export function registerTicketResources(server, getClient) {
|
|
2
|
+
// List of open tickets as a resource
|
|
3
|
+
server.resource('open-tickets', 'helmdesk://tickets/open', {
|
|
4
|
+
description: 'Currently open support tickets (status: new or open)',
|
|
5
|
+
mimeType: 'application/json',
|
|
6
|
+
}, async () => {
|
|
7
|
+
const client = getClient();
|
|
8
|
+
const newTickets = await client.tickets.list({ status: 'new', limit: 50 });
|
|
9
|
+
const openTickets = await client.tickets.list({ status: 'open', limit: 50 });
|
|
10
|
+
const allOpen = [...newTickets.tickets, ...openTickets.tickets]
|
|
11
|
+
.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
12
|
+
return {
|
|
13
|
+
contents: [{
|
|
14
|
+
uri: 'helmdesk://tickets/open',
|
|
15
|
+
mimeType: 'application/json',
|
|
16
|
+
text: JSON.stringify({
|
|
17
|
+
total: allOpen.length,
|
|
18
|
+
tickets: allOpen,
|
|
19
|
+
}, null, 2),
|
|
20
|
+
}],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
// List of pending tickets (waiting for staff response)
|
|
24
|
+
server.resource('pending-tickets', 'helmdesk://tickets/pending', {
|
|
25
|
+
description: 'Tickets waiting for staff response (status: pending)',
|
|
26
|
+
mimeType: 'application/json',
|
|
27
|
+
}, async () => {
|
|
28
|
+
const client = getClient();
|
|
29
|
+
const result = await client.tickets.list({ status: 'pending', limit: 50 });
|
|
30
|
+
return {
|
|
31
|
+
contents: [{
|
|
32
|
+
uri: 'helmdesk://tickets/pending',
|
|
33
|
+
mimeType: 'application/json',
|
|
34
|
+
text: JSON.stringify(result, null, 2),
|
|
35
|
+
}],
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=tickets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.js","sourceRoot":"","sources":["../../src/resources/tickets.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,SAA+B;IACxF,qCAAqC;IACrC,MAAM,CAAC,QAAQ,CACb,cAAc,EACd,yBAAyB,EACzB;QACE,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAC1E,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAC5E,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC;aAC5D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAEpF,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,yBAAyB;oBAC9B,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,KAAK,EAAE,OAAO,CAAC,MAAM;wBACrB,OAAO,EAAE,OAAO;qBACjB,EAAE,IAAI,EAAE,CAAC,CAAC;iBACZ,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;IAED,uDAAuD;IACvD,MAAM,CAAC,QAAQ,CACb,iBAAiB,EACjB,4BAA4B,EAC5B;QACE,WAAW,EAAE,sDAAsD;QACnE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAC1E,OAAO;YACL,QAAQ,EAAE,CAAC;oBACT,GAAG,EAAE,4BAA4B;oBACjC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
export interface HelmdeskMcpOptions {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function createHelmdeskMcpServer(options: HelmdeskMcpOptions): McpServer;
|
|
7
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAQnE,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,CAuB9E"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { HelmdeskClient } from '@helmdesk/sdk';
|
|
3
|
+
import { registerTicketTools } from './tools/tickets.js';
|
|
4
|
+
import { registerEmailTools } from './tools/emails.js';
|
|
5
|
+
import { registerArticleTools } from './tools/articles.js';
|
|
6
|
+
import { registerTicketResources } from './resources/tickets.js';
|
|
7
|
+
import { registerArticleResources } from './resources/articles.js';
|
|
8
|
+
export function createHelmdeskMcpServer(options) {
|
|
9
|
+
const server = new McpServer({
|
|
10
|
+
name: 'Helmdesk',
|
|
11
|
+
version: '0.1.0',
|
|
12
|
+
});
|
|
13
|
+
const client = new HelmdeskClient({
|
|
14
|
+
apiKey: options.apiKey,
|
|
15
|
+
baseUrl: options.baseUrl,
|
|
16
|
+
});
|
|
17
|
+
const getClient = () => client;
|
|
18
|
+
// Register all tools
|
|
19
|
+
registerTicketTools(server, getClient);
|
|
20
|
+
registerEmailTools(server, getClient);
|
|
21
|
+
registerArticleTools(server, getClient);
|
|
22
|
+
// Register all resources
|
|
23
|
+
registerTicketResources(server, getClient);
|
|
24
|
+
registerArticleResources(server, getClient);
|
|
25
|
+
return server;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +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,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;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 @@
|
|
|
1
|
+
{"version":3,"file":"articles.d.ts","sourceRoot":"","sources":["../../src/tools/articles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,QA0BtF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerArticleTools(server, getClient) {
|
|
3
|
+
server.tool('search_articles', 'Search the knowledge base for articles matching a query. Use this to find relevant help articles when drafting ticket replies.', {
|
|
4
|
+
query: z.string().optional().describe('Search query (searches title, body, and excerpt)'),
|
|
5
|
+
category: z.string().optional().describe('Filter by category name'),
|
|
6
|
+
page: z.number().optional().describe('Page number (default: 1)'),
|
|
7
|
+
limit: z.number().optional().describe('Results per page (default: 10)'),
|
|
8
|
+
}, async ({ query, category, page, limit }) => {
|
|
9
|
+
const client = getClient();
|
|
10
|
+
const result = await client.articles.search({
|
|
11
|
+
q: query,
|
|
12
|
+
category,
|
|
13
|
+
page,
|
|
14
|
+
limit,
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
content: [{
|
|
18
|
+
type: 'text',
|
|
19
|
+
text: JSON.stringify(result, null, 2),
|
|
20
|
+
}],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=articles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"articles.js","sourceRoot":"","sources":["../../src/tools/articles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAA+B;IACrF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,gIAAgI,EAChI;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QACzF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACnE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAChE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KACxE,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1C,CAAC,EAAE,KAAK;YACR,QAAQ;YACR,IAAI;YACJ,KAAK;SACN,CAAC,CAAA;QACF,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails.d.ts","sourceRoot":"","sources":["../../src/tools/emails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,QAgEpF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerEmailTools(server, getClient) {
|
|
3
|
+
server.tool('send_email', 'Send a transactional email using a template. The template must exist in the project. Use preview_email first to verify the output.', {
|
|
4
|
+
templateKey: z.string().describe('Template key (e.g. "welcome", "password-reset"). Use @account/ prefix for shared templates.'),
|
|
5
|
+
to_email: z.string().email().describe('Recipient email address'),
|
|
6
|
+
to_name: z.string().optional().describe('Recipient display name'),
|
|
7
|
+
variables: z.record(z.unknown()).optional()
|
|
8
|
+
.describe('Template variables as key-value pairs (e.g. { "name": "Jane", "resetUrl": "https://..." })'),
|
|
9
|
+
}, async ({ templateKey, to_email, to_name, variables }) => {
|
|
10
|
+
const client = getClient();
|
|
11
|
+
const result = await client.emails.send({
|
|
12
|
+
templateKey,
|
|
13
|
+
to: { email: to_email, name: to_name },
|
|
14
|
+
variables,
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
content: [{
|
|
18
|
+
type: 'text',
|
|
19
|
+
text: JSON.stringify(result, null, 2),
|
|
20
|
+
}],
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
server.tool('preview_email', 'Preview a rendered email template without sending. Returns the rendered subject and HTML body. Useful for verifying template output before sending.', {
|
|
24
|
+
templateKey: z.string().describe('Template key to preview'),
|
|
25
|
+
variables: z.record(z.unknown()).optional()
|
|
26
|
+
.describe('Template variables to render with'),
|
|
27
|
+
}, async ({ templateKey, variables }) => {
|
|
28
|
+
const client = getClient();
|
|
29
|
+
const result = await client.emails.preview({ templateKey, variables });
|
|
30
|
+
return {
|
|
31
|
+
content: [{
|
|
32
|
+
type: 'text',
|
|
33
|
+
text: `Subject: ${result.subject}\n\n${result.html}`,
|
|
34
|
+
}],
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
server.tool('get_template_schema', 'Get the variable schema for an email template. Returns the list of variables, their types, and whether they are required.', {
|
|
38
|
+
templateKey: z.string().describe('Template key to get schema for'),
|
|
39
|
+
}, async ({ templateKey }) => {
|
|
40
|
+
const client = getClient();
|
|
41
|
+
const schema = await client.emails.getTemplateSchema(templateKey);
|
|
42
|
+
return {
|
|
43
|
+
content: [{
|
|
44
|
+
type: 'text',
|
|
45
|
+
text: JSON.stringify(schema, null, 2),
|
|
46
|
+
}],
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=emails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails.js","sourceRoot":"","sources":["../../src/tools/emails.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAA+B;IACnF,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,oIAAoI,EACpI;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6FAA6F,CAAC;QAC/H,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAChE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACjE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;aACxC,QAAQ,CAAC,4FAA4F,CAAC;KAC1G,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACtC,WAAW;YACX,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;YACtC,SAAS;SACV,CAAC,CAAA;QACF,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,eAAe,EACf,qJAAqJ,EACrJ;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAC3D,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;aACxC,QAAQ,CAAC,mCAAmC,CAAC;KACjD,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE;QACnC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAA;QACtE,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,YAAY,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,IAAI,EAAE;iBACrD,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,2HAA2H,EAC3H;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;KACnE,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;QACjE,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.d.ts","sourceRoot":"","sources":["../../src/tools/tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,QAqHrF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export function registerTicketTools(server, getClient) {
|
|
3
|
+
server.tool('list_tickets', 'List support tickets with optional filters. Returns ticket ID, number, subject, status, priority, customer email, and timestamps.', {
|
|
4
|
+
status: z.enum(['new', 'open', 'pending', 'resolved', 'closed']).optional()
|
|
5
|
+
.describe('Filter by ticket status'),
|
|
6
|
+
priority: z.enum(['low', 'medium', 'high', 'urgent']).optional()
|
|
7
|
+
.describe('Filter by priority level'),
|
|
8
|
+
search: z.string().optional()
|
|
9
|
+
.describe('Search tickets by subject or customer email'),
|
|
10
|
+
page: z.number().optional().describe('Page number (default: 1)'),
|
|
11
|
+
limit: z.number().optional().describe('Results per page (default: 20, max: 100)'),
|
|
12
|
+
}, async (params) => {
|
|
13
|
+
const client = getClient();
|
|
14
|
+
const result = await client.tickets.list({
|
|
15
|
+
status: params.status,
|
|
16
|
+
priority: params.priority,
|
|
17
|
+
search: params.search,
|
|
18
|
+
page: params.page,
|
|
19
|
+
limit: params.limit,
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
content: [{
|
|
23
|
+
type: 'text',
|
|
24
|
+
text: JSON.stringify(result, null, 2),
|
|
25
|
+
}],
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
server.tool('get_ticket', 'Get full ticket details including the complete message thread, tags, and customer info. Use this to read a specific ticket before replying.', {
|
|
29
|
+
ticketId: z.string().describe('The ticket ID (UUID)'),
|
|
30
|
+
}, async ({ ticketId }) => {
|
|
31
|
+
const client = getClient();
|
|
32
|
+
const ticket = await client.tickets.get(ticketId);
|
|
33
|
+
return {
|
|
34
|
+
content: [{
|
|
35
|
+
type: 'text',
|
|
36
|
+
text: JSON.stringify(ticket, null, 2),
|
|
37
|
+
}],
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
server.tool('create_ticket', 'Create a new support ticket on behalf of a customer. Requires subject, body, and customer email.', {
|
|
41
|
+
subject: z.string().describe('Ticket subject line'),
|
|
42
|
+
body: z.string().describe('Ticket body / initial message'),
|
|
43
|
+
customerEmail: z.string().email().describe('Customer email address'),
|
|
44
|
+
customerName: z.string().optional().describe('Customer display name'),
|
|
45
|
+
priority: z.enum(['low', 'medium', 'high', 'urgent']).optional()
|
|
46
|
+
.describe('Priority level (default: medium)'),
|
|
47
|
+
category: z.enum(['bug', 'feature_request', 'billing', 'howto', 'other']).optional()
|
|
48
|
+
.describe('Ticket category'),
|
|
49
|
+
}, async (params) => {
|
|
50
|
+
const client = getClient();
|
|
51
|
+
const ticket = await client.tickets.create(params);
|
|
52
|
+
return {
|
|
53
|
+
content: [{
|
|
54
|
+
type: 'text',
|
|
55
|
+
text: JSON.stringify(ticket, null, 2),
|
|
56
|
+
}],
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
server.tool('update_ticket', 'Update a ticket\'s status, priority, or category. Use this to resolve, close, or re-prioritize tickets.', {
|
|
60
|
+
ticketId: z.string().describe('The ticket ID to update'),
|
|
61
|
+
status: z.enum(['new', 'open', 'pending', 'resolved', 'closed']).optional()
|
|
62
|
+
.describe('New status'),
|
|
63
|
+
priority: z.enum(['low', 'medium', 'high', 'urgent']).optional()
|
|
64
|
+
.describe('New priority'),
|
|
65
|
+
category: z.enum(['bug', 'feature_request', 'billing', 'howto', 'other']).optional()
|
|
66
|
+
.describe('New category'),
|
|
67
|
+
}, async ({ ticketId, ...updates }) => {
|
|
68
|
+
const client = getClient();
|
|
69
|
+
const ticket = await client.tickets.update(ticketId, updates);
|
|
70
|
+
return {
|
|
71
|
+
content: [{
|
|
72
|
+
type: 'text',
|
|
73
|
+
text: JSON.stringify(ticket, null, 2),
|
|
74
|
+
}],
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
server.tool('reply_to_ticket', 'Add a staff reply to a ticket. This sends the reply to the customer and updates the ticket status.', {
|
|
78
|
+
ticketId: z.string().describe('The ticket ID to reply to'),
|
|
79
|
+
body: z.string().describe('Reply message body'),
|
|
80
|
+
}, async ({ ticketId, body }) => {
|
|
81
|
+
const client = getClient();
|
|
82
|
+
const message = await client.tickets.addMessage(ticketId, { body });
|
|
83
|
+
return {
|
|
84
|
+
content: [{
|
|
85
|
+
type: 'text',
|
|
86
|
+
text: JSON.stringify(message, null, 2),
|
|
87
|
+
}],
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=tickets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.js","sourceRoot":"","sources":["../../src/tools/tickets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,SAA+B;IACpF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,mIAAmI,EACnI;QACE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;aACxE,QAAQ,CAAC,yBAAyB,CAAC;QACtC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC7D,QAAQ,CAAC,0BAA0B,CAAC;QACvC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC1B,QAAQ,CAAC,6CAA6C,CAAC;QAC1D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAChE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KAClF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YACvC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAA;QACF,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,6IAA6I,EAC7I;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;KACtD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACjD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,eAAe,EACf,kGAAkG,EAClG;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACnD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC1D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACpE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACrE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC7D,QAAQ,CAAC,kCAAkC,CAAC;QAC/C,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;aACjF,QAAQ,CAAC,iBAAiB,CAAC;KAC/B,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAClD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,eAAe,EACf,yGAAyG,EACzG;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACxD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;aACxE,QAAQ,CAAC,YAAY,CAAC;QACzB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC7D,QAAQ,CAAC,cAAc,CAAC;QAC3B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;aACjF,QAAQ,CAAC,cAAc,CAAC;KAC5B,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC7D,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oGAAoG,EACpG;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC1D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;KAChD,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACnE,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC,CAAC;SACH,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@helmdesk/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for Helmdesk — let AI agents manage tickets, send emails, and search your knowledge base",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"helmdesk-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -p tsconfig.build.json",
|
|
23
|
+
"prepublishOnly": "pnpm run build",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"dev": "tsx src/index.ts"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@helmdesk/sdk": "workspace:*",
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
30
|
+
"zod": "^3.25.23"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^20",
|
|
34
|
+
"tsx": "^4.19.0",
|
|
35
|
+
"typescript": "^5.8.3"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"helmdesk",
|
|
39
|
+
"mcp",
|
|
40
|
+
"model-context-protocol",
|
|
41
|
+
"ai",
|
|
42
|
+
"helpdesk",
|
|
43
|
+
"claude",
|
|
44
|
+
"llm",
|
|
45
|
+
"agent"
|
|
46
|
+
],
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/MoloksInc/helmdesk",
|
|
51
|
+
"directory": "packages/mcp"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://helmdesk.dev/docs",
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=18"
|
|
56
|
+
},
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
}
|
|
60
|
+
}
|