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-запуска.

89 lines 3.6 kB
import { z } from 'zod'; import { ToolError } from '../lib/errors.js'; /** * Tool: version_regression * Mapping: GET /analytics/version-timeline → analytics.routes.ts:373 * Upstream Zod: VersionTimelineSchema (from, to, +фасет-фильтры, +appVersion). * * Сравнивает 2 версии: новые fingerprint'ы в candidateVersion vs baselineVersion, * и исчезнувшие. Upstream сам определяет версии — мы пробрасываем как * `appVersion=baseline,candidate` фильтр (csv) + опционально windowDays через * from/to. */ const DEFAULT_WINDOW_DAYS = 7; export const versionRegressionInputShape = { baselineVersion: z.string().min(1).max(64), candidateVersion: z.string().min(1).max(64), serviceName: z.string().max(255).optional(), windowDays: z.number().int().min(1).max(30).default(DEFAULT_WINDOW_DAYS), }; export const versionRegressionToolDef = { name: 'version_regression', title: 'New / disappeared fingerprints between versions', description: [ 'Compare two appVersion releases: which fingerprints are NEW in the candidate vs baseline,', 'and which DISAPPEARED.', '', 'WHEN TO USE:', ' - Right after a deploy - pass baselineVersion=<prev BUILD_VERSION>, candidate=<new>.', ' Any newFingerprints with high count = regression suspect.', ' - Rollback decision support - quantify "did the new version introduce real errors?".', ' - Post-deploy verify routine (see post-deploy-verify prompt).', ].join('\n'), inputShape: versionRegressionInputShape, }; function isoDaysAgo(days) { return new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString(); } export async function handleVersionRegression(args, client) { try { const params = { from: isoDaysAgo(args.windowDays), to: new Date().toISOString(), appVersion: `${args.baselineVersion},${args.candidateVersion}`, serviceName: args.serviceName, }; const { data, elsRequestId } = await client.versionRegression(params); const body = (data ?? {}); // Upstream может вернуть несколько форм; нормализуем. const baseline = body.baseline ?? { version: args.baselineVersion, errors: 0, uniqueFingerprints: 0, }; const candidate = body.candidate ?? { version: args.candidateVersion, errors: 0, uniqueFingerprints: 0, }; const newFingerprints = Array.isArray(body.newFingerprints) ? body.newFingerprints : []; const disappeared = Array.isArray(body.disappeared) ? body.disappeared : []; const meta = { elsRequestId, cached: false, ttlSec: 120, redactionApplied: false, }; return { structuredContent: { baseline, candidate, newFingerprints, disappeared, _meta: meta, }, content: [ { type: 'text', text: `Regression check ${args.baselineVersion}${args.candidateVersion}: ${newFingerprints.length} new, ${disappeared.length} disappeared.`, }, ], }; } catch (err) { if (err instanceof ToolError) return err.toToolResult(); throw err; } } //# sourceMappingURL=versionRegression.js.map