untrap-mcp 0.4.9 → 0.4.11

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/dist/server.js CHANGED
@@ -479,11 +479,11 @@ export function createServer(mspId, scopes = ["all"]) {
479
479
 
480
480
  SCHEMA:
481
481
  - ticket_lifecycle (tl): ticket_id, msp_id, company_name, summary, status, priority_name, owner_name, board_name, agreement_type, entered_date, responded_date, closed_date, resolution_minutes, response_minutes, is_closed, is_resolved, sla_status
482
- - time_entries: ticket_id, msp_id, member_name, actual_hours, billable_hours, hourly_rate, date_worked, notes_text
482
+ - time_entries: ticket_id, msp_id, time_start, time_end, actual_hours, billable_hours, non_billable_hours, work_type, work_role, member_identifier, member_name, hourly_rate, total_cost, company, department, ticket_board
483
483
  - companies: company_id, msp_id, company_name, status, use_client
484
484
  - technicians: msp_id, technician_name, member_identifier, level, hourly_rate
485
- - ticket_notes_sentiment: ticket_id, msp_id, text, sentiment_score, created_at
486
- - ticket_ai_regen: ticket_id, msp_id, problem_statement, ai_summary, ticket_classification, root_cause
485
+ - ticket_notes_sentiment: ticket_id, msp_id, sentiment_score, experience_score, note_count, resolution_minutes, response_minutes, priority_norm, created_at
486
+ - ticket_ai_regen: ticket_id, msp_id, problem_summary, ticket_categorization, root_cause_analysis, technician, client_name, created_at
487
487
  - analytics.client_health_scores_mv: msp_id, company_name, health_score, status_color, risk_level, ticket_count, total_cost, period_start, period_end
488
488
  - analytics.technician_dq_leaderboard_daily: msp_id, technician_name, quality_points, completeness_points, accuracy_points, timeliness_points, detail_quality_points, unique_tickets, calculation_date
489
489
  - analytics.msp_pattern_analysis_rls: msp_id, pattern_name, ticket_count, affected_clients, root_cause_category
@@ -15,11 +15,11 @@ export async function explainBudgetOverage(mspId, params) {
15
15
  tl.resolution_minutes
16
16
  FROM ticket_lifecycle tl
17
17
  WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
18
- queryRLS(`SELECT budget_hours, actual_hours, hours_over_budget, pct_over_budget,
18
+ queryRLS(`SELECT ticket_budget_hours, actual_hours, hours_over_budget, percent_over_budget,
19
19
  member_name
20
20
  FROM analytics.technician_ticket_budget_mv
21
21
  WHERE msp_id = $1 AND ticket_id = $2 AND member_identifier = $3`, [mspId, params.ticketId, params.memberIdentifier], mspId),
22
- queryRLS(`SELECT text, created_at::text
22
+ queryRLS(`SELECT sentiment_score, experience_score, note_count, created_at::text
23
23
  FROM ticket_notes_sentiment
24
24
  WHERE msp_id = $1 AND ticket_id = $2
25
25
  ORDER BY created_at ASC
@@ -9,10 +9,10 @@ export async function explainSlaVariance(mspId, params) {
9
9
  tl.sla_status, tl.entered_date::text, tl.responded_date::text, tl.closed_date::text
10
10
  FROM ticket_lifecycle tl
11
11
  WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
12
- queryRLS(`SELECT member_name, actual_hours, date_worked::text, notes_text
12
+ queryRLS(`SELECT member_name, actual_hours, time_start::text, work_type
13
13
  FROM time_entries
14
14
  WHERE msp_id = $1 AND ticket_id = $2
15
- ORDER BY date_worked ASC`, [mspId, params.ticketId], mspId),
15
+ ORDER BY time_start ASC`, [mspId, params.ticketId], mspId),
16
16
  ]);
17
17
  if (ticket.length === 0) {
18
18
  return { ticket: null, time_entries: [] };
@@ -1 +1 @@
1
- {"version":3,"file":"explain-sla.js","sourceRoot":"","sources":["../../../src/tools/ai/explain-sla.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMpE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,MAAwB;IAExB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5F,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,QAAQ,CACN;;;;oDAI8C,EAAE,EAAE,EAClD,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QACD,QAAQ,CACN;;;gCAG0B,EAC1B,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjB,YAAY,EAAE,WAAW;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"explain-sla.js","sourceRoot":"","sources":["../../../src/tools/ai/explain-sla.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMpE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,MAAwB;IAExB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5F,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,QAAQ,CACN;;;;oDAI8C,EAAE,EAAE,EAClD,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QACD,QAAQ,CACN;;;+BAGyB,EACzB,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;KACF,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjB,YAAY,EAAE,WAAW;KAC1B,CAAC;AACJ,CAAC"}
@@ -19,7 +19,7 @@ export async function getTicketsOverBudget(mspId, params) {
19
19
  const result = await Promise.all(techSummary.map(async (tech) => {
20
20
  const tickets = await queryRLS(`SELECT ticket_id, summary, company_name, created_date::text,
21
21
  board_name, status,
22
- budget_hours as ticket_budget_hours,
22
+ ticket_budget_hours,
23
23
  actual_hours, hours_over_budget,
24
24
  ROUND(percent_over_budget::numeric, 0)::int as percent_over_budget
25
25
  FROM analytics.technician_ticket_budget_mv
@@ -8,7 +8,7 @@ export async function cfoRevenuLeakage(mspId, params) {
8
8
  let outOfScope = [];
9
9
  try {
10
10
  outOfScope = await queryRLS(`SELECT bc.ticket_id, bc.company_name, bc.ticket_summary, bc.billable_amount,
11
- bc.actual_hours, bc.agreement_type, bc.resolved_date::text,
11
+ bc.agreement_type, bc.resolved_date::text,
12
12
  bc.reasoning
13
13
  FROM agents.billing_classifications bc
14
14
  WHERE bc.msp_id::uuid = $1::uuid
@@ -31,7 +31,7 @@ export async function getTechnician360(mspId, params) {
31
31
  // Budget overages
32
32
  queryRLS(`SELECT COUNT(*)::int as over_budget_tickets,
33
33
  SUM(hours_over_budget)::numeric as total_hours_over,
34
- AVG(pct_over_budget)::numeric as avg_pct_over
34
+ AVG(percent_over_budget)::numeric as avg_pct_over
35
35
  FROM analytics.technician_ticket_budget_mv
36
36
  WHERE msp_id = $1 AND LOWER(member_name) = LOWER($2)
37
37
  AND hours_over_budget > 0`, [mspId, params.technicianName], mspId),
@@ -14,25 +14,25 @@ export async function getTicketDeepDive(mspId, params) {
14
14
  FROM ticket_lifecycle tl
15
15
  WHERE tl.msp_id = $1 AND tl.ticket_id = $2 ${tf}`, [mspId, params.ticketId], mspId),
16
16
  // AI analysis
17
- queryRLS(`SELECT problem_statement as problem_summary, ai_summary,
18
- ticket_classification, root_cause as root_cause_analysis,
17
+ queryRLS(`SELECT problem_statement as problem_summary, problem_summary as ai_summary,
18
+ ticket_categorization as ticket_classification, root_cause_analysis,
19
19
  ticket_categorization
20
20
  FROM ticket_ai_regen
21
21
  WHERE msp_id = $1 AND ticket_id = $2`, [mspId, params.ticketId], mspId),
22
22
  // Time entries
23
23
  queryRLS(`SELECT member_name as technician, actual_hours, billable_hours,
24
24
  hourly_rate, (actual_hours * COALESCE(hourly_rate, 0))::numeric as cost,
25
- notes_text as description
25
+ work_type
26
26
  FROM time_entries te
27
27
  WHERE te.msp_id = $1 AND te.ticket_id = $2 ${tef}
28
- ORDER BY te.date_worked DESC`, [mspId, params.ticketId], mspId),
28
+ ORDER BY te.time_start DESC`, [mspId, params.ticketId], mspId),
29
29
  // Sentiment
30
30
  queryRLS(`SELECT AVG(sentiment_score)::numeric as avg_sentiment,
31
31
  COUNT(*)::int as note_count
32
32
  FROM ticket_notes_sentiment
33
33
  WHERE msp_id = $1 AND ticket_id = $2`, [mspId, params.ticketId], mspId),
34
34
  // Budget status
35
- queryRLS(`SELECT budget_hours, actual_hours, hours_over_budget, pct_over_budget
35
+ queryRLS(`SELECT ticket_budget_hours, actual_hours, hours_over_budget, percent_over_budget
36
36
  FROM analytics.technician_ticket_budget_mv
37
37
  WHERE msp_id = $1 AND ticket_id = $2
38
38
  LIMIT 1`, [mspId, params.ticketId], mspId),
@@ -1 +1 @@
1
- {"version":3,"file":"ticket-deep-dive.js","sourceRoot":"","sources":["../../../src/tools/composite/ticket-deep-dive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAM5F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,MAA4B;IAE5B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAE5C,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,GACvD,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,8DAA8D;QAC9D,QAAQ,CACN;;;;;;sDAM8C,EAAE,EAAE,EAClD,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,cAAc;QACd,QAAQ,CACN;;;;8CAIsC,EACtC,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,eAAe;QACf,QAAQ,CACN;;;;sDAI8C,GAAG;sCACnB,EAC9B,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,YAAY;QACZ,QAAQ,CACN;;;8CAGsC,EACtC,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,gBAAgB;QAChB,QAAQ,CACN;;;iBAGS,EACT,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;KACF,CAAC,CAAC;IAEL,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,MAAM,CAAC,QAAQ,YAAY,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI;QACjC,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,WAAW,CAAC,MAAM,CAC7B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAE,CAAC,CAAC,YAAuB,IAAI,CAAC,CAAC,EACnD,CAAC,CACF;QACD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI;QAC/B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ticket-deep-dive.js","sourceRoot":"","sources":["../../../src/tools/composite/ticket-deep-dive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAM5F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,MAA4B;IAE5B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAE5C,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,GACvD,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,8DAA8D;QAC9D,QAAQ,CACN;;;;;;sDAM8C,EAAE,EAAE,EAClD,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,cAAc;QACd,QAAQ,CACN;;;;8CAIsC,EACtC,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,eAAe;QACf,QAAQ,CACN;;;;sDAI8C,GAAG;qCACpB,EAC7B,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,YAAY;QACZ,QAAQ,CACN;;;8CAGsC,EACtC,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;QAED,gBAAgB;QAChB,QAAQ,CACN;;;iBAGS,EACT,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EACxB,KAAK,CACN;KACF,CAAC,CAAC;IAEL,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,MAAM,CAAC,QAAQ,YAAY,EAAE,CAAC;IAC3E,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI;QACjC,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,WAAW,CAAC,MAAM,CAC7B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAE,CAAC,CAAC,YAAuB,IAAI,CAAC,CAAC,EACnD,CAAC,CACF;QACD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI;QAC/B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;KAC1B,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "untrap-mcp",
3
- "version": "0.4.9",
3
+ "version": "0.4.11",
4
4
  "description": "Untrap MCP Server — AI-powered MSP analytics via Claude Desktop",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",