qorrelate-mcp-server 0.1.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 +197 -0
- package/dist/client.d.ts +293 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +358 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +242 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/alerts.d.ts +14 -0
- package/dist/tools/alerts.d.ts.map +1 -0
- package/dist/tools/alerts.js +381 -0
- package/dist/tools/alerts.js.map +1 -0
- package/dist/tools/dashboards.d.ts +14 -0
- package/dist/tools/dashboards.d.ts.map +1 -0
- package/dist/tools/dashboards.js +409 -0
- package/dist/tools/dashboards.js.map +1 -0
- package/dist/tools/data-control.d.ts +19 -0
- package/dist/tools/data-control.d.ts.map +1 -0
- package/dist/tools/data-control.js +213 -0
- package/dist/tools/data-control.js.map +1 -0
- package/dist/tools/logs.d.ts +14 -0
- package/dist/tools/logs.d.ts.map +1 -0
- package/dist/tools/logs.js +191 -0
- package/dist/tools/logs.js.map +1 -0
- package/dist/tools/metrics.d.ts +14 -0
- package/dist/tools/metrics.d.ts.map +1 -0
- package/dist/tools/metrics.js +217 -0
- package/dist/tools/metrics.js.map +1 -0
- package/dist/tools/organizations.d.ts +16 -0
- package/dist/tools/organizations.d.ts.map +1 -0
- package/dist/tools/organizations.js +378 -0
- package/dist/tools/organizations.js.map +1 -0
- package/dist/tools/services.d.ts +14 -0
- package/dist/tools/services.d.ts.map +1 -0
- package/dist/tools/services.js +218 -0
- package/dist/tools/services.js.map +1 -0
- package/dist/tools/sessions.d.ts +14 -0
- package/dist/tools/sessions.d.ts.map +1 -0
- package/dist/tools/sessions.js +221 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/setup.d.ts +17 -0
- package/dist/tools/setup.d.ts.map +1 -0
- package/dist/tools/setup.js +304 -0
- package/dist/tools/setup.js.map +1 -0
- package/dist/tools/traces.d.ts +14 -0
- package/dist/tools/traces.d.ts.map +1 -0
- package/dist/tools/traces.js +350 -0
- package/dist/tools/traces.js.map +1 -0
- package/package.json +48 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Qorrelate API Client
|
|
4
|
+
*
|
|
5
|
+
* HTTP client for communicating with the Qorrelate backend API.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.QorrelateClient = void 0;
|
|
9
|
+
class QorrelateClient {
|
|
10
|
+
endpoint;
|
|
11
|
+
apiKey;
|
|
12
|
+
constructor(endpoint, apiKey) {
|
|
13
|
+
this.endpoint = endpoint.replace(/\/$/, ''); // Remove trailing slash
|
|
14
|
+
this.apiKey = apiKey;
|
|
15
|
+
}
|
|
16
|
+
async request(path, options = {}) {
|
|
17
|
+
const url = `${this.endpoint}${path}`;
|
|
18
|
+
const response = await fetch(url, {
|
|
19
|
+
...options,
|
|
20
|
+
headers: {
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
'X-API-Key': this.apiKey,
|
|
23
|
+
...options.headers,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
const text = await response.text();
|
|
28
|
+
throw new Error(`API request failed: ${response.status} ${response.statusText} - ${text}`);
|
|
29
|
+
}
|
|
30
|
+
return response.json();
|
|
31
|
+
}
|
|
32
|
+
// ==================== LOGS ====================
|
|
33
|
+
async searchLogs(params) {
|
|
34
|
+
const searchParams = new URLSearchParams();
|
|
35
|
+
if (params.query)
|
|
36
|
+
searchParams.set('query', params.query);
|
|
37
|
+
if (params.start_time)
|
|
38
|
+
searchParams.set('start_time', params.start_time);
|
|
39
|
+
if (params.end_time)
|
|
40
|
+
searchParams.set('end_time', params.end_time);
|
|
41
|
+
if (params.limit)
|
|
42
|
+
searchParams.set('limit', String(params.limit));
|
|
43
|
+
if (params.severity)
|
|
44
|
+
searchParams.set('severity', params.severity);
|
|
45
|
+
if (params.service)
|
|
46
|
+
searchParams.set('service', params.service);
|
|
47
|
+
return this.request(`/v1/logs/search?${searchParams}`);
|
|
48
|
+
}
|
|
49
|
+
async getLogHistogram(params) {
|
|
50
|
+
const searchParams = new URLSearchParams();
|
|
51
|
+
if (params.start_time)
|
|
52
|
+
searchParams.set('start_time', params.start_time);
|
|
53
|
+
if (params.end_time)
|
|
54
|
+
searchParams.set('end_time', params.end_time);
|
|
55
|
+
if (params.query)
|
|
56
|
+
searchParams.set('query', params.query);
|
|
57
|
+
return this.request(`/v1/logs/histogram?${searchParams}`);
|
|
58
|
+
}
|
|
59
|
+
// ==================== TRACES ====================
|
|
60
|
+
async searchTraces(params) {
|
|
61
|
+
const searchParams = new URLSearchParams();
|
|
62
|
+
if (params.start_time)
|
|
63
|
+
searchParams.set('start_time', params.start_time);
|
|
64
|
+
if (params.end_time)
|
|
65
|
+
searchParams.set('end_time', params.end_time);
|
|
66
|
+
if (params.limit)
|
|
67
|
+
searchParams.set('limit', String(params.limit));
|
|
68
|
+
if (params.service)
|
|
69
|
+
searchParams.set('service', params.service);
|
|
70
|
+
if (params.min_duration_ms)
|
|
71
|
+
searchParams.set('min_duration_ms', String(params.min_duration_ms));
|
|
72
|
+
if (params.has_error !== undefined)
|
|
73
|
+
searchParams.set('has_error', String(params.has_error));
|
|
74
|
+
return this.request(`/v1/traces/search?${searchParams}`);
|
|
75
|
+
}
|
|
76
|
+
async getTrace(traceId) {
|
|
77
|
+
return this.request(`/v1/traces/${traceId}`);
|
|
78
|
+
}
|
|
79
|
+
// ==================== METRICS ====================
|
|
80
|
+
async queryMetrics(params) {
|
|
81
|
+
const searchParams = new URLSearchParams();
|
|
82
|
+
searchParams.set('metric_name', params.metric_name);
|
|
83
|
+
if (params.start_time)
|
|
84
|
+
searchParams.set('start_time', params.start_time);
|
|
85
|
+
if (params.end_time)
|
|
86
|
+
searchParams.set('end_time', params.end_time);
|
|
87
|
+
if (params.aggregation)
|
|
88
|
+
searchParams.set('aggregation', params.aggregation);
|
|
89
|
+
if (params.group_by)
|
|
90
|
+
searchParams.set('group_by', params.group_by);
|
|
91
|
+
return this.request(`/v1/metrics/query?${searchParams}`);
|
|
92
|
+
}
|
|
93
|
+
async listMetrics(params) {
|
|
94
|
+
const searchParams = new URLSearchParams();
|
|
95
|
+
if (params?.prefix)
|
|
96
|
+
searchParams.set('prefix', params.prefix);
|
|
97
|
+
if (params?.limit)
|
|
98
|
+
searchParams.set('limit', String(params.limit));
|
|
99
|
+
return this.request(`/v1/metrics/list?${searchParams}`);
|
|
100
|
+
}
|
|
101
|
+
// ==================== ALERTS ====================
|
|
102
|
+
async listAlerts(params) {
|
|
103
|
+
const searchParams = new URLSearchParams();
|
|
104
|
+
if (params?.active !== undefined)
|
|
105
|
+
searchParams.set('active', String(params.active));
|
|
106
|
+
if (params?.severity)
|
|
107
|
+
searchParams.set('severity', params.severity);
|
|
108
|
+
if (params?.service)
|
|
109
|
+
searchParams.set('service', params.service);
|
|
110
|
+
return this.request(`/v1/alerts?${searchParams}`);
|
|
111
|
+
}
|
|
112
|
+
async getAlert(alertId) {
|
|
113
|
+
return this.request(`/v1/alerts/${alertId}`);
|
|
114
|
+
}
|
|
115
|
+
async acknowledgeAlert(alertId, message) {
|
|
116
|
+
return this.request(`/v1/alerts/${alertId}/acknowledge`, {
|
|
117
|
+
method: 'POST',
|
|
118
|
+
body: JSON.stringify({ message }),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
async getAlertHistory(alertId) {
|
|
122
|
+
return this.request(`/v1/alerts/${alertId}/history`);
|
|
123
|
+
}
|
|
124
|
+
// ==================== SESSIONS ====================
|
|
125
|
+
async listSessions(params) {
|
|
126
|
+
const searchParams = new URLSearchParams();
|
|
127
|
+
if (params?.start_time)
|
|
128
|
+
searchParams.set('start_time', params.start_time);
|
|
129
|
+
if (params?.end_time)
|
|
130
|
+
searchParams.set('end_time', params.end_time);
|
|
131
|
+
if (params?.limit)
|
|
132
|
+
searchParams.set('limit', String(params.limit));
|
|
133
|
+
if (params?.has_errors !== undefined)
|
|
134
|
+
searchParams.set('has_errors', String(params.has_errors));
|
|
135
|
+
if (params?.user_id)
|
|
136
|
+
searchParams.set('user_id', params.user_id);
|
|
137
|
+
return this.request(`/v1/replay?${searchParams}`);
|
|
138
|
+
}
|
|
139
|
+
async getSession(sessionId) {
|
|
140
|
+
return this.request(`/v1/replay/${sessionId}`);
|
|
141
|
+
}
|
|
142
|
+
// ==================== SERVICES ====================
|
|
143
|
+
async listServices() {
|
|
144
|
+
return this.request('/v1/logs/services');
|
|
145
|
+
}
|
|
146
|
+
async getServiceHealth(serviceName) {
|
|
147
|
+
const searchParams = new URLSearchParams();
|
|
148
|
+
searchParams.set('service', serviceName);
|
|
149
|
+
// Get traces for the service to calculate health metrics
|
|
150
|
+
const now = new Date();
|
|
151
|
+
const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
|
|
152
|
+
const traces = await this.searchTraces({
|
|
153
|
+
service: serviceName,
|
|
154
|
+
start_time: oneHourAgo.toISOString(),
|
|
155
|
+
end_time: now.toISOString(),
|
|
156
|
+
limit: 1000,
|
|
157
|
+
});
|
|
158
|
+
// Calculate health metrics from traces
|
|
159
|
+
const totalTraces = traces.traces.length;
|
|
160
|
+
const errorTraces = traces.traces.filter(t => t.has_error).length;
|
|
161
|
+
const durations = traces.traces.map(t => t.duration_ms).sort((a, b) => a - b);
|
|
162
|
+
const errorRate = totalTraces > 0 ? (errorTraces / totalTraces) * 100 : 0;
|
|
163
|
+
const avgLatency = totalTraces > 0
|
|
164
|
+
? durations.reduce((a, b) => a + b, 0) / totalTraces
|
|
165
|
+
: 0;
|
|
166
|
+
const p95Index = Math.floor(durations.length * 0.95);
|
|
167
|
+
const p95Latency = durations[p95Index] || 0;
|
|
168
|
+
let status = 'unknown';
|
|
169
|
+
if (totalTraces > 0) {
|
|
170
|
+
if (errorRate < 1 && avgLatency < 500)
|
|
171
|
+
status = 'healthy';
|
|
172
|
+
else if (errorRate < 5 && avgLatency < 1000)
|
|
173
|
+
status = 'degraded';
|
|
174
|
+
else
|
|
175
|
+
status = 'unhealthy';
|
|
176
|
+
}
|
|
177
|
+
const lastErrorTrace = traces.traces.find(t => t.has_error);
|
|
178
|
+
return {
|
|
179
|
+
service: serviceName,
|
|
180
|
+
status,
|
|
181
|
+
error_rate: Math.round(errorRate * 100) / 100,
|
|
182
|
+
avg_latency_ms: Math.round(avgLatency),
|
|
183
|
+
p95_latency_ms: Math.round(p95Latency),
|
|
184
|
+
request_count: totalTraces,
|
|
185
|
+
last_error: lastErrorTrace?.root_span_name,
|
|
186
|
+
last_error_time: lastErrorTrace?.start_time,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// ==================== SETUP ENDPOINTS ====================
|
|
190
|
+
async getSetupOtelPython(params) {
|
|
191
|
+
return this.request(`/v1/setup/otel/python?${params}`);
|
|
192
|
+
}
|
|
193
|
+
async getSetupOtelNode(params) {
|
|
194
|
+
return this.request(`/v1/setup/otel/node?${params}`);
|
|
195
|
+
}
|
|
196
|
+
async getSetupOtelGo(params) {
|
|
197
|
+
return this.request(`/v1/setup/otel/go?${params}`);
|
|
198
|
+
}
|
|
199
|
+
async getSetupCollector(params) {
|
|
200
|
+
return this.request(`/v1/setup/collector?${params}`);
|
|
201
|
+
}
|
|
202
|
+
async getSetupSessionReplay() {
|
|
203
|
+
return this.request('/v1/setup/session-replay');
|
|
204
|
+
}
|
|
205
|
+
async getSetupValidate() {
|
|
206
|
+
return this.request('/v1/setup/validate');
|
|
207
|
+
}
|
|
208
|
+
async getSetupStatus() {
|
|
209
|
+
return this.request('/v1/setup/status');
|
|
210
|
+
}
|
|
211
|
+
// ==================== ORGANIZATION ENDPOINTS ====================
|
|
212
|
+
async listOrganizations() {
|
|
213
|
+
return this.request('/v1/organizations');
|
|
214
|
+
}
|
|
215
|
+
async getOrganizationMembers(orgId) {
|
|
216
|
+
return this.request(`/v1/organizations/${orgId}/members`);
|
|
217
|
+
}
|
|
218
|
+
async inviteUser(orgId, email) {
|
|
219
|
+
return this.request(`/v1/organizations/${orgId}/invitations`, {
|
|
220
|
+
method: 'POST',
|
|
221
|
+
body: JSON.stringify({ email }),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
async listInvitations(orgId) {
|
|
225
|
+
return this.request(`/v1/organizations/${orgId}/invitations`);
|
|
226
|
+
}
|
|
227
|
+
async createApiKey(orgId, name, expiresDays = 365) {
|
|
228
|
+
return this.request(`/v1/organizations/${orgId}/api-keys`, {
|
|
229
|
+
method: 'POST',
|
|
230
|
+
body: JSON.stringify({ name, expires_days: expiresDays }),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
async listApiKeys(orgId) {
|
|
234
|
+
return this.request(`/v1/organizations/${orgId}/api-keys`);
|
|
235
|
+
}
|
|
236
|
+
async revokeApiKey(orgId, keyName) {
|
|
237
|
+
return this.request(`/v1/organizations/${orgId}/api-keys/${encodeURIComponent(keyName)}`, {
|
|
238
|
+
method: 'DELETE',
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
async getOrganizationUsage(orgId, params) {
|
|
242
|
+
const searchParams = new URLSearchParams();
|
|
243
|
+
if (params?.start_date)
|
|
244
|
+
searchParams.set('start_date', params.start_date);
|
|
245
|
+
if (params?.end_date)
|
|
246
|
+
searchParams.set('end_date', params.end_date);
|
|
247
|
+
const query = searchParams.toString() ? `?${searchParams}` : '';
|
|
248
|
+
return this.request(`/v1/organizations/${orgId}/usage${query}`);
|
|
249
|
+
}
|
|
250
|
+
async getOrganizationBilling(orgId, month) {
|
|
251
|
+
const searchParams = new URLSearchParams();
|
|
252
|
+
if (month)
|
|
253
|
+
searchParams.set('month', month);
|
|
254
|
+
const query = searchParams.toString() ? `?${searchParams}` : '';
|
|
255
|
+
return this.request(`/v1/organizations/${orgId}/billing${query}`);
|
|
256
|
+
}
|
|
257
|
+
async getDataUsageSummary(orgId, days) {
|
|
258
|
+
const searchParams = new URLSearchParams();
|
|
259
|
+
if (days)
|
|
260
|
+
searchParams.set('days', String(days));
|
|
261
|
+
const query = searchParams.toString() ? `?${searchParams}` : '';
|
|
262
|
+
return this.request(`/v1/organizations/${orgId}/data-usage/summary${query}`);
|
|
263
|
+
}
|
|
264
|
+
async getUnusedMetrics(orgId, days) {
|
|
265
|
+
const searchParams = new URLSearchParams();
|
|
266
|
+
if (days)
|
|
267
|
+
searchParams.set('days', String(days));
|
|
268
|
+
const query = searchParams.toString() ? `?${searchParams}` : '';
|
|
269
|
+
return this.request(`/v1/organizations/${orgId}/data-usage/unused-metrics${query}`);
|
|
270
|
+
}
|
|
271
|
+
// ==================== DROP FILTERS ====================
|
|
272
|
+
async listDropFilters(orgId, filterType) {
|
|
273
|
+
const searchParams = new URLSearchParams();
|
|
274
|
+
if (filterType)
|
|
275
|
+
searchParams.set('filter_type', filterType);
|
|
276
|
+
const query = searchParams.toString() ? `?${searchParams}` : '';
|
|
277
|
+
return this.request(`/v1/organizations/${orgId}/drop-filters${query}`);
|
|
278
|
+
}
|
|
279
|
+
async createDropFilter(orgId, params) {
|
|
280
|
+
return this.request(`/v1/organizations/${orgId}/drop-filters`, {
|
|
281
|
+
method: 'POST',
|
|
282
|
+
body: JSON.stringify(params),
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
async deleteDropFilter(orgId, filterId) {
|
|
286
|
+
return this.request(`/v1/organizations/${orgId}/drop-filters/${filterId}`, {
|
|
287
|
+
method: 'DELETE',
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
async getDropFilterStats(orgId) {
|
|
291
|
+
return this.request(`/v1/organizations/${orgId}/drop-filters/stats`);
|
|
292
|
+
}
|
|
293
|
+
// ==================== DASHBOARDS ====================
|
|
294
|
+
async listDashboards(search) {
|
|
295
|
+
const searchParams = new URLSearchParams();
|
|
296
|
+
if (search)
|
|
297
|
+
searchParams.set('search', search);
|
|
298
|
+
const query = searchParams.toString() ? `?${searchParams}` : '';
|
|
299
|
+
return this.request(`/v1/dashboards${query}`);
|
|
300
|
+
}
|
|
301
|
+
async getDashboard(dashboardId) {
|
|
302
|
+
return this.request(`/v1/dashboards/${dashboardId}`);
|
|
303
|
+
}
|
|
304
|
+
async createDashboard(params) {
|
|
305
|
+
return this.request('/v1/dashboards', {
|
|
306
|
+
method: 'POST',
|
|
307
|
+
body: JSON.stringify(params),
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
async updateDashboard(dashboardId, params) {
|
|
311
|
+
return this.request(`/v1/dashboards/${dashboardId}`, {
|
|
312
|
+
method: 'PUT',
|
|
313
|
+
body: JSON.stringify(params),
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
async deleteDashboard(dashboardId) {
|
|
317
|
+
return this.request(`/v1/dashboards/${dashboardId}`, {
|
|
318
|
+
method: 'DELETE',
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
async addPanel(dashboardId, params) {
|
|
322
|
+
return this.request(`/v1/dashboards/${dashboardId}/panels`, {
|
|
323
|
+
method: 'POST',
|
|
324
|
+
body: JSON.stringify(params),
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
async updatePanel(dashboardId, panelId, params) {
|
|
328
|
+
return this.request(`/v1/dashboards/${dashboardId}/panels/${panelId}`, {
|
|
329
|
+
method: 'PUT',
|
|
330
|
+
body: JSON.stringify(params),
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
async deletePanel(dashboardId, panelId) {
|
|
334
|
+
return this.request(`/v1/dashboards/${dashboardId}/panels/${panelId}`, {
|
|
335
|
+
method: 'DELETE',
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
// ==================== ALERTS (Extended) ====================
|
|
339
|
+
async createAlert(params) {
|
|
340
|
+
return this.request('/v1/alerts', {
|
|
341
|
+
method: 'POST',
|
|
342
|
+
body: JSON.stringify(params),
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
async updateAlert(alertId, params) {
|
|
346
|
+
return this.request(`/v1/alerts/${alertId}`, {
|
|
347
|
+
method: 'PUT',
|
|
348
|
+
body: JSON.stringify(params),
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
async deleteAlert(alertId) {
|
|
352
|
+
return this.request(`/v1/alerts/${alertId}`, {
|
|
353
|
+
method: 'DELETE',
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
exports.QorrelateClient = QorrelateClient;
|
|
358
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Qorrelate MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Model Context Protocol server that exposes Qorrelate observability tools
|
|
6
|
+
* for AI agents to query logs, traces, metrics, alerts, and session replays.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* QORRELATE_API_KEY=xxx QORRELATE_ENDPOINT=https://qorrelate.io npx @qorrelate/mcp-server
|
|
10
|
+
*
|
|
11
|
+
* Or configure in Claude Desktop / Cursor:
|
|
12
|
+
* {
|
|
13
|
+
* "mcpServers": {
|
|
14
|
+
* "qorrelate": {
|
|
15
|
+
* "command": "npx",
|
|
16
|
+
* "args": ["@qorrelate/mcp-server"],
|
|
17
|
+
* "env": {
|
|
18
|
+
* "QORRELATE_API_KEY": "your-api-key",
|
|
19
|
+
* "QORRELATE_ENDPOINT": "https://qorrelate.io"
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
*/
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Qorrelate MCP Server
|
|
5
|
+
*
|
|
6
|
+
* Model Context Protocol server that exposes Qorrelate observability tools
|
|
7
|
+
* for AI agents to query logs, traces, metrics, alerts, and session replays.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* QORRELATE_API_KEY=xxx QORRELATE_ENDPOINT=https://qorrelate.io npx @qorrelate/mcp-server
|
|
11
|
+
*
|
|
12
|
+
* Or configure in Claude Desktop / Cursor:
|
|
13
|
+
* {
|
|
14
|
+
* "mcpServers": {
|
|
15
|
+
* "qorrelate": {
|
|
16
|
+
* "command": "npx",
|
|
17
|
+
* "args": ["@qorrelate/mcp-server"],
|
|
18
|
+
* "env": {
|
|
19
|
+
* "QORRELATE_API_KEY": "your-api-key",
|
|
20
|
+
* "QORRELATE_ENDPOINT": "https://qorrelate.io"
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
|
|
28
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
29
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
30
|
+
const client_js_1 = require("./client.js");
|
|
31
|
+
const logs_js_1 = require("./tools/logs.js");
|
|
32
|
+
const traces_js_1 = require("./tools/traces.js");
|
|
33
|
+
const metrics_js_1 = require("./tools/metrics.js");
|
|
34
|
+
const alerts_js_1 = require("./tools/alerts.js");
|
|
35
|
+
const sessions_js_1 = require("./tools/sessions.js");
|
|
36
|
+
const services_js_1 = require("./tools/services.js");
|
|
37
|
+
const organizations_js_1 = require("./tools/organizations.js");
|
|
38
|
+
const setup_js_1 = require("./tools/setup.js");
|
|
39
|
+
const dashboards_js_1 = require("./tools/dashboards.js");
|
|
40
|
+
const data_control_js_1 = require("./tools/data-control.js");
|
|
41
|
+
// Configuration from environment
|
|
42
|
+
const QORRELATE_ENDPOINT = process.env.QORRELATE_ENDPOINT || "https://qorrelate.io";
|
|
43
|
+
const QORRELATE_API_KEY = process.env.QORRELATE_API_KEY;
|
|
44
|
+
if (!QORRELATE_API_KEY) {
|
|
45
|
+
console.error("Error: QORRELATE_API_KEY environment variable is required");
|
|
46
|
+
console.error("Get your API key from https://qorrelate.io/settings → API Keys");
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
// Initialize the Qorrelate API client
|
|
50
|
+
const client = new client_js_1.QorrelateClient(QORRELATE_ENDPOINT, QORRELATE_API_KEY);
|
|
51
|
+
// Create MCP server
|
|
52
|
+
const server = new index_js_1.Server({
|
|
53
|
+
name: "qorrelate",
|
|
54
|
+
version: "0.1.0",
|
|
55
|
+
}, {
|
|
56
|
+
capabilities: {
|
|
57
|
+
tools: {},
|
|
58
|
+
resources: {},
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
// Collect all tools from modules
|
|
62
|
+
const allTools = [
|
|
63
|
+
...(0, logs_js_1.registerLogTools)(),
|
|
64
|
+
...(0, traces_js_1.registerTraceTools)(),
|
|
65
|
+
...(0, metrics_js_1.registerMetricTools)(),
|
|
66
|
+
...(0, alerts_js_1.registerAlertTools)(),
|
|
67
|
+
...(0, sessions_js_1.registerSessionTools)(),
|
|
68
|
+
...(0, services_js_1.registerServiceTools)(),
|
|
69
|
+
...(0, organizations_js_1.registerOrganizationTools)(),
|
|
70
|
+
...(0, setup_js_1.registerSetupTools)(),
|
|
71
|
+
...(0, dashboards_js_1.registerDashboardTools)(),
|
|
72
|
+
...(0, data_control_js_1.registerDataControlTools)(),
|
|
73
|
+
];
|
|
74
|
+
// Handle tool listing
|
|
75
|
+
server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => {
|
|
76
|
+
return { tools: allTools };
|
|
77
|
+
});
|
|
78
|
+
// Handle tool execution
|
|
79
|
+
server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
|
|
80
|
+
const { name, arguments: args } = request.params;
|
|
81
|
+
try {
|
|
82
|
+
// Route to appropriate handler based on tool prefix
|
|
83
|
+
if (name.startsWith("logs_") || name === "query_logs") {
|
|
84
|
+
return await (0, logs_js_1.handleLogTool)(client, name, args);
|
|
85
|
+
}
|
|
86
|
+
if (name.startsWith("traces_") || name === "search_traces" || name === "get_trace") {
|
|
87
|
+
return await (0, traces_js_1.handleTraceTool)(client, name, args);
|
|
88
|
+
}
|
|
89
|
+
if (name.startsWith("metrics_") || name === "query_metrics") {
|
|
90
|
+
return await (0, metrics_js_1.handleMetricTool)(client, name, args);
|
|
91
|
+
}
|
|
92
|
+
if (name.startsWith("alerts_") || name === "list_alerts" || name === "acknowledge_alert" ||
|
|
93
|
+
name === "create_alert" || name === "update_alert" || name === "delete_alert") {
|
|
94
|
+
return await (0, alerts_js_1.handleAlertTool)(client, name, args);
|
|
95
|
+
}
|
|
96
|
+
if (name.startsWith("dashboard") || name === "list_dashboards" || name === "get_dashboard" ||
|
|
97
|
+
name === "create_dashboard" || name === "update_dashboard" || name === "delete_dashboard" ||
|
|
98
|
+
name === "add_panel" || name === "update_panel" || name === "delete_panel") {
|
|
99
|
+
return await (0, dashboards_js_1.handleDashboardTool)(client, name, args || {});
|
|
100
|
+
}
|
|
101
|
+
if (name.startsWith("sessions_") || name === "list_sessions" || name === "get_session") {
|
|
102
|
+
return await (0, sessions_js_1.handleSessionTool)(client, name, args);
|
|
103
|
+
}
|
|
104
|
+
if (name.startsWith("services_") || name === "get_service_health" || name === "list_services") {
|
|
105
|
+
return await (0, services_js_1.handleServiceTool)(client, name, args);
|
|
106
|
+
}
|
|
107
|
+
// Organization management tools (including billing)
|
|
108
|
+
if (name.startsWith("list_organizations") || name.startsWith("get_organization") ||
|
|
109
|
+
name.startsWith("invite_user") || name.startsWith("list_invitations") ||
|
|
110
|
+
name.startsWith("create_api_key") || name.startsWith("list_api_keys") ||
|
|
111
|
+
name.startsWith("revoke_api_key") || name.startsWith("get_usage") ||
|
|
112
|
+
name.startsWith("get_billing") || name.startsWith("get_data_usage") ||
|
|
113
|
+
name.startsWith("get_unused_metrics")) {
|
|
114
|
+
return await (0, organizations_js_1.handleOrganizationTool)(client, name, args || {});
|
|
115
|
+
}
|
|
116
|
+
// Data control tools (drop filters)
|
|
117
|
+
if (name.startsWith("list_drop_filters") || name.startsWith("create_drop_filter") ||
|
|
118
|
+
name.startsWith("delete_drop_filter") || name.startsWith("get_drop_filter")) {
|
|
119
|
+
return await (0, data_control_js_1.handleDataControlTool)(client, name, args || {});
|
|
120
|
+
}
|
|
121
|
+
// Setup and instrumentation tools
|
|
122
|
+
if (name.startsWith("generate_") || name === "validate_ingestion" || name === "get_onboarding_status") {
|
|
123
|
+
return await (0, setup_js_1.handleSetupTool)(client, name, args || {});
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
127
|
+
isError: true,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
132
|
+
return {
|
|
133
|
+
content: [{ type: "text", text: `Error executing ${name}: ${message}` }],
|
|
134
|
+
isError: true,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
// Handle resource listing (for context/reference data)
|
|
139
|
+
server.setRequestHandler(types_js_1.ListResourcesRequestSchema, async () => {
|
|
140
|
+
return {
|
|
141
|
+
resources: [
|
|
142
|
+
{
|
|
143
|
+
uri: "qorrelate://services",
|
|
144
|
+
name: "Available Services",
|
|
145
|
+
description: "List of services sending telemetry to Qorrelate",
|
|
146
|
+
mimeType: "application/json",
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
uri: "qorrelate://alerts/active",
|
|
150
|
+
name: "Active Alerts",
|
|
151
|
+
description: "Currently firing alerts",
|
|
152
|
+
mimeType: "application/json",
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
uri: "qorrelate://onboarding",
|
|
156
|
+
name: "Onboarding Status",
|
|
157
|
+
description: "Organization setup progress and next steps",
|
|
158
|
+
mimeType: "application/json",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
uri: "qorrelate://ingestion",
|
|
162
|
+
name: "Ingestion Status",
|
|
163
|
+
description: "Current telemetry ingestion status",
|
|
164
|
+
mimeType: "application/json",
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
uri: "qorrelate://billing",
|
|
168
|
+
name: "Current Billing",
|
|
169
|
+
description: "Current month billing and usage summary",
|
|
170
|
+
mimeType: "application/json",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
uri: "qorrelate://drop-filters",
|
|
174
|
+
name: "Drop Filters",
|
|
175
|
+
description: "Active data drop filters for cost control",
|
|
176
|
+
mimeType: "application/json",
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
// Handle resource reading
|
|
182
|
+
server.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (request) => {
|
|
183
|
+
const { uri } = request.params;
|
|
184
|
+
try {
|
|
185
|
+
if (uri === "qorrelate://services") {
|
|
186
|
+
const services = await client.listServices();
|
|
187
|
+
return {
|
|
188
|
+
contents: [{
|
|
189
|
+
uri,
|
|
190
|
+
mimeType: "application/json",
|
|
191
|
+
text: JSON.stringify(services, null, 2),
|
|
192
|
+
}],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
if (uri === "qorrelate://alerts/active") {
|
|
196
|
+
const alerts = await client.listAlerts({ active: true });
|
|
197
|
+
return {
|
|
198
|
+
contents: [{
|
|
199
|
+
uri,
|
|
200
|
+
mimeType: "application/json",
|
|
201
|
+
text: JSON.stringify(alerts, null, 2),
|
|
202
|
+
}],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
if (uri === "qorrelate://onboarding") {
|
|
206
|
+
const status = await client.getSetupStatus();
|
|
207
|
+
return {
|
|
208
|
+
contents: [{
|
|
209
|
+
uri,
|
|
210
|
+
mimeType: "application/json",
|
|
211
|
+
text: JSON.stringify(status, null, 2),
|
|
212
|
+
}],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
if (uri === "qorrelate://ingestion") {
|
|
216
|
+
const status = await client.getSetupValidate();
|
|
217
|
+
return {
|
|
218
|
+
contents: [{
|
|
219
|
+
uri,
|
|
220
|
+
mimeType: "application/json",
|
|
221
|
+
text: JSON.stringify(status, null, 2),
|
|
222
|
+
}],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
throw new Error(`Unknown resource: ${uri}`);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
229
|
+
throw new Error(`Failed to read resource ${uri}: ${message}`);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
// Start the server
|
|
233
|
+
async function main() {
|
|
234
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
235
|
+
await server.connect(transport);
|
|
236
|
+
console.error("Qorrelate MCP server running on stdio");
|
|
237
|
+
}
|
|
238
|
+
main().catch((error) => {
|
|
239
|
+
console.error("Fatal error:", error);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
});
|
|
242
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|