@customer-support-success/pylon-mcp-server 3.7.0 → 3.7.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 +11 -1
- package/CHANGELOG.md +43 -0
- package/CLAUDE.md +1 -11
- package/README.md +94 -47
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/GCP_SETUP.md +0 -109
- package/SECURITY_AUDIT_REPORT.md +0 -270
- package/smithery.yaml +0 -17
package/.env.example
CHANGED
|
@@ -7,4 +7,14 @@ PYLON_API_TOKEN=your_pylon_api_token_here
|
|
|
7
7
|
# Cache TTL in milliseconds (optional)
|
|
8
8
|
# Default: 30000 (30 seconds)
|
|
9
9
|
# Set to 0 to disable caching
|
|
10
|
-
# PYLON_CACHE_TTL=30000
|
|
10
|
+
# PYLON_CACHE_TTL=30000
|
|
11
|
+
|
|
12
|
+
# Maximum retry attempts for transient failures (optional)
|
|
13
|
+
# Default: 3
|
|
14
|
+
# Set to 0 to disable retries
|
|
15
|
+
# Retries on: 429 (rate limit), 5xx (server error), network timeouts
|
|
16
|
+
# PYLON_RETRY_MAX=3
|
|
17
|
+
|
|
18
|
+
# Debug logging (optional)
|
|
19
|
+
# Set to true to log request/response details and retry attempts to stderr
|
|
20
|
+
# PYLON_DEBUG=true
|
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,49 @@ All notable changes to the Pylon MCP Server will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.7.2] - 2026-03-31
|
|
9
|
+
|
|
10
|
+
### 🔧 CI
|
|
11
|
+
|
|
12
|
+
- Aligned security.yml workflow to Node 22 (was Node 20, matching CI workflow)
|
|
13
|
+
|
|
14
|
+
### 📦 Dependencies
|
|
15
|
+
|
|
16
|
+
- Bumped path-to-regexp from 8.3.0 to 8.4.0
|
|
17
|
+
- Bumped picomatch from 2.3.1 to 2.3.2
|
|
18
|
+
- Bumped flatted from 3.3.3 to 3.4.2
|
|
19
|
+
- Bumped hono from 4.12.3 to 4.12.7
|
|
20
|
+
- Bumped express-rate-limit from 8.2.1 to 8.3.0
|
|
21
|
+
- Bumped @hono/node-server from 1.19.9 to 1.19.10
|
|
22
|
+
|
|
23
|
+
### 🔒 Security
|
|
24
|
+
|
|
25
|
+
- Resolved npm audit vulnerability via dependency updates
|
|
26
|
+
|
|
27
|
+
## [3.7.1] - 2026-02-27
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **Documentation**: Comprehensive README and CLAUDE.md update
|
|
32
|
+
- Added 12 missing tools to Available Tools section (38 total now documented)
|
|
33
|
+
- Added retry logic documentation (`PYLON_RETRY_MAX`, `PYLON_DEBUG`, Retry Behavior section)
|
|
34
|
+
- Removed all Smithery references and deleted `smithery.yaml`
|
|
35
|
+
- Removed stale "NEW" markers from 7 tools
|
|
36
|
+
- Fixed workflow reference (`publish.yml` → `release.yml`)
|
|
37
|
+
- Rewrote Features section to cover all capabilities
|
|
38
|
+
- Expanded Example Tool Usage section
|
|
39
|
+
|
|
40
|
+
### Removed
|
|
41
|
+
|
|
42
|
+
- Deleted `GCP_SETUP.md` (outdated, referenced non-existent `publish.yml`)
|
|
43
|
+
- Deleted `SECURITY_AUDIT_REPORT.md` (one-time pre-publication audit, no longer relevant)
|
|
44
|
+
- Removed tracked `.DS_Store` and `.idea/` files (should never have been committed)
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- Added `.DS_Store` to `.gitignore`
|
|
49
|
+
- Added `PYLON_RETRY_MAX` and `PYLON_DEBUG` to `.env.example`
|
|
50
|
+
|
|
8
51
|
## [3.7.0] - 2026-02-27
|
|
9
52
|
|
|
10
53
|
### Added
|
package/CLAUDE.md
CHANGED
|
@@ -13,13 +13,12 @@ This is an MCP (Model Context Protocol) server that provides comprehensive integ
|
|
|
13
13
|
- **HTTP Client**: Axios for API communication
|
|
14
14
|
- **Caching**: In-memory cache with configurable TTL (default 30s)
|
|
15
15
|
- **Build System**: TypeScript compiler
|
|
16
|
-
- **Deployment**:
|
|
16
|
+
- **Deployment**: npm registry
|
|
17
17
|
|
|
18
18
|
## Key Files
|
|
19
19
|
|
|
20
20
|
- `src/pylon-client.ts` - Pylon API client with authentication and all endpoint methods
|
|
21
21
|
- `src/index.ts` - MCP server implementation with tool definitions and handlers
|
|
22
|
-
- `smithery.yaml` - Smithery deployment configuration
|
|
23
22
|
- `package.json` - Dependencies and build scripts
|
|
24
23
|
|
|
25
24
|
## API Coverage
|
|
@@ -132,12 +131,6 @@ To test the MCP server with a real client:
|
|
|
132
131
|
- Use built `dist/index.js` as entrypoint
|
|
133
132
|
- Can run with `npx pylon-mcp-server` after publishing to npm
|
|
134
133
|
|
|
135
|
-
### Smithery Production
|
|
136
|
-
|
|
137
|
-
- Uses `smithery.yaml` configuration
|
|
138
|
-
- Automatic dependency installation and build
|
|
139
|
-
- Environment variable configuration through Smithery UI
|
|
140
|
-
|
|
141
134
|
## Code Patterns
|
|
142
135
|
|
|
143
136
|
### Adding New API Endpoints
|
|
@@ -184,8 +177,6 @@ To test the MCP server with a real client:
|
|
|
184
177
|
}
|
|
185
178
|
```
|
|
186
179
|
|
|
187
|
-
5. **Update smithery.yaml** tools list
|
|
188
|
-
|
|
189
180
|
## Error Handling
|
|
190
181
|
|
|
191
182
|
- All API calls are wrapped in try/catch
|
|
@@ -210,6 +201,5 @@ To test the MCP server with a real client:
|
|
|
210
201
|
|
|
211
202
|
- Add response type validation
|
|
212
203
|
- Implement proper TypeScript types for all API responses
|
|
213
|
-
- Add retry logic for failed API calls
|
|
214
204
|
- Implement rate limiting
|
|
215
205
|
- Add comprehensive error codes mapping
|
package/README.md
CHANGED
|
@@ -4,13 +4,22 @@ An MCP (Model Context Protocol) server for integrating with the Pylon API.
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
This MCP server provides tools
|
|
7
|
+
This MCP server provides 38 tools for comprehensive Pylon API integration:
|
|
8
8
|
|
|
9
|
-
- **User Management**: Get current user
|
|
9
|
+
- **User Management**: Get current user, list and search team members
|
|
10
10
|
- **Contacts**: List, search, and create contacts
|
|
11
|
-
- **Issues**:
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
11
|
+
- **Issues**: Full CRUD, search, filter, snooze, and delete issues
|
|
12
|
+
- **Tags**: Get, create, add, and remove tags on issues
|
|
13
|
+
- **External Issue Linking**: Link/unlink Linear, Jira, GitHub, Asana issues
|
|
14
|
+
- **Issue Followers**: Get, add, and remove followers on issues
|
|
15
|
+
- **Similar Issues**: Find similar issues by requestor, account, or globally
|
|
16
|
+
- **Knowledge Base**: List knowledge bases and create articles
|
|
17
|
+
- **Teams**: List, get details, and create teams
|
|
18
|
+
- **Accounts**: List and get account details
|
|
19
|
+
- **Attachments**: Get metadata and create from URL
|
|
20
|
+
- **Ticket Forms**: List available submission forms
|
|
21
|
+
- **Smart Caching**: Automatic caching of GET requests with configurable TTL
|
|
22
|
+
- **Retry Logic**: Exponential backoff for transient failures (429, 5xx, timeouts)
|
|
14
23
|
|
|
15
24
|
## Setup
|
|
16
25
|
|
|
@@ -22,6 +31,14 @@ Set the following environment variables:
|
|
|
22
31
|
- `PYLON_CACHE_TTL`: Cache time-to-live in milliseconds (optional, default: 30000)
|
|
23
32
|
- Set to `0` to disable caching
|
|
24
33
|
- Example: `PYLON_CACHE_TTL=60000` for 60-second cache
|
|
34
|
+
- `PYLON_RETRY_MAX`: Maximum retry attempts for transient failures (optional, default: 3)
|
|
35
|
+
- Set to `0` to disable retries
|
|
36
|
+
- Retries on: 429 (rate limit), 5xx (server error), network timeouts
|
|
37
|
+
- Only retries idempotent requests (GET, HEAD, OPTIONS, PUT, DELETE)
|
|
38
|
+
- Uses exponential backoff with jitter
|
|
39
|
+
- Respects `Retry-After` header (capped at 30 seconds)
|
|
40
|
+
- `PYLON_DEBUG`: Set to `true` to enable debug logging (optional)
|
|
41
|
+
- Logs request/response details and retry attempts to stderr
|
|
25
42
|
|
|
26
43
|
### HTTP Request Timeout
|
|
27
44
|
|
|
@@ -37,6 +54,15 @@ If you encounter timeout errors, check:
|
|
|
37
54
|
2. Pylon API status
|
|
38
55
|
3. Whether the operation is legitimately slow (e.g., large data queries)
|
|
39
56
|
|
|
57
|
+
### Retry Behavior
|
|
58
|
+
|
|
59
|
+
The client automatically retries transient API failures with exponential backoff:
|
|
60
|
+
|
|
61
|
+
- **Retried errors**: HTTP 429 (rate limit), 5xx (server errors), network timeouts
|
|
62
|
+
- **Not retried**: 4xx client errors (400, 401, 403, 404, 422), POST/PATCH requests
|
|
63
|
+
- **Backoff**: `min(1000ms × 2^attempt + random jitter, 30s)`, respects `Retry-After` header
|
|
64
|
+
- **Default**: 3 retry attempts. Set `PYLON_RETRY_MAX=0` to disable.
|
|
65
|
+
|
|
40
66
|
### Caching Behavior
|
|
41
67
|
|
|
42
68
|
The server implements intelligent caching to reduce API calls:
|
|
@@ -77,7 +103,7 @@ Preferred: tag and let GitHub Actions publish via npm Trusted Publishing (OIDC)
|
|
|
77
103
|
git tag vX.Y.Z && git push origin vX.Y.Z
|
|
78
104
|
```
|
|
79
105
|
|
|
80
|
-
CI (`.github/workflows/
|
|
106
|
+
CI (`.github/workflows/release.yml`) will build/test and publish to npmjs with `--provenance` via trusted publisher.
|
|
81
107
|
|
|
82
108
|
Manual (maintainers only, if ever needed):
|
|
83
109
|
|
|
@@ -126,10 +152,13 @@ npm run test:coverage
|
|
|
126
152
|
### User Tools
|
|
127
153
|
|
|
128
154
|
- `pylon_get_me`: Get current user information
|
|
155
|
+
- `pylon_get_users`: Get all team members and support agents
|
|
156
|
+
- `pylon_search_users`: Search for team members by name, email, or department
|
|
129
157
|
|
|
130
158
|
### Contact Tools
|
|
131
159
|
|
|
132
160
|
- `pylon_get_contacts`: List contacts with optional search and limit
|
|
161
|
+
- `pylon_search_contacts`: Search for contacts by name, email, or company
|
|
133
162
|
- `pylon_create_contact`: Create a new contact
|
|
134
163
|
|
|
135
164
|
### Issue Tools
|
|
@@ -142,21 +171,21 @@ npm run test:coverage
|
|
|
142
171
|
- `pylon_get_issue_with_messages`: Get a complete issue with all messages in one call
|
|
143
172
|
- `pylon_get_issue_messages`: Get conversation history for an issue
|
|
144
173
|
- `pylon_update_issue`: Update issue status, priority, assignee, or replace all tags
|
|
145
|
-
- `pylon_add_tags`:
|
|
146
|
-
- `pylon_remove_tags`:
|
|
174
|
+
- `pylon_add_tags`: Incrementally add tags to an issue (preserves existing tags, deduplicates)
|
|
175
|
+
- `pylon_remove_tags`: Incrementally remove specific tags from an issue (leaves other tags intact)
|
|
147
176
|
- `pylon_snooze_issue`: Temporarily hide an issue until a future date
|
|
148
177
|
- `pylon_delete_issue`: Permanently delete an issue (⚠️ destructive operation)
|
|
149
178
|
|
|
150
179
|
### External Issue Linking Tools
|
|
151
180
|
|
|
152
|
-
- `pylon_link_external_issue`:
|
|
153
|
-
- `pylon_unlink_external_issue`:
|
|
181
|
+
- `pylon_link_external_issue`: Link an external issue (Linear, Jira, GitHub, Asana) to a Pylon issue
|
|
182
|
+
- `pylon_unlink_external_issue`: Unlink an external issue from a Pylon issue
|
|
154
183
|
|
|
155
184
|
### Issue Followers Tools
|
|
156
185
|
|
|
157
|
-
- `pylon_get_issue_followers`:
|
|
158
|
-
- `pylon_add_issue_followers`:
|
|
159
|
-
- `pylon_remove_issue_followers`:
|
|
186
|
+
- `pylon_get_issue_followers`: Get the list of followers for an issue
|
|
187
|
+
- `pylon_add_issue_followers`: Add users and/or contacts as followers to an issue
|
|
188
|
+
- `pylon_remove_issue_followers`: Remove followers from an issue
|
|
160
189
|
|
|
161
190
|
#### Searching by Custom Status
|
|
162
191
|
|
|
@@ -197,11 +226,37 @@ pylon_search_issues with:
|
|
|
197
226
|
|
|
198
227
|
> **Note:** The Pylon API does not support creating messages programmatically. Messages can only be created through the Pylon web UI or original channels (Slack, email, etc.).
|
|
199
228
|
|
|
229
|
+
### Similar Issues Tools
|
|
230
|
+
|
|
231
|
+
- `pylon_find_similar_issues_for_requestor`: Find similar issues from the same contact
|
|
232
|
+
- `pylon_find_similar_issues_for_account`: Find similar issues from the same account/company
|
|
233
|
+
- `pylon_find_similar_issues_global`: Find similar issues across all users and companies
|
|
234
|
+
|
|
200
235
|
### Knowledge Base Tools
|
|
201
236
|
|
|
202
237
|
- `pylon_get_knowledge_bases`: List all knowledge bases
|
|
203
238
|
- `pylon_create_knowledge_base_article`: Create a new article in a knowledge base
|
|
204
239
|
|
|
240
|
+
### Team Tools
|
|
241
|
+
|
|
242
|
+
- `pylon_get_teams`: List all support teams
|
|
243
|
+
- `pylon_get_team`: Get details of a specific team
|
|
244
|
+
- `pylon_create_team`: Create a new support team
|
|
245
|
+
|
|
246
|
+
### Account Tools
|
|
247
|
+
|
|
248
|
+
- `pylon_get_accounts`: List all customer accounts
|
|
249
|
+
- `pylon_get_account`: Get details of a specific account
|
|
250
|
+
|
|
251
|
+
### Tag Tools
|
|
252
|
+
|
|
253
|
+
- `pylon_get_tags`: Get all available tags
|
|
254
|
+
- `pylon_create_tag`: Create a new tag
|
|
255
|
+
|
|
256
|
+
### Ticket Form Tools
|
|
257
|
+
|
|
258
|
+
- `pylon_get_ticket_forms`: Get all ticket submission forms
|
|
259
|
+
|
|
205
260
|
### Attachment Tools
|
|
206
261
|
|
|
207
262
|
- `pylon_get_attachment`: Get attachment metadata (includes a downloadable URL)
|
|
@@ -238,13 +293,14 @@ Augment Code supports MCP servers through its Easy MCP feature in VS Code and Je
|
|
|
238
293
|
"args": ["@customer-support-success/pylon-mcp-server"],
|
|
239
294
|
"env": {
|
|
240
295
|
"PYLON_API_TOKEN": "your_pylon_api_token_here",
|
|
241
|
-
"PYLON_CACHE_TTL": "30000"
|
|
296
|
+
"PYLON_CACHE_TTL": "30000",
|
|
297
|
+
"PYLON_RETRY_MAX": "3"
|
|
242
298
|
}
|
|
243
299
|
}
|
|
244
300
|
}
|
|
245
301
|
```
|
|
246
302
|
|
|
247
|
-
> **Note**: `PYLON_CACHE_TTL` is optional and defaults to 30000ms (30 seconds). Set to `0` to disable caching.
|
|
303
|
+
> **Note**: `PYLON_RETRY_MAX` is optional and defaults to 3. Set to `0` to disable retries. `PYLON_CACHE_TTL` is optional and defaults to 30000ms (30 seconds). Set to `0` to disable caching.
|
|
248
304
|
|
|
249
305
|
**Option B: Using local installation**
|
|
250
306
|
|
|
@@ -257,7 +313,8 @@ Augment Code supports MCP servers through its Easy MCP feature in VS Code and Je
|
|
|
257
313
|
"args": ["/absolute/path/to/pylon-mcp-server/dist/index.js"],
|
|
258
314
|
"env": {
|
|
259
315
|
"PYLON_API_TOKEN": "your_pylon_api_token_here",
|
|
260
|
-
"PYLON_CACHE_TTL": "30000"
|
|
316
|
+
"PYLON_CACHE_TTL": "30000",
|
|
317
|
+
"PYLON_RETRY_MAX": "3"
|
|
261
318
|
}
|
|
262
319
|
}
|
|
263
320
|
}
|
|
@@ -310,7 +367,8 @@ Add this to your Claude Desktop MCP settings (`~/Library/Application Support/Cla
|
|
|
310
367
|
"args": ["@customer-support-success/pylon-mcp-server"],
|
|
311
368
|
"env": {
|
|
312
369
|
"PYLON_API_TOKEN": "your_pylon_api_token_here",
|
|
313
|
-
"PYLON_CACHE_TTL": "30000"
|
|
370
|
+
"PYLON_CACHE_TTL": "30000",
|
|
371
|
+
"PYLON_RETRY_MAX": "3"
|
|
314
372
|
}
|
|
315
373
|
}
|
|
316
374
|
}
|
|
@@ -327,7 +385,8 @@ Add this to your Claude Desktop MCP settings (`~/Library/Application Support/Cla
|
|
|
327
385
|
"args": ["/path/to/pylon-mcp-server/dist/index.js"],
|
|
328
386
|
"env": {
|
|
329
387
|
"PYLON_API_TOKEN": "your_pylon_api_token_here",
|
|
330
|
-
"PYLON_CACHE_TTL": "30000"
|
|
388
|
+
"PYLON_CACHE_TTL": "30000",
|
|
389
|
+
"PYLON_RETRY_MAX": "3"
|
|
331
390
|
}
|
|
332
391
|
}
|
|
333
392
|
}
|
|
@@ -346,26 +405,6 @@ Use pylon_get_issues to show recent support tickets
|
|
|
346
405
|
Search for contacts with pylon_search_contacts using "customer@example.com"
|
|
347
406
|
```
|
|
348
407
|
|
|
349
|
-
### Running via Smithery
|
|
350
|
-
|
|
351
|
-
1. **Deploy to Smithery**:
|
|
352
|
-
- Upload your project to Smithery
|
|
353
|
-
- Smithery will automatically use the `smithery.yaml` configuration
|
|
354
|
-
- Set the `PYLON_API_TOKEN` environment variable in Smithery's deployment settings
|
|
355
|
-
|
|
356
|
-
2. **Configure in Claude Desktop**:
|
|
357
|
-
|
|
358
|
-
```json
|
|
359
|
-
{
|
|
360
|
-
"mcpServers": {
|
|
361
|
-
"pylon": {
|
|
362
|
-
"command": "npx",
|
|
363
|
-
"args": ["-y", "@smithery/pylon-mcp-server"]
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
```
|
|
368
|
-
|
|
369
408
|
### Example Tool Usage
|
|
370
409
|
|
|
371
410
|
Once connected, you can use the available tools:
|
|
@@ -381,6 +420,20 @@ Once connected, you can use the available tools:
|
|
|
381
420
|
"Get issue #123 with all messages" → uses pylon_get_issue_with_messages
|
|
382
421
|
"Update issue status to resolved" → uses pylon_update_issue
|
|
383
422
|
|
|
423
|
+
# Similar Issues
|
|
424
|
+
"Find similar issues from this customer" → uses pylon_find_similar_issues_for_requestor
|
|
425
|
+
"Check if this account has had similar problems" → uses pylon_find_similar_issues_for_account
|
|
426
|
+
|
|
427
|
+
# Tags
|
|
428
|
+
"Show all available tags" → uses pylon_get_tags
|
|
429
|
+
"Add a tag to this issue" → uses pylon_add_tags
|
|
430
|
+
|
|
431
|
+
# External Linking
|
|
432
|
+
"Link this Linear ticket to the Pylon issue" → uses pylon_link_external_issue
|
|
433
|
+
|
|
434
|
+
# Issue Followers
|
|
435
|
+
"Add me as a follower on this issue" → uses pylon_add_issue_followers
|
|
436
|
+
|
|
384
437
|
# Attachments
|
|
385
438
|
"Create attachment from URL" → uses pylon_create_attachment_from_url
|
|
386
439
|
|
|
@@ -388,20 +441,14 @@ Once connected, you can use the available tools:
|
|
|
388
441
|
"List all knowledge bases" → uses pylon_get_knowledge_bases
|
|
389
442
|
"Create a new help article" → uses pylon_create_knowledge_base_article
|
|
390
443
|
|
|
444
|
+
# Ticket Forms
|
|
445
|
+
"Show available ticket forms" → uses pylon_get_ticket_forms
|
|
446
|
+
|
|
391
447
|
# Team & Account Management
|
|
392
448
|
"Show all teams" → uses pylon_get_teams
|
|
393
449
|
"Get account details" → uses pylon_get_accounts
|
|
394
450
|
```
|
|
395
451
|
|
|
396
|
-
## Deployment to Smithery
|
|
397
|
-
|
|
398
|
-
This server is designed to be deployed to Smithery using the included `smithery.yaml` configuration. The deployment will automatically:
|
|
399
|
-
|
|
400
|
-
- Install dependencies with `npm install && npm run build`
|
|
401
|
-
- Configure the Node.js runtime with proper entrypoint
|
|
402
|
-
- Expose all supported Pylon API tools
|
|
403
|
-
- Require the `PYLON_API_TOKEN` environment variable
|
|
404
|
-
|
|
405
452
|
## API Reference
|
|
406
453
|
|
|
407
454
|
For more information about the Pylon API, visit the [API reference](https://docs.usepylon.com/pylon-docs/developer/api/api-reference).
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ const pylonClient = createPylonClient(PYLON_API_TOKEN, PYLON_CACHE_TTL);
|
|
|
11
11
|
// Create the McpServer instance (high-level API, replaces deprecated Server class)
|
|
12
12
|
const mcpServer = new McpServer({
|
|
13
13
|
name: 'pylon-mcp-server',
|
|
14
|
-
version: '3.7.
|
|
14
|
+
version: '3.7.1',
|
|
15
15
|
});
|
|
16
16
|
// Helper function to ensure pylonClient is initialized
|
|
17
17
|
function ensurePylonClient() {
|
package/package.json
CHANGED
package/GCP_SETUP.md
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# npm Public Publish Guide
|
|
2
|
-
|
|
3
|
-
This document explains how the Pylon MCP Server is published to and used from the public npm registry using npm Trusted Publishing (OIDC).
|
|
4
|
-
|
|
5
|
-
## What Was Set Up
|
|
6
|
-
|
|
7
|
-
1. **npm Registry (public)**
|
|
8
|
-
- Registry: `https://registry.npmjs.org/`
|
|
9
|
-
- Package: `@customer-support-success/pylon-mcp-server`
|
|
10
|
-
- Access: public
|
|
11
|
-
|
|
12
|
-
2. **Trusted Publisher**
|
|
13
|
-
- Provider: GitHub
|
|
14
|
-
- Repository: `mgmonteleone/pylon-mcp`
|
|
15
|
-
- Workflow: `.github/workflows/publish.yml`
|
|
16
|
-
- Branch: `main`
|
|
17
|
-
|
|
18
|
-
## For Users: Installing and Using the Package
|
|
19
|
-
|
|
20
|
-
### Using with npx (Recommended)
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
npx @customer-support-success/pylon-mcp-server
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Installing Globally
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
npm install -g @customer-support-success/pylon-mcp-server
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Using with Augment Code
|
|
33
|
-
|
|
34
|
-
Add this to your Augment Code MCP configuration (npm public):
|
|
35
|
-
|
|
36
|
-
```json
|
|
37
|
-
{
|
|
38
|
-
"pylon": {
|
|
39
|
-
"command": "npx",
|
|
40
|
-
"args": ["@customer-support-success/pylon-mcp-server"],
|
|
41
|
-
"env": {
|
|
42
|
-
"PYLON_API_TOKEN": "your_pylon_api_token_here"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Using with Claude Desktop
|
|
49
|
-
|
|
50
|
-
Add this to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
51
|
-
|
|
52
|
-
```json
|
|
53
|
-
{
|
|
54
|
-
"mcpServers": {
|
|
55
|
-
"pylon": {
|
|
56
|
-
"command": "npx",
|
|
57
|
-
"args": ["@customer-support-success/pylon-mcp-server"],
|
|
58
|
-
"env": {
|
|
59
|
-
"PYLON_API_TOKEN": "your_pylon_api_token_here"
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## For Maintainers: Publishing Updates
|
|
67
|
-
|
|
68
|
-
### Prerequisites
|
|
69
|
-
|
|
70
|
-
1. GCP authentication with publish permissions
|
|
71
|
-
2. Local repository cloned and up to date
|
|
72
|
-
|
|
73
|
-
### Publishing a New Version
|
|
74
|
-
|
|
75
|
-
1. **Update the version** in `package.json`:
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
npm version patch # or minor, or major
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
2. **Publish (CI preferred via trusted publisher)**:
|
|
82
|
-
- Push a tag `vX.Y.Z` and let `.github/workflows/publish.yml` build/test/publish to npmjs with `--provenance`.
|
|
83
|
-
- Local/manual (maintainers only, if needed):
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
npm run build
|
|
87
|
-
npm publish --access public
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Verifying the Publication
|
|
91
|
-
|
|
92
|
-
```bash
|
|
93
|
-
npm view @customer-support-success/pylon-mcp-server version
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
## Troubleshooting
|
|
97
|
-
|
|
98
|
-
### Authentication Issues
|
|
99
|
-
|
|
100
|
-
If npm publish fails locally, ensure you use the trusted publisher workflow or a granular access token with publish rights and 2FA bypass. For installs, no auth is required (public package).
|
|
101
|
-
|
|
102
|
-
## Files Created/Modified
|
|
103
|
-
|
|
104
|
-
None (documentation only).
|
|
105
|
-
|
|
106
|
-
## Notes
|
|
107
|
-
|
|
108
|
-
- Package is public on npm; no auth required for consumers.
|
|
109
|
-
- Publishing is handled by GitHub Actions via npm Trusted Publishing (OIDC). Manual publishes should be rare.
|
package/SECURITY_AUDIT_REPORT.md
DELETED
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
# Security & Compliance Audit Report
|
|
2
|
-
|
|
3
|
-
## Pylon MCP Server
|
|
4
|
-
|
|
5
|
-
**Date:** December 4, 2025
|
|
6
|
-
**Auditor:** Automated Security Analysis
|
|
7
|
-
**Scope:** Pre-publication security, PII, and SOC-2 compliance review
|
|
8
|
-
**Status:** ✅ **PASSED - SAFE FOR PUBLIC RELEASE**
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Executive Summary
|
|
13
|
-
|
|
14
|
-
The Pylon MCP Server codebase has been thoroughly analyzed for security vulnerabilities, personally identifiable information (PII), and SOC-2 compliance concerns. **The repository is safe to make public** with no critical issues found.
|
|
15
|
-
|
|
16
|
-
### Key Findings:
|
|
17
|
-
|
|
18
|
-
- ✅ **No hardcoded secrets or API keys**
|
|
19
|
-
- ✅ **No PII in codebase or documentation**
|
|
20
|
-
- ✅ **Zero npm dependency vulnerabilities**
|
|
21
|
-
- ✅ **Proper secret management via environment variables**
|
|
22
|
-
- ✅ **Comprehensive .gitignore protection**
|
|
23
|
-
- ⚠️ **Minor:** .npmrc configuration warning (non-blocking)
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Detailed Analysis
|
|
28
|
-
|
|
29
|
-
### 1. Secrets & Credentials Scan ✅ PASS
|
|
30
|
-
|
|
31
|
-
**Scope:** All source files, configuration files, and documentation
|
|
32
|
-
|
|
33
|
-
**Findings:**
|
|
34
|
-
|
|
35
|
-
- ✅ No hardcoded API keys, tokens, or passwords found
|
|
36
|
-
- ✅ All sensitive values use environment variables (`PYLON_API_TOKEN`)
|
|
37
|
-
- ✅ `.env.example` contains only placeholder values
|
|
38
|
-
- ✅ `.npmrc` uses environment variable substitution (`${ARTIFACT_REGISTRY_TOKEN}`) for local/manual publishing; CI uses short-lived access tokens from `GCP_CREDENTIALS`
|
|
39
|
-
- ✅ No secrets in git history
|
|
40
|
-
|
|
41
|
-
**Files Reviewed:**
|
|
42
|
-
|
|
43
|
-
- `src/index.ts` - Uses `process.env.PYLON_API_TOKEN`
|
|
44
|
-
- `src/pylon-client.ts` - Accepts token via constructor parameter
|
|
45
|
-
- `.env.example` - Contains only example placeholder
|
|
46
|
-
- `.npmrc` - Uses `${ARTIFACT_REGISTRY_TOKEN}` variable
|
|
47
|
-
- All configuration files
|
|
48
|
-
|
|
49
|
-
**Recommendation:** ✅ No action required
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
### 2. PII (Personally Identifiable Information) Scan ✅ PASS
|
|
54
|
-
|
|
55
|
-
**Scope:** Documentation, comments, example data, and code
|
|
56
|
-
|
|
57
|
-
**Findings:**
|
|
58
|
-
|
|
59
|
-
- ✅ No real email addresses (only examples: `customer@example.com`, `your-email@example.com`)
|
|
60
|
-
- ✅ No phone numbers
|
|
61
|
-
- ✅ No physical addresses
|
|
62
|
-
- ✅ No names of real individuals
|
|
63
|
-
- ✅ All examples use generic placeholders
|
|
64
|
-
|
|
65
|
-
**Files Reviewed:**
|
|
66
|
-
|
|
67
|
-
- `README.md` - Only example emails found
|
|
68
|
-
- `CLAUDE.md` - No PII
|
|
69
|
-
- `GCP_SETUP.md` - Only placeholder emails
|
|
70
|
-
- `src/` directory - No PII in code or comments
|
|
71
|
-
|
|
72
|
-
**Recommendation:** ✅ No action required
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
### 3. Dependency Vulnerability Scan ✅ PASS
|
|
77
|
-
|
|
78
|
-
**Initial State:**
|
|
79
|
-
|
|
80
|
-
- 9 vulnerabilities found (1 moderate, 4 high, 3 critical)
|
|
81
|
-
- Issues in: `@modelcontextprotocol/sdk`, `axios`, `body-parser`, `form-data`, `js-yaml`, `uglify-js`, `build`
|
|
82
|
-
|
|
83
|
-
**Actions Taken:**
|
|
84
|
-
|
|
85
|
-
- Ran `npm audit fix` - Updated vulnerable packages
|
|
86
|
-
- Removed accidental `build` dependency (source of most vulnerabilities)
|
|
87
|
-
|
|
88
|
-
**Final State:**
|
|
89
|
-
|
|
90
|
-
- ✅ **0 vulnerabilities**
|
|
91
|
-
- All dependencies updated to secure versions
|
|
92
|
-
- 109 packages audited
|
|
93
|
-
|
|
94
|
-
**Current Dependencies:**
|
|
95
|
-
|
|
96
|
-
```json
|
|
97
|
-
{
|
|
98
|
-
"@modelcontextprotocol/sdk": "^1.0.0", // Updated to latest
|
|
99
|
-
"axios": "^1.6.0" // Updated to latest
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**Recommendation:** ✅ No action required. Continue monitoring with `npm audit` regularly.
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
### 4. Secret Management & Access Control ✅ PASS
|
|
108
|
-
|
|
109
|
-
**Environment Variables:**
|
|
110
|
-
|
|
111
|
-
- `PYLON_API_TOKEN` - Required for Pylon API access
|
|
112
|
-
- `NPM_TOKEN` - npm token used by CI for publishing to npmjs
|
|
113
|
-
- `ARTIFACT_REGISTRY_TOKEN` - Local/manual publishing token (derived from `gcloud auth application-default print-access-token`)
|
|
114
|
-
|
|
115
|
-
**Protection Mechanisms:**
|
|
116
|
-
|
|
117
|
-
- ✅ `.gitignore` excludes all `.env*` files (except `.env.example`)
|
|
118
|
-
- ✅ `.npmignore` excludes sensitive development files
|
|
119
|
-
- ✅ No secrets in published npm package
|
|
120
|
-
- ✅ Clear documentation on required environment variables
|
|
121
|
-
|
|
122
|
-
**Recommendation:** ✅ No action required
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
### 5. SOC-2 Compliance Considerations ✅ PASS
|
|
127
|
-
|
|
128
|
-
**Data Handling:**
|
|
129
|
-
|
|
130
|
-
- ✅ No data storage - server acts as API proxy only
|
|
131
|
-
- ✅ No logging of sensitive information
|
|
132
|
-
- ✅ Authentication tokens passed via environment variables
|
|
133
|
-
- ✅ HTTPS-only communication with Pylon API (`https://api.usepylon.com`)
|
|
134
|
-
|
|
135
|
-
**Access Control:**
|
|
136
|
-
|
|
137
|
-
- ✅ API token required for all operations
|
|
138
|
-
- ✅ No default credentials
|
|
139
|
-
- ✅ Clear documentation on authentication requirements
|
|
140
|
-
|
|
141
|
-
**Audit Trail:**
|
|
142
|
-
|
|
143
|
-
- ✅ All API calls go through centralized `PylonClient` class
|
|
144
|
-
- ✅ Error handling doesn't expose sensitive data
|
|
145
|
-
- ✅ No client-side data caching
|
|
146
|
-
|
|
147
|
-
**Recommendation:** ✅ Compliant for public release
|
|
148
|
-
|
|
149
|
-
---
|
|
150
|
-
|
|
151
|
-
### 6. Code Quality & Security Best Practices ✅ PASS
|
|
152
|
-
|
|
153
|
-
**TypeScript Usage:**
|
|
154
|
-
|
|
155
|
-
- ✅ Strict type checking enabled
|
|
156
|
-
- ✅ Proper interface definitions
|
|
157
|
-
- ✅ No use of `any` type in critical paths
|
|
158
|
-
|
|
159
|
-
**Error Handling:**
|
|
160
|
-
|
|
161
|
-
- ✅ Try-catch blocks around all API calls
|
|
162
|
-
- ✅ Errors don't expose internal details
|
|
163
|
-
- ✅ Proper error messages for missing configuration
|
|
164
|
-
|
|
165
|
-
**Input Validation:**
|
|
166
|
-
|
|
167
|
-
- ✅ Required parameters validated before API calls
|
|
168
|
-
- ✅ Type safety through TypeScript interfaces
|
|
169
|
-
- ✅ MCP SDK handles input schema validation
|
|
170
|
-
|
|
171
|
-
**Recommendation:** ✅ No action required
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
## Minor Issues & Warnings
|
|
176
|
-
|
|
177
|
-
### ⚠️ npm Configuration Warning (Non-blocking)
|
|
178
|
-
|
|
179
|
-
- npm may warn about `always-auth` in `.npmrc` in future npm versions; current behavior is unaffected. If npm deprecates it, remove the `always-auth` line.
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## Files Safe for Public Release
|
|
184
|
-
|
|
185
|
-
### ✅ Source Code
|
|
186
|
-
|
|
187
|
-
- `src/index.ts`
|
|
188
|
-
- `src/pylon-client.ts`
|
|
189
|
-
|
|
190
|
-
### ✅ Configuration
|
|
191
|
-
|
|
192
|
-
- `package.json`
|
|
193
|
-
- `tsconfig.json`
|
|
194
|
-
- `.gitignore`
|
|
195
|
-
- `.npmignore`
|
|
196
|
-
- `.env.example`
|
|
197
|
-
|
|
198
|
-
### ✅ Documentation
|
|
199
|
-
|
|
200
|
-
- `README.md`
|
|
201
|
-
- `CLAUDE.md`
|
|
202
|
-
- `GCP_SETUP.md`
|
|
203
|
-
- `LICENSE`
|
|
204
|
-
|
|
205
|
-
### ✅ Build Artifacts
|
|
206
|
-
|
|
207
|
-
- `dist/` (generated, excluded from git)
|
|
208
|
-
|
|
209
|
-
### ⚠️ Consider Excluding (Optional)
|
|
210
|
-
|
|
211
|
-
- `.npmrc` - Contains GCP-specific registry config (consider making it local-only)
|
|
212
|
-
- `publish.sh` - Publishing script (consider making it maintainer-only)
|
|
213
|
-
- `.idea/` - IDE settings (already in .gitignore)
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## Recommendations for Public Repository
|
|
218
|
-
|
|
219
|
-
### Before Making Public:
|
|
220
|
-
|
|
221
|
-
1. ✅ **Remove GCP-specific files** (optional but recommended):
|
|
222
|
-
|
|
223
|
-
```bash
|
|
224
|
-
git rm --cached .npmrc
|
|
225
|
-
git rm --cached publish.sh
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
2. ✅ **Add SECURITY.md** for responsible disclosure
|
|
229
|
-
3. ✅ **Add CONTRIBUTING.md** for contribution guidelines
|
|
230
|
-
4. ✅ **Consider adding GitHub Actions** for automated security scanning
|
|
231
|
-
|
|
232
|
-
### After Making Public:
|
|
233
|
-
|
|
234
|
-
1. Enable GitHub security features:
|
|
235
|
-
- Dependabot alerts
|
|
236
|
-
- Code scanning
|
|
237
|
-
- Secret scanning
|
|
238
|
-
|
|
239
|
-
2. Set up automated npm audit in CI/CD
|
|
240
|
-
|
|
241
|
-
3. Add security policy to README
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## Conclusion
|
|
246
|
-
|
|
247
|
-
✅ **APPROVED FOR PUBLIC RELEASE**
|
|
248
|
-
|
|
249
|
-
The Pylon MCP Server repository contains no sensitive information, PII, or security vulnerabilities. All secrets are properly managed through environment variables, and the codebase follows security best practices.
|
|
250
|
-
|
|
251
|
-
**Risk Level:** LOW
|
|
252
|
-
**Confidence:** HIGH
|
|
253
|
-
**Recommendation:** Safe to make repository public immediately
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Audit Checklist
|
|
258
|
-
|
|
259
|
-
- [x] Source code scanned for hardcoded secrets
|
|
260
|
-
- [x] Configuration files reviewed
|
|
261
|
-
- [x] Documentation checked for PII
|
|
262
|
-
- [x] Dependencies scanned for vulnerabilities
|
|
263
|
-
- [x] Git history checked for leaked secrets
|
|
264
|
-
- [x] Environment variable usage verified
|
|
265
|
-
- [x] .gitignore coverage confirmed
|
|
266
|
-
- [x] Error handling reviewed
|
|
267
|
-
- [x] API communication security verified
|
|
268
|
-
- [x] SOC-2 compliance considerations addressed
|
|
269
|
-
|
|
270
|
-
**Audit Completed:** December 4, 2025
|
package/smithery.yaml
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml
|
|
2
|
-
|
|
3
|
-
startCommand:
|
|
4
|
-
type: stdio
|
|
5
|
-
configSchema:
|
|
6
|
-
# JSON Schema defining the configuration options for the MCP.
|
|
7
|
-
type: object
|
|
8
|
-
required:
|
|
9
|
-
- pylonApiToken
|
|
10
|
-
properties:
|
|
11
|
-
pylonApiToken:
|
|
12
|
-
type: string
|
|
13
|
-
description: The API key for the Pylon MCP server.
|
|
14
|
-
secret: true
|
|
15
|
-
required: true
|
|
16
|
-
commandFunction: |-
|
|
17
|
-
config => ({ command: 'node', args: ['dist/index.js'], env: { PYLON_API_TOKEN: config.pylonApiToken } })
|