@goxtechnologies/connectwise-psa-mcp 1.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.
Files changed (147) hide show
  1. package/data/connectwise_api.db +0 -0
  2. package/data/manage.json +298179 -0
  3. package/dist/index.d.ts +10 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +116 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/operations/analytics-extended.d.ts +6 -0
  8. package/dist/operations/analytics-extended.d.ts.map +1 -0
  9. package/dist/operations/analytics-extended.js +825 -0
  10. package/dist/operations/analytics-extended.js.map +1 -0
  11. package/dist/operations/analytics-msp-assets.d.ts +3 -0
  12. package/dist/operations/analytics-msp-assets.d.ts.map +1 -0
  13. package/dist/operations/analytics-msp-assets.js +180 -0
  14. package/dist/operations/analytics-msp-assets.js.map +1 -0
  15. package/dist/operations/analytics-msp-clients.d.ts +3 -0
  16. package/dist/operations/analytics-msp-clients.d.ts.map +1 -0
  17. package/dist/operations/analytics-msp-clients.js +198 -0
  18. package/dist/operations/analytics-msp-clients.js.map +1 -0
  19. package/dist/operations/analytics-msp-comms.d.ts +3 -0
  20. package/dist/operations/analytics-msp-comms.d.ts.map +1 -0
  21. package/dist/operations/analytics-msp-comms.js +127 -0
  22. package/dist/operations/analytics-msp-comms.js.map +1 -0
  23. package/dist/operations/analytics-msp-contracts.d.ts +3 -0
  24. package/dist/operations/analytics-msp-contracts.d.ts.map +1 -0
  25. package/dist/operations/analytics-msp-contracts.js +91 -0
  26. package/dist/operations/analytics-msp-contracts.js.map +1 -0
  27. package/dist/operations/analytics-msp-financial.d.ts +3 -0
  28. package/dist/operations/analytics-msp-financial.d.ts.map +1 -0
  29. package/dist/operations/analytics-msp-financial.js +300 -0
  30. package/dist/operations/analytics-msp-financial.js.map +1 -0
  31. package/dist/operations/analytics-msp-procurement.d.ts +3 -0
  32. package/dist/operations/analytics-msp-procurement.d.ts.map +1 -0
  33. package/dist/operations/analytics-msp-procurement.js +78 -0
  34. package/dist/operations/analytics-msp-procurement.js.map +1 -0
  35. package/dist/operations/analytics-msp-projects.d.ts +3 -0
  36. package/dist/operations/analytics-msp-projects.d.ts.map +1 -0
  37. package/dist/operations/analytics-msp-projects.js +190 -0
  38. package/dist/operations/analytics-msp-projects.js.map +1 -0
  39. package/dist/operations/analytics-msp-sales.d.ts +3 -0
  40. package/dist/operations/analytics-msp-sales.d.ts.map +1 -0
  41. package/dist/operations/analytics-msp-sales.js +99 -0
  42. package/dist/operations/analytics-msp-sales.js.map +1 -0
  43. package/dist/operations/analytics-msp-schedule.d.ts +3 -0
  44. package/dist/operations/analytics-msp-schedule.d.ts.map +1 -0
  45. package/dist/operations/analytics-msp-schedule.js +339 -0
  46. package/dist/operations/analytics-msp-schedule.js.map +1 -0
  47. package/dist/operations/analytics-msp-team.d.ts +3 -0
  48. package/dist/operations/analytics-msp-team.d.ts.map +1 -0
  49. package/dist/operations/analytics-msp-team.js +195 -0
  50. package/dist/operations/analytics-msp-team.js.map +1 -0
  51. package/dist/operations/analytics-msp-tickets.d.ts +3 -0
  52. package/dist/operations/analytics-msp-tickets.d.ts.map +1 -0
  53. package/dist/operations/analytics-msp-tickets.js +578 -0
  54. package/dist/operations/analytics-msp-tickets.js.map +1 -0
  55. package/dist/operations/analytics-msp-time.d.ts +3 -0
  56. package/dist/operations/analytics-msp-time.d.ts.map +1 -0
  57. package/dist/operations/analytics-msp-time.js +485 -0
  58. package/dist/operations/analytics-msp-time.js.map +1 -0
  59. package/dist/operations/analytics-msp-utils.d.ts +49 -0
  60. package/dist/operations/analytics-msp-utils.d.ts.map +1 -0
  61. package/dist/operations/analytics-msp-utils.js +157 -0
  62. package/dist/operations/analytics-msp-utils.js.map +1 -0
  63. package/dist/operations/analytics.d.ts +9 -0
  64. package/dist/operations/analytics.d.ts.map +1 -0
  65. package/dist/operations/analytics.js +742 -0
  66. package/dist/operations/analytics.js.map +1 -0
  67. package/dist/operations/executor.d.ts +10 -0
  68. package/dist/operations/executor.d.ts.map +1 -0
  69. package/dist/operations/executor.js +243 -0
  70. package/dist/operations/executor.js.map +1 -0
  71. package/dist/operations/registry.d.ts +16 -0
  72. package/dist/operations/registry.d.ts.map +1 -0
  73. package/dist/operations/registry.js +847 -0
  74. package/dist/operations/registry.js.map +1 -0
  75. package/dist/services/api-database.d.ts +38 -0
  76. package/dist/services/api-database.d.ts.map +1 -0
  77. package/dist/services/api-database.js +191 -0
  78. package/dist/services/api-database.js.map +1 -0
  79. package/dist/services/cache.d.ts +12 -0
  80. package/dist/services/cache.d.ts.map +1 -0
  81. package/dist/services/cache.js +32 -0
  82. package/dist/services/cache.js.map +1 -0
  83. package/dist/services/connectwise-api.d.ts +43 -0
  84. package/dist/services/connectwise-api.d.ts.map +1 -0
  85. package/dist/services/connectwise-api.js +198 -0
  86. package/dist/services/connectwise-api.js.map +1 -0
  87. package/dist/services/db-builder.d.ts +11 -0
  88. package/dist/services/db-builder.d.ts.map +1 -0
  89. package/dist/services/db-builder.js +237 -0
  90. package/dist/services/db-builder.js.map +1 -0
  91. package/dist/services/fast-memory.d.ts +39 -0
  92. package/dist/services/fast-memory.d.ts.map +1 -0
  93. package/dist/services/fast-memory.js +147 -0
  94. package/dist/services/fast-memory.js.map +1 -0
  95. package/dist/services/load-env.d.ts +15 -0
  96. package/dist/services/load-env.d.ts.map +1 -0
  97. package/dist/services/load-env.js +59 -0
  98. package/dist/services/load-env.js.map +1 -0
  99. package/dist/tools/batch.d.ts +9 -0
  100. package/dist/tools/batch.d.ts.map +1 -0
  101. package/dist/tools/batch.js +159 -0
  102. package/dist/tools/batch.js.map +1 -0
  103. package/dist/tools/composite.d.ts +9 -0
  104. package/dist/tools/composite.d.ts.map +1 -0
  105. package/dist/tools/composite.js +353 -0
  106. package/dist/tools/composite.js.map +1 -0
  107. package/dist/tools/discovery.d.ts +9 -0
  108. package/dist/tools/discovery.d.ts.map +1 -0
  109. package/dist/tools/discovery.js +245 -0
  110. package/dist/tools/discovery.js.map +1 -0
  111. package/dist/tools/execution.d.ts +9 -0
  112. package/dist/tools/execution.d.ts.map +1 -0
  113. package/dist/tools/execution.js +130 -0
  114. package/dist/tools/execution.js.map +1 -0
  115. package/dist/tools/memory.d.ts +9 -0
  116. package/dist/tools/memory.d.ts.map +1 -0
  117. package/dist/tools/memory.js +152 -0
  118. package/dist/tools/memory.js.map +1 -0
  119. package/dist/tools/operations.d.ts +9 -0
  120. package/dist/tools/operations.d.ts.map +1 -0
  121. package/dist/tools/operations.js +214 -0
  122. package/dist/tools/operations.js.map +1 -0
  123. package/dist/tools/pagination.d.ts +9 -0
  124. package/dist/tools/pagination.d.ts.map +1 -0
  125. package/dist/tools/pagination.js +133 -0
  126. package/dist/tools/pagination.js.map +1 -0
  127. package/dist/tools/validation.d.ts +9 -0
  128. package/dist/tools/validation.d.ts.map +1 -0
  129. package/dist/tools/validation.js +705 -0
  130. package/dist/tools/validation.js.map +1 -0
  131. package/dist/types/index.d.ts +145 -0
  132. package/dist/types/index.d.ts.map +1 -0
  133. package/dist/types/index.js +3 -0
  134. package/dist/types/index.js.map +1 -0
  135. package/dist/types/operations.d.ts +30 -0
  136. package/dist/types/operations.d.ts.map +1 -0
  137. package/dist/types/operations.js +3 -0
  138. package/dist/types/operations.js.map +1 -0
  139. package/dist/utils/conditions.d.ts +20 -0
  140. package/dist/utils/conditions.d.ts.map +1 -0
  141. package/dist/utils/conditions.js +78 -0
  142. package/dist/utils/conditions.js.map +1 -0
  143. package/dist/utils/formatters.d.ts +35 -0
  144. package/dist/utils/formatters.d.ts.map +1 -0
  145. package/dist/utils/formatters.js +337 -0
  146. package/dist/utils/formatters.js.map +1 -0
  147. package/package.json +46 -0
@@ -0,0 +1,337 @@
1
+ // Pre-built markdown formatters for ConnectWise data
2
+ // Returns ready-to-display markdown — Claude doesn't need to reformat
3
+ // ---------------------------------------------------------------------------
4
+ // Ticket
5
+ // ---------------------------------------------------------------------------
6
+ export function formatTicket(ticket) {
7
+ const lines = [];
8
+ lines.push(`## Ticket #${ticket.id} — ${ticket.summary ?? 'No summary'}`);
9
+ lines.push('');
10
+ lines.push(`| Field | Value |`);
11
+ lines.push(`|-------|-------|`);
12
+ lines.push(`| **Status** | ${nested(ticket, 'status', 'name')} |`);
13
+ lines.push(`| **Board** | ${nested(ticket, 'board', 'name')} |`);
14
+ lines.push(`| **Company** | ${nested(ticket, 'company', 'name')} |`);
15
+ lines.push(`| **Contact** | ${nested(ticket, 'contact', 'name')} |`);
16
+ lines.push(`| **Priority** | ${nested(ticket, 'priority', 'name')} |`);
17
+ lines.push(`| **Type** | ${nested(ticket, 'type', 'name')} |`);
18
+ lines.push(`| **SubType** | ${nested(ticket, 'subType', 'name')} |`);
19
+ lines.push(`| **Source** | ${nested(ticket, 'source', 'name')} |`);
20
+ lines.push(`| **Assigned** | ${ticket.resources ?? 'Unassigned'} |`);
21
+ lines.push(`| **Created** | ${formatDate(ticket.dateEntered)} |`);
22
+ if (ticket.closedDate)
23
+ lines.push(`| **Closed** | ${formatDate(ticket.closedDate)} |`);
24
+ if (ticket.budgetHours)
25
+ lines.push(`| **Budget Hours** | ${ticket.budgetHours} |`);
26
+ if (ticket.actualHours)
27
+ lines.push(`| **Actual Hours** | ${ticket.actualHours} |`);
28
+ return lines.join('\n');
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // Ticket Context (full)
32
+ // ---------------------------------------------------------------------------
33
+ export function formatTicketContext(data) {
34
+ const lines = [];
35
+ const t = data.ticket;
36
+ // Ticket header
37
+ if (t && !('_error' in t)) {
38
+ lines.push(formatTicket(t));
39
+ }
40
+ // Notes
41
+ const notes = asArray(data.notes);
42
+ if (notes.length > 0) {
43
+ lines.push('');
44
+ lines.push(`### Notes (${notes.length})`);
45
+ for (const n of notes) {
46
+ const note = n;
47
+ const type = note.internalAnalysisFlag ? 'Internal' : note.detailDescriptionFlag ? 'External' : note.resolutionFlag ? 'Resolution' : 'Note';
48
+ const member = nested(note, 'member', 'name') || nested(note, 'member', 'identifier') || 'System';
49
+ lines.push(`\n**[${type}]** ${formatDate(note.dateCreated)} — ${member}`);
50
+ lines.push(`> ${truncateText(String(note.text ?? ''), 300)}`);
51
+ }
52
+ }
53
+ // Time Entries
54
+ const timeEntries = asArray(data.timeEntries);
55
+ if (timeEntries.length > 0) {
56
+ const totalHours = timeEntries.reduce((s, e) => s + (Number(e.actualHours) || 0), 0);
57
+ lines.push('');
58
+ lines.push(`### Time Entries (${timeEntries.length} — ${round2(totalHours)}h total)`);
59
+ lines.push(`| Date | Member | Hours | Notes |`);
60
+ lines.push(`|------|--------|-------|-------|`);
61
+ for (const e of timeEntries) {
62
+ const entry = e;
63
+ lines.push(`| ${formatDate(entry.dateEntered)} | ${nested(entry, 'member', 'identifier')} | ${entry.actualHours}h | ${truncateText(String(entry.notes ?? ''), 60)} |`);
64
+ }
65
+ }
66
+ // Tasks
67
+ const tasks = asArray(data.tasks);
68
+ if (tasks.length > 0) {
69
+ const done = tasks.filter(t => t.closedFlag).length;
70
+ lines.push('');
71
+ lines.push(`### Tasks (${done}/${tasks.length} complete)`);
72
+ for (const t of tasks) {
73
+ const task = t;
74
+ const check = task.closedFlag ? 'x' : ' ';
75
+ lines.push(`- [${check}] ${task.notes ?? task.summary ?? 'Task'}`);
76
+ }
77
+ }
78
+ // Documents
79
+ const docs = asArray(data.documents);
80
+ if (docs.length > 0) {
81
+ lines.push('');
82
+ lines.push(`### Documents (${docs.length})`);
83
+ for (const d of docs) {
84
+ const doc = d;
85
+ lines.push(`- ${doc.title ?? doc.fileName ?? 'Document'} (${formatDate(doc.dateCreated)})`);
86
+ }
87
+ }
88
+ // Schedule
89
+ const schedule = asArray(data.scheduleEntries);
90
+ if (schedule.length > 0) {
91
+ lines.push('');
92
+ lines.push(`### Schedule Entries (${schedule.length})`);
93
+ for (const s of schedule) {
94
+ const se = s;
95
+ lines.push(`- ${formatDate(se.dateStart)} → ${formatDate(se.dateEnd)}: ${nested(se, 'member', 'identifier') || 'TBD'} — ${nested(se, 'status', 'name') || 'Scheduled'}`);
96
+ }
97
+ }
98
+ return lines.join('\n');
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // Member Dashboard
102
+ // ---------------------------------------------------------------------------
103
+ export function formatMemberDashboard(data) {
104
+ const lines = [];
105
+ const memberArr = asArray(data.member);
106
+ const m = (memberArr[0] ?? data.member);
107
+ lines.push(`## ${m.firstName ?? ''} ${m.lastName ?? ''} (${m.identifier ?? 'unknown'})`);
108
+ lines.push('');
109
+ lines.push(`| Field | Value |`);
110
+ lines.push(`|-------|-------|`);
111
+ lines.push(`| **Title** | ${m.title ?? 'N/A'} |`);
112
+ lines.push(`| **Email** | ${m.officeEmail ?? m.email ?? 'N/A'} |`);
113
+ lines.push(`| **Phone** | ${m.officePhone ?? m.mobilePhone ?? 'N/A'} |`);
114
+ lines.push(`| **Department** | ${nested(m, 'defaultDepartment', 'name')} |`);
115
+ lines.push(`| **Work Role** | ${nested(m, 'workRole', 'name')} |`);
116
+ lines.push('');
117
+ const c = data._computed;
118
+ lines.push(`### Workload (last ${c.daysBack} days)`);
119
+ lines.push(`| Metric | Value |`);
120
+ lines.push(`|--------|-------|`);
121
+ lines.push(`| Open Tickets | ${c.openTicketCount ?? 'N/A'} |`);
122
+ lines.push(`| Hours Logged | ${c.totalTimeHours ?? 'N/A'}h |`);
123
+ lines.push(`| Hours Scheduled | ${c.scheduledHours ?? 'N/A'}h |`);
124
+ // Open tickets list
125
+ const tickets = asArray(data.openTickets);
126
+ if (tickets.length > 0) {
127
+ lines.push('');
128
+ lines.push(`### Open Tickets (${tickets.length})`);
129
+ lines.push(`| # | Summary | Priority | Company | Age |`);
130
+ lines.push(`|---|---------|----------|---------|-----|`);
131
+ for (const t of tickets.slice(0, 20)) {
132
+ const ticket = t;
133
+ const age = daysSince(ticket.dateEntered);
134
+ lines.push(`| ${ticket.id} | ${truncateText(String(ticket.summary ?? ''), 50)} | ${nested(ticket, 'priority', 'name')} | ${nested(ticket, 'company', 'name')} | ${age}d |`);
135
+ }
136
+ if (tickets.length > 20)
137
+ lines.push(`*... and ${tickets.length - 20} more*`);
138
+ }
139
+ return lines.join('\n');
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Agreement Health
143
+ // ---------------------------------------------------------------------------
144
+ export function formatAgreementHealth(data) {
145
+ const lines = [];
146
+ const a = data.agreement;
147
+ if (a && !('_error' in a)) {
148
+ lines.push(`## Agreement: ${a.name ?? 'Unnamed'}`);
149
+ lines.push('');
150
+ lines.push(`| Field | Value |`);
151
+ lines.push(`|-------|-------|`);
152
+ lines.push(`| **Company** | ${nested(a, 'company', 'name')} |`);
153
+ lines.push(`| **Type** | ${nested(a, 'type', 'name')} |`);
154
+ lines.push(`| **Start** | ${formatDate(a.startDate)} |`);
155
+ lines.push(`| **End** | ${formatDate(a.endDate)} |`);
156
+ lines.push(`| **Cancelled** | ${a.cancelledFlag ? 'Yes' : 'No'} |`);
157
+ lines.push(`| **Bill Amount** | $${a.billAmount ?? 0} |`);
158
+ }
159
+ const additions = asArray(data.additions);
160
+ if (additions.length > 0) {
161
+ lines.push('');
162
+ lines.push(`### Additions (${additions.length})`);
163
+ lines.push(`| Product | Qty | Amount | Cancelled |`);
164
+ lines.push(`|---------|-----|--------|-----------|`);
165
+ for (const ad of additions) {
166
+ const add = ad;
167
+ lines.push(`| ${nested(add, 'product', 'description') || add.description || 'N/A'} | ${add.quantity ?? 1} | $${add.billAmount ?? 0} | ${add.cancelledDate ? 'Yes' : 'No'} |`);
168
+ }
169
+ }
170
+ const roles = asArray(data.workRoles);
171
+ if (roles.length > 0) {
172
+ lines.push('');
173
+ lines.push(`### Work Roles (${roles.length})`);
174
+ for (const r of roles) {
175
+ const role = r;
176
+ lines.push(`- ${nested(role, 'workRole', 'name')}: $${role.rate ?? 0}/h (limit: ${role.limitTo ?? 'none'}h)`);
177
+ }
178
+ }
179
+ const types = asArray(data.workTypes);
180
+ if (types.length > 0) {
181
+ lines.push('');
182
+ lines.push(`### Work Types (${types.length})`);
183
+ for (const wt of types) {
184
+ const type = wt;
185
+ lines.push(`- ${nested(type, 'workType', 'name')}: $${type.rate ?? 0}/h`);
186
+ }
187
+ }
188
+ return lines.join('\n');
189
+ }
190
+ // ---------------------------------------------------------------------------
191
+ // List formatters (for cw_api_call / cw_paginated_fetch results)
192
+ // ---------------------------------------------------------------------------
193
+ export function formatTicketList(tickets) {
194
+ if (tickets.length === 0)
195
+ return 'No tickets found.';
196
+ const lines = [];
197
+ lines.push(`Found ${tickets.length} ticket(s):`);
198
+ lines.push('');
199
+ lines.push(`| # | Summary | Status | Company | Priority | Created |`);
200
+ lines.push(`|---|---------|--------|---------|----------|---------|`);
201
+ for (const t of tickets.slice(0, 50)) {
202
+ const ticket = t;
203
+ lines.push(`| ${ticket.id} | ${truncateText(String(ticket.summary ?? ''), 50)} | ${nested(ticket, 'status', 'name')} | ${nested(ticket, 'company', 'name')} | ${nested(ticket, 'priority', 'name')} | ${formatDate(ticket.dateEntered)} |`);
204
+ }
205
+ if (tickets.length > 50)
206
+ lines.push(`\n*... and ${tickets.length - 50} more*`);
207
+ return lines.join('\n');
208
+ }
209
+ export function formatContactList(contacts) {
210
+ if (contacts.length === 0)
211
+ return 'No contacts found.';
212
+ const lines = [];
213
+ lines.push(`Found ${contacts.length} contact(s):`);
214
+ lines.push('');
215
+ for (const c of contacts.slice(0, 20)) {
216
+ const contact = c;
217
+ lines.push(`### ${contact.firstName ?? ''} ${contact.lastName ?? ''}`);
218
+ lines.push(`- **Company**: ${nested(contact, 'company', 'name')}`);
219
+ lines.push(`- **Title**: ${contact.title ?? 'N/A'}`);
220
+ lines.push(`- **Email**: ${findCommItem(contact, 'Email')}`);
221
+ lines.push(`- **Phone**: ${findCommItem(contact, 'Phone')}`);
222
+ lines.push(`- **Status**: ${contact.inactiveFlag ? 'Inactive' : 'Active'}`);
223
+ lines.push('');
224
+ }
225
+ return lines.join('\n');
226
+ }
227
+ export function formatMemberList(members) {
228
+ if (members.length === 0)
229
+ return 'No members found.';
230
+ const lines = [];
231
+ lines.push(`| Identifier | Name | Title | Email |`);
232
+ lines.push(`|------------|------|-------|-------|`);
233
+ for (const m of members) {
234
+ const member = m;
235
+ lines.push(`| ${member.identifier} | ${member.firstName} ${member.lastName} | ${member.title ?? ''} | ${member.officeEmail ?? ''} |`);
236
+ }
237
+ return lines.join('\n');
238
+ }
239
+ // ---------------------------------------------------------------------------
240
+ // Smart formatter — detects data type and formats accordingly
241
+ // ---------------------------------------------------------------------------
242
+ export function smartFormat(path, data) {
243
+ if (Array.isArray(data)) {
244
+ if (data.length === 0)
245
+ return 'No results found.';
246
+ const first = data[0];
247
+ // Detect type by path or fields
248
+ if (path.includes('/tickets') && first.summary !== undefined)
249
+ return formatTicketList(data);
250
+ if (path.includes('/contacts') && first.firstName !== undefined)
251
+ return formatContactList(data);
252
+ if (path.includes('/members') && first.identifier !== undefined)
253
+ return formatMemberList(data);
254
+ // Generic table for small arrays with known keys
255
+ if (data.length <= 30)
256
+ return formatGenericTable(data);
257
+ // Large arrays — count + sample
258
+ return `Returned ${data.length} item(s). Showing first 10:\n\n${formatGenericTable(data.slice(0, 10))}`;
259
+ }
260
+ // Single object
261
+ if (typeof data === 'object' && data !== null) {
262
+ const obj = data;
263
+ if (obj.summary !== undefined && obj.board !== undefined)
264
+ return formatTicket(obj);
265
+ return JSON.stringify(data, null, 2);
266
+ }
267
+ return String(data);
268
+ }
269
+ function formatGenericTable(items) {
270
+ if (items.length === 0)
271
+ return '';
272
+ const first = items[0];
273
+ const keys = Object.keys(first).filter(k => {
274
+ const v = first[k];
275
+ return v !== null && typeof v !== 'object';
276
+ }).slice(0, 8);
277
+ if (keys.length === 0)
278
+ return JSON.stringify(items, null, 2);
279
+ const lines = [];
280
+ lines.push(`| ${keys.join(' | ')} |`);
281
+ lines.push(`| ${keys.map(() => '---').join(' | ')} |`);
282
+ for (const item of items) {
283
+ const obj = item;
284
+ lines.push(`| ${keys.map(k => truncateText(String(obj[k] ?? ''), 40)).join(' | ')} |`);
285
+ }
286
+ return lines.join('\n');
287
+ }
288
+ // ---------------------------------------------------------------------------
289
+ // Helpers
290
+ // ---------------------------------------------------------------------------
291
+ function nested(obj, field, subfield) {
292
+ const child = obj[field];
293
+ if (child && typeof child === 'object' && subfield in child) {
294
+ return String(child[subfield] ?? 'N/A');
295
+ }
296
+ return 'N/A';
297
+ }
298
+ function formatDate(iso) {
299
+ if (!iso)
300
+ return 'N/A';
301
+ return iso.substring(0, 10);
302
+ }
303
+ function truncateText(text, max) {
304
+ const clean = text.replace(/\n/g, ' ').trim();
305
+ if (clean.length <= max)
306
+ return clean;
307
+ return clean.substring(0, max - 3) + '...';
308
+ }
309
+ function round2(n) {
310
+ return Math.round(n * 100) / 100;
311
+ }
312
+ function daysSince(iso) {
313
+ if (!iso)
314
+ return 0;
315
+ return Math.floor((Date.now() - new Date(iso).getTime()) / 86400000);
316
+ }
317
+ function asArray(data) {
318
+ if (Array.isArray(data))
319
+ return data;
320
+ if (data && typeof data === 'object' && 'data' in data) {
321
+ const inner = data.data;
322
+ if (Array.isArray(inner))
323
+ return inner;
324
+ }
325
+ return [];
326
+ }
327
+ function findCommItem(contact, type) {
328
+ const items = contact.communicationItems;
329
+ if (!Array.isArray(items))
330
+ return 'N/A';
331
+ const item = items.find((i) => {
332
+ const ci = i;
333
+ return String(ci.communicationType ?? '').toLowerCase().includes(type.toLowerCase());
334
+ });
335
+ return item ? String(item.value ?? 'N/A') : 'N/A';
336
+ }
337
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/utils/formatters.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@goxtechnologies/connectwise-psa-mcp",
3
+ "version": "1.1.0",
4
+ "description": "ConnectWise PSA MCP server — 22 tools, 509 named operations, 72 analytics handlers",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "connectwise-psa-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "data/"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "build:db": "node dist/services/db-builder.js",
17
+ "prepublishOnly": "npm run build",
18
+ "start": "node dist/index.js",
19
+ "test": "node --import tsx --test tests/unit/*.test.ts",
20
+ "test:unit": "node --import tsx --test tests/unit/conditions.test.ts",
21
+ "test:validation": "node --import tsx --test tests/unit/validation.test.ts",
22
+ "test:db": "node --import tsx --test tests/unit/database.test.ts",
23
+ "test:integration": "node --import tsx --test tests/integration/*.test.ts",
24
+ "test:mcp": "node --import tsx --test tests/integration/mcp-protocol.test.ts"
25
+ },
26
+ "dependencies": {
27
+ "@modelcontextprotocol/sdk": "^1.12.1",
28
+ "better-sqlite3": "^11.0.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/better-sqlite3": "^7.6.0",
32
+ "@types/node": "^22.0.0",
33
+ "tsx": "^4.21.0",
34
+ "typescript": "^5.7.0"
35
+ },
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "author": "GOX Technologies",
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/jencryzthers/connectwise-psa-mcp"
44
+ },
45
+ "keywords": ["mcp", "connectwise", "psa", "msp", "manage"]
46
+ }