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

77 lines 3.06 kB
const SERVICE_VERSION = process.env.GIT_SHA ?? process.env.npm_package_version ?? '0.1.0-alpha.0'; export function checkLiveness() { return { status: 'ok', uptimeSec: Math.round(process.uptime()), version: SERVICE_VERSION, }; } export async function checkReadiness(deps = {}) { const timeoutMs = deps.timeoutMs ?? 3000; const [redisCheck, upstreamCheck] = await Promise.all([ deps.redis ? withTimeout(checkRedis(deps.redis), timeoutMs) : Promise.resolve({ ok: true }), deps.elsClient ? withTimeout(checkUpstream(deps.elsClient, deps.elsHealthPath), timeoutMs) : Promise.resolve({ ok: true }), ]); const ready = redisCheck.ok && upstreamCheck.ok; return { status: ready ? 'ready' : 'not_ready', checks: { redis: redisCheck, upstream: upstreamCheck, }, }; } async function checkRedis(redis) { // Redis "недоступен" — это допустимое degraded состояние: cache miss всегда. // Поэтому для readyz считаем "ok" если либо Redis pingается, либо disabled. // Если был сконфигурирован, но не отвечает → not ready (force k8s degrade). const start = Date.now(); try { const ok = await redis.ping(); const latencyMs = Date.now() - start; if (!ok) { return { ok: false, latencyMs, error: 'ping failed' }; } return { ok: true, latencyMs }; } catch (err) { return { ok: false, error: err.message }; } } async function checkUpstream(client, pathHint) { // ELS известен через client'а. Не у всех методов есть health-check; // делаем "lightweight probe" — пробуем listApps() с очень коротким timeout. // Если 401/403 — endpoint reachable, но key недостаточно для list_apps; всё равно ok. // Если 5xx или connection refused — not ready. void pathHint; const start = Date.now(); try { await client.listApps(); return { ok: true, latencyMs: Date.now() - start }; } catch (err) { const e = err; const status = e?.meta?.status; // INSUFFICIENT_SCOPE (403) / NOT_FOUND (404) — ELS reachable, это ok. if (e?.code === 'INSUFFICIENT_SCOPE' || e?.code === 'NOT_FOUND' || e?.code === 'INVALID_ARGS') { return { ok: true, latencyMs: Date.now() - start, ...(status !== undefined ? { status } : {}) }; } return { ok: false, latencyMs: Date.now() - start, error: e?.message ?? 'unknown', ...(status !== undefined ? { status } : {}), }; } } function withTimeout(p, ms) { return Promise.race([ p, new Promise((resolve) => setTimeout(() => resolve({ ok: false, error: 'timeout' }), ms)), ]); } //# sourceMappingURL=health.js.map