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

60 lines 2.83 kB
/** * LK API resolvers. * * Два резолвера дёргают LK backend и кэшируются в Redis (если доступен): * * 1. `resolveOidcSubApps(sub)` — `GET /api/internal/users/{sub}/apps` * возвращает список доступных пользователю appSlugs. * Кэш: `mcp:oidc:apps:{sub}` TTL 5 min. * * 2. `resolveAppTier(appSlug)` — `GET /api/internal/apps/{slug}/billing/tier` * возвращает один из `FREE`/`STANDARD`/`PREMIUM`/`UNLIMITED`. * Кэш: `mcp:tier:{appSlug}` TTL 30 sec. * * TODO (LK backend): оба эндпоинта **пока не реализованы** — резолверы * корректно отрабатывают 404/500/timeout, возвращая fallback значения. * Когда эндпоинты появятся, никакого изменения кода не потребуется. * * Все вызовы — best-effort: при недоступности LK сервис **не** падает, * а использует safety-net fallback (`MCP_OIDC_DEMO_APP_SLUG`, * `config.defaultTier`). */ import type { Logger } from 'pino'; import type { Tier } from '../billing/limits.js'; /** Минимальный интерфейс Redis-клиента, который нам нужен. */ export interface RedisLike { get(key: string): Promise<string | null>; set(key: string, value: string, mode: string, duration: number): Promise<unknown>; } export interface LkResolverOptions { /** LK API base URL (без trailing slash). Если null — резолвер сразу fallback'ит. */ lkApiBaseUrl?: string | null; /** Internal-API service-token (Bearer) для авторизации в LK. */ lkApiToken?: string | null; /** Redis-клиент для кэша. Если null — резолвер не кэширует. */ redis?: RedisLike | null; /** Fallback appSlug при недоступности LK. */ fallbackAppSlug?: string; /** Fallback tier при недоступности LK. */ fallbackTier: Tier; log?: Logger; /** Override fetch для тестов. */ fetchImpl?: typeof fetch; } export interface SubAppsResult { /** Доступные appSlugs (минимум один — fallback'ом). */ apps: string[]; /** True → ответ из LK, false → fallback. */ fromLk: boolean; } export interface TierResult { tier: Tier; /** True → ответ из LK, false → fallback. */ fromLk: boolean; } export interface LkResolver { resolveOidcSubApps(sub: string): Promise<SubAppsResult>; resolveAppTier(appSlug: string): Promise<TierResult>; } export declare function createLkResolver(opts: LkResolverOptions): LkResolver; //# sourceMappingURL=lkResolver.d.ts.map