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

83 lines 4.71 kB
import { withMiddleware, } from '../middleware/withMiddleware.js'; import { searchLogsToolDef, handleSearchLogs } from './searchLogs.js'; import { getLogDetailsToolDef, handleGetLogDetails } from './getLogDetails.js'; import { findSimilarErrorsToolDef, handleFindSimilarErrors } from './findSimilarErrors.js'; import { findCorrelatedErrorsToolDef, handleFindCorrelatedErrors, } from './findCorrelatedErrors.js'; import { topErrorMessagesToolDef, handleTopErrorMessages } from './topErrorMessages.js'; import { errorHistogramToolDef, handleErrorHistogram } from './errorHistogram.js'; import { trafficStatsToolDef, handleTrafficStats } from './trafficStats.js'; import { listAppsToolDef, handleListApps } from './listApps.js'; import { queryLogsJqlToolDef, handleQueryLogsJql } from './queryLogsJql.js'; import { errorStatsBreakdownToolDef, handleErrorStatsBreakdown } from './errorStatsBreakdown.js'; import { groupedErrorsToolDef, handleGroupedErrors } from './groupedErrors.js'; import { impactAnalysisToolDef, handleImpactAnalysis } from './impactAnalysis.js'; import { baselineCompareToolDef, handleBaselineCompare } from './baselineCompare.js'; import { versionRegressionToolDef, handleVersionRegression } from './versionRegression.js'; import { errorHeatmapToolDef, handleErrorHeatmap } from './errorHeatmap.js'; import { triageRecentCriticalToolDef, handleTriageRecentCritical } from './triageRecentCritical.js'; import { errorsInSessionToolDef, handleErrorsInSession } from './errorsInSession.js'; import { explainErrorToolDef, handleExplainError } from './explainError.js'; const ALL_TOOLS = [ // Core read tools { def: searchLogsToolDef, handler: handleSearchLogs }, { def: getLogDetailsToolDef, handler: handleGetLogDetails }, { def: findSimilarErrorsToolDef, handler: handleFindSimilarErrors }, { def: findCorrelatedErrorsToolDef, handler: handleFindCorrelatedErrors }, { def: topErrorMessagesToolDef, handler: handleTopErrorMessages }, { def: errorHistogramToolDef, handler: handleErrorHistogram }, { def: trafficStatsToolDef, handler: handleTrafficStats }, { def: listAppsToolDef, handler: handleListApps }, // Analytics / composite tools { def: queryLogsJqlToolDef, handler: handleQueryLogsJql }, { def: errorStatsBreakdownToolDef, handler: handleErrorStatsBreakdown }, { def: groupedErrorsToolDef, handler: handleGroupedErrors }, { def: impactAnalysisToolDef, handler: handleImpactAnalysis }, { def: baselineCompareToolDef, handler: handleBaselineCompare }, { def: versionRegressionToolDef, handler: handleVersionRegression }, { def: errorHeatmapToolDef, handler: handleErrorHeatmap }, { def: triageRecentCriticalToolDef, handler: handleTriageRecentCritical }, { def: errorsInSessionToolDef, handler: handleErrorsInSession }, { def: explainErrorToolDef, handler: handleExplainError }, ]; export function registerTools(server, opts) { const disabled = new Set(opts.disabled ?? []); const registered = []; for (const { def, handler } of ALL_TOOLS) { if (disabled.has(def.name)) { opts.log?.info?.({ tool: def.name }, 'Tool disabled via MCP_DISABLE_TOOLS'); continue; } // SDK 1.x: registerTool typed via Zod raw shape; обходим строгий generic // через локальный `any`-каст — handler внутри сам валидирован zod-парсером, // который SDK прогоняет до вызова callback. const register = server.registerTool.bind(server); // Если в opts задан contextProvider — оборачиваем handler в // withMiddleware (quota + audit + usage + redaction). Иначе — legacy путь. const effectiveHandler = opts.contextProvider ? withMiddleware(def.name, handler, () => opts.contextProvider(), opts.middleware ?? {}) : handler; register(def.name, { title: def.title, description: def.description, inputSchema: def.inputShape, }, async (args) => { const result = (await effectiveHandler(args, opts.client)); return result; }); registered.push(def.name); } return registered; } /** * Helper: создаёт ToolContext из переменных окружения для stdio-режима. */ export function makeStdioContext(args) { return { appId: args.appId, keyId: args.apiKey.slice(0, 8), tier: args.tier, ...(args.log ? { log: args.log } : {}), }; } export const ALL_TOOL_NAMES = ALL_TOOLS.map((t) => t.def.name); //# sourceMappingURL=index.js.map