@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
JavaScript
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