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.
- package/README.md +541 -0
- package/dist/auth/device-flow.d.ts +46 -0
- package/dist/auth/device-flow.d.ts.map +1 -0
- package/dist/auth/device-flow.js +141 -0
- package/dist/auth/device-flow.js.map +1 -0
- package/dist/auth/http-auth.d.ts +25 -0
- package/dist/auth/http-auth.d.ts.map +1 -0
- package/dist/auth/http-auth.js +101 -0
- package/dist/auth/http-auth.js.map +1 -0
- package/dist/auth/jwt-validator.d.ts +20 -0
- package/dist/auth/jwt-validator.d.ts.map +1 -0
- package/dist/auth/jwt-validator.js +83 -0
- package/dist/auth/jwt-validator.js.map +1 -0
- package/dist/auth/token-storage.d.ts +88 -0
- package/dist/auth/token-storage.d.ts.map +1 -0
- package/dist/auth/token-storage.js +273 -0
- package/dist/auth/token-storage.js.map +1 -0
- package/dist/clients/hasura-client.d.ts +33 -0
- package/dist/clients/hasura-client.d.ts.map +1 -0
- package/dist/clients/hasura-client.js +79 -0
- package/dist/clients/hasura-client.js.map +1 -0
- package/dist/config/environments.d.ts +51 -0
- package/dist/config/environments.d.ts.map +1 -0
- package/dist/config/environments.js +183 -0
- package/dist/config/environments.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +593 -0
- package/dist/index.js.map +1 -0
- package/dist/server/http-server.d.ts +14 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +167 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/mcp-core.d.ts +12 -0
- package/dist/server/mcp-core.d.ts.map +1 -0
- package/dist/server/mcp-core.js +200 -0
- package/dist/server/mcp-core.js.map +1 -0
- package/dist/tools/acuity-init.d.ts +84 -0
- package/dist/tools/acuity-init.d.ts.map +1 -0
- package/dist/tools/acuity-init.js +239 -0
- package/dist/tools/acuity-init.js.map +1 -0
- package/dist/tools/get-dashboard-summary.d.ts +96 -0
- package/dist/tools/get-dashboard-summary.d.ts.map +1 -0
- package/dist/tools/get-dashboard-summary.js +264 -0
- package/dist/tools/get-dashboard-summary.js.map +1 -0
- package/dist/tools/get-issue.d.ts +62 -0
- package/dist/tools/get-issue.d.ts.map +1 -0
- package/dist/tools/get-issue.js +150 -0
- package/dist/tools/get-issue.js.map +1 -0
- package/dist/tools/get-lesson-learned.d.ts +53 -0
- package/dist/tools/get-lesson-learned.d.ts.map +1 -0
- package/dist/tools/get-lesson-learned.js +117 -0
- package/dist/tools/get-lesson-learned.js.map +1 -0
- package/dist/tools/get-lookup-values.d.ts +41 -0
- package/dist/tools/get-lookup-values.d.ts.map +1 -0
- package/dist/tools/get-lookup-values.js +127 -0
- package/dist/tools/get-lookup-values.js.map +1 -0
- package/dist/tools/get-project.d.ts +131 -0
- package/dist/tools/get-project.d.ts.map +1 -0
- package/dist/tools/get-project.js +340 -0
- package/dist/tools/get-project.js.map +1 -0
- package/dist/tools/get-risk.d.ts +65 -0
- package/dist/tools/get-risk.d.ts.map +1 -0
- package/dist/tools/get-risk.js +173 -0
- package/dist/tools/get-risk.js.map +1 -0
- package/dist/tools/get-status-reports.d.ts +46 -0
- package/dist/tools/get-status-reports.d.ts.map +1 -0
- package/dist/tools/get-status-reports.js +151 -0
- package/dist/tools/get-status-reports.js.map +1 -0
- package/dist/tools/init-auth.d.ts +47 -0
- package/dist/tools/init-auth.d.ts.map +1 -0
- package/dist/tools/init-auth.js +213 -0
- package/dist/tools/init-auth.js.map +1 -0
- package/dist/tools/list-issues.d.ts +134 -0
- package/dist/tools/list-issues.d.ts.map +1 -0
- package/dist/tools/list-issues.js +285 -0
- package/dist/tools/list-issues.js.map +1 -0
- package/dist/tools/list-lessons-learned.d.ts +79 -0
- package/dist/tools/list-lessons-learned.d.ts.map +1 -0
- package/dist/tools/list-lessons-learned.js +155 -0
- package/dist/tools/list-lessons-learned.js.map +1 -0
- package/dist/tools/list-projects.d.ts +200 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +396 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-risks.d.ts +166 -0
- package/dist/tools/list-risks.d.ts.map +1 -0
- package/dist/tools/list-risks.js +356 -0
- package/dist/tools/list-risks.js.map +1 -0
- package/dist/tools/search-projects.d.ts +90 -0
- package/dist/tools/search-projects.d.ts.map +1 -0
- package/dist/tools/search-projects.js +191 -0
- package/dist/tools/search-projects.js.map +1 -0
- package/dist/utils/formatters.d.ts +12 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +28 -0
- package/dist/utils/formatters.js.map +1 -0
- package/openapi.yaml +194 -0
- 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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"}
|