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,239 @@
1
+ /**
2
+ * MCP Tool: acuity_init
3
+ * Initializes LLM context with minimal schema information
4
+ *
5
+ * Returns:
6
+ * - Company name
7
+ * - Entity counts (projects, risks, issues, lessons_learned, status_reports)
8
+ * - All enum values for filtering
9
+ * - Lookup table counts
10
+ * - Available tools
11
+ *
12
+ * This tool should be called first to give LLM understanding of available data.
13
+ * Target size: ~700-800 tokens
14
+ */
15
+ /**
16
+ * GraphQL query to get all counts in a single request
17
+ */
18
+ const COUNTS_QUERY = `
19
+ query GetInitCounts {
20
+ # Company info (first accessible company)
21
+ companies(limit: 1) {
22
+ name
23
+ currency_code
24
+ currency_locale
25
+ }
26
+
27
+ # Projects count (only project_type = 'project')
28
+ projects_aggregate(where: { project_type: { _eq: "project" } }) {
29
+ aggregate { count }
30
+ }
31
+
32
+ # Proposals count (only project_type = 'proposal')
33
+ proposals_aggregate: projects_aggregate(where: { project_type: { _eq: "proposal" } }) {
34
+ aggregate { count }
35
+ }
36
+
37
+ # Project risks count
38
+ project_risks_aggregate: risks_aggregate(where: { project: { project_type: { _eq: "project" } } }) {
39
+ aggregate { count }
40
+ }
41
+
42
+ # Proposal risks count
43
+ proposal_risks_aggregate: risks_aggregate(where: { project: { project_type: { _eq: "proposal" } } }) {
44
+ aggregate { count }
45
+ }
46
+
47
+ # Project issues count
48
+ project_issues_aggregate: issues_aggregate(where: { project: { project_type: { _eq: "project" } } }) {
49
+ aggregate { count }
50
+ }
51
+
52
+ # Proposal issues count
53
+ proposal_issues_aggregate: issues_aggregate(where: { project: { project_type: { _eq: "proposal" } } }) {
54
+ aggregate { count }
55
+ }
56
+
57
+ # Lessons learned count
58
+ project_learned_lessons_aggregate {
59
+ aggregate { count }
60
+ }
61
+
62
+ # Status reports count
63
+ status_reports_aggregate {
64
+ aggregate { count }
65
+ }
66
+
67
+ # Lookup table counts
68
+ departments_aggregate {
69
+ aggregate { count }
70
+ }
71
+
72
+ categories_aggregate {
73
+ aggregate { count }
74
+ }
75
+
76
+ strategic_objectives_aggregate {
77
+ aggregate { count }
78
+ }
79
+
80
+ lifecycles_aggregate {
81
+ aggregate { count }
82
+ }
83
+
84
+ project_priorities_aggregate {
85
+ aggregate { count }
86
+ }
87
+ }
88
+ `;
89
+ /**
90
+ * Acuity init handler
91
+ */
92
+ export async function acuityInit(hasuraClient) {
93
+ // Execute counts query
94
+ const result = await hasuraClient.query(COUNTS_QUERY, {});
95
+ const company = result.companies[0];
96
+ const companyName = company?.name || 'Unknown Company';
97
+ const currencyCode = company?.currency_code || 'USD';
98
+ const currencyLocale = company?.currency_locale || 'en';
99
+ return {
100
+ company: companyName,
101
+ currency_code: currencyCode,
102
+ currency_locale: currencyLocale,
103
+ entities: {
104
+ projects: {
105
+ count: result.projects_aggregate.aggregate.count,
106
+ description: 'Active projects (project_type = "project")',
107
+ filterable_by: [
108
+ 'state', 'health_status', 'schedule_status', 'budget_status',
109
+ 'quality_status', 'portfolio_id', 'department_id', 'category_id', 'project_manager_id'
110
+ ],
111
+ has_counts: [
112
+ 'open_risks_count', 'closed_risks_count', 'total_risks_count',
113
+ 'open_issues_count', 'closed_issues_count', 'total_issues_count',
114
+ 'open_benefits_count', 'closed_benefits_count', 'total_benefits_count',
115
+ 'total_lessons_count'
116
+ ],
117
+ related: ['status_reports', 'risks', 'issues', 'lessons_learned']
118
+ },
119
+ proposals: {
120
+ count: result.proposals_aggregate.aggregate.count,
121
+ description: 'Project proposals awaiting approval (project_type = "proposal")',
122
+ filterable_by: [
123
+ 'proposal_state', 'funding', 'portfolio_id', 'department_id', 'category_id'
124
+ ],
125
+ related: ['risks', 'issues']
126
+ },
127
+ project_risks: {
128
+ count: result.project_risks_aggregate.aggregate.count,
129
+ description: 'Risks associated with active projects',
130
+ filterable_by: ['status', 'priority', 'severity', 'likelihood', 'risk_response', 'project_id']
131
+ },
132
+ proposal_risks: {
133
+ count: result.proposal_risks_aggregate.aggregate.count,
134
+ description: 'Risks associated with proposals',
135
+ filterable_by: ['status', 'priority', 'severity', 'likelihood', 'risk_response', 'project_id']
136
+ },
137
+ project_issues: {
138
+ count: result.project_issues_aggregate.aggregate.count,
139
+ description: 'Issues associated with active projects',
140
+ filterable_by: ['status', 'priority', 'project_id']
141
+ },
142
+ proposal_issues: {
143
+ count: result.proposal_issues_aggregate.aggregate.count,
144
+ description: 'Issues associated with proposals',
145
+ filterable_by: ['status', 'priority', 'project_id']
146
+ },
147
+ lessons_learned: {
148
+ count: result.project_learned_lessons_aggregate.aggregate.count,
149
+ description: 'Lessons learned from projects',
150
+ filterable_by: ['project_id', 'project_phase_id']
151
+ },
152
+ status_reports: {
153
+ count: result.status_reports_aggregate.aggregate.count,
154
+ description: 'Status updates with health indicators and commentary',
155
+ filterable_by: ['project_id', 'health_status', 'schedule_status', 'budget_status', 'quality_status']
156
+ }
157
+ },
158
+ // Hardcoded enums - verified against Rails models and frontend configs
159
+ enums: {
160
+ // Project enums
161
+ '// Project enums': '',
162
+ state: ['active', 'hold', 'completed', 'cancelled', 'pending'],
163
+ project_type: ['project', 'proposal'],
164
+ proposal_state: ['draft', 'final', 'deferred', 'cancelled', 'approved'],
165
+ funding: ['planning', 'funded', 'unfunded'],
166
+ financial_class: ['capital', 'operational'],
167
+ // Stoplight enums (used in projects and status_reports)
168
+ '// Stoplight enums': '',
169
+ health_status: ['green', 'yellow', 'red', 'gray'],
170
+ 'health_status_meanings': 'green=healthy, yellow=caution, red=critical, gray=unknown',
171
+ schedule_status: ['yellow', 'green', 'red', 'gray'],
172
+ 'schedule_status_meanings': 'yellow=on_schedule, green=ahead_of_schedule, red=behind_schedule, gray=unknown',
173
+ budget_status: ['yellow', 'green', 'red', 'gray'],
174
+ 'budget_status_meanings': 'yellow=on_budget, green=under_budget, red=over_budget, gray=unknown',
175
+ quality_status: ['green', 'yellow', 'red', 'gray'],
176
+ scope_stoplight_status: ['green', 'yellow', 'red', 'gray'],
177
+ risk_stoplight_status: ['green', 'yellow', 'red', 'gray'],
178
+ resource_stoplight_status: ['green', 'yellow', 'red', 'gray'],
179
+ benefits_stoplight_status: ['green', 'yellow', 'red', 'gray'],
180
+ // Risk enums
181
+ '// Risk enums': '',
182
+ risk_status: ['open', 'closed', 'realized'],
183
+ risk_response: ['mitigate', 'accept', 'avoid', 'watch', 'transfer'],
184
+ severity: ['very_low', 'low', 'medium', 'high', 'very_high'],
185
+ likelihood: ['very_low', 'low', 'medium', 'high', 'very_high'],
186
+ // Issue enums
187
+ '// Issue enums': '',
188
+ issue_status: ['open', 'closed', 'resolved'],
189
+ // Shared enums
190
+ '// Shared enums (risks & issues)': '',
191
+ priority: ['very_low', 'low', 'medium', 'high', 'critical']
192
+ },
193
+ lookup_tables: {
194
+ departments: result.departments_aggregate.aggregate.count,
195
+ categories: result.categories_aggregate.aggregate.count,
196
+ strategic_objectives: result.strategic_objectives_aggregate.aggregate.count,
197
+ lifecycles: result.lifecycles_aggregate.aggregate.count,
198
+ project_priorities: result.project_priorities_aggregate.aggregate.count
199
+ },
200
+ available_tools: [
201
+ 'acuity_init',
202
+ 'list_projects',
203
+ 'get_project',
204
+ 'list_risks',
205
+ 'list_issues',
206
+ 'list_lessons_learned',
207
+ 'get_status_reports',
208
+ 'get_lookup_values'
209
+ ]
210
+ };
211
+ }
212
+ /**
213
+ * MCP tool definition for acuity_init
214
+ */
215
+ export const acuityInitTool = {
216
+ name: 'acuity_init',
217
+ description: `
218
+ Initialize context for working with Acuity project management data.
219
+
220
+ ALWAYS call this tool first before any other data tools to understand:
221
+ - Company name, currency_code (USD, EUR, etc.) and currency_locale (en, de, etc.)
222
+ - What entities exist and their counts
223
+ - What fields can be filtered by
224
+ - All valid enum values for filtering
225
+ - What lookup tables are available
226
+ - What tools you can use
227
+
228
+ IMPORTANT: Use currency_code and currency_locale to format financial values appropriately.
229
+ For example, if currency_code is "EUR" and locale is "de", format as "1.234,56 €".
230
+
231
+ This provides the schema context needed to construct valid queries.
232
+ `.trim(),
233
+ inputSchema: {
234
+ type: 'object',
235
+ properties: {},
236
+ // No required parameters - this is a context initialization tool
237
+ }
238
+ };
239
+ //# sourceMappingURL=acuity-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acuity-init.js","sourceRoot":"","sources":["../../src/tools/acuity-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * MCP Tool: get_dashboard_summary
3
+ * Returns aggregated portfolio metrics and project statistics
4
+ *
5
+ * Provides high-level overview of:
6
+ * - Project counts by state and health status
7
+ * - Risk and issue summaries
8
+ * - Financial totals
9
+ */
10
+ import type { HasuraClient } from '../clients/hasura-client.js';
11
+ export type ProjectType = 'project' | 'proposal' | 'all';
12
+ export interface GetDashboardSummaryInput {
13
+ project_type?: ProjectType;
14
+ portfolio_id?: number;
15
+ department_id?: number;
16
+ }
17
+ export interface DashboardSummary {
18
+ projects: {
19
+ total: number;
20
+ by_state: {
21
+ active: number;
22
+ hold: number;
23
+ completed: number;
24
+ cancelled: number;
25
+ pending: number;
26
+ };
27
+ by_health: {
28
+ green: number;
29
+ yellow: number;
30
+ red: number;
31
+ gray: number;
32
+ };
33
+ by_schedule: {
34
+ on_schedule: number;
35
+ ahead: number;
36
+ behind: number;
37
+ unknown: number;
38
+ };
39
+ by_budget: {
40
+ on_budget: number;
41
+ under_budget: number;
42
+ over_budget: number;
43
+ unknown: number;
44
+ };
45
+ };
46
+ risks: {
47
+ total: number;
48
+ open: number;
49
+ closed: number;
50
+ realized: number;
51
+ high_priority: number;
52
+ };
53
+ issues: {
54
+ total: number;
55
+ open: number;
56
+ closed: number;
57
+ resolved: number;
58
+ high_priority: number;
59
+ };
60
+ financials: {
61
+ total_cost_planned: number;
62
+ total_cost_actual: number;
63
+ total_benefits_planned: number;
64
+ total_benefits_actual: number;
65
+ };
66
+ filter: {
67
+ project_type: 'project' | 'proposal' | 'all';
68
+ portfolio_id?: number;
69
+ department_id?: number;
70
+ };
71
+ }
72
+ export declare function getDashboardSummary(input: GetDashboardSummaryInput, hasuraClient: HasuraClient): Promise<DashboardSummary>;
73
+ export declare const getDashboardSummaryTool: {
74
+ name: string;
75
+ description: string;
76
+ inputSchema: {
77
+ type: string;
78
+ properties: {
79
+ project_type: {
80
+ type: string;
81
+ enum: string[];
82
+ description: string;
83
+ default: string;
84
+ };
85
+ portfolio_id: {
86
+ type: string;
87
+ description: string;
88
+ };
89
+ department_id: {
90
+ type: string;
91
+ description: string;
92
+ };
93
+ };
94
+ };
95
+ };
96
+ //# sourceMappingURL=get-dashboard-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-dashboard-summary.d.ts","sourceRoot":"","sources":["../../src/tools/get-dashboard-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;AAEzD,MAAM,WAAW,wBAAwB;IACvC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAE/B,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE;YACR,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,WAAW,EAAE;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,EAAE;YACT,SAAS,EAAE,MAAM,CAAC;YAClB,YAAY,EAAE,MAAM,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IAGF,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IAGF,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IAGF,UAAU,EAAE;QACV,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,sBAAsB,EAAE,MAAM,CAAC;QAC/B,qBAAqB,EAAE,MAAM,CAAC;KAC/B,CAAC;IAGF,MAAM,EAAE;QACN,YAAY,EAAE,SAAS,GAAG,UAAU,GAAG,KAAK,CAAC;QAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAsKD,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,EAC/B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAkF3B;AAMD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;CA+CnC,CAAC"}
@@ -0,0 +1,264 @@
1
+ /**
2
+ * MCP Tool: get_dashboard_summary
3
+ * Returns aggregated portfolio metrics and project statistics
4
+ *
5
+ * Provides high-level overview of:
6
+ * - Project counts by state and health status
7
+ * - Risk and issue summaries
8
+ * - Financial totals
9
+ */
10
+ // ============================================================================
11
+ // GraphQL Query
12
+ // ============================================================================
13
+ function buildDashboardQuery(whereClause) {
14
+ return `
15
+ query GetDashboardSummary {
16
+ # Total projects
17
+ total: projects_aggregate(where: ${whereClause}) {
18
+ aggregate { count }
19
+ }
20
+
21
+ # By state
22
+ active: projects_aggregate(where: { _and: [${whereClause}, { state: { _eq: 0 } }] }) {
23
+ aggregate { count }
24
+ }
25
+ hold: projects_aggregate(where: { _and: [${whereClause}, { state: { _eq: 1 } }] }) {
26
+ aggregate { count }
27
+ }
28
+ completed: projects_aggregate(where: { _and: [${whereClause}, { state: { _eq: 2 } }] }) {
29
+ aggregate { count }
30
+ }
31
+ cancelled: projects_aggregate(where: { _and: [${whereClause}, { state: { _eq: 3 } }] }) {
32
+ aggregate { count }
33
+ }
34
+ pending: projects_aggregate(where: { _and: [${whereClause}, { state: { _eq: 4 } }] }) {
35
+ aggregate { count }
36
+ }
37
+
38
+ # By health status (0=green, 1=yellow, 2=red, 3=gray)
39
+ health_green: projects_aggregate(where: { _and: [${whereClause}, { health_status: { _eq: 0 } }] }) {
40
+ aggregate { count }
41
+ }
42
+ health_yellow: projects_aggregate(where: { _and: [${whereClause}, { health_status: { _eq: 1 } }] }) {
43
+ aggregate { count }
44
+ }
45
+ health_red: projects_aggregate(where: { _and: [${whereClause}, { health_status: { _eq: 2 } }] }) {
46
+ aggregate { count }
47
+ }
48
+ health_gray: projects_aggregate(where: { _and: [${whereClause}, { health_status: { _eq: 3 }, _or: { health_status: { _is_null: true } } }] }) {
49
+ aggregate { count }
50
+ }
51
+
52
+ # By schedule status (0=on/yellow, 1=ahead/green, 2=behind/red, 3=gray)
53
+ schedule_on: projects_aggregate(where: { _and: [${whereClause}, { schedule_status: { _eq: 0 } }] }) {
54
+ aggregate { count }
55
+ }
56
+ schedule_ahead: projects_aggregate(where: { _and: [${whereClause}, { schedule_status: { _eq: 1 } }] }) {
57
+ aggregate { count }
58
+ }
59
+ schedule_behind: projects_aggregate(where: { _and: [${whereClause}, { schedule_status: { _eq: 2 } }] }) {
60
+ aggregate { count }
61
+ }
62
+ schedule_unknown: projects_aggregate(where: { _and: [${whereClause}, { schedule_status: { _eq: 3 }, _or: { schedule_status: { _is_null: true } } }] }) {
63
+ aggregate { count }
64
+ }
65
+
66
+ # By budget status (0=on/yellow, 1=under/green, 2=over/red, 3=gray)
67
+ budget_on: projects_aggregate(where: { _and: [${whereClause}, { budget_status: { _eq: 0 } }] }) {
68
+ aggregate { count }
69
+ }
70
+ budget_under: projects_aggregate(where: { _and: [${whereClause}, { budget_status: { _eq: 1 } }] }) {
71
+ aggregate { count }
72
+ }
73
+ budget_over: projects_aggregate(where: { _and: [${whereClause}, { budget_status: { _eq: 2 } }] }) {
74
+ aggregate { count }
75
+ }
76
+ budget_unknown: projects_aggregate(where: { _and: [${whereClause}, { budget_status: { _eq: 3 }, _or: { budget_status: { _is_null: true } } }] }) {
77
+ aggregate { count }
78
+ }
79
+
80
+ # Financial totals (active projects only)
81
+ financials: projects_aggregate(where: { _and: [${whereClause}, { state: { _eq: 0 } }] }) {
82
+ aggregate {
83
+ sum {
84
+ cost
85
+ cost_actual
86
+ financial_benefits
87
+ financial_benefits_actual
88
+ }
89
+ }
90
+ }
91
+
92
+ # Risks
93
+ risks_total: risks_aggregate {
94
+ aggregate { count }
95
+ }
96
+ risks_open: risks_aggregate(where: { status: { _eq: 0 } }) {
97
+ aggregate { count }
98
+ }
99
+ risks_closed: risks_aggregate(where: { status: { _eq: 1 } }) {
100
+ aggregate { count }
101
+ }
102
+ risks_realized: risks_aggregate(where: { status: { _eq: 2 } }) {
103
+ aggregate { count }
104
+ }
105
+ risks_high_priority: risks_aggregate(where: { priority: { _gte: 3 } }) {
106
+ aggregate { count }
107
+ }
108
+
109
+ # Issues
110
+ issues_total: issues_aggregate {
111
+ aggregate { count }
112
+ }
113
+ issues_open: issues_aggregate(where: { status: { _eq: 0 } }) {
114
+ aggregate { count }
115
+ }
116
+ issues_closed: issues_aggregate(where: { status: { _eq: 1 } }) {
117
+ aggregate { count }
118
+ }
119
+ issues_resolved: issues_aggregate(where: { status: { _eq: 2 } }) {
120
+ aggregate { count }
121
+ }
122
+ issues_high_priority: issues_aggregate(where: { priority: { _gte: 3 } }) {
123
+ aggregate { count }
124
+ }
125
+ }
126
+ `;
127
+ }
128
+ // ============================================================================
129
+ // Helper Functions
130
+ // ============================================================================
131
+ function centsToDollars(cents) {
132
+ return (cents || 0) / 100;
133
+ }
134
+ // ============================================================================
135
+ // Main Handler
136
+ // ============================================================================
137
+ export async function getDashboardSummary(input, hasuraClient) {
138
+ const { project_type = 'project', portfolio_id, department_id } = input;
139
+ // Build where conditions for project filters
140
+ const conditions = [];
141
+ // Filter by project_type (default: 'project', use 'all' to see both)
142
+ if (project_type !== 'all') {
143
+ conditions.push(`{ project_type: { _eq: "${project_type}" } }`);
144
+ }
145
+ if (portfolio_id !== undefined) {
146
+ conditions.push(`{ portfolio_id: { _eq: ${portfolio_id} } }`);
147
+ }
148
+ if (department_id !== undefined) {
149
+ conditions.push(`{ department_id: { _eq: ${department_id} } }`);
150
+ }
151
+ const whereClause = conditions.length === 0
152
+ ? '{}'
153
+ : conditions.length === 1
154
+ ? conditions[0]
155
+ : `{ _and: [${conditions.join(', ')}] }`;
156
+ const query = buildDashboardQuery(whereClause);
157
+ const result = await hasuraClient.query(query, {});
158
+ return {
159
+ projects: {
160
+ total: result.total.aggregate.count,
161
+ by_state: {
162
+ active: result.active.aggregate.count,
163
+ hold: result.hold.aggregate.count,
164
+ completed: result.completed.aggregate.count,
165
+ cancelled: result.cancelled.aggregate.count,
166
+ pending: result.pending.aggregate.count
167
+ },
168
+ by_health: {
169
+ green: result.health_green.aggregate.count,
170
+ yellow: result.health_yellow.aggregate.count,
171
+ red: result.health_red.aggregate.count,
172
+ gray: result.health_gray.aggregate.count
173
+ },
174
+ by_schedule: {
175
+ on_schedule: result.schedule_on.aggregate.count,
176
+ ahead: result.schedule_ahead.aggregate.count,
177
+ behind: result.schedule_behind.aggregate.count,
178
+ unknown: result.schedule_unknown.aggregate.count
179
+ },
180
+ by_budget: {
181
+ on_budget: result.budget_on.aggregate.count,
182
+ under_budget: result.budget_under.aggregate.count,
183
+ over_budget: result.budget_over.aggregate.count,
184
+ unknown: result.budget_unknown.aggregate.count
185
+ }
186
+ },
187
+ risks: {
188
+ total: result.risks_total.aggregate.count,
189
+ open: result.risks_open.aggregate.count,
190
+ closed: result.risks_closed.aggregate.count,
191
+ realized: result.risks_realized.aggregate.count,
192
+ high_priority: result.risks_high_priority.aggregate.count
193
+ },
194
+ issues: {
195
+ total: result.issues_total.aggregate.count,
196
+ open: result.issues_open.aggregate.count,
197
+ closed: result.issues_closed.aggregate.count,
198
+ resolved: result.issues_resolved.aggregate.count,
199
+ high_priority: result.issues_high_priority.aggregate.count
200
+ },
201
+ financials: {
202
+ total_cost_planned: centsToDollars(result.financials.aggregate.sum.cost),
203
+ total_cost_actual: centsToDollars(result.financials.aggregate.sum.cost_actual),
204
+ total_benefits_planned: centsToDollars(result.financials.aggregate.sum.financial_benefits),
205
+ total_benefits_actual: centsToDollars(result.financials.aggregate.sum.financial_benefits_actual)
206
+ },
207
+ filter: {
208
+ project_type,
209
+ portfolio_id,
210
+ department_id
211
+ }
212
+ };
213
+ }
214
+ // ============================================================================
215
+ // Tool Definition
216
+ // ============================================================================
217
+ export const getDashboardSummaryTool = {
218
+ name: 'get_dashboard_summary',
219
+ description: `
220
+ Get aggregated portfolio metrics and project/proposal statistics.
221
+
222
+ Provides a high-level overview perfect for executive summaries or quick health checks.
223
+
224
+ RETURNS:
225
+ - projects: counts by state, health, schedule, and budget status
226
+ - risks: total, open/closed/realized, high priority count
227
+ - issues: total, open/closed/resolved, high priority count
228
+ - financials: total planned vs actual costs and benefits (in dollars)
229
+
230
+ OPTIONAL FILTERS:
231
+ - project_type: "project" (default), "proposal", or "all"
232
+ - portfolio_id: Filter to specific portfolio
233
+ - department_id: Filter to specific department
234
+
235
+ EXAMPLES:
236
+ - "Give me a portfolio overview" → (no filters - all projects)
237
+ - "Dashboard for proposals" → project_type: "proposal"
238
+ - "Dashboard for Engineering department" → department_id: 5
239
+ - "Summary for portfolio 12" → portfolio_id: 12
240
+ - "Overall summary (projects + proposals)" → project_type: "all"
241
+ - "How many projects are behind schedule?" → Use by_schedule.behind from response
242
+ - "What's our financial status?" → Use financials from response
243
+ `.trim(),
244
+ inputSchema: {
245
+ type: 'object',
246
+ properties: {
247
+ project_type: {
248
+ type: 'string',
249
+ enum: ['project', 'proposal', 'all'],
250
+ description: 'Type to summarize: "project" (default), "proposal", or "all"',
251
+ default: 'project'
252
+ },
253
+ portfolio_id: {
254
+ type: 'number',
255
+ description: 'Filter to specific portfolio'
256
+ },
257
+ department_id: {
258
+ type: 'number',
259
+ description: 'Filter to specific department'
260
+ }
261
+ }
262
+ }
263
+ };
264
+ //# sourceMappingURL=get-dashboard-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-dashboard-summary.js","sourceRoot":"","sources":["../../src/tools/get-dashboard-summary.ts"],"names":[],"mappings":"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"}