fg-tracker-mcp 0.4.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/dist/server.js ADDED
@@ -0,0 +1,418 @@
1
+ import { detectDatabases, databaseGuide } from "./database.js";
2
+ /**
3
+ * Servidor MCP do FG Tracker (docs/CONTRATO.md §12): tools, prompt e resource.
4
+ * O transporte (stdio) é conectado em `cli.ts`.
5
+ */
6
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
+ import { z } from 'zod';
8
+ import { RANGE_KEYS, RANGE_SECONDS, TrackApiError, TrackClient, configFromEnv, } from './client.js';
9
+ import { LEGACY_QUICKSTART_URI, QUICKSTART_URI, instrumentProjectPrompt, quickstartMarkdown } from './docs.js';
10
+ import { ago, compact, guard, json, ms, pct, text } from './format.js';
11
+ import { FRAMEWORKS, buildGuide } from './guide.js';
12
+ export const SERVER_NAME = 'fg-tracker';
13
+ export const SERVER_VERSION = '0.4.0';
14
+ const rangeSchema = z.enum(RANGE_KEYS).default('24h').describe('Janela: 15m|1h|6h|24h|7d|30d (default 24h)');
15
+ const projectIdSchema = z.string().uuid().describe('ID (uuid) do projeto — veja track_list_projects');
16
+ const LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
17
+ function rangeWindow(range, now = Date.now()) {
18
+ return { from: new Date(now - RANGE_SECONDS[range] * 1000).toISOString(), to: new Date(now).toISOString() };
19
+ }
20
+ export function createServer(options = {}) {
21
+ const client = options.client ?? new TrackClient(configFromEnv());
22
+ const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION }, {
23
+ instructions: [
24
+ 'Servidor MCP do FG Tracker (APM para Node: traces distribuídos, queries de qualquer banco via adapters, provedores externos, logs, issues com impacto por usuário e commits suspeitos, releases, monitores de uptime/jobs, detecção de N+1/loops/lentidão/erros).',
25
+ `API: ${client.baseUrl}. Comece por track_status; depois track_list_projects para obter projectId.`,
26
+ 'Para conectar um app use o prompt instrument-project ou track_detect_databases + track_instrumentation_guide + track_verify_ingest.',
27
+ 'Ranges aceitos: 15m|1h|6h|24h|7d|30d.',
28
+ ].join(' '),
29
+ });
30
+ server.registerTool('track_detect_databases', {
31
+ title: 'Identify database drivers in the local project',
32
+ description: 'Inspect local manifests/imports without reading secrets. Returns all candidate drivers, initialization files and the correct SDK integration guide. The coding agent must apply the guide to the active clients and verify request-linked db.query spans.',
33
+ inputSchema: { projectPath: z.string().min(1).describe('Absolute path of the application authorized for instrumentation'), serviceName: z.string().default('app') },
34
+ annotations: { readOnlyHint: true, openWorldHint: false },
35
+ }, async ({ projectPath, serviceName }) => guard(async () => {
36
+ const detected = await detectDatabases(projectPath);
37
+ return text(JSON.stringify(detected, null, 2) + '\n\n' +
38
+ (detected.databases.length ? detected.databases.map(x => databaseGuide(x.package, serviceName)).join('\n\n') : databaseGuide('generic', serviceName)));
39
+ }));
40
+ /* ---------------- tools ---------------- */
41
+ server.registerTool('track_status', {
42
+ title: 'Status do FG Tracker',
43
+ description: 'Verifica se a API do FG Tracker está no ar (GET /v1/health), qual URL/credenciais este servidor está usando e quantos projetos o token enxerga. Comece por aqui.',
44
+ inputSchema: {},
45
+ annotations: { readOnlyHint: true, openWorldHint: true },
46
+ }, async () => guard(async () => {
47
+ const health = await client.get('/v1/health');
48
+ const lines = [
49
+ `API: ${client.baseUrl} — ${health.status} (versão ${health.version}, banco ${health.database}, uptime ${Math.round(health.uptimeSeconds)} s)`,
50
+ `FG_TRACKER_TOKEN: ${client.hasToken ? 'definido' : 'ausente (necessário quando a API exige login: projetos/métricas/logs)'}`,
51
+ `FG_TRACKER_API_KEY: ${client.hasApiKey ? 'definido' : 'ausente (opcional; só para ingestão)'}`,
52
+ ];
53
+ try {
54
+ const projects = await client.get('/v1/projects');
55
+ lines.push(`Projetos acessíveis: ${projects.length}${projects.length ? ' — ' + projects.map((p) => `${p.name} (${p.id})`).slice(0, 10).join(', ') : ''}`);
56
+ }
57
+ catch (err) {
58
+ lines.push(`Projetos: ${err instanceof TrackApiError ? err.describe() : String(err)}`);
59
+ }
60
+ try {
61
+ const ai = await client.get('/v1/ai/status');
62
+ lines.push(`IA (Insights): ${ai.enabled ? `habilitada (${ai.provider ?? 'provider'} · ${ai.model ?? '?'})` : `desabilitada${ai.reason ? ` — ${ai.reason}` : ''}`}`);
63
+ }
64
+ catch {
65
+ /* opcional */
66
+ }
67
+ return text(lines.join('\n'));
68
+ }));
69
+ server.registerTool('track_list_projects', {
70
+ title: 'Listar projetos',
71
+ description: 'Lista os projetos que o usuário do token enxerga, com apiKey, limiares e estatísticas de 24h (requests, taxa de erro, p95, issues abertas).',
72
+ inputSchema: {},
73
+ annotations: { readOnlyHint: true, openWorldHint: true },
74
+ }, async () => guard(async () => {
75
+ const projects = await client.get('/v1/projects');
76
+ if (projects.length === 0)
77
+ return text('Nenhum projeto. Crie um com track_create_project { name }.');
78
+ const summary = projects
79
+ .map((p) => {
80
+ const s = p.stats;
81
+ const stats = s ? ` · 24h: ${s.requests24h} req, erro ${pct(s.errorRate24h)}, p95 ${ms(s.p95Ms24h)}, ${s.openIssues} issues` : '';
82
+ return `- ${p.name} — id ${p.id} · slug ${p.slug} · apiKey ${p.apiKey}${stats}`;
83
+ })
84
+ .join('\n');
85
+ return json(compact(projects), summary);
86
+ }));
87
+ server.registerTool('track_create_project', {
88
+ title: 'Criar projeto',
89
+ description: 'Cria um projeto no FG Tracker e devolve o projeto com a apiKey (stk_...) para colocar em FG_TRACKER_KEY do app instrumentado.',
90
+ inputSchema: { name: z.string().min(1).max(120).describe('Nome do projeto (ex.: "minha-api")') },
91
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
92
+ }, async ({ name }) => guard(async () => {
93
+ const project = await client.post('/v1/projects', { name });
94
+ return json(project, `Projeto "${project.name}" criado.\n- projectId: ${project.id}\n- apiKey: ${project.apiKey}\n\nPróximo passo: track_instrumentation_guide { framework, projectId: "${project.id}" }.`);
95
+ }));
96
+ server.registerTool('track_get_overview', {
97
+ title: 'Visão geral do projeto',
98
+ description: 'Métricas agregadas do projeto no range: requests, taxa de erro, p50/p95/p99, apdex, throughput, issues abertas, breakdown por status, top endpoints lentos e com erro, e série temporal (amostrada).',
99
+ inputSchema: { projectId: projectIdSchema, range: rangeSchema },
100
+ annotations: { readOnlyHint: true, openWorldHint: true },
101
+ }, async ({ projectId, range }) => guard(async () => {
102
+ const overview = await client.get(`/v1/projects/${projectId}/overview`, { range });
103
+ const o = overview;
104
+ const summary = `Range ${range}: ${o.requests ?? 0} requests · erro ${pct(o.errorRate)} · p50 ${ms(o.p50Ms)} · p95 ${ms(o.p95Ms)} · p99 ${ms(o.p99Ms)} · apdex ${o.apdex ?? '—'} · ${o.openIssues ?? 0} issues abertas`;
105
+ return json(compact(overview), summary);
106
+ }));
107
+ server.registerTool('track_list_endpoints', {
108
+ title: 'Listar endpoints',
109
+ description: 'Endpoints do projeto no range com requests, taxa de erro, p50/p95/p99, média, último acesso, sparkline de p95 e nº de issues. Ordenável e filtrável por texto.',
110
+ inputSchema: {
111
+ projectId: projectIdSchema,
112
+ range: rangeSchema,
113
+ search: z.string().optional().describe('Filtro textual no nome (ex.: "/users")'),
114
+ sort: z.enum(['p95', 'requests', 'errorRate', 'name']).optional().describe('Ordenação (default p95)'),
115
+ limit: z.number().int().min(1).max(100).optional().describe('Máximo de itens devolvidos (default 25)'),
116
+ },
117
+ annotations: { readOnlyHint: true, openWorldHint: true },
118
+ }, async ({ projectId, range, search, sort, limit }) => guard(async () => {
119
+ const endpoints = await client.get(`/v1/projects/${projectId}/endpoints`, { range, search, sort });
120
+ const max = limit ?? 25;
121
+ const shown = endpoints.slice(0, max);
122
+ const summary = `${endpoints.length} endpoints no range ${range}${endpoints.length > max ? ` (mostrando ${max})` : ''}.`;
123
+ return json(shown, summary + (endpoints.length > max ? ` Use limit/search para ver o restante.` : ''));
124
+ }));
125
+ server.registerTool('track_list_issues', {
126
+ title: 'Listar issues',
127
+ description: 'Issues detectadas automaticamente (N_PLUS_ONE, LOOP, SLOW_ENDPOINT, ERROR) com severidade, contagem, primeira/última ocorrência, trace de amostra e detalhes.',
128
+ inputSchema: {
129
+ projectId: projectIdSchema,
130
+ status: z.enum(['open', 'resolved', 'ignored', 'all']).default('open').describe('Filtro de status (default open)'),
131
+ },
132
+ annotations: { readOnlyHint: true, openWorldHint: true },
133
+ }, async ({ projectId, status }) => guard(async () => {
134
+ const issues = await client.get(`/v1/projects/${projectId}/issues`, { status });
135
+ if (issues.length === 0)
136
+ return text(`Nenhuma issue com status "${status}".`);
137
+ const summary = issues
138
+ .slice(0, 25)
139
+ .map((i) => `- [${i.severity}] ${i.type}: ${i.title} (×${i.count}${i.sampleTraceId ? `, trace ${i.sampleTraceId}` : ''})`)
140
+ .join('\n');
141
+ return json(compact(issues), `${issues.length} issues (${status}):\n${summary}`);
142
+ }));
143
+ server.registerTool('track_list_traces', {
144
+ title: 'Listar traces',
145
+ description: 'Traces recentes do projeto (para escolher um traceId e chamar track_get_trace). Filtros: endpoint, status ok|error, duração mínima.',
146
+ inputSchema: {
147
+ projectId: projectIdSchema,
148
+ range: rangeSchema,
149
+ endpoint: z.string().optional().describe('Nome do endpoint (ex.: "GET /users/:id")'),
150
+ status: z.enum(['ok', 'error']).optional(),
151
+ minDurationMs: z.number().min(0).optional(),
152
+ limit: z.number().int().min(1).max(200).default(20),
153
+ cursor: z.string().optional().describe('nextCursor da página anterior'),
154
+ },
155
+ annotations: { readOnlyHint: true, openWorldHint: true },
156
+ }, async ({ projectId, range, endpoint, status, minDurationMs, limit, cursor }) => guard(async () => {
157
+ const res = await client.get(`/v1/projects/${projectId}/traces`, { range, endpoint, status, minDurationMs, limit, cursor });
158
+ if (res.items.length === 0)
159
+ return text(`Nenhum trace no range ${range}${endpoint ? ` para ${endpoint}` : ''}.`);
160
+ const lines = res.items.map((t) => `- ${t.traceId} · ${t.name} · ${t.statusCode ?? '—'} · ${ms(t.durationMs)} · ${t.spanCount} spans/${t.dbQueries} queries · ${ago(t.startedAt)}${t.hasIssue ? ' · ISSUE' : ''}`);
161
+ return json(res, `${res.items.length} traces${res.nextCursor ? ' (há mais: use cursor)' : ''}:\n${lines.join('\n')}`);
162
+ }));
163
+ server.registerTool('track_get_trace', {
164
+ title: 'Detalhe de um trace',
165
+ description: 'Waterfall de um trace: spans em pré-ordem com depth/offsetMs, issues ligadas e resumo por kind e spans repetidos (evidência de N+1/loop). Limitado a 80 spans.',
166
+ inputSchema: { projectId: projectIdSchema, traceId: z.string().min(1).describe('traceId (veja track_list_traces ou sampleTraceId de uma issue)') },
167
+ annotations: { readOnlyHint: true, openWorldHint: true },
168
+ }, async ({ projectId, traceId }) => guard(async () => {
169
+ const trace = await client.get(`/v1/projects/${projectId}/traces/${encodeURIComponent(traceId)}`);
170
+ const t = trace;
171
+ const repeated = t.summary?.repeated?.slice(0, 5).map((r) => `${r.kind} "${r.name}" ×${r.count}`).join('; ');
172
+ const summary = `${t.name ?? traceId}: ${ms(t.durationMs)}, status ${t.statusCode ?? '—'}, ${t.spans?.length ?? 0} spans${repeated ? ` · repetidos: ${repeated}` : ''}`;
173
+ return json(compact(trace), summary);
174
+ }));
175
+ server.registerTool('track_search_logs', {
176
+ title: 'Buscar logs',
177
+ description: 'Busca logs do projeto (GET /v1/projects/:id/logs). `q`: texto livre (full-text), "frase" entre aspas, key=value filtra context, ~trecho faz substring. `level` é o nível mínimo. Devolve os mais recentes primeiro.',
178
+ inputSchema: {
179
+ projectId: projectIdSchema,
180
+ q: z.string().optional().describe('Consulta textual'),
181
+ service: z.string().optional().describe('Nome do serviço'),
182
+ level: z.enum(LOG_LEVELS).optional().describe('Nível mínimo: trace|debug|info|warn|error|fatal'),
183
+ traceId: z.string().optional(),
184
+ range: z.enum(RANGE_KEYS).default('1h').describe('Janela (default 1h)'),
185
+ limit: z.number().int().min(1).max(200).default(50),
186
+ cursor: z.string().optional(),
187
+ },
188
+ annotations: { readOnlyHint: true, openWorldHint: true },
189
+ }, async ({ projectId, q, service, level, traceId, range, limit, cursor }) => guard(async () => {
190
+ const { from, to } = rangeWindow(range);
191
+ let res;
192
+ try {
193
+ res = await client.get(`/v1/projects/${projectId}/logs`, { from, to, q, service, level, traceId, limit, cursor, order: 'desc' });
194
+ }
195
+ catch (err) {
196
+ if (err instanceof TrackApiError && err.status === 404 && /Cannot GET/.test(err.message)) {
197
+ return text(`A API em ${client.baseUrl} ainda não expõe GET /v1/projects/:id/logs (endpoint de logs não disponível nesta versão). Atualize a API do FG Tracker.`);
198
+ }
199
+ throw err;
200
+ }
201
+ if (res.items.length === 0)
202
+ return text(`Nenhum log no range ${range}${q ? ` para "${q}"` : ''}${service ? ` (service ${service})` : ''}.`);
203
+ const lines = res.items.slice(0, 25).map((l) => `${l.ts} [${l.level}] ${l.service}: ${l.message.slice(0, 160)}${l.traceId ? ` (trace ${l.traceId})` : ''}`);
204
+ return json(compact(res), `${res.items.length} logs${res.nextCursor ? ' (há mais: use cursor)' : ''}:\n${lines.join('\n')}`);
205
+ }));
206
+ server.registerTool('track_instrumentation_guide', {
207
+ title: 'Guia de instrumentação',
208
+ description: 'Passo a passo com código copiável para conectar um app ao FG Tracker: express, nestjs, nextjs, fastify (via hook), pino ou winston (logs). Com projectId, o código já vem com a apiKey real do projeto.',
209
+ inputSchema: {
210
+ framework: z.enum(FRAMEWORKS).describe('express | nestjs | nextjs | fastify | pino | winston'),
211
+ projectId: z.string().uuid().optional().describe('Projeto para usar a chave real (recomendado)'),
212
+ serviceName: z.string().optional().describe('serviceName do tracker (default: slug do projeto)'),
213
+ databaseDriver: z.string().optional().describe('Driver returned by track_detect_databases; never assume pg for other clients'),
214
+ },
215
+ annotations: { readOnlyHint: true, openWorldHint: true },
216
+ }, async ({ framework, projectId, serviceName, databaseDriver }) => guard(async () => {
217
+ let project;
218
+ if (projectId) {
219
+ project = await client.get(`/v1/projects/${projectId}`);
220
+ }
221
+ const guide = buildGuide({
222
+ framework,
223
+ endpoint: client.baseUrl,
224
+ apiKey: project?.apiKey,
225
+ projectName: project?.name,
226
+ projectId: project?.id,
227
+ serviceName: serviceName ?? project?.slug,
228
+ });
229
+ return text(guide + '\n\n' + (databaseDriver ? databaseGuide(databaseDriver, serviceName ?? project?.slug ?? 'app') : 'Before instrumenting any database call track_detect_databases with the local project path. The pg examples only apply to pg.Pool, never to Postgres.js/Prisma/other drivers.'));
230
+ }));
231
+ server.registerTool('track_verify_ingest', {
232
+ title: 'Verificar ingestão',
233
+ description: 'Confirma se spans e logs do projeto chegaram recentemente (últimos 15 min): consulta o trace e o log mais recentes e explica o que fazer se nada chegou.',
234
+ inputSchema: { projectId: projectIdSchema },
235
+ annotations: { readOnlyHint: true, openWorldHint: true },
236
+ }, async ({ projectId }) => guard(async () => {
237
+ const now = Date.now();
238
+ const lines = [];
239
+ let spansOk = false;
240
+ let logsOk = false;
241
+ let logsAvailable = true;
242
+ const traces = await client.get(`/v1/projects/${projectId}/traces`, { range: '15m', limit: 1 });
243
+ const last = traces.items[0];
244
+ if (last) {
245
+ spansOk = true;
246
+ lines.push(`Spans: OK — último trace "${last.name}" ${ago(last.startedAt, now)} (status ${last.statusCode ?? '—'}, ${ms(last.durationMs)}, ${last.spanCount} spans, ${last.dbQueries} queries, traceId ${last.traceId}).`);
247
+ }
248
+ else {
249
+ lines.push('Spans: NENHUM trace nos últimos 15 min.');
250
+ }
251
+ try {
252
+ const { from, to } = rangeWindow('15m', now);
253
+ const logs = await client.get(`/v1/projects/${projectId}/logs`, { from, to, limit: 1, order: 'desc' });
254
+ const l = logs.items[0];
255
+ if (l) {
256
+ logsOk = true;
257
+ lines.push(`Logs: OK — último log ${ago(l.ts, now)} [${l.level}] ${l.service}: ${l.message.slice(0, 120)}${l.traceId ? ` (correlacionado ao trace ${l.traceId})` : ''}.`);
258
+ }
259
+ else {
260
+ lines.push('Logs: NENHUM log nos últimos 15 min (ok se o app não configurou o shipper de logs).');
261
+ }
262
+ }
263
+ catch (err) {
264
+ if (err instanceof TrackApiError && err.status === 404 && /Cannot GET/.test(err.message)) {
265
+ logsAvailable = false;
266
+ lines.push('Logs: endpoint GET /v1/projects/:id/logs indisponível nesta versão da API — verificação de logs pulada.');
267
+ }
268
+ else {
269
+ lines.push(`Logs: erro ao consultar — ${err instanceof TrackApiError ? err.describe() : String(err)}`);
270
+ }
271
+ }
272
+ lines.push('');
273
+ if (spansOk) {
274
+ lines.push(`Veredito: ingestão de traces funcionando${logsOk ? ' e logs chegando' : logsAvailable ? '; logs ainda não (opcional)' : ''}. Explore com track_get_overview { projectId: "${projectId}", range: "15m" } e track_list_issues.`);
275
+ }
276
+ else {
277
+ lines.push('Veredito: nada chegou. Checklist:', `1. O app está rodando e recebeu requisições nos últimos minutos? (o SDK envia a cada 2 s; chame tracker.flush() para forçar)`, `2. FG_TRACKER_KEY é a chave deste projeto? (track_list_projects mostra a apiKey; resposta 4xx no envio = chave errada, o SDK avisa uma vez no console)`, `3. O app alcança a API? (curl ${client.baseUrl}/v1/health de dentro do ambiente do app; endpoint do tracker = FG_TRACKER_URL)`, '4. app.use(tracker.express()) é o PRIMEIRO middleware / wrapNextRoute envolve o handler / hook onRequest registrado antes das rotas?', '5. createTracker recebeu enabled: false ou apiKey vazia? (tracker vira no-op com aviso "[fg-tracker] apiKey ausente")', `Teste direto sem o SDK: curl -X POST ${client.baseUrl}/v1/ingest -H 'x-fg-tracker-key: <apiKey>' -H 'content-type: application/json' -d '{"traces":[...]}' (formato em ${QUICKSTART_URI}).`);
278
+ }
279
+ return text(lines.join('\n'));
280
+ }));
281
+ /* ---------------- releases, issues, monitores, provedores (CONTRATO.md §15–§20) ---------------- */
282
+ server.registerTool('track_get_issue', {
283
+ title: 'Detalhe de uma issue',
284
+ description: 'Issue estilo Sentry: ocorrências recentes (timestamp, trace, usuário, release), ocorrências por dia, usuários mais afetados, releases em que apareceu, regressões (resolvida que voltou) e commits/PRs suspeitos (frames do stack cruzados com os arquivos alterados nas releases).',
285
+ inputSchema: { projectId: projectIdSchema, issueId: z.string().uuid().describe('id da issue (track_list_issues)') },
286
+ annotations: { readOnlyHint: true, openWorldHint: true },
287
+ }, async ({ projectId, issueId }) => guard(async () => {
288
+ const issue = await client.get(`/v1/projects/${projectId}/issues/${issueId}`);
289
+ const i = issue;
290
+ const suspects = (i.suspectCommits ?? []).slice(0, 5).map((c) => `- ${c.sha.slice(0, 7)} ${c.message}${c.pullRequest ? ` (PR #${c.pullRequest})` : ''} → ${c.file}${c.line ? `:${c.line}` : ''}`).join('\n');
291
+ const summary = `${i.title}: ×${i.count ?? 0}, ${i.impact?.usersAffected ?? 0} usuários, ${i.impact?.occurrences24h ?? 0} em 24h${i.firstRelease ? ` · desde ${i.firstRelease}` : ''}${i.regressedRelease ? ` · regressão em ${i.regressedRelease}` : ''}${suspects ? `\nCommits suspeitos:\n${suspects}` : ''}`;
292
+ return json(compact(issue), summary);
293
+ }));
294
+ server.registerTool('track_list_releases', {
295
+ title: 'Releases e saúde por versão',
296
+ description: 'Releases/deploys do projeto com requests, taxa de erro, p95, issues novas, regressões e variação vs. a release anterior. Com `version`, devolve o detalhe: commits, comparação de endpoints com a anterior e issues.',
297
+ inputSchema: { projectId: projectIdSchema, version: z.string().optional().describe('Versão exata para o detalhe') },
298
+ annotations: { readOnlyHint: true, openWorldHint: true },
299
+ }, async ({ projectId, version }) => guard(async () => {
300
+ if (version) {
301
+ const detail = await client.get(`/v1/projects/${projectId}/releases/${encodeURIComponent(version)}`);
302
+ const d = detail;
303
+ return json(compact(detail), `${version}: ${d.health?.requests ?? 0} req · erro ${pct(d.health?.errorRate)} · p95 ${ms(d.health?.p95Ms)} · ${d.health?.newIssues ?? 0} issues novas · ${d.health?.regressions ?? 0} regressões · ${d.commits?.length ?? 0} commits`);
304
+ }
305
+ const releases = await client.get(`/v1/projects/${projectId}/releases`);
306
+ if (releases.length === 0)
307
+ return text('Nenhuma release. Configure `release` no SDK ou registre deploys com track_register_release / fg-tracker-release.');
308
+ const lines = releases.slice(0, 25).map((r) => `- ${r.version}${r.isCurrent ? ' (atual)' : ''} · ${ago(r.deployedAt ?? r.firstSeen ?? new Date().toISOString())} · ${r.health.requests} req · erro ${pct(r.health.errorRate)} · p95 ${ms(r.health.p95Ms)}${r.delta.p95Ms !== null ? ` (${r.delta.p95Ms >= 0 ? '+' : ''}${Math.round(r.delta.p95Ms * 100)}%)` : ''} · ${r.health.newIssues} novas · ${r.health.regressions} regressões`);
309
+ return json(compact(releases), `${releases.length} releases:\n${lines.join('\n')}`);
310
+ }));
311
+ server.registerTool('track_register_release', {
312
+ title: 'Registrar release/deploy',
313
+ description: 'Registra uma release no projeto (POST /v1/projects/:id/releases) com versão, SHA, repositório e commits opcionais. Para enviar commits e arquivos alterados a partir do git, prefira o CLI `fg-tracker-release` (pacote fg-tracker-sdk) no passo de deploy.',
314
+ inputSchema: {
315
+ projectId: projectIdSchema,
316
+ version: z.string().min(1).describe('Mesmo valor de `release` no SDK, ex.: minha-api@1f3a9c2'),
317
+ commitSha: z.string().optional(),
318
+ previousVersion: z.string().optional(),
319
+ repository: z.string().optional().describe('owner/repo no GitHub'),
320
+ environment: z.string().optional(),
321
+ url: z.string().optional().describe('Link do pipeline/deploy'),
322
+ notes: z.string().optional(),
323
+ },
324
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true },
325
+ }, async ({ projectId, ...body }) => guard(async () => {
326
+ const release = await client.post(`/v1/projects/${projectId}/releases`, body);
327
+ return json(compact(release), `Release ${body.version} registrada.`);
328
+ }));
329
+ server.registerTool('track_endpoint_history', {
330
+ title: 'Histórico de latência de uma rota',
331
+ description: 'Rollups horários (até 400 dias) de uma rota: série de média/p50/p95/p99, comparação da janela atual com a anterior e média/p95 por release — para saber se as mudanças melhoraram ou pioraram o tempo de resposta.',
332
+ inputSchema: { projectId: projectIdSchema, name: z.string().min(1).describe('Nome exato do endpoint (ex.: "GET /users/:id")'), days: z.number().int().min(1).max(400).default(30) },
333
+ annotations: { readOnlyHint: true, openWorldHint: true },
334
+ }, async ({ projectId, name, days }) => guard(async () => {
335
+ const history = await client.get(`/v1/projects/${projectId}/endpoints/history`, { name, days });
336
+ const h = history;
337
+ const fmt = (v) => (v === null || v === undefined ? '—' : `${v >= 0 ? '+' : ''}${Math.round(v * 100)}%`);
338
+ const byRelease = (h.releases ?? []).map((r) => `- ${r.release}: média ${ms(r.avgMs)} · p95 ${ms(r.p95Ms)} (${fmt(r.deltaP95)} vs. anterior)`).join('\n');
339
+ return json(compact(history), `${name} (${days}d): média ${ms(h.current?.avgMs)} (${fmt(h.delta?.avgMs)}), p95 ${ms(h.current?.p95Ms)} (${fmt(h.delta?.p95Ms)}) vs. janela anterior (média ${ms(h.previous?.avgMs)}, p95 ${ms(h.previous?.p95Ms)}).${byRelease ? `\nPor release:\n${byRelease}` : ''}`);
340
+ }));
341
+ server.registerTool('track_list_providers', {
342
+ title: 'Provedores externos (chamadas de saída)',
343
+ description: 'Chamadas http.client agregadas por host no range (OpenRouter, Mureka, Stripe…): requests, taxa de erro, p50/p95, tempo total, operações mais chamadas e endpoints que as disparam.',
344
+ inputSchema: { projectId: projectIdSchema, range: rangeSchema },
345
+ annotations: { readOnlyHint: true, openWorldHint: true },
346
+ }, async ({ projectId, range }) => guard(async () => {
347
+ const providers = await client.get(`/v1/projects/${projectId}/providers`, { range });
348
+ if (providers.items.length === 0)
349
+ return text(`Nenhuma chamada externa no range ${range}. Use tracker.wrapFetch() ou instrumentGlobalFetch: true no SDK.`);
350
+ const lines = providers.items.slice(0, 25).map((p) => `- ${p.host}: ${p.requests} chamadas · erro ${pct(p.errorRate)} · p95 ${ms(p.p95Ms)} · total ${ms(p.totalMs)}`);
351
+ return json(compact(providers), `${providers.items.length} hosts, ${providers.totalRequests} chamadas, erro ${pct(providers.errorRate)}:\n${lines.join('\n')}`);
352
+ }));
353
+ server.registerTool('track_traffic_summary', {
354
+ title: 'Tráfego (pageviews) do projeto',
355
+ description: 'Visitantes únicos, sessões, pageviews, bounce e duração média por dia (UTC) vindos do SDK de navegador com analytics: true, mais top páginas, referrers, UTM, dispositivo e país. Rollup diário atualizado de hora em hora.',
356
+ inputSchema: { projectId: projectIdSchema, days: z.number().int().min(1).max(400).default(30).describe('Últimos N dias, incluindo hoje') },
357
+ annotations: { readOnlyHint: true, openWorldHint: true },
358
+ }, async ({ projectId, days }) => guard(async () => {
359
+ const now = Date.now();
360
+ const day = (offset) => new Date(now - offset * 86_400_000).toISOString().slice(0, 10);
361
+ const traffic = await client.get(`/v1/projects/${projectId}/traffic`, { from: day(days - 1), to: day(0), limit: 5 });
362
+ const t = traffic.totals;
363
+ if (t.pageviews === 0)
364
+ return text(`Nenhum pageview nos últimos ${days} dias. Ligue analytics: true no fg-tracker-browser (docs/instalar-pageviews.md); o rollup roda de hora em hora.`);
365
+ const top = (dim, label) => {
366
+ const items = traffic.dims[dim] ?? [];
367
+ return items.length ? `${label}: ${items.map((i) => `${i.value} (${i.pageviews})`).join(', ')}` : '';
368
+ };
369
+ const lines = [top('path', 'Páginas'), top('referrer', 'Referrers'), top('utm_source', 'UTM source'), top('utm_campaign', 'Campanhas')].filter(Boolean);
370
+ return json(compact(traffic), `Últimos ${days} dias: ${t.visitors} visitantes (soma diária), ${t.sessions} sessões, ${t.pageviews} pageviews, bounce ${pct(t.bounceRate)}, ${t.pagesPerSession} páginas/sessão, sessão média ${Math.round(t.avgSessionSeconds)} s.${traffic.lastRollupAt ? ` Último rollup ${ago(traffic.lastRollupAt)}.` : ''}\n${lines.join('\n')}`);
371
+ }));
372
+ server.registerTool('track_list_monitors', {
373
+ title: 'Monitores (uptime e jobs)',
374
+ description: 'Monitores de uptime HTTP e check-ins de jobs agendados: status (ok, down, missed, pending, paused), uptime 30d, último erro e próximo prazo.',
375
+ inputSchema: { projectId: projectIdSchema },
376
+ annotations: { readOnlyHint: true, openWorldHint: true },
377
+ }, async ({ projectId }) => guard(async () => {
378
+ const monitors = await client.get(`/v1/projects/${projectId}/monitors`);
379
+ if (monitors.length === 0)
380
+ return text('Nenhum monitor. Crie um uptime no painel ou envie um check-in: tracker.checkIn(slug, fn) / GET /v1/monitors/:slug/ping?status=ok.');
381
+ const lines = monitors.map((m) => `- [${m.status}] ${m.name} (${m.kind}, ${m.slug})${m.uptime30d !== null ? ` · uptime ${pct(m.uptime30d)}` : ''}${m.lastCheckAt ? ` · último check ${ago(m.lastCheckAt)}` : ''}${m.lastError ? ` · ${m.lastError}` : ''}`);
382
+ return json(compact(monitors), `${monitors.length} monitores:\n${lines.join('\n')}`);
383
+ }));
384
+ /* ---------------- prompt ---------------- */
385
+ server.registerPrompt('instrument-project', {
386
+ title: 'Conectar projeto ao FG Tracker',
387
+ description: 'Plano passo a passo para um agente de código instrumentar o projeto atual: detectar framework/logger → criar/escolher projeto → instalar SDK → tracker + pg + fetch + logs → env → rodar → track_verify_ingest → corrigir.',
388
+ argsSchema: {
389
+ projectName: z.string().optional().describe('Nome do projeto no FG Tracker (default: nome do pacote)'),
390
+ framework: z.string().optional().describe('express | nestjs | nextjs | fastify (default: detectar)'),
391
+ },
392
+ }, ({ projectName, framework }) => ({
393
+ messages: [
394
+ {
395
+ role: 'user',
396
+ content: { type: 'text', text: instrumentProjectPrompt({ projectName, framework }, client.baseUrl) },
397
+ },
398
+ ],
399
+ }));
400
+ /* ---------------- resource ---------------- */
401
+ server.registerResource('quickstart', QUICKSTART_URI, {
402
+ title: 'FG Tracker quickstart',
403
+ description: 'Guia rápido (markdown): projeto e chave, SDK, logs, ingestão crua, verificação e detectores.',
404
+ mimeType: 'text/markdown',
405
+ }, async (uri) => ({
406
+ contents: [{ uri: uri.href, mimeType: 'text/markdown', text: quickstartMarkdown(client.baseUrl) }],
407
+ }));
408
+ // URI antiga (stread-track-mcp ≤ 0.3): mesmo conteúdo, mantida até a 1.0.
409
+ server.registerResource('quickstart-legacy', LEGACY_QUICKSTART_URI, {
410
+ title: 'FG Tracker quickstart (URI obsoleta)',
411
+ description: `Obsoleto: use ${QUICKSTART_URI}. Mesmo conteúdo do quickstart.`,
412
+ mimeType: 'text/markdown',
413
+ }, async (uri) => ({
414
+ contents: [{ uri: uri.href, mimeType: 'text/markdown', text: quickstartMarkdown(client.baseUrl) }],
415
+ }));
416
+ return server;
417
+ }
418
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "fg-tracker-mcp",
3
+ "version": "0.4.0",
4
+ "description": "Servidor MCP (stdio) do FG Tracker: projetos, métricas, traces, issues com commits suspeitos, releases, monitores, provedores externos, logs e guia de instrumentação para agentes de código",
5
+ "license": "UNLICENSED",
6
+ "homepage": "https://github.com/FORTGROUND/fg-tracker/tree/main/packages/mcp#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/FORTGROUND/fg-tracker.git",
10
+ "directory": "packages/mcp"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/FORTGROUND/fg-tracker/issues"
14
+ },
15
+ "keywords": [
16
+ "fg-tracker",
17
+ "mcp",
18
+ "model-context-protocol",
19
+ "apm",
20
+ "observability",
21
+ "claude",
22
+ "cursor",
23
+ "ai-agents"
24
+ ],
25
+ "bin": {
26
+ "fg-tracker-mcp": "dist/cli.js",
27
+ "stread-track-mcp": "dist/cli.js"
28
+ },
29
+ "type": "module",
30
+ "main": "./dist/server.js",
31
+ "types": "./dist/server.d.ts",
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/server.d.ts",
35
+ "import": "./dist/server.js",
36
+ "default": "./dist/server.js"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "README.md",
42
+ "CHANGELOG.md"
43
+ ],
44
+ "engines": {
45
+ "node": ">=20"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc -p tsconfig.json && chmod +x dist/cli.js",
49
+ "typecheck": "tsc -p tsconfig.json --noEmit",
50
+ "start": "node dist/cli.js",
51
+ "clean": "rm -rf dist",
52
+ "test": "node --test test/*.test.mjs",
53
+ "prepack": "npm run clean && npm run build"
54
+ },
55
+ "dependencies": {
56
+ "@aws-sdk/client-cloudformation": "^3.1132.0",
57
+ "@aws-sdk/client-resource-explorer-2": "^3.1132.0",
58
+ "@aws-sdk/client-resource-groups-tagging-api": "^3.1132.0",
59
+ "@aws-sdk/client-sts": "^3.1132.0",
60
+ "@aws-sdk/credential-providers": "^3.1132.0",
61
+ "@modelcontextprotocol/sdk": "^1.30.0",
62
+ "zod": "^4.0.0"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^24.3.0",
66
+ "typescript": "^5.9.2"
67
+ },
68
+ "publishConfig": {
69
+ "access": "public"
70
+ }
71
+ }