@inso_web/els-mcp
Version:
MCP-сервер поверх INSO Error Logs Service. Read-only tools (search, analytics, fingerprinting, correlations) для подключения Claude Desktop/Code и ChatGPT к логам ошибок. Streamable HTTP transport + stdio для npx-запуска.
78 lines • 3.41 kB
JavaScript
import { z } from 'zod';
import { ToolError } from '../lib/errors.js';
/**
* Tool: error_stats_breakdown
* Mapping: GET /analytics/stats → analytics.routes.ts:316
* Upstream Zod: StatsSchema (from, to, +фасет-фильтры).
*
* Возвращает агрегаты: total, uniqueFingerprints, distinct counts, byLevel.
* Сравнение с предыдущим периодом (`compareTo`) — отдельный pass на стороне
* MCP. Сейчас один upstream-call: `compareTo` принимается в input, но
* ELS-endpoint его не поддерживает, поэтому возвращаем `comparison=null`
* и пишем warning. При добавлении comparison в ELS — здесь сразу заведём
* дополнительный pass.
*/
export const errorStatsBreakdownInputShape = {
from: z.string().optional(),
to: z.string().optional(),
level: z.array(z.string().max(16)).optional(),
serviceName: z.array(z.string().max(255)).optional(),
compareTo: z
.enum(['previous-period', 'previous-week', 'none'])
.default('none')
.describe('Compare current period to baseline. Upstream does not compute comparison yet; field returns null + warning.'),
};
export const errorStatsBreakdownToolDef = {
name: 'error_stats_breakdown',
title: 'Aggregated stats with breakdowns',
description: 'High-level stats: total errors, unique fingerprints, distinct services/URLs/users, severity distribution. Use for "weekly summary" / "did things get worse?".',
inputShape: errorStatsBreakdownInputShape,
};
export async function handleErrorStatsBreakdown(args, client) {
try {
const params = {
from: args.from,
to: args.to,
levels: args.level?.join(','),
serviceName: args.serviceName?.join(','),
};
const { data, elsRequestId } = await client.errorStats(params);
const stats = (data ?? {});
const warnings = [];
let comparison = null;
if (args.compareTo !== 'none') {
warnings.push(`compareTo='${args.compareTo}' requested, but upstream /analytics/stats does not compute comparison yet. Returning null.`);
}
const meta = {
elsRequestId,
cached: false,
ttlSec: 60,
redactionApplied: false,
...(warnings.length > 0 ? { warnings, degraded: true } : {}),
};
return {
structuredContent: {
total: Number(stats.total ?? 0),
uniqueFingerprints: Number(stats.uniqueFingerprints ?? 0),
distinctServices: Number(stats.distinctServices ?? 0),
distinctUrls: Number(stats.distinctUrls ?? 0),
distinctUsersAffected: Number(stats.distinctUsersAffected ?? 0),
byLevel: stats.byLevel ?? {},
comparison,
_meta: meta,
},
content: [
{
type: 'text',
text: `Stats: total=${Number(stats.total ?? 0)}, uniqueFingerprints=${Number(stats.uniqueFingerprints ?? 0)}.`,
},
],
};
}
catch (err) {
if (err instanceof ToolError)
return err.toToolResult();
throw err;
}
}
//# sourceMappingURL=errorStatsBreakdown.js.map