@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.
- package/data/connectwise_api.db +0 -0
- package/data/manage.json +298179 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/analytics-extended.d.ts +6 -0
- package/dist/operations/analytics-extended.d.ts.map +1 -0
- package/dist/operations/analytics-extended.js +825 -0
- package/dist/operations/analytics-extended.js.map +1 -0
- package/dist/operations/analytics-msp-assets.d.ts +3 -0
- package/dist/operations/analytics-msp-assets.d.ts.map +1 -0
- package/dist/operations/analytics-msp-assets.js +180 -0
- package/dist/operations/analytics-msp-assets.js.map +1 -0
- package/dist/operations/analytics-msp-clients.d.ts +3 -0
- package/dist/operations/analytics-msp-clients.d.ts.map +1 -0
- package/dist/operations/analytics-msp-clients.js +198 -0
- package/dist/operations/analytics-msp-clients.js.map +1 -0
- package/dist/operations/analytics-msp-comms.d.ts +3 -0
- package/dist/operations/analytics-msp-comms.d.ts.map +1 -0
- package/dist/operations/analytics-msp-comms.js +127 -0
- package/dist/operations/analytics-msp-comms.js.map +1 -0
- package/dist/operations/analytics-msp-contracts.d.ts +3 -0
- package/dist/operations/analytics-msp-contracts.d.ts.map +1 -0
- package/dist/operations/analytics-msp-contracts.js +91 -0
- package/dist/operations/analytics-msp-contracts.js.map +1 -0
- package/dist/operations/analytics-msp-financial.d.ts +3 -0
- package/dist/operations/analytics-msp-financial.d.ts.map +1 -0
- package/dist/operations/analytics-msp-financial.js +300 -0
- package/dist/operations/analytics-msp-financial.js.map +1 -0
- package/dist/operations/analytics-msp-procurement.d.ts +3 -0
- package/dist/operations/analytics-msp-procurement.d.ts.map +1 -0
- package/dist/operations/analytics-msp-procurement.js +78 -0
- package/dist/operations/analytics-msp-procurement.js.map +1 -0
- package/dist/operations/analytics-msp-projects.d.ts +3 -0
- package/dist/operations/analytics-msp-projects.d.ts.map +1 -0
- package/dist/operations/analytics-msp-projects.js +190 -0
- package/dist/operations/analytics-msp-projects.js.map +1 -0
- package/dist/operations/analytics-msp-sales.d.ts +3 -0
- package/dist/operations/analytics-msp-sales.d.ts.map +1 -0
- package/dist/operations/analytics-msp-sales.js +99 -0
- package/dist/operations/analytics-msp-sales.js.map +1 -0
- package/dist/operations/analytics-msp-schedule.d.ts +3 -0
- package/dist/operations/analytics-msp-schedule.d.ts.map +1 -0
- package/dist/operations/analytics-msp-schedule.js +339 -0
- package/dist/operations/analytics-msp-schedule.js.map +1 -0
- package/dist/operations/analytics-msp-team.d.ts +3 -0
- package/dist/operations/analytics-msp-team.d.ts.map +1 -0
- package/dist/operations/analytics-msp-team.js +195 -0
- package/dist/operations/analytics-msp-team.js.map +1 -0
- package/dist/operations/analytics-msp-tickets.d.ts +3 -0
- package/dist/operations/analytics-msp-tickets.d.ts.map +1 -0
- package/dist/operations/analytics-msp-tickets.js +578 -0
- package/dist/operations/analytics-msp-tickets.js.map +1 -0
- package/dist/operations/analytics-msp-time.d.ts +3 -0
- package/dist/operations/analytics-msp-time.d.ts.map +1 -0
- package/dist/operations/analytics-msp-time.js +485 -0
- package/dist/operations/analytics-msp-time.js.map +1 -0
- package/dist/operations/analytics-msp-utils.d.ts +49 -0
- package/dist/operations/analytics-msp-utils.d.ts.map +1 -0
- package/dist/operations/analytics-msp-utils.js +157 -0
- package/dist/operations/analytics-msp-utils.js.map +1 -0
- package/dist/operations/analytics.d.ts +9 -0
- package/dist/operations/analytics.d.ts.map +1 -0
- package/dist/operations/analytics.js +742 -0
- package/dist/operations/analytics.js.map +1 -0
- package/dist/operations/executor.d.ts +10 -0
- package/dist/operations/executor.d.ts.map +1 -0
- package/dist/operations/executor.js +243 -0
- package/dist/operations/executor.js.map +1 -0
- package/dist/operations/registry.d.ts +16 -0
- package/dist/operations/registry.d.ts.map +1 -0
- package/dist/operations/registry.js +847 -0
- package/dist/operations/registry.js.map +1 -0
- package/dist/services/api-database.d.ts +38 -0
- package/dist/services/api-database.d.ts.map +1 -0
- package/dist/services/api-database.js +191 -0
- package/dist/services/api-database.js.map +1 -0
- package/dist/services/cache.d.ts +12 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +32 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/connectwise-api.d.ts +43 -0
- package/dist/services/connectwise-api.d.ts.map +1 -0
- package/dist/services/connectwise-api.js +198 -0
- package/dist/services/connectwise-api.js.map +1 -0
- package/dist/services/db-builder.d.ts +11 -0
- package/dist/services/db-builder.d.ts.map +1 -0
- package/dist/services/db-builder.js +237 -0
- package/dist/services/db-builder.js.map +1 -0
- package/dist/services/fast-memory.d.ts +39 -0
- package/dist/services/fast-memory.d.ts.map +1 -0
- package/dist/services/fast-memory.js +147 -0
- package/dist/services/fast-memory.js.map +1 -0
- package/dist/services/load-env.d.ts +15 -0
- package/dist/services/load-env.d.ts.map +1 -0
- package/dist/services/load-env.js +59 -0
- package/dist/services/load-env.js.map +1 -0
- package/dist/tools/batch.d.ts +9 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +159 -0
- package/dist/tools/batch.js.map +1 -0
- package/dist/tools/composite.d.ts +9 -0
- package/dist/tools/composite.d.ts.map +1 -0
- package/dist/tools/composite.js +353 -0
- package/dist/tools/composite.js.map +1 -0
- package/dist/tools/discovery.d.ts +9 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +245 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/execution.d.ts +9 -0
- package/dist/tools/execution.d.ts.map +1 -0
- package/dist/tools/execution.js +130 -0
- package/dist/tools/execution.js.map +1 -0
- package/dist/tools/memory.d.ts +9 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +152 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/operations.d.ts +9 -0
- package/dist/tools/operations.d.ts.map +1 -0
- package/dist/tools/operations.js +214 -0
- package/dist/tools/operations.js.map +1 -0
- package/dist/tools/pagination.d.ts +9 -0
- package/dist/tools/pagination.d.ts.map +1 -0
- package/dist/tools/pagination.js +133 -0
- package/dist/tools/pagination.js.map +1 -0
- package/dist/tools/validation.d.ts +9 -0
- package/dist/tools/validation.d.ts.map +1 -0
- package/dist/tools/validation.js +705 -0
- package/dist/tools/validation.js.map +1 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/operations.d.ts +30 -0
- package/dist/types/operations.d.ts.map +1 -0
- package/dist/types/operations.js +3 -0
- package/dist/types/operations.js.map +1 -0
- package/dist/utils/conditions.d.ts +20 -0
- package/dist/utils/conditions.d.ts.map +1 -0
- package/dist/utils/conditions.js +78 -0
- package/dist/utils/conditions.js.map +1 -0
- package/dist/utils/formatters.d.ts +35 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +337 -0
- package/dist/utils/formatters.js.map +1 -0
- 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
|
+
}
|