@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
TypeScript
/**
* 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