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,62 @@
1
+ /**
2
+ * MCP Tool: get_issue
3
+ * Returns full details for a single issue by ID
4
+ *
5
+ * Features:
6
+ * - Enum conversion: DB integers → human-readable strings
7
+ * - Hasura relationships: returns resolved names instead of IDs
8
+ */
9
+ import type { HasuraClient } from '../clients/hasura-client.js';
10
+ export type IssueStatus = 'open' | 'closed' | 'resolved';
11
+ export type IssuePriority = 'very_low' | 'low' | 'medium' | 'high' | 'critical';
12
+ export interface GetIssueInput {
13
+ issue_id?: number;
14
+ issue_number?: number;
15
+ }
16
+ export interface IssueDetails {
17
+ id: number;
18
+ issue_id: number;
19
+ name: string;
20
+ description: string | null;
21
+ notes: string | null;
22
+ hyperlinks: string | null;
23
+ status: IssueStatus;
24
+ priority: IssuePriority;
25
+ severity: number;
26
+ areas_of_impact: string | null;
27
+ action_plan: string | null;
28
+ resolution: string | null;
29
+ resolution_date: string | null;
30
+ created_at: string;
31
+ updated_at: string;
32
+ project: {
33
+ id: number;
34
+ name: string;
35
+ } | null;
36
+ owner: {
37
+ id: number;
38
+ name: string;
39
+ } | null;
40
+ }
41
+ export interface GetIssueResult {
42
+ issue: IssueDetails | null;
43
+ }
44
+ export declare function getIssue(input: GetIssueInput, hasuraClient: HasuraClient): Promise<GetIssueResult>;
45
+ export declare const getIssueTool: {
46
+ name: string;
47
+ description: string;
48
+ inputSchema: {
49
+ type: string;
50
+ properties: {
51
+ issue_id: {
52
+ type: string;
53
+ description: string;
54
+ };
55
+ issue_number: {
56
+ type: string;
57
+ description: string;
58
+ };
59
+ };
60
+ };
61
+ };
62
+ //# sourceMappingURL=get-issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-issue.d.ts","sourceRoot":"","sources":["../../src/tools/get-issue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;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,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,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,cAAc;IAC7B,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5B;AAoHD,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,cAAc,CAAC,CA2BzB;AAMD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;CAwCxB,CAAC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * MCP Tool: get_issue
3
+ * Returns full details for a single issue by ID
4
+ *
5
+ * Features:
6
+ * - Enum conversion: DB integers → human-readable strings
7
+ * - Hasura relationships: returns resolved names instead of IDs
8
+ */
9
+ // ============================================================================
10
+ // Enum Mappings
11
+ // ============================================================================
12
+ const DB_TO_STATUS = {
13
+ 0: 'open',
14
+ 1: 'closed',
15
+ 2: 'resolved'
16
+ };
17
+ const DB_TO_PRIORITY = {
18
+ 0: 'very_low',
19
+ 1: 'low',
20
+ 2: 'medium',
21
+ 3: 'high',
22
+ 4: 'critical'
23
+ };
24
+ // ============================================================================
25
+ // Helper Functions
26
+ // ============================================================================
27
+ function fromDbValue(value, mapping) {
28
+ if (value === null || value === undefined)
29
+ return null;
30
+ return mapping[value] ?? null;
31
+ }
32
+ function transformIssue(raw) {
33
+ return {
34
+ id: raw.id,
35
+ issue_id: raw.issue_id,
36
+ name: raw.name,
37
+ description: raw.description,
38
+ notes: raw.notes,
39
+ hyperlinks: raw.hyperlinks,
40
+ status: fromDbValue(raw.status, DB_TO_STATUS) ?? 'open',
41
+ priority: fromDbValue(raw.priority, DB_TO_PRIORITY) ?? 'low',
42
+ severity: raw.severity ?? 1,
43
+ areas_of_impact: raw.areas_of_impact,
44
+ action_plan: raw.action_plan,
45
+ resolution: raw.resolution,
46
+ resolution_date: raw.resolution_date,
47
+ created_at: raw.created_at,
48
+ updated_at: raw.updated_at,
49
+ project: raw.project,
50
+ owner: raw.company_project_resource
51
+ };
52
+ }
53
+ // ============================================================================
54
+ // GraphQL Query
55
+ // ============================================================================
56
+ const GET_ISSUE_QUERY = `
57
+ query GetIssue($where: issues_bool_exp!) {
58
+ issues(where: $where, limit: 1) {
59
+ id
60
+ issue_id
61
+ name
62
+ description
63
+ notes
64
+ hyperlinks
65
+ status
66
+ priority
67
+ severity
68
+ areas_of_impact
69
+ action_plan
70
+ resolution
71
+ resolution_date
72
+ created_at
73
+ updated_at
74
+
75
+ project { id name }
76
+ company_project_resource { id name }
77
+ }
78
+ }
79
+ `;
80
+ // ============================================================================
81
+ // Main Handler
82
+ // ============================================================================
83
+ export async function getIssue(input, hasuraClient) {
84
+ const { issue_id, issue_number } = input;
85
+ // Validate input
86
+ if (issue_id === undefined && issue_number === undefined) {
87
+ return { issue: null };
88
+ }
89
+ // Build where clause
90
+ let whereClause;
91
+ if (issue_id !== undefined) {
92
+ whereClause = { id: { _eq: issue_id } };
93
+ }
94
+ else {
95
+ whereClause = { issue_id: { _eq: issue_number } };
96
+ }
97
+ const result = await hasuraClient.query(GET_ISSUE_QUERY, {
98
+ where: whereClause
99
+ });
100
+ if (!result.issues || result.issues.length === 0) {
101
+ return { issue: null };
102
+ }
103
+ return {
104
+ issue: transformIssue(result.issues[0])
105
+ };
106
+ }
107
+ // ============================================================================
108
+ // Tool Definition
109
+ // ============================================================================
110
+ export const getIssueTool = {
111
+ name: 'get_issue',
112
+ description: `
113
+ Get full details for a single issue by ID.
114
+
115
+ Returns all issue information including:
116
+ - Identifiers: id (database), issue_id (human-readable number within company)
117
+ - Content: name, description, notes, hyperlinks
118
+ - Classification: status, priority, severity (1-5 integer)
119
+ - Action content: areas_of_impact, action_plan, resolution
120
+ - Dates: created_at, updated_at, resolution_date
121
+ - Relationships: project { id, name }, owner { id, name }
122
+
123
+ SEARCH OPTIONS (provide one):
124
+ - issue_id: Database primary key (integer)
125
+ - issue_number: Human-readable issue number within company (e.g., 42)
126
+
127
+ ENUM VALUES:
128
+ - status: "open", "closed", "resolved"
129
+ - priority: "very_low", "low", "medium", "high", "critical"
130
+ - severity: 1-5 (integer, not enum)
131
+
132
+ EXAMPLES:
133
+ - Get by database ID: issue_id: 123
134
+ - Get by issue number: issue_number: 42
135
+ `.trim(),
136
+ inputSchema: {
137
+ type: 'object',
138
+ properties: {
139
+ issue_id: {
140
+ type: 'number',
141
+ description: 'Issue database ID (primary key)'
142
+ },
143
+ issue_number: {
144
+ type: 'number',
145
+ description: 'Human-readable issue number within company'
146
+ }
147
+ }
148
+ }
149
+ };
150
+ //# sourceMappingURL=get-issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-issue.js","sourceRoot":"","sources":["../../src/tools/get-issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * MCP Tool: get_lesson_learned
3
+ * Returns full details for a single lesson learned by ID
4
+ *
5
+ * Features:
6
+ * - Hasura relationships: returns resolved names instead of IDs
7
+ */
8
+ import type { HasuraClient } from '../clients/hasura-client.js';
9
+ export interface GetLessonLearnedInput {
10
+ lesson_id?: number;
11
+ lesson_number?: number;
12
+ }
13
+ export interface LessonLearnedDetails {
14
+ id: number;
15
+ lesson_id: number;
16
+ description: string | null;
17
+ lesson_learned: string | null;
18
+ impact: string | null;
19
+ recommendation: string | null;
20
+ identified_by: string | null;
21
+ created_at: string;
22
+ updated_at: string;
23
+ project: {
24
+ id: number;
25
+ name: string;
26
+ } | null;
27
+ lifecycle: {
28
+ id: number;
29
+ name: string;
30
+ } | null;
31
+ }
32
+ export interface GetLessonLearnedResult {
33
+ lesson: LessonLearnedDetails | null;
34
+ }
35
+ export declare function getLessonLearned(input: GetLessonLearnedInput, hasuraClient: HasuraClient): Promise<GetLessonLearnedResult>;
36
+ export declare const getLessonLearnedTool: {
37
+ name: string;
38
+ description: string;
39
+ inputSchema: {
40
+ type: string;
41
+ properties: {
42
+ lesson_id: {
43
+ type: string;
44
+ description: string;
45
+ };
46
+ lesson_number: {
47
+ type: string;
48
+ description: string;
49
+ };
50
+ };
51
+ };
52
+ };
53
+ //# sourceMappingURL=get-lesson-learned.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-lesson-learned.d.ts","sourceRoot":"","sources":["../../src/tools/get-lesson-learned.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,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,sBAAsB;IACrC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACrC;AAyED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,qBAAqB,EAC5B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,sBAAsB,CAAC,CA2BjC;AAMD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;CAwChC,CAAC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * MCP Tool: get_lesson_learned
3
+ * Returns full details for a single lesson learned by ID
4
+ *
5
+ * Features:
6
+ * - Hasura relationships: returns resolved names instead of IDs
7
+ */
8
+ // ============================================================================
9
+ // Helper Functions
10
+ // ============================================================================
11
+ function transformLesson(raw) {
12
+ return {
13
+ id: raw.id,
14
+ lesson_id: raw.lesson_id,
15
+ description: raw.description,
16
+ lesson_learned: raw.lesson_learned,
17
+ impact: raw.impact,
18
+ recommendation: raw.recommendation,
19
+ identified_by: raw.identified_by,
20
+ created_at: raw.created_at,
21
+ updated_at: raw.updated_at,
22
+ project: raw.project,
23
+ lifecycle: raw.lifecycle
24
+ };
25
+ }
26
+ // ============================================================================
27
+ // GraphQL Query
28
+ // ============================================================================
29
+ const GET_LESSON_QUERY = `
30
+ query GetLessonLearned($where: project_learned_lessons_bool_exp!) {
31
+ project_learned_lessons(where: $where, limit: 1) {
32
+ id
33
+ lesson_id
34
+ description
35
+ lesson_learned
36
+ impact
37
+ recommendation
38
+ identified_by
39
+ created_at
40
+ updated_at
41
+
42
+ project { id name }
43
+ lifecycle { id name }
44
+ }
45
+ }
46
+ `;
47
+ // ============================================================================
48
+ // Main Handler
49
+ // ============================================================================
50
+ export async function getLessonLearned(input, hasuraClient) {
51
+ const { lesson_id, lesson_number } = input;
52
+ // Validate input
53
+ if (lesson_id === undefined && lesson_number === undefined) {
54
+ return { lesson: null };
55
+ }
56
+ // Build where clause
57
+ let whereClause;
58
+ if (lesson_id !== undefined) {
59
+ whereClause = { id: { _eq: lesson_id } };
60
+ }
61
+ else {
62
+ whereClause = { lesson_id: { _eq: lesson_number } };
63
+ }
64
+ const result = await hasuraClient.query(GET_LESSON_QUERY, {
65
+ where: whereClause
66
+ });
67
+ if (!result.project_learned_lessons || result.project_learned_lessons.length === 0) {
68
+ return { lesson: null };
69
+ }
70
+ return {
71
+ lesson: transformLesson(result.project_learned_lessons[0])
72
+ };
73
+ }
74
+ // ============================================================================
75
+ // Tool Definition
76
+ // ============================================================================
77
+ export const getLessonLearnedTool = {
78
+ name: 'get_lesson_learned',
79
+ description: `
80
+ Get full details for a single lesson learned by ID.
81
+
82
+ Returns all lesson learned information including:
83
+ - Identifiers: id (database), lesson_id (human-readable number within company)
84
+ - Content: description, lesson_learned (main content), impact, recommendation
85
+ - Who identified: identified_by (text field with person's name)
86
+ - Dates: created_at, updated_at
87
+ - Relationships: project { id, name }, lifecycle { id, name } (project phase)
88
+
89
+ SEARCH OPTIONS (provide one):
90
+ - lesson_id: Database primary key (integer)
91
+ - lesson_number: Human-readable lesson number within company (e.g., 15)
92
+
93
+ CONTENT FIELDS:
94
+ - description: Brief summary of the situation
95
+ - lesson_learned: The main lesson/insight gained
96
+ - impact: What impact this had on the project
97
+ - recommendation: Suggested actions for future projects
98
+
99
+ EXAMPLES:
100
+ - Get by database ID: lesson_id: 123
101
+ - Get by lesson number: lesson_number: 15
102
+ `.trim(),
103
+ inputSchema: {
104
+ type: 'object',
105
+ properties: {
106
+ lesson_id: {
107
+ type: 'number',
108
+ description: 'Lesson database ID (primary key)'
109
+ },
110
+ lesson_number: {
111
+ type: 'number',
112
+ description: 'Human-readable lesson number within company'
113
+ }
114
+ }
115
+ }
116
+ };
117
+ //# sourceMappingURL=get-lesson-learned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-lesson-learned.js","sourceRoot":"","sources":["../../src/tools/get-lesson-learned.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmCH,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,SAAS,eAAe,CAAC,GAAc;IACrC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,aAAa,EAAE,GAAG,CAAC,aAAa;QAEhC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAE1B,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC;AACJ,CAAC;AAwBD,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;CAiBxB,CAAC;AAEF,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAA4B,EAC5B,YAA0B;IAE1B,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;IAE3C,iBAAiB;IACjB,IAAI,SAAS,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,qBAAqB;IACrB,IAAI,WAAoC,CAAC;IACzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,WAAW,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAc,gBAAgB,EAAE;QACrE,KAAK,EAAE,WAAW;KACnB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,uBAAuB,IAAI,MAAM,CAAC,uBAAuB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;GAuBZ,CAAC,IAAI,EAAE;IAER,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,kCAAkC;aAChD;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6CAA6C;aAC3D;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * MCP Tool: get_lookup_values
3
+ * Returns all values for a lookup table (departments, categories, etc.)
4
+ *
5
+ * Use this when:
6
+ * - User asks "what departments exist?"
7
+ * - User wants to filter by department name but needs the ID
8
+ * - User wants to compare projects across departments/categories
9
+ */
10
+ import type { HasuraClient } from '../clients/hasura-client.js';
11
+ export type LookupTableName = 'departments' | 'categories' | 'strategic_objectives' | 'lifecycles' | 'project_priorities' | 'portfolios';
12
+ export interface GetLookupValuesInput {
13
+ table: LookupTableName;
14
+ }
15
+ export interface LookupValue {
16
+ id: number;
17
+ name: string;
18
+ description?: string | null;
19
+ }
20
+ export interface GetLookupValuesResult {
21
+ table: LookupTableName;
22
+ values: LookupValue[];
23
+ count: number;
24
+ }
25
+ export declare function getLookupValues(input: GetLookupValuesInput, hasuraClient: HasuraClient): Promise<GetLookupValuesResult>;
26
+ export declare const getLookupValuesTool: {
27
+ name: string;
28
+ description: string;
29
+ inputSchema: {
30
+ type: string;
31
+ properties: {
32
+ table: {
33
+ type: string;
34
+ enum: string[];
35
+ description: string;
36
+ };
37
+ };
38
+ required: string[];
39
+ };
40
+ };
41
+ //# sourceMappingURL=get-lookup-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-lookup-values.d.ts","sourceRoot":"","sources":["../../src/tools/get-lookup-values.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,YAAY,GACZ,sBAAsB,GACtB,YAAY,GACZ,oBAAoB,GACpB,YAAY,CAAC;AAEjB,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AA8DD,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,EAC3B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,qBAAqB,CAAC,CAuBhC;AAMD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;CAqC/B,CAAC"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * MCP Tool: get_lookup_values
3
+ * Returns all values for a lookup table (departments, categories, etc.)
4
+ *
5
+ * Use this when:
6
+ * - User asks "what departments exist?"
7
+ * - User wants to filter by department name but needs the ID
8
+ * - User wants to compare projects across departments/categories
9
+ */
10
+ // ============================================================================
11
+ // GraphQL Queries
12
+ // ============================================================================
13
+ const QUERIES = {
14
+ departments: `
15
+ query GetDepartments {
16
+ departments(order_by: { name: asc }) {
17
+ id
18
+ name
19
+ }
20
+ }
21
+ `,
22
+ categories: `
23
+ query GetCategories {
24
+ categories(order_by: { name: asc }) {
25
+ id
26
+ name
27
+ }
28
+ }
29
+ `,
30
+ strategic_objectives: `
31
+ query GetStrategicObjectives {
32
+ strategic_objectives(order_by: { name: asc }) {
33
+ id
34
+ name
35
+ description
36
+ }
37
+ }
38
+ `,
39
+ lifecycles: `
40
+ query GetLifecycles {
41
+ lifecycles(order_by: { order: asc }) {
42
+ id
43
+ name
44
+ }
45
+ }
46
+ `,
47
+ project_priorities: `
48
+ query GetProjectPriorities {
49
+ project_priorities(order_by: { order: asc }) {
50
+ id
51
+ name
52
+ }
53
+ }
54
+ `,
55
+ portfolios: `
56
+ query GetPortfolios {
57
+ portfolios(order_by: { name: asc }) {
58
+ id
59
+ name
60
+ }
61
+ }
62
+ `
63
+ };
64
+ // ============================================================================
65
+ // Main Handler
66
+ // ============================================================================
67
+ export async function getLookupValues(input, hasuraClient) {
68
+ const { table } = input;
69
+ // Validate table name
70
+ if (!QUERIES[table]) {
71
+ return {
72
+ table,
73
+ values: [],
74
+ count: 0
75
+ };
76
+ }
77
+ const query = QUERIES[table];
78
+ const result = await hasuraClient.query(query, {});
79
+ // Extract values from result (key is the table name)
80
+ const values = result[table] || [];
81
+ return {
82
+ table,
83
+ values,
84
+ count: values.length
85
+ };
86
+ }
87
+ // ============================================================================
88
+ // Tool Definition
89
+ // ============================================================================
90
+ export const getLookupValuesTool = {
91
+ name: 'get_lookup_values',
92
+ description: `
93
+ Get all values for a lookup table. Use this when you need to:
94
+ - See what options exist (e.g., "what departments are there?")
95
+ - Find an ID for filtering (e.g., user says "Engineering department" → get ID to filter)
96
+ - Compare or analyze data across categories
97
+
98
+ AVAILABLE TABLES:
99
+ - "departments" - Organizational departments (e.g., Engineering, Marketing)
100
+ - "categories" - Project categories (e.g., Infrastructure, Innovation)
101
+ - "strategic_objectives" - Company strategic goals (includes description)
102
+ - "lifecycles" - Project phases/stages (e.g., Planning, Execution, Closure)
103
+ - "project_priorities" - Priority levels for projects (e.g., High, Medium, Low)
104
+ - "portfolios" - Project portfolios for grouping projects
105
+
106
+ RETURNS:
107
+ Array of { id, name } objects (strategic_objectives also has description)
108
+
109
+ EXAMPLES:
110
+ - "What departments exist?" → table: "departments"
111
+ - "Show me all project categories" → table: "categories"
112
+ - "What are the strategic objectives?" → table: "strategic_objectives"
113
+ - "List project lifecycle phases" → table: "lifecycles"
114
+ `.trim(),
115
+ inputSchema: {
116
+ type: 'object',
117
+ properties: {
118
+ table: {
119
+ type: 'string',
120
+ enum: ['departments', 'categories', 'strategic_objectives', 'lifecycles', 'project_priorities', 'portfolios'],
121
+ description: 'The lookup table to get values from'
122
+ }
123
+ },
124
+ required: ['table']
125
+ }
126
+ };
127
+ //# sourceMappingURL=get-lookup-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-lookup-values.js","sourceRoot":"","sources":["../../src/tools/get-lookup-values.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgCH,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,OAAO,GAAoC;IAC/C,WAAW,EAAE;;;;;;;GAOZ;IACD,UAAU,EAAE;;;;;;;GAOX;IACD,oBAAoB,EAAE;;;;;;;;GAQrB;IACD,UAAU,EAAE;;;;;;;GAOX;IACD,kBAAkB,EAAE;;;;;;;GAOnB;IACD,UAAU,EAAE;;;;;;;GAOX;CACF,CAAC;AAEF,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B,EAC3B,YAA0B;IAE1B,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAExB,sBAAsB;IACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,KAAK;YACL,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,CAAC;SACT,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAgC,KAAK,EAAE,EAAE,CAAC,CAAC;IAElF,qDAAqD;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAEnC,OAAO;QACL,KAAK;QACL,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;GAsBZ,CAAC,IAAI,EAAE;IAER,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,CAAC;gBAC7G,WAAW,EAAE,qCAAqC;aACnD;SACF;QACD,QAAQ,EAAE,CAAC,OAAO,CAAC;KACpB;CACF,CAAC"}