@delorenj/mcp-server-trello 1.2.0 → 1.5.1
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 +383 -373
- package/build/health/health-endpoints.d.ts +131 -0
- package/build/health/health-endpoints.js +476 -0
- package/build/health/health-endpoints.js.map +1 -0
- package/build/health/health-monitor.d.ts +136 -0
- package/build/health/health-monitor.js +507 -0
- package/build/health/health-monitor.js.map +1 -0
- package/build/index.js +756 -1
- package/build/index.js.map +1 -1
- package/build/trello-client.d.ts +14 -1
- package/build/trello-client.js +164 -68
- package/build/trello-client.js.map +1 -1
- package/build/types.d.ts +2 -2
- package/package.json +12 -27
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { TrelloClient } from '../trello-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Health endpoint result structure for MCP tools
|
|
4
|
+
*/
|
|
5
|
+
interface HealthEndpointResult {
|
|
6
|
+
[x: string]: unknown;
|
|
7
|
+
content: Array<{
|
|
8
|
+
type: 'text';
|
|
9
|
+
text: string;
|
|
10
|
+
}>;
|
|
11
|
+
isError?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* THE MAGNIFICENT HEALTH ENDPOINTS COLLECTION! 🏥
|
|
15
|
+
*
|
|
16
|
+
* This class provides all the cardiovascular monitoring APIs that keep
|
|
17
|
+
* our Trello MCP organism in peak condition. It's like having a team of
|
|
18
|
+
* world-class physicians monitoring your API 24/7!
|
|
19
|
+
*
|
|
20
|
+
* Available endpoints:
|
|
21
|
+
* - /health - Quick health check
|
|
22
|
+
* - /health/detailed - Comprehensive diagnostic report
|
|
23
|
+
* - /health/metadata - Metadata consistency verification
|
|
24
|
+
* - /health/performance - Performance metrics analysis
|
|
25
|
+
* - /admin/repair - Automated repair capabilities (when available)
|
|
26
|
+
*/
|
|
27
|
+
export declare class TrelloHealthEndpoints {
|
|
28
|
+
private healthMonitor;
|
|
29
|
+
private trelloClient;
|
|
30
|
+
constructor(trelloClient: TrelloClient);
|
|
31
|
+
/**
|
|
32
|
+
* GET /health
|
|
33
|
+
* Quick health status check - the digital pulse check!
|
|
34
|
+
* Perfect for load balancers and monitoring systems.
|
|
35
|
+
*/
|
|
36
|
+
getBasicHealth(): Promise<HealthEndpointResult>;
|
|
37
|
+
/**
|
|
38
|
+
* GET /health/detailed
|
|
39
|
+
* Comprehensive health diagnostic - the full medical examination!
|
|
40
|
+
* Includes all subsystem checks, performance metrics, and recommendations.
|
|
41
|
+
*/
|
|
42
|
+
getDetailedHealth(): Promise<HealthEndpointResult>;
|
|
43
|
+
/**
|
|
44
|
+
* GET /health/metadata
|
|
45
|
+
* Metadata consistency verification - the data integrity scanner!
|
|
46
|
+
* Checks for consistency between boards, lists, cards, and checklists.
|
|
47
|
+
*/
|
|
48
|
+
getMetadataHealth(): Promise<HealthEndpointResult>;
|
|
49
|
+
/**
|
|
50
|
+
* GET /health/performance
|
|
51
|
+
* Performance metrics analysis - the cardiovascular stress test!
|
|
52
|
+
* Deep dive into response times, throughput, and system efficiency.
|
|
53
|
+
*/
|
|
54
|
+
getPerformanceHealth(): Promise<HealthEndpointResult>;
|
|
55
|
+
/**
|
|
56
|
+
* POST /admin/repair
|
|
57
|
+
* Automated system repair - the digital emergency room!
|
|
58
|
+
* Attempts to automatically fix common issues when possible.
|
|
59
|
+
*/
|
|
60
|
+
performRepair(): Promise<HealthEndpointResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Perform comprehensive metadata consistency check
|
|
63
|
+
*/
|
|
64
|
+
private performMetadataConsistencyCheck;
|
|
65
|
+
/**
|
|
66
|
+
* Generate metadata-specific recommendations
|
|
67
|
+
*/
|
|
68
|
+
private generateMetadataRecommendations;
|
|
69
|
+
/**
|
|
70
|
+
* Analyze performance metrics in detail
|
|
71
|
+
*/
|
|
72
|
+
private analyzePerformanceMetrics;
|
|
73
|
+
/**
|
|
74
|
+
* Calculate overall performance grade
|
|
75
|
+
*/
|
|
76
|
+
private calculatePerformanceGrade;
|
|
77
|
+
/**
|
|
78
|
+
* Get performance status based on grade
|
|
79
|
+
*/
|
|
80
|
+
private getPerformanceStatus;
|
|
81
|
+
/**
|
|
82
|
+
* Rate individual performance aspects
|
|
83
|
+
*/
|
|
84
|
+
private rateResponseTime;
|
|
85
|
+
private rateSuccessRate;
|
|
86
|
+
private rateThroughput;
|
|
87
|
+
private rateRateLimitUtilization;
|
|
88
|
+
/**
|
|
89
|
+
* Generate performance-specific recommendations
|
|
90
|
+
*/
|
|
91
|
+
private generatePerformanceRecommendations;
|
|
92
|
+
/**
|
|
93
|
+
* Attempt to repair common system issues
|
|
94
|
+
*/
|
|
95
|
+
private attemptSystemRepair;
|
|
96
|
+
/**
|
|
97
|
+
* Create standardized error response
|
|
98
|
+
*/
|
|
99
|
+
private createErrorResponse;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Zod schemas for health endpoint validation
|
|
103
|
+
*/
|
|
104
|
+
export declare const HealthEndpointSchemas: {
|
|
105
|
+
basicHealth: {
|
|
106
|
+
title: string;
|
|
107
|
+
description: string;
|
|
108
|
+
inputSchema: {};
|
|
109
|
+
};
|
|
110
|
+
detailedHealth: {
|
|
111
|
+
title: string;
|
|
112
|
+
description: string;
|
|
113
|
+
inputSchema: {};
|
|
114
|
+
};
|
|
115
|
+
metadataHealth: {
|
|
116
|
+
title: string;
|
|
117
|
+
description: string;
|
|
118
|
+
inputSchema: {};
|
|
119
|
+
};
|
|
120
|
+
performanceHealth: {
|
|
121
|
+
title: string;
|
|
122
|
+
description: string;
|
|
123
|
+
inputSchema: {};
|
|
124
|
+
};
|
|
125
|
+
repair: {
|
|
126
|
+
title: string;
|
|
127
|
+
description: string;
|
|
128
|
+
inputSchema: {};
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
export {};
|
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { TrelloHealthMonitor, HealthStatus } from './health-monitor.js';
|
|
2
|
+
/**
|
|
3
|
+
* THE MAGNIFICENT HEALTH ENDPOINTS COLLECTION! 🏥
|
|
4
|
+
*
|
|
5
|
+
* This class provides all the cardiovascular monitoring APIs that keep
|
|
6
|
+
* our Trello MCP organism in peak condition. It's like having a team of
|
|
7
|
+
* world-class physicians monitoring your API 24/7!
|
|
8
|
+
*
|
|
9
|
+
* Available endpoints:
|
|
10
|
+
* - /health - Quick health check
|
|
11
|
+
* - /health/detailed - Comprehensive diagnostic report
|
|
12
|
+
* - /health/metadata - Metadata consistency verification
|
|
13
|
+
* - /health/performance - Performance metrics analysis
|
|
14
|
+
* - /admin/repair - Automated repair capabilities (when available)
|
|
15
|
+
*/
|
|
16
|
+
export class TrelloHealthEndpoints {
|
|
17
|
+
constructor(trelloClient) {
|
|
18
|
+
this.trelloClient = trelloClient;
|
|
19
|
+
this.healthMonitor = new TrelloHealthMonitor(trelloClient);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* GET /health
|
|
23
|
+
* Quick health status check - the digital pulse check!
|
|
24
|
+
* Perfect for load balancers and monitoring systems.
|
|
25
|
+
*/
|
|
26
|
+
async getBasicHealth() {
|
|
27
|
+
try {
|
|
28
|
+
const healthReport = await this.healthMonitor.getSystemHealth(false);
|
|
29
|
+
const quickReport = {
|
|
30
|
+
status: healthReport.overall_status,
|
|
31
|
+
timestamp: healthReport.timestamp,
|
|
32
|
+
uptime_ms: healthReport.uptime_ms,
|
|
33
|
+
checks_passed: healthReport.checks.filter(c => c.status === HealthStatus.HEALTHY).length,
|
|
34
|
+
total_checks: healthReport.checks.length,
|
|
35
|
+
response_time_ms: Math.round(healthReport.performance_metrics.avg_response_time_ms),
|
|
36
|
+
success_rate: `${healthReport.performance_metrics.success_rate_percent}%`
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
content: [{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: JSON.stringify(quickReport, null, 2)
|
|
42
|
+
}],
|
|
43
|
+
isError: healthReport.overall_status === HealthStatus.CRITICAL
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return this.createErrorResponse('Health check failed', error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* GET /health/detailed
|
|
52
|
+
* Comprehensive health diagnostic - the full medical examination!
|
|
53
|
+
* Includes all subsystem checks, performance metrics, and recommendations.
|
|
54
|
+
*/
|
|
55
|
+
async getDetailedHealth() {
|
|
56
|
+
try {
|
|
57
|
+
const healthReport = await this.healthMonitor.getSystemHealth(true);
|
|
58
|
+
return {
|
|
59
|
+
content: [{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: JSON.stringify(healthReport, null, 2)
|
|
62
|
+
}],
|
|
63
|
+
isError: healthReport.overall_status === HealthStatus.CRITICAL
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return this.createErrorResponse('Detailed health check failed', error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* GET /health/metadata
|
|
72
|
+
* Metadata consistency verification - the data integrity scanner!
|
|
73
|
+
* Checks for consistency between boards, lists, cards, and checklists.
|
|
74
|
+
*/
|
|
75
|
+
async getMetadataHealth() {
|
|
76
|
+
try {
|
|
77
|
+
const startTime = Date.now();
|
|
78
|
+
const metadataReport = await this.performMetadataConsistencyCheck();
|
|
79
|
+
const duration = Date.now() - startTime;
|
|
80
|
+
const result = {
|
|
81
|
+
status: metadataReport.consistent ? HealthStatus.HEALTHY : HealthStatus.DEGRADED,
|
|
82
|
+
timestamp: new Date().toISOString(),
|
|
83
|
+
duration_ms: duration,
|
|
84
|
+
metadata_consistency: metadataReport,
|
|
85
|
+
recommendations: this.generateMetadataRecommendations(metadataReport)
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
content: [{
|
|
89
|
+
type: 'text',
|
|
90
|
+
text: JSON.stringify(result, null, 2)
|
|
91
|
+
}],
|
|
92
|
+
isError: !metadataReport.consistent
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
return this.createErrorResponse('Metadata health check failed', error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* GET /health/performance
|
|
101
|
+
* Performance metrics analysis - the cardiovascular stress test!
|
|
102
|
+
* Deep dive into response times, throughput, and system efficiency.
|
|
103
|
+
*/
|
|
104
|
+
async getPerformanceHealth() {
|
|
105
|
+
try {
|
|
106
|
+
const healthReport = await this.healthMonitor.getSystemHealth(false);
|
|
107
|
+
const performanceAnalysis = this.analyzePerformanceMetrics(healthReport);
|
|
108
|
+
return {
|
|
109
|
+
content: [{
|
|
110
|
+
type: 'text',
|
|
111
|
+
text: JSON.stringify(performanceAnalysis, null, 2)
|
|
112
|
+
}],
|
|
113
|
+
isError: performanceAnalysis.status === HealthStatus.CRITICAL
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
return this.createErrorResponse('Performance health check failed', error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* POST /admin/repair
|
|
122
|
+
* Automated system repair - the digital emergency room!
|
|
123
|
+
* Attempts to automatically fix common issues when possible.
|
|
124
|
+
*/
|
|
125
|
+
async performRepair() {
|
|
126
|
+
try {
|
|
127
|
+
const healthReport = await this.healthMonitor.getSystemHealth(true);
|
|
128
|
+
if (!healthReport.repair_available) {
|
|
129
|
+
return {
|
|
130
|
+
content: [{
|
|
131
|
+
type: 'text',
|
|
132
|
+
text: JSON.stringify({
|
|
133
|
+
repair_attempted: false,
|
|
134
|
+
reason: 'No repairable issues detected or system in critical state',
|
|
135
|
+
status: healthReport.overall_status,
|
|
136
|
+
recommendations: healthReport.recommendations
|
|
137
|
+
}, null, 2)
|
|
138
|
+
}]
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const repairResult = await this.attemptSystemRepair(healthReport);
|
|
142
|
+
return {
|
|
143
|
+
content: [{
|
|
144
|
+
type: 'text',
|
|
145
|
+
text: JSON.stringify(repairResult, null, 2)
|
|
146
|
+
}],
|
|
147
|
+
isError: !repairResult.success
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
return this.createErrorResponse('System repair failed', error);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Perform comprehensive metadata consistency check
|
|
156
|
+
*/
|
|
157
|
+
async performMetadataConsistencyCheck() {
|
|
158
|
+
const results = {
|
|
159
|
+
consistent: true,
|
|
160
|
+
issues: [],
|
|
161
|
+
statistics: {},
|
|
162
|
+
last_check: new Date().toISOString()
|
|
163
|
+
};
|
|
164
|
+
try {
|
|
165
|
+
// Check if we have an active board
|
|
166
|
+
const boardId = this.trelloClient.activeBoardId;
|
|
167
|
+
if (!boardId) {
|
|
168
|
+
results.consistent = false;
|
|
169
|
+
results.issues.push('No active board configured');
|
|
170
|
+
return results;
|
|
171
|
+
}
|
|
172
|
+
// Get board information
|
|
173
|
+
const board = await this.trelloClient.getBoardById(boardId);
|
|
174
|
+
if (board.closed) {
|
|
175
|
+
results.consistent = false;
|
|
176
|
+
results.issues.push('Active board is closed/archived');
|
|
177
|
+
}
|
|
178
|
+
// Get lists and check consistency
|
|
179
|
+
const lists = await this.trelloClient.getLists();
|
|
180
|
+
results.statistics.total_lists = lists.length;
|
|
181
|
+
results.statistics.open_lists = lists.filter(l => !l.closed).length;
|
|
182
|
+
results.statistics.closed_lists = lists.filter(l => l.closed).length;
|
|
183
|
+
// Check for empty board
|
|
184
|
+
if (lists.length === 0) {
|
|
185
|
+
results.issues.push('Board has no lists');
|
|
186
|
+
}
|
|
187
|
+
// Get user cards for comparison
|
|
188
|
+
const myCards = await this.trelloClient.getMyCards();
|
|
189
|
+
results.statistics.total_user_cards = myCards.length;
|
|
190
|
+
results.statistics.open_user_cards = myCards.filter(c => !c.closed).length;
|
|
191
|
+
// Check workspace consistency
|
|
192
|
+
const workspaceId = this.trelloClient.activeWorkspaceId;
|
|
193
|
+
if (workspaceId) {
|
|
194
|
+
try {
|
|
195
|
+
const workspace = await this.trelloClient.getWorkspaceById(workspaceId);
|
|
196
|
+
results.statistics.active_workspace = workspace.displayName;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
results.consistent = false;
|
|
200
|
+
results.issues.push('Active workspace is inaccessible');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Check checklist accessibility (non-critical)
|
|
204
|
+
try {
|
|
205
|
+
const acceptanceCriteria = await this.trelloClient.getAcceptanceCriteria();
|
|
206
|
+
results.statistics.acceptance_criteria_items = acceptanceCriteria.length;
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
// This is not critical for consistency
|
|
210
|
+
results.statistics.checklist_note = 'Acceptance Criteria checklist not found (non-critical)';
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
results.consistent = false;
|
|
215
|
+
results.issues.push(`Metadata check error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
216
|
+
}
|
|
217
|
+
return results;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Generate metadata-specific recommendations
|
|
221
|
+
*/
|
|
222
|
+
generateMetadataRecommendations(metadataReport) {
|
|
223
|
+
const recommendations = [];
|
|
224
|
+
if (metadataReport.issues.some((issue) => issue.includes('No active board'))) {
|
|
225
|
+
recommendations.push('Use set_active_board tool to configure an active board');
|
|
226
|
+
}
|
|
227
|
+
if (metadataReport.issues.some((issue) => issue.includes('closed/archived'))) {
|
|
228
|
+
recommendations.push('Set a different active board that is not closed/archived');
|
|
229
|
+
}
|
|
230
|
+
if (metadataReport.issues.some((issue) => issue.includes('no lists'))) {
|
|
231
|
+
recommendations.push('Create lists in your board using add_list_to_board tool');
|
|
232
|
+
}
|
|
233
|
+
if (metadataReport.statistics.total_user_cards === 0) {
|
|
234
|
+
recommendations.push('Consider assigning yourself to some cards for better workflow tracking');
|
|
235
|
+
}
|
|
236
|
+
if (recommendations.length === 0) {
|
|
237
|
+
recommendations.push('Metadata consistency is excellent - no action required');
|
|
238
|
+
}
|
|
239
|
+
return recommendations;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Analyze performance metrics in detail
|
|
243
|
+
*/
|
|
244
|
+
analyzePerformanceMetrics(healthReport) {
|
|
245
|
+
const metrics = healthReport.performance_metrics;
|
|
246
|
+
const performanceGrade = this.calculatePerformanceGrade(metrics);
|
|
247
|
+
return {
|
|
248
|
+
status: this.getPerformanceStatus(performanceGrade),
|
|
249
|
+
timestamp: healthReport.timestamp,
|
|
250
|
+
performance_grade: performanceGrade,
|
|
251
|
+
metrics: {
|
|
252
|
+
...metrics,
|
|
253
|
+
uptime_hours: Math.round(healthReport.uptime_ms / (1000 * 60 * 60) * 100) / 100,
|
|
254
|
+
health_check_duration_ms: healthReport.checks.reduce((sum, c) => sum + c.duration_ms, 0)
|
|
255
|
+
},
|
|
256
|
+
analysis: {
|
|
257
|
+
response_time_rating: this.rateResponseTime(metrics.avg_response_time_ms),
|
|
258
|
+
success_rate_rating: this.rateSuccessRate(metrics.success_rate_percent),
|
|
259
|
+
throughput_rating: this.rateThroughput(metrics.requests_per_minute),
|
|
260
|
+
rate_limit_health: this.rateRateLimitUtilization(metrics.rate_limit_utilization_percent)
|
|
261
|
+
},
|
|
262
|
+
recommendations: this.generatePerformanceRecommendations(metrics)
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Calculate overall performance grade
|
|
267
|
+
*/
|
|
268
|
+
calculatePerformanceGrade(metrics) {
|
|
269
|
+
let score = 0;
|
|
270
|
+
// Response time scoring (40% weight)
|
|
271
|
+
if (metrics.avg_response_time_ms < 200)
|
|
272
|
+
score += 40;
|
|
273
|
+
else if (metrics.avg_response_time_ms < 500)
|
|
274
|
+
score += 35;
|
|
275
|
+
else if (metrics.avg_response_time_ms < 1000)
|
|
276
|
+
score += 25;
|
|
277
|
+
else if (metrics.avg_response_time_ms < 2000)
|
|
278
|
+
score += 15;
|
|
279
|
+
else
|
|
280
|
+
score += 5;
|
|
281
|
+
// Success rate scoring (35% weight)
|
|
282
|
+
if (metrics.success_rate_percent >= 99)
|
|
283
|
+
score += 35;
|
|
284
|
+
else if (metrics.success_rate_percent >= 95)
|
|
285
|
+
score += 30;
|
|
286
|
+
else if (metrics.success_rate_percent >= 90)
|
|
287
|
+
score += 20;
|
|
288
|
+
else if (metrics.success_rate_percent >= 80)
|
|
289
|
+
score += 10;
|
|
290
|
+
else
|
|
291
|
+
score += 5;
|
|
292
|
+
// Rate limit utilization scoring (25% weight)
|
|
293
|
+
if (metrics.rate_limit_utilization_percent < 50)
|
|
294
|
+
score += 25;
|
|
295
|
+
else if (metrics.rate_limit_utilization_percent < 70)
|
|
296
|
+
score += 20;
|
|
297
|
+
else if (metrics.rate_limit_utilization_percent < 85)
|
|
298
|
+
score += 15;
|
|
299
|
+
else if (metrics.rate_limit_utilization_percent < 95)
|
|
300
|
+
score += 10;
|
|
301
|
+
else
|
|
302
|
+
score += 5;
|
|
303
|
+
if (score >= 90)
|
|
304
|
+
return 'A+';
|
|
305
|
+
if (score >= 80)
|
|
306
|
+
return 'A';
|
|
307
|
+
if (score >= 70)
|
|
308
|
+
return 'B';
|
|
309
|
+
if (score >= 60)
|
|
310
|
+
return 'C';
|
|
311
|
+
if (score >= 50)
|
|
312
|
+
return 'D';
|
|
313
|
+
return 'F';
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get performance status based on grade
|
|
317
|
+
*/
|
|
318
|
+
getPerformanceStatus(grade) {
|
|
319
|
+
if (['A+', 'A', 'B'].includes(grade))
|
|
320
|
+
return HealthStatus.HEALTHY;
|
|
321
|
+
if (['C', 'D'].includes(grade))
|
|
322
|
+
return HealthStatus.DEGRADED;
|
|
323
|
+
return HealthStatus.CRITICAL;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Rate individual performance aspects
|
|
327
|
+
*/
|
|
328
|
+
rateResponseTime(avgMs) {
|
|
329
|
+
if (avgMs < 200)
|
|
330
|
+
return 'excellent';
|
|
331
|
+
if (avgMs < 500)
|
|
332
|
+
return 'good';
|
|
333
|
+
if (avgMs < 1000)
|
|
334
|
+
return 'fair';
|
|
335
|
+
if (avgMs < 2000)
|
|
336
|
+
return 'slow';
|
|
337
|
+
return 'very_slow';
|
|
338
|
+
}
|
|
339
|
+
rateSuccessRate(percent) {
|
|
340
|
+
if (percent >= 99)
|
|
341
|
+
return 'excellent';
|
|
342
|
+
if (percent >= 95)
|
|
343
|
+
return 'good';
|
|
344
|
+
if (percent >= 90)
|
|
345
|
+
return 'fair';
|
|
346
|
+
if (percent >= 80)
|
|
347
|
+
return 'poor';
|
|
348
|
+
return 'critical';
|
|
349
|
+
}
|
|
350
|
+
rateThroughput(requestsPerMin) {
|
|
351
|
+
if (requestsPerMin > 30)
|
|
352
|
+
return 'high';
|
|
353
|
+
if (requestsPerMin > 15)
|
|
354
|
+
return 'moderate';
|
|
355
|
+
if (requestsPerMin > 5)
|
|
356
|
+
return 'low';
|
|
357
|
+
return 'very_low';
|
|
358
|
+
}
|
|
359
|
+
rateRateLimitUtilization(percent) {
|
|
360
|
+
if (percent < 50)
|
|
361
|
+
return 'optimal';
|
|
362
|
+
if (percent < 70)
|
|
363
|
+
return 'moderate';
|
|
364
|
+
if (percent < 85)
|
|
365
|
+
return 'high';
|
|
366
|
+
if (percent < 95)
|
|
367
|
+
return 'near_limit';
|
|
368
|
+
return 'critical';
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Generate performance-specific recommendations
|
|
372
|
+
*/
|
|
373
|
+
generatePerformanceRecommendations(metrics) {
|
|
374
|
+
const recommendations = [];
|
|
375
|
+
if (metrics.avg_response_time_ms > 1000) {
|
|
376
|
+
recommendations.push('High response times detected - check network connectivity and Trello API status');
|
|
377
|
+
}
|
|
378
|
+
if (metrics.success_rate_percent < 95) {
|
|
379
|
+
recommendations.push('Low success rate - investigate error patterns and implement retry logic');
|
|
380
|
+
}
|
|
381
|
+
if (metrics.rate_limit_utilization_percent > 80) {
|
|
382
|
+
recommendations.push('High rate limit utilization - consider implementing request caching or batching');
|
|
383
|
+
}
|
|
384
|
+
if (metrics.requests_per_minute < 1) {
|
|
385
|
+
recommendations.push('Very low API usage - ensure the MCP server is being actively used');
|
|
386
|
+
}
|
|
387
|
+
if (recommendations.length === 0) {
|
|
388
|
+
recommendations.push('Performance is excellent - maintain current usage patterns');
|
|
389
|
+
}
|
|
390
|
+
return recommendations;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Attempt to repair common system issues
|
|
394
|
+
*/
|
|
395
|
+
async attemptSystemRepair(healthReport) {
|
|
396
|
+
const result = {
|
|
397
|
+
attempted: true,
|
|
398
|
+
success: false,
|
|
399
|
+
actions_taken: [],
|
|
400
|
+
message: ''
|
|
401
|
+
};
|
|
402
|
+
try {
|
|
403
|
+
// Check for repairable issues
|
|
404
|
+
const boardCheck = healthReport.checks.find(c => c.name === 'board_access');
|
|
405
|
+
if (boardCheck?.status === HealthStatus.DEGRADED &&
|
|
406
|
+
boardCheck.message.includes('No active board configured')) {
|
|
407
|
+
// Attempt to set first available board as active
|
|
408
|
+
const boards = await this.trelloClient.listBoards();
|
|
409
|
+
const openBoards = boards.filter(b => !b.closed);
|
|
410
|
+
if (openBoards.length > 0) {
|
|
411
|
+
await this.trelloClient.setActiveBoard(openBoards[0].id);
|
|
412
|
+
result.actions_taken.push(`Set active board to "${openBoards[0].name}"`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// Add more repair logic here as needed
|
|
416
|
+
result.success = result.actions_taken.length > 0;
|
|
417
|
+
result.message = result.success
|
|
418
|
+
? 'System repair completed successfully'
|
|
419
|
+
: 'No repairable issues found';
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
result.success = false;
|
|
423
|
+
result.message = `Repair failed: ${error instanceof Error ? error.message : 'Unknown error'}`;
|
|
424
|
+
}
|
|
425
|
+
return result;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Create standardized error response
|
|
429
|
+
*/
|
|
430
|
+
createErrorResponse(message, error) {
|
|
431
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
432
|
+
return {
|
|
433
|
+
content: [{
|
|
434
|
+
type: 'text',
|
|
435
|
+
text: JSON.stringify({
|
|
436
|
+
error: message,
|
|
437
|
+
details: errorMessage,
|
|
438
|
+
timestamp: new Date().toISOString(),
|
|
439
|
+
status: HealthStatus.CRITICAL
|
|
440
|
+
}, null, 2)
|
|
441
|
+
}],
|
|
442
|
+
isError: true
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Zod schemas for health endpoint validation
|
|
448
|
+
*/
|
|
449
|
+
export const HealthEndpointSchemas = {
|
|
450
|
+
basicHealth: {
|
|
451
|
+
title: 'Get Basic Health',
|
|
452
|
+
description: 'Get quick system health status for monitoring and load balancing',
|
|
453
|
+
inputSchema: {}
|
|
454
|
+
},
|
|
455
|
+
detailedHealth: {
|
|
456
|
+
title: 'Get Detailed Health',
|
|
457
|
+
description: 'Get comprehensive system health diagnostic with all subsystem checks',
|
|
458
|
+
inputSchema: {}
|
|
459
|
+
},
|
|
460
|
+
metadataHealth: {
|
|
461
|
+
title: 'Get Metadata Health',
|
|
462
|
+
description: 'Verify metadata consistency between boards, lists, cards, and checklists',
|
|
463
|
+
inputSchema: {}
|
|
464
|
+
},
|
|
465
|
+
performanceHealth: {
|
|
466
|
+
title: 'Get Performance Health',
|
|
467
|
+
description: 'Get detailed performance metrics and analysis',
|
|
468
|
+
inputSchema: {}
|
|
469
|
+
},
|
|
470
|
+
repair: {
|
|
471
|
+
title: 'Perform System Repair',
|
|
472
|
+
description: 'Attempt to automatically repair common system issues',
|
|
473
|
+
inputSchema: {}
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
//# sourceMappingURL=health-endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-endpoints.js","sourceRoot":"","sources":["../../src/health/health-endpoints.ts"],"names":[],"mappings":"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"}
|