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,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: list_issues
|
|
3
|
+
* Lists all issues the user has access to with optional filtering
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Enum conversion: input strings → DB integers, DB integers → output strings
|
|
7
|
+
* - Hasura relationships: returns resolved names instead of IDs
|
|
8
|
+
* - Multiple filters: status, priority, severity, project_id
|
|
9
|
+
*/
|
|
10
|
+
import type { HasuraClient } from '../clients/hasura-client.js';
|
|
11
|
+
export type IssueStatus = 'open' | 'closed' | 'resolved';
|
|
12
|
+
export type IssuePriority = 'very_low' | 'low' | 'medium' | 'high' | 'critical';
|
|
13
|
+
export interface ListIssuesInput {
|
|
14
|
+
project_id?: number;
|
|
15
|
+
status?: IssueStatus | IssueStatus[];
|
|
16
|
+
priority?: IssuePriority | IssuePriority[];
|
|
17
|
+
severity?: number | number[];
|
|
18
|
+
order_by?: 'priority' | 'severity' | 'created_at' | 'updated_at' | 'resolution_date';
|
|
19
|
+
limit?: number;
|
|
20
|
+
offset?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface IssueListItem {
|
|
23
|
+
id: number;
|
|
24
|
+
issue_id: number;
|
|
25
|
+
name: string;
|
|
26
|
+
description: string | null;
|
|
27
|
+
notes: string | null;
|
|
28
|
+
hyperlinks: string | null;
|
|
29
|
+
status: IssueStatus;
|
|
30
|
+
priority: IssuePriority;
|
|
31
|
+
severity: number;
|
|
32
|
+
areas_of_impact: string | null;
|
|
33
|
+
action_plan: string | null;
|
|
34
|
+
resolution: string | null;
|
|
35
|
+
resolution_date: string | null;
|
|
36
|
+
created_at: string;
|
|
37
|
+
updated_at: string;
|
|
38
|
+
project: {
|
|
39
|
+
id: number;
|
|
40
|
+
name: string;
|
|
41
|
+
} | null;
|
|
42
|
+
owner: {
|
|
43
|
+
id: number;
|
|
44
|
+
name: string;
|
|
45
|
+
} | null;
|
|
46
|
+
}
|
|
47
|
+
export interface ListIssuesResult {
|
|
48
|
+
issues: IssueListItem[];
|
|
49
|
+
total_count: number;
|
|
50
|
+
has_more: boolean;
|
|
51
|
+
offset: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* List issues handler
|
|
55
|
+
*/
|
|
56
|
+
export declare function listIssues(input: ListIssuesInput, hasuraClient: HasuraClient): Promise<ListIssuesResult>;
|
|
57
|
+
export declare const listIssuesTool: {
|
|
58
|
+
name: string;
|
|
59
|
+
description: string;
|
|
60
|
+
inputSchema: {
|
|
61
|
+
type: string;
|
|
62
|
+
properties: {
|
|
63
|
+
project_id: {
|
|
64
|
+
type: string;
|
|
65
|
+
description: string;
|
|
66
|
+
};
|
|
67
|
+
status: {
|
|
68
|
+
oneOf: ({
|
|
69
|
+
type: string;
|
|
70
|
+
enum: string[];
|
|
71
|
+
items?: undefined;
|
|
72
|
+
} | {
|
|
73
|
+
type: string;
|
|
74
|
+
items: {
|
|
75
|
+
type: string;
|
|
76
|
+
enum: string[];
|
|
77
|
+
};
|
|
78
|
+
enum?: undefined;
|
|
79
|
+
})[];
|
|
80
|
+
description: string;
|
|
81
|
+
};
|
|
82
|
+
priority: {
|
|
83
|
+
oneOf: ({
|
|
84
|
+
type: string;
|
|
85
|
+
enum: string[];
|
|
86
|
+
items?: undefined;
|
|
87
|
+
} | {
|
|
88
|
+
type: string;
|
|
89
|
+
items: {
|
|
90
|
+
type: string;
|
|
91
|
+
enum: string[];
|
|
92
|
+
};
|
|
93
|
+
enum?: undefined;
|
|
94
|
+
})[];
|
|
95
|
+
description: string;
|
|
96
|
+
};
|
|
97
|
+
severity: {
|
|
98
|
+
oneOf: ({
|
|
99
|
+
type: string;
|
|
100
|
+
minimum: number;
|
|
101
|
+
maximum: number;
|
|
102
|
+
items?: undefined;
|
|
103
|
+
} | {
|
|
104
|
+
type: string;
|
|
105
|
+
items: {
|
|
106
|
+
type: string;
|
|
107
|
+
minimum: number;
|
|
108
|
+
maximum: number;
|
|
109
|
+
};
|
|
110
|
+
minimum?: undefined;
|
|
111
|
+
maximum?: undefined;
|
|
112
|
+
})[];
|
|
113
|
+
description: string;
|
|
114
|
+
};
|
|
115
|
+
order_by: {
|
|
116
|
+
type: string;
|
|
117
|
+
enum: string[];
|
|
118
|
+
description: string;
|
|
119
|
+
default: string;
|
|
120
|
+
};
|
|
121
|
+
limit: {
|
|
122
|
+
type: string;
|
|
123
|
+
description: string;
|
|
124
|
+
default: number;
|
|
125
|
+
};
|
|
126
|
+
offset: {
|
|
127
|
+
type: string;
|
|
128
|
+
description: string;
|
|
129
|
+
default: number;
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=list-issues.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-issues.d.ts","sourceRoot":"","sources":["../../src/tools/list-issues.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,EAAE,aAAa,GAAG,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,iBAAiB,CAAC;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAG1B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IAGjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAG/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7C,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAiID;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAkH3B;AAMD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyF1B,CAAC"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: list_issues
|
|
3
|
+
* Lists all issues the user has access to with optional filtering
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Enum conversion: input strings → DB integers, DB integers → output strings
|
|
7
|
+
* - Hasura relationships: returns resolved names instead of IDs
|
|
8
|
+
* - Multiple filters: status, priority, severity, project_id
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Enum Mappings
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Enum mappings: string → DB integer
|
|
15
|
+
* Verified against Rails model issue.rb
|
|
16
|
+
*/
|
|
17
|
+
const STATUS_TO_DB = {
|
|
18
|
+
open: 0,
|
|
19
|
+
closed: 1,
|
|
20
|
+
resolved: 2
|
|
21
|
+
};
|
|
22
|
+
const PRIORITY_TO_DB = {
|
|
23
|
+
very_low: 0,
|
|
24
|
+
low: 1,
|
|
25
|
+
medium: 2,
|
|
26
|
+
high: 3,
|
|
27
|
+
critical: 4
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Reverse mappings: DB integer → string
|
|
31
|
+
*/
|
|
32
|
+
const DB_TO_STATUS = {
|
|
33
|
+
0: 'open',
|
|
34
|
+
1: 'closed',
|
|
35
|
+
2: 'resolved'
|
|
36
|
+
};
|
|
37
|
+
const DB_TO_PRIORITY = {
|
|
38
|
+
0: 'very_low',
|
|
39
|
+
1: 'low',
|
|
40
|
+
2: 'medium',
|
|
41
|
+
3: 'high',
|
|
42
|
+
4: 'critical'
|
|
43
|
+
};
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Helper Functions
|
|
46
|
+
// ============================================================================
|
|
47
|
+
/**
|
|
48
|
+
* Convert enum values to DB integers for WHERE clause
|
|
49
|
+
*/
|
|
50
|
+
function toDbValues(values, mapping) {
|
|
51
|
+
if (values === undefined)
|
|
52
|
+
return undefined;
|
|
53
|
+
const arr = Array.isArray(values) ? values : [values];
|
|
54
|
+
return arr.map(v => mapping[v]).filter(n => n !== undefined);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Convert a single DB integer to string
|
|
58
|
+
*/
|
|
59
|
+
function fromDbValue(value, mapping) {
|
|
60
|
+
if (value === null || value === undefined)
|
|
61
|
+
return null;
|
|
62
|
+
return mapping[value] ?? null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Transform raw DB issue to formatted output with resolved enums
|
|
66
|
+
*/
|
|
67
|
+
function transformIssue(raw) {
|
|
68
|
+
return {
|
|
69
|
+
id: raw.id,
|
|
70
|
+
issue_id: raw.issue_id,
|
|
71
|
+
name: raw.name,
|
|
72
|
+
description: raw.description,
|
|
73
|
+
notes: raw.notes,
|
|
74
|
+
hyperlinks: raw.hyperlinks,
|
|
75
|
+
// Convert enums from integers to strings
|
|
76
|
+
status: fromDbValue(raw.status, DB_TO_STATUS) ?? 'open',
|
|
77
|
+
priority: fromDbValue(raw.priority, DB_TO_PRIORITY) ?? 'low',
|
|
78
|
+
severity: raw.severity ?? 1,
|
|
79
|
+
areas_of_impact: raw.areas_of_impact,
|
|
80
|
+
action_plan: raw.action_plan,
|
|
81
|
+
resolution: raw.resolution,
|
|
82
|
+
resolution_date: raw.resolution_date,
|
|
83
|
+
created_at: raw.created_at,
|
|
84
|
+
updated_at: raw.updated_at,
|
|
85
|
+
// Relationships - transform company_project_resource to owner
|
|
86
|
+
project: raw.project,
|
|
87
|
+
owner: raw.company_project_resource
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Main Handler
|
|
92
|
+
// ============================================================================
|
|
93
|
+
/**
|
|
94
|
+
* List issues handler
|
|
95
|
+
*/
|
|
96
|
+
export async function listIssues(input, hasuraClient) {
|
|
97
|
+
const { project_id, status, priority, severity, order_by = 'created_at', limit = 20, offset = 0 } = input;
|
|
98
|
+
// Build where conditions
|
|
99
|
+
const whereConditions = {};
|
|
100
|
+
// Project filter
|
|
101
|
+
if (project_id !== undefined) {
|
|
102
|
+
whereConditions.project_id = { _eq: project_id };
|
|
103
|
+
}
|
|
104
|
+
// Status filter
|
|
105
|
+
const statusValues = toDbValues(status, STATUS_TO_DB);
|
|
106
|
+
if (statusValues && statusValues.length > 0) {
|
|
107
|
+
whereConditions.status = statusValues.length === 1
|
|
108
|
+
? { _eq: statusValues[0] }
|
|
109
|
+
: { _in: statusValues };
|
|
110
|
+
}
|
|
111
|
+
// Priority filter
|
|
112
|
+
const priorityValues = toDbValues(priority, PRIORITY_TO_DB);
|
|
113
|
+
if (priorityValues && priorityValues.length > 0) {
|
|
114
|
+
whereConditions.priority = priorityValues.length === 1
|
|
115
|
+
? { _eq: priorityValues[0] }
|
|
116
|
+
: { _in: priorityValues };
|
|
117
|
+
}
|
|
118
|
+
// Severity filter (integer, not enum)
|
|
119
|
+
if (severity !== undefined) {
|
|
120
|
+
const severityArr = Array.isArray(severity) ? severity : [severity];
|
|
121
|
+
if (severityArr.length === 1) {
|
|
122
|
+
whereConditions.severity = { _eq: severityArr[0] };
|
|
123
|
+
}
|
|
124
|
+
else if (severityArr.length > 1) {
|
|
125
|
+
whereConditions.severity = { _in: severityArr };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Build order_by clause
|
|
129
|
+
let orderByClause = '{ created_at: desc }';
|
|
130
|
+
switch (order_by) {
|
|
131
|
+
case 'priority':
|
|
132
|
+
orderByClause = '{ priority: desc }';
|
|
133
|
+
break;
|
|
134
|
+
case 'severity':
|
|
135
|
+
orderByClause = '{ severity: desc_nulls_last }';
|
|
136
|
+
break;
|
|
137
|
+
case 'updated_at':
|
|
138
|
+
orderByClause = '{ updated_at: desc }';
|
|
139
|
+
break;
|
|
140
|
+
case 'resolution_date':
|
|
141
|
+
orderByClause = '{ resolution_date: desc_nulls_last }';
|
|
142
|
+
break;
|
|
143
|
+
// 'created_at' is default
|
|
144
|
+
}
|
|
145
|
+
// Build GraphQL query with relationships
|
|
146
|
+
const whereClause = JSON.stringify(whereConditions).replace(/"([^"]+)":/g, '$1:');
|
|
147
|
+
const query = `
|
|
148
|
+
query ListIssues($limit: Int!, $offset: Int!) {
|
|
149
|
+
issues(
|
|
150
|
+
where: ${whereClause},
|
|
151
|
+
order_by: ${orderByClause},
|
|
152
|
+
limit: $limit,
|
|
153
|
+
offset: $offset
|
|
154
|
+
) {
|
|
155
|
+
id
|
|
156
|
+
issue_id
|
|
157
|
+
name
|
|
158
|
+
description
|
|
159
|
+
notes
|
|
160
|
+
hyperlinks
|
|
161
|
+
status
|
|
162
|
+
priority
|
|
163
|
+
severity
|
|
164
|
+
areas_of_impact
|
|
165
|
+
action_plan
|
|
166
|
+
resolution
|
|
167
|
+
resolution_date
|
|
168
|
+
created_at
|
|
169
|
+
updated_at
|
|
170
|
+
|
|
171
|
+
# Relationships - Hasura resolves automatically
|
|
172
|
+
project { id name }
|
|
173
|
+
company_project_resource { id name }
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
issues_aggregate(where: ${whereClause}) {
|
|
177
|
+
aggregate {
|
|
178
|
+
count
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
`;
|
|
183
|
+
const result = await hasuraClient.query(query, { limit, offset });
|
|
184
|
+
const totalCount = result.issues_aggregate.aggregate.count;
|
|
185
|
+
const transformedIssues = result.issues.map(transformIssue);
|
|
186
|
+
return {
|
|
187
|
+
issues: transformedIssues,
|
|
188
|
+
total_count: totalCount,
|
|
189
|
+
has_more: offset + result.issues.length < totalCount,
|
|
190
|
+
offset
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// ============================================================================
|
|
194
|
+
// Tool Definition
|
|
195
|
+
// ============================================================================
|
|
196
|
+
export const listIssuesTool = {
|
|
197
|
+
name: 'list_issues',
|
|
198
|
+
description: `
|
|
199
|
+
List issues the user has access to with optional filtering.
|
|
200
|
+
|
|
201
|
+
Returns issue information including:
|
|
202
|
+
- Identifiers: id, issue_id (human-readable within company)
|
|
203
|
+
- Content: name, description, notes, hyperlinks
|
|
204
|
+
- Status & Classification: status, priority, severity (1-5 integer)
|
|
205
|
+
- Action content: areas_of_impact, action_plan, resolution
|
|
206
|
+
- Dates: created_at, updated_at, resolution_date
|
|
207
|
+
- Relationships with NAMES: project, owner (the person responsible)
|
|
208
|
+
|
|
209
|
+
FILTER VALUES:
|
|
210
|
+
|
|
211
|
+
status: "open", "closed", "resolved"
|
|
212
|
+
- open = active issue being addressed
|
|
213
|
+
- closed = issue no longer relevant (not fixed)
|
|
214
|
+
- resolved = issue has been fixed/solved
|
|
215
|
+
|
|
216
|
+
priority: "very_low", "low", "medium", "high", "critical"
|
|
217
|
+
- Indicates importance/urgency of addressing the issue
|
|
218
|
+
|
|
219
|
+
severity: 1, 2, 3, 4, 5 (integer)
|
|
220
|
+
- 1 = minimal impact
|
|
221
|
+
- 5 = severe impact
|
|
222
|
+
- Note: This is an integer, not an enum like risks
|
|
223
|
+
|
|
224
|
+
SORTING:
|
|
225
|
+
- "created_at" (default) - newest first
|
|
226
|
+
- "updated_at" - recently updated first
|
|
227
|
+
- "priority" - highest priority first
|
|
228
|
+
- "severity" - highest severity first
|
|
229
|
+
- "resolution_date" - recently resolved first
|
|
230
|
+
|
|
231
|
+
EXAMPLES:
|
|
232
|
+
- "Show all open issues" → status: "open"
|
|
233
|
+
- "High priority issues" → priority: ["high", "critical"]
|
|
234
|
+
- "Issues for project 123" → project_id: 123
|
|
235
|
+
- "Severe issues (severity 4-5)" → severity: [4, 5]
|
|
236
|
+
- "Top 10 highest priority issues" → order_by: "priority", limit: 10
|
|
237
|
+
`.trim(),
|
|
238
|
+
inputSchema: {
|
|
239
|
+
type: 'object',
|
|
240
|
+
properties: {
|
|
241
|
+
project_id: {
|
|
242
|
+
type: 'number',
|
|
243
|
+
description: 'Filter by project ID'
|
|
244
|
+
},
|
|
245
|
+
status: {
|
|
246
|
+
oneOf: [
|
|
247
|
+
{ type: 'string', enum: ['open', 'closed', 'resolved'] },
|
|
248
|
+
{ type: 'array', items: { type: 'string', enum: ['open', 'closed', 'resolved'] } }
|
|
249
|
+
],
|
|
250
|
+
description: 'Filter by issue status. Can be single value or array.'
|
|
251
|
+
},
|
|
252
|
+
priority: {
|
|
253
|
+
oneOf: [
|
|
254
|
+
{ type: 'string', enum: ['very_low', 'low', 'medium', 'high', 'critical'] },
|
|
255
|
+
{ type: 'array', items: { type: 'string', enum: ['very_low', 'low', 'medium', 'high', 'critical'] } }
|
|
256
|
+
],
|
|
257
|
+
description: 'Filter by priority level'
|
|
258
|
+
},
|
|
259
|
+
severity: {
|
|
260
|
+
oneOf: [
|
|
261
|
+
{ type: 'number', minimum: 1, maximum: 5 },
|
|
262
|
+
{ type: 'array', items: { type: 'number', minimum: 1, maximum: 5 } }
|
|
263
|
+
],
|
|
264
|
+
description: 'Filter by severity (1-5 integer). Can be single value or array.'
|
|
265
|
+
},
|
|
266
|
+
order_by: {
|
|
267
|
+
type: 'string',
|
|
268
|
+
enum: ['priority', 'severity', 'created_at', 'updated_at', 'resolution_date'],
|
|
269
|
+
description: 'Sort order',
|
|
270
|
+
default: 'created_at'
|
|
271
|
+
},
|
|
272
|
+
limit: {
|
|
273
|
+
type: 'number',
|
|
274
|
+
description: 'Maximum issues to return (default: 20, max: 100)',
|
|
275
|
+
default: 20
|
|
276
|
+
},
|
|
277
|
+
offset: {
|
|
278
|
+
type: 'number',
|
|
279
|
+
description: 'Skip this many issues for pagination (default: 0)',
|
|
280
|
+
default: 0
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
//# sourceMappingURL=list-issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-issues.js","sourceRoot":"","sources":["../../src/tools/list-issues.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: list_lessons_learned
|
|
3
|
+
* Lists all lessons learned the user has access to with optional filtering
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Hasura relationships: returns resolved names instead of IDs
|
|
7
|
+
* - Filter by project_id or project_phase_id
|
|
8
|
+
*/
|
|
9
|
+
import type { HasuraClient } from '../clients/hasura-client.js';
|
|
10
|
+
export interface ListLessonsLearnedInput {
|
|
11
|
+
project_id?: number;
|
|
12
|
+
project_phase_id?: number;
|
|
13
|
+
order_by?: 'created_at' | 'updated_at';
|
|
14
|
+
limit?: number;
|
|
15
|
+
offset?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface LessonLearnedListItem {
|
|
18
|
+
id: number;
|
|
19
|
+
lesson_id: number;
|
|
20
|
+
description: string | null;
|
|
21
|
+
lesson_learned: string | null;
|
|
22
|
+
impact: string | null;
|
|
23
|
+
recommendation: string | null;
|
|
24
|
+
identified_by: string | null;
|
|
25
|
+
created_at: string;
|
|
26
|
+
updated_at: string;
|
|
27
|
+
project: {
|
|
28
|
+
id: number;
|
|
29
|
+
name: string;
|
|
30
|
+
} | null;
|
|
31
|
+
lifecycle: {
|
|
32
|
+
id: number;
|
|
33
|
+
name: string;
|
|
34
|
+
} | null;
|
|
35
|
+
}
|
|
36
|
+
export interface ListLessonsLearnedResult {
|
|
37
|
+
lessons_learned: LessonLearnedListItem[];
|
|
38
|
+
total_count: number;
|
|
39
|
+
has_more: boolean;
|
|
40
|
+
offset: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* List lessons learned handler
|
|
44
|
+
*/
|
|
45
|
+
export declare function listLessonsLearned(input: ListLessonsLearnedInput, hasuraClient: HasuraClient): Promise<ListLessonsLearnedResult>;
|
|
46
|
+
export declare const listLessonsLearnedTool: {
|
|
47
|
+
name: string;
|
|
48
|
+
description: string;
|
|
49
|
+
inputSchema: {
|
|
50
|
+
type: string;
|
|
51
|
+
properties: {
|
|
52
|
+
project_id: {
|
|
53
|
+
type: string;
|
|
54
|
+
description: string;
|
|
55
|
+
};
|
|
56
|
+
project_phase_id: {
|
|
57
|
+
type: string;
|
|
58
|
+
description: string;
|
|
59
|
+
};
|
|
60
|
+
order_by: {
|
|
61
|
+
type: string;
|
|
62
|
+
enum: string[];
|
|
63
|
+
description: string;
|
|
64
|
+
default: string;
|
|
65
|
+
};
|
|
66
|
+
limit: {
|
|
67
|
+
type: string;
|
|
68
|
+
description: string;
|
|
69
|
+
default: number;
|
|
70
|
+
};
|
|
71
|
+
offset: {
|
|
72
|
+
type: string;
|
|
73
|
+
description: string;
|
|
74
|
+
default: number;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=list-lessons-learned.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-lessons-learned.d.ts","sourceRoot":"","sources":["../../src/tools/list-lessons-learned.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAG7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IAGnB,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7C,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,qBAAqB,EAAE,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAuDD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,EAC9B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,wBAAwB,CAAC,CAwEnC;AAMD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDlC,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: list_lessons_learned
|
|
3
|
+
* Lists all lessons learned the user has access to with optional filtering
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Hasura relationships: returns resolved names instead of IDs
|
|
7
|
+
* - Filter by project_id or project_phase_id
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Helper Functions
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Transform raw DB lesson to formatted output
|
|
14
|
+
*/
|
|
15
|
+
function transformLesson(raw) {
|
|
16
|
+
return {
|
|
17
|
+
id: raw.id,
|
|
18
|
+
lesson_id: raw.lesson_id,
|
|
19
|
+
description: raw.description,
|
|
20
|
+
lesson_learned: raw.lesson_learned,
|
|
21
|
+
impact: raw.impact,
|
|
22
|
+
recommendation: raw.recommendation,
|
|
23
|
+
identified_by: raw.identified_by,
|
|
24
|
+
created_at: raw.created_at,
|
|
25
|
+
updated_at: raw.updated_at,
|
|
26
|
+
// Relationships - already resolved by Hasura
|
|
27
|
+
project: raw.project,
|
|
28
|
+
lifecycle: raw.lifecycle
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// Main Handler
|
|
33
|
+
// ============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* List lessons learned handler
|
|
36
|
+
*/
|
|
37
|
+
export async function listLessonsLearned(input, hasuraClient) {
|
|
38
|
+
const { project_id, project_phase_id, order_by = 'created_at', limit = 20, offset = 0 } = input;
|
|
39
|
+
// Build where conditions
|
|
40
|
+
const whereConditions = {};
|
|
41
|
+
// Project filter
|
|
42
|
+
if (project_id !== undefined) {
|
|
43
|
+
whereConditions.project_id = { _eq: project_id };
|
|
44
|
+
}
|
|
45
|
+
// Project phase (lifecycle) filter
|
|
46
|
+
if (project_phase_id !== undefined) {
|
|
47
|
+
whereConditions.project_phase_id = { _eq: project_phase_id };
|
|
48
|
+
}
|
|
49
|
+
// Build order_by clause
|
|
50
|
+
const orderByClause = order_by === 'updated_at'
|
|
51
|
+
? '{ updated_at: desc }'
|
|
52
|
+
: '{ created_at: desc }';
|
|
53
|
+
// Build GraphQL query with relationships
|
|
54
|
+
const whereClause = JSON.stringify(whereConditions).replace(/"([^"]+)":/g, '$1:');
|
|
55
|
+
const query = `
|
|
56
|
+
query ListLessonsLearned($limit: Int!, $offset: Int!) {
|
|
57
|
+
project_learned_lessons(
|
|
58
|
+
where: ${whereClause},
|
|
59
|
+
order_by: ${orderByClause},
|
|
60
|
+
limit: $limit,
|
|
61
|
+
offset: $offset
|
|
62
|
+
) {
|
|
63
|
+
id
|
|
64
|
+
lesson_id
|
|
65
|
+
description
|
|
66
|
+
lesson_learned
|
|
67
|
+
impact
|
|
68
|
+
recommendation
|
|
69
|
+
identified_by
|
|
70
|
+
created_at
|
|
71
|
+
updated_at
|
|
72
|
+
|
|
73
|
+
# Relationships - Hasura resolves automatically
|
|
74
|
+
project { id name }
|
|
75
|
+
lifecycle { id name }
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
project_learned_lessons_aggregate(where: ${whereClause}) {
|
|
79
|
+
aggregate {
|
|
80
|
+
count
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
const result = await hasuraClient.query(query, { limit, offset });
|
|
86
|
+
const totalCount = result.project_learned_lessons_aggregate.aggregate.count;
|
|
87
|
+
const transformedLessons = result.project_learned_lessons.map(transformLesson);
|
|
88
|
+
return {
|
|
89
|
+
lessons_learned: transformedLessons,
|
|
90
|
+
total_count: totalCount,
|
|
91
|
+
has_more: offset + result.project_learned_lessons.length < totalCount,
|
|
92
|
+
offset
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// Tool Definition
|
|
97
|
+
// ============================================================================
|
|
98
|
+
export const listLessonsLearnedTool = {
|
|
99
|
+
name: 'list_lessons_learned',
|
|
100
|
+
description: `
|
|
101
|
+
List lessons learned the user has access to with optional filtering.
|
|
102
|
+
|
|
103
|
+
Returns lessons learned information including:
|
|
104
|
+
- Identifiers: id, lesson_id (human-readable within company)
|
|
105
|
+
- Content: description, lesson_learned (main content), impact, recommendation
|
|
106
|
+
- Who identified: identified_by (text field with person's name)
|
|
107
|
+
- Dates: created_at, updated_at
|
|
108
|
+
- Relationships with NAMES: project, lifecycle (project phase when lesson was learned)
|
|
109
|
+
|
|
110
|
+
CONTENT FIELDS:
|
|
111
|
+
- description: Brief summary of the situation
|
|
112
|
+
- lesson_learned: The main lesson/insight gained
|
|
113
|
+
- impact: What impact this had on the project
|
|
114
|
+
- recommendation: Suggested actions for future projects
|
|
115
|
+
|
|
116
|
+
SORTING:
|
|
117
|
+
- "created_at" (default) - newest first
|
|
118
|
+
- "updated_at" - recently updated first
|
|
119
|
+
|
|
120
|
+
EXAMPLES:
|
|
121
|
+
- "Show all lessons learned" → (no filters)
|
|
122
|
+
- "Lessons for project 123" → project_id: 123
|
|
123
|
+
- "Lessons from Planning phase" → project_phase_id: 1 (need lifecycle ID)
|
|
124
|
+
`.trim(),
|
|
125
|
+
inputSchema: {
|
|
126
|
+
type: 'object',
|
|
127
|
+
properties: {
|
|
128
|
+
project_id: {
|
|
129
|
+
type: 'number',
|
|
130
|
+
description: 'Filter by project ID'
|
|
131
|
+
},
|
|
132
|
+
project_phase_id: {
|
|
133
|
+
type: 'number',
|
|
134
|
+
description: 'Filter by project phase/lifecycle ID'
|
|
135
|
+
},
|
|
136
|
+
order_by: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
enum: ['created_at', 'updated_at'],
|
|
139
|
+
description: 'Sort order',
|
|
140
|
+
default: 'created_at'
|
|
141
|
+
},
|
|
142
|
+
limit: {
|
|
143
|
+
type: 'number',
|
|
144
|
+
description: 'Maximum lessons to return (default: 20, max: 100)',
|
|
145
|
+
default: 20
|
|
146
|
+
},
|
|
147
|
+
offset: {
|
|
148
|
+
type: 'number',
|
|
149
|
+
description: 'Skip this many lessons for pagination (default: 0)',
|
|
150
|
+
default: 0
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=list-lessons-learned.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-lessons-learned.js","sourceRoot":"","sources":["../../src/tools/list-lessons-learned.ts"],"names":[],"mappings":"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"}
|