@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-запуска.
55 lines • 2.76 kB
TypeScript
/**
* Tool-handler middleware:
* 1. Quota check (`checkQuota`) перед основным запросом.
* 2. AI quota check (`checkAiQuota`) для AI-tools (см. `isAiTool`).
* 3. Audit log + usage tracker (fire-and-forget) после.
* 4. Redaction items в response (если ENV redactionEnabled = true).
* 5. Prometheus метрики (`mcp_requests_total`, `mcp_request_duration_seconds`,
* `mcp_errors_total`, `mcp_auth_rejections_total`).
*
* Не вносит изменений в существующие tool handlers — оборачивает их в
* registry.
*/
import type { Logger } from 'pino';
import type { ToolResult } from '../types.js';
import { type RedactionConfig } from '../redaction/index.js';
import { type AuditService } from '../audit/service.js';
import { type UsageTracker } from '../billing/tracker.js';
import { type Tier, type QuotaDecision } from '../billing/limits.js';
export interface ToolContext {
/** Текущий app (из API-key / OAuth claim / config.defaultAppId). */
appId: string;
/** Prefix API-key (8 chars). */
keyId: string;
/** Tier для quota-check. */
tier: Tier;
/** Optional logger. */
log?: Logger;
/** Optional request meta для audit (ip/userAgent/sessionId). */
ip?: string | null;
userAgent?: string | null;
sessionId?: string | null;
}
export interface MiddlewareDeps {
audit?: AuditService;
usage?: UsageTracker;
redactionConfig?: RedactionConfig;
/** Опциональный override основной (per-day) quota check; default — usage tracker. */
quotaCheck?: (ctx: ToolContext) => Promise<QuotaDecision>;
/** Опциональный override AI-quota check (используется только для AI-tools). */
aiQuotaCheck?: (ctx: ToolContext) => Promise<QuotaDecision>;
}
type AnyArgs = Record<string, unknown>;
type Handler<TArgs extends AnyArgs, TClient> = (args: TArgs, client: TClient) => Promise<ToolResult>;
/**
* Оборачивает существующий tool handler.
*
* Семантика:
* - Если `quotaCheck`-result `allowed=false` → возвращаем ToolError('TIER_QUOTA_EXCEEDED').
* - При `overage=true` (grace) добавляем `_meta.overage=true` к ответу.
* - После handler-вызова прогоняем items / log через redaction.
* - Audit + usage пишутся fire-and-forget (void).
*/
export declare function withMiddleware<TArgs extends AnyArgs, TClient>(toolName: string, handler: Handler<TArgs, TClient>, getContext: (args: TArgs, client: TClient) => ToolContext, deps?: MiddlewareDeps): Handler<TArgs, TClient>;
export {};
//# sourceMappingURL=withMiddleware.d.ts.map