acuity-mcp-server 1.0.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 (99) hide show
  1. package/README.md +541 -0
  2. package/dist/auth/device-flow.d.ts +46 -0
  3. package/dist/auth/device-flow.d.ts.map +1 -0
  4. package/dist/auth/device-flow.js +141 -0
  5. package/dist/auth/device-flow.js.map +1 -0
  6. package/dist/auth/http-auth.d.ts +25 -0
  7. package/dist/auth/http-auth.d.ts.map +1 -0
  8. package/dist/auth/http-auth.js +101 -0
  9. package/dist/auth/http-auth.js.map +1 -0
  10. package/dist/auth/jwt-validator.d.ts +20 -0
  11. package/dist/auth/jwt-validator.d.ts.map +1 -0
  12. package/dist/auth/jwt-validator.js +83 -0
  13. package/dist/auth/jwt-validator.js.map +1 -0
  14. package/dist/auth/token-storage.d.ts +88 -0
  15. package/dist/auth/token-storage.d.ts.map +1 -0
  16. package/dist/auth/token-storage.js +273 -0
  17. package/dist/auth/token-storage.js.map +1 -0
  18. package/dist/clients/hasura-client.d.ts +33 -0
  19. package/dist/clients/hasura-client.d.ts.map +1 -0
  20. package/dist/clients/hasura-client.js +79 -0
  21. package/dist/clients/hasura-client.js.map +1 -0
  22. package/dist/config/environments.d.ts +51 -0
  23. package/dist/config/environments.d.ts.map +1 -0
  24. package/dist/config/environments.js +183 -0
  25. package/dist/config/environments.js.map +1 -0
  26. package/dist/index.d.ts +7 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +593 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/server/http-server.d.ts +14 -0
  31. package/dist/server/http-server.d.ts.map +1 -0
  32. package/dist/server/http-server.js +167 -0
  33. package/dist/server/http-server.js.map +1 -0
  34. package/dist/server/mcp-core.d.ts +12 -0
  35. package/dist/server/mcp-core.d.ts.map +1 -0
  36. package/dist/server/mcp-core.js +200 -0
  37. package/dist/server/mcp-core.js.map +1 -0
  38. package/dist/tools/acuity-init.d.ts +84 -0
  39. package/dist/tools/acuity-init.d.ts.map +1 -0
  40. package/dist/tools/acuity-init.js +239 -0
  41. package/dist/tools/acuity-init.js.map +1 -0
  42. package/dist/tools/get-dashboard-summary.d.ts +96 -0
  43. package/dist/tools/get-dashboard-summary.d.ts.map +1 -0
  44. package/dist/tools/get-dashboard-summary.js +264 -0
  45. package/dist/tools/get-dashboard-summary.js.map +1 -0
  46. package/dist/tools/get-issue.d.ts +62 -0
  47. package/dist/tools/get-issue.d.ts.map +1 -0
  48. package/dist/tools/get-issue.js +150 -0
  49. package/dist/tools/get-issue.js.map +1 -0
  50. package/dist/tools/get-lesson-learned.d.ts +53 -0
  51. package/dist/tools/get-lesson-learned.d.ts.map +1 -0
  52. package/dist/tools/get-lesson-learned.js +117 -0
  53. package/dist/tools/get-lesson-learned.js.map +1 -0
  54. package/dist/tools/get-lookup-values.d.ts +41 -0
  55. package/dist/tools/get-lookup-values.d.ts.map +1 -0
  56. package/dist/tools/get-lookup-values.js +127 -0
  57. package/dist/tools/get-lookup-values.js.map +1 -0
  58. package/dist/tools/get-project.d.ts +131 -0
  59. package/dist/tools/get-project.d.ts.map +1 -0
  60. package/dist/tools/get-project.js +340 -0
  61. package/dist/tools/get-project.js.map +1 -0
  62. package/dist/tools/get-risk.d.ts +65 -0
  63. package/dist/tools/get-risk.d.ts.map +1 -0
  64. package/dist/tools/get-risk.js +173 -0
  65. package/dist/tools/get-risk.js.map +1 -0
  66. package/dist/tools/get-status-reports.d.ts +46 -0
  67. package/dist/tools/get-status-reports.d.ts.map +1 -0
  68. package/dist/tools/get-status-reports.js +151 -0
  69. package/dist/tools/get-status-reports.js.map +1 -0
  70. package/dist/tools/init-auth.d.ts +47 -0
  71. package/dist/tools/init-auth.d.ts.map +1 -0
  72. package/dist/tools/init-auth.js +213 -0
  73. package/dist/tools/init-auth.js.map +1 -0
  74. package/dist/tools/list-issues.d.ts +134 -0
  75. package/dist/tools/list-issues.d.ts.map +1 -0
  76. package/dist/tools/list-issues.js +285 -0
  77. package/dist/tools/list-issues.js.map +1 -0
  78. package/dist/tools/list-lessons-learned.d.ts +79 -0
  79. package/dist/tools/list-lessons-learned.d.ts.map +1 -0
  80. package/dist/tools/list-lessons-learned.js +155 -0
  81. package/dist/tools/list-lessons-learned.js.map +1 -0
  82. package/dist/tools/list-projects.d.ts +200 -0
  83. package/dist/tools/list-projects.d.ts.map +1 -0
  84. package/dist/tools/list-projects.js +396 -0
  85. package/dist/tools/list-projects.js.map +1 -0
  86. package/dist/tools/list-risks.d.ts +166 -0
  87. package/dist/tools/list-risks.d.ts.map +1 -0
  88. package/dist/tools/list-risks.js +356 -0
  89. package/dist/tools/list-risks.js.map +1 -0
  90. package/dist/tools/search-projects.d.ts +90 -0
  91. package/dist/tools/search-projects.d.ts.map +1 -0
  92. package/dist/tools/search-projects.js +191 -0
  93. package/dist/tools/search-projects.js.map +1 -0
  94. package/dist/utils/formatters.d.ts +12 -0
  95. package/dist/utils/formatters.d.ts.map +1 -0
  96. package/dist/utils/formatters.js +28 -0
  97. package/dist/utils/formatters.js.map +1 -0
  98. package/openapi.yaml +194 -0
  99. package/package.json +68 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * MCP Tool: list_issues
3
+ * Lists all issues the user has access to with optional filtering
4
+ *
5
+ * Features:
6
+ * - Enum conversion: input strings → DB integers, DB integers → output strings
7
+ * - Hasura relationships: returns resolved names instead of IDs
8
+ * - Multiple filters: status, priority, severity, project_id
9
+ */
10
+ import type { HasuraClient } from '../clients/hasura-client.js';
11
+ export type IssueStatus = 'open' | 'closed' | 'resolved';
12
+ export type IssuePriority = 'very_low' | 'low' | 'medium' | 'high' | 'critical';
13
+ export interface ListIssuesInput {
14
+ project_id?: number;
15
+ status?: IssueStatus | IssueStatus[];
16
+ priority?: IssuePriority | IssuePriority[];
17
+ severity?: number | number[];
18
+ order_by?: 'priority' | 'severity' | 'created_at' | 'updated_at' | 'resolution_date';
19
+ limit?: number;
20
+ offset?: number;
21
+ }
22
+ export interface IssueListItem {
23
+ id: number;
24
+ issue_id: number;
25
+ name: string;
26
+ description: string | null;
27
+ notes: string | null;
28
+ hyperlinks: string | null;
29
+ status: IssueStatus;
30
+ priority: IssuePriority;
31
+ severity: number;
32
+ areas_of_impact: string | null;
33
+ action_plan: string | null;
34
+ resolution: string | null;
35
+ resolution_date: string | null;
36
+ created_at: string;
37
+ updated_at: string;
38
+ project: {
39
+ id: number;
40
+ name: string;
41
+ } | null;
42
+ owner: {
43
+ id: number;
44
+ name: string;
45
+ } | null;
46
+ }
47
+ export interface ListIssuesResult {
48
+ issues: IssueListItem[];
49
+ total_count: number;
50
+ has_more: boolean;
51
+ offset: number;
52
+ }
53
+ /**
54
+ * List issues handler
55
+ */
56
+ export declare function listIssues(input: ListIssuesInput, hasuraClient: HasuraClient): Promise<ListIssuesResult>;
57
+ export declare const listIssuesTool: {
58
+ name: string;
59
+ description: string;
60
+ inputSchema: {
61
+ type: string;
62
+ properties: {
63
+ project_id: {
64
+ type: string;
65
+ description: string;
66
+ };
67
+ status: {
68
+ oneOf: ({
69
+ type: string;
70
+ enum: string[];
71
+ items?: undefined;
72
+ } | {
73
+ type: string;
74
+ items: {
75
+ type: string;
76
+ enum: string[];
77
+ };
78
+ enum?: undefined;
79
+ })[];
80
+ description: string;
81
+ };
82
+ priority: {
83
+ oneOf: ({
84
+ type: string;
85
+ enum: string[];
86
+ items?: undefined;
87
+ } | {
88
+ type: string;
89
+ items: {
90
+ type: string;
91
+ enum: string[];
92
+ };
93
+ enum?: undefined;
94
+ })[];
95
+ description: string;
96
+ };
97
+ severity: {
98
+ oneOf: ({
99
+ type: string;
100
+ minimum: number;
101
+ maximum: number;
102
+ items?: undefined;
103
+ } | {
104
+ type: string;
105
+ items: {
106
+ type: string;
107
+ minimum: number;
108
+ maximum: number;
109
+ };
110
+ minimum?: undefined;
111
+ maximum?: undefined;
112
+ })[];
113
+ description: string;
114
+ };
115
+ order_by: {
116
+ type: string;
117
+ enum: string[];
118
+ description: string;
119
+ default: string;
120
+ };
121
+ limit: {
122
+ type: string;
123
+ description: string;
124
+ default: number;
125
+ };
126
+ offset: {
127
+ type: string;
128
+ description: string;
129
+ default: number;
130
+ };
131
+ };
132
+ };
133
+ };
134
+ //# sourceMappingURL=list-issues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-issues.d.ts","sourceRoot":"","sources":["../../src/tools/list-issues.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,aAAa,GAAG,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IAGjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7C,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAiID;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAkH3B;AAMD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyF1B,CAAC"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * MCP Tool: list_issues
3
+ * Lists all issues the user has access to with optional filtering
4
+ *
5
+ * Features:
6
+ * - Enum conversion: input strings → DB integers, DB integers → output strings
7
+ * - Hasura relationships: returns resolved names instead of IDs
8
+ * - Multiple filters: status, priority, severity, project_id
9
+ */
10
+ // ============================================================================
11
+ // Enum Mappings
12
+ // ============================================================================
13
+ /**
14
+ * Enum mappings: string → DB integer
15
+ * Verified against Rails model issue.rb
16
+ */
17
+ const STATUS_TO_DB = {
18
+ open: 0,
19
+ closed: 1,
20
+ resolved: 2
21
+ };
22
+ const PRIORITY_TO_DB = {
23
+ very_low: 0,
24
+ low: 1,
25
+ medium: 2,
26
+ high: 3,
27
+ critical: 4
28
+ };
29
+ /**
30
+ * Reverse mappings: DB integer → string
31
+ */
32
+ const DB_TO_STATUS = {
33
+ 0: 'open',
34
+ 1: 'closed',
35
+ 2: 'resolved'
36
+ };
37
+ const DB_TO_PRIORITY = {
38
+ 0: 'very_low',
39
+ 1: 'low',
40
+ 2: 'medium',
41
+ 3: 'high',
42
+ 4: 'critical'
43
+ };
44
+ // ============================================================================
45
+ // Helper Functions
46
+ // ============================================================================
47
+ /**
48
+ * Convert enum values to DB integers for WHERE clause
49
+ */
50
+ function toDbValues(values, mapping) {
51
+ if (values === undefined)
52
+ return undefined;
53
+ const arr = Array.isArray(values) ? values : [values];
54
+ return arr.map(v => mapping[v]).filter(n => n !== undefined);
55
+ }
56
+ /**
57
+ * Convert a single DB integer to string
58
+ */
59
+ function fromDbValue(value, mapping) {
60
+ if (value === null || value === undefined)
61
+ return null;
62
+ return mapping[value] ?? null;
63
+ }
64
+ /**
65
+ * Transform raw DB issue to formatted output with resolved enums
66
+ */
67
+ function transformIssue(raw) {
68
+ return {
69
+ id: raw.id,
70
+ issue_id: raw.issue_id,
71
+ name: raw.name,
72
+ description: raw.description,
73
+ notes: raw.notes,
74
+ hyperlinks: raw.hyperlinks,
75
+ // Convert enums from integers to strings
76
+ status: fromDbValue(raw.status, DB_TO_STATUS) ?? 'open',
77
+ priority: fromDbValue(raw.priority, DB_TO_PRIORITY) ?? 'low',
78
+ severity: raw.severity ?? 1,
79
+ areas_of_impact: raw.areas_of_impact,
80
+ action_plan: raw.action_plan,
81
+ resolution: raw.resolution,
82
+ resolution_date: raw.resolution_date,
83
+ created_at: raw.created_at,
84
+ updated_at: raw.updated_at,
85
+ // Relationships - transform company_project_resource to owner
86
+ project: raw.project,
87
+ owner: raw.company_project_resource
88
+ };
89
+ }
90
+ // ============================================================================
91
+ // Main Handler
92
+ // ============================================================================
93
+ /**
94
+ * List issues handler
95
+ */
96
+ export async function listIssues(input, hasuraClient) {
97
+ const { project_id, status, priority, severity, order_by = 'created_at', limit = 20, offset = 0 } = input;
98
+ // Build where conditions
99
+ const whereConditions = {};
100
+ // Project filter
101
+ if (project_id !== undefined) {
102
+ whereConditions.project_id = { _eq: project_id };
103
+ }
104
+ // Status filter
105
+ const statusValues = toDbValues(status, STATUS_TO_DB);
106
+ if (statusValues && statusValues.length > 0) {
107
+ whereConditions.status = statusValues.length === 1
108
+ ? { _eq: statusValues[0] }
109
+ : { _in: statusValues };
110
+ }
111
+ // Priority filter
112
+ const priorityValues = toDbValues(priority, PRIORITY_TO_DB);
113
+ if (priorityValues && priorityValues.length > 0) {
114
+ whereConditions.priority = priorityValues.length === 1
115
+ ? { _eq: priorityValues[0] }
116
+ : { _in: priorityValues };
117
+ }
118
+ // Severity filter (integer, not enum)
119
+ if (severity !== undefined) {
120
+ const severityArr = Array.isArray(severity) ? severity : [severity];
121
+ if (severityArr.length === 1) {
122
+ whereConditions.severity = { _eq: severityArr[0] };
123
+ }
124
+ else if (severityArr.length > 1) {
125
+ whereConditions.severity = { _in: severityArr };
126
+ }
127
+ }
128
+ // Build order_by clause
129
+ let orderByClause = '{ created_at: desc }';
130
+ switch (order_by) {
131
+ case 'priority':
132
+ orderByClause = '{ priority: desc }';
133
+ break;
134
+ case 'severity':
135
+ orderByClause = '{ severity: desc_nulls_last }';
136
+ break;
137
+ case 'updated_at':
138
+ orderByClause = '{ updated_at: desc }';
139
+ break;
140
+ case 'resolution_date':
141
+ orderByClause = '{ resolution_date: desc_nulls_last }';
142
+ break;
143
+ // 'created_at' is default
144
+ }
145
+ // Build GraphQL query with relationships
146
+ const whereClause = JSON.stringify(whereConditions).replace(/"([^"]+)":/g, '$1:');
147
+ const query = `
148
+ query ListIssues($limit: Int!, $offset: Int!) {
149
+ issues(
150
+ where: ${whereClause},
151
+ order_by: ${orderByClause},
152
+ limit: $limit,
153
+ offset: $offset
154
+ ) {
155
+ id
156
+ issue_id
157
+ name
158
+ description
159
+ notes
160
+ hyperlinks
161
+ status
162
+ priority
163
+ severity
164
+ areas_of_impact
165
+ action_plan
166
+ resolution
167
+ resolution_date
168
+ created_at
169
+ updated_at
170
+
171
+ # Relationships - Hasura resolves automatically
172
+ project { id name }
173
+ company_project_resource { id name }
174
+ }
175
+
176
+ issues_aggregate(where: ${whereClause}) {
177
+ aggregate {
178
+ count
179
+ }
180
+ }
181
+ }
182
+ `;
183
+ const result = await hasuraClient.query(query, { limit, offset });
184
+ const totalCount = result.issues_aggregate.aggregate.count;
185
+ const transformedIssues = result.issues.map(transformIssue);
186
+ return {
187
+ issues: transformedIssues,
188
+ total_count: totalCount,
189
+ has_more: offset + result.issues.length < totalCount,
190
+ offset
191
+ };
192
+ }
193
+ // ============================================================================
194
+ // Tool Definition
195
+ // ============================================================================
196
+ export const listIssuesTool = {
197
+ name: 'list_issues',
198
+ description: `
199
+ List issues the user has access to with optional filtering.
200
+
201
+ Returns issue information including:
202
+ - Identifiers: id, issue_id (human-readable within company)
203
+ - Content: name, description, notes, hyperlinks
204
+ - Status & Classification: status, priority, severity (1-5 integer)
205
+ - Action content: areas_of_impact, action_plan, resolution
206
+ - Dates: created_at, updated_at, resolution_date
207
+ - Relationships with NAMES: project, owner (the person responsible)
208
+
209
+ FILTER VALUES:
210
+
211
+ status: "open", "closed", "resolved"
212
+ - open = active issue being addressed
213
+ - closed = issue no longer relevant (not fixed)
214
+ - resolved = issue has been fixed/solved
215
+
216
+ priority: "very_low", "low", "medium", "high", "critical"
217
+ - Indicates importance/urgency of addressing the issue
218
+
219
+ severity: 1, 2, 3, 4, 5 (integer)
220
+ - 1 = minimal impact
221
+ - 5 = severe impact
222
+ - Note: This is an integer, not an enum like risks
223
+
224
+ SORTING:
225
+ - "created_at" (default) - newest first
226
+ - "updated_at" - recently updated first
227
+ - "priority" - highest priority first
228
+ - "severity" - highest severity first
229
+ - "resolution_date" - recently resolved first
230
+
231
+ EXAMPLES:
232
+ - "Show all open issues" → status: "open"
233
+ - "High priority issues" → priority: ["high", "critical"]
234
+ - "Issues for project 123" → project_id: 123
235
+ - "Severe issues (severity 4-5)" → severity: [4, 5]
236
+ - "Top 10 highest priority issues" → order_by: "priority", limit: 10
237
+ `.trim(),
238
+ inputSchema: {
239
+ type: 'object',
240
+ properties: {
241
+ project_id: {
242
+ type: 'number',
243
+ description: 'Filter by project ID'
244
+ },
245
+ status: {
246
+ oneOf: [
247
+ { type: 'string', enum: ['open', 'closed', 'resolved'] },
248
+ { type: 'array', items: { type: 'string', enum: ['open', 'closed', 'resolved'] } }
249
+ ],
250
+ description: 'Filter by issue status. Can be single value or array.'
251
+ },
252
+ priority: {
253
+ oneOf: [
254
+ { type: 'string', enum: ['very_low', 'low', 'medium', 'high', 'critical'] },
255
+ { type: 'array', items: { type: 'string', enum: ['very_low', 'low', 'medium', 'high', 'critical'] } }
256
+ ],
257
+ description: 'Filter by priority level'
258
+ },
259
+ severity: {
260
+ oneOf: [
261
+ { type: 'number', minimum: 1, maximum: 5 },
262
+ { type: 'array', items: { type: 'number', minimum: 1, maximum: 5 } }
263
+ ],
264
+ description: 'Filter by severity (1-5 integer). Can be single value or array.'
265
+ },
266
+ order_by: {
267
+ type: 'string',
268
+ enum: ['priority', 'severity', 'created_at', 'updated_at', 'resolution_date'],
269
+ description: 'Sort order',
270
+ default: 'created_at'
271
+ },
272
+ limit: {
273
+ type: 'number',
274
+ description: 'Maximum issues to return (default: 20, max: 100)',
275
+ default: 20
276
+ },
277
+ offset: {
278
+ type: 'number',
279
+ description: 'Skip this many issues for pagination (default: 0)',
280
+ default: 0
281
+ }
282
+ }
283
+ }
284
+ };
285
+ //# sourceMappingURL=list-issues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-issues.js","sourceRoot":"","sources":["../../src/tools/list-issues.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwDH,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,YAAY,GAAgC;IAChD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,cAAc,GAAkC;IACpD,QAAQ,EAAE,CAAC;IACX,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,YAAY,GAAgC;IAChD,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,UAAU;CACd,CAAC;AAEF,MAAM,cAAc,GAAkC;IACpD,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,UAAU;CACd,CAAC;AAEF,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,UAAU,CACjB,MAA2B,EAC3B,OAA0B;IAE1B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAI,KAAoB,EAAE,OAA0B;IACtE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAa;IACnC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,UAAU;QAE1B,yCAAyC;QACzC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,MAAM;QACvD,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,KAAK;QAC5D,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,CAAC;QAE3B,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,eAAe,EAAE,GAAG,CAAC,eAAe;QAEpC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAE1B,8DAA8D;QAC9D,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,GAAG,CAAC,wBAAwB;KACpC,CAAC;AACJ,CAAC;AA+BD,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAsB,EACtB,YAA0B;IAE1B,MAAM,EACJ,UAAU,EACV,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,GAAG,YAAY,EACvB,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,CAAC,EACX,GAAG,KAAK,CAAC;IAEV,yBAAyB;IACzB,MAAM,eAAe,GAA4B,EAAE,CAAC;IAEpD,iBAAiB;IACjB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,eAAe,CAAC,UAAU,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;IACnD,CAAC;IAED,gBAAgB;IAChB,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtD,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,eAAe,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC;YAChD,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE;YAC1B,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,kBAAkB;IAClB,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC5D,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,eAAe,CAAC,QAAQ,GAAG,cAAc,CAAC,MAAM,KAAK,CAAC;YACpD,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE;YAC5B,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC;IAC9B,CAAC;IAED,sCAAsC;IACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,eAAe,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,CAAC;aAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,eAAe,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,aAAa,GAAG,sBAAsB,CAAC;IAC3C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,aAAa,GAAG,oBAAoB,CAAC;YACrC,MAAM;QACR,KAAK,UAAU;YACb,aAAa,GAAG,+BAA+B,CAAC;YAChD,MAAM;QACR,KAAK,YAAY;YACf,aAAa,GAAG,sBAAsB,CAAC;YACvC,MAAM;QACR,KAAK,iBAAiB;YACpB,aAAa,GAAG,sCAAsC,CAAC;YACvD,MAAM;QACR,0BAA0B;IAC5B,CAAC;IAED,yCAAyC;IACzC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAElF,MAAM,KAAK,GAAG;;;iBAGC,WAAW;oBACR,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;gCAyBD,WAAW;;;;;;GAMxC,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAc,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/E,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC;IAC3D,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAE5D,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,WAAW,EAAE,UAAU;QACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,UAAU;QACpD,MAAM;KACP,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCZ,CAAC,IAAI,EAAE;IAER,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACpC;YACD,MAAM,EAAE;gBACN,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;oBACxD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE;iBACnF;gBACD,WAAW,EAAE,uDAAuD;aACrE;YACD,QAAQ,EAAE;gBACR,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE;oBAC3E,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE;iBACtG;gBACD,WAAW,EAAE,0BAA0B;aACxC;YACD,QAAQ,EAAE;gBACR,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;oBAC1C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;iBACrE;gBACD,WAAW,EAAE,iEAAiE;aAC/E;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,iBAAiB,CAAC;gBAC7E,WAAW,EAAE,YAAY;gBACzB,OAAO,EAAE,YAAY;aACtB;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kDAAkD;gBAC/D,OAAO,EAAE,EAAE;aACZ;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;gBAChE,OAAO,EAAE,CAAC;aACX;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * MCP Tool: list_lessons_learned
3
+ * Lists all lessons learned the user has access to with optional filtering
4
+ *
5
+ * Features:
6
+ * - Hasura relationships: returns resolved names instead of IDs
7
+ * - Filter by project_id or project_phase_id
8
+ */
9
+ import type { HasuraClient } from '../clients/hasura-client.js';
10
+ export interface ListLessonsLearnedInput {
11
+ project_id?: number;
12
+ project_phase_id?: number;
13
+ order_by?: 'created_at' | 'updated_at';
14
+ limit?: number;
15
+ offset?: number;
16
+ }
17
+ export interface LessonLearnedListItem {
18
+ id: number;
19
+ lesson_id: number;
20
+ description: string | null;
21
+ lesson_learned: string | null;
22
+ impact: string | null;
23
+ recommendation: string | null;
24
+ identified_by: string | null;
25
+ created_at: string;
26
+ updated_at: string;
27
+ project: {
28
+ id: number;
29
+ name: string;
30
+ } | null;
31
+ lifecycle: {
32
+ id: number;
33
+ name: string;
34
+ } | null;
35
+ }
36
+ export interface ListLessonsLearnedResult {
37
+ lessons_learned: LessonLearnedListItem[];
38
+ total_count: number;
39
+ has_more: boolean;
40
+ offset: number;
41
+ }
42
+ /**
43
+ * List lessons learned handler
44
+ */
45
+ export declare function listLessonsLearned(input: ListLessonsLearnedInput, hasuraClient: HasuraClient): Promise<ListLessonsLearnedResult>;
46
+ export declare const listLessonsLearnedTool: {
47
+ name: string;
48
+ description: string;
49
+ inputSchema: {
50
+ type: string;
51
+ properties: {
52
+ project_id: {
53
+ type: string;
54
+ description: string;
55
+ };
56
+ project_phase_id: {
57
+ type: string;
58
+ description: string;
59
+ };
60
+ order_by: {
61
+ type: string;
62
+ enum: string[];
63
+ description: string;
64
+ default: string;
65
+ };
66
+ limit: {
67
+ type: string;
68
+ description: string;
69
+ default: number;
70
+ };
71
+ offset: {
72
+ type: string;
73
+ description: string;
74
+ default: number;
75
+ };
76
+ };
77
+ };
78
+ };
79
+ //# sourceMappingURL=list-lessons-learned.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-lessons-learned.d.ts","sourceRoot":"","sources":["../../src/tools/list-lessons-learned.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAG7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7C,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,qBAAqB,EAAE,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAuDD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,wBAAwB,CAAC,CAwEnC;AAMD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDlC,CAAC"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * MCP Tool: list_lessons_learned
3
+ * Lists all lessons learned the user has access to with optional filtering
4
+ *
5
+ * Features:
6
+ * - Hasura relationships: returns resolved names instead of IDs
7
+ * - Filter by project_id or project_phase_id
8
+ */
9
+ // ============================================================================
10
+ // Helper Functions
11
+ // ============================================================================
12
+ /**
13
+ * Transform raw DB lesson to formatted output
14
+ */
15
+ function transformLesson(raw) {
16
+ return {
17
+ id: raw.id,
18
+ lesson_id: raw.lesson_id,
19
+ description: raw.description,
20
+ lesson_learned: raw.lesson_learned,
21
+ impact: raw.impact,
22
+ recommendation: raw.recommendation,
23
+ identified_by: raw.identified_by,
24
+ created_at: raw.created_at,
25
+ updated_at: raw.updated_at,
26
+ // Relationships - already resolved by Hasura
27
+ project: raw.project,
28
+ lifecycle: raw.lifecycle
29
+ };
30
+ }
31
+ // ============================================================================
32
+ // Main Handler
33
+ // ============================================================================
34
+ /**
35
+ * List lessons learned handler
36
+ */
37
+ export async function listLessonsLearned(input, hasuraClient) {
38
+ const { project_id, project_phase_id, order_by = 'created_at', limit = 20, offset = 0 } = input;
39
+ // Build where conditions
40
+ const whereConditions = {};
41
+ // Project filter
42
+ if (project_id !== undefined) {
43
+ whereConditions.project_id = { _eq: project_id };
44
+ }
45
+ // Project phase (lifecycle) filter
46
+ if (project_phase_id !== undefined) {
47
+ whereConditions.project_phase_id = { _eq: project_phase_id };
48
+ }
49
+ // Build order_by clause
50
+ const orderByClause = order_by === 'updated_at'
51
+ ? '{ updated_at: desc }'
52
+ : '{ created_at: desc }';
53
+ // Build GraphQL query with relationships
54
+ const whereClause = JSON.stringify(whereConditions).replace(/"([^"]+)":/g, '$1:');
55
+ const query = `
56
+ query ListLessonsLearned($limit: Int!, $offset: Int!) {
57
+ project_learned_lessons(
58
+ where: ${whereClause},
59
+ order_by: ${orderByClause},
60
+ limit: $limit,
61
+ offset: $offset
62
+ ) {
63
+ id
64
+ lesson_id
65
+ description
66
+ lesson_learned
67
+ impact
68
+ recommendation
69
+ identified_by
70
+ created_at
71
+ updated_at
72
+
73
+ # Relationships - Hasura resolves automatically
74
+ project { id name }
75
+ lifecycle { id name }
76
+ }
77
+
78
+ project_learned_lessons_aggregate(where: ${whereClause}) {
79
+ aggregate {
80
+ count
81
+ }
82
+ }
83
+ }
84
+ `;
85
+ const result = await hasuraClient.query(query, { limit, offset });
86
+ const totalCount = result.project_learned_lessons_aggregate.aggregate.count;
87
+ const transformedLessons = result.project_learned_lessons.map(transformLesson);
88
+ return {
89
+ lessons_learned: transformedLessons,
90
+ total_count: totalCount,
91
+ has_more: offset + result.project_learned_lessons.length < totalCount,
92
+ offset
93
+ };
94
+ }
95
+ // ============================================================================
96
+ // Tool Definition
97
+ // ============================================================================
98
+ export const listLessonsLearnedTool = {
99
+ name: 'list_lessons_learned',
100
+ description: `
101
+ List lessons learned the user has access to with optional filtering.
102
+
103
+ Returns lessons learned information including:
104
+ - Identifiers: id, lesson_id (human-readable within company)
105
+ - Content: description, lesson_learned (main content), impact, recommendation
106
+ - Who identified: identified_by (text field with person's name)
107
+ - Dates: created_at, updated_at
108
+ - Relationships with NAMES: project, lifecycle (project phase when lesson was learned)
109
+
110
+ CONTENT FIELDS:
111
+ - description: Brief summary of the situation
112
+ - lesson_learned: The main lesson/insight gained
113
+ - impact: What impact this had on the project
114
+ - recommendation: Suggested actions for future projects
115
+
116
+ SORTING:
117
+ - "created_at" (default) - newest first
118
+ - "updated_at" - recently updated first
119
+
120
+ EXAMPLES:
121
+ - "Show all lessons learned" → (no filters)
122
+ - "Lessons for project 123" → project_id: 123
123
+ - "Lessons from Planning phase" → project_phase_id: 1 (need lifecycle ID)
124
+ `.trim(),
125
+ inputSchema: {
126
+ type: 'object',
127
+ properties: {
128
+ project_id: {
129
+ type: 'number',
130
+ description: 'Filter by project ID'
131
+ },
132
+ project_phase_id: {
133
+ type: 'number',
134
+ description: 'Filter by project phase/lifecycle ID'
135
+ },
136
+ order_by: {
137
+ type: 'string',
138
+ enum: ['created_at', 'updated_at'],
139
+ description: 'Sort order',
140
+ default: 'created_at'
141
+ },
142
+ limit: {
143
+ type: 'number',
144
+ description: 'Maximum lessons to return (default: 20, max: 100)',
145
+ default: 20
146
+ },
147
+ offset: {
148
+ type: 'number',
149
+ description: 'Skip this many lessons for pagination (default: 0)',
150
+ default: 0
151
+ }
152
+ }
153
+ }
154
+ };
155
+ //# sourceMappingURL=list-lessons-learned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-lessons-learned.js","sourceRoot":"","sources":["../../src/tools/list-lessons-learned.ts"],"names":[],"mappings":"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"}