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