mirror of
https://github.com/morluto/rea.git
synced 2026-10-18 20:10:13 -05:00
* feat(firmware): integrate Binwalk and Unblob analysis * fix(firmware): verify published files and namespace source references * test(firmware): isolate extractor dependency failure from process cleanup * fix(firmware): retain actionable report and cleanup diagnostics * test: assert retained batch output failure diagnostics
46 lines
1.8 KiB
TypeScript
46 lines
1.8 KiB
TypeScript
import type { McpServer, ServerContext } from "@modelcontextprotocol/server";
|
|
import type { FirmwareAnalysisService } from "../application/FirmwareAnalysisService.js";
|
|
import type { BinarySessionPort } from "../application/BinarySession.js";
|
|
import { toolContract } from "../contracts/toolContracts.js";
|
|
import type { ToolContract } from "../contracts/toolContractTypes.js";
|
|
import type { FirmwareOperation } from "../domain/firmwareAnalysis.js";
|
|
import type { Logger } from "../logger.js";
|
|
import { logToolExecution } from "./toolLogging.js";
|
|
import { toolRegistrationOptions } from "./toolRegistrationOptions.js";
|
|
import { toCallToolResult } from "./toolResult.js";
|
|
|
|
/** Bind firmware handlers to their exact named schemas. */
|
|
export const registerFirmwareTools = (
|
|
server: McpServer,
|
|
service: FirmwareAnalysisService,
|
|
logger: Logger,
|
|
recordEvidence?: BinarySessionPort["recordEvidence"],
|
|
): void => {
|
|
const handler =
|
|
(contract: ToolContract<FirmwareOperation>) =>
|
|
async (input: unknown, context: ServerContext) => {
|
|
const result = await logToolExecution(logger, contract.name, () =>
|
|
service.execute(contract.name, input, {
|
|
signal: context.mcpReq.signal,
|
|
}),
|
|
);
|
|
if (!result.ok) return toCallToolResult(result, contract);
|
|
const recorded = recordEvidence?.(result.value);
|
|
return recorded !== undefined && !recorded.ok
|
|
? toCallToolResult(recorded, contract)
|
|
: toCallToolResult(result, contract);
|
|
};
|
|
const inspect = toolContract("inspect_firmware_regions");
|
|
server.registerTool(
|
|
inspect.name,
|
|
toolRegistrationOptions(inspect),
|
|
handler(inspect),
|
|
);
|
|
const extract = toolContract("extract_firmware");
|
|
server.registerTool(
|
|
extract.name,
|
|
toolRegistrationOptions(extract),
|
|
handler(extract),
|
|
);
|
|
};
|