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,200 @@
1
+ /**
2
+ * MCP Tool: list_projects
3
+ * Lists all projects 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: state, health_status, schedule_status, budget_status, etc.
9
+ */
10
+ import type { HasuraClient } from '../clients/hasura-client.js';
11
+ export type ProjectState = 'active' | 'hold' | 'completed' | 'cancelled' | 'pending';
12
+ export type StoplightStatus = 'green' | 'yellow' | 'red' | 'gray';
13
+ export type ProjectType = 'project' | 'proposal' | 'all';
14
+ export interface ListProjectsInput {
15
+ project_type?: ProjectType;
16
+ state?: ProjectState | ProjectState[];
17
+ health_status?: StoplightStatus | StoplightStatus[];
18
+ schedule_status?: StoplightStatus | StoplightStatus[];
19
+ budget_status?: StoplightStatus | StoplightStatus[];
20
+ department_id?: number;
21
+ category_id?: number;
22
+ lifecycle_id?: number;
23
+ strategic_objective_id?: number;
24
+ portfolio_id?: number;
25
+ order_by?: 'rank' | 'updated_at' | 'name';
26
+ limit?: number;
27
+ offset?: number;
28
+ }
29
+ export interface ProjectListItem {
30
+ id: number;
31
+ name: string;
32
+ description: string | null;
33
+ project_type: 'project' | 'proposal';
34
+ state: ProjectState;
35
+ health_status: StoplightStatus | null;
36
+ schedule_status: StoplightStatus | null;
37
+ budget_status: StoplightStatus | null;
38
+ quality_status: StoplightStatus | null;
39
+ percent_complete: number;
40
+ start_date: string | null;
41
+ end_date: string | null;
42
+ value_priority_score: number | null;
43
+ risk_priority_score: number | null;
44
+ portfolio: {
45
+ id: number;
46
+ name: string;
47
+ } | null;
48
+ department: {
49
+ id: number;
50
+ name: string;
51
+ } | null;
52
+ category: {
53
+ id: number;
54
+ name: string;
55
+ } | null;
56
+ lifecycle: {
57
+ id: number;
58
+ name: string;
59
+ } | null;
60
+ strategic_objective: {
61
+ id: number;
62
+ name: string;
63
+ } | null;
64
+ project_manager: {
65
+ id: number;
66
+ name: string;
67
+ } | null;
68
+ open_risks_count: number;
69
+ closed_risks_count: number;
70
+ total_risks_count: number;
71
+ open_issues_count: number;
72
+ closed_issues_count: number;
73
+ total_issues_count: number;
74
+ open_benefits_count: number;
75
+ closed_benefits_count: number;
76
+ total_benefits_count: number;
77
+ total_lessons_count: number;
78
+ }
79
+ export interface ListProjectsResult {
80
+ projects: ProjectListItem[];
81
+ total_count: number;
82
+ has_more: boolean;
83
+ offset: number;
84
+ }
85
+ /**
86
+ * List projects handler
87
+ */
88
+ export declare function listProjects(input: ListProjectsInput, hasuraClient: HasuraClient): Promise<ListProjectsResult>;
89
+ export declare const listProjectsTool: {
90
+ name: string;
91
+ description: string;
92
+ inputSchema: {
93
+ type: string;
94
+ properties: {
95
+ project_type: {
96
+ type: string;
97
+ enum: string[];
98
+ description: string;
99
+ default: string;
100
+ };
101
+ state: {
102
+ oneOf: ({
103
+ type: string;
104
+ enum: string[];
105
+ items?: undefined;
106
+ } | {
107
+ type: string;
108
+ items: {
109
+ type: string;
110
+ enum: string[];
111
+ };
112
+ enum?: undefined;
113
+ })[];
114
+ description: string;
115
+ };
116
+ health_status: {
117
+ oneOf: ({
118
+ type: string;
119
+ enum: string[];
120
+ items?: undefined;
121
+ } | {
122
+ type: string;
123
+ items: {
124
+ type: string;
125
+ enum: string[];
126
+ };
127
+ enum?: undefined;
128
+ })[];
129
+ description: string;
130
+ };
131
+ schedule_status: {
132
+ oneOf: ({
133
+ type: string;
134
+ enum: string[];
135
+ items?: undefined;
136
+ } | {
137
+ type: string;
138
+ items: {
139
+ type: string;
140
+ enum: string[];
141
+ };
142
+ enum?: undefined;
143
+ })[];
144
+ description: string;
145
+ };
146
+ budget_status: {
147
+ oneOf: ({
148
+ type: string;
149
+ enum: string[];
150
+ items?: undefined;
151
+ } | {
152
+ type: string;
153
+ items: {
154
+ type: string;
155
+ enum: string[];
156
+ };
157
+ enum?: undefined;
158
+ })[];
159
+ description: string;
160
+ };
161
+ department_id: {
162
+ type: string;
163
+ description: string;
164
+ };
165
+ category_id: {
166
+ type: string;
167
+ description: string;
168
+ };
169
+ lifecycle_id: {
170
+ type: string;
171
+ description: string;
172
+ };
173
+ strategic_objective_id: {
174
+ type: string;
175
+ description: string;
176
+ };
177
+ portfolio_id: {
178
+ type: string;
179
+ description: string;
180
+ };
181
+ order_by: {
182
+ type: string;
183
+ enum: string[];
184
+ description: string;
185
+ default: string;
186
+ };
187
+ limit: {
188
+ type: string;
189
+ description: string;
190
+ default: number;
191
+ };
192
+ offset: {
193
+ type: string;
194
+ description: string;
195
+ default: number;
196
+ };
197
+ };
198
+ };
199
+ };
200
+ //# sourceMappingURL=list-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,396 @@
1
+ /**
2
+ * MCP Tool: list_projects
3
+ * Lists all projects 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: state, health_status, schedule_status, budget_status, etc.
9
+ */
10
+ // ============================================================================
11
+ // Enum Mappings
12
+ // ============================================================================
13
+ /**
14
+ * Enum mappings: string → DB integer
15
+ * Verified against Rails models and frontend configs (see strategy-notes.md)
16
+ */
17
+ const STATE_TO_DB = {
18
+ active: 0,
19
+ hold: 1,
20
+ completed: 2,
21
+ cancelled: 3,
22
+ pending: 4
23
+ };
24
+ const STOPLIGHT_TO_DB = {
25
+ green: 0,
26
+ yellow: 1,
27
+ red: 2,
28
+ gray: 3
29
+ };
30
+ // Special case: schedule_status and budget_status have different order!
31
+ // yellow=0 (on schedule/budget), green=1 (ahead/under), red=2 (behind/over)
32
+ const SCHEDULE_BUDGET_TO_DB = {
33
+ yellow: 0, // on schedule / on budget
34
+ green: 1, // ahead of schedule / under budget
35
+ red: 2, // behind schedule / over budget
36
+ gray: 3
37
+ };
38
+ /**
39
+ * Reverse mappings: DB integer → string
40
+ */
41
+ const DB_TO_STATE = {
42
+ 0: 'active',
43
+ 1: 'hold',
44
+ 2: 'completed',
45
+ 3: 'cancelled',
46
+ 4: 'pending'
47
+ };
48
+ const DB_TO_STOPLIGHT = {
49
+ 0: 'green',
50
+ 1: 'yellow',
51
+ 2: 'red',
52
+ 3: 'gray'
53
+ };
54
+ const DB_TO_SCHEDULE_BUDGET = {
55
+ 0: 'yellow', // on schedule / on budget
56
+ 1: 'green', // ahead / under
57
+ 2: 'red', // behind / over
58
+ 3: 'gray'
59
+ };
60
+ // ============================================================================
61
+ // Helper Functions
62
+ // ============================================================================
63
+ /**
64
+ * Convert enum values to DB integers for WHERE clause
65
+ */
66
+ function toDbValues(values, mapping) {
67
+ if (values === undefined)
68
+ return undefined;
69
+ const arr = Array.isArray(values) ? values : [values];
70
+ return arr.map(v => mapping[v]).filter(n => n !== undefined);
71
+ }
72
+ /**
73
+ * Convert a single DB integer to string
74
+ */
75
+ function fromDbValue(value, mapping) {
76
+ if (value === null || value === undefined)
77
+ return null;
78
+ return mapping[value] ?? null;
79
+ }
80
+ /**
81
+ * Transform raw DB project to formatted output with resolved enums
82
+ */
83
+ function transformProject(raw) {
84
+ return {
85
+ id: raw.id,
86
+ name: raw.name,
87
+ description: raw.description,
88
+ project_type: raw.project_type,
89
+ // Convert enums from integers to strings
90
+ state: fromDbValue(raw.state, DB_TO_STATE) ?? 'active',
91
+ health_status: fromDbValue(raw.health_status, DB_TO_STOPLIGHT),
92
+ schedule_status: fromDbValue(raw.schedule_status, DB_TO_SCHEDULE_BUDGET),
93
+ budget_status: fromDbValue(raw.budget_status, DB_TO_SCHEDULE_BUDGET),
94
+ quality_status: fromDbValue(raw.quality_status, DB_TO_STOPLIGHT),
95
+ percent_complete: raw.percent_complete ?? 0,
96
+ start_date: raw.start_date,
97
+ end_date: raw.end_date,
98
+ value_priority_score: raw.value_priority_score,
99
+ risk_priority_score: raw.risk_priority_score,
100
+ // Relationships are already resolved by Hasura
101
+ portfolio: raw.portfolio,
102
+ department: raw.department,
103
+ category: raw.category,
104
+ lifecycle: raw.lifecycle,
105
+ strategic_objective: raw.strategic_objective,
106
+ project_manager: raw.project_manager,
107
+ // Counts (default to 0)
108
+ open_risks_count: raw.open_risks_count ?? 0,
109
+ closed_risks_count: raw.closed_risks_count ?? 0,
110
+ total_risks_count: raw.total_risks_count ?? 0,
111
+ open_issues_count: raw.open_issues_count ?? 0,
112
+ closed_issues_count: raw.closed_issues_count ?? 0,
113
+ total_issues_count: raw.total_issues_count ?? 0,
114
+ open_benefits_count: raw.open_benefits_count ?? 0,
115
+ closed_benefits_count: raw.closed_benefits_count ?? 0,
116
+ total_benefits_count: raw.total_benefits_count ?? 0,
117
+ total_lessons_count: raw.total_lessons_count ?? 0
118
+ };
119
+ }
120
+ // ============================================================================
121
+ // Main Handler
122
+ // ============================================================================
123
+ /**
124
+ * List projects handler
125
+ */
126
+ export async function listProjects(input, hasuraClient) {
127
+ const { project_type = 'project', state, health_status, schedule_status, budget_status, department_id, category_id, lifecycle_id, strategic_objective_id, portfolio_id, order_by = 'updated_at', limit = 15, offset = 0 } = input;
128
+ // Build where conditions
129
+ const whereConditions = {};
130
+ // Filter by project_type (default: 'project', use 'all' to see both)
131
+ if (project_type !== 'all') {
132
+ whereConditions.project_type = { _eq: project_type };
133
+ }
134
+ // When sorting by rank, ONLY show active projects
135
+ // This matches frontend behavior where rank only applies to active projects
136
+ if (order_by === 'rank') {
137
+ whereConditions.state = { _eq: STATE_TO_DB.active };
138
+ }
139
+ else {
140
+ // Convert state filter
141
+ const stateValues = toDbValues(state, STATE_TO_DB);
142
+ if (stateValues && stateValues.length > 0) {
143
+ whereConditions.state = stateValues.length === 1
144
+ ? { _eq: stateValues[0] }
145
+ : { _in: stateValues };
146
+ }
147
+ }
148
+ // Convert stoplight filters
149
+ const healthValues = toDbValues(health_status, STOPLIGHT_TO_DB);
150
+ if (healthValues && healthValues.length > 0) {
151
+ whereConditions.health_status = healthValues.length === 1
152
+ ? { _eq: healthValues[0] }
153
+ : { _in: healthValues };
154
+ }
155
+ const scheduleValues = toDbValues(schedule_status, SCHEDULE_BUDGET_TO_DB);
156
+ if (scheduleValues && scheduleValues.length > 0) {
157
+ whereConditions.schedule_status = scheduleValues.length === 1
158
+ ? { _eq: scheduleValues[0] }
159
+ : { _in: scheduleValues };
160
+ }
161
+ const budgetValues = toDbValues(budget_status, SCHEDULE_BUDGET_TO_DB);
162
+ if (budgetValues && budgetValues.length > 0) {
163
+ whereConditions.budget_status = budgetValues.length === 1
164
+ ? { _eq: budgetValues[0] }
165
+ : { _in: budgetValues };
166
+ }
167
+ // ID filters
168
+ if (portfolio_id !== undefined) {
169
+ whereConditions.portfolio_id = { _eq: portfolio_id };
170
+ }
171
+ if (department_id !== undefined) {
172
+ whereConditions.department_id = { _eq: department_id };
173
+ }
174
+ if (category_id !== undefined) {
175
+ whereConditions.category_id = { _eq: category_id };
176
+ }
177
+ if (lifecycle_id !== undefined) {
178
+ whereConditions.lifecycle_id = { _eq: lifecycle_id };
179
+ }
180
+ if (strategic_objective_id !== undefined) {
181
+ whereConditions.strategic_objective_id = { _eq: strategic_objective_id };
182
+ }
183
+ // Build order_by clause
184
+ let orderByClause = '{ updated_at: desc }';
185
+ if (order_by === 'rank') {
186
+ // Sort by value_priority_score DESC, risk_priority_score ASC, id ASC
187
+ // This replicates frontend logic in prepareRankForProjects
188
+ orderByClause = '[{ value_priority_score: desc_nulls_last }, { risk_priority_score: asc_nulls_last }, { id: asc }]';
189
+ }
190
+ else if (order_by === 'name') {
191
+ orderByClause = '{ name: asc }';
192
+ }
193
+ // Build GraphQL query with relationships
194
+ const whereClause = JSON.stringify(whereConditions).replace(/"([^"]+)":/g, '$1:');
195
+ const query = `
196
+ query ListProjects($limit: Int!, $offset: Int!) {
197
+ projects(
198
+ where: ${whereClause},
199
+ order_by: ${orderByClause},
200
+ limit: $limit,
201
+ offset: $offset
202
+ ) {
203
+ id
204
+ name
205
+ description
206
+ project_type
207
+ state
208
+ health_status
209
+ schedule_status
210
+ budget_status
211
+ quality_status
212
+ percent_complete
213
+ start_date
214
+ end_date
215
+ value_priority_score
216
+ risk_priority_score
217
+
218
+ # Relationships - Hasura resolves automatically
219
+ portfolio { id name }
220
+ department { id name }
221
+ category { id name }
222
+ lifecycle { id name }
223
+ strategic_objective { id name }
224
+ project_manager { id name }
225
+
226
+ # Counts (cached on project)
227
+ open_risks_count
228
+ closed_risks_count
229
+ total_risks_count
230
+ open_issues_count
231
+ closed_issues_count
232
+ total_issues_count
233
+ open_benefits_count
234
+ closed_benefits_count
235
+ total_benefits_count
236
+ total_lessons_count
237
+ }
238
+
239
+ projects_aggregate(where: ${whereClause}) {
240
+ aggregate {
241
+ count
242
+ }
243
+ }
244
+ }
245
+ `;
246
+ const result = await hasuraClient.query(query, { limit, offset });
247
+ const totalCount = result.projects_aggregate.aggregate.count;
248
+ const transformedProjects = result.projects.map(transformProject);
249
+ return {
250
+ projects: transformedProjects,
251
+ total_count: totalCount,
252
+ has_more: offset + result.projects.length < totalCount,
253
+ offset
254
+ };
255
+ }
256
+ // ============================================================================
257
+ // Tool Definition
258
+ // ============================================================================
259
+ export const listProjectsTool = {
260
+ name: 'list_projects',
261
+ description: `
262
+ List projects OR proposals the user has access to with optional filtering.
263
+
264
+ IMPORTANT: This tool handles BOTH projects and proposals. They are stored in the same table with different project_type values:
265
+ - project_type: "project" (default) - Active/approved projects being executed
266
+ - project_type: "proposal" - Project proposals awaiting approval
267
+ - project_type: "all" - Both projects and proposals
268
+
269
+ Returns summaries including:
270
+ - Basic info (id, name, description, project_type, state)
271
+ - Health indicators (health_status, schedule_status, budget_status, quality_status)
272
+ - Progress (percent_complete) and dates (start_date, end_date)
273
+ - Scoring (value_priority_score, risk_priority_score)
274
+ - Relationships with NAMES resolved: portfolio, department, category, lifecycle, strategic_objective, project_manager
275
+ - Counts: open_risks_count, closed_risks_count, total_risks_count, open_issues_count, closed_issues_count, total_issues_count, total_lessons_count
276
+
277
+ PROJECT TYPE (default: "project"):
278
+ - "project" - Only active/approved projects
279
+ - "proposal" - Only proposals awaiting approval
280
+ - "all" - Both projects and proposals
281
+
282
+ FILTER VALUES:
283
+
284
+ state: "active", "hold", "completed", "cancelled", "pending"
285
+ - Can pass single value or array: state: "active" OR state: ["active", "hold"]
286
+
287
+ health_status / quality_status: "green", "yellow", "red", "gray"
288
+ - green = healthy/good
289
+ - yellow = caution/warning
290
+ - red = critical/problem
291
+ - gray = unknown/not set
292
+
293
+ schedule_status: "yellow", "green", "red", "gray"
294
+ - yellow = on schedule
295
+ - green = ahead of schedule
296
+ - red = behind schedule
297
+
298
+ budget_status: "yellow", "green", "red", "gray"
299
+ - yellow = on budget
300
+ - green = under budget
301
+ - red = over budget
302
+
303
+ SORTING:
304
+ - "updated_at" (default) - most recently updated first
305
+ - "name" - alphabetical
306
+ - "rank" - sorts by VALUE score (highest value_priority_score first, then lowest risk_priority_score, then id).
307
+ Only shows ACTIVE projects. Use for: "top ranked", "highest value", "best projects", "top 10 projects".
308
+ NOTE: The "rank" field in database is NOT used. Ranking is calculated from value_priority_score and risk_priority_score.
309
+
310
+ EXAMPLES:
311
+ - "Show all active projects" → state: "active"
312
+ - "List all proposals" → project_type: "proposal"
313
+ - "Show pending proposals" → project_type: "proposal", state: "pending"
314
+ - "Projects at risk" → health_status: ["yellow", "red"]
315
+ - "Behind schedule projects" → schedule_status: "red"
316
+ - "Projects in Engineering department" → department_id: 5
317
+ - "Top 10 ranked projects" → order_by: "rank", limit: 10
318
+ - "All items (projects + proposals)" → project_type: "all"
319
+ `.trim(),
320
+ inputSchema: {
321
+ type: 'object',
322
+ properties: {
323
+ project_type: {
324
+ type: 'string',
325
+ enum: ['project', 'proposal', 'all'],
326
+ description: 'Type of items to list. "project" = active projects (default), "proposal" = proposals awaiting approval, "all" = both',
327
+ default: 'project'
328
+ },
329
+ state: {
330
+ oneOf: [
331
+ { type: 'string', enum: ['active', 'hold', 'completed', 'cancelled', 'pending'] },
332
+ { type: 'array', items: { type: 'string', enum: ['active', 'hold', 'completed', 'cancelled', 'pending'] } }
333
+ ],
334
+ description: 'Filter by project state. Can be single value or array.'
335
+ },
336
+ health_status: {
337
+ oneOf: [
338
+ { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] },
339
+ { type: 'array', items: { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] } }
340
+ ],
341
+ description: 'Filter by health status (green=good, yellow=caution, red=critical)'
342
+ },
343
+ schedule_status: {
344
+ oneOf: [
345
+ { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] },
346
+ { type: 'array', items: { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] } }
347
+ ],
348
+ description: 'Filter by schedule status (yellow=on schedule, green=ahead, red=behind)'
349
+ },
350
+ budget_status: {
351
+ oneOf: [
352
+ { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] },
353
+ { type: 'array', items: { type: 'string', enum: ['green', 'yellow', 'red', 'gray'] } }
354
+ ],
355
+ description: 'Filter by budget status (yellow=on budget, green=under, red=over)'
356
+ },
357
+ department_id: {
358
+ type: 'number',
359
+ description: 'Filter by department ID'
360
+ },
361
+ category_id: {
362
+ type: 'number',
363
+ description: 'Filter by category ID'
364
+ },
365
+ lifecycle_id: {
366
+ type: 'number',
367
+ description: 'Filter by lifecycle ID'
368
+ },
369
+ strategic_objective_id: {
370
+ type: 'number',
371
+ description: 'Filter by strategic objective ID'
372
+ },
373
+ portfolio_id: {
374
+ type: 'number',
375
+ description: 'Filter by portfolio ID'
376
+ },
377
+ order_by: {
378
+ type: 'string',
379
+ enum: ['rank', 'updated_at', 'name'],
380
+ description: 'Sort order. "rank" = by value_priority_score (only active projects). Use "rank" for "top projects", "best ranked", "highest value".',
381
+ default: 'updated_at'
382
+ },
383
+ limit: {
384
+ type: 'number',
385
+ description: 'Maximum projects to return (default: 15, max: 100)',
386
+ default: 15
387
+ },
388
+ offset: {
389
+ type: 'number',
390
+ description: 'Skip this many projects for pagination (default: 0)',
391
+ default: 0
392
+ }
393
+ }
394
+ }
395
+ };
396
+ //# sourceMappingURL=list-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"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"}