@customer-support-success/pylon-mcp-server 1.5.2
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/.env.example +5 -0
- package/.eslintrc.cjs +29 -0
- package/.prettierrc.json +6 -0
- package/CHANGELOG.md +137 -0
- package/CLAUDE.md +187 -0
- package/GCP_SETUP.md +174 -0
- package/LICENSE +21 -0
- package/README.md +331 -0
- package/SECURITY_AUDIT_REPORT.md +270 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-final.json +2 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +116 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/pylon-client.ts.html +1093 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +463 -0
- package/dist/index.js.map +1 -0
- package/dist/pylon-client.d.ts +126 -0
- package/dist/pylon-client.d.ts.map +1 -0
- package/dist/pylon-client.js +177 -0
- package/dist/pylon-client.js.map +1 -0
- package/package.json +60 -0
- package/smithery.yaml +17 -0
- package/vitest.config.ts +13 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { PylonClient } from './pylon-client.js';
|
|
6
|
+
// Environment variable to control whether elicitation is required for customer-facing messages
|
|
7
|
+
const REQUIRE_MESSAGE_CONFIRMATION = process.env.PYLON_REQUIRE_MESSAGE_CONFIRMATION !== 'false';
|
|
8
|
+
const PYLON_API_TOKEN = process.env.PYLON_API_TOKEN;
|
|
9
|
+
// Initialize client only when token is available
|
|
10
|
+
let pylonClient = null;
|
|
11
|
+
if (PYLON_API_TOKEN) {
|
|
12
|
+
pylonClient = new PylonClient({
|
|
13
|
+
apiToken: PYLON_API_TOKEN,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
// Create the McpServer instance (high-level API, replaces deprecated Server class)
|
|
17
|
+
const mcpServer = new McpServer({
|
|
18
|
+
name: 'pylon-mcp-server',
|
|
19
|
+
version: '1.4.0',
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Helper function to request user confirmation before sending customer-facing messages.
|
|
23
|
+
* Uses MCP elicitation to prompt the user to review and confirm the message content.
|
|
24
|
+
*
|
|
25
|
+
* @param issueId - The ID of the issue the message will be sent to
|
|
26
|
+
* @param content - The message content to be confirmed
|
|
27
|
+
* @returns Object with confirmed: boolean and optionally the confirmed/modified content
|
|
28
|
+
*/
|
|
29
|
+
async function requestMessageConfirmation(issueId, content) {
|
|
30
|
+
try {
|
|
31
|
+
const elicitParams = {
|
|
32
|
+
mode: 'form',
|
|
33
|
+
message: `⚠️ CUSTOMER-FACING MESSAGE CONFIRMATION\n\nYou are about to send the following message to a customer on issue ${issueId}:\n\n---\n${content}\n---\n\nPlease review and confirm you want to send this message.`,
|
|
34
|
+
requestedSchema: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
confirm_send: {
|
|
38
|
+
type: 'boolean',
|
|
39
|
+
title: 'Confirm Send',
|
|
40
|
+
description: 'Check this box to confirm you want to send this message to the customer',
|
|
41
|
+
default: false,
|
|
42
|
+
},
|
|
43
|
+
modified_content: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
title: 'Message Content (optional edit)',
|
|
46
|
+
description: 'You can modify the message content here before sending. Leave empty to use the original message.',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
required: ['confirm_send'],
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
// Access elicitInput via the underlying Server instance
|
|
53
|
+
const result = await mcpServer.server.elicitInput(elicitParams);
|
|
54
|
+
if (result.action === 'accept' && result.content) {
|
|
55
|
+
const confirmSend = result.content.confirm_send;
|
|
56
|
+
const modifiedContent = result.content.modified_content;
|
|
57
|
+
if (confirmSend) {
|
|
58
|
+
return {
|
|
59
|
+
confirmed: true,
|
|
60
|
+
content: modifiedContent && modifiedContent.trim() ? modifiedContent.trim() : content,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
return {
|
|
65
|
+
confirmed: false,
|
|
66
|
+
reason: 'User did not confirm the message send',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (result.action === 'decline') {
|
|
71
|
+
return {
|
|
72
|
+
confirmed: false,
|
|
73
|
+
reason: 'User explicitly declined to send the message',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
return {
|
|
78
|
+
confirmed: false,
|
|
79
|
+
reason: 'User cancelled the confirmation dialog',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
// If elicitation is not supported by the client, log a warning and proceed
|
|
85
|
+
// This maintains backwards compatibility with clients that don't support elicitation
|
|
86
|
+
console.error('Elicitation not available or failed:', error);
|
|
87
|
+
throw new Error('Message confirmation is required but the MCP client does not support elicitation. ' +
|
|
88
|
+
'Please use a client that supports MCP elicitation, or set PYLON_REQUIRE_MESSAGE_CONFIRMATION=false to disable this safety feature.');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Helper function to ensure pylonClient is initialized
|
|
92
|
+
function ensurePylonClient() {
|
|
93
|
+
if (!pylonClient) {
|
|
94
|
+
throw new Error('PYLON_API_TOKEN environment variable is required');
|
|
95
|
+
}
|
|
96
|
+
return pylonClient;
|
|
97
|
+
}
|
|
98
|
+
// Helper to create a JSON text response
|
|
99
|
+
function jsonResponse(data) {
|
|
100
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
101
|
+
}
|
|
102
|
+
// Register all tools using the McpServer.registerTool() pattern
|
|
103
|
+
// User Management Tools
|
|
104
|
+
mcpServer.registerTool('pylon_get_me', {
|
|
105
|
+
description: 'Get current user information from Pylon. Returns your user profile including name, email, role, and permissions. Use this to verify your authentication and see what access level you have.',
|
|
106
|
+
}, async () => jsonResponse(await ensurePylonClient().getMe()));
|
|
107
|
+
mcpServer.registerTool('pylon_get_users', {
|
|
108
|
+
description: 'Get all team members and support agents in your Pylon workspace. Returns user profiles including names, roles, teams, and availability status.',
|
|
109
|
+
}, async () => jsonResponse(await ensurePylonClient().getUsers()));
|
|
110
|
+
mcpServer.registerTool('pylon_search_users', {
|
|
111
|
+
description: 'Search for team members and support agents in Pylon. Use this to find colleagues by name, email, or department when assigning issues or checking availability.',
|
|
112
|
+
inputSchema: {
|
|
113
|
+
query: z
|
|
114
|
+
.string()
|
|
115
|
+
.describe('Search term to find users by name, email, or department. Examples: "john", "support@company.com", "technical team"'),
|
|
116
|
+
},
|
|
117
|
+
}, async ({ query }) => jsonResponse(await ensurePylonClient().searchUsers(query)));
|
|
118
|
+
// Contact Management Tools
|
|
119
|
+
mcpServer.registerTool('pylon_get_contacts', {
|
|
120
|
+
description: 'Get customer contacts from Pylon. Use this to find customers who have submitted support tickets or inquiries. Returns contact details like name, email, company, and contact history.',
|
|
121
|
+
inputSchema: {
|
|
122
|
+
search: z
|
|
123
|
+
.string()
|
|
124
|
+
.optional()
|
|
125
|
+
.describe('Search contacts by name, email, or company. Examples: "john@example.com", "Acme Corp", "John Smith"'),
|
|
126
|
+
limit: z
|
|
127
|
+
.number()
|
|
128
|
+
.optional()
|
|
129
|
+
.describe('Maximum number of contacts to return (1-100). Default is 20. Example: 50'),
|
|
130
|
+
},
|
|
131
|
+
}, async (args) => jsonResponse(await ensurePylonClient().getContacts(args)));
|
|
132
|
+
mcpServer.registerTool('pylon_create_contact', {
|
|
133
|
+
description: 'Create a new customer contact in Pylon. Use this when adding a new customer who will submit support requests or access your customer portal. Use this carefully.',
|
|
134
|
+
inputSchema: {
|
|
135
|
+
email: z
|
|
136
|
+
.string()
|
|
137
|
+
.describe('Contact email address. Must be valid email format. Example: "sarah@company.com"'),
|
|
138
|
+
name: z.string().describe('Full name of the contact. Example: "Sarah Johnson"'),
|
|
139
|
+
portal_role: z
|
|
140
|
+
.string()
|
|
141
|
+
.optional()
|
|
142
|
+
.describe('Role in customer portal: "admin", "member", "viewer". Determines access level. Example: "member"'),
|
|
143
|
+
},
|
|
144
|
+
}, async (args) => jsonResponse(await ensurePylonClient().createContact(args)));
|
|
145
|
+
mcpServer.registerTool('pylon_search_contacts', {
|
|
146
|
+
description: 'Search for customer contacts in Pylon by name, email, company, or other details. Use this to quickly find a specific customer when you need to view their information or create an issue for them.',
|
|
147
|
+
inputSchema: {
|
|
148
|
+
query: z
|
|
149
|
+
.string()
|
|
150
|
+
.describe('Search term to find contacts. Can search by name, email, company, or phone. Examples: "alice@example.com", "Acme Corporation", "John Smith", "+1-555-0123"'),
|
|
151
|
+
},
|
|
152
|
+
}, async ({ query }) => jsonResponse(await ensurePylonClient().searchContacts(query)));
|
|
153
|
+
// Issue Management Tools
|
|
154
|
+
mcpServer.registerTool('pylon_get_issues', {
|
|
155
|
+
description: 'Get support issues/tickets from Pylon. Returns a list of customer support requests with details like title, status, priority, and assigned team member. Use this to see your workload or find specific issues.',
|
|
156
|
+
inputSchema: {
|
|
157
|
+
assignee: z
|
|
158
|
+
.string()
|
|
159
|
+
.optional()
|
|
160
|
+
.describe('Filter by assigned team member. Use email or user ID. Examples: "john@support.com", "user_123"'),
|
|
161
|
+
status: z
|
|
162
|
+
.string()
|
|
163
|
+
.optional()
|
|
164
|
+
.describe('Filter by issue status. Options: "open", "in_progress", "pending", "resolved", "closed". Example: "open"'),
|
|
165
|
+
limit: z
|
|
166
|
+
.number()
|
|
167
|
+
.optional()
|
|
168
|
+
.describe('Maximum number of issues to return (1-100). Default is 50. Example: 25'),
|
|
169
|
+
},
|
|
170
|
+
}, async (args) => jsonResponse(await ensurePylonClient().getIssues(args)));
|
|
171
|
+
mcpServer.registerTool('pylon_create_issue', {
|
|
172
|
+
description: 'Create a new support issue/ticket in Pylon. Use this to log customer problems, bug reports, or feature requests that need to be tracked and resolved.',
|
|
173
|
+
inputSchema: {
|
|
174
|
+
title: z
|
|
175
|
+
.string()
|
|
176
|
+
.describe('Brief title describing the issue. Examples: "Login page not loading", "Cannot upload files", "Billing question"'),
|
|
177
|
+
description: z
|
|
178
|
+
.string()
|
|
179
|
+
.describe('Detailed description of the issue, including steps to reproduce and impact. Example: "User reports that clicking login button shows error message. Affects all Chrome users on Windows."'),
|
|
180
|
+
status: z
|
|
181
|
+
.string()
|
|
182
|
+
.describe('Initial status: "open", "in_progress", "pending", "resolved", "closed". Usually "open" for new issues. Example: "open"'),
|
|
183
|
+
priority: z
|
|
184
|
+
.string()
|
|
185
|
+
.describe('Priority level: "low", "medium", "high", "urgent". Example: "high"'),
|
|
186
|
+
assignee: z
|
|
187
|
+
.string()
|
|
188
|
+
.optional()
|
|
189
|
+
.describe('Team member to assign (optional). Use email or user ID. Example: "support@company.com"'),
|
|
190
|
+
},
|
|
191
|
+
}, async (args) => jsonResponse(await ensurePylonClient().createIssue(args)));
|
|
192
|
+
mcpServer.registerTool('pylon_get_issue', {
|
|
193
|
+
description: 'Get complete details of a specific support issue/ticket. If you are given a ticket/issue number, call this tool first (no need to use the more complex message/history tools). Returns title, description, status, priority, assignee, customer info, and basic conversation metadata.',
|
|
194
|
+
inputSchema: {
|
|
195
|
+
issue_id: z
|
|
196
|
+
.string()
|
|
197
|
+
.describe('ID (ticket/issue number) to retrieve. You can pass the user-provided ticket number directly; you do not need to call other tools first. Example: "36800"'),
|
|
198
|
+
},
|
|
199
|
+
}, async ({ issue_id }) => jsonResponse(await ensurePylonClient().getIssue(issue_id)));
|
|
200
|
+
mcpServer.registerTool('pylon_update_issue', {
|
|
201
|
+
description: 'Update an existing support issue/ticket. Use this to change status (e.g., mark as resolved), reassign to different team members, update priority, or modify details as you work on the issue.',
|
|
202
|
+
inputSchema: {
|
|
203
|
+
issue_id: z.string().describe('ID of the issue to update. Example: "issue_abc123"'),
|
|
204
|
+
title: z
|
|
205
|
+
.string()
|
|
206
|
+
.optional()
|
|
207
|
+
.describe('New title for the issue. Example: "RESOLVED: Login page not loading"'),
|
|
208
|
+
description: z
|
|
209
|
+
.string()
|
|
210
|
+
.optional()
|
|
211
|
+
.describe('Updated description with new information or resolution details. Example: "Fixed CSS conflict causing login button to not render properly."'),
|
|
212
|
+
status: z
|
|
213
|
+
.string()
|
|
214
|
+
.optional()
|
|
215
|
+
.describe('New status: "open", "in_progress", "pending", "resolved", "closed". Example: "resolved"'),
|
|
216
|
+
priority: z
|
|
217
|
+
.string()
|
|
218
|
+
.optional()
|
|
219
|
+
.describe('New priority level: "low", "medium", "high", "urgent". Example: "medium"'),
|
|
220
|
+
assignee: z
|
|
221
|
+
.string()
|
|
222
|
+
.optional()
|
|
223
|
+
.describe('New assignee email or user ID. Example: "tech-lead@company.com"'),
|
|
224
|
+
},
|
|
225
|
+
}, async ({ issue_id, ...updates }) => jsonResponse(await ensurePylonClient().updateIssue(issue_id, updates)));
|
|
226
|
+
mcpServer.registerTool('pylon_search_issues', {
|
|
227
|
+
description: 'Search for support issues/tickets in Pylon by keywords, customer name, or issue content. Use this to find related issues, check for duplicates, or research similar problems.',
|
|
228
|
+
inputSchema: {
|
|
229
|
+
query: z
|
|
230
|
+
.string()
|
|
231
|
+
.describe('Search term to find issues. Can search in titles, descriptions, and customer names. Examples: "login error", "billing question", "API timeout", "John Smith"'),
|
|
232
|
+
filters: z
|
|
233
|
+
.record(z.string(), z.unknown())
|
|
234
|
+
.optional()
|
|
235
|
+
.describe('Additional filters as key-value pairs. Examples: {"status": "open", "priority": "high"}, {"assignee": "john@company.com", "created_after": "2024-01-01"}'),
|
|
236
|
+
},
|
|
237
|
+
}, async ({ query, filters }) => jsonResponse(await ensurePylonClient().searchIssues(query, filters)));
|
|
238
|
+
mcpServer.registerTool('pylon_snooze_issue', {
|
|
239
|
+
description: 'Temporarily hide an issue until a future date/time. Use this for issues that cannot be worked on now but need follow-up later (e.g., waiting for customer response, scheduled maintenance, feature release).',
|
|
240
|
+
inputSchema: {
|
|
241
|
+
issue_id: z.string().describe('ID of the issue to snooze. Example: "issue_abc123"'),
|
|
242
|
+
until: z
|
|
243
|
+
.string()
|
|
244
|
+
.describe('Date and time when issue should reappear (ISO 8601 format). Examples: "2024-01-15T09:00:00Z" (specific date/time), "2024-01-20T00:00:00Z" (beginning of day)'),
|
|
245
|
+
},
|
|
246
|
+
}, async ({ issue_id, until }) => {
|
|
247
|
+
await ensurePylonClient().snoozeIssue(issue_id, until);
|
|
248
|
+
return jsonResponse({
|
|
249
|
+
success: true,
|
|
250
|
+
message: 'Issue snoozed successfully',
|
|
251
|
+
issue_id,
|
|
252
|
+
snoozed_until: until,
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
mcpServer.registerTool('pylon_get_issue_with_messages', {
|
|
256
|
+
description: 'Get a complete support issue with all its messages in a single call. Use this when you explicitly need the full conversation history. If you only need issue details and have a ticket number, prefer pylon_get_issue first; reach for this when message bodies are required.',
|
|
257
|
+
inputSchema: {
|
|
258
|
+
issue_id: z
|
|
259
|
+
.string()
|
|
260
|
+
.describe('ID (ticket/issue number) to retrieve with messages. You can pass the user-provided ticket number directly. Example: "issue_abc123"'),
|
|
261
|
+
},
|
|
262
|
+
}, async ({ issue_id }) => jsonResponse(await ensurePylonClient().getIssueWithMessages(issue_id)));
|
|
263
|
+
mcpServer.registerTool('pylon_get_issue_messages', {
|
|
264
|
+
description: 'Get the conversation history for a specific support issue. Use when you need message bodies only. If you have a ticket number and just need issue details, call pylon_get_issue first; use this when you specifically need the messages.',
|
|
265
|
+
inputSchema: {
|
|
266
|
+
issue_id: z
|
|
267
|
+
.string()
|
|
268
|
+
.describe('ID (ticket/issue number) of the issue to get messages for. You can pass the user-provided ticket number directly. Example: "issue_abc123"'),
|
|
269
|
+
},
|
|
270
|
+
}, async ({ issue_id }) => jsonResponse(await ensurePylonClient().getIssueMessages(issue_id)));
|
|
271
|
+
// Message creation with elicitation confirmation
|
|
272
|
+
mcpServer.registerTool('pylon_create_issue_message', {
|
|
273
|
+
description: 'Add a new message/reply to a support issue conversation. Use this to respond to customers, add internal notes, or provide updates on issue progress. ⚠️ IMPORTANT: This tool sends customer-facing messages and requires user confirmation before sending. The user will be prompted to review and approve the message content.',
|
|
274
|
+
inputSchema: {
|
|
275
|
+
issue_id: z.string().describe('ID of the issue to add message to. Example: "issue_abc123"'),
|
|
276
|
+
content: z
|
|
277
|
+
.string()
|
|
278
|
+
.describe('Message text to send. Can include formatting and links. Examples: "Hi John, I\'ve escalated this to our dev team. You should see a fix by tomorrow.", "**Internal note:** This appears to be related to the server migration last week."'),
|
|
279
|
+
},
|
|
280
|
+
}, async ({ issue_id, content }) => {
|
|
281
|
+
let messageContent = content;
|
|
282
|
+
// Request user confirmation before sending customer-facing messages
|
|
283
|
+
if (REQUIRE_MESSAGE_CONFIRMATION) {
|
|
284
|
+
const confirmation = await requestMessageConfirmation(issue_id, messageContent);
|
|
285
|
+
if (!confirmation.confirmed) {
|
|
286
|
+
return jsonResponse({
|
|
287
|
+
success: false,
|
|
288
|
+
message: 'Message not sent - user did not confirm',
|
|
289
|
+
reason: confirmation.reason,
|
|
290
|
+
issue_id,
|
|
291
|
+
original_content: messageContent,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
// Use the potentially modified content from the confirmation
|
|
295
|
+
if (confirmation.content) {
|
|
296
|
+
messageContent = confirmation.content;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return jsonResponse(await ensurePylonClient().createIssueMessage(issue_id, messageContent));
|
|
300
|
+
});
|
|
301
|
+
// Knowledge Base Tools
|
|
302
|
+
mcpServer.registerTool('pylon_get_knowledge_bases', {
|
|
303
|
+
description: 'Get all knowledge bases from Pylon. Knowledge bases contain help articles, FAQs, and documentation that customers can access. Returns list of available knowledge bases with their names and article counts.',
|
|
304
|
+
}, async () => jsonResponse(await ensurePylonClient().getKnowledgeBases()));
|
|
305
|
+
mcpServer.registerTool('pylon_get_knowledge_base_articles', {
|
|
306
|
+
description: 'Get help articles from a specific knowledge base. Use this to find existing documentation that might help resolve customer issues or to see what self-service content is available.',
|
|
307
|
+
inputSchema: {
|
|
308
|
+
knowledge_base_id: z
|
|
309
|
+
.string()
|
|
310
|
+
.describe('ID of the knowledge base to get articles from. Get this from pylon_get_knowledge_bases first. Example: "kb_123abc"'),
|
|
311
|
+
},
|
|
312
|
+
}, async ({ knowledge_base_id }) => jsonResponse(await ensurePylonClient().getKnowledgeBaseArticles(knowledge_base_id)));
|
|
313
|
+
mcpServer.registerTool('pylon_create_knowledge_base_article', {
|
|
314
|
+
description: 'Create a new help article in a knowledge base. Use this to add new documentation, FAQs, or troubleshooting guides that customers can access for self-service support.',
|
|
315
|
+
inputSchema: {
|
|
316
|
+
knowledge_base_id: z
|
|
317
|
+
.string()
|
|
318
|
+
.describe('ID of the knowledge base to add article to. Example: "kb_123abc"'),
|
|
319
|
+
title: z
|
|
320
|
+
.string()
|
|
321
|
+
.describe('Article title that clearly describes the topic. Examples: "How to Reset Your Password", "Troubleshooting Login Issues", "Billing FAQ"'),
|
|
322
|
+
content: z
|
|
323
|
+
.string()
|
|
324
|
+
.describe('Full article content in markdown or HTML format. Include step-by-step instructions, screenshots, and links. Example: "## Steps to Reset Password\\n1. Go to login page\\n2. Click Forgot Password..."'),
|
|
325
|
+
},
|
|
326
|
+
}, async ({ knowledge_base_id, title, content }) => jsonResponse(await ensurePylonClient().createKnowledgeBaseArticle(knowledge_base_id, { title, content })));
|
|
327
|
+
// Team Management Tools
|
|
328
|
+
mcpServer.registerTool('pylon_get_teams', {
|
|
329
|
+
description: 'Get all support teams from Pylon. Teams are groups of support agents that handle different types of issues (e.g., Technical, Billing, Sales). Returns team names, member counts, and specializations.',
|
|
330
|
+
}, async () => jsonResponse(await ensurePylonClient().getTeams()));
|
|
331
|
+
mcpServer.registerTool('pylon_get_team', {
|
|
332
|
+
description: 'Get detailed information about a specific support team. Returns team members, their roles, current workload, and team performance metrics.',
|
|
333
|
+
inputSchema: {
|
|
334
|
+
team_id: z
|
|
335
|
+
.string()
|
|
336
|
+
.describe('ID of the team to get details for. Get this from pylon_get_teams first. Example: "team_456def"'),
|
|
337
|
+
},
|
|
338
|
+
}, async ({ team_id }) => jsonResponse(await ensurePylonClient().getTeam(team_id)));
|
|
339
|
+
mcpServer.registerTool('pylon_create_team', {
|
|
340
|
+
description: 'Create a new support team in Pylon. Use this to organize support agents into specialized groups for handling different types of customer issues (e.g., Technical Support, Billing, Enterprise accounts).',
|
|
341
|
+
inputSchema: {
|
|
342
|
+
name: z
|
|
343
|
+
.string()
|
|
344
|
+
.describe('Team name that describes their specialization. Examples: "Technical Support", "Billing Team", "Enterprise Support", "Level 2 Support"'),
|
|
345
|
+
description: z
|
|
346
|
+
.string()
|
|
347
|
+
.optional()
|
|
348
|
+
.describe('Description of team responsibilities and expertise. Example: "Handles complex technical issues, API questions, and integration support"'),
|
|
349
|
+
members: z
|
|
350
|
+
.array(z.string())
|
|
351
|
+
.optional()
|
|
352
|
+
.describe('Array of user IDs or emails of team members. Example: ["john@company.com", "user_123", "sarah@company.com"]'),
|
|
353
|
+
},
|
|
354
|
+
}, async (args) => jsonResponse(await ensurePylonClient().createTeam(args)));
|
|
355
|
+
// Account Management Tools
|
|
356
|
+
mcpServer.registerTool('pylon_get_accounts', {
|
|
357
|
+
description: 'Get all customer accounts from Pylon. Accounts represent companies or organizations that use your service. Returns account details like company name, subscription level, and contact information.',
|
|
358
|
+
}, async () => jsonResponse(await ensurePylonClient().getAccounts()));
|
|
359
|
+
mcpServer.registerTool('pylon_get_account', {
|
|
360
|
+
description: 'Get detailed information about a specific customer account. Returns company details, subscription info, billing status, and associated contacts and issues.',
|
|
361
|
+
inputSchema: {
|
|
362
|
+
account_id: z
|
|
363
|
+
.string()
|
|
364
|
+
.describe('ID of the account to get details for. Get this from pylon_get_accounts or customer records. Example: "acc_789xyz"'),
|
|
365
|
+
},
|
|
366
|
+
}, async ({ account_id }) => jsonResponse(await ensurePylonClient().getAccount(account_id)));
|
|
367
|
+
// Tag Management Tools
|
|
368
|
+
mcpServer.registerTool('pylon_get_tags', {
|
|
369
|
+
description: 'Get all available tags for categorizing issues and contacts. Tags help organize and filter support tickets by topic, urgency, or type (e.g., "bug", "feature-request", "billing", "urgent").',
|
|
370
|
+
}, async () => jsonResponse(await ensurePylonClient().getTags()));
|
|
371
|
+
mcpServer.registerTool('pylon_create_tag', {
|
|
372
|
+
description: 'Create a new tag for categorizing issues and contacts. Use this to add new categories that help organize and filter your support tickets effectively.',
|
|
373
|
+
inputSchema: {
|
|
374
|
+
name: z
|
|
375
|
+
.string()
|
|
376
|
+
.describe('Tag name that describes the category. Examples: "billing-question", "feature-request", "bug-report", "urgent", "enterprise-customer"'),
|
|
377
|
+
color: z
|
|
378
|
+
.string()
|
|
379
|
+
.optional()
|
|
380
|
+
.describe('Color for the tag in hex format or color name. Examples: "#FF0000", "red", "#00AA00", "blue"'),
|
|
381
|
+
},
|
|
382
|
+
}, async (args) => jsonResponse(await ensurePylonClient().createTag(args)));
|
|
383
|
+
// Ticket Form Tools
|
|
384
|
+
mcpServer.registerTool('pylon_get_ticket_forms', {
|
|
385
|
+
description: 'Get all ticket submission forms available to customers. Forms define what information customers provide when creating new support requests (e.g., bug report form, billing inquiry form).',
|
|
386
|
+
}, async () => jsonResponse(await ensurePylonClient().getTicketForms()));
|
|
387
|
+
mcpServer.registerTool('pylon_create_ticket_form', {
|
|
388
|
+
description: 'Create a new ticket submission form for customers. Use this to customize what information customers provide when creating different types of support requests (bug reports, feature requests, billing questions).',
|
|
389
|
+
inputSchema: {
|
|
390
|
+
name: z
|
|
391
|
+
.string()
|
|
392
|
+
.describe('Form name that describes its purpose. Examples: "Bug Report Form", "Billing Inquiry", "Feature Request", "Technical Support"'),
|
|
393
|
+
description: z
|
|
394
|
+
.string()
|
|
395
|
+
.optional()
|
|
396
|
+
.describe('Description shown to customers explaining when to use this form. Example: "Use this form to report bugs or technical issues with our software."'),
|
|
397
|
+
fields: z
|
|
398
|
+
.array(z.record(z.string(), z.unknown()))
|
|
399
|
+
.describe('Array of form field objects defining what information to collect. Example: [{"type": "text", "name": "summary", "required": true}, {"type": "textarea", "name": "steps_to_reproduce"}, {"type": "select", "name": "browser", "options": ["Chrome", "Firefox", "Safari"]}]'),
|
|
400
|
+
},
|
|
401
|
+
}, async (args) => jsonResponse(await ensurePylonClient().createTicketForm(args)));
|
|
402
|
+
// Webhook Management Tools
|
|
403
|
+
mcpServer.registerTool('pylon_get_webhooks', {
|
|
404
|
+
description: 'Get all configured webhooks in Pylon. Webhooks automatically send notifications to external systems when events occur (e.g., new issues created, status changes, messages added).',
|
|
405
|
+
}, async () => jsonResponse(await ensurePylonClient().getWebhooks()));
|
|
406
|
+
mcpServer.registerTool('pylon_create_webhook', {
|
|
407
|
+
description: 'Create a new webhook to automatically notify external systems when events occur in Pylon. Use this to integrate with Slack, Discord, email systems, or custom applications.',
|
|
408
|
+
inputSchema: {
|
|
409
|
+
url: z
|
|
410
|
+
.string()
|
|
411
|
+
.describe('HTTPS URL where webhook payloads will be sent. Must be publicly accessible. Examples: "https://hooks.slack.com/services/...", "https://api.myapp.com/webhooks/pylon"'),
|
|
412
|
+
events: z
|
|
413
|
+
.array(z.string())
|
|
414
|
+
.describe('Array of events to trigger webhook. Examples: ["issue.created", "issue.updated", "issue.resolved"], ["message.created"], ["contact.created", "team.assigned"]'),
|
|
415
|
+
active: z
|
|
416
|
+
.boolean()
|
|
417
|
+
.optional()
|
|
418
|
+
.describe('Whether webhook should start active immediately. Default is true. Example: true'),
|
|
419
|
+
},
|
|
420
|
+
}, async (args) => jsonResponse(await ensurePylonClient().createWebhook({ ...args, active: args.active ?? true })));
|
|
421
|
+
mcpServer.registerTool('pylon_delete_webhook', {
|
|
422
|
+
description: 'Delete an existing webhook to stop sending notifications to an external system. Use this when removing integrations or cleaning up unused webhooks.',
|
|
423
|
+
inputSchema: {
|
|
424
|
+
webhook_id: z
|
|
425
|
+
.string()
|
|
426
|
+
.describe('ID of the webhook to delete. Get this from pylon_get_webhooks. Example: "webhook_xyz789"'),
|
|
427
|
+
},
|
|
428
|
+
}, async ({ webhook_id }) => {
|
|
429
|
+
await ensurePylonClient().deleteWebhook(webhook_id);
|
|
430
|
+
return jsonResponse({ success: true, message: 'Webhook deleted successfully', webhook_id });
|
|
431
|
+
});
|
|
432
|
+
// Attachment Management Tools
|
|
433
|
+
mcpServer.registerTool('pylon_get_attachment', {
|
|
434
|
+
description: 'Get details of a specific attachment from Pylon. Returns attachment metadata including ID, name, URL, and description. Use this to retrieve information about files attached to messages.',
|
|
435
|
+
inputSchema: {
|
|
436
|
+
attachment_id: z
|
|
437
|
+
.string()
|
|
438
|
+
.describe('ID of the attachment to retrieve. Get this from message attachments array. Example: "att_abc123"'),
|
|
439
|
+
},
|
|
440
|
+
}, async ({ attachment_id }) => jsonResponse(await ensurePylonClient().getAttachment(attachment_id)));
|
|
441
|
+
mcpServer.registerTool('pylon_create_attachment_from_url', {
|
|
442
|
+
description: 'Create an attachment in Pylon from a URL. Downloads the file from the provided URL and creates an attachment that can be used in messages or knowledge base articles. Returns the attachment details including the Pylon-hosted URL.',
|
|
443
|
+
inputSchema: {
|
|
444
|
+
file_url: z
|
|
445
|
+
.string()
|
|
446
|
+
.describe('URL of the file to download and attach. Must be publicly accessible. Example: "https://example.com/document.pdf"'),
|
|
447
|
+
description: z
|
|
448
|
+
.string()
|
|
449
|
+
.optional()
|
|
450
|
+
.describe('Optional description of the attachment. Example: "Product specification document"'),
|
|
451
|
+
},
|
|
452
|
+
}, async ({ file_url, description }) => jsonResponse(await ensurePylonClient().createAttachmentFromUrl(file_url, description)));
|
|
453
|
+
// Main function to start the server
|
|
454
|
+
async function main() {
|
|
455
|
+
const transport = new StdioServerTransport();
|
|
456
|
+
await mcpServer.connect(transport);
|
|
457
|
+
console.error('Pylon MCP Server running on stdio');
|
|
458
|
+
}
|
|
459
|
+
main().catch((error) => {
|
|
460
|
+
console.error('Server failed to start:', error);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
});
|
|
463
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
export interface PylonConfig {
|
|
2
|
+
apiToken: string;
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface PylonUser {
|
|
6
|
+
id: string;
|
|
7
|
+
email: string;
|
|
8
|
+
name: string;
|
|
9
|
+
role: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PylonContact {
|
|
12
|
+
id: string;
|
|
13
|
+
email: string;
|
|
14
|
+
name: string;
|
|
15
|
+
portal_role?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PylonIssue {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
description: string;
|
|
21
|
+
status: string;
|
|
22
|
+
priority: string;
|
|
23
|
+
assignee?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface PylonKnowledgeBase {
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface PylonArticle {
|
|
31
|
+
id: string;
|
|
32
|
+
title: string;
|
|
33
|
+
content: string;
|
|
34
|
+
knowledge_base_id: string;
|
|
35
|
+
}
|
|
36
|
+
export interface PylonTeam {
|
|
37
|
+
id: string;
|
|
38
|
+
name: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
members?: string[];
|
|
41
|
+
}
|
|
42
|
+
export interface PylonAccount {
|
|
43
|
+
id: string;
|
|
44
|
+
name: string;
|
|
45
|
+
domain?: string;
|
|
46
|
+
plan?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface PylonAttachment {
|
|
49
|
+
id: string;
|
|
50
|
+
name: string;
|
|
51
|
+
url: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface PylonMessage {
|
|
55
|
+
id: string;
|
|
56
|
+
content: string;
|
|
57
|
+
author_id: string;
|
|
58
|
+
issue_id: string;
|
|
59
|
+
created_at: string;
|
|
60
|
+
attachments?: PylonAttachment[];
|
|
61
|
+
}
|
|
62
|
+
export interface PylonTag {
|
|
63
|
+
id: string;
|
|
64
|
+
name: string;
|
|
65
|
+
color?: string;
|
|
66
|
+
}
|
|
67
|
+
export interface PylonTicketForm {
|
|
68
|
+
id: string;
|
|
69
|
+
name: string;
|
|
70
|
+
description?: string;
|
|
71
|
+
fields: any[];
|
|
72
|
+
}
|
|
73
|
+
export interface PylonWebhook {
|
|
74
|
+
id: string;
|
|
75
|
+
url: string;
|
|
76
|
+
events: string[];
|
|
77
|
+
active: boolean;
|
|
78
|
+
}
|
|
79
|
+
export declare class PylonClient {
|
|
80
|
+
private client;
|
|
81
|
+
constructor(config: PylonConfig);
|
|
82
|
+
getMe(): Promise<PylonUser>;
|
|
83
|
+
getContacts(params?: {
|
|
84
|
+
search?: string;
|
|
85
|
+
limit?: number;
|
|
86
|
+
}): Promise<PylonContact[]>;
|
|
87
|
+
createContact(contact: Omit<PylonContact, 'id'>): Promise<PylonContact>;
|
|
88
|
+
getIssues(params?: {
|
|
89
|
+
assignee?: string;
|
|
90
|
+
status?: string;
|
|
91
|
+
limit?: number;
|
|
92
|
+
}): Promise<PylonIssue[]>;
|
|
93
|
+
createIssue(issue: Omit<PylonIssue, 'id'>): Promise<PylonIssue>;
|
|
94
|
+
getKnowledgeBases(): Promise<PylonKnowledgeBase[]>;
|
|
95
|
+
getKnowledgeBaseArticles(knowledgeBaseId: string): Promise<PylonArticle[]>;
|
|
96
|
+
createKnowledgeBaseArticle(knowledgeBaseId: string, article: Omit<PylonArticle, 'id' | 'knowledge_base_id'>): Promise<PylonArticle>;
|
|
97
|
+
getTeams(): Promise<PylonTeam[]>;
|
|
98
|
+
getTeam(teamId: string): Promise<PylonTeam>;
|
|
99
|
+
createTeam(team: Omit<PylonTeam, 'id'>): Promise<PylonTeam>;
|
|
100
|
+
getAccounts(): Promise<PylonAccount[]>;
|
|
101
|
+
getAccount(accountId: string): Promise<PylonAccount>;
|
|
102
|
+
searchUsers(query: string): Promise<PylonUser[]>;
|
|
103
|
+
getUsers(): Promise<PylonUser[]>;
|
|
104
|
+
searchContacts(query: string): Promise<PylonContact[]>;
|
|
105
|
+
searchIssues(query: string, filters?: any): Promise<PylonIssue[]>;
|
|
106
|
+
getIssue(issueId: string): Promise<PylonIssue>;
|
|
107
|
+
updateIssue(issueId: string, updates: Partial<PylonIssue>): Promise<PylonIssue>;
|
|
108
|
+
snoozeIssue(issueId: string, until: string): Promise<void>;
|
|
109
|
+
getIssueMessages(issueId: string): Promise<PylonMessage[]>;
|
|
110
|
+
createIssueMessage(issueId: string, content: string): Promise<PylonMessage>;
|
|
111
|
+
getIssueWithMessages(issueId: string): Promise<{
|
|
112
|
+
issue: PylonIssue;
|
|
113
|
+
messages: PylonMessage[];
|
|
114
|
+
}>;
|
|
115
|
+
getTags(): Promise<PylonTag[]>;
|
|
116
|
+
createTag(tag: Omit<PylonTag, 'id'>): Promise<PylonTag>;
|
|
117
|
+
getTicketForms(): Promise<PylonTicketForm[]>;
|
|
118
|
+
createTicketForm(form: Omit<PylonTicketForm, 'id'>): Promise<PylonTicketForm>;
|
|
119
|
+
getWebhooks(): Promise<PylonWebhook[]>;
|
|
120
|
+
createWebhook(webhook: Omit<PylonWebhook, 'id'>): Promise<PylonWebhook>;
|
|
121
|
+
deleteWebhook(webhookId: string): Promise<void>;
|
|
122
|
+
getAttachment(attachmentId: string): Promise<PylonAttachment>;
|
|
123
|
+
createAttachment(file: File | Blob, description?: string): Promise<PylonAttachment>;
|
|
124
|
+
createAttachmentFromUrl(fileUrl: string, description?: string): Promise<PylonAttachment>;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=pylon-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pylon-client.d.ts","sourceRoot":"","sources":["../src/pylon-client.ts"],"names":[],"mappings":"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"}
|