fg-tracker-mcp 0.10.0 → 0.11.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.
@@ -0,0 +1,467 @@
1
+ /**
2
+ * Ferramentas de diagnóstico da 0.11 (docs/mcp.md, "Jornadas de diagnóstico") sobre rotas de
3
+ * leitura que a API já tinha (todas cobertas pelo modelo Somente leitura do token pessoal `fgt_…`):
4
+ * detalhe de endpoint, slow queries, estatística de logs, eventos de alerta e ambientes, mais os
5
+ * recursos `fg-tracker://trace/{traceId}` e `fg-tracker://issue/{issueId}`.
6
+ *
7
+ * Ferramentas novas não ganham alias `track_*` (só as que existiam na 0.10).
8
+ */
9
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
10
+ import { z } from 'zod';
11
+ import { TrackApiError } from './client.js';
12
+ import { cappedNote, clampLimit, compact, guard, ms, pct, structured } from './format.js';
13
+ import { definedFilters, envFilterSchema, filterNote, fromSchema, isoInstantSchema, projectIdSchema, rangeSchema, rootKindSchema, serviceFilterSchema, toSchema } from './inputs.js';
14
+ import { ISSUE_URI_TEMPLATE, TRACE_URI_TEMPLATE, WINDOW_IGNORED_NOTE, evidenceLines, getWithWindow, parseResourceUri, evidenceResourceLinks, pageLinks, rangeWindow, resolveWindow, spanWindow, traceEvidence } from './links.js';
15
+ import { alertEventsOutput, compareOutput, endpointOutput, environmentsOutput, logStatsOutput, queriesOutput } from './schemas.js';
16
+ const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
17
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
18
+ const ALERT_SEVERITIES = ['low', 'medium', 'high', 'critical'];
19
+ /**
20
+ * Destinatário de uma entrega de alerta sem o dado pessoal: e-mail vira `a***@dominio`,
21
+ * telefone os 4 últimos dígitos, URL só o host. O agente vê para onde o alerta foi, não quem é.
22
+ */
23
+ export function maskRecipient(to) {
24
+ if (!to)
25
+ return null;
26
+ const email = /^([^@\s])[^@\s]*@([^@\s]+)$/.exec(to);
27
+ if (email)
28
+ return `${email[1]}***@${email[2]}`;
29
+ try {
30
+ const url = new URL(to);
31
+ if (url.protocol === 'http:' || url.protocol === 'https:')
32
+ return url.host;
33
+ }
34
+ catch {
35
+ /* não é URL */
36
+ }
37
+ const digits = to.replace(/\D/g, '');
38
+ if (digits.length >= 6 && digits.length >= to.replace(/[\s()+.-]/g, '').length)
39
+ return `***${digits.slice(-4)}`;
40
+ return to.length <= 3 ? '***' : `${to.slice(0, 2)}***`;
41
+ }
42
+ export function registerDiagnosticTools(server, client, options) {
43
+ const { maxItems } = options;
44
+ /* ---------------- detalhe de endpoint ---------------- */
45
+ server.registerTool('tracker_get_endpoint', {
46
+ title: 'Detalhe de um endpoint ou job',
47
+ description: 'GET /v1/projects/:id/endpoints/detail: requests, taxa de erro, p50/p95/p99 e apdex no range (percentis sobre os spans brutos), série, histograma de latência, os traces MAIS LENTOS e os mais recentes da rota e as issues ligadas. ' +
48
+ 'Use depois de tracker_list_endpoints ou de um delta de release, para chegar aos traces que explicam o p95. rootKind "custom" abre um job. `evidence` traz os traces mais lentos (abra com tracker_get_trace).',
49
+ inputSchema: {
50
+ projectId: projectIdSchema,
51
+ name: z.string().min(1).max(512).describe('Nome exato do endpoint ou job (ex.: "GET /users/:id", veja tracker_list_endpoints)'),
52
+ range: rangeSchema,
53
+ from: fromSchema,
54
+ to: toSchema,
55
+ rootKind: rootKindSchema,
56
+ service: serviceFilterSchema,
57
+ env: envFilterSchema,
58
+ },
59
+ outputSchema: endpointOutput,
60
+ annotations: { readOnlyHint: true, openWorldHint: true },
61
+ }, async ({ projectId, name, range, from, to, rootKind, service, env }) => guard(async () => {
62
+ const { body: detail, window, windowIgnored } = await getWithWindow(client, `/v1/projects/${projectId}/endpoints/detail`, { name, rootKind, service, env }, range, from, to);
63
+ const slowest = detail.slowestTraces ?? [];
64
+ const evidence = slowest.slice(0, 3).map((t) => traceEvidence(t, 'durationMs', t.durationMs, `${name}${t.statusCode ? ` · status ${t.statusCode}` : ''}`));
65
+ const errors = (detail.recentTraces ?? []).filter((t) => (t.statusCode ?? 0) >= 500).slice(0, 2);
66
+ for (const t of errors)
67
+ evidence.push(traceEvidence(t, 'statusCode', t.statusCode ?? 0, `${name} falhou`));
68
+ const histogram = (detail.histogram ?? []).filter((b) => b.count > 0).map((b) => `${b.bucket}: ${b.count}`).join(', ');
69
+ const lines = [
70
+ `${name} · ${from || to ? `${window.from} → ${window.to}` : `range ${range}`}${filterNote({ rootKind, service, env })}: ${detail.requests ?? 0} ${rootKind === 'custom' ? 'execuções' : 'requests'} · erro ${pct(detail.errorRate)} · p50 ${ms(detail.p50Ms)} · p95 ${ms(detail.p95Ms)} · p99 ${ms(detail.p99Ms)}${detail.apdex !== undefined ? ` · apdex ${detail.apdex}` : ''}`,
71
+ histogram ? `Histograma: ${histogram}` : '',
72
+ slowest.length ? `Mais lentos: ${slowest.slice(0, 5).map((t) => `${t.traceId} (${ms(t.durationMs)}${t.statusCode ? `, ${t.statusCode}` : ''})`).join('; ')}` : 'Nenhum trace no range.',
73
+ detail.issues?.length ? `Issues: ${detail.issues.slice(0, 5).map((i) => `[${i.severity}] ${i.type} ${i.title} (id ${i.id})`).join('; ')}` : '',
74
+ windowIgnored ? WINDOW_IGNORED_NOTE : '',
75
+ ].filter(Boolean);
76
+ const { links, resourceLinks } = pageLinks(client, 'endpoint', { project: projectId, name }, `endpoint ${name}`);
77
+ const body = compact(detail);
78
+ return structured({ window, ...(windowIgnored ? { windowIgnored } : {}), filters: definedFilters({ rootKind, service, env }), ...body, name: detail.name ?? name, evidence, links }, `${lines.join('\n')}${evidenceLines(evidence, 3)}`, { body, links: [...resourceLinks, ...evidenceResourceLinks(projectId, evidence)] });
79
+ }));
80
+ /* ---------------- slow queries ---------------- */
81
+ server.registerTool('tracker_list_queries', {
82
+ title: 'Queries de banco (slow queries)',
83
+ description: 'GET /v1/projects/:id/database: queries (db.query) agrupadas pelo SQL normalizado, ordenadas por tempo total no range, com execuções, média, p95 (p99 e máximo quando a API manda), endpoints e jobs que as disparam. ' +
84
+ 'env/service são repassados (a API anterior os ignora: `filtersApplied: false` avisa que os números misturam ambientes). `search` filtra pelo texto do SQL. ' +
85
+ '`samples` (default 3) procura, para as primeiras queries, um trace real que a contém (o mais lento do endpoint ou job chamador) e devolve em `evidence` o traceId e o spanId da execução mais lenta — abra com tracker_get_trace { traceId, kind: "db.query" }. ' +
86
+ 'Limitação: o SDK corta o SQL em 200 caracteres; queries com o mesmo prefixo se fundem até o SDK mandar db.query.fingerprint.',
87
+ inputSchema: {
88
+ projectId: projectIdSchema,
89
+ range: rangeSchema,
90
+ from: fromSchema,
91
+ to: toSchema,
92
+ env: envFilterSchema,
93
+ service: serviceFilterSchema,
94
+ search: z.string().min(1).max(200).optional().describe('Só queries cujo SQL contém este texto (sem diferenciar maiúsculas)'),
95
+ limit: z.number().int().min(1).max(100).default(20).describe('Máximo de queries (default 20; a API devolve o top por tempo total)'),
96
+ samples: z.number().int().min(0).max(5).default(3).describe('Para quantas queries buscar um trace de evidência (0 = nenhuma; cada uma faz até 3 chamadas à API)'),
97
+ },
98
+ outputSchema: queriesOutput,
99
+ annotations: { readOnlyHint: true, openWorldHint: true },
100
+ }, async ({ projectId, range, from, to, env, service, search, limit, samples }) => guard(async () => {
101
+ const { body: db, window, windowIgnored } = await getWithWindow(client, `/v1/projects/${projectId}/database`, { env, service }, range, from, to);
102
+ const filtersApplied = !(env || service) || Array.isArray(db.environments);
103
+ const needle = search?.toLowerCase();
104
+ const all = (db.slowQueries ?? []).filter((q) => !needle || q.name.toLowerCase().includes(needle));
105
+ const shown = all.slice(0, clampLimit(limit, maxItems).limit);
106
+ // A evidência respeita o escopo pedido mesmo quando a API ignorou os filtros: só vale um
107
+ // db.query do serviço, do ambiente e da janela da consulta.
108
+ const { evidence, notes } = await sampleQueryTraces(client, projectId, windowIgnored ? { range } : { range, from: window.from, to: window.to }, window, shown.slice(0, samples), { env, service });
109
+ const lines = shown.map((q) => `- ${q.name.slice(0, 160)} · ${q.count}× · média ${ms(q.avgMs)} · p95 ${ms(q.p95Ms)}${q.p99Ms !== undefined ? ` · p99 ${ms(q.p99Ms)}` : ''}${q.maxMs !== undefined ? ` · máx ${ms(q.maxMs)}` : ''} · total ${ms(q.totalMs)}${q.endpoints?.length ? ` · de ${q.endpoints.slice(0, 3).join(', ')}` : ''}${q.jobs?.length ? ` · jobs ${q.jobs.slice(0, 3).join(', ')}` : ''}`);
110
+ const warnings = [
111
+ !filtersApplied ? 'ATENÇÃO: esta API ignora env/service em /database: os números abaixo misturam todos os ambientes e serviços.' : '',
112
+ windowIgnored ? WINDOW_IGNORED_NOTE : '',
113
+ ...notes,
114
+ ].filter(Boolean);
115
+ const summary = shown.length
116
+ ? `${db.totalQueries} queries ${from || to ? `de ${window.from} a ${window.to}` : `no range ${range}`}${filterNote({ service, env })} (média ${ms(db.avgMs)}, total ${ms(db.totalMs)}); ${all.length}${search ? ` com "${search}"` : ''} no top${all.length > shown.length ? `, mostrando ${shown.length}` : ''}:\n${lines.join('\n')}`
117
+ : `Nenhuma query${search ? ` com "${search}"` : ''} no range ${range}${filterNote({ service, env })}.`;
118
+ const { links, resourceLinks } = pageLinks(client, 'database', { project: projectId }, 'Banco de dados');
119
+ const items = shown.map((q) => compact(q));
120
+ return structured({
121
+ window,
122
+ filters: { ...(service ? { service } : {}), ...(env ? { env } : {}), ...(search ? { search } : {}) },
123
+ filtersApplied,
124
+ ...(windowIgnored ? { windowIgnored } : {}),
125
+ totalQueries: db.totalQueries,
126
+ totalMs: db.totalMs,
127
+ avgMs: db.avgMs,
128
+ total: all.length,
129
+ items,
130
+ ...(db.environments ? { environments: db.environments } : {}),
131
+ evidence,
132
+ links,
133
+ }, `${summary}${warnings.length ? `\n${warnings.join('\n')}` : ''}${evidenceLines(evidence, 3)}`, { links: [...resourceLinks, ...evidenceResourceLinks(projectId, evidence)] });
134
+ }));
135
+ /* ---------------- comparação de janelas ou releases ---------------- */
136
+ const sideSchema = z
137
+ .object({
138
+ from: isoInstantSchema.optional().describe('Início da janela (ISO 8601)'),
139
+ to: isoInstantSchema.optional().describe('Fim da janela (default agora)'),
140
+ release: z.string().min(1).max(200).optional().describe('Release (em vez de from/to)'),
141
+ })
142
+ .describe('Janela (from/to, até 31 dias) ou release');
143
+ server.registerTool('tracker_compare', {
144
+ title: 'Comparar duas janelas ou duas releases',
145
+ description: 'GET /v1/projects/:id/compare: A (antes) contra B (depois) — latência total e por rota (rotas que mais pioraram primeiro), a decomposição do tempo médio por execução por tipo de span (banco, chamadas externas, custom, tempo sem span) e os spans que mais cresceram, com evidence (a execução mais lenta e o span que mais cresceu em B, e a referência em A). ' +
146
+ 'Cada lado é { from, to } ou { release }. Cobertura: a decomposição só usa spans brutos (retenção de ~14 dias); um lado sem brutos sai com coverage "none", latência pelos rollups horários e decomposition null — não conclua regressão por tipo de span sem cobertura.',
147
+ inputSchema: {
148
+ projectId: projectIdSchema,
149
+ a: sideSchema,
150
+ b: sideSchema,
151
+ rootKind: rootKindSchema,
152
+ service: serviceFilterSchema,
153
+ env: envFilterSchema,
154
+ endpoint: z.string().min(1).max(512).optional().describe('Só esta rota ou job (nome exato)'),
155
+ limit: z.number().int().min(1).max(100).default(10).describe('Rotas na resposta (default 10)'),
156
+ sample: z.number().int().min(10).max(300).optional().describe('Execuções por lado na amostra da decomposição (default 100 na API)'),
157
+ },
158
+ outputSchema: compareOutput,
159
+ annotations: { readOnlyHint: true, openWorldHint: true },
160
+ }, async ({ projectId, a, b, rootKind, service, env, endpoint, limit: requested, sample }) => guard(async () => {
161
+ const limit = clampLimit(requested, maxItems).limit;
162
+ const side = (label, value) => {
163
+ if (value.release && (value.from || value.to))
164
+ throw new Error(`Lado ${label.toUpperCase()}: use release ou from/to, não os dois.`);
165
+ if (!value.release && !value.from)
166
+ throw new Error(`Lado ${label.toUpperCase()}: informe { from, to } ou { release }.`);
167
+ return value.release ? { [`${label}Release`]: value.release } : { [`${label}From`]: value.from, [`${label}To`]: value.to };
168
+ };
169
+ let res;
170
+ try {
171
+ res = await client.get(`/v1/projects/${projectId}/compare`, { ...side('a', a), ...side('b', b), rootKind, service, env, endpoint, limit, sample });
172
+ }
173
+ catch (err) {
174
+ if (err instanceof TrackApiError && err.status === 404 && /Cannot GET/.test(err.message)) {
175
+ throw new Error(`A API em ${client.baseUrl} ainda não tem GET /v1/projects/:id/compare. Compare com tracker_get_endpoint/tracker_get_overview em cada janela (from/to).`);
176
+ }
177
+ throw err;
178
+ }
179
+ const sideLine = (label, s) => `${label}: ${s.mode === 'release' ? `release ${s.release} (${s.from} → ${s.to})` : `${s.from} → ${s.to}`} · cobertura de brutos ${s.coverage}${s.coverage === 'partial' ? ` (${Math.round(s.coveredFraction * 100)}%)` : ''} · fonte ${s.source}${s.approximate ? ' (aproximada)' : ''}` +
180
+ (s.totals ? ` · ${s.totals.requests} req · erro ${pct(s.totals.errorRate)} · p50 ${ms(s.totals.p50Ms)} · p95 ${ms(s.totals.p95Ms)} · p99 ${ms(s.totals.p99Ms)}` : ' · sem latência');
181
+ const signed = (value) => `${value >= 0 ? '+' : ''}${Math.round(value)} ms`;
182
+ const lines = [sideLine('A', res.a), sideLine('B', res.b)];
183
+ if (res.delta)
184
+ lines.push(`Δ p95 ${signed(res.delta.p95Ms)}${res.delta.p95Ratio !== null ? ` (${res.delta.p95Ratio >= 0 ? '+' : ''}${Math.round(res.delta.p95Ratio * 100)}%)` : ''} · Δ erro ${(res.delta.errorRate * 100).toFixed(2)} pp · Δ requests ${res.delta.requests}`);
185
+ const worse = res.routes.filter((r) => r.delta);
186
+ if (worse.length)
187
+ lines.push('Rotas (mais pioraram primeiro):', ...worse.slice(0, 10).map((r) => `- ${r.name}: p95 ${ms(r.a?.p95Ms)} → ${ms(r.b?.p95Ms)} (${signed(r.delta.p95Ms)}) · erro ${pct(r.a?.errorRate)} → ${pct(r.b?.errorRate)}`));
188
+ const onlyOne = res.routes.filter((r) => !r.delta);
189
+ if (onlyOne.length)
190
+ lines.push(`Rotas só em um lado: ${onlyOne.slice(0, 10).map((r) => `${r.name} (${r.a ? 'A' : 'B'})`).join(', ')}`);
191
+ if (res.decomposition) {
192
+ const d = res.decomposition;
193
+ lines.push(`Tempo por execução (amostra A ${res.a.sampled} / B ${res.b.sampled}): total ${ms(d.a.totalMs)} → ${ms(d.b.totalMs)} · banco ${signed(d.delta.db)} · chamadas externas ${signed(d.delta.httpClient)} · custom ${signed(d.delta.custom)} · sem span ${signed(d.delta.gap)}`);
194
+ }
195
+ else {
196
+ lines.push('Decomposição por tipo de span: indisponível (um dos lados sem spans brutos); compare só a latência.');
197
+ }
198
+ if (res.topSpans?.length)
199
+ lines.push('Spans que mais cresceram (por execução):', ...res.topSpans.slice(0, 5).map((t) => `- ${t.kind} "${t.name.slice(0, 120)}": ${t.a ? `${ms(t.a.perExecutionMs)} ×${t.a.countPerExecution}` : 'ausente'} → ${t.b ? `${ms(t.b.perExecutionMs)} ×${t.b.countPerExecution}` : 'ausente'} (${signed(t.deltaMs)})`));
200
+ if (res.notes.length)
201
+ lines.push(...res.notes);
202
+ const capped = cappedNote(requested, limit);
203
+ if (capped)
204
+ lines.push(capped.trim());
205
+ const { links, resourceLinks } = pageLinks(client, 'endpoints', { project: projectId }, 'Endpoints');
206
+ return structured({ ...res, routes: res.routes.slice(0, limit).map((r) => compact(r)), links }, `${lines.join('\n')}${evidenceLines(res.evidence, 4)}`, { body: null, links: [...resourceLinks, ...evidenceResourceLinks(projectId, res.evidence)] });
207
+ }));
208
+ /* ---------------- estatística de logs ---------------- */
209
+ server.registerTool('tracker_log_stats', {
210
+ title: 'Estatística de logs (histograma e facetas)',
211
+ description: 'GET /v1/projects/:id/logs/histogram + /logs/facets: quantos logs por nível ao longo da janela (error/warn/info/debug), totais e os serviços e ambientes que mais logam, com os mesmos filtros de tracker_search_logs. ' +
212
+ 'Janela: `range` ou `from`/`to` ISO (até 31 dias). Use para ver quando os erros começaram ou pararam (antes e depois de um deploy) e então buscar as linhas com tracker_search_logs.',
213
+ inputSchema: {
214
+ projectId: projectIdSchema,
215
+ range: rangeSchema,
216
+ from: isoInstantSchema.optional().describe('Início absoluto ISO 8601'),
217
+ to: isoInstantSchema.optional().describe('Fim absoluto ISO 8601 (default agora)'),
218
+ q: z.string().max(512).optional().describe('Consulta textual (mesma sintaxe de tracker_search_logs)'),
219
+ service: z.string().max(128).optional().describe('Serviço'),
220
+ level: z.enum(LOG_LEVELS).optional().describe('Nível mínimo'),
221
+ traceId: z.string().max(128).optional(),
222
+ requestId: z.string().max(128).optional(),
223
+ env: z.string().max(64).optional().describe('Ambiente'),
224
+ },
225
+ outputSchema: logStatsOutput,
226
+ annotations: { readOnlyHint: true, openWorldHint: true },
227
+ }, async ({ projectId, range, from, to, q, service, level, traceId, requestId, env }) => guard(async () => {
228
+ const window = resolveWindow(range, from, to);
229
+ const query = { from: window.from, to: window.to, q, service, level, traceId, requestId, env };
230
+ const [histogram, facets] = await Promise.all([
231
+ client.get(`/v1/projects/${projectId}/logs/histogram`, query),
232
+ client.get(`/v1/projects/${projectId}/logs/facets`, query),
233
+ ]);
234
+ const totals = { error: 0, warn: 0, info: 0, debug: 0, all: 0 };
235
+ for (const point of histogram) {
236
+ for (const key of ['error', 'warn', 'info', 'debug'])
237
+ totals[key] += point.counts?.[key] ?? 0;
238
+ }
239
+ totals.all = totals.error + totals.warn + totals.info + totals.debug;
240
+ const withErrors = histogram.filter((p) => (p.counts?.error ?? 0) > 0);
241
+ const peak = withErrors.reduce((best, p) => (!best || p.counts.error > best.counts.error ? p : best), null);
242
+ const lines = [
243
+ `Logs de ${window.from} a ${window.to}: ${totals.all} (error ${totals.error} · warn ${totals.warn} · info ${totals.info} · debug ${totals.debug})`,
244
+ withErrors.length ? `Erros: primeiro bucket ${withErrors[0].ts}, último ${withErrors[withErrors.length - 1].ts}, pico ${peak.counts.error} em ${peak.ts}.` : 'Nenhum log de erro na janela.',
245
+ facets.services?.length ? `Serviços: ${facets.services.slice(0, 8).map((s) => `${s.name} (${s.count})`).join(', ')}` : '',
246
+ facets.envs?.length ? `Ambientes: ${facets.envs.slice(0, 8).map((e) => `${e.name} (${e.count})`).join(', ')}` : '',
247
+ ].filter(Boolean);
248
+ const data = { window, totals, ...compact({ histogram }), facets: compact(facets) };
249
+ return structured(data, lines.join('\n'));
250
+ }));
251
+ /* ---------------- eventos de alerta ---------------- */
252
+ server.registerTool('tracker_list_alert_events', {
253
+ title: 'Eventos de alerta (histórico)',
254
+ description: 'GET /v1/projects/:id/alerts/events: alertas disparados, mais recentes primeiro — tipo, severidade, título, quando disparou, estado (firing/resolved quando a API informa) e o resultado da entrega por canal. ' +
255
+ 'Filtros type/severity/state/from/to são aplicados pelo MCP lendo páginas da API (até 1000 eventos por chamada). Use para confirmar se um alerta parou depois de uma correção ou se um job atrasado alertou. ' +
256
+ 'Os destinatários das entregas saem mascarados (e-mail, telefone, URL). Lê só o histórico: regras, canais e destinatários continuam fora do alcance de tokens de leitura.',
257
+ inputSchema: {
258
+ projectId: projectIdSchema,
259
+ type: z.array(z.string().min(1).max(64)).min(1).max(20).optional().describe('Tipos (ex.: ["monitor_down", "error_rate", "critical_issue", "p95_regression"])'),
260
+ severity: z.array(z.enum(ALERT_SEVERITIES)).min(1).max(4).optional(),
261
+ state: z.enum(['firing', 'resolved']).optional().describe('Só episódios ainda disparando ou já resolvidos (API com estado; sem ele, resolved = resolvedAt preenchido)'),
262
+ from: isoInstantSchema.optional().describe('Só eventos disparados a partir de (ISO 8601)'),
263
+ to: isoInstantSchema.optional().describe('Só eventos disparados até (ISO 8601)'),
264
+ limit: z.number().int().min(1).max(200).default(50).describe('Eventos por página (default 50)'),
265
+ cursor: z.string().max(512).optional().describe('nextCursor da chamada anterior (com os mesmos filtros)'),
266
+ },
267
+ outputSchema: alertEventsOutput,
268
+ annotations: { readOnlyHint: true, openWorldHint: true },
269
+ }, async ({ projectId, type, severity, state, from, to, limit, cursor }) => guard(async () => {
270
+ const size = clampLimit(limit, maxItems).limit;
271
+ const fromMs = from ? Date.parse(from) : null;
272
+ const toMs = to ? Date.parse(to) : null;
273
+ if (fromMs !== null && toMs !== null && toMs <= fromMs)
274
+ throw new Error('`to` precisa ser depois de `from`.');
275
+ const stateOf = (e) => e.state ?? (e.resolvedAt ? 'resolved' : null);
276
+ const filtered = Boolean(type || severity || state || from || to);
277
+ const matches = (e) => {
278
+ const at = Date.parse(e.firedAt);
279
+ return (!type || type.includes(e.type)) && (!severity || severity.includes(e.severity)) && (!state || stateOf(e) === state) && (fromMs === null || at >= fromMs) && (toMs === null || at <= toMs);
280
+ };
281
+ const found = [];
282
+ let next = cursor ?? null;
283
+ let scanned = 0;
284
+ let pages = 0;
285
+ let reachedFrom = false;
286
+ // Sem filtro, uma página com o limit pedido (cursor exato). Com filtro, páginas inteiras: o
287
+ // corte nunca acontece no meio de uma página, senão o cursor (que aponta para depois da
288
+ // página) pularia eventos que casariam. Uma página só é lida se todas as suas possíveis
289
+ // correspondências cabem em FG_TRACKER_MAX_ITEMS; por isso a resposta pode trazer mais que
290
+ // `limit`, nunca menos do que casou nas páginas lidas.
291
+ const pageSize = filtered ? Math.min(200, maxItems) : size;
292
+ do {
293
+ const page = await client.get(`/v1/projects/${projectId}/alerts/events`, { limit: pageSize, cursor: next ?? undefined });
294
+ pages++;
295
+ scanned += page.items.length;
296
+ for (const e of page.items)
297
+ if (matches(e))
298
+ found.push(e);
299
+ next = page.nextCursor;
300
+ reachedFrom = fromMs !== null && page.items.some((e) => Date.parse(e.firedAt) < fromMs);
301
+ } while (filtered && next && !reachedFrom && found.length < size && found.length + pageSize <= maxItems && pages < 5);
302
+ if (reachedFrom)
303
+ next = null;
304
+ const items = found.map((e) => ({
305
+ id: e.id,
306
+ type: e.type,
307
+ severity: e.severity,
308
+ title: e.title,
309
+ firedAt: e.firedAt,
310
+ state: stateOf(e),
311
+ resolvedAt: e.resolvedAt ?? null,
312
+ ...(e.lastDetectedAt !== undefined ? { lastDetectedAt: e.lastDetectedAt } : {}),
313
+ acknowledgedAt: e.acknowledgedAt ?? null,
314
+ fingerprint: e.fingerprint,
315
+ body: e.body ? e.body.slice(0, 500) : undefined,
316
+ payload: e.payload ? compact(e.payload) : undefined,
317
+ deliveries: (e.deliveries ?? []).map((d) => ({ channel: d.channel, to: maskRecipient(d.to), status: d.status, ...(d.at ? { at: d.at } : {}), ...(d.attempts !== undefined ? { attempts: d.attempts } : {}), ...(d.kind ? { kind: d.kind } : {}), ...(d.error ? { error: d.error.slice(0, 200) } : {}) })),
318
+ }));
319
+ const evidence = [];
320
+ for (const e of found) {
321
+ const traceId = typeof e.payload?.sampleTraceId === 'string' ? e.payload.sampleTraceId : typeof e.payload?.traceId === 'string' ? e.payload.traceId : null;
322
+ if (traceId && evidence.length < 5)
323
+ evidence.push({ traceId, metric: `alert.${e.type}`, value: e.severity, window: { from: e.firedAt, to: e.resolvedAt ?? e.firedAt }, note: e.title.slice(0, 200) });
324
+ }
325
+ const filterLabel = [type ? `tipo ${type.join('|')}` : '', severity ? `severidade ${severity.join('|')}` : '', state ? `estado ${state}` : '', from ? `desde ${from}` : '', to ? `até ${to}` : ''].filter(Boolean).join(', ');
326
+ const lines = items.slice(0, 25).map((e) => `- ${e.firedAt} [${e.severity}] ${e.type}: ${e.title}${e.state ? ` · ${e.state}` : ''}${e.resolvedAt ? ` (resolvido ${e.resolvedAt})` : ''}${e.deliveries.length ? ` · entregas: ${e.deliveries.map((d) => `${d.channel} ${d.status}`).join(', ')}` : ''}`);
327
+ const summary = items.length
328
+ ? `${items.length} eventos${filterLabel ? ` (${filterLabel})` : ''}, ${scanned} lidos da API${next ? ' · há mais: repita com cursor = nextCursor' : ''}:\n${lines.join('\n')}${items.length > 25 ? `\n… +${items.length - 25} no JSON` : ''}`
329
+ : `Nenhum evento de alerta${filterLabel ? ` com ${filterLabel}` : ''} (${scanned} lidos da API${next ? '; há mais: repita com cursor = nextCursor' : ''}).`;
330
+ return structured({ window: from || to ? { from: from ?? new Date(0).toISOString(), to: to ?? new Date().toISOString() } : null, filters: { ...(type ? { type } : {}), ...(severity ? { severity } : {}), ...(state ? { state } : {}) }, items, scanned, nextCursor: next, evidence }, `${summary}${evidenceLines(evidence, 3)}`);
331
+ }));
332
+ /* ---------------- ambientes ---------------- */
333
+ server.registerTool('tracker_list_environments', {
334
+ title: 'Ambientes e serviços do projeto',
335
+ description: 'Descobre os valores para `env`/`service`: ambientes com releases (GET /release-environments: quantas versões e quando foi visto) unidos aos ambientes e serviços vistos nas raízes do range (overview). Chame antes de filtrar métricas de produção quando o projeto recebe mais de um ambiente.',
336
+ inputSchema: { projectId: projectIdSchema, range: rangeSchema },
337
+ outputSchema: environmentsOutput,
338
+ annotations: { readOnlyHint: true, openWorldHint: true },
339
+ }, async ({ projectId, range }) => guard(async () => {
340
+ const window = rangeWindow(range);
341
+ const [releaseEnvs, overview] = await Promise.all([
342
+ client.get(`/v1/projects/${projectId}/release-environments`).catch((err) => {
343
+ if (err instanceof TrackApiError && err.status === 404 && /Cannot GET/.test(err.message))
344
+ return [];
345
+ throw err;
346
+ }),
347
+ client.get(`/v1/projects/${projectId}/overview`, { range, rootKind: 'all' }),
348
+ ]);
349
+ const seen = new Set(overview.environments ?? []);
350
+ const byName = new Map();
351
+ for (const e of releaseEnvs)
352
+ byName.set(e.environment, { name: e.environment, versions: e.versions, lastSeen: e.lastSeen, inTelemetry: seen.has(e.environment) });
353
+ for (const name of seen)
354
+ if (!byName.has(name))
355
+ byName.set(name, { name, versions: null, lastSeen: null, inTelemetry: true });
356
+ const environments = [...byName.values()].sort((a, b) => Number(b.inTelemetry) - Number(a.inTelemetry) || a.name.localeCompare(b.name));
357
+ const services = overview.services ?? [];
358
+ const lines = [
359
+ environments.length
360
+ ? `Ambientes: ${environments.map((e) => `${e.name}${e.versions !== null ? ` (${e.versions} versões${e.lastSeen ? `, visto ${e.lastSeen}` : ''})` : ''}${e.inTelemetry ? '' : ' — sem tráfego no range'}`).join('; ')}`
361
+ : 'Nenhum ambiente informado (o SDK não manda `environment`): os filtros env não se aplicam.',
362
+ `Serviços no range ${range}: ${services.length ? services.join(', ') : '—'}`,
363
+ environments.length > 1 ? 'Mais de um ambiente: passe env (ex.: production) nas ferramentas de métricas para não misturar.' : '',
364
+ ].filter(Boolean);
365
+ return structured({ window, environments, services }, lines.join('\n'));
366
+ }));
367
+ /* ---------------- recursos fg-tracker:// ---------------- */
368
+ const findProjectFor = async (load) => {
369
+ const projects = await client.get('/v1/projects');
370
+ for (const project of projects.slice(0, 25)) {
371
+ try {
372
+ return { projectId: project.id, value: await load(project.id) };
373
+ }
374
+ catch (err) {
375
+ if (err instanceof TrackApiError && (err.status === 404 || err.status === 403))
376
+ continue;
377
+ throw err;
378
+ }
379
+ }
380
+ throw new Error('Não encontrado nos projetos acessíveis (até 25). Informe ?projectId=.');
381
+ };
382
+ const readJson = async (uri, projectId, load) => {
383
+ // projectId vira segmento de caminho: só UUID, senão '/' ou '?' levariam a outra rota da API.
384
+ if (projectId !== undefined && !UUID_RE.test(projectId))
385
+ throw new Error(`projectId inválido em ${uri.href}: use o UUID do projeto.`);
386
+ const { value } = projectId ? { value: await load(projectId) } : await findProjectFor(load);
387
+ return { contents: [{ uri: uri.href, mimeType: 'application/json', text: JSON.stringify(compact(value)) }] };
388
+ };
389
+ server.registerResource('trace', new ResourceTemplate(TRACE_URI_TEMPLATE, { list: undefined }), { title: 'Trace (JSON)', description: 'Waterfall de um trace (GET …/traces/:traceId), compactado. fg-tracker://trace/{traceId}?projectId={projectId}; sem projectId procura nos projetos acessíveis.', mimeType: 'application/json' }, async (uri) => {
390
+ const { id, projectId } = parseResourceUri(uri);
391
+ if (!id)
392
+ throw new Error('traceId ausente na URI');
393
+ return readJson(uri, projectId, (project) => client.get(`/v1/projects/${project}/traces/${encodeURIComponent(id)}`));
394
+ });
395
+ server.registerResource('issue', new ResourceTemplate(ISSUE_URI_TEMPLATE, { list: undefined }), { title: 'Issue (JSON)', description: 'Detalhe de uma issue (GET …/issues/:issueId), compactado. fg-tracker://issue/{issueId}?projectId={projectId}; sem projectId procura nos projetos acessíveis.', mimeType: 'application/json' }, async (uri) => {
396
+ const { id, projectId } = parseResourceUri(uri);
397
+ if (!id)
398
+ throw new Error('issueId ausente na URI');
399
+ return readJson(uri, projectId, (project) => client.get(`/v1/projects/${project}/issues/${encodeURIComponent(id)}`));
400
+ });
401
+ }
402
+ /**
403
+ * Para cada query, um trace real que a contém: o mais lento do primeiro chamador (endpoint ou
404
+ * job) e, nele, a execução mais lenta da query. Até 3 chamadas por query, com cache por chamador
405
+ * e por trace; falhas viram nota, nunca erro da ferramenta.
406
+ */
407
+ async function sampleQueryTraces(client, projectId, windowQuery, window, queries, filters) {
408
+ const details = new Map();
409
+ const traces = new Map();
410
+ const detailOf = (name, rootKind) => {
411
+ const key = `${rootKind}:${name}`;
412
+ if (!details.has(key))
413
+ details.set(key, client.get(`/v1/projects/${projectId}/endpoints/detail`, { name, ...windowQuery, rootKind, env: filters.env }));
414
+ return details.get(key);
415
+ };
416
+ const traceOf = (traceId) => {
417
+ if (!traces.has(traceId))
418
+ traces.set(traceId, client.get(`/v1/projects/${projectId}/traces/${encodeURIComponent(traceId)}`));
419
+ return traces.get(traceId);
420
+ };
421
+ const notes = [];
422
+ const results = await Promise.all(queries.map(async (query) => {
423
+ const caller = query.endpoints?.[0] ? { name: query.endpoints[0], rootKind: 'http' } : query.jobs?.[0] ? { name: query.jobs[0], rootKind: 'custom' } : null;
424
+ if (!caller) {
425
+ notes.push(`Sem chamador conhecido para "${query.name.slice(0, 60)}": procure com tracker_list_traces e tracker_get_trace { kind: "db.query", name }.`);
426
+ return null;
427
+ }
428
+ try {
429
+ const detail = await detailOf(caller.name, caller.rootKind);
430
+ for (const candidate of (detail.slowestTraces ?? []).slice(0, 3)) {
431
+ const trace = await traceOf(candidate.traceId);
432
+ // O escopo vale para o próprio db.query: num trace distribuído a raiz pode ser de outro
433
+ // serviço, e o trace pode ter spans fora da janela.
434
+ // A mesma agregação de /database: coalesce(db.query.fingerprint, name). Dois SQLs com o
435
+ // mesmo nome truncado e fingerprints diferentes são queries diferentes.
436
+ const groupKey = query.fingerprint ?? query.name;
437
+ const spans = (trace.spans ?? []).filter((span) => span.kind === 'db.query' && span.name === query.name && spanGroupKey(span) === groupKey && inScope(span, filters, window));
438
+ const slowest = spans.sort((a, b) => b.durationMs - a.durationMs)[0];
439
+ if (slowest) {
440
+ return { traceId: candidate.traceId, spanId: slowest.spanId, metric: 'db.query.durationMs', value: slowest.durationMs, window: spanWindow(slowest.startedAt, slowest.durationMs), note: `${query.name.slice(0, 120)} em ${caller.name}${spans.length > 1 ? ` (${spans.length}× no trace)` : ''}` };
441
+ }
442
+ }
443
+ notes.push(`Nenhum dos traces mais lentos de ${caller.name} contém "${query.name.slice(0, 60)}"${filters.service || filters.env ? ` em${filters.service ? ` service ${filters.service}` : ''}${filters.env ? ` env ${filters.env}` : ''}` : ''} na janela: sem evidência para ela.`);
444
+ }
445
+ catch (err) {
446
+ notes.push(`Evidência de "${query.name.slice(0, 60)}" indisponível: ${err instanceof TrackApiError ? err.message : String(err)}`);
447
+ }
448
+ return null;
449
+ }));
450
+ return { evidence: results.filter((e) => e !== null), notes };
451
+ }
452
+ /** O span está no serviço, no ambiente e na janela pedidos. */
453
+ function inScope(span, filters, window) {
454
+ if (filters.service && span.service !== filters.service)
455
+ return false;
456
+ if (filters.env && (span.environment ?? span.attributes?.environment) !== filters.env)
457
+ return false;
458
+ const at = Date.parse(span.startedAt);
459
+ // Janela semiaberta [from, to), como a agregação da API (started_at < to).
460
+ return at >= Date.parse(window.from) && at < Date.parse(window.to);
461
+ }
462
+ /** Chave de agregação do span em /database: `db.query.fingerprint` quando presente, senão o nome. */
463
+ function spanGroupKey(span) {
464
+ const fingerprint = span.attributes?.['db.query.fingerprint'];
465
+ return typeof fingerprint === 'string' && fingerprint !== '' ? fingerprint : span.name;
466
+ }
467
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
package/dist/format.d.ts CHANGED
@@ -1,9 +1,19 @@
1
+ /** Link para um recurso (MCP `resource_link`): o painel ou um `fg-tracker://…` legível pelo servidor. */
2
+ export interface ResourceLink {
3
+ type: 'resource_link';
4
+ uri: string;
5
+ name: string;
6
+ title?: string;
7
+ description?: string;
8
+ mimeType?: string;
9
+ }
1
10
  export interface ToolText {
2
11
  [x: string]: unknown;
3
12
  content: Array<{
4
13
  type: 'text';
5
14
  text: string;
6
- }>;
15
+ } | ResourceLink>;
16
+ structuredContent?: Record<string, unknown>;
7
17
  isError?: boolean;
8
18
  }
9
19
  export declare const MAX_SERIES_POINTS = 48;
@@ -18,10 +28,23 @@ export declare const MAX_ITEMS_CEILING = 1000;
18
28
  export declare const PREVIEW_LINES = 25;
19
29
  export declare function text(value: string): ToolText;
20
30
  export declare function json(value: unknown, preface?: string): ToolText;
31
+ /**
32
+ * Resultado com `structuredContent` (o que o `outputSchema` descreve) e o texto de sempre:
33
+ * o resumo e, depois de uma linha em branco, o JSON de `body` (default: o próprio `data`).
34
+ * `body` existe para manter o JSON antigo do texto quando o estruturado mudou de forma
35
+ * (ex.: lista que virou `{ items }`). `body: null` deixa só o resumo.
36
+ */
37
+ export declare function structured(data: Record<string, unknown>, summary: string, options?: {
38
+ body?: unknown;
39
+ links?: ResourceLink[];
40
+ }): ToolText;
21
41
  export declare function errorResult(err: unknown): ToolText;
22
42
  /** Executa `fn` e converte qualquer exceção em resultado `isError`. */
23
43
  export declare function guard(fn: () => Promise<ToolText>): Promise<ToolText>;
24
- /** Reduz uma série mantendo a distribuição (amostragem uniforme). */
44
+ /**
45
+ * Reduz uma série a `max` pontos por amostragem uniforme, sempre com o primeiro e o
46
+ * último: numa série em ordem de tempo, o ponto mais recente nunca fica de fora.
47
+ */
25
48
  export declare function sampleSeries<T>(series: T[], max?: number): T[];
26
49
  export declare function truncateList<T>(list: T[], max?: number): {
27
50
  items: T[];