@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-запуска.
75 lines • 3.25 kB
TypeScript
import type { Request, Response } from 'express';
import type { Logger } from 'pino';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import type { Config } from '../config.js';
import { ElsClient } from '../elsClient.js';
import type { RequestContext } from '../http/types.js';
import { type RedisService } from '../cache/index.js';
import { type Tier } from '../billing/limits.js';
import type { MiddlewareDeps } from '../middleware/withMiddleware.js';
export interface SessionRecord {
sessionId: string;
transport: StreamableHTTPServerTransport;
server: McpServer;
client: ElsClient;
/** Контекст последнего запроса (snapshot — для observability). */
lastContext?: RequestContext;
createdAt: number;
lastTouchedAt: number;
/** AppSlug сессии (для concurrency-limit и SSE-метрик). */
appSlug: string;
}
export interface HttpTransportManagerOptions {
config: Config;
log: Logger;
/** TTL idle-сессии, мс. Default 30 минут. */
sessionTtlMs?: number;
/** Disable internal cleanup timer (для тестов). */
noCleanup?: boolean;
/**
* Redis для cache layer. Если задан и cacheEnabled — каждая сессия
* получает CachedElsClient. Иначе — прямой ElsClient.
*/
redis?: RedisService | null;
/** Middleware deps (audit / usage / redaction). */
middlewareDeps?: MiddlewareDeps;
/**
* Async tier resolver — резолвит tier per appSlug через LK API (с кэшем
* 30 сек в Redis). По умолчанию возвращает `config.defaultTier`
* (используется как fallback при недоступности LK).
*/
tierResolver?: (ctx: RequestContext) => Promise<Tier> | Tier;
}
export declare class HttpTransportManager {
private readonly sessions;
/** Per-app счётчик active sessions (для concurrency-limit). */
private readonly perAppCount;
private readonly ttlMs;
private readonly cleanupTimer;
private readonly config;
private readonly log;
private readonly redis;
private readonly cachePolicies;
private readonly middlewareDeps;
private readonly tierResolver;
constructor(opts: HttpTransportManagerOptions);
/** Closes all sessions and stops cleanup. Безопасно вызывать многократно. */
close(): Promise<void>;
/**
* Express handler для `POST /mcp`. Решает, создавать ли новую сессию
* (если нет `Mcp-Session-Id` И тело — initialize) или использовать
* существующую.
*/
handleRequest(req: Request, res: Response): Promise<void>;
private createSession;
private incrPerApp;
private decrPerApp;
/** Для тестов: текущее число sessions per app. */
perAppSize(appSlug: string): number;
private touch;
private gcExpired;
/** Для тестов / observability. */
size(): number;
}
//# sourceMappingURL=http.d.ts.map