@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-запуска.
72 lines • 2.94 kB
TypeScript
/**
* Audit log service.
*
* Контракт:
* - `recordToolCall` записывает строку в `mcp_audit.audit_log`.
* - Hash-chain: каждая запись хранит sha256(prev row content) и sha256(этой
* row). Внутри транзакции SELECT FOR UPDATE предыдущей строки + INSERT.
* - Silent fail: если БД недоступна / ошибка вставки — логируем warn и не
* падаем (tool-call продолжает работать). Audit не блокирует business flow.
* - Hash считается над **detерминированным** JSON-представлением полей (см.
* `rowContent`), чтобы потом chain-verifier мог пересчитать.
*
* См. 06-security.md §3.
*/
import type { Logger } from 'pino';
import { type McpPrismaClient } from './prisma.js';
export interface RecordToolCallParams {
appId: string;
/** Первые 8 chars API-ключа (НЕ полный key). */
keyId: string;
tool: string;
args: Record<string, unknown>;
resultBytes: number;
latencyMs: number;
cacheHit?: boolean;
ip?: string | null;
userAgent?: string | null;
sessionId?: string | null;
statusCode: number;
error?: string | null;
}
export interface AuditServiceOptions {
databaseUrl?: string;
log?: Logger;
/** Для тестов — позволяет инжектировать mock-prisma. */
prismaOverride?: McpPrismaClient | null;
}
/**
* Детерминированная сериализация для hash-chain. Поля упорядочены, BigInt'ы
* приведены к string, undefined пропущены. Если когда-нибудь захотим
* пересчитать chain — будем использовать ту же функцию.
*/
export declare function rowContent(p: {
appId: string;
keyId: string;
tool: string;
args: Record<string, unknown>;
resultBytes: number;
latencyMs: number;
cacheHit: boolean;
statusCode: number;
error?: string | null;
createdAt: string;
prevHash: string | null;
}): string;
export declare function sha256Hex(input: string): string;
export interface AuditService {
recordToolCall(params: RecordToolCallParams): Promise<void>;
/** Для тестов / health-checks. */
verifyChain(appId: string): Promise<{
ok: boolean;
brokenAt?: string;
}>;
}
/**
* Создаёт audit-service. Если prisma недоступен — все методы no-op.
*/
export declare function createAuditService(opts?: AuditServiceOptions): AuditService;
export declare function getAuditService(opts?: AuditServiceOptions): AuditService;
/** Для тестов. */
export declare function setAuditServiceForTests(svc: AuditService | null): void;
//# sourceMappingURL=service.d.ts.map