UNPKG

@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
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